diff --git a/docs/changelog.rst b/docs/changelog.rst index 356f0c9d7..00ccf8f5e 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -3,6 +3,12 @@ Changelog |kitty| is a feature full, cross-platform, *fast*, GPU based terminal emulator. +0.12.0 [future] +------------------------------ + +- Add an option :opt:`cursor_text_color` to render text under the cursor in a + fixed color. (:iss:`126`) + 0.11.3 [2018-07-10] ------------------------------ diff --git a/kitty/cell_vertex.glsl b/kitty/cell_vertex.glsl index 08d2610c9..ecf1f7286 100644 --- a/kitty/cell_vertex.glsl +++ b/kitty/cell_vertex.glsl @@ -5,6 +5,7 @@ #define REVERSE_SHIFT {REVERSE_SHIFT} #define STRIKE_SHIFT {STRIKE_SHIFT} #define DIM_SHIFT {DIM_SHIFT} +#define CURSOR_TEXT_COLOR {CURSOR_TEXT_COLOR} // Inputs {{{ layout(std140) uniform CellRenderData { @@ -166,8 +167,8 @@ void main() { strike_pos = to_sprite_pos(pos, ((text_attrs >> STRIKE_SHIFT) & ONE) * FOUR, ZERO, ZERO); // Cursor - foreground = choose_color(cursor, bg, foreground); - decoration_fg = choose_color(cursor, bg, decoration_fg); + foreground = choose_color(cursor, CURSOR_TEXT_COLOR, foreground); + decoration_fg = choose_color(cursor, CURSOR_TEXT_COLOR, decoration_fg); #endif // }}} diff --git a/kitty/config_data.py b/kitty/config_data.py index bfe77ffe3..f09f8c7ae 100644 --- a/kitty/config_data.py +++ b/kitty/config_data.py @@ -266,7 +266,17 @@ def to_cursor_shape(x): ) +def cursor_text_color(x): + if x.lower() == 'background': + return + return to_color(x) + + o('cursor', '#cccccc', _('Default cursor color'), option_type=to_color) +o('cursor_text_color', 'background', option_type=cursor_text_color, long_text=_(''' +Choose the color of text under the cursor. By default, text under the cursor is +rendered using the background color. If, instead you want it rendered using a +fixed color, you can specify that color here.''')) o('cursor_shape', 'block', option_type=to_cursor_shape, long_text=_( 'The cursor shape can be one of (block, beam, underline)')) o('cursor_blink_interval', 0.5, option_type=positive_float, long_text=_(''' diff --git a/kitty/main.py b/kitty/main.py index c16998168..b967ed56b 100644 --- a/kitty/main.py +++ b/kitty/main.py @@ -82,10 +82,13 @@ def talk_to_instance(args): def load_all_shaders(semi_transparent=0): - load_shader_programs(semi_transparent) + load_shader_programs(semi_transparent, load_all_shaders.cursor_text_color) load_borders_program() +load_all_shaders.cursor_text_color = None + + def init_glfw(debug_keyboard=False): glfw_module = 'cocoa' if is_macos else ('wayland' if is_wayland else 'x11') if not glfw_init(glfw_path(glfw_module), debug_keyboard): @@ -118,6 +121,7 @@ def _run_app(opts, args): new_os_window_trigger = get_new_os_window_trigger(opts) if is_macos: set_custom_ibeam_cursor() + load_all_shaders.cursor_text_color = opts.cursor_text_color with cached_values_for(run_app.cached_values_name) as cached_values: with startup_notification_handler(extra_callback=run_app.first_window_callback) as pre_show_callback: window_id = create_os_window( diff --git a/kitty/window.py b/kitty/window.py index 1068a4d1f..7cb051364 100644 --- a/kitty/window.py +++ b/kitty/window.py @@ -56,9 +56,14 @@ def calculate_gl_geometry(window_geometry, viewport_width, viewport_height, cell return ScreenGeometry(xstart, ystart, window_geometry.xnum, window_geometry.ynum, dx, dy) -def load_shader_programs(semi_transparent=0): +def load_shader_programs(semi_transparent=0, cursor_text_color=None): compile_program(BLIT_PROGRAM, *load_shaders('blit')) v, f = load_shaders('cell') + + def color_as_vec3(x): + return 'vec3({}, {}, {})'.format(x.red / 255, x.green / 255, x.blue / 255) + + cursor_text_color = color_as_vec3(cursor_text_color) if cursor_text_color else 'bg' for which, p in { 'SIMPLE': CELL_PROGRAM, 'BACKGROUND': CELL_BG_PROGRAM, @@ -66,7 +71,13 @@ def load_shader_programs(semi_transparent=0): 'FOREGROUND': CELL_FG_PROGRAM, }.items(): vv, ff = v.replace('WHICH_PROGRAM', which), f.replace('WHICH_PROGRAM', which) - for gln, pyn in {'REVERSE_SHIFT': REVERSE, 'STRIKE_SHIFT': STRIKETHROUGH, 'DIM_SHIFT': DIM, 'DECORATION_SHIFT': DECORATION}.items(): + for gln, pyn in { + 'REVERSE_SHIFT': REVERSE, + 'STRIKE_SHIFT': STRIKETHROUGH, + 'DIM_SHIFT': DIM, + 'DECORATION_SHIFT': DECORATION, + 'CURSOR_TEXT_COLOR': cursor_text_color, + }.items(): vv = vv.replace('{{{}}}'.format(gln), str(pyn), 1) if semi_transparent: vv = vv.replace('#define NOT_TRANSPARENT', '#define TRANSPARENT')