From 83edc4f6953cf159dee49c5201214279451a7e89 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Thu, 23 Jun 2022 12:15:08 -0400 Subject: [PATCH] refactor: use calloop channel --- Cargo.lock | 2 +- applets/cosmic-applet-workspaces/src/main.rs | 3 +- .../cosmic-applet-workspaces/src/wayland.rs | 100 +++++++++--------- .../src/workspace_button/mod.rs | 10 +- .../src/workspace_list/mod.rs | 8 +- 5 files changed, 60 insertions(+), 63 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a3f3bc9f..b462569a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -428,7 +428,7 @@ dependencies = [ [[package]] name = "cosmic-panel-config" version = "0.1.0" -source = "git+https://github.com/pop-os/cosmic-panel#231dc1ec0656840458d9f0d3468d9c7ea5c2a98c" +source = "git+https://github.com/pop-os/cosmic-panel/#231dc1ec0656840458d9f0d3468d9c7ea5c2a98c" dependencies = [ "anyhow", "gtk4", diff --git a/applets/cosmic-applet-workspaces/src/main.rs b/applets/cosmic-applet-workspaces/src/main.rs index 5797c0f9..681a452b 100644 --- a/applets/cosmic-applet-workspaces/src/main.rs +++ b/applets/cosmic-applet-workspaces/src/main.rs @@ -13,6 +13,7 @@ use tokio::sync::mpsc; use utils::{Activate, WorkspaceEvent}; use wayland::State; use window::CosmicWorkspacesWindow; +use calloop::channel::SyncSender; mod localize; mod utils; @@ -24,7 +25,7 @@ mod workspace_list; mod workspace_object; const ID: &str = "com.system76.CosmicAppletWorkspaces"; -static TX: OnceCell> = OnceCell::new(); +static TX: OnceCell> = OnceCell::new(); pub fn localize() { let localizer = crate::localize::localizer(); diff --git a/applets/cosmic-applet-workspaces/src/wayland.rs b/applets/cosmic-applet-workspaces/src/wayland.rs index 705d495d..463b6594 100644 --- a/applets/cosmic-applet-workspaces/src/wayland.rs +++ b/applets/cosmic-applet-workspaces/src/wayland.rs @@ -49,9 +49,10 @@ use self::generated::client::{ zext_workspace_group_handle_v1::{self, ZextWorkspaceGroupHandleV1}, zext_workspace_handle_v1::{self, ZextWorkspaceHandleV1}, }; +use calloop::channel::*; -pub fn spawn_workspaces(tx: glib::Sender) -> mpsc::Sender { - let (workspaces_tx, mut workspaces_rx) = mpsc::channel(100); +pub fn spawn_workspaces(tx: glib::Sender) -> SyncSender { + let (workspaces_tx, mut workspaces_rx) = calloop::channel::sync_channel(100); if let Ok(Ok(conn)) = std::env::var("HOST_WAYLAND_DISPLAY") .map_err(anyhow::Error::msg) @@ -90,59 +91,62 @@ pub fn spawn_workspaces(tx: glib::Sender) -> mpsc::Sender tx, running: true, }; - - while state.running { - let mut changed = false; - while let Ok(request) = workspaces_rx.try_recv() { - match request { - WorkspaceEvent::Activate(id) => { - if let Some(w) = state - .workspace_groups - .iter() - .find_map(|g| g.workspaces.iter().find(|w| w.name == id)) - { - w.workspace_handle.activate(); - changed = true; - } + let loop_handle = event_loop.handle(); + loop_handle.insert_source(workspaces_rx, |e, _, state| { + match e { + Event::Msg(WorkspaceEvent::Activate(id)) => { + if let Some(w) = state + .workspace_groups + .iter() + .find_map(|g| g.workspaces.iter().find(|w| w.name == id)) + { + w.workspace_handle.activate(); + state.workspace_manager.as_ref().unwrap().commit(); } - WorkspaceEvent::Scroll(v) => { - dbg!(v); - if let Some((w_g, w_i)) = state - .workspace_groups - .iter() - .enumerate() - .find_map(|(g_i, g)| { - g.workspaces - .iter() - .position(|w| w.state == 0) - .map(|w_i| (g, w_i)) - }) - { - let max_w = w_g.workspaces.len().wrapping_sub(1); - let d_i = if v > 0.0 { - if w_i == max_w { - 0 - } else { - w_i.wrapping_add(1) - } + } + Event::Msg(WorkspaceEvent::Scroll(v)) => { + dbg!(v); + if let Some((w_g, w_i)) = state + .workspace_groups + .iter() + .enumerate() + .find_map(|(g_i, g)| { + g.workspaces + .iter() + .position(|w| w.state == 0) + .map(|w_i| (g, w_i)) + }) + { + let max_w = w_g.workspaces.len().wrapping_sub(1); + let d_i = if v > 0.0 { + if w_i == max_w { + 0 } else { - if w_i == 0 { - max_w - } else { - w_i.wrapping_sub(1) - } - }; - if let Some(w) = w_g.workspaces.get(d_i) { - w.workspace_handle.activate(); - changed = true; + w_i.wrapping_add(1) } + } else { + if w_i == 0 { + max_w + } else { + w_i.wrapping_sub(1) + } + }; + if let Some(w) = w_g.workspaces.get(d_i) { + w.workspace_handle.activate(); + state.workspace_manager.as_ref().unwrap().commit(); } } } + Event::Closed => if let Some(workspace_manager) = &mut state.workspace_manager { + for g in &mut state.workspace_groups { + g.workspace_group_handle.destroy(); + } + workspace_manager.stop(); + }, } - if changed { - state.workspace_manager.as_ref().unwrap().commit(); - } + + }).unwrap(); + while state.running { event_loop .dispatch(Duration::from_millis(16), &mut state) .unwrap(); diff --git a/applets/cosmic-applet-workspaces/src/workspace_button/mod.rs b/applets/cosmic-applet-workspaces/src/workspace_button/mod.rs index 0b1946cb..4b8d1c03 100644 --- a/applets/cosmic-applet-workspaces/src/workspace_button/mod.rs +++ b/applets/cosmic-applet-workspaces/src/workspace_button/mod.rs @@ -43,13 +43,9 @@ impl WorkspaceButton { new_button.connect_clicked(move |_| { let id_clone = id.clone(); if !is_active { - glib::MainContext::default().spawn_local(async move { - TX.get() - .unwrap() - .send(WorkspaceEvent::Activate(id_clone)) - .await - .unwrap(); - }); + let _ = TX.get() + .unwrap() + .send(WorkspaceEvent::Activate(id_clone)); } }); diff --git a/applets/cosmic-applet-workspaces/src/workspace_list/mod.rs b/applets/cosmic-applet-workspaces/src/workspace_list/mod.rs index c965250c..0fe7b019 100644 --- a/applets/cosmic-applet-workspaces/src/workspace_list/mod.rs +++ b/applets/cosmic-applet-workspaces/src/workspace_list/mod.rs @@ -61,13 +61,9 @@ impl WorkspaceList { .build(); scroll_controller.connect_scroll(|_, dx, dy| { - glib::MainContext::default().spawn_local(async move { - TX.get() + let _ = TX.get() .unwrap() - .send(WorkspaceEvent::Scroll(dx + dy)) - .await - .unwrap(); - }); + .send(WorkspaceEvent::Scroll(dx + dy)); Inhibit::default() });