diff --git a/src/ifs/workspace_manager.rs b/src/ifs/workspace_manager.rs index de415d42..312d9980 100644 --- a/src/ifs/workspace_manager.rs +++ b/src/ifs/workspace_manager.rs @@ -43,6 +43,12 @@ impl WorkspaceManagerState { manager.announce_workspace(output, ws); } } + + pub fn update_workspace_coordinates(&self, output: &OutputNode) { + for manager in self.managers.lock().values() { + manager.send_workspace_coordinates(output); + } + } } pub async fn workspace_manager_done(state: Rc) { diff --git a/src/ifs/workspace_manager/ext_workspace_manager_v1.rs b/src/ifs/workspace_manager/ext_workspace_manager_v1.rs index 214373ed..a22169cc 100644 --- a/src/ifs/workspace_manager/ext_workspace_manager_v1.rs +++ b/src/ifs/workspace_manager/ext_workspace_manager_v1.rs @@ -15,6 +15,7 @@ use { utils::{clonecell::CloneCell, opt::Opt, syncqueue::SyncQueue}, wire::{ExtWorkspaceManagerV1Id, ext_workspace_manager_v1::*}, }, + numeric_sort::cmp, std::{cell::Cell, rc::Rc}, thiserror::Error, }; @@ -152,12 +153,7 @@ impl ExtWorkspaceManagerV1 { ws.send_capabilities(); ws.send_id(&workspace.name); ws.send_name(&workspace.name); - let coord = output - .workspaces - .iter() - .position(|w| w.id == workspace.id) - .unwrap_or(0) as u32; - ws.send_coordinates(&[coord]); + ws.send_coordinates(&[workspace_coordinate(output, workspace)]); ws.send_current_state(); if let Some(group) = group { group.send_workspace_enter(&ws); @@ -165,6 +161,25 @@ impl ExtWorkspaceManagerV1 { self.schedule_done(); } + pub(super) fn send_workspace_coordinates(&self, output: &OutputNode) { + let mut sent_any = false; + let mut workspaces: Vec<_> = output + .workspaces + .iter() + .filter(|workspace| !workspace.is_dummy) + .collect(); + workspaces.sort_by(|a, b| cmp(&a.name, &b.name)); + for (coord, workspace) in workspaces.iter().enumerate() { + if let Some(workspace) = workspace.ext_workspaces.get(&self.manager_id) { + workspace.send_coordinates(&[coord as u32]); + sent_any = true; + } + } + if sent_any { + self.schedule_done(); + } + } + fn send_workspace_group(&self, workspace_group: &ExtWorkspaceGroupHandleV1) { self.client.event(WorkspaceGroup { self_id: self.id, @@ -210,6 +225,19 @@ impl ExtWorkspaceManagerV1 { } } +fn workspace_coordinate(output: &OutputNode, workspace: &WorkspaceNode) -> u32 { + let mut workspaces: Vec<_> = output + .workspaces + .iter() + .filter(|workspace| !workspace.is_dummy) + .collect(); + workspaces.sort_by(|a, b| cmp(&a.name, &b.name)); + workspaces + .iter() + .position(|w| w.id == workspace.id) + .unwrap_or(0) as u32 +} + global_base!( ExtWorkspaceManagerV1Global, ExtWorkspaceManagerV1, diff --git a/src/tree/output.rs b/src/tree/output.rs index 611eb822..bb4d23f0 100644 --- a/src/tree/output.rs +++ b/src/tree/output.rs @@ -761,6 +761,9 @@ impl OutputNode { client.error(e); } self.state.workspace_managers.announce_workspace(self, &ws); + self.state + .workspace_managers + .update_workspace_coordinates(self); self.schedule_update_render_data(); ws }