From 953478f801eb0c67062b6e1d540c6d6bf5edc992 Mon Sep 17 00:00:00 2001 From: Fred Date: Wed, 24 Jun 2026 19:12:46 +0200 Subject: [PATCH] feat: use spinner widget from libcosmic for authentication --- src/greeter.rs | 51 +----------------------------------- src/locker.rs | 70 ++++---------------------------------------------- 2 files changed, 6 insertions(+), 115 deletions(-) diff --git a/src/greeter.rs b/src/greeter.rs index 51fe4b2..14b5eca 100644 --- a/src/greeter.rs +++ b/src/greeter.rs @@ -390,7 +390,6 @@ pub enum Message { HighContrast(bool), InvertColors(bool), WaylandUpdate(WaylandUpdate), - SpinnerTick, } impl From for Message { @@ -420,8 +419,6 @@ pub struct App { accessibility: Accessibility, authenticating: bool, - spinner_rotation: f32, - spinner_handle: Option, } #[derive(Default)] @@ -902,14 +899,7 @@ impl App { widget::row::with_capacity(2) .spacing(8.0) .align_y(Alignment::Center) - .push( - widget::icon::from_name("process-working-symbolic") - .size(16) - .icon() - .rotation(iced::Rotation::Floating(iced::Radians( - self.spinner_rotation.to_radians(), - ))), - ) + .push(widget::indeterminate_circular().size(16.0).bar_height(2.0)) .push(widget::text(fl!("authenticating"))), ) .width(Length::Fill) @@ -1173,8 +1163,6 @@ impl cosmic::Application for App { randr_list: None, surface_id_pairs: Vec::new(), authenticating: false, - spinner_rotation: 0.0, - spinner_handle: None, }; (app, Task::batch(tasks)) } @@ -1482,39 +1470,12 @@ impl cosmic::Application for App { self.common.error_opt = None; self.authenticating = true; self.send_request(Request::PostAuthMessageResponse { response }); - - // Start spinner animation if not already running - if self.spinner_handle.is_none() { - let (spinner_task, handle) = - cosmic::task::stream(cosmic::iced::stream::channel( - 1, - |mut msg_tx: iced::futures::channel::mpsc::Sender<_>| async move { - let mut interval = time::interval(Duration::from_millis(16)); // ~60fps - loop { - msg_tx - .send(cosmic::Action::App(Message::SpinnerTick)) - .await - .unwrap(); - interval.tick().await; - } - }, - )) - .abortable(); - self.spinner_handle = Some(handle); - return spinner_task; - } } Message::Login => { self.common.prompt_opt = None; self.common.error_opt = None; self.authenticating = false; - // Stop spinner animation - if let Some(handle) = self.spinner_handle.take() { - handle.abort(); - } - self.spinner_rotation = 0.0; - match self.flags.sessions.get(&self.selected_session).cloned() { Some((cmd, env)) => { self.send_request(Request::StartSession { cmd, env }); @@ -1527,12 +1488,6 @@ impl cosmic::Application for App { self.common.error_opt = Some(error); self.authenticating = false; - // Stop spinner animation - if let Some(handle) = self.spinner_handle.take() { - handle.abort(); - } - self.spinner_rotation = 0.0; - self.send_request(Request::CancelSession); } Message::Reconnect => { @@ -1863,10 +1818,6 @@ impl cosmic::Application for App { }; return reposition_subsurface(*subsurface_id, loc.x as i32, loc.y as i32); } - Message::SpinnerTick => { - // Update spinner rotation angle (360 degrees per second = 6 degrees per frame at 60fps) - self.spinner_rotation = (self.spinner_rotation + 6.0) % 360.0; - } } Task::none() } diff --git a/src/locker.rs b/src/locker.rs index 9098b55..146aed7 100644 --- a/src/locker.rs +++ b/src/locker.rs @@ -274,7 +274,6 @@ pub enum Message { Error(String), Lock, Unlock, - SpinnerTick, } impl From for Message { @@ -312,8 +311,6 @@ pub struct App { inhibit_opt: Option>, value_tx_opt: Option>, authenticating: bool, - spinner_rotation: f32, - spinner_handle: Option, } impl App { @@ -566,14 +563,7 @@ impl App { widget::row::with_capacity(2) .spacing(8.0) .align_y(Alignment::Center) - .push( - widget::icon::from_name("process-working-symbolic") - .size(16) - .icon() - .rotation(iced::Rotation::Floating(iced::Radians( - self.spinner_rotation.to_radians(), - ))), - ) + .push(widget::indeterminate_circular().size(16.0).bar_height(2.0)) .push(widget::text(fl!("authenticating"))), ) .width(Length::Fill) @@ -675,8 +665,6 @@ impl cosmic::Application for App { inhibit_opt: None, value_tx_opt: None, authenticating: false, - spinner_rotation: 0.0, - spinner_handle: None, }; let task = if cfg!(feature = "logind") { @@ -1047,39 +1035,10 @@ impl cosmic::Application for App { self.authenticating = true; match self.value_tx_opt.take() { Some(value_tx) => { - // Start spinner animation if not already running - if self.spinner_handle.is_none() { - let (spinner_task, handle) = - cosmic::task::stream(cosmic::iced::stream::channel( - 1, - |mut msg_tx: futures::channel::mpsc::Sender<_>| async move { - let mut interval = - tokio::time::interval(Duration::from_millis(16)); // ~60fps - loop { - msg_tx - .send(cosmic::Action::App(Message::SpinnerTick)) - .await - .unwrap(); - interval.tick().await; - } - }, - )) - .abortable(); - self.spinner_handle = Some(handle); - - return Task::batch([ - spinner_task, - cosmic::task::future(async move { - value_tx.send(value).await.unwrap(); - Message::Channel(value_tx) - }), - ]); - } else { - return cosmic::task::future(async move { - value_tx.send(value).await.unwrap(); - Message::Channel(value_tx) - }); - } + return cosmic::task::future(async move { + value_tx.send(value).await.unwrap(); + Message::Channel(value_tx) + }); } None => tracing::warn!("tried to submit when value_tx_opt not set"), } @@ -1098,16 +1057,6 @@ impl cosmic::Application for App { Message::Error(error) => { self.common.error_opt = Some(error); self.authenticating = false; - - // Stop spinner animation - if let Some(handle) = self.spinner_handle.take() { - handle.abort(); - } - self.spinner_rotation = 0.0; - } - Message::SpinnerTick => { - // Update spinner rotation angle (360 degrees per second = 6 degrees per frame at 60fps) - self.spinner_rotation = (self.spinner_rotation + 6.0) % 360.0; } Message::Lock => match self.state { State::Unlocked => { @@ -1119,10 +1068,6 @@ impl cosmic::Application for App { self.value_tx_opt = None; // Reset authenticating state self.authenticating = false; - if let Some(handle) = self.spinner_handle.take() { - handle.abort(); - } - self.spinner_rotation = 0.0; // Try to create lockfile when locking if let Some(ref lockfile) = self.flags.lockfile_opt && let Err(err) = fs::File::create(lockfile) @@ -1151,11 +1096,6 @@ impl cosmic::Application for App { // Stop authenticating self.authenticating = false; - // Stop spinner animation - if let Some(handle) = self.spinner_handle.take() { - handle.abort(); - } - self.spinner_rotation = 0.0; // Try to delete lockfile when unlocking if let Some(ref lockfile) = self.flags.lockfile_opt && let Err(err) = fs::remove_file(lockfile)