Implement cursor blinking

This commit is contained in:
Kovid Goyal
2016-12-01 14:02:08 +05:30
parent 58c3a5b4ac
commit 60c6794f25
4 changed files with 32 additions and 11 deletions

View File

@@ -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

View File

@@ -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,
} }

View File

@@ -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

View File

@@ -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: