diff --git a/Cargo.lock b/Cargo.lock index d7e3b558..ee5b755f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1457,7 +1457,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#6204784f202c19b675c5a0c8a56865e3f1d9bd69" +source = "git+https://github.com/pop-os/libcosmic//?branch=discrete-scroll#1562f8eedcefda78b2a90bcefc19d0f7b9c653ce" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1478,7 +1478,7 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#6204784f202c19b675c5a0c8a56865e3f1d9bd69" +source = "git+https://github.com/pop-os/libcosmic//?branch=discrete-scroll#1562f8eedcefda78b2a90bcefc19d0f7b9c653ce" dependencies = [ "quote", "syn 2.0.106", @@ -1655,7 +1655,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#6204784f202c19b675c5a0c8a56865e3f1d9bd69" +source = "git+https://github.com/pop-os/libcosmic//?branch=discrete-scroll#1562f8eedcefda78b2a90bcefc19d0f7b9c653ce" dependencies = [ "almost", "cosmic-config", @@ -3024,7 +3024,7 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#6204784f202c19b675c5a0c8a56865e3f1d9bd69" +source = "git+https://github.com/pop-os/libcosmic//?branch=discrete-scroll#1562f8eedcefda78b2a90bcefc19d0f7b9c653ce" dependencies = [ "dnd", "iced_accessibility", @@ -3042,7 +3042,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#6204784f202c19b675c5a0c8a56865e3f1d9bd69" +source = "git+https://github.com/pop-os/libcosmic//?branch=discrete-scroll#1562f8eedcefda78b2a90bcefc19d0f7b9c653ce" dependencies = [ "accesskit", "accesskit_winit", @@ -3051,7 +3051,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#6204784f202c19b675c5a0c8a56865e3f1d9bd69" +source = "git+https://github.com/pop-os/libcosmic//?branch=discrete-scroll#1562f8eedcefda78b2a90bcefc19d0f7b9c653ce" dependencies = [ "bitflags 2.9.4", "bytes", @@ -3075,7 +3075,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#6204784f202c19b675c5a0c8a56865e3f1d9bd69" +source = "git+https://github.com/pop-os/libcosmic//?branch=discrete-scroll#1562f8eedcefda78b2a90bcefc19d0f7b9c653ce" dependencies = [ "futures", "iced_core", @@ -3101,7 +3101,7 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#6204784f202c19b675c5a0c8a56865e3f1d9bd69" +source = "git+https://github.com/pop-os/libcosmic//?branch=discrete-scroll#1562f8eedcefda78b2a90bcefc19d0f7b9c653ce" dependencies = [ "bitflags 2.9.4", "bytemuck", @@ -3123,7 +3123,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#6204784f202c19b675c5a0c8a56865e3f1d9bd69" +source = "git+https://github.com/pop-os/libcosmic//?branch=discrete-scroll#1562f8eedcefda78b2a90bcefc19d0f7b9c653ce" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -3135,7 +3135,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#6204784f202c19b675c5a0c8a56865e3f1d9bd69" +source = "git+https://github.com/pop-os/libcosmic//?branch=discrete-scroll#1562f8eedcefda78b2a90bcefc19d0f7b9c653ce" dependencies = [ "bytes", "cosmic-client-toolkit", @@ -3150,7 +3150,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#6204784f202c19b675c5a0c8a56865e3f1d9bd69" +source = "git+https://github.com/pop-os/libcosmic//?branch=discrete-scroll#1562f8eedcefda78b2a90bcefc19d0f7b9c653ce" dependencies = [ "bytemuck", "cosmic-text", @@ -3166,7 +3166,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#6204784f202c19b675c5a0c8a56865e3f1d9bd69" +source = "git+https://github.com/pop-os/libcosmic//?branch=discrete-scroll#1562f8eedcefda78b2a90bcefc19d0f7b9c653ce" dependencies = [ "as-raw-xcb-connection", "bitflags 2.9.4", @@ -3197,7 +3197,7 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#6204784f202c19b675c5a0c8a56865e3f1d9bd69" +source = "git+https://github.com/pop-os/libcosmic//?branch=discrete-scroll#1562f8eedcefda78b2a90bcefc19d0f7b9c653ce" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -3216,7 +3216,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#6204784f202c19b675c5a0c8a56865e3f1d9bd69" +source = "git+https://github.com/pop-os/libcosmic//?branch=discrete-scroll#1562f8eedcefda78b2a90bcefc19d0f7b9c653ce" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -3995,7 +3995,7 @@ checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libcosmic" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#6204784f202c19b675c5a0c8a56865e3f1d9bd69" +source = "git+https://github.com/pop-os/libcosmic//?branch=discrete-scroll#1562f8eedcefda78b2a90bcefc19d0f7b9c653ce" dependencies = [ "apply", "ashpd 0.12.0", diff --git a/Cargo.toml b/Cargo.toml index a8c35094..ec29043e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -87,3 +87,8 @@ sctk = { package = "smithay-client-toolkit", version = "0.20.0" } [patch."https://github.com/pop-os/cosmic-protocols"] cosmic-protocols = { git = "https://github.com/pop-os/cosmic-protocols//", branch = "main" } cosmic-client-toolkit = { git = "https://github.com/pop-os/cosmic-protocols//", branch = "main" } + +[patch."https://github.com/pop-os/libcosmic"] +libcosmic = { git = "https://github.com/pop-os/libcosmic//", branch = "discrete-scroll" } +cosmic-config = { git = "https://github.com/pop-os/libcosmic//", branch = "discrete-scroll" } +iced_futures = { git = "https://github.com/pop-os/libcosmic//", branch = "discrete-scroll" } diff --git a/cosmic-applet-workspaces/src/components/app.rs b/cosmic-applet-workspaces/src/components/app.rs index b3a73e40..4ac4172f 100644 --- a/cosmic-applet-workspaces/src/components/app.rs +++ b/cosmic-applet-workspaces/src/components/app.rs @@ -21,6 +21,7 @@ use cosmic::{ widget::{button, column, row}, }, iced_core::{Background, Border}, + scroll::DiscreteScrollState, surface, widget::{Id, autosize, container, horizontal_space, vertical_space}, }; @@ -31,11 +32,7 @@ use crate::{ wayland_subscription::{WorkspacesUpdate, workspaces}, }; -use std::{ - process::Command as ShellCommand, - sync::LazyLock, - time::{Duration, Instant}, -}; +use std::{process::Command as ShellCommand, sync::LazyLock}; static AUTOSIZE_MAIN_ID: LazyLock = LazyLock::new(|| Id::new("autosize-main")); @@ -54,9 +51,7 @@ struct IcedWorkspacesApplet { workspaces: Vec, workspace_tx: Option>, layout: Layout, - scroll: f64, - next_scroll: Option, - last_scroll: Instant, + scroll: DiscreteScrollState, } impl IcedWorkspacesApplet { @@ -111,9 +106,7 @@ impl cosmic::Application for IcedWorkspacesApplet { core, workspaces: Vec::new(), workspace_tx: Option::default(), - scroll: 0.0, - next_scroll: None, - last_scroll: Instant::now(), + scroll: DiscreteScrollState::default(), }, Task::none(), ) @@ -148,53 +141,21 @@ impl cosmic::Application for IcedWorkspacesApplet { } } Message::WheelScrolled(delta) => { - let (delta, debounce) = match delta { - ScrollDelta::Lines { x, y } => ((x + y) as f64, false), - ScrollDelta::Pixels { x, y } => ((x + y) as f64, true), - }; + let discrete_delta = self.scroll.update(delta); + if discrete_delta.y != 0 { + if let Some(w_i) = self + .workspaces + .iter() + .position(|w| w.state.contains(ext_workspace_handle_v1::State::Active)) + { + let d_i = (w_i as isize - discrete_delta.y) + .rem_euclid(self.workspaces.len() as isize) + as usize; - let dur = if debounce { - Duration::from_millis(350) - } else { - Duration::from_millis(200) - }; - if self.last_scroll.elapsed() > Duration::from_millis(100) - || self.scroll * delta < 0.0 - { - self.next_scroll = None; - self.scroll = 0.0; - } - self.last_scroll = Instant::now(); - - self.scroll += delta; - if let Some(next) = self.next_scroll { - if next > Instant::now() { - return cosmic::iced::Task::none(); - } - self.next_scroll = None; - } - - if self.scroll.abs() < 1.0 { - return cosmic::iced::Task::none(); - } - self.next_scroll = Some(Instant::now() + dur); - if let Some(w_i) = self - .workspaces - .iter() - .position(|w| w.state.contains(ext_workspace_handle_v1::State::Active)) - { - let max_w = self.workspaces.len().wrapping_sub(1); - let d_i = if self.scroll > 0.0 { - if w_i == 0 { max_w } else { w_i.wrapping_sub(1) } - } else if w_i == max_w { - 0 - } else { - w_i.wrapping_add(1) - }; - self.scroll = 0.0; - if let Some(w) = self.workspaces.get(d_i) { if let Some(tx) = self.workspace_tx.as_mut() { - let _ = tx.try_send(WorkspaceEvent::Activate(w.handle.clone())); + let _ = tx.try_send(WorkspaceEvent::Activate( + self.workspaces[d_i].handle.clone(), + )); } } }