refactor: use calloop channel

This commit is contained in:
Ashley Wulber 2022-06-23 12:15:08 -04:00
parent 8e9d7a1e91
commit 83edc4f695
No known key found for this signature in database
GPG key ID: 5216D4F46A90A820
5 changed files with 60 additions and 63 deletions

2
Cargo.lock generated
View file

@ -428,7 +428,7 @@ dependencies = [
[[package]] [[package]]
name = "cosmic-panel-config" name = "cosmic-panel-config"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"gtk4", "gtk4",

View file

@ -13,6 +13,7 @@ use tokio::sync::mpsc;
use utils::{Activate, WorkspaceEvent}; use utils::{Activate, WorkspaceEvent};
use wayland::State; use wayland::State;
use window::CosmicWorkspacesWindow; use window::CosmicWorkspacesWindow;
use calloop::channel::SyncSender;
mod localize; mod localize;
mod utils; mod utils;
@ -24,7 +25,7 @@ mod workspace_list;
mod workspace_object; mod workspace_object;
const ID: &str = "com.system76.CosmicAppletWorkspaces"; const ID: &str = "com.system76.CosmicAppletWorkspaces";
static TX: OnceCell<mpsc::Sender<WorkspaceEvent>> = OnceCell::new(); static TX: OnceCell<SyncSender<WorkspaceEvent>> = OnceCell::new();
pub fn localize() { pub fn localize() {
let localizer = crate::localize::localizer(); let localizer = crate::localize::localizer();

View file

@ -49,9 +49,10 @@ use self::generated::client::{
zext_workspace_group_handle_v1::{self, ZextWorkspaceGroupHandleV1}, zext_workspace_group_handle_v1::{self, ZextWorkspaceGroupHandleV1},
zext_workspace_handle_v1::{self, ZextWorkspaceHandleV1}, zext_workspace_handle_v1::{self, ZextWorkspaceHandleV1},
}; };
use calloop::channel::*;
pub fn spawn_workspaces(tx: glib::Sender<State>) -> mpsc::Sender<WorkspaceEvent> { pub fn spawn_workspaces(tx: glib::Sender<State>) -> SyncSender<WorkspaceEvent> {
let (workspaces_tx, mut workspaces_rx) = mpsc::channel(100); let (workspaces_tx, mut workspaces_rx) = calloop::channel::sync_channel(100);
if let Ok(Ok(conn)) = std::env::var("HOST_WAYLAND_DISPLAY") if let Ok(Ok(conn)) = std::env::var("HOST_WAYLAND_DISPLAY")
.map_err(anyhow::Error::msg) .map_err(anyhow::Error::msg)
@ -90,59 +91,62 @@ pub fn spawn_workspaces(tx: glib::Sender<State>) -> mpsc::Sender<WorkspaceEvent>
tx, tx,
running: true, running: true,
}; };
let loop_handle = event_loop.handle();
while state.running { loop_handle.insert_source(workspaces_rx, |e, _, state| {
let mut changed = false; match e {
while let Ok(request) = workspaces_rx.try_recv() { Event::Msg(WorkspaceEvent::Activate(id)) => {
match request { if let Some(w) = state
WorkspaceEvent::Activate(id) => { .workspace_groups
if let Some(w) = state .iter()
.workspace_groups .find_map(|g| g.workspaces.iter().find(|w| w.name == id))
.iter() {
.find_map(|g| g.workspaces.iter().find(|w| w.name == id)) w.workspace_handle.activate();
{ state.workspace_manager.as_ref().unwrap().commit();
w.workspace_handle.activate();
changed = true;
}
} }
WorkspaceEvent::Scroll(v) => { }
dbg!(v); Event::Msg(WorkspaceEvent::Scroll(v)) => {
if let Some((w_g, w_i)) = state dbg!(v);
.workspace_groups if let Some((w_g, w_i)) = state
.iter() .workspace_groups
.enumerate() .iter()
.find_map(|(g_i, g)| { .enumerate()
g.workspaces .find_map(|(g_i, g)| {
.iter() g.workspaces
.position(|w| w.state == 0) .iter()
.map(|w_i| (g, w_i)) .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 { let max_w = w_g.workspaces.len().wrapping_sub(1);
if w_i == max_w { let d_i = if v > 0.0 {
0 if w_i == max_w {
} else { 0
w_i.wrapping_add(1)
}
} else { } else {
if w_i == 0 { w_i.wrapping_add(1)
max_w
} else {
w_i.wrapping_sub(1)
}
};
if let Some(w) = w_g.workspaces.get(d_i) {
w.workspace_handle.activate();
changed = true;
} }
} 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 event_loop
.dispatch(Duration::from_millis(16), &mut state) .dispatch(Duration::from_millis(16), &mut state)
.unwrap(); .unwrap();

View file

@ -43,13 +43,9 @@ impl WorkspaceButton {
new_button.connect_clicked(move |_| { new_button.connect_clicked(move |_| {
let id_clone = id.clone(); let id_clone = id.clone();
if !is_active { if !is_active {
glib::MainContext::default().spawn_local(async move { let _ = TX.get()
TX.get() .unwrap()
.unwrap() .send(WorkspaceEvent::Activate(id_clone));
.send(WorkspaceEvent::Activate(id_clone))
.await
.unwrap();
});
} }
}); });

View file

@ -61,13 +61,9 @@ impl WorkspaceList {
.build(); .build();
scroll_controller.connect_scroll(|_, dx, dy| { scroll_controller.connect_scroll(|_, dx, dy| {
glib::MainContext::default().spawn_local(async move { let _ = TX.get()
TX.get()
.unwrap() .unwrap()
.send(WorkspaceEvent::Scroll(dx + dy)) .send(WorkspaceEvent::Scroll(dx + dy));
.await
.unwrap();
});
Inhibit::default() Inhibit::default()
}); });