From dba44d579fd9608ef2ebfbffc828fdb61ada320f Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Thu, 16 Jun 2022 13:26:57 -0400 Subject: [PATCH] feat: hook up workspace list to be displayed in the UI --- applets/cosmic-applet-workspaces/src/main.rs | 9 +++++---- applets/cosmic-applet-workspaces/src/wayland.rs | 6 ++++++ applets/cosmic-applet-workspaces/src/window/mod.rs | 7 ++++++- .../src/workspace_list/mod.rs | 12 ++++++++++++ .../src/workspace_object/imp.rs | 1 - 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/applets/cosmic-applet-workspaces/src/main.rs b/applets/cosmic-applet-workspaces/src/main.rs index ab83028c..cf426325 100644 --- a/applets/cosmic-applet-workspaces/src/main.rs +++ b/applets/cosmic-applet-workspaces/src/main.rs @@ -57,17 +57,18 @@ fn main() { app.connect_activate(|app| { load_css(); - let (tx, mut rx) = MainContext::channel(Priority::default()); + let (tx, rx) = MainContext::channel(Priority::default()); let wayland_tx = wayland::spawn_workspaces(tx.clone()); let window = CosmicWorkspacesWindow::new(app); TX.set(wayland_tx).unwrap(); - rx.attach(None, |workspace_event| { - dbg!(workspace_event); + rx.attach(None, glib::clone!(@weak window => @default-return glib::prelude::Continue(true), move |workspace_event| { + dbg!(&workspace_event); + window.set_workspaces(workspace_event); glib::prelude::Continue(true) - }); + })); window.show(); }); diff --git a/applets/cosmic-applet-workspaces/src/wayland.rs b/applets/cosmic-applet-workspaces/src/wayland.rs index dcf808e5..3d19642b 100644 --- a/applets/cosmic-applet-workspaces/src/wayland.rs +++ b/applets/cosmic-applet-workspaces/src/wayland.rs @@ -86,6 +86,12 @@ pub struct State { workspace_groups: Vec, } +impl State { + pub fn workspace_list(&self) -> impl Iterator + '_ { + self.workspace_groups.iter().map(|g| g.workspaces.iter().map(|w| (w.name.clone(), false))).flatten() + } +} + #[derive(Debug, Clone)] struct WorkspaceGroup { workspace_group_handle: ZextWorkspaceGroupHandleV1, diff --git a/applets/cosmic-applet-workspaces/src/window/mod.rs b/applets/cosmic-applet-workspaces/src/window/mod.rs index 2adc9ae1..1ac0b379 100644 --- a/applets/cosmic-applet-workspaces/src/window/mod.rs +++ b/applets/cosmic-applet-workspaces/src/window/mod.rs @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MPL-2.0-only -use crate::{fl, utils::Activate, workspace_list::WorkspaceList}; +use crate::{fl, utils::Activate, workspace_list::WorkspaceList, wayland::State}; use cascade::cascade; use cosmic_panel_config::config::CosmicPanelConfig; use gtk4::{ @@ -43,4 +43,9 @@ impl CosmicWorkspacesWindow { self_ } + + pub fn set_workspaces(&self, workspaces: State) { + let imp = imp::CosmicWorkspacesWindow::from_instance(&self); + imp.inner.get().unwrap().set_workspaces(workspaces); + } } diff --git a/applets/cosmic-applet-workspaces/src/workspace_list/mod.rs b/applets/cosmic-applet-workspaces/src/workspace_list/mod.rs index e018c561..f3d257f4 100644 --- a/applets/cosmic-applet-workspaces/src/workspace_list/mod.rs +++ b/applets/cosmic-applet-workspaces/src/workspace_list/mod.rs @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MPL-2.0-only use crate::utils::Activate; +use crate::wayland::State; use crate::workspace_button::WorkspaceButton; use crate::workspace_object::WorkspaceObject; use cascade::cascade; @@ -48,6 +49,17 @@ impl WorkspaceList { imp.list_view.set(list_view).unwrap(); } + pub fn set_workspaces(&self, workspaces: State) { + let imp = imp::WorkspaceList::from_instance(&self); + let model = imp.model.get().unwrap(); + + let model_len = model.n_items(); + let new_results: Vec = workspaces.workspace_list() + .into_iter() + .map(|w| WorkspaceObject::from_id_active(w.0, w.1).upcast()) + .collect(); + model.splice(0, model_len, &new_results[..]); } + fn setup_model(&self) { let imp = imp::WorkspaceList::from_instance(self); let model = gio::ListStore::new(WorkspaceObject::static_type()); diff --git a/applets/cosmic-applet-workspaces/src/workspace_object/imp.rs b/applets/cosmic-applet-workspaces/src/workspace_object/imp.rs index f4efaf40..a1a865aa 100644 --- a/applets/cosmic-applet-workspaces/src/workspace_object/imp.rs +++ b/applets/cosmic-applet-workspaces/src/workspace_object/imp.rs @@ -5,7 +5,6 @@ use std::cell::{RefCell, Cell}; use glib::{ParamFlags, ParamSpec, Value}; use gtk4::gdk::glib::ParamSpecBoolean; use gtk4::glib::{self, ParamSpecString}; -use gtk4::glib::ParamSpecUInt; use gtk4::prelude::*; use gtk4::subclass::prelude::*; use once_cell::sync::Lazy;