implement specifying wallpaper by workspace number

This commit is contained in:
Penelope Gwen 2025-08-18 13:05:11 -07:00
parent a41da912d7
commit 442f2410c3
8 changed files with 28 additions and 6 deletions

View file

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

View file

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

View file

@ -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<Event, io::Error> {

View file

@ -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<Event, io::Error> {

View file

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

View file

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

View file

@ -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 '{}', \

View file

@ -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<RefCell<Wallpaper>>,
}
@ -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,