mirror of
https://github.com/kovidgoyal/kitty
synced 2026-06-13 03:59:23 +02:00
Cleanup drag overlay rendering
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
// }}}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user