Add centered workspace thumbnails to overview

Render a tinted, scrollable workspace strip with live thumbnails, output-scaled font labels and a subtle selected-workspace outline. Keep the window grid background-free and support workspace selection without exiting overview.

Animate strip opacity independently with precise fade tolerances and continuous reversal, and expose toggle-overview through feresectl.
This commit is contained in:
Samuel Onoja committed 2026-09-26 15:13:13 +01:00
1 parent 0709484efb
commit b422448d88
11 files changed
+775 -52

No files matched your search

+8 -2
View File
@@ -208,6 +208,7 @@ pub struct Ferese {
}
pub struct RuntimeConfig {
pub(crate) overview_font_family: String,
pub(crate) wallpaper: crate::wallpaper::WallpaperConfig,
pub layout_mode: LayoutMode,
pub gap_config: GapConfig,
@@ -519,7 +520,7 @@ impl Ferese {
pending_screencopies: Vec::new(),
shell_resources: Vec::new(),
shell_snapshot_serial: 0,
overview: crate::overview::OverviewState::default(),
overview: crate::overview::OverviewState::with_font_family(config.overview_font_family),
next_window_id: 1,
next_output_id: 1,
last_animation_tick: start_time,
@@ -693,7 +694,12 @@ impl Ferese {
pub fn window_under_visual(&self, position: Point<f64, Logical>) -> Option<Window> {
let workspace = self.workspace_under_pointer(position)?;
self.space.elements().rev().find_map(|window| {
let candidates = if self.overview.is_active() {
self.window_ids.keys().cloned().collect::<Vec<_>>()
} else {
self.space.elements().rev().cloned().collect::<Vec<_>>()
};
candidates.iter().find_map(|window| {
let id = self.window_ids.get(window)?;
if self.workspaces.workspace_for_window(*id) != Some(workspace) {
return None;