Cleanup drag overlay rendering

This commit is contained in:
Kovid Goyal
2026-03-28 12:51:23 +05:30
parent 8af6fceb2f
commit ae3818bf7e
3 changed files with 20 additions and 28 deletions

View File

@@ -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 (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_visual_bell_at | WD.screen->start_drag_overlay_at) needs_render = true;
if (WD.screen->start_drag_overlay_at != 0) needs_render = true;
// Prepare window title bar screen data for GPU // Prepare window title bar screen data for GPU
WindowRenderData *trd = &w->window_title_render_data; WindowRenderData *trd = &w->window_title_render_data;
if (trd->screen && trd->geometry.bottom > trd->geometry.top && trd->geometry.right > trd->geometry.left) { 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; bool is_active_window = i == tab->active_window;
if (is_active_window) active_window = w; if (is_active_window) active_window = w;
draw_cells(&WD, os_window, is_active_window, false, num_of_visible_windows == 1, 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_visual_bell_at | WD.screen->start_drag_overlay_at) set_maximum_wait(ANIMATION_SAMPLE_WAIT);
if (WD.screen->start_drag_overlay_at != 0) set_maximum_wait(ANIMATION_SAMPLE_WAIT);
WindowRenderData *trd = &w->window_title_render_data; WindowRenderData *trd = &w->window_title_render_data;
if (trd->screen && trd->geometry.right > trd->geometry.left && trd->geometry.bottom > trd->geometry.top) 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); draw_cells(trd, os_window, i == tab->active_window, true, false, NULL);

View File

@@ -733,12 +733,6 @@ set_cell_uniforms(bool force) {
// UI Layer {{{ // UI Layer {{{
static Animation *default_visual_bell_animation = NULL; static Animation *default_visual_bell_animation = NULL;
static bool
has_visual_bell(Screen *screen) {
return screen->start_visual_bell_at > 0;
}
static float static float
get_visual_bell_intensity(Screen *screen) { get_visual_bell_intensity(Screen *screen) {
if (screen->start_visual_bell_at > 0) { 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); draw_quad(true, 0);
} }
static void static color_type
draw_visual_bell(const UIRenderData *ui) { get_flash_color(const Screen *screen) {
if (!has_visual_bell(ui->screen)) return;
Screen *screen = ui->screen;
float intensity = get_visual_bell_intensity(screen);
if (intensity <= 0) return;
#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) #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); return !IS_SPECIAL_COLOR(highlight_bg) ? COLOR(visual_bell_color, highlight_bg) : COLOR(visual_bell_color, default_fg);
draw_visual_bell_flash(intensity, flash);
#undef COLOR #undef COLOR
} }
static void 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; 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; if (!screen->start_drag_overlay_at || !screen->drag_overlay_quadrant) return;
const monotonic_t elapsed = monotonic() - screen->start_drag_overlay_at; const monotonic_t elapsed = monotonic() - screen->start_drag_overlay_at;
const monotonic_t fade_ms = ms_to_monotonic_t(150ll); 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); bind_program(TINT_PROGRAM);
float a = intensity * 0.25f; float a = intensity * 0.25f;
#define COLOR(name, fallback) colorprofile_to_color_with_fallback(screen->color_profile, \ color_type hint = get_flash_color(screen);
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
#define C(shift) (srgb_color((hint >> shift) & 0xFF) * a) #define C(shift) (srgb_color((hint >> shift) & 0xFF) * a)
glUniform4f(tint_program_layout.uniforms.tint_color, C(16), C(8), C(0), a); glUniform4f(tint_program_layout.uniforms.tint_color, C(16), C(8), C(0), a);
#undef C #undef C
@@ -1128,7 +1122,7 @@ draw_window_logo(const UIRenderData *ui) {
bool bool
screen_needs_rendering_in_layers(OSWindow *os_window, Window *w, Screen *screen) { 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; GraphicsManager *grman = screen->paused_rendering.expires_at && screen->paused_rendering.grman ? screen->paused_rendering.grman : screen->grman;
return has_ui || grman_has_images(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); ui->grd.num_of_positive_refs, ui->inactive_text_alpha);
draw_visual_bell(ui); draw_visual_bell(ui);
draw_drag_preview_overlay(ui);
draw_scrollbar(ui); draw_scrollbar(ui);
draw_hyperlink_target(ui); draw_hyperlink_target(ui);
draw_window_number(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); 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); if (ui.os_window->needs_layers) draw_cells_with_layers(&ui, srd->vao_idx);
else draw_cells_without_layers(&ui, srd->vao_idx); else draw_cells_without_layers(&ui, srd->vao_idx);
draw_drag_preview_overlay(&ui);
restore_viewport(); restore_viewport();
} }
// }}} // }}}

View File

@@ -12,7 +12,7 @@ from collections.abc import Callable, Generator, Iterable, Iterator, Sequence
from contextlib import suppress from contextlib import suppress
from functools import wraps from functools import wraps
from gettext import gettext as _ 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 .borders import Border, Borders
from .child import Child from .child import Child
@@ -2044,7 +2044,7 @@ class TabManager: # {{{
dy = rel_y - (g.top + g.bottom) / 2 dy = rel_y - (g.top + g.bottom) / 2
mode = active_tab.current_layout.drag_overlay_mode mode = active_tab.current_layout.drag_overlay_mode
if mode == 'axis_y': 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': elif mode == 'axis_x':
direction = 'right' if dx > 0 else 'left' direction = 'right' if dx > 0 else 'left'
else: # 'free' (Splits) or 'full' (swap fallback) else: # 'free' (Splits) or 'full' (swap fallback)