aboutsummaryrefslogtreecommitdiff
path: root/src/client/shell/overlays.rs
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-09-14 03:02:14 +0300
committerGitHub <noreply@github.com>2026-09-14 03:02:14 +0300
commit21c1f8cf856affb875b5ab4302225a63f4563bdd (patch)
treefc3fa607c4af3d9233f3ba7d905a4744ad25c215 /src/client/shell/overlays.rs
parentadd3dd28f91db1a2b33e9582c60ac9c1809c1bf5 (diff)
fix: hide only kitty image placements overlapping overlays (#4081)
Diffstat (limited to 'src/client/shell/overlays.rs')
-rw-r--r--src/client/shell/overlays.rs48
1 files changed, 35 insertions, 13 deletions
diff --git a/src/client/shell/overlays.rs b/src/client/shell/overlays.rs
index 4418c2c3..bc3772b1 100644
--- a/src/client/shell/overlays.rs
+++ b/src/client/shell/overlays.rs
@@ -5,6 +5,8 @@ mod worktree_overlays;
#[derive(Default)]
pub(crate) struct OverlayRender {
+ pub(crate) area: Rect,
+ pub(crate) menu_rows: Vec<(Rect, usize)>,
pub(crate) primary: Rect,
pub(crate) clear: Rect,
pub(crate) cancel: Rect,
@@ -85,7 +87,7 @@ pub(crate) fn render_global_menu(
menu: &ClientGlobalMenuOverlay,
snapshot: &ClientShellSnapshot,
palette: &Palette,
-) -> Option<Vec<(Rect, usize)>> {
+) -> Option<OverlayRender> {
let items = super::super::global_menu::global_menu_items(snapshot);
let screen = buffer.area;
let width = items
@@ -108,12 +110,8 @@ pub(crate) fn render_global_menu(
.saturating_sub(width)
.min(screen.right().saturating_sub(width));
let y = launcher.y.saturating_sub(height).max(screen.y);
- let inner = panel(
- buffer,
- Rect::new(x, y, width, height),
- palette.accent,
- palette.panel_bg,
- )?;
+ let rect = Rect::new(x, y, width, height);
+ let inner = panel(buffer, rect, palette.accent, palette.panel_bg)?;
let mut rows = Vec::new();
for (index, (label, action)) in items.iter().enumerate() {
let row_y = inner.y.saturating_add(index as u16);
@@ -155,14 +153,18 @@ pub(crate) fn render_global_menu(
}
rows.push((row, index));
}
- Some(rows)
+ Some(OverlayRender {
+ area: rect,
+ menu_rows: rows,
+ ..OverlayRender::default()
+ })
}
pub(crate) fn render_context_menu(
buffer: &mut Buffer,
menu: &ClientContextMenuOverlay,
palette: &Palette,
-) -> Option<Vec<(Rect, usize)>> {
+) -> Option<OverlayRender> {
let items = menu.items();
let screen = buffer.area;
let max_item_width = items
@@ -207,7 +209,11 @@ pub(crate) fn render_context_menu(
put_text(buffer, row.x, row.y, row.width, item.label, style);
rows.push((row, index));
}
- Some(rows)
+ Some(OverlayRender {
+ area: rect,
+ menu_rows: rows,
+ ..OverlayRender::default()
+ })
}
fn panel(
@@ -306,7 +312,10 @@ fn render_release_notes_overlay(
)?;
let inner = panel(b, outer, p.accent, p.panel_bg)?;
if inner.height < 8 || inner.width < 20 {
- return Some(OverlayRender::default());
+ return Some(OverlayRender {
+ area: outer,
+ ..OverlayRender::default()
+ });
}
let stack = crate::ui::modal_stack_areas(inner, 2, 1, 0, 1);
@@ -397,6 +406,7 @@ fn render_release_notes_overlay(
}
Some(OverlayRender {
+ area: outer,
primary: close,
release_notes_scrollbar: track.unwrap_or_default(),
release_notes_scroll_metrics: Some(metrics),
@@ -417,7 +427,10 @@ fn render_product_announcement_overlay(
)?;
let inner = panel(b, outer, p.accent, p.panel_bg)?;
if inner.height < 8 || inner.width < 20 {
- return Some(OverlayRender::default());
+ return Some(OverlayRender {
+ area: outer,
+ ..OverlayRender::default()
+ });
}
let stack = crate::ui::modal_stack_areas(inner, 2, 1, 0, 1);
@@ -509,6 +522,7 @@ fn render_product_announcement_overlay(
}
Some(OverlayRender {
+ area: outer,
primary: close,
product_announcement_scrollbar: track.unwrap_or_default(),
product_announcement_scroll_metrics: Some(metrics),
@@ -521,7 +535,10 @@ fn render_onboarding_overlay(b: &mut Buffer, p: &Palette) -> Option<OverlayRende
let outer = popup(b.area, 64, 16)?;
let inner = panel(b, outer, p.accent, p.panel_bg)?;
if inner.height < 11 {
- return Some(OverlayRender::default());
+ return Some(OverlayRender {
+ area: outer,
+ ..OverlayRender::default()
+ });
}
let stack = crate::ui::modal_stack_areas(inner, 2, 0, 1, 1);
let base = Style::default()
@@ -602,6 +619,7 @@ fn render_onboarding_overlay(b: &mut Buffer, p: &Palette) -> Option<OverlayRende
.remove_modifier(Modifier::DIM),
);
Some(OverlayRender {
+ area: outer,
primary,
..OverlayRender::default()
})
@@ -655,6 +673,7 @@ fn render_rename_overlay(
button(b, *clear, " ^c clear ", n);
button(b, *cancel, " esc cancel ", n);
Some(OverlayRender {
+ area: q,
primary: *save,
clear: *clear,
cancel: *cancel,
@@ -912,6 +931,7 @@ fn render_navigator_overlay(
Style::default().fg(p.overlay0).bg(p.panel_bg),
);
Some(OverlayRender {
+ area: q,
primary: Rect::default(),
clear: Rect::default(),
cancel: Rect::default(),
@@ -1113,6 +1133,7 @@ fn render_help_overlay(
Style::default().fg(p.overlay0).bg(p.panel_bg),
);
Some(OverlayRender {
+ area: q,
cancel: close,
help_popup: q,
help_scrollbar: scrollbar.unwrap_or_default(),
@@ -1176,6 +1197,7 @@ fn render_confirm_close_overlay(
.add_modifier(Modifier::BOLD),
);
Some(OverlayRender {
+ area: q,
primary: *ok,
clear: Rect::default(),
cancel: *cancel,