mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-24 01:08:10 +02:00
Implement cursor blinking
This commit is contained in:
@@ -182,12 +182,11 @@ class CharGrid:
|
|||||||
self.opts = opts
|
self.opts = opts
|
||||||
self.original_bg = opts.background
|
self.original_bg = opts.background
|
||||||
self.original_fg = opts.foreground
|
self.original_fg = opts.foreground
|
||||||
self.default_cursor = Cursor(0, 0, False, opts.cursor_shape, opts.cursor, opts.cursor_blink)
|
|
||||||
self.default_bg = color_as_int(self.original_bg)
|
self.default_bg = color_as_int(self.original_bg)
|
||||||
self.default_fg = color_as_int(self.original_fg)
|
self.default_fg = color_as_int(self.original_fg)
|
||||||
self.dpix, self.dpiy = get_logical_dpi()
|
self.dpix, self.dpiy = get_logical_dpi()
|
||||||
self.opts = opts
|
self.opts = opts
|
||||||
self.default_cursor = self.current_cursor = Cursor(0, 0, False, opts.cursor_shape, opts.cursor, opts.cursor_blink)
|
self.default_cursor = self.current_cursor = Cursor(0, 0, False, opts.cursor_shape, opts.cursor, opts.cursor_blink_interval > 0)
|
||||||
self.opts = opts
|
self.opts = opts
|
||||||
self.original_bg = opts.background
|
self.original_bg = opts.background
|
||||||
self.original_fg = opts.foreground
|
self.original_fg = opts.foreground
|
||||||
|
|||||||
@@ -42,13 +42,13 @@ type_map = {
|
|||||||
'scrollback_lines': int,
|
'scrollback_lines': int,
|
||||||
'font_size': to_font_size,
|
'font_size': to_font_size,
|
||||||
'cursor_shape': to_cursor_shape,
|
'cursor_shape': to_cursor_shape,
|
||||||
'cursor_blink': to_bool,
|
|
||||||
'cursor_opacity': to_opacity,
|
'cursor_opacity': to_opacity,
|
||||||
'repaint_delay': int,
|
'repaint_delay': int,
|
||||||
'window_border_width': float,
|
'window_border_width': float,
|
||||||
'wheel_scroll_multiplier': float,
|
'wheel_scroll_multiplier': float,
|
||||||
'click_interval': float,
|
'click_interval': float,
|
||||||
'mouse_hide_wait': float,
|
'mouse_hide_wait': float,
|
||||||
|
'cursor_blink_interval': float,
|
||||||
'cursor_stop_blinking_after': float,
|
'cursor_stop_blinking_after': float,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,8 +20,13 @@ cursor_opacity 0.7
|
|||||||
# The cursor shape can be one of (block, beam, underline)
|
# The cursor shape can be one of (block, beam, underline)
|
||||||
cursor_shape block
|
cursor_shape block
|
||||||
|
|
||||||
# Whether to blink the cursor or not
|
# The interval (in seconds) at which to blink the cursor. Set to zero to
|
||||||
cursor_blink no
|
# disable blinking.
|
||||||
|
cursor_blink_interval 0.5
|
||||||
|
|
||||||
|
# Stop blinking cursor after the specified number of seconds of keyboard inactivity. Set to
|
||||||
|
# zero or a negative number to never stop blinking.
|
||||||
|
cursor_stop_blinking_after 15.0
|
||||||
|
|
||||||
# Font family
|
# Font family
|
||||||
font_family monospace
|
font_family monospace
|
||||||
@@ -47,10 +52,6 @@ repaint_delay 20
|
|||||||
# zero or a negative number to disable mouse cursor hiding.
|
# zero or a negative number to disable mouse cursor hiding.
|
||||||
mouse_hide_wait 3.0
|
mouse_hide_wait 3.0
|
||||||
|
|
||||||
# Stop blinking cursor after the specified number of seconds of keyboard inactivity. Set to
|
|
||||||
# zero or a negative number to never stop blinking.
|
|
||||||
cursor_stop_blinking_after 5.0
|
|
||||||
|
|
||||||
# The width (in pts) of window borders. Will be rounded to the nearest number of pixels based on screen resolution.
|
# The width (in pts) of window borders. Will be rounded to the nearest number of pixels based on screen resolution.
|
||||||
window_border_width 2
|
window_border_width 2
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import inspect
|
|||||||
from collections import deque
|
from collections import deque
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
from threading import Thread, current_thread
|
from threading import Thread, current_thread
|
||||||
|
from time import monotonic
|
||||||
from queue import Queue, Empty
|
from queue import Queue, Empty
|
||||||
|
|
||||||
from .child import Child
|
from .child import Child
|
||||||
@@ -129,6 +130,7 @@ class TabManager(Thread):
|
|||||||
|
|
||||||
def __init__(self, glfw_window, opts, args):
|
def __init__(self, glfw_window, opts, args):
|
||||||
Thread.__init__(self, name='ChildMonitor')
|
Thread.__init__(self, name='ChildMonitor')
|
||||||
|
self.cursor_blinking = True
|
||||||
self.glfw_window_title = None
|
self.glfw_window_title = None
|
||||||
self.current_tab_bar_height = 0
|
self.current_tab_bar_height = 0
|
||||||
self.action_queue = Queue()
|
self.action_queue = Queue()
|
||||||
@@ -166,6 +168,7 @@ class TabManager(Thread):
|
|||||||
self.queue_action(self.active_tab.new_window, False)
|
self.queue_action(self.active_tab.new_window, False)
|
||||||
self.glfw_window.set_click_cursor(False)
|
self.glfw_window.set_click_cursor(False)
|
||||||
self.show_mouse_cursor()
|
self.show_mouse_cursor()
|
||||||
|
self.start_cursor_blink()
|
||||||
|
|
||||||
def signal_received(self):
|
def signal_received(self):
|
||||||
try:
|
try:
|
||||||
@@ -298,6 +301,7 @@ class TabManager(Thread):
|
|||||||
|
|
||||||
@callback
|
@callback
|
||||||
def on_key(self, window, key, scancode, action, mods):
|
def on_key(self, window, key, scancode, action, mods):
|
||||||
|
self.start_cursor_blink()
|
||||||
if action == GLFW_PRESS or action == GLFW_REPEAT:
|
if action == GLFW_PRESS or action == GLFW_REPEAT:
|
||||||
func = get_shortcut(self.opts.keymap, mods, key)
|
func = get_shortcut(self.opts.keymap, mods, key)
|
||||||
tab = self.active_tab
|
tab = self.active_tab
|
||||||
@@ -381,6 +385,14 @@ class TabManager(Thread):
|
|||||||
def hide_mouse_cursor(self):
|
def hide_mouse_cursor(self):
|
||||||
self.glfw_window.set_input_mode(GLFW_CURSOR, GLFW_CURSOR_HIDDEN)
|
self.glfw_window.set_input_mode(GLFW_CURSOR, GLFW_CURSOR_HIDDEN)
|
||||||
|
|
||||||
|
def start_cursor_blink(self):
|
||||||
|
self.cursor_blinking = True
|
||||||
|
if self.opts.cursor_stop_blinking_after > 0:
|
||||||
|
self.ui_timers.add(self.opts.cursor_stop_blinking_after, self.stop_cursor_blinking)
|
||||||
|
|
||||||
|
def stop_cursor_blinking(self):
|
||||||
|
self.cursor_blinking = False
|
||||||
|
|
||||||
def render(self):
|
def render(self):
|
||||||
if self.pending_resize:
|
if self.pending_resize:
|
||||||
return
|
return
|
||||||
@@ -403,8 +415,17 @@ class TabManager(Thread):
|
|||||||
window.char_grid.render_cells(rd, self.cell_program, self.sprites)
|
window.char_grid.render_cells(rd, self.cell_program, self.sprites)
|
||||||
rd = render_data.get(active)
|
rd = render_data.get(active)
|
||||||
if rd is not None:
|
if rd is not None:
|
||||||
with self.cursor_program:
|
draw_cursor = True
|
||||||
active.char_grid.render_cursor(rd, self.cursor_program)
|
if self.cursor_blinking and self.opts.cursor_blink_interval > 0:
|
||||||
|
now = monotonic()
|
||||||
|
t = int(now * 1000)
|
||||||
|
d = int(self.opts.cursor_blink_interval * 1000)
|
||||||
|
n = t // d
|
||||||
|
draw_cursor = n % 2 == 0
|
||||||
|
self.ui_timers.add_if_missing(((n + 1) * d / 1000) - now, glfw_post_empty_event)
|
||||||
|
if draw_cursor:
|
||||||
|
with self.cursor_program:
|
||||||
|
active.char_grid.render_cursor(rd, self.cursor_program)
|
||||||
|
|
||||||
def gui_close_window(self, window):
|
def gui_close_window(self, window):
|
||||||
for tab in self.tabs:
|
for tab in self.tabs:
|
||||||
|
|||||||
Reference in New Issue
Block a user