From 442f2410c330cf984f9fd80d772b5a4bdfbb2944 Mon Sep 17 00:00:00 2001 From: Penelope Gwen Date: Mon, 18 Aug 2025 13:05:11 -0700 Subject: [PATCH] implement specifying wallpaper by workspace number --- src/compositors.rs | 3 +++ src/compositors/hyprland.rs | 2 ++ src/compositors/niri2502.rs | 4 +++- src/compositors/niri2505.rs | 4 +++- src/compositors/sway.rs | 2 ++ src/image.rs | 4 +++- src/main.rs | 2 +- src/wayland.rs | 13 +++++++++++-- 8 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/compositors.rs b/src/compositors.rs index 6d8bbf7..454901d 100644 --- a/src/compositors.rs +++ b/src/compositors.rs @@ -187,6 +187,7 @@ impl ConnectionTask { .send(WorkspaceVisible { output: workspace.output, workspace_name: workspace.workspace_name, + workspace_number: workspace.workspace_number, }) .unwrap(); @@ -202,6 +203,7 @@ impl ConnectionTask { .send(WorkspaceVisible { output: workspace.output, workspace_name: workspace.workspace_name, + workspace_number: workspace.workspace_number }) .unwrap(); @@ -214,6 +216,7 @@ impl ConnectionTask { pub struct WorkspaceVisible { pub output: String, pub workspace_name: String, + pub workspace_number: i32, } #[derive(Deserialize)] diff --git a/src/compositors/hyprland.rs b/src/compositors/hyprland.rs index b490c73..82a24d6 100644 --- a/src/compositors/hyprland.rs +++ b/src/compositors/hyprland.rs @@ -70,6 +70,7 @@ impl CompositorInterface for HyprlandConnectionTask { output: active_monitor.clone(), workspace_name: String::from_utf8(event_data.to_vec()) .unwrap(), + workspace_number: -1, }); } else if event_name == b"focusedmon" { let comma_pos = event_data.iter() @@ -135,6 +136,7 @@ fn current_state() -> CurrentState { visible_workspaces.push(WorkspaceVisible { output: monitor.name, workspace_name: monitor.active_workspace.name, + workspace_number: -1, }); } CurrentState { active_monitor, visible_workspaces } diff --git a/src/compositors/niri2502.rs b/src/compositors/niri2502.rs index f4c28ea..26100e0 100644 --- a/src/compositors/niri2502.rs +++ b/src/compositors/niri2502.rs @@ -21,6 +21,7 @@ impl CompositorInterface for NiriConnectionTask { output: workspace.output.unwrap_or_default(), workspace_name: workspace.name .unwrap_or_else(|| format!("{}", workspace.idx)), + workspace_number: workspace.idx.into(), }) .collect() } @@ -52,8 +53,9 @@ fn find_workspace(workspaces: &[Workspace], id: u64) -> WorkspaceVisible { .unwrap_or_else(|| panic!("Unknown niri workspace id {id}")); let workspace_name = workspace.name.clone() .unwrap_or_else(|| format!("{}", workspace.idx)); + let workspace_number: i32 = workspace.idx.into(); let output = workspace.output.clone().unwrap_or_default(); - WorkspaceVisible { output, workspace_name } + WorkspaceVisible { output, workspace_name, workspace_number } } fn request_event_stream() -> impl FnMut() -> Result { diff --git a/src/compositors/niri2505.rs b/src/compositors/niri2505.rs index 03520f2..79d6433 100644 --- a/src/compositors/niri2505.rs +++ b/src/compositors/niri2505.rs @@ -21,6 +21,7 @@ impl CompositorInterface for NiriConnectionTask { output: workspace.output.unwrap_or_default(), workspace_name: workspace.name .unwrap_or_else(|| format!("{}", workspace.idx)), + workspace_number: workspace.idx.into(), }) .collect() } @@ -52,8 +53,9 @@ fn find_workspace(workspaces: &[Workspace], id: u64) -> WorkspaceVisible { .unwrap_or_else(|| panic!("Unknown niri workspace id {id}")); let workspace_name = workspace.name.clone() .unwrap_or_else(|| format!("{}", workspace.idx)); + let workspace_number: i32 = workspace.idx.into(); let output = workspace.output.clone().unwrap_or_default(); - WorkspaceVisible { output, workspace_name } + WorkspaceVisible { output, workspace_name, workspace_number } } fn request_event_stream() -> impl FnMut() -> Result { diff --git a/src/compositors/sway.rs b/src/compositors/sway.rs index c5e1ba6..e9872bb 100644 --- a/src/compositors/sway.rs +++ b/src/compositors/sway.rs @@ -25,6 +25,7 @@ impl CompositorInterface for SwayConnectionTask { .map(|workspace| WorkspaceVisible { output: workspace.output, workspace_name: workspace.name, + workspace_number: workspace.num, }) .collect() } @@ -42,6 +43,7 @@ impl CompositorInterface for SwayConnectionTask { event_sender.send(WorkspaceVisible { output: current_workspace.output.unwrap(), workspace_name: current_workspace.name.unwrap(), + workspace_number: current_workspace.num.unwrap(), }); } } diff --git a/src/image.rs b/src/image.rs index 30f75ba..af0cf09 100644 --- a/src/image.rs +++ b/src/image.rs @@ -25,6 +25,7 @@ pub enum ColorTransform { pub struct WallpaperFile { pub path: PathBuf, pub workspace: String, + pub workspace_number: i32, pub canon_path: PathBuf, pub canon_modified: u128, } @@ -49,6 +50,7 @@ pub fn output_wallpaper_files( } let workspace = path.file_stem().unwrap() .to_string_lossy().into_owned(); + let workspace_number: i32 = workspace.parse().unwrap_or_default(); let canon_path = match path.canonicalize() { Ok(canon_path) => canon_path, Err(e) => { @@ -66,7 +68,7 @@ pub fn output_wallpaper_files( let canon_modified = canon_metadata.modified().unwrap() .duration_since(UNIX_EPOCH).unwrap() .as_nanos(); - ret.push(WallpaperFile { path, workspace, canon_path, canon_modified }); + ret.push(WallpaperFile { path, workspace, workspace_number, canon_path, canon_modified }); } Ok(ret) } diff --git a/src/main.rs b/src/main.rs index 5ba183e..8591114 100644 --- a/src/main.rs +++ b/src/main.rs @@ -290,7 +290,7 @@ fn handle_sway_event( if let Some(affected_bg_layer) = state.background_layers.iter_mut() .find(|bg_layer| bg_layer.output_name == workspace.output) { - affected_bg_layer.draw_workspace_bg(&workspace.workspace_name); + affected_bg_layer.draw_workspace_bg(&workspace.workspace_name, workspace.workspace_number); } else { error!( "Workspace '{}' is on an unknown output '{}', \ diff --git a/src/wayland.rs b/src/wayland.rs index ccaf02a..de467f6 100644 --- a/src/wayland.rs +++ b/src/wayland.rs @@ -85,7 +85,7 @@ impl Drop for BackgroundLayer { } impl BackgroundLayer { - pub fn draw_workspace_bg(&mut self, workspace_name: &str) { + pub fn draw_workspace_bg(&mut self, workspace_name: &str, workspace_number: i32) { if !self.configured { error!("Cannot draw wallpaper image on the not yet configured \ layer for output: {}", self.output_name); @@ -94,6 +94,9 @@ impl BackgroundLayer { let Some(workspace_bg) = self.workspace_backgrounds.iter() .find(|workspace_bg| workspace_bg.workspace_name == workspace_name) + .or_else(|| self.workspace_backgrounds.iter() + .find(|workspace_bg| workspace_bg.workspace_number == workspace_number) + ) .or_else(|| self.workspace_backgrounds.iter() .find(|workspace_bg| workspace_bg.workspace_name == "_default") ) @@ -147,6 +150,7 @@ impl BackgroundLayer { struct WorkspaceBackground { workspace_name: String, + workspace_number: i32, wallpaper: Rc>, } @@ -309,7 +313,8 @@ impl DmabufHandler for State { if let Some(queued) = queued_weak.upgrade() { if Rc::ptr_eq(&queued, wallpaper) { let name = workspace_bg.workspace_name.clone(); - bg_layer.draw_workspace_bg(&name); + let number = workspace_bg.workspace_number; + bg_layer.draw_workspace_bg(&name, number); } } } @@ -1004,6 +1009,7 @@ fn load_wallpapers( ) { workspace_backgrounds.push(WorkspaceBackground { workspace_name: wallpaper_file.workspace, + workspace_number: wallpaper_file.workspace_number, wallpaper, }); reused_count += 1; @@ -1019,6 +1025,7 @@ fn load_wallpapers( ) { workspace_backgrounds.push(WorkspaceBackground { workspace_name: wallpaper_file.workspace, + workspace_number: wallpaper_file.workspace_number, wallpaper, }); reused_count += 1; @@ -1058,6 +1065,7 @@ fn load_wallpapers( ); workspace_backgrounds.push(WorkspaceBackground { workspace_name: wallpaper_file.workspace, + workspace_number: wallpaper_file.workspace_number, wallpaper, }); loaded_count += 1; @@ -1108,6 +1116,7 @@ fn load_wallpapers( ); workspace_backgrounds.push(WorkspaceBackground { workspace_name: wallpaper_file.workspace, + workspace_number: wallpaper_file.workspace_number, wallpaper: Rc::new(RefCell::new(Wallpaper { wl_buffer: Some(wl_buffer), // active_count: 0,