diff --git a/kitty/child-monitor.c b/kitty/child-monitor.c index cb71e8af6..b8468a690 100644 --- a/kitty/child-monitor.c +++ b/kitty/child-monitor.c @@ -852,8 +852,7 @@ prepare_to_render_os_window(OSWindow *os_window, monotonic_t now, unsigned int * } } if (send_cell_data_to_gpu(WD.vao_idx, WD.screen, os_window)) needs_render = true; - if (WD.screen->start_visual_bell_at != 0) needs_render = true; - if (WD.screen->start_drag_overlay_at != 0) needs_render = true; + if (WD.screen->start_visual_bell_at | WD.screen->start_drag_overlay_at) needs_render = true; // Prepare window title bar screen data for GPU WindowRenderData *trd = &w->window_title_render_data; if (trd->screen && trd->geometry.bottom > trd->geometry.top && trd->geometry.right > trd->geometry.left) { @@ -919,8 +918,7 @@ render_prepared_os_window(OSWindow *os_window, unsigned int active_window_id, co bool is_active_window = i == tab->active_window; if (is_active_window) active_window = w; draw_cells(&WD, os_window, is_active_window, false, num_of_visible_windows == 1, w); - if (WD.screen->start_visual_bell_at != 0) set_maximum_wait(ANIMATION_SAMPLE_WAIT); - if (WD.screen->start_drag_overlay_at != 0) set_maximum_wait(ANIMATION_SAMPLE_WAIT); + if (WD.screen->start_visual_bell_at | WD.screen->start_drag_overlay_at) set_maximum_wait(ANIMATION_SAMPLE_WAIT); WindowRenderData *trd = &w->window_title_render_data; if (trd->screen && trd->geometry.right > trd->geometry.left && trd->geometry.bottom > trd->geometry.top) draw_cells(trd, os_window, i == tab->active_window, true, false, NULL); diff --git a/kitty/shaders.c b/kitty/shaders.c index 3ba23613c..09c4c4561 100644 --- a/kitty/shaders.c +++ b/kitty/shaders.c @@ -733,12 +733,6 @@ set_cell_uniforms(bool force) { // UI Layer {{{ static Animation *default_visual_bell_animation = NULL; -static bool -has_visual_bell(Screen *screen) { - return screen->start_visual_bell_at > 0; - -} - static float get_visual_bell_intensity(Screen *screen) { if (screen->start_visual_bell_at > 0) { @@ -775,21 +769,25 @@ draw_visual_bell_flash(GLfloat intensity, const color_type flash) { draw_quad(true, 0); } -static void -draw_visual_bell(const UIRenderData *ui) { - if (!has_visual_bell(ui->screen)) return; - Screen *screen = ui->screen; - float intensity = get_visual_bell_intensity(screen); - if (intensity <= 0) return; +static color_type +get_flash_color(const Screen *screen) { #define COLOR(name, fallback) colorprofile_to_color_with_fallback(screen->color_profile, screen->color_profile->overridden.name, screen->color_profile->configured.name, screen->color_profile->overridden.fallback, screen->color_profile->configured.fallback) - color_type flash = !IS_SPECIAL_COLOR(highlight_bg) ? COLOR(visual_bell_color, highlight_bg) : COLOR(visual_bell_color, default_fg); - draw_visual_bell_flash(intensity, flash); + return !IS_SPECIAL_COLOR(highlight_bg) ? COLOR(visual_bell_color, highlight_bg) : COLOR(visual_bell_color, default_fg); #undef COLOR } static void -draw_drag_preview_overlay(const UIRenderData *ui) { +draw_visual_bell(const UIRenderData *ui) { + if (!ui->screen->start_visual_bell_at) return; Screen *screen = ui->screen; + float intensity = get_visual_bell_intensity(screen); + if (intensity <= 0) return; + draw_visual_bell_flash(intensity, get_flash_color(screen)); +} + +static void +draw_drag_preview_overlay(const UIRenderData *ui) { + const Screen *screen = ui->screen; if (!screen->start_drag_overlay_at || !screen->drag_overlay_quadrant) return; const monotonic_t elapsed = monotonic() - screen->start_drag_overlay_at; const monotonic_t fade_ms = ms_to_monotonic_t(150ll); @@ -806,11 +804,7 @@ draw_drag_preview_overlay(const UIRenderData *ui) { } bind_program(TINT_PROGRAM); float a = intensity * 0.25f; -#define COLOR(name, fallback) colorprofile_to_color_with_fallback(screen->color_profile, \ - screen->color_profile->overridden.name, screen->color_profile->configured.name, \ - screen->color_profile->overridden.fallback, screen->color_profile->configured.fallback) - color_type hint = !IS_SPECIAL_COLOR(highlight_bg) ? COLOR(visual_bell_color, highlight_bg) : COLOR(visual_bell_color, default_fg); -#undef COLOR + color_type hint = get_flash_color(screen); #define C(shift) (srgb_color((hint >> shift) & 0xFF) * a) glUniform4f(tint_program_layout.uniforms.tint_color, C(16), C(8), C(0), a); #undef C @@ -1128,7 +1122,7 @@ draw_window_logo(const UIRenderData *ui) { bool screen_needs_rendering_in_layers(OSWindow *os_window, Window *w, Screen *screen) { - const bool has_ui = w && (has_visual_bell(screen) || has_scrollbar(w, screen) || has_hyperlink_target(os_window, w, screen) || has_window_number(w, screen) || w->window_logo.id); + const bool has_ui = w && ((screen->start_visual_bell_at | screen->start_drag_overlay_at) || has_scrollbar(w, screen) || has_hyperlink_target(os_window, w, screen) || has_window_number(w, screen) || w->window_logo.id); GraphicsManager *grman = screen->paused_rendering.expires_at && screen->paused_rendering.grman ? screen->paused_rendering.grman : screen->grman; return has_ui || grman_has_images(grman); } @@ -1188,6 +1182,7 @@ draw_cells_with_layers(const UIRenderData *ui, ssize_t vao_idx) { ui->grd.num_of_positive_refs, ui->inactive_text_alpha); draw_visual_bell(ui); + draw_drag_preview_overlay(ui); draw_scrollbar(ui); draw_hyperlink_target(ui); draw_window_number(ui); @@ -1256,7 +1251,6 @@ draw_cells(const WindowRenderData *srd, OSWindow *os_window, bool is_active_wind ui.screen_left, ui.screen_top, ui.screen_width, ui.screen_height, ui.full_framebuffer_height); if (ui.os_window->needs_layers) draw_cells_with_layers(&ui, srd->vao_idx); else draw_cells_without_layers(&ui, srd->vao_idx); - draw_drag_preview_overlay(&ui); restore_viewport(); } // }}} diff --git a/kitty/tabs.py b/kitty/tabs.py index b58823081..3c141c443 100644 --- a/kitty/tabs.py +++ b/kitty/tabs.py @@ -12,7 +12,7 @@ from collections.abc import Callable, Generator, Iterable, Iterator, Sequence from contextlib import suppress from functools import wraps from gettext import gettext as _ -from typing import Any, Concatenate, Deque, NamedTuple, Optional, ParamSpec, TypeVar, cast +from typing import Any, Concatenate, Deque, Literal, NamedTuple, Optional, ParamSpec, TypeVar, cast from .borders import Border, Borders from .child import Child @@ -2044,7 +2044,7 @@ class TabManager: # {{{ dy = rel_y - (g.top + g.bottom) / 2 mode = active_tab.current_layout.drag_overlay_mode if mode == 'axis_y': - direction: str = 'bottom' if dy > 0 else 'top' + direction: Literal['left', 'right', 'top', 'bottom'] = 'bottom' if dy > 0 else 'top' elif mode == 'axis_x': direction = 'right' if dx > 0 else 'left' else: # 'free' (Splits) or 'full' (swap fallback)