refactor: use calloop channel
This commit is contained in:
parent
8e9d7a1e91
commit
83edc4f695
5 changed files with 60 additions and 63 deletions
2
Cargo.lock
generated
2
Cargo.lock
generated
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue