Auto generate the boilerplate code to convert python opts to c opts

This commit is contained in:
Kovid Goyal 2021-06-03 18:30:13 +05:30
parent 4ab299d0af
commit 2e71429b03
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
8 changed files with 1057 additions and 100 deletions

1
.gitattributes vendored
View File

@ -9,6 +9,7 @@ kitty/glfw-wrapper.* linguist-generated=true
kitty/parse-graphics-command.h linguist-generated=true kitty/parse-graphics-command.h linguist-generated=true
kitty/options/types.py linguist-generated=true kitty/options/types.py linguist-generated=true
kitty/options/parse.py linguist-generated=true kitty/options/parse.py linguist-generated=true
kitty/options/to-c-generated.h linguist-generated=true
kittens/diff/options/types.py linguist-generated=true kittens/diff/options/types.py linguist-generated=true
kittens/diff/options/parse.py linguist-generated=true kittens/diff/options/parse.py linguist-generated=true
glfw/*.c linguist-vendored=true glfw/*.c linguist-vendored=true

View File

@ -18,6 +18,7 @@ kittens/unicode_input/names.h
kitty/parse-graphics-command.h kitty/parse-graphics-command.h
kitty/options/types.py kitty/options/types.py
kitty/options/parse.py kitty/options/parse.py
kitty/options/to-c-generated.h
kittens/diff/options/types.py kittens/diff/options/types.py
kittens/diff/options/parse.py kittens/diff/options/parse.py
''' '''

View File

@ -323,12 +323,59 @@ def generate_class(defn: Definition, loc: str) -> Tuple[str, str]:
return class_def, '\n'.join(preamble + ['', ''] + tc_lines) return class_def, '\n'.join(preamble + ['', ''] + tc_lines)
def generate_c_conversion(loc: str, ctypes: List[Option]) -> str:
lines: List[str] = []
basic_converters = {
'int': 'PyLong_AsLong', 'uint': 'PyLong_AsUnsignedLong', 'bool': 'PyObject_IsTrue',
'float': 'PyFloat_AsFloat', 'double': 'PyFloat_AsDouble',
'time': 'parse_s_double_to_monotonic_t', 'time-ms': 'parse_ms_long_to_monotonic_t'
}
for opt in ctypes:
lines.append('')
lines.append(f'static void\nconvert_from_python_{opt.name}(PyObject *val, Options *opts) ''{')
is_special = opt.ctype.startswith('!')
if is_special:
func = opt.ctype[1:]
lines.append(f' {func}(val, opts);')
else:
func = basic_converters.get(opt.ctype, opt.ctype)
lines.append(f' opts->{opt.name} = {func}(val);')
lines.append('}')
lines.append('')
lines.append(f'static void\nconvert_from_opts_{opt.name}(PyObject *py_opts, Options *opts) ''{')
lines.append(f' PyObject *ret = PyObject_GetAttrString(py_opts, "{opt.name}");')
lines.append(' if (ret == NULL) return;')
lines.append(f' convert_from_python_{opt.name}(ret, opts);')
lines.append(' Py_DECREF(ret);')
lines.append('}')
lines.append('')
lines.append('static bool\nconvert_opts_from_python_opts(PyObject *py_opts, Options *opts) ''{')
for opt in ctypes:
lines.append(f' convert_from_opts_{opt.name}(py_opts, opts);')
lines.append(' if (PyErr_Occurred()) return false;')
lines.append(' return true;')
lines.append('}')
preamble = ['// generated by gen-config.py DO NOT edit', '// vim:fileencoding=utf-8', '#pragma once', '#include "to-c.h"']
return '\n'.join(preamble + ['', ''] + lines)
def write_output(loc: str, defn: Definition) -> None: def write_output(loc: str, defn: Definition) -> None:
cls, tc = generate_class(defn, loc) cls, tc = generate_class(defn, loc)
with open(os.path.join(*loc.split('.'), 'options', 'types.py'), 'w') as f: with open(os.path.join(*loc.split('.'), 'options', 'types.py'), 'w') as f:
f.write(cls + '\n') f.write(cls + '\n')
with open(os.path.join(*loc.split('.'), 'options', 'parse.py'), 'w') as f: with open(os.path.join(*loc.split('.'), 'options', 'parse.py'), 'w') as f:
f.write(tc + '\n') f.write(tc + '\n')
ctypes = []
for opt in defn.root_group.iter_all_non_groups():
if isinstance(opt, Option) and opt.ctype:
ctypes.append(opt)
if ctypes:
c = generate_c_conversion(loc, ctypes)
with open(os.path.join(*loc.split('.'), 'options', 'to-c-generated.h'), 'w') as f:
f.write(c + '\n')
def main() -> None: def main() -> None:

View File

@ -287,7 +287,7 @@ opt('scrollback_fill_enlarged_window', 'no',
) )
opt('wheel_scroll_multiplier', '5.0', opt('wheel_scroll_multiplier', '5.0',
option_type='float', ctype='float', option_type='float', ctype='double',
long_text=''' long_text='''
Modify the amount scrolled by the mouse wheel. Note this is only used for low Modify the amount scrolled by the mouse wheel. Note this is only used for low
precision scrolling devices, not for high precision scrolling on platforms such precision scrolling devices, not for high precision scrolling on platforms such
@ -296,7 +296,7 @@ as macOS and Wayland. Use negative numbers to change scroll direction.
) )
opt('touch_scroll_multiplier', '1.0', opt('touch_scroll_multiplier', '1.0',
option_type='float', ctype='float', option_type='float', ctype='double',
long_text=''' long_text='''
Modify the amount scrolled by a touchpad. Note this is only used for high Modify the amount scrolled by a touchpad. Note this is only used for high
precision scrolling devices on platforms such as macOS and Wayland. Use negative precision scrolling devices on platforms such as macOS and Wayland. Use negative
@ -544,7 +544,7 @@ egr() # }}}
agr('performance', 'Performance tuning') agr('performance', 'Performance tuning')
opt('repaint_delay', '10', opt('repaint_delay', '10',
option_type='positive_int', ctype='time', option_type='positive_int', ctype='time-ms',
long_text=''' long_text='''
Delay (in milliseconds) between screen updates. Decreasing it, increases frames-per-second Delay (in milliseconds) between screen updates. Decreasing it, increases frames-per-second
(FPS) at the cost of more CPU usage. The default value yields ~100 (FPS) at the cost of more CPU usage. The default value yields ~100
@ -556,7 +556,7 @@ to be processed, repaint_delay is ignored.
) )
opt('input_delay', '3', opt('input_delay', '3',
option_type='positive_int', ctype='time', option_type='positive_int', ctype='time-ms',
long_text=''' long_text='''
Delay (in milliseconds) before input from the program running in the terminal is Delay (in milliseconds) before input from the program running in the terminal is
processed. Note that decreasing it will increase responsiveness, but also processed. Note that decreasing it will increase responsiveness, but also

986
kitty/options/to-c-generated.h generated Normal file
View File

@ -0,0 +1,986 @@
// generated by gen-config.py DO NOT edit
// vim:fileencoding=utf-8
#pragma once
#include "to-c.h"
static void
convert_from_python_force_ltr(PyObject *val, Options *opts) {
opts->force_ltr = PyObject_IsTrue(val);
}
static void
convert_from_opts_force_ltr(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "force_ltr");
if (ret == NULL) return;
convert_from_python_force_ltr(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_adjust_line_height(PyObject *val, Options *opts) {
adjust_line_height(val, opts);
}
static void
convert_from_opts_adjust_line_height(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "adjust_line_height");
if (ret == NULL) return;
convert_from_python_adjust_line_height(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_adjust_column_width(PyObject *val, Options *opts) {
adjust_column_width(val, opts);
}
static void
convert_from_opts_adjust_column_width(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "adjust_column_width");
if (ret == NULL) return;
convert_from_python_adjust_column_width(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_disable_ligatures(PyObject *val, Options *opts) {
opts->disable_ligatures = PyLong_AsLong(val);
}
static void
convert_from_opts_disable_ligatures(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "disable_ligatures");
if (ret == NULL) return;
convert_from_python_disable_ligatures(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_cursor_shape(PyObject *val, Options *opts) {
opts->cursor_shape = PyLong_AsLong(val);
}
static void
convert_from_opts_cursor_shape(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "cursor_shape");
if (ret == NULL) return;
convert_from_python_cursor_shape(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_cursor_beam_thickness(PyObject *val, Options *opts) {
opts->cursor_beam_thickness = PyFloat_AsFloat(val);
}
static void
convert_from_opts_cursor_beam_thickness(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "cursor_beam_thickness");
if (ret == NULL) return;
convert_from_python_cursor_beam_thickness(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_cursor_underline_thickness(PyObject *val, Options *opts) {
opts->cursor_underline_thickness = PyFloat_AsFloat(val);
}
static void
convert_from_opts_cursor_underline_thickness(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "cursor_underline_thickness");
if (ret == NULL) return;
convert_from_python_cursor_underline_thickness(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_cursor_blink_interval(PyObject *val, Options *opts) {
opts->cursor_blink_interval = parse_s_double_to_monotonic_t(val);
}
static void
convert_from_opts_cursor_blink_interval(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "cursor_blink_interval");
if (ret == NULL) return;
convert_from_python_cursor_blink_interval(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_cursor_stop_blinking_after(PyObject *val, Options *opts) {
opts->cursor_stop_blinking_after = parse_s_double_to_monotonic_t(val);
}
static void
convert_from_opts_cursor_stop_blinking_after(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "cursor_stop_blinking_after");
if (ret == NULL) return;
convert_from_python_cursor_stop_blinking_after(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_scrollback_pager_history_size(PyObject *val, Options *opts) {
opts->scrollback_pager_history_size = PyLong_AsUnsignedLong(val);
}
static void
convert_from_opts_scrollback_pager_history_size(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "scrollback_pager_history_size");
if (ret == NULL) return;
convert_from_python_scrollback_pager_history_size(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_scrollback_fill_enlarged_window(PyObject *val, Options *opts) {
opts->scrollback_fill_enlarged_window = PyObject_IsTrue(val);
}
static void
convert_from_opts_scrollback_fill_enlarged_window(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "scrollback_fill_enlarged_window");
if (ret == NULL) return;
convert_from_python_scrollback_fill_enlarged_window(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_wheel_scroll_multiplier(PyObject *val, Options *opts) {
opts->wheel_scroll_multiplier = PyFloat_AsDouble(val);
}
static void
convert_from_opts_wheel_scroll_multiplier(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "wheel_scroll_multiplier");
if (ret == NULL) return;
convert_from_python_wheel_scroll_multiplier(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_touch_scroll_multiplier(PyObject *val, Options *opts) {
opts->touch_scroll_multiplier = PyFloat_AsDouble(val);
}
static void
convert_from_opts_touch_scroll_multiplier(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "touch_scroll_multiplier");
if (ret == NULL) return;
convert_from_python_touch_scroll_multiplier(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_mouse_hide_wait(PyObject *val, Options *opts) {
opts->mouse_hide_wait = parse_s_double_to_monotonic_t(val);
}
static void
convert_from_opts_mouse_hide_wait(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "mouse_hide_wait");
if (ret == NULL) return;
convert_from_python_mouse_hide_wait(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_url_color(PyObject *val, Options *opts) {
opts->url_color = color_as_int(val);
}
static void
convert_from_opts_url_color(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "url_color");
if (ret == NULL) return;
convert_from_python_url_color(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_url_style(PyObject *val, Options *opts) {
opts->url_style = PyLong_AsUnsignedLong(val);
}
static void
convert_from_opts_url_style(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "url_style");
if (ret == NULL) return;
convert_from_python_url_style(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_url_prefixes(PyObject *val, Options *opts) {
url_prefixes(val, opts);
}
static void
convert_from_opts_url_prefixes(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "url_prefixes");
if (ret == NULL) return;
convert_from_python_url_prefixes(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_detect_urls(PyObject *val, Options *opts) {
opts->detect_urls = PyObject_IsTrue(val);
}
static void
convert_from_opts_detect_urls(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "detect_urls");
if (ret == NULL) return;
convert_from_python_detect_urls(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_select_by_word_characters(PyObject *val, Options *opts) {
select_by_word_characters(val, opts);
}
static void
convert_from_opts_select_by_word_characters(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "select_by_word_characters");
if (ret == NULL) return;
convert_from_python_select_by_word_characters(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_click_interval(PyObject *val, Options *opts) {
opts->click_interval = parse_s_double_to_monotonic_t(val);
}
static void
convert_from_opts_click_interval(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "click_interval");
if (ret == NULL) return;
convert_from_python_click_interval(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_focus_follows_mouse(PyObject *val, Options *opts) {
opts->focus_follows_mouse = PyObject_IsTrue(val);
}
static void
convert_from_opts_focus_follows_mouse(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "focus_follows_mouse");
if (ret == NULL) return;
convert_from_python_focus_follows_mouse(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_pointer_shape_when_grabbed(PyObject *val, Options *opts) {
opts->pointer_shape_when_grabbed = pointer_shape(val);
}
static void
convert_from_opts_pointer_shape_when_grabbed(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "pointer_shape_when_grabbed");
if (ret == NULL) return;
convert_from_python_pointer_shape_when_grabbed(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_default_pointer_shape(PyObject *val, Options *opts) {
opts->default_pointer_shape = pointer_shape(val);
}
static void
convert_from_opts_default_pointer_shape(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "default_pointer_shape");
if (ret == NULL) return;
convert_from_python_default_pointer_shape(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_pointer_shape_when_dragging(PyObject *val, Options *opts) {
opts->pointer_shape_when_dragging = pointer_shape(val);
}
static void
convert_from_opts_pointer_shape_when_dragging(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "pointer_shape_when_dragging");
if (ret == NULL) return;
convert_from_python_pointer_shape_when_dragging(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_repaint_delay(PyObject *val, Options *opts) {
opts->repaint_delay = parse_ms_long_to_monotonic_t(val);
}
static void
convert_from_opts_repaint_delay(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "repaint_delay");
if (ret == NULL) return;
convert_from_python_repaint_delay(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_input_delay(PyObject *val, Options *opts) {
opts->input_delay = parse_ms_long_to_monotonic_t(val);
}
static void
convert_from_opts_input_delay(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "input_delay");
if (ret == NULL) return;
convert_from_python_input_delay(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_sync_to_monitor(PyObject *val, Options *opts) {
opts->sync_to_monitor = PyObject_IsTrue(val);
}
static void
convert_from_opts_sync_to_monitor(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "sync_to_monitor");
if (ret == NULL) return;
convert_from_python_sync_to_monitor(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_enable_audio_bell(PyObject *val, Options *opts) {
opts->enable_audio_bell = PyObject_IsTrue(val);
}
static void
convert_from_opts_enable_audio_bell(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "enable_audio_bell");
if (ret == NULL) return;
convert_from_python_enable_audio_bell(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_visual_bell_duration(PyObject *val, Options *opts) {
opts->visual_bell_duration = parse_s_double_to_monotonic_t(val);
}
static void
convert_from_opts_visual_bell_duration(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "visual_bell_duration");
if (ret == NULL) return;
convert_from_python_visual_bell_duration(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_window_alert_on_bell(PyObject *val, Options *opts) {
opts->window_alert_on_bell = PyObject_IsTrue(val);
}
static void
convert_from_opts_window_alert_on_bell(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "window_alert_on_bell");
if (ret == NULL) return;
convert_from_python_window_alert_on_bell(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_active_border_color(PyObject *val, Options *opts) {
opts->active_border_color = active_border_color(val);
}
static void
convert_from_opts_active_border_color(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "active_border_color");
if (ret == NULL) return;
convert_from_python_active_border_color(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_inactive_border_color(PyObject *val, Options *opts) {
opts->inactive_border_color = color_as_int(val);
}
static void
convert_from_opts_inactive_border_color(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "inactive_border_color");
if (ret == NULL) return;
convert_from_python_inactive_border_color(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_bell_border_color(PyObject *val, Options *opts) {
opts->bell_border_color = color_as_int(val);
}
static void
convert_from_opts_bell_border_color(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "bell_border_color");
if (ret == NULL) return;
convert_from_python_bell_border_color(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_inactive_text_alpha(PyObject *val, Options *opts) {
opts->inactive_text_alpha = PyFloat_AsFloat(val);
}
static void
convert_from_opts_inactive_text_alpha(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "inactive_text_alpha");
if (ret == NULL) return;
convert_from_python_inactive_text_alpha(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_hide_window_decorations(PyObject *val, Options *opts) {
opts->hide_window_decorations = PyLong_AsUnsignedLong(val);
}
static void
convert_from_opts_hide_window_decorations(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "hide_window_decorations");
if (ret == NULL) return;
convert_from_python_hide_window_decorations(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_resize_debounce_time(PyObject *val, Options *opts) {
opts->resize_debounce_time = parse_s_double_to_monotonic_t(val);
}
static void
convert_from_opts_resize_debounce_time(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "resize_debounce_time");
if (ret == NULL) return;
convert_from_python_resize_debounce_time(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_resize_draw_strategy(PyObject *val, Options *opts) {
opts->resize_draw_strategy = PyLong_AsLong(val);
}
static void
convert_from_opts_resize_draw_strategy(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "resize_draw_strategy");
if (ret == NULL) return;
convert_from_python_resize_draw_strategy(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_resize_in_steps(PyObject *val, Options *opts) {
opts->resize_in_steps = PyObject_IsTrue(val);
}
static void
convert_from_opts_resize_in_steps(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "resize_in_steps");
if (ret == NULL) return;
convert_from_python_resize_in_steps(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_tab_bar_edge(PyObject *val, Options *opts) {
opts->tab_bar_edge = PyLong_AsLong(val);
}
static void
convert_from_opts_tab_bar_edge(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "tab_bar_edge");
if (ret == NULL) return;
convert_from_python_tab_bar_edge(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_tab_bar_style(PyObject *val, Options *opts) {
tab_bar_style(val, opts);
}
static void
convert_from_opts_tab_bar_style(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "tab_bar_style");
if (ret == NULL) return;
convert_from_python_tab_bar_style(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_tab_bar_min_tabs(PyObject *val, Options *opts) {
opts->tab_bar_min_tabs = PyLong_AsUnsignedLong(val);
}
static void
convert_from_opts_tab_bar_min_tabs(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "tab_bar_min_tabs");
if (ret == NULL) return;
convert_from_python_tab_bar_min_tabs(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_foreground(PyObject *val, Options *opts) {
opts->foreground = color_as_int(val);
}
static void
convert_from_opts_foreground(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "foreground");
if (ret == NULL) return;
convert_from_python_foreground(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_background(PyObject *val, Options *opts) {
opts->background = color_as_int(val);
}
static void
convert_from_opts_background(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "background");
if (ret == NULL) return;
convert_from_python_background(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_background_opacity(PyObject *val, Options *opts) {
opts->background_opacity = PyFloat_AsFloat(val);
}
static void
convert_from_opts_background_opacity(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "background_opacity");
if (ret == NULL) return;
convert_from_python_background_opacity(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_background_image(PyObject *val, Options *opts) {
background_image(val, opts);
}
static void
convert_from_opts_background_image(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "background_image");
if (ret == NULL) return;
convert_from_python_background_image(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_background_image_layout(PyObject *val, Options *opts) {
opts->background_image_layout = bglayout(val);
}
static void
convert_from_opts_background_image_layout(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "background_image_layout");
if (ret == NULL) return;
convert_from_python_background_image_layout(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_background_image_linear(PyObject *val, Options *opts) {
opts->background_image_linear = PyObject_IsTrue(val);
}
static void
convert_from_opts_background_image_linear(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "background_image_linear");
if (ret == NULL) return;
convert_from_python_background_image_linear(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_dynamic_background_opacity(PyObject *val, Options *opts) {
opts->dynamic_background_opacity = PyObject_IsTrue(val);
}
static void
convert_from_opts_dynamic_background_opacity(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "dynamic_background_opacity");
if (ret == NULL) return;
convert_from_python_dynamic_background_opacity(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_background_tint(PyObject *val, Options *opts) {
opts->background_tint = PyFloat_AsFloat(val);
}
static void
convert_from_opts_background_tint(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "background_tint");
if (ret == NULL) return;
convert_from_python_background_tint(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_dim_opacity(PyObject *val, Options *opts) {
opts->dim_opacity = PyFloat_AsFloat(val);
}
static void
convert_from_opts_dim_opacity(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "dim_opacity");
if (ret == NULL) return;
convert_from_python_dim_opacity(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_mark1_foreground(PyObject *val, Options *opts) {
opts->mark1_foreground = color_as_int(val);
}
static void
convert_from_opts_mark1_foreground(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "mark1_foreground");
if (ret == NULL) return;
convert_from_python_mark1_foreground(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_mark1_background(PyObject *val, Options *opts) {
opts->mark1_background = color_as_int(val);
}
static void
convert_from_opts_mark1_background(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "mark1_background");
if (ret == NULL) return;
convert_from_python_mark1_background(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_mark2_foreground(PyObject *val, Options *opts) {
opts->mark2_foreground = color_as_int(val);
}
static void
convert_from_opts_mark2_foreground(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "mark2_foreground");
if (ret == NULL) return;
convert_from_python_mark2_foreground(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_mark2_background(PyObject *val, Options *opts) {
opts->mark2_background = color_as_int(val);
}
static void
convert_from_opts_mark2_background(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "mark2_background");
if (ret == NULL) return;
convert_from_python_mark2_background(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_mark3_foreground(PyObject *val, Options *opts) {
opts->mark3_foreground = color_as_int(val);
}
static void
convert_from_opts_mark3_foreground(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "mark3_foreground");
if (ret == NULL) return;
convert_from_python_mark3_foreground(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_mark3_background(PyObject *val, Options *opts) {
opts->mark3_background = color_as_int(val);
}
static void
convert_from_opts_mark3_background(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "mark3_background");
if (ret == NULL) return;
convert_from_python_mark3_background(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_close_on_child_death(PyObject *val, Options *opts) {
opts->close_on_child_death = PyObject_IsTrue(val);
}
static void
convert_from_opts_close_on_child_death(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "close_on_child_death");
if (ret == NULL) return;
convert_from_python_close_on_child_death(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_allow_hyperlinks(PyObject *val, Options *opts) {
opts->allow_hyperlinks = PyObject_IsTrue(val);
}
static void
convert_from_opts_allow_hyperlinks(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "allow_hyperlinks");
if (ret == NULL) return;
convert_from_python_allow_hyperlinks(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_macos_option_as_alt(PyObject *val, Options *opts) {
opts->macos_option_as_alt = PyLong_AsUnsignedLong(val);
}
static void
convert_from_opts_macos_option_as_alt(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "macos_option_as_alt");
if (ret == NULL) return;
convert_from_python_macos_option_as_alt(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_macos_hide_from_tasks(PyObject *val, Options *opts) {
opts->macos_hide_from_tasks = PyObject_IsTrue(val);
}
static void
convert_from_opts_macos_hide_from_tasks(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "macos_hide_from_tasks");
if (ret == NULL) return;
convert_from_python_macos_hide_from_tasks(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_macos_quit_when_last_window_closed(PyObject *val, Options *opts) {
opts->macos_quit_when_last_window_closed = PyObject_IsTrue(val);
}
static void
convert_from_opts_macos_quit_when_last_window_closed(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "macos_quit_when_last_window_closed");
if (ret == NULL) return;
convert_from_python_macos_quit_when_last_window_closed(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_macos_window_resizable(PyObject *val, Options *opts) {
opts->macos_window_resizable = PyObject_IsTrue(val);
}
static void
convert_from_opts_macos_window_resizable(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "macos_window_resizable");
if (ret == NULL) return;
convert_from_python_macos_window_resizable(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_macos_thicken_font(PyObject *val, Options *opts) {
opts->macos_thicken_font = PyFloat_AsFloat(val);
}
static void
convert_from_opts_macos_thicken_font(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "macos_thicken_font");
if (ret == NULL) return;
convert_from_python_macos_thicken_font(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_macos_traditional_fullscreen(PyObject *val, Options *opts) {
opts->macos_traditional_fullscreen = PyObject_IsTrue(val);
}
static void
convert_from_opts_macos_traditional_fullscreen(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "macos_traditional_fullscreen");
if (ret == NULL) return;
convert_from_python_macos_traditional_fullscreen(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_macos_show_window_title_in(PyObject *val, Options *opts) {
opts->macos_show_window_title_in = window_title_in(val);
}
static void
convert_from_opts_macos_show_window_title_in(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "macos_show_window_title_in");
if (ret == NULL) return;
convert_from_python_macos_show_window_title_in(ret, opts);
Py_DECREF(ret);
}
static bool
convert_opts_from_python_opts(PyObject *py_opts, Options *opts) {
convert_from_opts_force_ltr(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_adjust_line_height(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_adjust_column_width(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_disable_ligatures(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_cursor_shape(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_cursor_beam_thickness(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_cursor_underline_thickness(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_cursor_blink_interval(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_cursor_stop_blinking_after(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_scrollback_pager_history_size(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_scrollback_fill_enlarged_window(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_wheel_scroll_multiplier(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_touch_scroll_multiplier(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_mouse_hide_wait(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_url_color(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_url_style(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_url_prefixes(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_detect_urls(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_select_by_word_characters(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_click_interval(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_focus_follows_mouse(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_pointer_shape_when_grabbed(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_default_pointer_shape(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_pointer_shape_when_dragging(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_repaint_delay(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_input_delay(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_sync_to_monitor(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_enable_audio_bell(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_visual_bell_duration(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_window_alert_on_bell(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_active_border_color(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_inactive_border_color(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_bell_border_color(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_inactive_text_alpha(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_hide_window_decorations(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_resize_debounce_time(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_resize_draw_strategy(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_resize_in_steps(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_tab_bar_edge(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_tab_bar_style(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_tab_bar_min_tabs(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_foreground(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_background(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_background_opacity(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_background_image(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_background_image_layout(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_background_image_linear(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_dynamic_background_opacity(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_background_tint(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_dim_opacity(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_mark1_foreground(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_mark1_background(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_mark2_foreground(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_mark2_background(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_mark3_foreground(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_mark3_background(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_close_on_child_death(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_allow_hyperlinks(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_macos_option_as_alt(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_macos_hide_from_tasks(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_macos_quit_when_last_window_closed(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_macos_window_resizable(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_macos_thicken_font(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_macos_traditional_fullscreen(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_macos_show_window_title_in(py_opts, opts);
if (PyErr_Occurred()) return false;
return true;
}

View File

@ -133,6 +133,11 @@ select_by_word_characters(PyObject *chars, Options *opts) {
opts->select_by_word_characters_count = PyUnicode_GET_LENGTH(chars); opts->select_by_word_characters_count = PyUnicode_GET_LENGTH(chars);
} }
static void
tab_bar_style(PyObject *val, Options *opts) {
opts->tab_bar_hidden = PyUnicode_CompareWithASCIIString(val, "hidden") == 0 ? true: false;
}
#define read_adjust(name) { \ #define read_adjust(name) { \
if (PyFloat_Check(al)) { \ if (PyFloat_Check(al)) { \
opts->name##_frac = (float)PyFloat_AsDouble(al); \ opts->name##_frac = (float)PyFloat_AsDouble(al); \

20
kitty/options/types.py generated
View File

@ -450,7 +450,7 @@ class Options:
box_drawing_scale: typing.Tuple[float, float, float, float] = (0.001, 1.0, 1.5, 2.0) box_drawing_scale: typing.Tuple[float, float, float, float] = (0.001, 1.0, 1.5, 2.0)
clear_all_shortcuts: bool = False clear_all_shortcuts: bool = False
click_interval: float = -1.0 click_interval: float = -1.0
clipboard_control: typing.FrozenSet[str] = frozenset({'write-primary', 'write-clipboard'}) clipboard_control: typing.FrozenSet[str] = frozenset({'write-clipboard', 'write-primary'})
close_on_child_death: bool = False close_on_child_death: bool = False
color0: Color = Color(red=0, green=0, blue=0) color0: Color = Color(red=0, green=0, blue=0)
color1: Color = Color(red=204, green=4, blue=3) color1: Color = Color(red=204, green=4, blue=3)
@ -1012,10 +1012,10 @@ if is_macos:
defaults.map.append(KeyDefinition(False, KeyAction('edit_config_file'), 8, False, 44, ())) defaults.map.append(KeyDefinition(False, KeyAction('edit_config_file'), 8, False, 44, ()))
defaults.mouse_map = [ defaults.mouse_map = [
MouseMapping(0, 0, -2, False, KeyAction('mouse_click_url_or_select')), MouseMapping(0, 0, -2, False, KeyAction('mouse_click_url_or_select')),
MouseMapping(0, 1, -2, False, KeyAction('mouse_click_url_or_select')),
MouseMapping(0, 1, -2, True, KeyAction('mouse_click_url_or_select')), MouseMapping(0, 1, -2, True, KeyAction('mouse_click_url_or_select')),
MouseMapping(0, 5, -1, False, KeyAction('mouse_click_url')), MouseMapping(0, 1, -2, False, KeyAction('mouse_click_url_or_select')),
MouseMapping(0, 5, -1, True, KeyAction('mouse_click_url')), MouseMapping(0, 5, -1, True, KeyAction('mouse_click_url')),
MouseMapping(0, 5, -1, False, KeyAction('mouse_click_url')),
MouseMapping(2, 0, -1, False, KeyAction('paste_selection')), MouseMapping(2, 0, -1, False, KeyAction('paste_selection')),
MouseMapping(0, 0, 1, False, KeyAction('mouse_selection', (0,))), MouseMapping(0, 0, 1, False, KeyAction('mouse_selection', (0,))),
MouseMapping(0, 6, 1, False, KeyAction('mouse_selection', (2,))), MouseMapping(0, 6, 1, False, KeyAction('mouse_selection', (2,))),
@ -1023,18 +1023,18 @@ defaults.mouse_map = [
MouseMapping(0, 0, 3, False, KeyAction('mouse_selection', (4,))), MouseMapping(0, 0, 3, False, KeyAction('mouse_selection', (4,))),
MouseMapping(0, 6, 3, False, KeyAction('mouse_selection', (5,))), MouseMapping(0, 6, 3, False, KeyAction('mouse_selection', (5,))),
MouseMapping(1, 0, 1, False, KeyAction('mouse_selection', (1,))), MouseMapping(1, 0, 1, False, KeyAction('mouse_selection', (1,))),
MouseMapping(2, 1, -1, False, KeyAction('paste_selection')),
MouseMapping(2, 1, -1, True, KeyAction('paste_selection')), MouseMapping(2, 1, -1, True, KeyAction('paste_selection')),
MouseMapping(0, 1, 1, False, KeyAction('mouse_selection', (0,))), MouseMapping(2, 1, -1, False, KeyAction('paste_selection')),
MouseMapping(0, 1, 1, True, KeyAction('mouse_selection', (0,))), MouseMapping(0, 1, 1, True, KeyAction('mouse_selection', (0,))),
MouseMapping(0, 7, 1, False, KeyAction('mouse_selection', (2,))), MouseMapping(0, 1, 1, False, KeyAction('mouse_selection', (0,))),
MouseMapping(0, 7, 1, True, KeyAction('mouse_selection', (2,))), MouseMapping(0, 7, 1, True, KeyAction('mouse_selection', (2,))),
MouseMapping(0, 1, 2, False, KeyAction('mouse_selection', (3,))), MouseMapping(0, 7, 1, False, KeyAction('mouse_selection', (2,))),
MouseMapping(0, 1, 2, True, KeyAction('mouse_selection', (3,))), MouseMapping(0, 1, 2, True, KeyAction('mouse_selection', (3,))),
MouseMapping(0, 1, 3, False, KeyAction('mouse_selection', (4,))), MouseMapping(0, 1, 2, False, KeyAction('mouse_selection', (3,))),
MouseMapping(0, 1, 3, True, KeyAction('mouse_selection', (4,))), MouseMapping(0, 1, 3, True, KeyAction('mouse_selection', (4,))),
MouseMapping(0, 7, 3, False, KeyAction('mouse_selection', (5,))), MouseMapping(0, 1, 3, False, KeyAction('mouse_selection', (4,))),
MouseMapping(0, 7, 3, True, KeyAction('mouse_selection', (5,))), MouseMapping(0, 7, 3, True, KeyAction('mouse_selection', (5,))),
MouseMapping(1, 1, 1, False, KeyAction('mouse_selection', (1,))), MouseMapping(0, 7, 3, False, KeyAction('mouse_selection', (5,))),
MouseMapping(1, 1, 1, True, KeyAction('mouse_selection', (1,))), MouseMapping(1, 1, 1, True, KeyAction('mouse_selection', (1,))),
MouseMapping(1, 1, 1, False, KeyAction('mouse_selection', (1,))),
] ]

View File

@ -6,7 +6,7 @@
*/ */
#include "cleanup.h" #include "cleanup.h"
#include "options/to-c.h" #include "options/to-c-generated.h"
#include <math.h> #include <math.h>
GlobalState global_state = {{0}}; GlobalState global_state = {{0}};
@ -580,11 +580,6 @@ PYWRAP1(handle_for_window_id) {
return NULL; return NULL;
} }
static void
tab_bar_style(PyObject *val, Options *opts) {
opts->tab_bar_hidden = PyUnicode_CompareWithASCIIString(val, "hidden") == 0 ? true: false;
}
static PyObject* options_object = NULL; static PyObject* options_object = NULL;
PYWRAP0(get_options) { PYWRAP0(get_options) {
@ -597,7 +592,7 @@ PYWRAP0(get_options) {
} }
PYWRAP1(set_options) { PYWRAP1(set_options) {
PyObject *ret, *opts; PyObject *opts;
int is_wayland = 0, debug_rendering = 0, debug_font_fallback = 0; int is_wayland = 0, debug_rendering = 0, debug_font_fallback = 0;
PA("O|ppp", &opts, &is_wayland, &debug_rendering, &debug_font_fallback); PA("O|ppp", &opts, &is_wayland, &debug_rendering, &debug_font_fallback);
if (opts == Py_None) { if (opts == Py_None) {
@ -611,85 +606,7 @@ PYWRAP1(set_options) {
if (global_state.is_wayland) global_state.has_render_frames = true; if (global_state.is_wayland) global_state.has_render_frames = true;
global_state.debug_rendering = debug_rendering ? true : false; global_state.debug_rendering = debug_rendering ? true : false;
global_state.debug_font_fallback = debug_font_fallback ? true : false; global_state.debug_font_fallback = debug_font_fallback ? true : false;
#define GA(name) ret = PyObject_GetAttrString(opts, #name); if (ret == NULL) return NULL; if (!convert_opts_from_python_opts(opts, &global_state.opts)) return NULL;
#define SS(name, dest, convert) { GA(name); dest = convert(ret); Py_DECREF(ret); if (PyErr_Occurred()) return NULL; }
#define S(name, convert) SS(name, OPT(name), convert)
S(hide_window_decorations, PyLong_AsUnsignedLong);
S(visual_bell_duration, parse_s_double_to_monotonic_t);
S(enable_audio_bell, PyObject_IsTrue);
S(focus_follows_mouse, PyObject_IsTrue);
S(cursor_blink_interval, parse_s_double_to_monotonic_t);
S(cursor_stop_blinking_after, parse_s_double_to_monotonic_t);
S(background_opacity, PyFloat_AsFloat);
S(background_image_layout, bglayout);
S(background_tint, PyFloat_AsFloat);
S(background_image_linear, PyObject_IsTrue);
S(dim_opacity, PyFloat_AsFloat);
S(dynamic_background_opacity, PyObject_IsTrue);
S(inactive_text_alpha, PyFloat_AsFloat);
S(scrollback_pager_history_size, PyLong_AsUnsignedLong);
S(scrollback_fill_enlarged_window, PyObject_IsTrue);
S(cursor_shape, PyLong_AsLong);
S(cursor_beam_thickness, PyFloat_AsFloat);
S(cursor_underline_thickness, PyFloat_AsFloat);
S(url_style, PyLong_AsUnsignedLong);
S(tab_bar_edge, PyLong_AsLong);
S(mouse_hide_wait, parse_s_double_to_monotonic_t);
S(wheel_scroll_multiplier, PyFloat_AsDouble);
S(touch_scroll_multiplier, PyFloat_AsDouble);
S(click_interval, parse_s_double_to_monotonic_t);
S(resize_debounce_time, parse_s_double_to_monotonic_t);
S(mark1_foreground, color_as_int);
S(mark1_background, color_as_int);
S(mark2_foreground, color_as_int);
S(mark2_background, color_as_int);
S(mark3_foreground, color_as_int);
S(mark3_background, color_as_int);
S(url_color, color_as_int);
S(background, color_as_int);
S(foreground, color_as_int);
S(active_border_color, active_border_color);
S(inactive_border_color, color_as_int);
S(bell_border_color, color_as_int);
S(repaint_delay, parse_ms_long_to_monotonic_t);
S(input_delay, parse_ms_long_to_monotonic_t);
S(sync_to_monitor, PyObject_IsTrue);
S(close_on_child_death, PyObject_IsTrue);
S(window_alert_on_bell, PyObject_IsTrue);
S(macos_option_as_alt, PyLong_AsUnsignedLong);
S(macos_traditional_fullscreen, PyObject_IsTrue);
S(macos_quit_when_last_window_closed, PyObject_IsTrue);
S(macos_show_window_title_in, window_title_in);
S(macos_window_resizable, PyObject_IsTrue);
S(macos_hide_from_tasks, PyObject_IsTrue);
S(macos_thicken_font, PyFloat_AsFloat);
S(tab_bar_min_tabs, PyLong_AsUnsignedLong);
S(disable_ligatures, PyLong_AsLong);
S(force_ltr, PyObject_IsTrue);
S(resize_draw_strategy, PyLong_AsLong);
S(resize_in_steps, PyObject_IsTrue);
S(allow_hyperlinks, PyObject_IsTrue);
S(pointer_shape_when_grabbed, pointer_shape);
S(default_pointer_shape, pointer_shape);
S(pointer_shape_when_dragging, pointer_shape);
S(detect_urls, PyObject_IsTrue);
#define SPECIAL(name) {\
GA(name); \
name(ret, &global_state.opts); \
Py_CLEAR(ret); \
if (PyErr_Occurred()) return NULL; \
}
SPECIAL(tab_bar_style);
SPECIAL(url_prefixes);
SPECIAL(select_by_word_characters);
SPECIAL(background_image);
SPECIAL(adjust_line_height);
SPECIAL(adjust_column_width);
#undef SPECIAL
#undef S
#undef SS
options_object = opts; options_object = opts;
Py_INCREF(options_object); Py_INCREF(options_object);
Py_RETURN_NONE; Py_RETURN_NONE;