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 (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);

View File

@@ -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();
}
// }}}

View File

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