mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-27 18:51:41 +02:00
expose cursor_trail options
This commit is contained in:
@@ -751,7 +751,7 @@ prepare_to_render_os_window(OSWindow *os_window, monotonic_t now, unsigned int *
|
|||||||
WD.screen->cursor_render_info.is_focused = os_window->is_focused;
|
WD.screen->cursor_render_info.is_focused = os_window->is_focused;
|
||||||
set_os_window_title_from_window(w, os_window);
|
set_os_window_title_from_window(w, os_window);
|
||||||
*active_window_bg = window_bg;
|
*active_window_bg = window_bg;
|
||||||
if (true && update_cursor_trail(&tab->cursor_trail, w, now, os_window)) needs_render = true;
|
if (OPT(enable_cursor_trail) && update_cursor_trail(&tab->cursor_trail, w, now, os_window)) needs_render = true;
|
||||||
} else {
|
} else {
|
||||||
if (WD.screen->cursor_render_info.render_even_when_unfocused) {
|
if (WD.screen->cursor_render_info.render_even_when_unfocused) {
|
||||||
if (collect_cursor_info(&WD.screen->cursor_render_info, w, now, os_window)) needs_render = true;
|
if (collect_cursor_info(&WD.screen->cursor_render_info, w, now, os_window)) needs_render = true;
|
||||||
@@ -809,7 +809,7 @@ render_prepared_os_window(OSWindow *os_window, unsigned int active_window_id, co
|
|||||||
w->cursor_opacity_at_last_render = WD.screen->cursor_render_info.opacity; w->last_cursor_shape = WD.screen->cursor_render_info.shape;
|
w->cursor_opacity_at_last_render = WD.screen->cursor_render_info.opacity; w->last_cursor_shape = WD.screen->cursor_render_info.shape;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (true && tab->cursor_trail.needs_render) draw_cursor_trail(&tab->cursor_trail);
|
if (OPT(enable_cursor_trail) && tab->cursor_trail.needs_render) draw_cursor_trail(&tab->cursor_trail);
|
||||||
if (os_window->live_resize.in_progress) draw_resizing_text(os_window);
|
if (os_window->live_resize.in_progress) draw_resizing_text(os_window);
|
||||||
swap_window_buffers(os_window);
|
swap_window_buffers(os_window);
|
||||||
os_window->last_active_tab = os_window->active_tab; os_window->last_num_tabs = os_window->num_tabs; os_window->last_active_window_id = active_window_id;
|
os_window->last_active_tab = os_window->active_tab; os_window->last_num_tabs = os_window->num_tabs; os_window->last_active_window_id = active_window_id;
|
||||||
|
|||||||
@@ -45,10 +45,9 @@ update_cursor_trail(CursorTrail *ct, Window *w, monotonic_t now, OSWindow *os_wi
|
|||||||
return needs_render_prev;
|
return needs_render_prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo - make these configurable
|
|
||||||
// the decay time for the trail to reach 1/1024 of its distance from the cursor corner
|
// the decay time for the trail to reach 1/1024 of its distance from the cursor corner
|
||||||
float decay_fast = 0.10f;
|
float decay_fast = OPT(cursor_trail_decay_fast);
|
||||||
float decay_slow = 0.30f;
|
float decay_slow = OPT(cursor_trail_decay_slow);
|
||||||
|
|
||||||
if (os_window->live_resize.in_progress) {
|
if (os_window->live_resize.in_progress) {
|
||||||
for (int i = 0; i < 4; ++i) {
|
for (int i = 0; i < 4; ++i) {
|
||||||
|
|||||||
@@ -350,6 +350,28 @@ inactivity. Set to zero to never stop blinking.
|
|||||||
'''
|
'''
|
||||||
)
|
)
|
||||||
|
|
||||||
|
opt('enable_cursor_trail', 'no',
|
||||||
|
option_type='to_bool', ctype='bool',
|
||||||
|
long_text='''
|
||||||
|
Enables or disables the cursor trail effect. When set to `yes`, a trailing
|
||||||
|
effect is rendered behind the cursor as it moves, creating a motion trail.
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
|
||||||
|
opt('cursor_trail_decay', '0.1 0.3',
|
||||||
|
option_type='cursor_trail_decay',
|
||||||
|
ctype='!cursor_trail_decay',
|
||||||
|
long_text='''
|
||||||
|
Controls the decay times for the cursor trail effect when :code:`enable_cursor_trail`
|
||||||
|
is set to :code:`yes`. This option accepts two positive float values specifying the
|
||||||
|
fastest and slowest decay times in seconds. The first value corresponds to the
|
||||||
|
fastest decay time (minimum), and the second value corresponds to the slowest
|
||||||
|
decay time (maximum). The second value must be equal to or greater than the
|
||||||
|
first value. Smaller values result in a faster decay of the cursor trail.
|
||||||
|
Adjust these values to control how quickly the cursor trail fades away.
|
||||||
|
''',
|
||||||
|
)
|
||||||
|
|
||||||
egr() # }}}
|
egr() # }}}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
8
kitty/options/parse.py
generated
8
kitty/options/parse.py
generated
@@ -10,7 +10,7 @@ from kitty.options.utils import (
|
|||||||
action_alias, active_tab_title_template, allow_hyperlinks, bell_on_tab, box_drawing_scale,
|
action_alias, active_tab_title_template, allow_hyperlinks, bell_on_tab, box_drawing_scale,
|
||||||
clear_all_mouse_actions, clear_all_shortcuts, clipboard_control, clone_source_strategies,
|
clear_all_mouse_actions, clear_all_shortcuts, clipboard_control, clone_source_strategies,
|
||||||
config_or_absolute_path, copy_on_select, cursor_blink_interval, cursor_text_color,
|
config_or_absolute_path, copy_on_select, cursor_blink_interval, cursor_text_color,
|
||||||
deprecated_adjust_line_height, deprecated_hide_window_decorations_aliases,
|
cursor_trail_decay, deprecated_adjust_line_height, deprecated_hide_window_decorations_aliases,
|
||||||
deprecated_macos_show_window_title_in_menubar_alias, deprecated_send_text, disable_ligatures,
|
deprecated_macos_show_window_title_in_menubar_alias, deprecated_send_text, disable_ligatures,
|
||||||
edge_width, env, filter_notification, font_features, hide_window_decorations, macos_option_as_alt,
|
edge_width, env, filter_notification, font_features, hide_window_decorations, macos_option_as_alt,
|
||||||
macos_titlebar_color, menu_map, modify_font, narrow_symbols, notify_on_cmd_finish,
|
macos_titlebar_color, menu_map, modify_font, narrow_symbols, notify_on_cmd_finish,
|
||||||
@@ -931,6 +931,9 @@ class Parser:
|
|||||||
def cursor_text_color(self, val: str, ans: typing.Dict[str, typing.Any]) -> None:
|
def cursor_text_color(self, val: str, ans: typing.Dict[str, typing.Any]) -> None:
|
||||||
ans['cursor_text_color'] = cursor_text_color(val)
|
ans['cursor_text_color'] = cursor_text_color(val)
|
||||||
|
|
||||||
|
def cursor_trail_decay(self, val: str, ans: typing.Dict[str, typing.Any]) -> None:
|
||||||
|
ans['cursor_trail_decay'] = cursor_trail_decay(val)
|
||||||
|
|
||||||
def cursor_underline_thickness(self, val: str, ans: typing.Dict[str, typing.Any]) -> None:
|
def cursor_underline_thickness(self, val: str, ans: typing.Dict[str, typing.Any]) -> None:
|
||||||
ans['cursor_underline_thickness'] = positive_float(val)
|
ans['cursor_underline_thickness'] = positive_float(val)
|
||||||
|
|
||||||
@@ -963,6 +966,9 @@ class Parser:
|
|||||||
def enable_audio_bell(self, val: str, ans: typing.Dict[str, typing.Any]) -> None:
|
def enable_audio_bell(self, val: str, ans: typing.Dict[str, typing.Any]) -> None:
|
||||||
ans['enable_audio_bell'] = to_bool(val)
|
ans['enable_audio_bell'] = to_bool(val)
|
||||||
|
|
||||||
|
def enable_cursor_trail(self, val: str, ans: typing.Dict[str, typing.Any]) -> None:
|
||||||
|
ans['enable_cursor_trail'] = to_bool(val)
|
||||||
|
|
||||||
def enabled_layouts(self, val: str, ans: typing.Dict[str, typing.Any]) -> None:
|
def enabled_layouts(self, val: str, ans: typing.Dict[str, typing.Any]) -> None:
|
||||||
ans['enabled_layouts'] = to_layout_names(val)
|
ans['enabled_layouts'] = to_layout_names(val)
|
||||||
|
|
||||||
|
|||||||
30
kitty/options/to-c-generated.h
generated
30
kitty/options/to-c-generated.h
generated
@@ -161,6 +161,32 @@ convert_from_opts_cursor_stop_blinking_after(PyObject *py_opts, Options *opts) {
|
|||||||
Py_DECREF(ret);
|
Py_DECREF(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
convert_from_python_enable_cursor_trail(PyObject *val, Options *opts) {
|
||||||
|
opts->enable_cursor_trail = PyObject_IsTrue(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
convert_from_opts_enable_cursor_trail(PyObject *py_opts, Options *opts) {
|
||||||
|
PyObject *ret = PyObject_GetAttrString(py_opts, "enable_cursor_trail");
|
||||||
|
if (ret == NULL) return;
|
||||||
|
convert_from_python_enable_cursor_trail(ret, opts);
|
||||||
|
Py_DECREF(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
convert_from_python_cursor_trail_decay(PyObject *val, Options *opts) {
|
||||||
|
cursor_trail_decay(val, opts);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
convert_from_opts_cursor_trail_decay(PyObject *py_opts, Options *opts) {
|
||||||
|
PyObject *ret = PyObject_GetAttrString(py_opts, "cursor_trail_decay");
|
||||||
|
if (ret == NULL) return;
|
||||||
|
convert_from_python_cursor_trail_decay(ret, opts);
|
||||||
|
Py_DECREF(ret);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
convert_from_python_scrollback_indicator_opacity(PyObject *val, Options *opts) {
|
convert_from_python_scrollback_indicator_opacity(PyObject *val, Options *opts) {
|
||||||
opts->scrollback_indicator_opacity = PyFloat_AsFloat(val);
|
opts->scrollback_indicator_opacity = PyFloat_AsFloat(val);
|
||||||
@@ -1123,6 +1149,10 @@ convert_opts_from_python_opts(PyObject *py_opts, Options *opts) {
|
|||||||
if (PyErr_Occurred()) return false;
|
if (PyErr_Occurred()) return false;
|
||||||
convert_from_opts_cursor_stop_blinking_after(py_opts, opts);
|
convert_from_opts_cursor_stop_blinking_after(py_opts, opts);
|
||||||
if (PyErr_Occurred()) return false;
|
if (PyErr_Occurred()) return false;
|
||||||
|
convert_from_opts_enable_cursor_trail(py_opts, opts);
|
||||||
|
if (PyErr_Occurred()) return false;
|
||||||
|
convert_from_opts_cursor_trail_decay(py_opts, opts);
|
||||||
|
if (PyErr_Occurred()) return false;
|
||||||
convert_from_opts_scrollback_indicator_opacity(py_opts, opts);
|
convert_from_opts_scrollback_indicator_opacity(py_opts, opts);
|
||||||
if (PyErr_Occurred()) return false;
|
if (PyErr_Occurred()) return false;
|
||||||
convert_from_opts_scrollback_pager_history_size(py_opts, opts);
|
convert_from_opts_scrollback_pager_history_size(py_opts, opts);
|
||||||
|
|||||||
@@ -180,6 +180,11 @@ visual_bell_duration(PyObject *src, Options *opts) {
|
|||||||
|
|
||||||
#undef parse_animation
|
#undef parse_animation
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
cursor_trail_decay(PyObject *src, Options *opts) {
|
||||||
|
opts->cursor_trail_decay_fast = PyFloat_AsFloat(PyTuple_GET_ITEM(src, 0));
|
||||||
|
opts->cursor_trail_decay_slow = PyFloat_AsFloat(PyTuple_GET_ITEM(src, 1));
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
parse_font_mod_size(PyObject *val, float *sz, AdjustmentUnit *unit) {
|
parse_font_mod_size(PyObject *val, float *sz, AdjustmentUnit *unit) {
|
||||||
|
|||||||
4
kitty/options/types.py
generated
4
kitty/options/types.py
generated
@@ -334,6 +334,7 @@ option_names = ( # {{{
|
|||||||
'cursor_shape_unfocused',
|
'cursor_shape_unfocused',
|
||||||
'cursor_stop_blinking_after',
|
'cursor_stop_blinking_after',
|
||||||
'cursor_text_color',
|
'cursor_text_color',
|
||||||
|
'cursor_trail_decay',
|
||||||
'cursor_underline_thickness',
|
'cursor_underline_thickness',
|
||||||
'default_pointer_shape',
|
'default_pointer_shape',
|
||||||
'detect_urls',
|
'detect_urls',
|
||||||
@@ -343,6 +344,7 @@ option_names = ( # {{{
|
|||||||
'dynamic_background_opacity',
|
'dynamic_background_opacity',
|
||||||
'editor',
|
'editor',
|
||||||
'enable_audio_bell',
|
'enable_audio_bell',
|
||||||
|
'enable_cursor_trail',
|
||||||
'enabled_layouts',
|
'enabled_layouts',
|
||||||
'env',
|
'env',
|
||||||
'exe_search_path',
|
'exe_search_path',
|
||||||
@@ -510,6 +512,7 @@ class Options:
|
|||||||
cursor_shape_unfocused: int = 4
|
cursor_shape_unfocused: int = 4
|
||||||
cursor_stop_blinking_after: float = 15.0
|
cursor_stop_blinking_after: float = 15.0
|
||||||
cursor_text_color: typing.Optional[kitty.fast_data_types.Color] = Color(17, 17, 17)
|
cursor_text_color: typing.Optional[kitty.fast_data_types.Color] = Color(17, 17, 17)
|
||||||
|
cursor_trail_decay: typing.Tuple[float, float] = (0.1, 0.3)
|
||||||
cursor_underline_thickness: float = 2.0
|
cursor_underline_thickness: float = 2.0
|
||||||
default_pointer_shape: choices_for_default_pointer_shape = 'beam'
|
default_pointer_shape: choices_for_default_pointer_shape = 'beam'
|
||||||
detect_urls: bool = True
|
detect_urls: bool = True
|
||||||
@@ -519,6 +522,7 @@ class Options:
|
|||||||
dynamic_background_opacity: bool = False
|
dynamic_background_opacity: bool = False
|
||||||
editor: str = '.'
|
editor: str = '.'
|
||||||
enable_audio_bell: bool = True
|
enable_audio_bell: bool = True
|
||||||
|
enable_cursor_trail: bool = False
|
||||||
enabled_layouts: typing.List[str] = ['fat', 'grid', 'horizontal', 'splits', 'stack', 'tall', 'vertical']
|
enabled_layouts: typing.List[str] = ['fat', 'grid', 'horizontal', 'splits', 'stack', 'tall', 'vertical']
|
||||||
file_transfer_confirmation_bypass: str = ''
|
file_transfer_confirmation_bypass: str = ''
|
||||||
focus_follows_mouse: bool = False
|
focus_follows_mouse: bool = False
|
||||||
|
|||||||
@@ -558,6 +558,11 @@ def to_cursor_unfocused_shape(x: str) -> int:
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def cursor_trail_decay(x: str) -> Tuple[float, float]:
|
||||||
|
fast, slow = map(positive_float, x.split())
|
||||||
|
slow = max(slow, fast)
|
||||||
|
return fast, slow
|
||||||
|
|
||||||
|
|
||||||
def scrollback_lines(x: str) -> int:
|
def scrollback_lines(x: str) -> int:
|
||||||
ans = int(x)
|
ans = int(x)
|
||||||
|
|||||||
@@ -46,6 +46,9 @@ typedef struct {
|
|||||||
CursorShape cursor_shape, cursor_shape_unfocused;
|
CursorShape cursor_shape, cursor_shape_unfocused;
|
||||||
float cursor_beam_thickness;
|
float cursor_beam_thickness;
|
||||||
float cursor_underline_thickness;
|
float cursor_underline_thickness;
|
||||||
|
bool enable_cursor_trail;
|
||||||
|
float cursor_trail_decay_fast;
|
||||||
|
float cursor_trail_decay_slow;
|
||||||
unsigned int url_style;
|
unsigned int url_style;
|
||||||
unsigned int scrollback_pager_history_size;
|
unsigned int scrollback_pager_history_size;
|
||||||
bool scrollback_fill_enlarged_window;
|
bool scrollback_fill_enlarged_window;
|
||||||
|
|||||||
Reference in New Issue
Block a user