Merge branch 'master' into bulgarian

This commit is contained in:
Jeremy Soller 2026-01-27 10:38:05 -07:00 committed by GitHub
commit 055befb30a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
272 changed files with 4273 additions and 4972 deletions

View file

@ -1,6 +1,6 @@
[package]
name = "cosmic-applet-workspaces"
version = "0.1.1"
version = "1.0.2"
authors = ["Ashley Wulber <ashley@system76.com>"]
edition = "2024"
license = "GPL-3.0-only"

View file

@ -11,6 +11,7 @@ Name[nl]=Genummerde werkbladen
Name[sk]=Číslované pracovné plochy
Name[sv]=Numrerade arbetsytor
Name[es]=Espacios de trabajo numerados
Name[it]=Spazi di lavoro numerati
Type=Application
Exec=cosmic-applet-workspaces
Terminal=false

View file

@ -1 +1 @@
cosmic-applet-workspaces = COSMIC Spásanna Oibre
cosmic-applet-workspaces = COSMIC spásanna oibre

View file

@ -0,0 +1 @@
cosmic-applet-workspaces = COSMIC жұмыс орындары

View file

@ -1 +1 @@
cosmic-applet-workspaces = 코스믹 작업공간
cosmic-applet-workspaces = COSMIC 작업 공간

View file

@ -0,0 +1 @@
cosmic-applet-workspaces = COSMIC Workspaces

View file

@ -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,14 +32,12 @@ 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, time::Duration};
static AUTOSIZE_MAIN_ID: LazyLock<Id> = LazyLock::new(|| Id::new("autosize-main"));
const SCROLL_RATE_LIMIT: Duration = Duration::from_millis(200);
pub fn run() -> cosmic::iced::Result {
cosmic::applet::run::<IcedWorkspacesApplet>(())
}
@ -54,9 +53,7 @@ struct IcedWorkspacesApplet {
workspaces: Vec<Workspace>,
workspace_tx: Option<SyncSender<WorkspaceEvent>>,
layout: Layout,
scroll: f64,
next_scroll: Option<Instant>,
last_scroll: Instant,
scroll: DiscreteScrollState,
}
impl IcedWorkspacesApplet {
@ -74,7 +71,7 @@ impl IcedWorkspacesApplet {
return index;
};
let button_total_size = self.core.applet.suggested_size(true).0
+ self.core.applet.suggested_padding(true) * 2
+ self.core.applet.suggested_padding(true).1 * 2
+ 4;
let btn_count = max_major_axis_len / button_total_size as u32;
if btn_count >= self.workspaces.len() as u32 {
@ -111,9 +108,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().rate_limit(Some(SCROLL_RATE_LIMIT)),
},
Task::none(),
)
@ -148,53 +143,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(),
));
}
}
}
@ -219,8 +182,8 @@ impl cosmic::Application for IcedWorkspacesApplet {
self.core.applet.anchor,
PanelAnchor::Top | PanelAnchor::Bottom
);
let suggested_total =
self.core.applet.suggested_size(true).0 + self.core.applet.suggested_padding(true) * 2;
let suggested_total = self.core.applet.suggested_size(true).0
+ self.core.applet.suggested_padding(true).1 * 2;
let suggested_window_size = self.core.applet.suggested_window_size();
let popup_index = self.popup_index().unwrap_or(self.workspaces.len());
@ -245,9 +208,9 @@ impl cosmic::Application for IcedWorkspacesApplet {
.align_y(Alignment::Center),
)
.padding(if horizontal {
[0, self.core.applet.suggested_padding(true)]
[0, self.core.applet.suggested_padding(true).1]
} else {
[self.core.applet.suggested_padding(true), 0]
[self.core.applet.suggested_padding(true).1, 0]
})
.on_press(
if w.state.contains(ext_workspace_handle_v1::State::Active) {