From f9d893b88370d50487ab2ced6b12a00c3611b6c8 Mon Sep 17 00:00:00 2001 From: juansimonchemmannur2004-pixel Date: Sat, 20 Dec 2025 20:45:52 +0530 Subject: [PATCH 01/40] Add seal brown and amber terminal color scheme --- color-schemes/seal-brown-amber.ron | 41 ++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 color-schemes/seal-brown-amber.ron diff --git a/color-schemes/seal-brown-amber.ron b/color-schemes/seal-brown-amber.ron new file mode 100644 index 0000000..9e7b29f --- /dev/null +++ b/color-schemes/seal-brown-amber.ron @@ -0,0 +1,41 @@ +( + name: "Seal Brown Amber", + + background: "#623004", + foreground: "#FFBF00", + cursor: "#FFBF00", + dim_foreground: "#cfa02e", + + normal: ( + black: "#2b1503", + red: "#c1311c", + green: "#8bab6c", + yellow: "#FFBF00", + blue: "#4b5f8a", + magenta: "#7a4a8f", + cyan: "#6b8f8a", + white: "#f1e6c8", + ), + + bright: ( + black: "#4a2a10", + red: "#e0482f", + green: "#a9c98c", + yellow: "#ffd54a", + blue: "#6f86c9", + magenta: "#9b6fc2", + cyan: "#8fc9c3", + white: "#ffffff", + ), + + dim: ( + black: "#1e0f02", + red: "#8f2414", + green: "#6e8a55", + yellow: "#c99a28", + blue: "#39476b", + magenta: "#5e3a70", + cyan: "#4f6f6b", + white: "#cdbf9e", + ), +) From 4983e05f01eed628cc1190c07be9cae450d267ce Mon Sep 17 00:00:00 2001 From: nludwig Date: Tue, 23 Dec 2025 16:12:52 -0800 Subject: [PATCH 02/40] hold shift and click to add to selection --- src/terminal_box.rs | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/terminal_box.rs b/src/terminal_box.rs index 6bb4669..b37e15f 100644 --- a/src/terminal_box.rs +++ b/src/terminal_box.rs @@ -1145,18 +1145,27 @@ where } else { TermSide::Right }; - let selection = match click_kind { - ClickKind::Single => { - Selection::new(SelectionType::Simple, location, side) + // Check if shift is pressed and there's an existing selection to extend + if state.modifiers.shift() { + let mut term = terminal.term.lock(); + if let Some(ref mut selection) = term.selection { + selection.update(location, side); + } else { + term.selection = + Some(Selection::new(SelectionType::Simple, location, side)); } - ClickKind::Double => { - Selection::new(SelectionType::Semantic, location, side) - } - ClickKind::Triple => { - Selection::new(SelectionType::Lines, location, side) - } - }; - { + } else { + let selection = match click_kind { + ClickKind::Single => { + Selection::new(SelectionType::Simple, location, side) + } + ClickKind::Double => { + Selection::new(SelectionType::Semantic, location, side) + } + ClickKind::Triple => { + Selection::new(SelectionType::Lines, location, side) + } + }; let mut term = terminal.term.lock(); term.selection = Some(selection); } From 271409ee46a9af0718d6c2da6349a82de6238cc7 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sun, 28 Dec 2025 04:58:40 +0100 Subject: [PATCH 03/40] i18n: translation updates from weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Amadɣas Co-authored-by: Hosted Weblate Co-authored-by: Vilius Paliokas Co-authored-by: therealmate Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/hu/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/lt/ Translation: Pop OS/COSMIC Term --- i18n/hu/cosmic_term.ftl | 4 ++-- i18n/kab/cosmic_term.ftl | 0 i18n/lt/cosmic_term.ftl | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 i18n/kab/cosmic_term.ftl diff --git a/i18n/hu/cosmic_term.ftl b/i18n/hu/cosmic_term.ftl index c5fa1da..c38e321 100644 --- a/i18n/hu/cosmic_term.ftl +++ b/i18n/hu/cosmic_term.ftl @@ -51,7 +51,7 @@ opacity = Háttér átlátszósága ### Font font = Betűtípus -advanced-font-settings = Haladó betűtípus-beállítások +advanced-font-settings = Speciális betűtípus-beállítások default-font = Betűtípus default-font-size = Betűméret default-font-stretch = Betűszélesség @@ -67,7 +67,7 @@ focus-follow-mouse = A fókusz követi az egeret gépelés közben ### Advanced -advanced = Haladó +advanced = Speciális show-headerbar = Fejléc megjelenítése show-header-description = Fejléc megjelenítése a jobb gombos menüből. # Find diff --git a/i18n/kab/cosmic_term.ftl b/i18n/kab/cosmic_term.ftl new file mode 100644 index 0000000..e69de29 diff --git a/i18n/lt/cosmic_term.ftl b/i18n/lt/cosmic_term.ftl index 4809545..303328a 100644 --- a/i18n/lt/cosmic_term.ftl +++ b/i18n/lt/cosmic_term.ftl @@ -71,3 +71,5 @@ menu-password-manager = Slaptažodžiai... passwords-title = Slaptažodžiai add-password = Pridėti Slaptažodį password-input = Slaptažodis +default-font-stretch = Šrifto tempimas +password-input-description = Aprašymas From bf71e1a774096d62e0299cf76ff29eb31e9fb674 Mon Sep 17 00:00:00 2001 From: nludwig Date: Mon, 29 Dec 2025 20:42:52 -0800 Subject: [PATCH 04/40] make hotkeys configurable --- justfile | 5 + .../v1/custom | 1 + .../v1/defaults | 50 ++ src/key_bind.rs | 13 +- src/main.rs | 218 +++++++- src/shortcuts.rs | 468 ++++++++++++++++++ src/terminal_box.rs | 21 +- 7 files changed, 765 insertions(+), 11 deletions(-) create mode 100644 res/com.system76.CosmicTerm.Shortcuts/v1/custom create mode 100644 res/com.system76.CosmicTerm.Shortcuts/v1/defaults create mode 100644 src/shortcuts.rs diff --git a/justfile b/justfile index 9835c8e..d1dda03 100644 --- a/justfile +++ b/justfile @@ -23,6 +23,9 @@ metainfo-dst := clean(rootdir / prefix) / 'share' / 'metainfo' / metainfo icons-src := 'res' / 'icons' / 'hicolor' icons-dst := clean(rootdir / prefix) / 'share' / 'icons' / 'hicolor' +shortcuts-src := 'res' / 'com.system76.CosmicTerm.Shortcuts' / 'v1' +shortcuts-dst := clean(rootdir / prefix) / 'share' / 'cosmic' / 'com.system76.CosmicTerm.Shortcuts' / 'v1' + # Default recipe which runs `just build-release` default: build-release @@ -67,6 +70,8 @@ install: install -Dm0755 {{bin-src}} {{bin-dst}} install -Dm0644 {{desktop-src}} {{desktop-dst}} install -Dm0644 {{metainfo-src}} {{metainfo-dst}} + install -Dm0644 {{shortcuts-src}}/defaults {{shortcuts-dst}}/defaults + install -Dm0644 {{shortcuts-src}}/custom {{shortcuts-dst}}/custom for size in `ls {{icons-src}}`; do \ install -Dm0644 "{{icons-src}}/$size/apps/{{APPID}}.svg" "{{icons-dst}}/$size/apps/{{APPID}}.svg"; \ done diff --git a/res/com.system76.CosmicTerm.Shortcuts/v1/custom b/res/com.system76.CosmicTerm.Shortcuts/v1/custom new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/res/com.system76.CosmicTerm.Shortcuts/v1/custom @@ -0,0 +1 @@ +{} diff --git a/res/com.system76.CosmicTerm.Shortcuts/v1/defaults b/res/com.system76.CosmicTerm.Shortcuts/v1/defaults new file mode 100644 index 0000000..1eb6d74 --- /dev/null +++ b/res/com.system76.CosmicTerm.Shortcuts/v1/defaults @@ -0,0 +1,50 @@ +{ + (modifiers: [Ctrl, Shift], key: "A"): SelectAll, + (modifiers: [Ctrl, Shift], key: "C"): Copy, + (modifiers: [], key: "Copy"): Copy, + (modifiers: [Ctrl], key: "c"): CopyOrSigint, + (modifiers: [Ctrl, Shift], key: "F"): Find, + (modifiers: [Ctrl, Shift], key: "N"): WindowNew, + (modifiers: [Ctrl, Shift], key: "Q"): WindowClose, + (modifiers: [Ctrl, Shift], key: "T"): TabNew, + (modifiers: [Ctrl, Shift], key: "V"): Paste, + (modifiers: [], key: "Paste"): Paste, + (modifiers: [Shift], key: "Insert"): PastePrimary, + (modifiers: [Ctrl, Shift], key: "W"): TabClose, + (modifiers: [Ctrl], key: ","): Settings, + (modifiers: [], key: "F11"): ToggleFullscreen, + + (modifiers: [Ctrl, Alt], key: "d"): PaneSplitHorizontal, + (modifiers: [Ctrl, Alt], key: "r"): PaneSplitVertical, + (modifiers: [Ctrl, Shift], key: "X"): PaneToggleMaximized, + (modifiers: [Ctrl, Alt], key: "p"): PasswordManager, + + (modifiers: [Ctrl], key: "Tab"): TabNext, + (modifiers: [Ctrl, Shift], key: "Tab"): TabPrev, + + (modifiers: [Ctrl, Shift], key: "1"): TabActivate0, + (modifiers: [Ctrl, Shift], key: "2"): TabActivate1, + (modifiers: [Ctrl, Shift], key: "3"): TabActivate2, + (modifiers: [Ctrl, Shift], key: "4"): TabActivate3, + (modifiers: [Ctrl, Shift], key: "5"): TabActivate4, + (modifiers: [Ctrl, Shift], key: "6"): TabActivate5, + (modifiers: [Ctrl, Shift], key: "7"): TabActivate6, + (modifiers: [Ctrl, Shift], key: "8"): TabActivate7, + (modifiers: [Ctrl, Shift], key: "9"): TabActivate8, + + (modifiers: [Ctrl], key: "0"): ZoomReset, + (modifiers: [Ctrl], key: "-"): ZoomOut, + (modifiers: [Ctrl], key: "="): ZoomIn, + (modifiers: [Ctrl], key: "+"): ZoomIn, + + (modifiers: [Ctrl, Shift], key: "ArrowLeft"): PaneFocusLeft, + (modifiers: [Ctrl, Shift], key: "H"): PaneFocusLeft, + (modifiers: [Ctrl, Shift], key: "ArrowDown"): PaneFocusDown, + (modifiers: [Ctrl, Shift], key: "J"): PaneFocusDown, + (modifiers: [Ctrl, Shift], key: "ArrowUp"): PaneFocusUp, + (modifiers: [Ctrl, Shift], key: "K"): PaneFocusUp, + (modifiers: [Ctrl, Shift], key: "ArrowRight"): PaneFocusRight, + (modifiers: [Ctrl, Shift], key: "L"): PaneFocusRight, + + (modifiers: [Ctrl, Alt], key: "L"): ClearScrollback, +} diff --git a/src/key_bind.rs b/src/key_bind.rs index 900f7c9..1114426 100644 --- a/src/key_bind.rs +++ b/src/key_bind.rs @@ -3,9 +3,18 @@ use cosmic::{iced::keyboard::Key, iced_core::keyboard::key::Named}; use std::collections::HashMap; use crate::Action; +use crate::shortcuts::ShortcutsConfig; -//TODO: load from config -pub fn key_binds() -> HashMap { +pub fn key_binds(shortcuts: &ShortcutsConfig) -> HashMap { + let key_binds = shortcuts.key_binds(); + if key_binds.is_empty() { + fallback_key_binds() + } else { + key_binds + } +} + +fn fallback_key_binds() -> HashMap { let mut key_binds = HashMap::new(); macro_rules! bind { diff --git a/src/main.rs b/src/main.rs index 33b717b..70b787c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,7 @@ use alacritty_terminal::{event::Event as TermEvent, term, term::color::Colors as use cosmic::iced::clipboard::dnd::DndAction; use cosmic::widget::menu::action::MenuAction; use cosmic::widget::menu::key_bind::KeyBind; +use cosmic::iced_core::keyboard::key::Named; use cosmic::{ Application, ApplicationExt, Element, action, app::{Core, Settings, Task, context_drawer}, @@ -52,6 +53,8 @@ mod icon_cache; use key_bind::key_binds; mod key_bind; +mod shortcuts; + mod localize; use menu::menu_bar; @@ -159,6 +162,8 @@ fn main() -> Result<(), Box> { } }; + let (shortcuts_config_handler, shortcuts_config) = shortcuts::load(); + let startup_options = if let Some(shell_program) = shell_program_opt { let options = tty::Options { shell: Some(tty::Shell::new(shell_program, shell_args)), @@ -187,6 +192,8 @@ fn main() -> Result<(), Box> { let flags = Flags { config_handler, config, + shortcuts_config_handler, + shortcuts_config, startup_options, term_config, }; @@ -213,6 +220,8 @@ Options: pub struct Flags { config_handler: Option, config: Config, + shortcuts_config_handler: Option, + shortcuts_config: shortcuts::ShortcutsConfig, startup_options: Option, term_config: term::Config, } @@ -342,6 +351,7 @@ pub enum Message { ColorSchemeRenameSubmit, ColorSchemeTabActivate(widget::segmented_button::Entity), Config(Config), + ShortcutsConfig(shortcuts::ShortcutsConfig), Copy(Option), CopyOrSigint(Option), CopyPrimary(Option), @@ -358,12 +368,16 @@ pub enum Message { FindNext, FindPrevious, FindSearchValueChanged(String), + KeyboardShortcuts(bool), MiddleClick(pane_grid::Pane, Option), FocusFollowMouse(bool), Key(Modifiers, Key), LaunchUrl(String), LaunchUrlByMenu, Modifiers(Modifiers), + ShortcutCaptureCancel, + ShortcutCaptureStart(shortcuts::KeyBindAction), + ShortcutRemove(shortcuts::Binding, shortcuts::BindingSource), MouseEnter(pane_grid::Pane), Opacity(u8), PaneClicked(pane_grid::Pane), @@ -437,6 +451,8 @@ pub struct App { pane_model: TerminalPaneGrid, config_handler: Option, config: Config, + shortcuts_config_handler: Option, + shortcuts_config: shortcuts::ShortcutsConfig, key_binds: HashMap, app_themes: Vec, font_names: Vec, @@ -471,6 +487,8 @@ pub struct App { color_scheme_tab_model: widget::segmented_button::SingleSelectModel, profile_expanded: Option, show_advanced_font_settings: bool, + show_keyboard_shortcuts: bool, + shortcut_capture: Option, modifiers: Modifiers, #[cfg(feature = "password_manager")] password_mgr: password_manager::PasswordManager, @@ -542,6 +560,20 @@ impl App { } } + fn save_shortcuts_custom(&mut self) { + match &self.shortcuts_config_handler { + Some(config_handler) => { + if let Err(err) = config_handler.set("custom", &self.shortcuts_config.custom) { + log::warn!("failed to save shortcuts custom config: {}", err); + } + } + None => { + log::warn!("failed to save shortcuts custom config: no config handler"); + } + } + self.key_binds = key_binds(&self.shortcuts_config); + } + fn update_config(&mut self) -> Task { let theme = self.config.app_theme.theme(); @@ -1066,6 +1098,10 @@ impl App { } fn settings(&self) -> Element<'_, Message> { + let cosmic_theme::Spacing { + space_xxs, space_xs, .. + } = self.core().system_theme().cosmic().spacing; + let app_theme_selected = match self.config.app_theme { AppTheme::Dark => 1, AppTheme::Light => 2, @@ -1246,6 +1282,117 @@ impl App { .toggler(self.config.focus_follow_mouse, Message::FocusFollowMouse), ); + let mut shortcuts_section = widget::settings::section() + .title("Keyboard shortcuts") + .add( + widget::settings::item::builder("Customize shortcuts").control( + if self.show_keyboard_shortcuts { + widget::button::custom(icon_cache_get("go-up-symbolic", 16)) + .on_press(Message::KeyboardShortcuts(false)) + } else { + widget::button::custom(icon_cache_get("go-down-symbolic", 16)) + .on_press(Message::KeyboardShortcuts(true)) + } + .class(style::Button::Icon), + ), + ); + + if self.show_keyboard_shortcuts { + let shortcuts_content = || { + let mut groups = Vec::new(); + + for group in shortcuts::shortcut_groups() { + let mut group_section = widget::settings::section().title(group.title); + + for action in group.actions { + let bindings = self.shortcuts_config.bindings_for_action(action); + let mut rows: Vec> = Vec::new(); + + if self.shortcut_capture == Some(action) { + rows.push( + widget::row::with_children(vec![ + widget::text::body("Press new shortcut, or Esc to cancel") + .into(), + widget::horizontal_space().into(), + widget::button::standard("Cancel") + .on_press(Message::ShortcutCaptureCancel) + .into(), + ]) + .spacing(space_xxs) + .into(), + ); + } + + if bindings.is_empty() { + rows.push(widget::text::body("No shortcuts").into()); + } else { + for resolved in bindings { + let binding_text = widget::text::body( + shortcuts::binding_display(&resolved.binding), + ) + .width(Length::Fill) + .align_x(Alignment::End); + let binding_chip = widget::container( + widget::row::with_children(vec![ + binding_text.into(), + widget::button::custom(icon_cache_get( + "edit-delete-symbolic", + 16, + )) + .class(style::Button::Icon) + .on_press(Message::ShortcutRemove( + resolved.binding.clone(), + resolved.source, + )) + .into(), + ]) + .spacing(space_xxs) + .align_y(Alignment::Center) + .width(Length::Fill), + ) + .padding(Padding::new(6.0)) + .class(style::Container::Background) + .width(Length::Fill); + rows.push(binding_chip.into()); + } + } + + rows.push( + widget::row::with_children(vec![ + widget::horizontal_space().into(), + widget::button::standard("+ Add") + .on_press(Message::ShortcutCaptureStart(action)) + .into(), + ]) + .into(), + ); + + let bindings_column = widget::column::with_children(rows) + .spacing(space_xxs) + .width(Length::Fill); + + group_section = group_section.add( + widget::settings::item::builder(shortcuts::action_label(action)) + .control(bindings_column), + ); + } + + groups.push(group_section.into()); + } + + widget::column::with_children(groups).spacing(space_xs) + }; + + let padding = Padding { + top: 0.0, + bottom: 0.0, + left: 12.0, + right: 12.0, + }; + shortcuts_section = + shortcuts_section.add(widget::container(shortcuts_content()).padding(padding)); + } + let advanced_section = widget::settings::section().title(fl!("advanced")).add( widget::settings::item::builder(fl!("show-headerbar")) .description(fl!("show-header-description")) @@ -1256,6 +1403,7 @@ impl App { appearance_section.into(), font_section.into(), splits_section.into(), + shortcuts_section.into(), advanced_section.into(), ]) .into() @@ -1550,13 +1698,16 @@ impl Application for App { ), ]); + let key_binds = key_binds(&flags.shortcuts_config); let mut app = Self { core, about, pane_model, config_handler: flags.config_handler, config: flags.config, - key_binds: key_binds(), + shortcuts_config_handler: flags.shortcuts_config_handler, + shortcuts_config: flags.shortcuts_config, + key_binds, app_themes, font_names, font_size_names, @@ -1589,6 +1740,8 @@ impl Application for App { color_scheme_tab_model: widget::segmented_button::Model::default(), profile_expanded: None, show_advanced_font_settings: false, + show_keyboard_shortcuts: false, + shortcut_capture: None, modifiers: Modifiers::empty(), #[cfg(feature = "password_manager")] password_mgr: Default::default(), @@ -1876,6 +2029,13 @@ impl Application for App { return self.update_config(); } } + Message::ShortcutsConfig(config) => { + if config != self.shortcuts_config { + log::info!("update shortcuts config"); + self.shortcuts_config = config; + self.key_binds = key_binds(&self.shortcuts_config); + } + } Message::Copy(entity_opt) => { if let Some(tab_model) = self.pane_model.active() { let entity = entity_opt.unwrap_or_else(|| tab_model.active()); @@ -2100,6 +2260,12 @@ impl Application for App { Message::FindSearchValueChanged(value) => { self.find_search_value = value; } + Message::KeyboardShortcuts(show) => { + self.show_keyboard_shortcuts = show; + if !show { + self.shortcut_capture = None; + } + } Message::MiddleClick(pane, entity_opt) => { self.pane_model.set_focus(pane); return Task::batch([ @@ -2114,6 +2280,18 @@ impl Application for App { config_set!(focus_follow_mouse, focus_follow_mouse); } Message::Key(modifiers, key) => { + if let Some(action) = self.shortcut_capture { + if key == Key::Named(Named::Escape) { + self.shortcut_capture = None; + return Task::none(); + } + if let Some(binding) = shortcuts::binding_from_key(modifiers, key) { + self.shortcut_capture = None; + self.shortcuts_config.custom.0.insert(binding, action); + self.save_shortcuts_custom(); + } + return Task::none(); + } for (key_bind, action) in &self.key_binds { if key_bind.matches(modifiers, &key) { return self.update(action.message(None)); @@ -2149,6 +2327,26 @@ impl Application for App { self.pane_model.set_focus(pane); return self.update_focus(); } + Message::ShortcutCaptureCancel => { + self.shortcut_capture = None; + } + Message::ShortcutCaptureStart(action) => { + self.shortcut_capture = Some(action); + } + Message::ShortcutRemove(binding, source) => { + match source { + shortcuts::BindingSource::Default => { + self.shortcuts_config + .custom + .0 + .insert(binding, shortcuts::KeyBindAction::Unbind); + } + shortcuts::BindingSource::Custom => { + self.shortcuts_config.custom.0.remove(&binding); + } + } + self.save_shortcuts_custom(); + } Message::Opacity(opacity) => { config_set!(opacity, cmp::min(100, opacity)); } @@ -2836,7 +3034,7 @@ impl Application for App { .cloned() .unwrap_or_else(widget::Id::unique); if let Some(terminal) = tab_model.data::>(entity) { - let mut terminal_box = terminal_box(terminal) + let mut terminal_box = terminal_box(terminal, &self.key_binds) .id(terminal_id) .disabled(self.core.window.show_context) .on_context_menu(move |menu_state| Message::TabContextMenu(pane, menu_state)) @@ -2971,6 +3169,7 @@ impl Application for App { fn subscription(&self) -> Subscription { struct ConfigSubscription; + struct ShortcutsConfigSubscription; struct TerminalEventSubscription; Subscription::batch([ @@ -3017,6 +3216,21 @@ impl Application for App { } Message::Config(update.config) }), + cosmic_config::config_subscription::<_, shortcuts::ShortcutsConfig>( + TypeId::of::(), + shortcuts::SHORTCUTS_CONFIG_ID.into(), + shortcuts::SHORTCUTS_CONFIG_VERSION, + ) + .map(|update| { + if !update.errors.is_empty() { + log::debug!( + "errors loading shortcuts config {:?}: {:?}", + update.keys, + update.errors + ); + } + Message::ShortcutsConfig(update.config) + }), match &self.dialog_opt { Some(dialog) => dialog.subscription(), None => Subscription::none(), diff --git a/src/shortcuts.rs b/src/shortcuts.rs new file mode 100644 index 0000000..247afea --- /dev/null +++ b/src/shortcuts.rs @@ -0,0 +1,468 @@ +// SPDX-License-Identifier: GPL-3.0-only + +use cosmic::widget::menu::key_bind::{KeyBind, Modifier}; +use cosmic::{ + cosmic_config::{self, CosmicConfigEntry, cosmic_config_derive::CosmicConfigEntry}, + iced::keyboard::{Key, Modifiers}, + iced_core::keyboard::key::Named, +}; +use serde::{Deserialize, Serialize}; +use std::collections::{BTreeMap, HashMap}; + +use crate::Action; + +pub const SHORTCUTS_CONFIG_ID: &str = "com.system76.CosmicTerm.Shortcuts"; +pub const SHORTCUTS_CONFIG_VERSION: u64 = 1; + +#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] +pub enum ModifierName { + Ctrl, + Shift, + Alt, + Super, +} + +impl ModifierName { + fn to_modifier(self) -> Modifier { + match self { + Self::Ctrl => Modifier::Ctrl, + Self::Shift => Modifier::Shift, + Self::Alt => Modifier::Alt, + Self::Super => Modifier::Super, + } + } +} + +#[derive(Clone, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] +pub struct Binding { + pub modifiers: Vec, + pub key: String, +} + +impl Binding { + fn to_key_bind(&self) -> Option { + let key = key_from_string(&self.key)?; + let mut modifiers = Vec::new(); + for modifier in [ + ModifierName::Ctrl, + ModifierName::Shift, + ModifierName::Alt, + ModifierName::Super, + ] { + if self.modifiers.contains(&modifier) { + modifiers.push(modifier.to_modifier()); + } + } + + Some(KeyBind { modifiers, key }) + } +} + +#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)] +pub enum KeyBindAction { + Unbind, + ClearScrollback, + Copy, + CopyOrSigint, + Find, + PaneFocusDown, + PaneFocusLeft, + PaneFocusRight, + PaneFocusUp, + PaneSplitHorizontal, + PaneSplitVertical, + PaneToggleMaximized, + Paste, + PastePrimary, + #[cfg_attr(not(feature = "password_manager"), allow(dead_code))] + PasswordManager, + SelectAll, + Settings, + TabActivate0, + TabActivate1, + TabActivate2, + TabActivate3, + TabActivate4, + TabActivate5, + TabActivate6, + TabActivate7, + TabActivate8, + TabClose, + TabNew, + TabNext, + TabPrev, + ToggleFullscreen, + WindowClose, + WindowNew, + ZoomIn, + ZoomOut, + ZoomReset, +} + +impl KeyBindAction { + fn to_action(self) -> Option { + match self { + Self::Unbind => None, + Self::ClearScrollback => Some(Action::ClearScrollback), + Self::Copy => Some(Action::Copy), + Self::CopyOrSigint => Some(Action::CopyOrSigint), + Self::Find => Some(Action::Find), + Self::PaneFocusDown => Some(Action::PaneFocusDown), + Self::PaneFocusLeft => Some(Action::PaneFocusLeft), + Self::PaneFocusRight => Some(Action::PaneFocusRight), + Self::PaneFocusUp => Some(Action::PaneFocusUp), + Self::PaneSplitHorizontal => Some(Action::PaneSplitHorizontal), + Self::PaneSplitVertical => Some(Action::PaneSplitVertical), + Self::PaneToggleMaximized => Some(Action::PaneToggleMaximized), + Self::Paste => Some(Action::Paste), + Self::PastePrimary => Some(Action::PastePrimary), + Self::SelectAll => Some(Action::SelectAll), + Self::Settings => Some(Action::Settings), + Self::TabActivate0 => Some(Action::TabActivate0), + Self::TabActivate1 => Some(Action::TabActivate1), + Self::TabActivate2 => Some(Action::TabActivate2), + Self::TabActivate3 => Some(Action::TabActivate3), + Self::TabActivate4 => Some(Action::TabActivate4), + Self::TabActivate5 => Some(Action::TabActivate5), + Self::TabActivate6 => Some(Action::TabActivate6), + Self::TabActivate7 => Some(Action::TabActivate7), + Self::TabActivate8 => Some(Action::TabActivate8), + Self::TabClose => Some(Action::TabClose), + Self::TabNew => Some(Action::TabNew), + Self::TabNext => Some(Action::TabNext), + Self::TabPrev => Some(Action::TabPrev), + Self::ToggleFullscreen => Some(Action::ToggleFullscreen), + Self::WindowClose => Some(Action::WindowClose), + Self::WindowNew => Some(Action::WindowNew), + Self::ZoomIn => Some(Action::ZoomIn), + Self::ZoomOut => Some(Action::ZoomOut), + Self::ZoomReset => Some(Action::ZoomReset), + Self::PasswordManager => { + #[cfg(feature = "password_manager")] + { + Some(Action::PasswordManager) + } + #[cfg(not(feature = "password_manager"))] + { + None + } + } + } + } +} + +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] +#[serde(transparent)] +pub struct Shortcuts(pub BTreeMap); + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum BindingSource { + Default, + Custom, +} + +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct ResolvedBinding { + pub binding: Binding, + pub source: BindingSource, +} + +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize, CosmicConfigEntry)] +pub struct ShortcutsConfig { + pub defaults: Shortcuts, + pub custom: Shortcuts, +} + +impl ShortcutsConfig { + pub fn key_binds(&self) -> HashMap { + let mut binds = HashMap::new(); + insert_shortcuts(&self.defaults, &mut binds, false); + insert_shortcuts(&self.custom, &mut binds, true); + binds + } + + pub fn bindings_for_action(&self, action: KeyBindAction) -> Vec { + let mut bindings = Vec::new(); + + for (binding, default_action) in &self.defaults.0 { + if *default_action != action { + continue; + } + + match self.custom.0.get(binding) { + Some(KeyBindAction::Unbind) => (), + Some(custom_action) => { + if *custom_action == action { + bindings.push(ResolvedBinding { + binding: binding.clone(), + source: BindingSource::Custom, + }); + } + } + None => bindings.push(ResolvedBinding { + binding: binding.clone(), + source: BindingSource::Default, + }), + } + } + + for (binding, custom_action) in &self.custom.0 { + if *custom_action == action + && !bindings.iter().any(|resolved| resolved.binding == *binding) + { + bindings.push(ResolvedBinding { + binding: binding.clone(), + source: BindingSource::Custom, + }); + } + } + + bindings + } +} + +pub fn load() -> (Option, ShortcutsConfig) { + match cosmic_config::Config::new(SHORTCUTS_CONFIG_ID, SHORTCUTS_CONFIG_VERSION) { + Ok(config_handler) => { + let config = match ShortcutsConfig::get_entry(&config_handler) { + Ok(config) => config, + Err((errors, config)) => { + log::info!("errors loading shortcuts config: {:?}", errors); + config + } + }; + (Some(config_handler), config) + } + Err(err) => { + log::error!("failed to create shortcuts config handler: {}", err); + (None, ShortcutsConfig::default()) + } + } +} + +pub fn action_label(action: KeyBindAction) -> &'static str { + match action { + KeyBindAction::Unbind => "Unbind", + KeyBindAction::ClearScrollback => "Clear scrollback", + KeyBindAction::Copy => "Copy", + KeyBindAction::CopyOrSigint => "Copy or SIGINT", + KeyBindAction::Find => "Find", + KeyBindAction::PaneFocusDown => "Focus pane down", + KeyBindAction::PaneFocusLeft => "Focus pane left", + KeyBindAction::PaneFocusRight => "Focus pane right", + KeyBindAction::PaneFocusUp => "Focus pane up", + KeyBindAction::PaneSplitHorizontal => "Split pane horizontally", + KeyBindAction::PaneSplitVertical => "Split pane vertically", + KeyBindAction::PaneToggleMaximized => "Toggle pane maximized", + KeyBindAction::Paste => "Paste", + KeyBindAction::PastePrimary => "Paste primary", + KeyBindAction::PasswordManager => "Password manager", + KeyBindAction::SelectAll => "Select all", + KeyBindAction::Settings => "Settings", + KeyBindAction::TabActivate0 => "Activate tab 1", + KeyBindAction::TabActivate1 => "Activate tab 2", + KeyBindAction::TabActivate2 => "Activate tab 3", + KeyBindAction::TabActivate3 => "Activate tab 4", + KeyBindAction::TabActivate4 => "Activate tab 5", + KeyBindAction::TabActivate5 => "Activate tab 6", + KeyBindAction::TabActivate6 => "Activate tab 7", + KeyBindAction::TabActivate7 => "Activate tab 8", + KeyBindAction::TabActivate8 => "Activate tab 9", + KeyBindAction::TabClose => "Close tab", + KeyBindAction::TabNew => "New tab", + KeyBindAction::TabNext => "Next tab", + KeyBindAction::TabPrev => "Previous tab", + KeyBindAction::ToggleFullscreen => "Toggle fullscreen", + KeyBindAction::WindowClose => "Close window", + KeyBindAction::WindowNew => "New window", + KeyBindAction::ZoomIn => "Zoom in", + KeyBindAction::ZoomOut => "Zoom out", + KeyBindAction::ZoomReset => "Reset zoom", + } +} + +pub struct ShortcutGroup { + pub title: &'static str, + pub actions: Vec, +} + +pub fn shortcut_groups() -> Vec { + let mut groups = Vec::new(); + groups.push(ShortcutGroup { + title: "Clipboard", + actions: vec![ + KeyBindAction::SelectAll, + KeyBindAction::Copy, + KeyBindAction::CopyOrSigint, + KeyBindAction::Paste, + KeyBindAction::PastePrimary, + KeyBindAction::Find, + ], + }); + groups.push(ShortcutGroup { + title: "Tabs", + actions: vec![ + KeyBindAction::TabNew, + KeyBindAction::TabClose, + KeyBindAction::TabNext, + KeyBindAction::TabPrev, + KeyBindAction::TabActivate0, + KeyBindAction::TabActivate1, + KeyBindAction::TabActivate2, + KeyBindAction::TabActivate3, + KeyBindAction::TabActivate4, + KeyBindAction::TabActivate5, + KeyBindAction::TabActivate6, + KeyBindAction::TabActivate7, + KeyBindAction::TabActivate8, + ], + }); + groups.push(ShortcutGroup { + title: "Splits", + actions: vec![ + KeyBindAction::PaneSplitHorizontal, + KeyBindAction::PaneSplitVertical, + KeyBindAction::PaneToggleMaximized, + KeyBindAction::PaneFocusLeft, + KeyBindAction::PaneFocusRight, + KeyBindAction::PaneFocusUp, + KeyBindAction::PaneFocusDown, + ], + }); + groups.push(ShortcutGroup { + title: "Window", + actions: vec![ + KeyBindAction::WindowNew, + KeyBindAction::WindowClose, + KeyBindAction::ToggleFullscreen, + KeyBindAction::Settings, + ], + }); + groups.push(ShortcutGroup { + title: "Zoom", + actions: vec![ + KeyBindAction::ZoomIn, + KeyBindAction::ZoomOut, + KeyBindAction::ZoomReset, + ], + }); + let mut other_actions = vec![KeyBindAction::ClearScrollback]; + #[cfg(feature = "password_manager")] + other_actions.push(KeyBindAction::PasswordManager); + groups.push(ShortcutGroup { + title: "Other", + actions: other_actions, + }); + groups +} + +pub fn binding_display(binding: &Binding) -> String { + binding + .to_key_bind() + .map(|key_bind| key_bind.to_string()) + .unwrap_or_else(|| binding.key.clone()) +} + +pub fn binding_from_key(modifiers: Modifiers, key: Key) -> Option { + if is_modifier_only_key(&key) { + return None; + } + let key = key_to_string(&key)?; + let mut binding_modifiers = Vec::new(); + if modifiers.control() { + binding_modifiers.push(ModifierName::Ctrl); + } + if modifiers.shift() { + binding_modifiers.push(ModifierName::Shift); + } + if modifiers.alt() { + binding_modifiers.push(ModifierName::Alt); + } + if modifiers.logo() { + binding_modifiers.push(ModifierName::Super); + } + Some(Binding { + modifiers: binding_modifiers, + key, + }) +} + +fn insert_shortcuts( + shortcuts: &Shortcuts, + binds: &mut HashMap, + allow_unbind: bool, +) { + for (binding, action) in &shortcuts.0 { + let key_bind = match binding.to_key_bind() { + Some(key_bind) => key_bind, + None => { + log::warn!("invalid key binding: {:?}", binding); + continue; + } + }; + if allow_unbind && *action == KeyBindAction::Unbind { + binds.remove(&key_bind); + continue; + } + let Some(action) = action.to_action() else { + log::warn!("unsupported shortcut action: {:?}", action); + continue; + }; + binds.insert(key_bind, action); + } +} + +fn key_from_string(value: &str) -> Option { + match value { + "Copy" => Some(Key::Named(Named::Copy)), + "Paste" => Some(Key::Named(Named::Paste)), + "Insert" => Some(Key::Named(Named::Insert)), + "Tab" => Some(Key::Named(Named::Tab)), + "F11" => Some(Key::Named(Named::F11)), + "ArrowLeft" | "Left" => Some(Key::Named(Named::ArrowLeft)), + "ArrowRight" | "Right" => Some(Key::Named(Named::ArrowRight)), + "ArrowUp" | "Up" => Some(Key::Named(Named::ArrowUp)), + "ArrowDown" | "Down" => Some(Key::Named(Named::ArrowDown)), + "Space" | "space" => Some(Key::Character(" ".into())), + _ if !value.is_empty() => Some(Key::Character(value.into())), + _ => None, + } +} + +fn key_to_string(key: &Key) -> Option { + match key { + Key::Character(c) => { + if c == " " { + Some("Space".to_string()) + } else if c.len() == 1 && c.chars().all(|ch| ch.is_ascii_alphabetic()) { + Some(c.to_uppercase()) + } else { + Some(c.to_string()) + } + } + Key::Named(named) => Some(format!("{named:?}")), + _ => None, + } +} + +fn is_modifier_only_key(key: &Key) -> bool { + matches!( + key, + Key::Named( + Named::Alt + | Named::AltGraph + | Named::CapsLock + | Named::Control + | Named::Fn + | Named::FnLock + | Named::NumLock + | Named::ScrollLock + | Named::Shift + | Named::Symbol + | Named::SymbolLock + | Named::Meta + | Named::Hyper + | Named::Super + ) + ) +} diff --git a/src/terminal_box.rs b/src/terminal_box.rs index 6bb4669..e671da0 100644 --- a/src/terminal_box.rs +++ b/src/terminal_box.rs @@ -46,8 +46,12 @@ use std::{ }; use crate::{ - Action, Terminal, TerminalScroll, key_bind::key_binds, menu::MenuState, - mouse_reporter::MouseReporter, terminal::Metadata, + Action, + Terminal, + TerminalScroll, + menu::MenuState, + mouse_reporter::MouseReporter, + terminal::Metadata, }; const AUTOSCROLL_INTERVAL: Duration = Duration::from_millis(100); @@ -122,7 +126,7 @@ pub struct TerminalBox<'a, Message> { on_open_hyperlink: Option Message + 'a>>, on_window_focused: Option Message + 'a>>, on_window_unfocused: Option Message + 'a>>, - key_binds: HashMap, + key_binds: &'a HashMap, sharp_corners: bool, disabled: bool, } @@ -131,7 +135,7 @@ impl<'a, Message> TerminalBox<'a, Message> where Message: Clone, { - pub fn new(terminal: &'a Mutex) -> Self { + pub fn new(terminal: &'a Mutex, key_binds: &'a HashMap) -> Self { Self { terminal, id: None, @@ -145,7 +149,7 @@ where opacity: None, mouse_inside_boundary: None, on_middle_click: None, - key_binds: key_binds(), + key_binds, on_open_hyperlink: None, on_window_focused: None, on_window_unfocused: None, @@ -236,11 +240,14 @@ where } } -pub fn terminal_box(terminal: &Mutex) -> TerminalBox<'_, Message> +pub fn terminal_box<'a, Message>( + terminal: &'a Mutex, + key_binds: &'a HashMap, +) -> TerminalBox<'a, Message> where Message: Clone, { - TerminalBox::new(terminal) + TerminalBox::new(terminal, key_binds) } impl<'a, Message> Widget for TerminalBox<'a, Message> From 04a6ff73784492c9902caf0e3835fd6a74e4f153 Mon Sep 17 00:00:00 2001 From: Michael Murphy Date: Tue, 30 Dec 2025 11:52:30 +0100 Subject: [PATCH 05/40] i18n: removing translation for Frankish --- i18n/frk/cosmic_term.ftl | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 i18n/frk/cosmic_term.ftl diff --git a/i18n/frk/cosmic_term.ftl b/i18n/frk/cosmic_term.ftl deleted file mode 100644 index e69de29..0000000 From 3b330870865be9fec3849029773d1ac865a33d67 Mon Sep 17 00:00:00 2001 From: nludwig Date: Tue, 30 Dec 2025 13:51:27 -0800 Subject: [PATCH 06/40] handle osc 8 links --- src/terminal.rs | 24 +++++++++++++++++ src/terminal_box.rs | 64 ++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 82 insertions(+), 6 deletions(-) diff --git a/src/terminal.rs b/src/terminal.rs index 0eabf19..a12471c 100644 --- a/src/terminal.rs +++ b/src/terminal.rs @@ -246,6 +246,7 @@ pub struct Terminal { pub url_regex_search: RegexSearch, pub regex_matches: Vec, pub active_regex_match: Option, + pub active_hyperlink_id: Option, bold_font_weight: Weight, buffer: Arc, is_focused: bool, @@ -335,6 +336,7 @@ impl Terminal { Ok(Self { active_regex_match: None, + active_hyperlink_id: None, url_regex_search: url_regex_search(), regex_matches: Vec::new(), bold_font_weight: Weight(bold_font_weight), @@ -887,6 +889,28 @@ impl Terminal { flags |= Flags::UNDERLINE; } } + if let Some(active_id) = &self.active_hyperlink_id { + let mut matches_active = indexed + .cell + .hyperlink() + .is_some_and(|link| link.id() == active_id); + if !matches_active + && indexed.cell.flags.intersects( + Flags::WIDE_CHAR_SPACER | Flags::LEADING_WIDE_CHAR_SPACER, + ) + && indexed.point.column.0 > 0 + { + matches_active = grid[Point::new( + indexed.point.line, + Column(indexed.point.column.0 - 1), + )] + .hyperlink() + .is_some_and(|link| link.id() == active_id); + } + if matches_active { + flags |= Flags::UNDERLINE; + } + } let metadata = Metadata::new(bg, fg) .with_flags(flags) diff --git a/src/terminal_box.rs b/src/terminal_box.rs index 6bb4669..0420285 100644 --- a/src/terminal_box.rs +++ b/src/terminal_box.rs @@ -336,11 +336,7 @@ where let location = terminal .viewport_to_point(TermPoint::new(row as usize, TermColumn(col as usize))); - if terminal - .regex_matches - .iter() - .any(|bounds| bounds.contains(&location)) - { + if get_hyperlink(&terminal, location).is_some() { return mouse::Interaction::Pointer; } } @@ -1002,7 +998,10 @@ where Event::Keyboard(KeyEvent::ModifiersChanged(modifiers)) => { state.modifiers = modifiers; - if modifiers.contains(Modifiers::CTRL) || terminal.active_regex_match.is_some() { + if modifiers.contains(Modifiers::CTRL) + || terminal.active_regex_match.is_some() + || terminal.active_hyperlink_id.is_some() + { //Might need to update the url regex highlight, //so we need to calculate the mouse position let location = if let Some(p) = cursor_position.position() { @@ -1442,6 +1441,9 @@ fn get_hyperlink( terminal: &std::sync::MutexGuard<'_, Terminal>, location: TermPoint, ) -> Option { + if let Some(link) = osc8_hyperlink_at(terminal, location) { + return Some(link.uri().to_string()); + } if let Some(match_) = terminal .regex_matches .iter() @@ -1454,6 +1456,32 @@ fn get_hyperlink( } } +fn get_hyperlink_id( + terminal: &std::sync::MutexGuard<'_, Terminal>, + location: TermPoint, +) -> Option { + osc8_hyperlink_at(terminal, location).map(|link| link.id().to_string()) +} + +fn osc8_hyperlink_at( + terminal: &std::sync::MutexGuard<'_, Terminal>, + location: TermPoint, +) -> Option { + let term = terminal.term.lock(); + let grid = term.grid(); + let cell = &grid[location]; + if let Some(link) = cell.hyperlink() { + return Some(link); + } + if cell.flags.intersects(Flags::WIDE_CHAR_SPACER | Flags::LEADING_WIDE_CHAR_SPACER) + && location.column.0 > 0 + { + let left = TermPoint::new(location.line, TermColumn(location.column.0 - 1)); + return grid[left].hyperlink(); + } + None +} + fn update_active_regex_match( terminal: &mut std::sync::MutexGuard<'_, Terminal>, location: Option, @@ -1466,6 +1494,9 @@ fn update_active_regex_match( return; } + let allow_hyperlink = modifiers + .map(|mods| mods.contains(Modifiers::CTRL)) + .unwrap_or(false); //Require CTRL for keyboard and mouse interaction if let Some(modifiers) = modifiers { if !modifiers.contains(Modifiers::CTRL) { @@ -1473,16 +1504,37 @@ fn update_active_regex_match( terminal.active_regex_match = None; terminal.needs_update = true; } + if terminal.active_hyperlink_id.is_some() { + terminal.active_hyperlink_id = None; + terminal.needs_update = true; + } return; } + } else if terminal.active_hyperlink_id.is_some() { + terminal.active_hyperlink_id = None; + terminal.needs_update = true; } let Some(location) = location else { if terminal.active_regex_match.is_some() { terminal.active_regex_match = None; terminal.needs_update = true; } + if terminal.active_hyperlink_id.is_some() { + terminal.active_hyperlink_id = None; + terminal.needs_update = true; + } return; }; + if allow_hyperlink { + let next_hyperlink_id = get_hyperlink_id(terminal, location); + if terminal.active_hyperlink_id != next_hyperlink_id { + terminal.active_hyperlink_id = next_hyperlink_id; + terminal.needs_update = true; + } + } else if terminal.active_hyperlink_id.is_some() { + terminal.active_hyperlink_id = None; + terminal.needs_update = true; + } if let Some(match_) = terminal .regex_matches .iter() From 64290a519aeb8e11068391dfd3f68b7cc552649d Mon Sep 17 00:00:00 2001 From: Balki Date: Fri, 2 Jan 2026 21:49:31 +0000 Subject: [PATCH 07/40] Increase width of menu to match cosmic-edit fixes #281 --- src/menu.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/menu.rs b/src/menu.rs index 5ae4535..0e11dd2 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -204,7 +204,7 @@ pub fn menu_bar<'a>( responsive_menu_bar() .item_height(ItemHeight::Dynamic(40)) - .item_width(ItemWidth::Uniform(240)) + .item_width(ItemWidth::Uniform(320)) .spacing(4.0) .into_element( core, From 55b3cb93b3667bd4c53e04ca744aa35226eee422 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Mon, 12 Jan 2026 11:04:12 -0700 Subject: [PATCH 08/40] Fix ctrl hyperlink highlighting when using splits, fixes #688 --- src/terminal_box.rs | 68 ++++++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 25 deletions(-) diff --git a/src/terminal_box.rs b/src/terminal_box.rs index cb154c4..817e307 100644 --- a/src/terminal_box.rs +++ b/src/terminal_box.rs @@ -1004,9 +1004,9 @@ where { //Might need to update the url regex highlight, //so we need to calculate the mouse position - let location = if let Some(p) = cursor_position.position() { - let x = (p.x - layout.bounds().x) - self.padding.left; - let y = (p.y - layout.bounds().y) - self.padding.top; + let location = if let Some(p) = cursor_position.position_in(layout.bounds()) { + let x = p.x - self.padding.left; + let y = p.y - self.padding.top; //TODO: better calculation of position let col = x / terminal.size().cell_width; let row = y / terminal.size().cell_height; @@ -1150,8 +1150,11 @@ where if let Some(ref mut selection) = term.selection { selection.update(location, side); } else { - term.selection = - Some(Selection::new(SelectionType::Simple, location, side)); + term.selection = Some(Selection::new( + SelectionType::Simple, + location, + side, + )); } } else { let selection = match click_kind { @@ -1312,29 +1315,38 @@ where self.mouse_inside_boundary = Some(mouse_is_inside); } } - if let Some(p) = cursor_position.position() { + if let Some(p_global) = cursor_position.position() { let bounds = layout.bounds(); - let x = (p.x - bounds.x) - self.padding.left; - let y = (p.y - bounds.y) - self.padding.top; - //TODO: better calculation of position - let col = x / terminal.size().cell_width; - let row = y / terminal.size().cell_height; - let location = terminal - .viewport_to_point(TermPoint::new(row as usize, TermColumn(col as usize))); - update_active_regex_match( - &mut terminal, - Some(location), - Some(&state.modifiers), - ); + let col_row_opt = if let Some(p) = cursor_position.position_in(bounds) { + let x = p.x - self.padding.left; + let y = p.y - self.padding.top; + //TODO: better calculation of position + let col = x / terminal.size().cell_width; + let row = y / terminal.size().cell_height; + let location = terminal.viewport_to_point(TermPoint::new( + row as usize, + TermColumn(col as usize), + )); + update_active_regex_match( + &mut terminal, + Some(location), + Some(&state.modifiers), + ); + Some((col, row)) + } else { + None + }; if is_mouse_mode { - terminal.report_mouse(event, &state.modifiers, col as u32, row as u32); + if let Some((col, row)) = col_row_opt { + terminal.report_mouse(event, &state.modifiers, col as u32, row as u32); + } } else { let handled_buffer_drag = update_buffer_drag( state, &mut terminal, buffer_size, - p, + p_global, bounds, self.padding, 0.0, @@ -1346,6 +1358,7 @@ where start_scroll, }) = state.dragging.as_mut() { + let y = p_global.y - bounds.y - self.padding.top; let start_y = *start_y; let start_scroll = *start_scroll; let scroll_offset = terminal.with_buffer(|buffer| { @@ -1360,9 +1373,9 @@ where state.autoscroll.stop(); } else { if state.autoscroll.is_active() { - state.autoscroll.update_pointer(p); + state.autoscroll.update_pointer(p_global); } else { - state.autoscroll.start(p); + state.autoscroll.start(p_global); } shell.request_redraw(RedrawRequest::NextFrame); } @@ -1375,8 +1388,8 @@ where Event::Mouse(MouseEvent::WheelScrolled { delta }) => { if let Some(p) = cursor_position.position_in(layout.bounds()) { if is_mouse_mode { - let x = (p.x - layout.bounds().x) - self.padding.left; - let y = (p.y - layout.bounds().y) - self.padding.top; + let x = p.x - self.padding.left; + let y = p.y - self.padding.top; //TODO: better calculation of position let col = x / terminal.size().cell_width; let row = y / terminal.size().cell_height; @@ -1477,12 +1490,17 @@ fn osc8_hyperlink_at( location: TermPoint, ) -> Option { let term = terminal.term.lock(); + if location.line >= term.screen_lines() || location.column.0 >= term.columns() { + return None; + } let grid = term.grid(); let cell = &grid[location]; if let Some(link) = cell.hyperlink() { return Some(link); } - if cell.flags.intersects(Flags::WIDE_CHAR_SPACER | Flags::LEADING_WIDE_CHAR_SPACER) + if cell + .flags + .intersects(Flags::WIDE_CHAR_SPACER | Flags::LEADING_WIDE_CHAR_SPACER) && location.column.0 > 0 { let left = TermPoint::new(location.line, TermColumn(location.column.0 - 1)); From e520b7b0e316a346309967930024639066a90d56 Mon Sep 17 00:00:00 2001 From: nludwig Date: Mon, 12 Jan 2026 21:40:07 -0800 Subject: [PATCH 09/40] use code fallbacks (now in shortcuts.rs), not `default` config file --- .../v1/defaults | 50 ---------- src/key_bind.rs | 91 +------------------ src/shortcuts.rs | 91 ++++++++++++++++++- 3 files changed, 91 insertions(+), 141 deletions(-) delete mode 100644 res/com.system76.CosmicTerm.Shortcuts/v1/defaults diff --git a/res/com.system76.CosmicTerm.Shortcuts/v1/defaults b/res/com.system76.CosmicTerm.Shortcuts/v1/defaults deleted file mode 100644 index 1eb6d74..0000000 --- a/res/com.system76.CosmicTerm.Shortcuts/v1/defaults +++ /dev/null @@ -1,50 +0,0 @@ -{ - (modifiers: [Ctrl, Shift], key: "A"): SelectAll, - (modifiers: [Ctrl, Shift], key: "C"): Copy, - (modifiers: [], key: "Copy"): Copy, - (modifiers: [Ctrl], key: "c"): CopyOrSigint, - (modifiers: [Ctrl, Shift], key: "F"): Find, - (modifiers: [Ctrl, Shift], key: "N"): WindowNew, - (modifiers: [Ctrl, Shift], key: "Q"): WindowClose, - (modifiers: [Ctrl, Shift], key: "T"): TabNew, - (modifiers: [Ctrl, Shift], key: "V"): Paste, - (modifiers: [], key: "Paste"): Paste, - (modifiers: [Shift], key: "Insert"): PastePrimary, - (modifiers: [Ctrl, Shift], key: "W"): TabClose, - (modifiers: [Ctrl], key: ","): Settings, - (modifiers: [], key: "F11"): ToggleFullscreen, - - (modifiers: [Ctrl, Alt], key: "d"): PaneSplitHorizontal, - (modifiers: [Ctrl, Alt], key: "r"): PaneSplitVertical, - (modifiers: [Ctrl, Shift], key: "X"): PaneToggleMaximized, - (modifiers: [Ctrl, Alt], key: "p"): PasswordManager, - - (modifiers: [Ctrl], key: "Tab"): TabNext, - (modifiers: [Ctrl, Shift], key: "Tab"): TabPrev, - - (modifiers: [Ctrl, Shift], key: "1"): TabActivate0, - (modifiers: [Ctrl, Shift], key: "2"): TabActivate1, - (modifiers: [Ctrl, Shift], key: "3"): TabActivate2, - (modifiers: [Ctrl, Shift], key: "4"): TabActivate3, - (modifiers: [Ctrl, Shift], key: "5"): TabActivate4, - (modifiers: [Ctrl, Shift], key: "6"): TabActivate5, - (modifiers: [Ctrl, Shift], key: "7"): TabActivate6, - (modifiers: [Ctrl, Shift], key: "8"): TabActivate7, - (modifiers: [Ctrl, Shift], key: "9"): TabActivate8, - - (modifiers: [Ctrl], key: "0"): ZoomReset, - (modifiers: [Ctrl], key: "-"): ZoomOut, - (modifiers: [Ctrl], key: "="): ZoomIn, - (modifiers: [Ctrl], key: "+"): ZoomIn, - - (modifiers: [Ctrl, Shift], key: "ArrowLeft"): PaneFocusLeft, - (modifiers: [Ctrl, Shift], key: "H"): PaneFocusLeft, - (modifiers: [Ctrl, Shift], key: "ArrowDown"): PaneFocusDown, - (modifiers: [Ctrl, Shift], key: "J"): PaneFocusDown, - (modifiers: [Ctrl, Shift], key: "ArrowUp"): PaneFocusUp, - (modifiers: [Ctrl, Shift], key: "K"): PaneFocusUp, - (modifiers: [Ctrl, Shift], key: "ArrowRight"): PaneFocusRight, - (modifiers: [Ctrl, Shift], key: "L"): PaneFocusRight, - - (modifiers: [Ctrl, Alt], key: "L"): ClearScrollback, -} diff --git a/src/key_bind.rs b/src/key_bind.rs index 1114426..86f3d39 100644 --- a/src/key_bind.rs +++ b/src/key_bind.rs @@ -1,96 +1,9 @@ -use cosmic::widget::menu::key_bind::{KeyBind, Modifier}; -use cosmic::{iced::keyboard::Key, iced_core::keyboard::key::Named}; +use cosmic::widget::menu::key_bind::KeyBind; use std::collections::HashMap; use crate::Action; use crate::shortcuts::ShortcutsConfig; pub fn key_binds(shortcuts: &ShortcutsConfig) -> HashMap { - let key_binds = shortcuts.key_binds(); - if key_binds.is_empty() { - fallback_key_binds() - } else { - key_binds - } -} - -fn fallback_key_binds() -> HashMap { - let mut key_binds = HashMap::new(); - - macro_rules! bind { - ([$($modifier:ident),* $(,)?], $key:expr, $action:ident) => {{ - key_binds.insert( - KeyBind { - modifiers: vec![$(Modifier::$modifier),*], - key: $key, - }, - Action::$action, - ); - }}; - } - - // Standard key bindings - bind!([Ctrl, Shift], Key::Character("A".into()), SelectAll); - bind!([Ctrl, Shift], Key::Character("C".into()), Copy); - bind!([], Key::Named(Named::Copy), Copy); - bind!([Ctrl], Key::Character("c".into()), CopyOrSigint); - bind!([Ctrl, Shift], Key::Character("F".into()), Find); - bind!([Ctrl, Shift], Key::Character("N".into()), WindowNew); - bind!([Ctrl, Shift], Key::Character("Q".into()), WindowClose); - bind!([Ctrl, Shift], Key::Character("T".into()), TabNew); - bind!([Ctrl, Shift], Key::Character("V".into()), Paste); - bind!([], Key::Named(Named::Paste), Paste); - bind!([Shift], Key::Named(Named::Insert), PastePrimary); - bind!([Ctrl, Shift], Key::Character("W".into()), TabClose); - bind!([Ctrl], Key::Character(",".into()), Settings); - bind!([], Key::Named(Named::F11), ToggleFullscreen); - - // Ctrl+Alt+D splits horizontally, Ctrl+Alt+R splits vertically, Ctrl+Shift+X maximizes split - //TODO: Adjust bindings as desired by UX - bind!([Ctrl, Alt], Key::Character("d".into()), PaneSplitHorizontal); - bind!([Ctrl, Alt], Key::Character("r".into()), PaneSplitVertical); - bind!( - [Ctrl, Shift], - Key::Character("X".into()), - PaneToggleMaximized - ); - #[cfg(feature = "password_manager")] - bind!([Ctrl, Alt], Key::Character("p".into()), PasswordManager); - - // Ctrl+Tab and Ctrl+Shift+Tab cycle through tabs - // Ctrl+Tab is not a special key for terminals and is free to use - bind!([Ctrl], Key::Named(Named::Tab), TabNext); - bind!([Ctrl, Shift], Key::Named(Named::Tab), TabPrev); - - // Ctrl+Shift+# activates tabs by index - bind!([Ctrl, Shift], Key::Character("1".into()), TabActivate0); - bind!([Ctrl, Shift], Key::Character("2".into()), TabActivate1); - bind!([Ctrl, Shift], Key::Character("3".into()), TabActivate2); - bind!([Ctrl, Shift], Key::Character("4".into()), TabActivate3); - bind!([Ctrl, Shift], Key::Character("5".into()), TabActivate4); - bind!([Ctrl, Shift], Key::Character("6".into()), TabActivate5); - bind!([Ctrl, Shift], Key::Character("7".into()), TabActivate6); - bind!([Ctrl, Shift], Key::Character("8".into()), TabActivate7); - bind!([Ctrl, Shift], Key::Character("9".into()), TabActivate8); - - // Ctrl+0, Ctrl+-, and Ctrl+= are not special keys for terminals and are free to use - bind!([Ctrl], Key::Character("0".into()), ZoomReset); - bind!([Ctrl], Key::Character("-".into()), ZoomOut); - bind!([Ctrl], Key::Character("=".into()), ZoomIn); - bind!([Ctrl], Key::Character("+".into()), ZoomIn); - - // Ctrl+Arrows and Ctrl+HJKL move between splits - bind!([Ctrl, Shift], Key::Named(Named::ArrowLeft), PaneFocusLeft); - bind!([Ctrl, Shift], Key::Character("H".into()), PaneFocusLeft); - bind!([Ctrl, Shift], Key::Named(Named::ArrowDown), PaneFocusDown); - bind!([Ctrl, Shift], Key::Character("J".into()), PaneFocusDown); - bind!([Ctrl, Shift], Key::Named(Named::ArrowUp), PaneFocusUp); - bind!([Ctrl, Shift], Key::Character("K".into()), PaneFocusUp); - bind!([Ctrl, Shift], Key::Named(Named::ArrowRight), PaneFocusRight); - bind!([Ctrl, Shift], Key::Character("L".into()), PaneFocusRight); - - // CTRL+Alt+L clears the scrollback. - bind!([Ctrl, Alt], Key::Character("L".into()), ClearScrollback); - - key_binds + shortcuts.key_binds() } diff --git a/src/shortcuts.rs b/src/shortcuts.rs index 247afea..024a0f5 100644 --- a/src/shortcuts.rs +++ b/src/shortcuts.rs @@ -176,15 +176,17 @@ pub struct ShortcutsConfig { impl ShortcutsConfig { pub fn key_binds(&self) -> HashMap { let mut binds = HashMap::new(); - insert_shortcuts(&self.defaults, &mut binds, false); + let defaults = self.defaults_or_fallback(); + insert_shortcuts(&defaults, &mut binds, false); insert_shortcuts(&self.custom, &mut binds, true); binds } pub fn bindings_for_action(&self, action: KeyBindAction) -> Vec { let mut bindings = Vec::new(); + let defaults = self.defaults_or_fallback(); - for (binding, default_action) in &self.defaults.0 { + for (binding, default_action) in &defaults.0 { if *default_action != action { continue; } @@ -219,6 +221,14 @@ impl ShortcutsConfig { bindings } + + fn defaults_or_fallback(&self) -> Shortcuts { + if self.defaults.0.is_empty() { + fallback_shortcuts() + } else { + self.defaults.clone() + } + } } pub fn load() -> (Option, ShortcutsConfig) { @@ -412,6 +422,83 @@ fn insert_shortcuts( } } +fn fallback_shortcuts() -> Shortcuts { + let mut shortcuts = BTreeMap::new(); + + macro_rules! bind { + ([$($modifier:ident),* $(,)?], $key:expr, $action:ident) => {{ + shortcuts.insert( + Binding { + modifiers: vec![$(ModifierName::$modifier),*], + key: $key.to_string(), + }, + KeyBindAction::$action, + ); + }}; + } + + // Standard key bindings + bind!([Ctrl, Shift], "A", SelectAll); + bind!([Ctrl, Shift], "C", Copy); + bind!([], "Copy", Copy); + bind!([Ctrl], "c", CopyOrSigint); + bind!([Ctrl, Shift], "F", Find); + bind!([Ctrl, Shift], "N", WindowNew); + bind!([Ctrl, Shift], "Q", WindowClose); + bind!([Ctrl, Shift], "T", TabNew); + bind!([Ctrl, Shift], "V", Paste); + bind!([], "Paste", Paste); + bind!([Shift], "Insert", PastePrimary); + bind!([Ctrl, Shift], "W", TabClose); + bind!([Ctrl], ",", Settings); + bind!([], "F11", ToggleFullscreen); + + // Ctrl+Alt+D splits horizontally, Ctrl+Alt+R splits vertically, Ctrl+Shift+X maximizes split + //TODO: Adjust bindings as desired by UX + bind!([Ctrl, Alt], "d", PaneSplitHorizontal); + bind!([Ctrl, Alt], "r", PaneSplitVertical); + bind!([Ctrl, Shift], "X", PaneToggleMaximized); + #[cfg(feature = "password_manager")] + bind!([Ctrl, Alt], "p", PasswordManager); + + // Ctrl+Tab and Ctrl+Shift+Tab cycle through tabs + // Ctrl+Tab is not a special key for terminals and is free to use + bind!([Ctrl], "Tab", TabNext); + bind!([Ctrl, Shift], "Tab", TabPrev); + + // Ctrl+Shift+# activates tabs by index + bind!([Ctrl, Shift], "1", TabActivate0); + bind!([Ctrl, Shift], "2", TabActivate1); + bind!([Ctrl, Shift], "3", TabActivate2); + bind!([Ctrl, Shift], "4", TabActivate3); + bind!([Ctrl, Shift], "5", TabActivate4); + bind!([Ctrl, Shift], "6", TabActivate5); + bind!([Ctrl, Shift], "7", TabActivate6); + bind!([Ctrl, Shift], "8", TabActivate7); + bind!([Ctrl, Shift], "9", TabActivate8); + + // Ctrl+0, Ctrl+-, and Ctrl+= are not special keys for terminals and are free to use + bind!([Ctrl], "0", ZoomReset); + bind!([Ctrl], "-", ZoomOut); + bind!([Ctrl], "=", ZoomIn); + bind!([Ctrl], "+", ZoomIn); + + // Ctrl+Arrows and Ctrl+HJKL move between splits + bind!([Ctrl, Shift], "ArrowLeft", PaneFocusLeft); + bind!([Ctrl, Shift], "H", PaneFocusLeft); + bind!([Ctrl, Shift], "ArrowDown", PaneFocusDown); + bind!([Ctrl, Shift], "J", PaneFocusDown); + bind!([Ctrl, Shift], "ArrowUp", PaneFocusUp); + bind!([Ctrl, Shift], "K", PaneFocusUp); + bind!([Ctrl, Shift], "ArrowRight", PaneFocusRight); + bind!([Ctrl, Shift], "L", PaneFocusRight); + + // CTRL+Alt+L clears the scrollback. + bind!([Ctrl, Alt], "L", ClearScrollback); + + Shortcuts(shortcuts) +} + fn key_from_string(value: &str) -> Option { match value { "Copy" => Some(Key::Named(Named::Copy)), From 02899cbb43472aed0573d0e3a496903430cec520 Mon Sep 17 00:00:00 2001 From: Mattias Eriksson Date: Mon, 8 Dec 2025 21:32:36 +0100 Subject: [PATCH 10/40] Properly load/clear passwords on toggle --- src/main.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main.rs b/src/main.rs index 33b717b..422fe57 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2661,6 +2661,15 @@ impl Application for App { self.core.window.show_context = !self.core.window.show_context; self.pane_model.update_terminal_focus(); + #[cfg(feature = "password_manager")] + if ContextPage::PasswordManager == context_page { + if self.core.window.show_context { + self.password_mgr.pane = Some(self.pane_model.focused()); + return self.password_mgr.refresh_password_list(); + } else { + self.password_mgr.clear(); + } + } return self.update_focus(); } else { self.context_page = context_page; @@ -2695,12 +2704,8 @@ impl Application for App { #[cfg(feature = "password_manager")] if ContextPage::PasswordManager == context_page { - if self.core.window.show_context { - self.password_mgr.pane = Some(self.pane_model.focused()); - return self.password_mgr.refresh_password_list(); - } else { - self.password_mgr.clear(); - } + self.password_mgr.pane = Some(self.pane_model.focused()); + return self.password_mgr.refresh_password_list(); } } Message::UpdateDefaultProfile((default, profile_id)) => { From 7107913d13ec73b4e4435705e1f02db0cf157241 Mon Sep 17 00:00:00 2001 From: Konstantin Shabanov Date: Thu, 25 Dec 2025 12:01:20 +0000 Subject: [PATCH 11/40] Fix running nix formatter On non x86_64-linux. --- flake.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index 004e7cc..da251f7 100644 --- a/flake.nix +++ b/flake.nix @@ -15,7 +15,7 @@ in with pkgs; { - formatter = nixpkgs.legacyPackages.x86_64-linux.nixpkgs-fmt; + formatter = nixpkgs.legacyPackages.${system}.nixpkgs-fmt; devShells.default = mkShell { buildInputs = [ rust-bin.stable.latest.default From 055eca8d8ec04677709677fc121bd498802c3e59 Mon Sep 17 00:00:00 2001 From: Konstantin Shabanov Date: Thu, 25 Dec 2025 12:09:46 +0000 Subject: [PATCH 12/40] Fix nixpkgs duplication Reuse nixpkgs input in rust-overlay. --- flake.lock | 20 +++----------------- flake.nix | 5 ++++- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/flake.lock b/flake.lock index 353e01e..485762c 100644 --- a/flake.lock +++ b/flake.lock @@ -34,22 +34,6 @@ "type": "github" } }, - "nixpkgs_2": { - "locked": { - "lastModified": 1744536153, - "narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "18dd725c29603f582cf1900e0d25f9f1063dbf11", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, "root": { "inputs": { "flake-utils": "flake-utils", @@ -59,7 +43,9 @@ }, "rust-overlay": { "inputs": { - "nixpkgs": "nixpkgs_2" + "nixpkgs": [ + "nixpkgs" + ] }, "locked": { "lastModified": 1746239644, diff --git a/flake.nix b/flake.nix index da251f7..5424702 100644 --- a/flake.nix +++ b/flake.nix @@ -2,7 +2,10 @@ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; - rust-overlay.url = "github:oxalica/rust-overlay"; + rust-overlay = { + url = "github:oxalica/rust-overlay"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; outputs = { self, nixpkgs, flake-utils, rust-overlay }: flake-utils.lib.eachDefaultSystem From 566cd02644eadee6b0ef2c0be5d4b17a6d577e89 Mon Sep 17 00:00:00 2001 From: Konstantin Shabanov Date: Thu, 25 Dec 2025 15:20:52 +0000 Subject: [PATCH 13/40] Bump flake Upgrades rustc from 1.86 to 1.92 and fixes the following error: $ nix develop -c cargo build --release <..> error[E0658]: `let` expressions in this position are unstable | 95 | ... if let Some(box_size) = header.box_size() | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: see issue #53667 --- flake.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/flake.lock b/flake.lock index 485762c..fb37599 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1746232882, - "narHash": "sha256-MHmBH2rS8KkRRdoU/feC/dKbdlMkcNkB5mwkuipVHeQ=", + "lastModified": 1766309749, + "narHash": "sha256-3xY8CZ4rSnQ0NqGhMKAy5vgC+2IVK0NoVEzDoOh4DA4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "7a2622e2c0dbad5c4493cb268aba12896e28b008", + "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", "type": "github" }, "original": { @@ -48,11 +48,11 @@ ] }, "locked": { - "lastModified": 1746239644, - "narHash": "sha256-wMvMBMlpS1H8CQdSSgpLeoCWS67ciEkN/GVCcwk7Apc=", + "lastModified": 1766630657, + "narHash": "sha256-wW15buPGU29v0XuAmDkc30+d5j4Tmg/V8AkpHH+hDWY=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "bd32e88bef6da0e021a42fb4120a8df2150e9b8c", + "rev": "3bf67c5e473f29ca79ff15904f3072d87cf6d087", "type": "github" }, "original": { From 42e4b28516f23679e92dd7d76aadf8bd451188e2 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 16 Jan 2026 17:23:32 +0100 Subject: [PATCH 14/40] i18n: translation updates from weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Amadɣas Co-authored-by: Baurzhan Muftakhidinov Co-authored-by: Geeson Wan Co-authored-by: Hosted Weblate Co-authored-by: Michael Murphy Co-authored-by: Vilius Paliokas Co-authored-by: therealmate Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/hu/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/lt/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/zh_Hans/ Translation: Pop OS/COSMIC Term --- i18n/hu/cosmic_term.ftl | 16 ++++++++-------- i18n/kk/cosmic_term.ftl | 0 i18n/zh-CN/cosmic_term.ftl | 28 +++++++++++++++++----------- 3 files changed, 25 insertions(+), 19 deletions(-) create mode 100644 i18n/kk/cosmic_term.ftl diff --git a/i18n/hu/cosmic_term.ftl b/i18n/hu/cosmic_term.ftl index c38e321..1e63c31 100644 --- a/i18n/hu/cosmic_term.ftl +++ b/i18n/hu/cosmic_term.ftl @@ -30,7 +30,7 @@ new-profile = Új profil make-default = Beállítás alapértelmezettként working-directory = Munkakönyvtár hold = Maradjon nyitva -remain-open = Maradjon nyitva a gyermekfolyamat kilépése után. +remain-open = Maradjon nyitva a gyermekfolyamat kilépése után ## Settings @@ -69,9 +69,9 @@ focus-follow-mouse = A fókusz követi az egeret gépelés közben advanced = Speciális show-headerbar = Fejléc megjelenítése -show-header-description = Fejléc megjelenítése a jobb gombos menüből. +show-header-description = Fejléc megjelenítése a jobb gombos menüből # Find -find-placeholder = Keresés... +find-placeholder = Keresés… find-previous = Előző találat find-next = Következő találat @@ -84,7 +84,7 @@ file = Fájl new-tab = Új lap new-window = Új ablak profile = Profil -menu-profiles = Profilok... +menu-profiles = Profilok… close-tab = Lap bezárása quit = Kilépés @@ -108,10 +108,10 @@ previous-tab = Előző lap split-horizontal = Vízszintes felosztás split-vertical = Függőleges felosztás pane-toggle-maximize = Panel maximalizálása -menu-color-schemes = Színsémák... -menu-settings = Beállítások... -menu-about = A COSMIC Terminál névjegye... -menu-password-manager = Jelszavak... +menu-color-schemes = Színsémák… +menu-settings = Beállítások… +menu-about = A COSMIC Terminál névjegye… +menu-password-manager = Jelszavak… passwords-title = Jelszavak add-password = Jelszó hozzáadása password-input = Jelszó diff --git a/i18n/kk/cosmic_term.ftl b/i18n/kk/cosmic_term.ftl new file mode 100644 index 0000000..e69de29 diff --git a/i18n/zh-CN/cosmic_term.ftl b/i18n/zh-CN/cosmic_term.ftl index cdf26c7..fd291a4 100644 --- a/i18n/zh-CN/cosmic_term.ftl +++ b/i18n/zh-CN/cosmic_term.ftl @@ -22,9 +22,9 @@ profiles = 配置文件 name = 名称 command-line = 命令行 tab-title = 标签标题 -tab-title-description = 覆盖默认标签页标题 -add-profile = 创建配置文件 -new-profile = 新建配置文件 +tab-title-description = 覆盖默认标签标题 +add-profile = 添加配置 +new-profile = 新建配置 make-default = 设为默认配置 working-directory = 工作目录 hold = 保留 @@ -67,10 +67,10 @@ focus-follow-mouse = 聚焦窗口跟随鼠标 advanced = 高级 show-headerbar = 显示标题栏 -show-header-description = 右键菜单显示标题栏。 +show-header-description = 右键菜单提供显示标题栏选项。 # Find find-placeholder = 查找... -find-previous = 上一个 +find-previous = 查找上一个 find-next = 查找下一个 # Menu @@ -79,11 +79,11 @@ find-next = 查找下一个 ## File file = 文件 -new-tab = 新建标签页 +new-tab = 新建标签 new-window = 新建窗口 -profile = 配置文件 +profile = 配置 menu-profiles = 配置文件... -close-tab = 关闭标签页 +close-tab = 关闭标签 quit = 退出 ## Edit @@ -98,11 +98,11 @@ clear-scrollback = 清除滚动缓冲区 ## View view = 视图 -zoom-in = 放大字体 +zoom-in = 增大字体 zoom-reset = 默认字体大小 zoom-out = 缩小字体 -next-tab = 下一个标签页 -previous-tab = 上一个标签页 +next-tab = 下一个标签 +previous-tab = 上一个标签 split-horizontal = 水平分割 split-vertical = 垂直分割 pane-toggle-maximize = 切换最大化 @@ -111,3 +111,9 @@ menu-settings = 设置... menu-about = 关于 COSMIC 终端... repository = 仓库 support = 支持 +open-link = 打开链接 +menu-password-manager = 密码… +passwords-title = 密码 +add-password = 添加密码 +password-input = 密码 +password-input-description = 描述 From 1db66929259674c4f141d9b2fdb655aeb52699ae Mon Sep 17 00:00:00 2001 From: Frederic Laing Date: Fri, 16 Jan 2026 17:47:38 +0100 Subject: [PATCH 15/40] fix: hide cursor when scrolled in unfocused terminal --- src/terminal_box.rs | 121 ++++++++++++++++++++++++-------------------- 1 file changed, 65 insertions(+), 56 deletions(-) diff --git a/src/terminal_box.rs b/src/terminal_box.rs index 817e307..38327ec 100644 --- a/src/terminal_box.rs +++ b/src/terminal_box.rs @@ -720,66 +720,75 @@ where state.scrollbar_rect.set(Rectangle::default()) } - // Draw cursor + // Draw cursor (only when not scrolled, as cursor is at bottom of active area) { - let cursor = terminal.term.lock().renderable_content().cursor; - let col = cursor.point.column.0; - let line = cursor.point.line.0; - let color = terminal.term.lock().colors()[NamedColor::Cursor] - .or(terminal.colors()[NamedColor::Cursor]) - .map(|rgb| Color::from_rgb8(rgb.r, rgb.g, rgb.b)) - .unwrap_or(Color::WHITE); // TODO default color from theme? - let width = terminal.size().cell_width; - let height = terminal.size().cell_height; - let top_left = view_position - + Vector::new((col as f32 * width).floor(), (line as f32 * height).floor()); - match cursor.shape { - CursorShape::Beam => { - let quad = Quad { - bounds: Rectangle::new(top_left, Size::new(1.0, height)), - ..Default::default() - }; - renderer.fill_quad(quad, color); - } - CursorShape::Underline => { - let quad = Quad { - bounds: Rectangle::new( - view_position - + Vector::new( - (col as f32 * width).floor(), - ((line + 1) as f32 * height).floor(), - ), - Size::new(width, 1.0), - ), - ..Default::default() - }; - renderer.fill_quad(quad, color); - } - CursorShape::Block if !state.is_focused => { - let quad = Quad { - bounds: Rectangle::new(top_left, Size::new(width, height)), - border: Border { - width: 1.0, - color, + let term = terminal.term.lock(); + let display_offset = term.grid().display_offset(); + let cursor = term.renderable_content().cursor; + drop(term); + + // Skip drawing cursor when scrolled - the cursor is below the visible viewport + if display_offset > 0 { + // Cursor is off-screen when scrolled up + } else { + let col = cursor.point.column.0; + let line = cursor.point.line.0; + let color = terminal.term.lock().colors()[NamedColor::Cursor] + .or(terminal.colors()[NamedColor::Cursor]) + .map(|rgb| Color::from_rgb8(rgb.r, rgb.g, rgb.b)) + .unwrap_or(Color::WHITE); // TODO default color from theme? + let width = terminal.size().cell_width; + let height = terminal.size().cell_height; + let top_left = view_position + + Vector::new((col as f32 * width).floor(), (line as f32 * height).floor()); + match cursor.shape { + CursorShape::Beam => { + let quad = Quad { + bounds: Rectangle::new(top_left, Size::new(1.0, height)), ..Default::default() - }, - ..Default::default() - }; - renderer.fill_quad(quad, Color::TRANSPARENT); - } - CursorShape::HollowBlock => { - let quad = Quad { - bounds: Rectangle::new(top_left, Size::new(width, height)), - border: Border { - width: 1.0, - color, + }; + renderer.fill_quad(quad, color); + } + CursorShape::Underline => { + let quad = Quad { + bounds: Rectangle::new( + view_position + + Vector::new( + (col as f32 * width).floor(), + ((line + 1) as f32 * height).floor(), + ), + Size::new(width, 1.0), + ), ..Default::default() - }, - ..Default::default() - }; - renderer.fill_quad(quad, Color::TRANSPARENT); + }; + renderer.fill_quad(quad, color); + } + CursorShape::Block if !state.is_focused => { + let quad = Quad { + bounds: Rectangle::new(top_left, Size::new(width, height)), + border: Border { + width: 1.0, + color, + ..Default::default() + }, + ..Default::default() + }; + renderer.fill_quad(quad, Color::TRANSPARENT); + } + CursorShape::HollowBlock => { + let quad = Quad { + bounds: Rectangle::new(top_left, Size::new(width, height)), + border: Border { + width: 1.0, + color, + ..Default::default() + }, + ..Default::default() + }; + renderer.fill_quad(quad, Color::TRANSPARENT); + } + CursorShape::Block | CursorShape::Hidden => {} // Block is handled seperately } - CursorShape::Block | CursorShape::Hidden => {} // Block is handled seperately } } From 2250190c2f28ec296e43074b81200677e64d37f3 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Wed, 21 Jan 2026 10:20:07 -0700 Subject: [PATCH 16/40] Epoch 1.0.4 version update Generated by cosmic-epoch scripts/version-update.sh --- Cargo.lock | 1159 ++++++++++++++++++++++++---------------------- Cargo.toml | 2 +- debian/changelog | 6 + 3 files changed, 606 insertions(+), 561 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e07a661..129485f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -153,7 +153,7 @@ dependencies = [ "piper", "polling 3.11.0", "regex-automata", - "rustix 1.1.2", + "rustix 1.1.3", "rustix-openpty", "serde", "signal-hook", @@ -168,6 +168,15 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" +[[package]] +name = "aligned" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" +dependencies = [ + "as-slice", +] + [[package]] name = "aligned-vec" version = "0.6.4" @@ -266,22 +275,22 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.10" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -310,15 +319,15 @@ name = "arbitrary" version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" -dependencies = [ - "derive_arbitrary", -] [[package]] name = "arc-swap" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" +checksum = "51d03449bb8ca2cc2ef70869af31463d1ae5ccc8fa3e334b307203fbf815207e" +dependencies = [ + "rustversion", +] [[package]] name = "arg_enum_proc_macro" @@ -328,7 +337,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -349,6 +358,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" +[[package]] +name = "as-slice" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" +dependencies = [ + "stable_deref_trait", +] + [[package]] name = "ash" version = "0.38.0+1.3.281" @@ -360,9 +378,9 @@ dependencies = [ [[package]] name = "ashpd" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cbdf310d77fd3aaee6ea2093db7011dc2d35d2eb3481e5607f1f8d942ed99df" +checksum = "d2f3f79755c74fd155000314eb349864caa787c6592eace6c6882dad873d9c39" dependencies = [ "enumflags2", "futures-channel", @@ -376,14 +394,14 @@ dependencies = [ "wayland-backend", "wayland-client", "wayland-protocols", - "zbus 5.12.0", + "zbus 5.13.2", ] [[package]] name = "ashpd" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0986d5b4f0802160191ad75f8d33ada000558757db3defb70299ca95d9fcbd" +checksum = "618a409b91d5265798a99e3d1d0b226911605e581c4e7255e83c1e397b172bce" dependencies = [ "enumflags2", "futures-channel", @@ -396,7 +414,7 @@ dependencies = [ "wayland-backend", "wayland-client", "wayland-protocols", - "zbus 5.12.0", + "zbus 5.13.2", ] [[package]] @@ -480,7 +498,7 @@ dependencies = [ "futures-lite 2.6.1", "parking", "polling 3.11.0", - "rustix 1.1.2", + "rustix 1.1.3", "slab", "windows-sys 0.61.2", ] @@ -496,9 +514,9 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.4.1" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" dependencies = [ "event-listener 5.4.1", "event-listener-strategy", @@ -530,14 +548,14 @@ checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" dependencies = [ "async-channel", "async-io 2.6.0", - "async-lock 3.4.1", + "async-lock 3.4.2", "async-signal", "async-task", "blocking", "cfg-if", "event-listener 5.4.1", "futures-lite 2.6.1", - "rustix 1.1.2", + "rustix 1.1.3", ] [[package]] @@ -548,7 +566,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -558,12 +576,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" dependencies = [ "async-io 2.6.0", - "async-lock 3.4.1", + "async-lock 3.4.2", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 1.1.2", + "rustix 1.1.3", "signal-hook-registry", "slab", "windows-sys 0.61.2", @@ -583,7 +601,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -659,7 +677,7 @@ dependencies = [ "derive_utils", "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -668,6 +686,26 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "av-scenechange" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" +dependencies = [ + "aligned", + "anyhow", + "arg_enum_proc_macro", + "arrayvec", + "log", + "num-rational", + "num-traits", + "pastey", + "rayon", + "thiserror 2.0.18", + "v_frame", + "y4m", +] + [[package]] name = "av1-grain" version = "0.2.5" @@ -744,9 +782,12 @@ dependencies = [ [[package]] name = "bitstream-io" -version = "2.6.0" +version = "4.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" +checksum = "60d4bd9d1db2c6bdf285e223a7fa369d5ce98ec767dec949c6ca62863ce61757" +dependencies = [ + "core2", +] [[package]] name = "block" @@ -835,15 +876,15 @@ dependencies = [ [[package]] name = "built" -version = "0.7.7" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" +checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64" [[package]] name = "bumpalo" -version = "3.19.0" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" [[package]] name = "by_address" @@ -868,7 +909,7 @@ checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -885,9 +926,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" [[package]] name = "bzip2" @@ -930,7 +971,7 @@ checksum = "cb9f6e1368bd4621d2c86baa7e37de77a938adf5221e5dd3d6133340101b309e" dependencies = [ "bitflags 2.10.0", "polling 3.11.0", - "rustix 1.1.2", + "rustix 1.1.3", "slab", "tracing", ] @@ -954,7 +995,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa" dependencies = [ "calloop 0.14.3", - "rustix 1.1.2", + "rustix 1.1.3", "wayland-backend", "wayland-client", ] @@ -970,9 +1011,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.44" +version = "1.2.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37521ac7aabe3d13122dc382493e20c9416f299d2ccd5b3a5340a2570cdeb0f3" +checksum = "755d2fce177175ffca841e9a06afdb2c4ab0f593d53b4dee48147dfaade85932" dependencies = [ "find-msvc-tools", "jobserver", @@ -997,16 +1038,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "cfg-expr" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" -dependencies = [ - "smallvec", - "target-lexicon", -] - [[package]] name = "cfg-if" version = "1.0.4" @@ -1027,9 +1058,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" dependencies = [ "iana-time-zone", "js-sys", @@ -1051,9 +1082,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" +checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" [[package]] name = "clipboard-win" @@ -1188,9 +1219,8 @@ dependencies = [ [[package]] name = "compio" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "362c95e8e1a569b50b7e6642156eccd3678f03b4afa59834f18fad8af5649587" +version = "0.17.0" +source = "git+https://github.com/jackpot51/compio.git#8235a1fcccde233362bb76df45b509c12ca79972" dependencies = [ "compio-buf", "compio-driver", @@ -1198,15 +1228,13 @@ dependencies = [ "compio-io", "compio-log", "compio-macros", - "compio-net", "compio-runtime", ] [[package]] name = "compio-buf" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5881ed3b06004d5e505746e6780dbbaf76fc508201e57bb5c84fcb4d69b8c23e" +version = "0.7.1" +source = "git+https://github.com/jackpot51/compio.git#8235a1fcccde233362bb76df45b509c12ca79972" dependencies = [ "arrayvec", "bytes", @@ -1215,9 +1243,8 @@ dependencies = [ [[package]] name = "compio-driver" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "823d0ce45a1b350878ce69a143ce75d6e95cbd00b7fc578e2de2f8142692c537" +version = "0.10.0" +source = "git+https://github.com/jackpot51/compio.git#8235a1fcccde233362bb76df45b509c12ca79972" dependencies = [ "cfg-if", "cfg_aliases 0.2.1", @@ -1229,16 +1256,17 @@ dependencies = [ "libc", "once_cell", "paste", + "pin-project-lite", "polling 3.11.0", "socket2 0.6.1", + "thin-cell", "windows-sys 0.61.2", ] [[package]] name = "compio-fs" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea585c274239b9fd350a484c75a31fd0df5f031805b6664d83a98f5e8b019e2f" +version = "0.10.0" +source = "git+https://github.com/jackpot51/compio.git#8235a1fcccde233362bb76df45b509c12ca79972" dependencies = [ "cfg-if", "cfg_aliases 0.2.1", @@ -1254,9 +1282,8 @@ dependencies = [ [[package]] name = "compio-io" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d125bc35ccd1ed098665218ce4f12a6c4a73855c151feff1b47fd7ba104f7955" +version = "0.8.4" +source = "git+https://github.com/jackpot51/compio.git#8235a1fcccde233362bb76df45b509c12ca79972" dependencies = [ "compio-buf", "futures-util", @@ -1266,8 +1293,7 @@ dependencies = [ [[package]] name = "compio-log" version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4e560213c1996b618da369b7c9109564b41af9033802ae534465c4ee4e132f" +source = "git+https://github.com/jackpot51/compio.git#8235a1fcccde233362bb76df45b509c12ca79972" dependencies = [ "tracing", ] @@ -1275,42 +1301,20 @@ dependencies = [ [[package]] name = "compio-macros" version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f05ed201484967dc70de77a8f7a02b29aaa8e6c81cbea2e75492ee0c8d97766b" +source = "git+https://github.com/jackpot51/compio.git#8235a1fcccde233362bb76df45b509c12ca79972" dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.109", -] - -[[package]] -name = "compio-net" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e6ea7aa4a9f38d68dd0098a11232236cb3efd0ef3cab50ecdada3d745f1f776" -dependencies = [ - "cfg-if", - "compio-buf", - "compio-driver", - "compio-io", - "compio-runtime", - "either", - "libc", - "once_cell", - "socket2 0.6.1", - "widestring", - "windows-sys 0.61.2", + "syn 2.0.114", ] [[package]] name = "compio-runtime" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f917dcd14830bcd0e0ee7a47bcf4fd1cbee5f45c55c0433efb242511104952" +version = "0.10.1" +source = "git+https://github.com/jackpot51/compio.git#8235a1fcccde233362bb76df45b509c12ca79972" dependencies = [ "async-task", - "cfg-if", "compio-buf", "compio-driver", "compio-log", @@ -1381,6 +1385,15 @@ dependencies = [ "libc", ] +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + [[package]] name = "core_affinity" version = "0.8.3" @@ -1417,7 +1430,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#3b8ad45950f5d23c8550e18e628f6e70b7089d89" +source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1432,22 +1445,22 @@ dependencies = [ "tokio", "tracing", "xdg", - "zbus 5.12.0", + "zbus 5.13.2", ] [[package]] name = "cosmic-config-derive" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#3b8ad45950f5d23c8550e18e628f6e70b7089d89" +source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" dependencies = [ "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] name = "cosmic-files" -version = "0.1.0" -source = "git+https://github.com/pop-os/cosmic-files.git#e779fc3dac1dd1de2b5c8aa54c6bd5f872169635" +version = "1.0.0" +source = "git+https://github.com/pop-os/cosmic-files.git#452adb960242a9242cb6b2dfd51383c0834ac8fe" dependencies = [ "anyhow", "chrono", @@ -1456,7 +1469,7 @@ dependencies = [ "dirs 6.0.0", "env_logger", "flate2", - "fork", + "fork 0.6.0", "freedesktop_entry_parser", "futures", "glob", @@ -1506,7 +1519,7 @@ dependencies = [ "btoi", "memchr", "memmap2 0.9.9", - "thiserror 2.0.17", + "thiserror 2.0.18", "tracing", "xdg", ] @@ -1528,20 +1541,20 @@ dependencies = [ [[package]] name = "cosmic-settings-daemon" version = "0.1.0" -source = "git+https://github.com/pop-os/dbus-settings-bindings#b2337437d70b3db7a56211a43aa1632306711b2d" +source = "git+https://github.com/pop-os/dbus-settings-bindings#87c3c35666b926a24a1e8045fd70be2db1145e34" dependencies = [ - "zbus 5.12.0", + "zbus 5.13.2", ] [[package]] name = "cosmic-term" -version = "0.1.0" +version = "1.0.4" dependencies = [ "alacritty_terminal", "clap_lex", "cosmic-files", "cosmic-text", - "fork", + "fork 0.4.0", "hex_color", "i18n-embed", "i18n-embed-fl", @@ -1558,15 +1571,15 @@ dependencies = [ "secstr", "serde", "shlex", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "url", ] [[package]] name = "cosmic-text" -version = "0.15.0" -source = "git+https://github.com/pop-os/cosmic-text.git#7051682e70defcab6b683d6e9db07124a6de0df7" +version = "0.16.0" +source = "git+https://github.com/pop-os/cosmic-text.git#ee702e50901d90cd842dbd88154687bd2512b52c" dependencies = [ "bitflags 2.10.0", "fontdb 0.23.0", @@ -1589,7 +1602,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#3b8ad45950f5d23c8550e18e628f6e70b7089d89" +source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" dependencies = [ "almost", "cosmic-config", @@ -1599,7 +1612,7 @@ dependencies = [ "ron", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -1677,9 +1690,9 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", @@ -1745,7 +1758,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -1756,7 +1769,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -1791,17 +1804,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "derive_arbitrary" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.109", -] - [[package]] name = "derive_setters" version = "0.1.8" @@ -1811,7 +1813,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -1822,7 +1824,7 @@ checksum = "ccfae181bab5ab6c5478b2ccb69e4c68a02f8c3ec72f6616bfec9dbc599d2ee0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -1925,7 +1927,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -2016,9 +2018,9 @@ checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "endi" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" [[package]] name = "enumflags2" @@ -2038,7 +2040,7 @@ checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -2081,7 +2083,7 @@ checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -2118,9 +2120,9 @@ dependencies = [ [[package]] name = "euclid" -version = "0.22.11" +version = "0.22.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" +checksum = "df61bf483e837f88d5c2291dcf55c67be7e676b3a51acc48db3a7b163b91ed63" dependencies = [ "num-traits", ] @@ -2165,9 +2167,9 @@ dependencies = [ [[package]] name = "exr" -version = "1.73.0" +version = "1.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" +checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be" dependencies = [ "bit_field", "half", @@ -2216,7 +2218,7 @@ checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -2239,14 +2241,13 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.26" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" +checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" dependencies = [ "cfg-if", "libc", "libredox", - "windows-sys 0.60.2", ] [[package]] @@ -2255,14 +2256,14 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59a98bbaacea1c0eb6a0876280051b892eb73594fd90cf3b20e9c817029c57d2" dependencies = [ - "toml 0.5.11", + "toml", ] [[package]] name = "find-msvc-tools" -version = "0.1.4" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" +checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db" [[package]] name = "fixed_decimal" @@ -2277,13 +2278,13 @@ dependencies = [ [[package]] name = "flate2" -version = "1.1.5" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +checksum = "b375d6465b98090a5f25b1c7703f3859783755aa9a80433b36e0379a3ec2f369" dependencies = [ "crc32fast", - "libz-rs-sys", "miniz_oxide", + "zlib-rs", ] [[package]] @@ -2340,14 +2341,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54f0d287c53ffd184d04d8677f590f4ac5379785529e5e08b1c8083acdd5c198" dependencies = [ "memchr", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "flume" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +checksum = "5e139bc46ca777eb5efaf62df0ab8cc5fd400866427e56c68b22e414e53bd3be" dependencies = [ "spin", ] @@ -2428,7 +2429,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -2446,6 +2447,15 @@ dependencies = [ "libc", ] +[[package]] +name = "fork" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29714eb48a54d35d6f107e38cc58003f2e26825f222119db8369d28b24b79f2a" +dependencies = [ + "libc", +] + [[package]] name = "form_urlencoded" version = "1.2.2" @@ -2559,7 +2569,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -2594,9 +2604,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.9" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -2608,15 +2618,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" dependencies = [ - "rustix 1.1.2", + "rustix 1.1.3", "windows-link", ] [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "libc", @@ -2630,9 +2640,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi", "wasip2", + "wasm-bindgen", ] [[package]] @@ -2645,6 +2657,16 @@ dependencies = [ "weezl", ] +[[package]] +name = "gif" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5df2ba84018d80c213569363bdcd0c64e6933c67fe4c1d60ecf822971a3c35e" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "gl_generator" version = "0.14.0" @@ -2756,9 +2778,9 @@ dependencies = [ [[package]] name = "grid" -version = "0.18.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12101ecc8225ea6d675bc70263074eab6169079621c2186fe0c66590b2df9681" +checksum = "f9e2d4c0a8296178d8802098410ca05d86b17a10bb5ab559b3fb404c1f948220" [[package]] name = "guillotiere" @@ -2805,9 +2827,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" [[package]] name = "hassle-rs" @@ -2830,12 +2852,6 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - [[package]] name = "hermit-abi" version = "0.3.9" @@ -2948,7 +2964,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.109", + "syn 2.0.114", "unic-langid", ] @@ -2962,7 +2978,7 @@ dependencies = [ "i18n-config", "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -2977,7 +2993,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.56.0", + "windows-core 0.62.2", ] [[package]] @@ -2992,7 +3008,7 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#3b8ad45950f5d23c8550e18e628f6e70b7089d89" +source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" dependencies = [ "dnd", "iced_accessibility", @@ -3010,7 +3026,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#3b8ad45950f5d23c8550e18e628f6e70b7089d89" +source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" dependencies = [ "accesskit", "accesskit_winit", @@ -3019,7 +3035,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#3b8ad45950f5d23c8550e18e628f6e70b7089d89" +source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" dependencies = [ "bitflags 2.10.0", "bytes", @@ -3043,7 +3059,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#3b8ad45950f5d23c8550e18e628f6e70b7089d89" +source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" dependencies = [ "futures", "iced_core", @@ -3069,7 +3085,7 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#3b8ad45950f5d23c8550e18e628f6e70b7089d89" +source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" dependencies = [ "bitflags 2.10.0", "bytemuck", @@ -3091,7 +3107,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#3b8ad45950f5d23c8550e18e628f6e70b7089d89" +source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -3103,7 +3119,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#3b8ad45950f5d23c8550e18e628f6e70b7089d89" +source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" dependencies = [ "bytes", "cosmic-client-toolkit", @@ -3118,7 +3134,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#3b8ad45950f5d23c8550e18e628f6e70b7089d89" +source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" dependencies = [ "bytemuck", "cosmic-text", @@ -3134,7 +3150,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#3b8ad45950f5d23c8550e18e628f6e70b7089d89" +source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" dependencies = [ "as-raw-xcb-connection", "bitflags 2.10.0", @@ -3165,7 +3181,7 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#3b8ad45950f5d23c8550e18e628f6e70b7089d89" +source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -3184,7 +3200,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#3b8ad45950f5d23c8550e18e628f6e70b7089d89" +source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -3344,9 +3360,9 @@ dependencies = [ [[package]] name = "icu_datetime_data" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf2a384725c67fcd32d27737bc7ba9dc5fe21311dfe3ba530f4b4d53e72bacc" +checksum = "46597233625417b7c8052a63d916e4fdc73df21614ac0b679492a5d6e3b01aeb" [[package]] name = "icu_decimal" @@ -3405,9 +3421,9 @@ dependencies = [ [[package]] name = "icu_experimental_data" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2578ea93f0373bb28800f7d1100e7e771c4d248d0d3759250fed08fa27694139" +checksum = "a0bce39e12480e91c7ddb748218050c459e241f491d130ea6ee92c3e5cd254f7" [[package]] name = "icu_list" @@ -3461,9 +3477,9 @@ dependencies = [ [[package]] name = "icu_locale_data" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f03e2fcaefecdf05619f3d6f91740e79ab969b4dd54f77cbf546b1d0d28e3147" +checksum = "1c5f1d16b4c3a2642d3a719f18f6b06070ab0aef246a6418130c955ae08aa831" [[package]] name = "icu_normalizer" @@ -3523,9 +3539,9 @@ checksum = "f018a98dccf7f0eb02ba06ac0ff67d102d8ded80734724305e924de304e12ff0" [[package]] name = "icu_properties" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" dependencies = [ "icu_collections", "icu_locale_core", @@ -3538,9 +3554,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" [[package]] name = "icu_provider" @@ -3561,9 +3577,9 @@ dependencies = [ [[package]] name = "icu_segmenter" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5e7e9b540df15e53ca27f69b50e36e01b652584b40b3335ed65d18303834" +checksum = "a807a7488f3f758629ae86d99d9d30dce24da2fb2945d74c80a4f4a62c71db73" dependencies = [ "core_maths", "icu_collections", @@ -3650,15 +3666,15 @@ dependencies = [ [[package]] name = "image" -version = "0.25.8" +version = "0.25.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "529feb3e6769d234375c4cf1ee2ce713682b8e76538cb13f9fc23e1400a591e7" +checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" dependencies = [ "bytemuck", "byteorder-lite", "color_quant", "exr", - "gif", + "gif 0.14.1", "image-webp", "moxcms", "num-traits", @@ -3668,8 +3684,8 @@ dependencies = [ "rayon", "rgb", "tiff", - "zune-core", - "zune-jpeg", + "zune-core 0.5.1", + "zune-jpeg 0.5.11", ] [[package]] @@ -3705,12 +3721,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.12.0" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ "equivalent", - "hashbrown 0.16.0", + "hashbrown 0.16.1", "serde", "serde_core", ] @@ -3771,7 +3787,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -3831,18 +3847,18 @@ checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" -version = "0.12.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] name = "ixdtf" @@ -3852,26 +3868,26 @@ checksum = "84de9d95a6d2547d9b77ee3f25fa0ee32e3c3a6484d47a55adebc0439c077992" [[package]] name = "jiff" -version = "0.2.15" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49" +checksum = "e67e8da4c49d6d9909fe03361f9b620f58898859f5c7aded68351e85e71ecf50" dependencies = [ "jiff-static", "log", "portable-atomic", "portable-atomic-util", - "serde", + "serde_core", ] [[package]] name = "jiff-static" -version = "0.2.15" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" +checksum = "e0c84ee7f197eca9a86c6fd6cb771e55eb991632f15f2bc3ca6ec838929e6e78" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -3914,9 +3930,9 @@ checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" [[package]] name = "js-sys" -version = "0.3.82" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" dependencies = [ "once_cell", "wasm-bindgen", @@ -4192,17 +4208,17 @@ checksum = "2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7" [[package]] name = "libc" -version = "0.2.177" +version = "0.2.180" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" [[package]] name = "libcosmic" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#3b8ad45950f5d23c8550e18e628f6e70b7089d89" +source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" dependencies = [ "apply", - "ashpd 0.12.0", + "ashpd 0.12.1", "auto_enums", "chrono", "cosmic-client-toolkit", @@ -4234,12 +4250,12 @@ dependencies = [ "serde", "slotmap", "taffy", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", "unicode-segmentation", "url", - "zbus 5.12.0", + "zbus 5.13.2", ] [[package]] @@ -4270,22 +4286,13 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" -version = "0.1.10" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" dependencies = [ "bitflags 2.10.0", "libc", - "redox_syscall 0.5.18", -] - -[[package]] -name = "libz-rs-sys" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "840db8cf39d9ec4dd794376f38acc40d0fc65eec2a8f484f7fd375b84602becd" -dependencies = [ - "zlib-rs", + "redox_syscall 0.7.0", ] [[package]] @@ -4341,9 +4348,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.28" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "loop9" @@ -4382,9 +4389,9 @@ dependencies = [ [[package]] name = "lyon_geom" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e16770d760c7848b0c1c2d209101e408207a65168109509f8483837a36cf2e7" +checksum = "e260b6de923e6e47adfedf6243013a7a874684165a6a277594ee3906021b2343" dependencies = [ "arrayvec", "euclid", @@ -4414,9 +4421,9 @@ dependencies = [ [[package]] name = "lzma-rust2" -version = "0.13.0" +version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c60a23ffb90d527e23192f1246b14746e2f7f071cb84476dd879071696c18a4a" +checksum = "1670343e58806300d87950e3401e820b519b9384281bbabfb15e3636689ffd69" dependencies = [ "crc", "sha2", @@ -4550,9 +4557,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ "libc", "log", @@ -4571,9 +4578,9 @@ dependencies = [ [[package]] name = "moxcms" -version = "0.7.9" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fbdd3d7436f8b5e892b8b7ea114271ff0fa00bc5acae845d53b07d498616ef6" +checksum = "ac9557c559cd6fc9867e122e20d2cbefc9ca29d80d027a8e39310920ed2f0a97" dependencies = [ "num-traits", "pxfm", @@ -4663,19 +4670,6 @@ dependencies = [ "memoffset 0.7.1", ] -[[package]] -name = "nix" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" -dependencies = [ - "bitflags 2.10.0", - "cfg-if", - "cfg_aliases 0.2.1", - "libc", - "memoffset 0.9.1", -] - [[package]] name = "nom" version = "7.1.3" @@ -4785,7 +4779,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -4858,7 +4852,7 @@ dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -5150,9 +5144,9 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "open" -version = "5.3.2" +version = "5.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2483562e62ea94312f3576a7aca397306df7990b8d89033e18766744377ef95" +checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc" dependencies = [ "is-wsl", "libc", @@ -5167,10 +5161,11 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "orbclient" -version = "0.3.49" +version = "0.3.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "247ad146e19b9437f8604c21f8652423595cf710ad108af40e77d3ae6e96b827" +checksum = "52ad2c6bae700b7aa5d1cc30c59bdd3a1c180b09dbaea51e2ae2b8e1cf211fdd" dependencies = [ + "libc", "libredox", ] @@ -5186,9 +5181,9 @@ dependencies = [ [[package]] name = "ordermap" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed637741ced8fb240855d22a2b4f208dab7a06bcce73380162e5253000c16758" +checksum = "cfa78c92071bbd3628c22b1a964f7e0eb201dc1456555db072beb1662ecd6715" dependencies = [ "indexmap", "serde", @@ -5222,11 +5217,11 @@ version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c7028bdd3d43083f6d8d4d5187680d0d3560d54df4cc9d752005268b41e64d0" dependencies = [ - "heck 0.4.1", + "heck", "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -5260,7 +5255,7 @@ dependencies = [ "by_address", "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -5323,6 +5318,12 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pastey" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" + [[package]] name = "pathdiff" version = "0.2.3" @@ -5396,7 +5397,7 @@ dependencies = [ "phf_shared 0.11.3", "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -5409,7 +5410,7 @@ dependencies = [ "phf_shared 0.13.1", "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -5453,7 +5454,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -5537,7 +5538,7 @@ dependencies = [ "concurrent-queue", "hermit-abi 0.5.2", "pin-project-lite", - "rustix 1.1.2", + "rustix 1.1.3", "windows-sys 0.61.2", ] @@ -5549,9 +5550,9 @@ checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" [[package]] name = "portable-atomic" -version = "1.11.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" +checksum = "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950" [[package]] name = "portable-atomic-util" @@ -5616,7 +5617,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit 0.23.7", + "toml_edit 0.23.10+spec-1.0.0", ] [[package]] @@ -5638,14 +5639,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] name = "proc-macro2" -version = "1.0.103" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" dependencies = [ "unicode-ident", ] @@ -5658,7 +5659,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", "version_check", "yansi", ] @@ -5673,7 +5674,7 @@ dependencies = [ "chrono", "flate2", "procfs-core", - "rustix 1.1.2", + "rustix 1.1.3", ] [[package]] @@ -5703,7 +5704,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" dependencies = [ "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -5714,9 +5715,9 @@ checksum = "869675ad2d7541aea90c6d88c81f46a7f4ea9af8cd0395d38f11a95126998a0d" [[package]] name = "pxfm" -version = "0.1.25" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3cbdf373972bf78df4d3b518d07003938e2c7d1fb5891e55f9cb6df57009d84" +checksum = "7186d3822593aa4393561d186d1393b3923e9d6163d3fbfd6e825e3e6cf3e6a8" dependencies = [ "num-traits", ] @@ -5748,18 +5749,18 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.37.5" +version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" dependencies = [ "memchr", ] [[package]] name = "quote" -version = "1.0.41" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" dependencies = [ "proc-macro2", ] @@ -5788,7 +5789,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -5808,7 +5809,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -5817,14 +5818,14 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", ] [[package]] name = "rand_core" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ "getrandom 0.3.4", ] @@ -5837,19 +5838,21 @@ checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" [[package]] name = "rangemap" -version = "1.6.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7e49bb0bf967717f7bd674458b3d6b0c5f48ec7e3038166026a69fc22223" +checksum = "973443cf09a9c8656b574a866ab68dfa19f0867d0340648c7d2f6a71b8a8ea68" [[package]] name = "rav1e" -version = "0.7.1" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" dependencies = [ + "aligned-vec", "arbitrary", "arg_enum_proc_macro", "arrayvec", + "av-scenechange", "av1-grain", "bitstream-io", "built", @@ -5864,23 +5867,21 @@ dependencies = [ "noop_proc_macro", "num-derive", "num-traits", - "once_cell", "paste", "profiling", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand 0.9.2", + "rand_chacha 0.9.0", "simd_helpers", - "system-deps", - "thiserror 1.0.69", + "thiserror 2.0.18", "v_frame", "wasm-bindgen", ] [[package]] name = "ravif" -version = "0.11.20" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5825c26fddd16ab9f515930d49028a630efec172e903483c94796cfe31893e6b" +checksum = "ef69c1990ceef18a116855938e74793a5f7496ee907562bd0857b6ac734ab285" dependencies = [ "avif-serialize", "imgref", @@ -5971,13 +5972,22 @@ dependencies = [ "bitflags 2.10.0", ] +[[package]] +name = "redox_syscall" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f3fe0889e69e2ae9e41f4d6c4c0181701d00e4697b356fb1f74173a5e0ee27" +dependencies = [ + "bitflags 2.10.0", +] + [[package]] name = "redox_users" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "libredox", "thiserror 1.0.69", ] @@ -5988,9 +5998,9 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "libredox", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -6034,7 +6044,7 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "944d052815156ac8fa77eaac055220e95ba0b01fa8887108ca710c03805d9051" dependencies = [ - "gif", + "gif 0.13.3", "jpeg-decoder", "log", "pico-args", @@ -6050,7 +6060,7 @@ version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" dependencies = [ - "ashpd 0.11.0", + "ashpd 0.11.1", "block2 0.6.2", "dispatch2", "js-sys", @@ -6098,9 +6108,9 @@ checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" [[package]] name = "rust-embed" -version = "8.9.0" +version = "8.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "947d7f3fad52b283d261c4c99a084937e2fe492248cb9a68a8435a861b8798ca" +checksum = "04113cb9355a377d83f06ef1f0a45b8ab8cd7d8b1288160717d66df5c7988d27" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -6109,22 +6119,22 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "8.9.0" +version = "8.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fa2c8c9e8711e10f9c4fd2d64317ef13feaab820a4c51541f1a8c8e2e851ab2" +checksum = "da0902e4c7c8e997159ab384e6d0fc91c221375f6894346ae107f47dd0f3ccaa" dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.109", + "syn 2.0.114", "walkdir", ] [[package]] name = "rust-embed-utils" -version = "8.9.0" +version = "8.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b161f275cb337fe0a44d924a5f4df0ed69c2c39519858f931ce61c779d3475" +checksum = "5bcdef0be6fe7f6fa333b1073c949729274b05f123a0ad7efcb8efd878e5c3b1" dependencies = [ "sha2", "walkdir", @@ -6171,9 +6181,9 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" dependencies = [ "bitflags 2.10.0", "errno", @@ -6190,7 +6200,7 @@ checksum = "1de16c7c59892b870a6336f185dc10943517f1327447096bbb7bb32cd85e2393" dependencies = [ "errno", "libc", - "rustix 1.1.2", + "rustix 1.1.3", ] [[package]] @@ -6215,12 +6225,6 @@ dependencies = [ "unicode-script", ] -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - [[package]] name = "same-file" version = "1.0.6" @@ -6265,13 +6269,13 @@ dependencies = [ "cbc", "futures-util", "generic-array", - "getrandom 0.2.16", + "getrandom 0.2.17", "hkdf", "num", "once_cell", "serde", "sha2", - "zbus 5.12.0", + "zbus 5.13.2", ] [[package]] @@ -6285,9 +6289,9 @@ dependencies = [ [[package]] name = "self_cell" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16c2f82143577edb4921b71ede051dac62ca3c16084e918bf7b40c96ae10eb33" +checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89" [[package]] name = "serde" @@ -6316,21 +6320,21 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] name = "serde_json" -version = "1.0.145" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ "indexmap", "itoa", "memchr", - "ryu", "serde", "serde_core", + "zmij", ] [[package]] @@ -6341,16 +6345,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", -] - -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", + "syn 2.0.114", ] [[package]] @@ -6393,18 +6388,19 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.6" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ + "errno", "libc", ] [[package]] name = "simd-adler32" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" [[package]] name = "simd_helpers" @@ -6458,9 +6454,9 @@ checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "slotmap" -version = "1.0.7" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" dependencies = [ "version_check", ] @@ -6511,8 +6507,8 @@ dependencies = [ "log", "memmap2 0.9.9", "pkg-config", - "rustix 1.1.2", - "thiserror 2.0.17", + "rustix 1.1.3", + "thiserror 2.0.18", "wayland-backend", "wayland-client", "wayland-csd-frame", @@ -6687,9 +6683,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.109" +version = "2.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f17c7e013e88258aa9543dcbe81aca68a667a9ac37cd69c9fbc07858bfe0e2f" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" dependencies = [ "proc-macro2", "quote", @@ -6704,7 +6700,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -6716,24 +6712,11 @@ dependencies = [ "libc", ] -[[package]] -name = "system-deps" -version = "6.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" -dependencies = [ - "cfg-expr", - "heck 0.5.0", - "pkg-config", - "toml 0.8.23", - "version-compare", -] - [[package]] name = "taffy" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b25026fb8cc9ab51ab9fdabe5d11706796966f6d1c78e19871ef63be2b8f0644" +checksum = "41ba83ebaf2954d31d05d67340fd46cebe99da2b7133b0dd68d70c65473a437b" dependencies = [ "arrayvec", "grid", @@ -6752,22 +6735,16 @@ dependencies = [ "xattr", ] -[[package]] -name = "target-lexicon" -version = "0.12.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" - [[package]] name = "tempfile" -version = "3.23.0" +version = "3.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c" dependencies = [ "fastrand 2.3.0", "getrandom 0.3.4", "once_cell", - "rustix 1.1.2", + "rustix 1.1.3", "windows-sys 0.61.2", ] @@ -6780,6 +6757,12 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "thin-cell" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4164c6c316ba9733b0ab021e7f9852c788a4b991b49c25820f1be48e1d41345b" + [[package]] name = "thiserror" version = "1.0.69" @@ -6791,11 +6774,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl 2.0.17", + "thiserror-impl 2.0.18", ] [[package]] @@ -6806,18 +6789,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] name = "thiserror-impl" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -6831,27 +6814,28 @@ dependencies = [ "half", "quick-error", "weezl", - "zune-jpeg", + "zune-jpeg 0.4.21", ] [[package]] name = "time" -version = "0.3.44" +version = "0.3.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +checksum = "f9e442fc33d7fdb45aa9bfeb312c095964abdf596f7567261062b2a7107aaabd" dependencies = [ "deranged", + "js-sys", "num-conv", "powerfmt", - "serde", + "serde_core", "time-core", ] [[package]] name = "time-core" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" +checksum = "8b36ee98fd31ec7426d599183e8fe26932a8dc1fb76ddb6214d05493377d34ca" [[package]] name = "tiny-skia" @@ -6920,9 +6904,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.48.0" +version = "1.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" dependencies = [ "bytes", "libc", @@ -6943,14 +6927,14 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] name = "tokio-stream" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" dependencies = [ "futures-core", "pin-project-lite", @@ -6966,32 +6950,17 @@ dependencies = [ "serde", ] -[[package]] -name = "toml" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime 0.6.11", - "toml_edit 0.22.27", -] - [[package]] name = "toml_datetime" version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" -dependencies = [ - "serde", -] [[package]] name = "toml_datetime" -version = "0.7.3" +version = "0.7.5+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" dependencies = [ "serde_core", ] @@ -7009,43 +6978,30 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.27" +version = "0.23.10+spec-1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" dependencies = [ "indexmap", - "serde", - "serde_spanned", - "toml_datetime 0.6.11", - "winnow 0.7.13", -] - -[[package]] -name = "toml_edit" -version = "0.23.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" -dependencies = [ - "indexmap", - "toml_datetime 0.7.3", + "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", - "winnow 0.7.13", + "winnow 0.7.14", ] [[package]] name = "toml_parser" -version = "1.0.4" +version = "1.0.6+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" dependencies = [ - "winnow 0.7.13", + "winnow 0.7.14", ] [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "log", "pin-project-lite", @@ -7055,20 +7011,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", ] @@ -7114,6 +7070,12 @@ dependencies = [ "rustc-hash 2.1.1", ] +[[package]] +name = "typed-path" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7922f2cdc51280d47b491af9eafc41eb0cdab85eabcb390c854412fcbf26dbe8" + [[package]] name = "typenum" version = "1.19.0" @@ -7152,9 +7114,9 @@ dependencies = [ [[package]] name = "unicase" -version = "2.8.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" [[package]] name = "unicode-bidi" @@ -7194,9 +7156,9 @@ checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" [[package]] name = "unicode-script" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb421b350c9aff471779e262955939f565ec18b86c15364e6bdf0d662ca7c1f" +checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee" [[package]] name = "unicode-segmentation" @@ -7230,14 +7192,15 @@ checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "url" -version = "2.5.7" +version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna", "percent-encoding", "serde", + "serde_derive", ] [[package]] @@ -7293,20 +7256,20 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.18.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" dependencies = [ "js-sys", - "serde", + "serde_core", "wasm-bindgen", ] [[package]] name = "uzers" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4df81ff504e7d82ad53e95ed1ad5b72103c11253f39238bcc0235b90768a97dd" +checksum = "0b8275fb1afee25b4111d2dc8b5c505dbbc4afd0b990cb96deb2d88bff8be18d" dependencies = [ "libc", "log", @@ -7323,12 +7286,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "version-compare" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" - [[package]] name = "version_check" version = "0.9.5" @@ -7382,9 +7339,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.105" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" dependencies = [ "cfg-if", "once_cell", @@ -7395,11 +7352,12 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.55" +version = "0.4.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" +checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" dependencies = [ "cfg-if", + "futures-util", "js-sys", "once_cell", "wasm-bindgen", @@ -7408,9 +7366,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.105" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -7418,22 +7376,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.105" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.105" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" dependencies = [ "unicode-ident", ] @@ -7455,13 +7413,13 @@ dependencies = [ [[package]] name = "wayland-backend" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" +checksum = "fee64194ccd96bf648f42a65a7e589547096dfa702f7cadef84347b66ad164f9" dependencies = [ "cc", "downcast-rs", - "rustix 1.1.2", + "rustix 1.1.3", "scoped-tls", "smallvec", "wayland-sys", @@ -7469,12 +7427,12 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.11" +version = "0.31.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" +checksum = "b8e6faa537fbb6c186cb9f1d41f2f811a4120d1b57ec61f50da451a0c5122bec" dependencies = [ "bitflags 2.10.0", - "rustix 1.1.2", + "rustix 1.1.3", "wayland-backend", "wayland-scanner", ] @@ -7492,20 +7450,20 @@ dependencies = [ [[package]] name = "wayland-cursor" -version = "0.31.11" +version = "0.31.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447ccc440a881271b19e9989f75726d60faa09b95b0200a9b7eb5cc47c3eeb29" +checksum = "5864c4b5b6064b06b1e8b74ead4a98a6c45a285fe7a0e784d24735f011fdb078" dependencies = [ - "rustix 1.1.2", + "rustix 1.1.3", "wayland-client", "xcursor", ] [[package]] name = "wayland-protocols" -version = "0.32.9" +version = "0.32.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" +checksum = "baeda9ffbcfc8cd6ddaade385eaf2393bd2115a69523c735f12242353c3df4f3" dependencies = [ "bitflags 2.10.0", "wayland-backend", @@ -7529,9 +7487,9 @@ dependencies = [ [[package]] name = "wayland-protocols-misc" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dfe33d551eb8bffd03ff067a8b44bb963919157841a99957151299a6307d19c" +checksum = "791c58fdeec5406aa37169dd815327d1e47f334219b523444bc26d70ceb4c34e" dependencies = [ "bitflags 2.10.0", "wayland-backend", @@ -7542,9 +7500,9 @@ dependencies = [ [[package]] name = "wayland-protocols-plasma" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a07a14257c077ab3279987c4f8bb987851bf57081b93710381daea94f2c2c032" +checksum = "aa98634619300a535a9a97f338aed9a5ff1e01a461943e8346ff4ae26007306b" dependencies = [ "bitflags 2.10.0", "wayland-backend", @@ -7555,9 +7513,9 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" +checksum = "e9597cdf02cf0c34cd5823786dce6b5ae8598f05c2daf5621b6e178d4f7345f3" dependencies = [ "bitflags 2.10.0", "wayland-backend", @@ -7569,33 +7527,33 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.7" +version = "0.31.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" +checksum = "5423e94b6a63e68e439803a3e153a9252d5ead12fd853334e2ad33997e3889e3" dependencies = [ "proc-macro2", - "quick-xml 0.37.5", + "quick-xml 0.38.4", "quote", ] [[package]] name = "wayland-server" -version = "0.31.10" +version = "0.31.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcbd4f3aba6c9fba70445ad2a484c0ef0356c1a9459b1e8e435bedc1971a6222" +checksum = "9297ab90f8d1f597711d36455c5b1b2290eca59b8134485e377a296b80b118c9" dependencies = [ "bitflags 2.10.0", "downcast-rs", - "rustix 1.1.2", + "rustix 1.1.3", "wayland-backend", "wayland-scanner", ] [[package]] name = "wayland-sys" -version = "0.31.7" +version = "0.31.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" +checksum = "1e6dbfc3ac5ef974c92a2235805cc0114033018ae1290a72e474aa8b28cbbdfd" dependencies = [ "dlib", "log", @@ -7605,9 +7563,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.82" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" +checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" dependencies = [ "js-sys", "wasm-bindgen", @@ -7625,9 +7583,9 @@ dependencies = [ [[package]] name = "weezl" -version = "0.1.10" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" [[package]] name = "wgpu" @@ -7834,7 +7792,7 @@ version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" dependencies = [ - "windows-result", + "windows-result 0.1.2", "windows-targets 0.52.6", ] @@ -7846,10 +7804,23 @@ checksum = "4698e52ed2d08f8658ab0c39512a7c00ee5fe2688c65f8c0a4f06750d729f2a6" dependencies = [ "windows-implement 0.56.0", "windows-interface 0.56.0", - "windows-result", + "windows-result 0.1.2", "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement 0.60.2", + "windows-interface 0.59.3", + "windows-link", + "windows-result 0.4.1", + "windows-strings", +] + [[package]] name = "windows-implement" version = "0.53.0" @@ -7858,7 +7829,7 @@ checksum = "942ac266be9249c84ca862f0a164a39533dc2f6f33dc98ec89c8da99b82ea0bd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -7869,7 +7840,18 @@ checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", ] [[package]] @@ -7880,7 +7862,7 @@ checksum = "da33557140a288fae4e1d5f8873aaf9eb6613a9cf82c3e070223ff177f598b60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -7891,7 +7873,18 @@ checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", ] [[package]] @@ -7909,6 +7902,24 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -8268,9 +8279,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.13" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" dependencies = [ "memchr", ] @@ -8318,7 +8329,7 @@ dependencies = [ "libc", "libloading", "once_cell", - "rustix 1.1.2", + "rustix 1.1.3", "x11rb-protocol", "xcursor", ] @@ -8336,7 +8347,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" dependencies = [ "libc", - "rustix 1.1.2", + "rustix 1.1.3", ] [[package]] @@ -8429,6 +8440,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" +[[package]] +name = "y4m" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" + [[package]] name = "yansi" version = "1.0.1" @@ -8460,7 +8477,7 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", "synstructure", ] @@ -8482,7 +8499,7 @@ dependencies = [ "futures-sink", "futures-util", "hex", - "nix 0.26.4", + "nix", "once_cell", "ordered-stream", "rand 0.8.5", @@ -8502,14 +8519,14 @@ dependencies = [ [[package]] name = "zbus" -version = "5.12.0" +version = "5.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b622b18155f7a93d1cd2dc8c01d2d6a44e08fb9ebb7b3f9e6ed101488bad6c91" +checksum = "1bfeff997a0aaa3eb20c4652baf788d2dfa6d2839a0ead0b3ff69ce2f9c4bdd1" dependencies = [ "async-broadcast 0.7.2", "async-executor", "async-io 2.6.0", - "async-lock 3.4.1", + "async-lock 3.4.2", "async-process 2.5.0", "async-recursion", "async-task", @@ -8520,8 +8537,9 @@ dependencies = [ "futures-core", "futures-lite 2.6.1", "hex", - "nix 0.30.1", + "libc", "ordered-stream", + "rustix 1.1.3", "serde", "serde_repr", "tokio", @@ -8529,10 +8547,10 @@ dependencies = [ "uds_windows", "uuid", "windows-sys 0.61.2", - "winnow 0.7.13", - "zbus_macros 5.12.0", - "zbus_names 4.2.0", - "zvariant 5.8.0", + "winnow 0.7.14", + "zbus_macros 5.13.2", + "zbus_names 4.3.1", + "zvariant 5.9.2", ] [[package]] @@ -8551,17 +8569,17 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.12.0" +version = "5.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cdb94821ca8a87ca9c298b5d1cbd80e2a8b67115d99f6e4551ac49e42b6a314" +checksum = "0bbd5a90dbe8feee5b13def448427ae314ccd26a49cac47905cafefb9ff846f1" dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.109", - "zbus_names 4.2.0", - "zvariant 5.8.0", - "zvariant_utils 3.2.1", + "syn 2.0.114", + "zbus_names 4.3.1", + "zvariant 5.9.2", + "zvariant_utils 3.3.0", ] [[package]] @@ -8577,14 +8595,13 @@ dependencies = [ [[package]] name = "zbus_names" -version = "4.2.0" +version = "4.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" +checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" dependencies = [ "serde", - "static_assertions", - "winnow 0.7.13", - "zvariant 5.8.0", + "winnow 0.7.14", + "zvariant 5.9.2", ] [[package]] @@ -8595,22 +8612,22 @@ checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" [[package]] name = "zerocopy" -version = "0.8.27" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.27" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -8630,7 +8647,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", "synstructure", ] @@ -8645,13 +8662,13 @@ dependencies = [ [[package]] name = "zeroize_derive" -version = "1.4.2" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] @@ -8685,22 +8702,22 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.109", + "syn 2.0.114", ] [[package]] name = "zip" -version = "6.0.0" +version = "7.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb2a05c7c36fde6c09b08576c9f7fb4cda705990f73b58fe011abf7dfb24168b" +checksum = "c42e33efc22a0650c311c2ef19115ce232583abbe80850bc8b66509ebef02de0" dependencies = [ "aes", - "arbitrary", "bzip2", "constant_time_eq", "crc32fast", "deflate64", "flate2", + "generic-array", "getrandom 0.3.4", "hmac", "indexmap", @@ -8710,6 +8727,7 @@ dependencies = [ "ppmd-rust", "sha1", "time", + "typed-path", "zeroize", "zopfli", "zstd", @@ -8717,9 +8735,15 @@ dependencies = [ [[package]] name = "zlib-rs" -version = "0.5.2" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f06ae92f42f5e5c42443fd094f245eb656abf56dd7cce9b8b263236565e00f2" +checksum = "40990edd51aae2c2b6907af74ffb635029d5788228222c4bb811e9351c0caad3" + +[[package]] +name = "zmij" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfcd145825aace48cff44a8844de64bf75feec3080e0aa5cdbde72961ae51a65" [[package]] name = "zopfli" @@ -8767,6 +8791,12 @@ version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" +[[package]] +name = "zune-core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" + [[package]] name = "zune-inflate" version = "0.2.54" @@ -8782,7 +8812,16 @@ version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" dependencies = [ - "zune-core", + "zune-core 0.4.12", +] + +[[package]] +name = "zune-jpeg" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2959ca473aae96a14ecedf501d20b3608d2825ba280d5adb57d651721885b0c2" +dependencies = [ + "zune-core 0.5.1", ] [[package]] @@ -8801,17 +8840,17 @@ dependencies = [ [[package]] name = "zvariant" -version = "5.8.0" +version = "5.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2be61892e4f2b1772727be11630a62664a1826b62efa43a6fe7449521cb8744c" +checksum = "68b64ef4f40c7951337ddc7023dd03528a57a3ce3408ee9da5e948bd29b232c4" dependencies = [ "endi", "enumflags2", "serde", "url", - "winnow 0.7.13", - "zvariant_derive 5.8.0", - "zvariant_utils 3.2.1", + "winnow 0.7.14", + "zvariant_derive 5.9.2", + "zvariant_utils 3.3.0", ] [[package]] @@ -8829,15 +8868,15 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "5.8.0" +version = "5.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da58575a1b2b20766513b1ec59d8e2e68db2745379f961f86650655e862d2006" +checksum = "484d5d975eb7afb52cc6b929c13d3719a20ad650fea4120e6310de3fc55e415c" dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.109", - "zvariant_utils 3.2.1", + "syn 2.0.114", + "zvariant_utils 3.3.0", ] [[package]] @@ -8853,13 +8892,13 @@ dependencies = [ [[package]] name = "zvariant_utils" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6949d142f89f6916deca2232cf26a8afacf2b9fdc35ce766105e104478be599" +checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.109", - "winnow 0.7.13", + "syn 2.0.114", + "winnow 0.7.14", ] diff --git a/Cargo.toml b/Cargo.toml index 4ba2dc0..cbc796c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmic-term" -version = "0.1.0" +version = "1.0.4" authors = ["Jeremy Soller "] edition = "2024" license = "GPL-3.0-only" diff --git a/debian/changelog b/debian/changelog index 3af6df1..4150128 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +cosmic-term (1.0.4) noble; urgency=medium + + * Epoch 1.0.4 version update + + -- Jeremy Soller Wed, 21 Jan 2026 10:18:52 -0700 + cosmic-term (0.1.0) jammy; urgency=medium * Initial release. From 5701260fb59e1432ff297736b58f1616fa138519 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Wed, 21 Jan 2026 21:41:14 +0100 Subject: [PATCH 17/40] i18n: translation updates from weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Aman Alam Co-authored-by: Hosted Weblate Co-authored-by: Jun Hwi Ku Co-authored-by: gift983 <983649@my.leicestercollege.ac.uk> Co-authored-by: lorduskordus Co-authored-by: summoner001 Co-authored-by: 김유빈 Co-authored-by: 현월 Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/cs/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/hu/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/ko/ Translation: Pop OS/COSMIC Term --- i18n/cs/cosmic_term.ftl | 6 +++--- i18n/hu/cosmic_term.ftl | 2 +- i18n/ko/cosmic_term.ftl | 20 ++++++++++++++++++++ i18n/pa/cosmic_term.ftl | 0 i18n/ti/cosmic_term.ftl | 0 5 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 i18n/pa/cosmic_term.ftl create mode 100644 i18n/ti/cosmic_term.ftl diff --git a/i18n/cs/cosmic_term.ftl b/i18n/cs/cosmic_term.ftl index 1a31f1a..728d695 100644 --- a/i18n/cs/cosmic_term.ftl +++ b/i18n/cs/cosmic_term.ftl @@ -1,9 +1,9 @@ settings = Nastavení appearance = Vzhled -theme = Téma +theme = Motiv match-desktop = Podle systému -dark = Tmavé -light = Světlé +dark = Tmavý +light = Světlý file = Soubor quit = Ukončit import = Importovat diff --git a/i18n/hu/cosmic_term.ftl b/i18n/hu/cosmic_term.ftl index 1e63c31..7eb0fda 100644 --- a/i18n/hu/cosmic_term.ftl +++ b/i18n/hu/cosmic_term.ftl @@ -116,4 +116,4 @@ passwords-title = Jelszavak add-password = Jelszó hozzáadása password-input = Jelszó password-input-description = Leírás -open-link = Link megnyitása +open-link = Hivatkozás megnyitása diff --git a/i18n/ko/cosmic_term.ftl b/i18n/ko/cosmic_term.ftl index e69de29..ba2f6bc 100644 --- a/i18n/ko/cosmic_term.ftl +++ b/i18n/ko/cosmic_term.ftl @@ -0,0 +1,20 @@ +new-terminal = 새 터미널 +quit = 나가기 +rename = 이름 바꾸기 +theme = 테마 +appearance = 외관 +name = 이름 +light = 라이트 +delete = 삭제 +repository = 저장소 +support = 지원 +dark = 다크 +match-desktop = 데스크톱에 맞춤 +settings = 설정 +file = 파일 +cosmic-terminal = COSMIC 터미널 +color-schemes = 색 구성표 +import-errors = 가져오기 오류 +import = 가져오기 +profiles = 프로필 +command-line = 명령줄 diff --git a/i18n/pa/cosmic_term.ftl b/i18n/pa/cosmic_term.ftl new file mode 100644 index 0000000..e69de29 diff --git a/i18n/ti/cosmic_term.ftl b/i18n/ti/cosmic_term.ftl new file mode 100644 index 0000000..e69de29 From 60dafc948077e649d86c88d05845f9f8f1658607 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 22 Jan 2026 10:02:21 -0700 Subject: [PATCH 18/40] Update dependencies --- Cargo.lock | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 129485f..3603280 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1430,7 +1430,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" +source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1451,7 +1451,7 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" +source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" dependencies = [ "quote", "syn 2.0.114", @@ -1460,7 +1460,7 @@ dependencies = [ [[package]] name = "cosmic-files" version = "1.0.0" -source = "git+https://github.com/pop-os/cosmic-files.git#452adb960242a9242cb6b2dfd51383c0834ac8fe" +source = "git+https://github.com/pop-os/cosmic-files.git#34a33df5fc54f0543a3e238e88b2527e69d1c038" dependencies = [ "anyhow", "chrono", @@ -1602,7 +1602,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" +source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" dependencies = [ "almost", "cosmic-config", @@ -1969,7 +1969,7 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "dpi" version = "0.1.1" -source = "git+https://github.com/pop-os/winit.git?tag=iced-xdg-surface-0.13-rc#12a5f17d1811cdebbcbd310a3d92965e9142fa12" +source = "git+https://github.com/pop-os/winit.git?tag=iced-xdg-surface-0.13-rc#0c4adf468b8397e5b1dc9183418f56b972916e42" [[package]] name = "drm" @@ -3008,7 +3008,7 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" +source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" dependencies = [ "dnd", "iced_accessibility", @@ -3026,7 +3026,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" +source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" dependencies = [ "accesskit", "accesskit_winit", @@ -3035,7 +3035,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" +source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" dependencies = [ "bitflags 2.10.0", "bytes", @@ -3059,7 +3059,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" +source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" dependencies = [ "futures", "iced_core", @@ -3085,7 +3085,7 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" +source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" dependencies = [ "bitflags 2.10.0", "bytemuck", @@ -3107,7 +3107,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" +source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -3119,7 +3119,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" +source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" dependencies = [ "bytes", "cosmic-client-toolkit", @@ -3134,7 +3134,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" +source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" dependencies = [ "bytemuck", "cosmic-text", @@ -3150,7 +3150,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" +source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" dependencies = [ "as-raw-xcb-connection", "bitflags 2.10.0", @@ -3181,7 +3181,7 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" +source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -3200,7 +3200,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" +source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -4215,7 +4215,7 @@ checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" [[package]] name = "libcosmic" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#689f25be539bb7163fe01dd3daaa253dc212f131" +source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" dependencies = [ "apply", "ashpd 0.12.1", @@ -5644,9 +5644,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.105" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] @@ -8220,7 +8220,7 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winit" version = "0.30.5" -source = "git+https://github.com/pop-os/winit.git?tag=iced-xdg-surface-0.13-rc#12a5f17d1811cdebbcbd310a3d92965e9142fa12" +source = "git+https://github.com/pop-os/winit.git?tag=iced-xdg-surface-0.13-rc#0c4adf468b8397e5b1dc9183418f56b972916e42" dependencies = [ "ahash", "android-activity", @@ -8237,6 +8237,7 @@ dependencies = [ "dpi", "js-sys", "libc", + "libredox", "memmap2 0.9.9", "ndk", "objc2 0.5.2", @@ -8247,7 +8248,7 @@ dependencies = [ "percent-encoding", "pin-project", "raw-window-handle", - "redox_syscall 0.5.18", + "redox_syscall 0.7.0", "rustix 0.38.44", "sctk-adwaita", "smithay-client-toolkit 0.19.2", From 1bf54fef9cfa808c0251266026f6c7b3fbb98656 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Mon, 26 Jan 2026 17:01:53 +0100 Subject: [PATCH 19/40] i18n: translation updates from weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Baurzhan Muftakhidinov Co-authored-by: Benjamin Orno Co-authored-by: Hosted Weblate Co-authored-by: Jun Hwi Ku Co-authored-by: Yelysei Co-authored-by: Димко Co-authored-by: 김유빈 Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/kk/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/ko/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/nl/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/uk/ Translation: Pop OS/COSMIC Term --- i18n/kk/cosmic_term.ftl | 79 +++++++++++++++++++++++++++++++++++++++++ i18n/ko/cosmic_term.ftl | 63 ++++++++++++++++++++++++++++++-- i18n/nl/cosmic_term.ftl | 6 ++-- i18n/uk/cosmic_term.ftl | 28 +++++++-------- 4 files changed, 157 insertions(+), 19 deletions(-) diff --git a/i18n/kk/cosmic_term.ftl b/i18n/kk/cosmic_term.ftl index e69de29..d5ba93d 100644 --- a/i18n/kk/cosmic_term.ftl +++ b/i18n/kk/cosmic_term.ftl @@ -0,0 +1,79 @@ +name = Аты +delete = Өшіру +repository = Репозиторий +support = Қолдау +settings = Баптаулар +appearance = Сыртқы түрі +theme = Тақырып +match-desktop = Жұмыс үстеліне сәйкес келу +dark = Қараңғы +light = Жарық +file = Файл +new-tab = Жаңа бет +new-window = Жаңа терезе +close-tab = Бетті жабу +quit = Шығу +edit = Түзету +copy = Көшіру +paste = Кірістіру +select-all = Барлығын таңдау +view = Көрініс +menu-settings = Баптаулар... +export = Экспорттау +import = Импорттау +default-zoom-step = Масштабтау қадамдары +find-placeholder = Табу... +find-previous = Алдыңғысын табу +find-next = Келесісін табу +find = Табу +cosmic-terminal = COSMIC терминалы +new-terminal = Жаңа терминал +color-schemes = Түстер схемалары +rename = Атын өзгерту +import-errors = Импорттау қателері +profiles = Профильдер +command-line = Командалық жол +tab-title = Бет атауы +tab-title-description = Әдепкі бет атауын алмастыру +add-profile = Профильді қосу +new-profile = Жаңа профиль +make-default = Әдепкі қылып орнату +working-directory = Жұмыс бумасы +hold = Ұстап тұру +remain-open = Туынды процесс аяқталғаннан кейін ашық күйде қалу. +syntax-dark = Қараңғы түстер схемасы +syntax-light = Ашық түстер схемасы +opacity = Фон мөлдірлігі +font = Қаріп +advanced-font-settings = Қаріптің қосымша баптаулары +default-font = Қаріп +default-font-size = Қаріп өлшемі +default-font-stretch = Қаріпті созу +default-font-weight = Қалыпты қаріптің қалыңдығы +default-dim-font-weight = Күңгірт қаріптің қалыңдығы +default-bold-font-weight = Жуан қаріптің қалыңдығы +use-bright-bold = Жуан мәтінді жарықтау қылу +splits = Бөліктер +focus-follow-mouse = Теру фокусы тышқан соңынан ереді +advanced = Қосымша +show-headerbar = Тақырыптаманы көрсету +show-header-description = Оң жақ батырма мәзірі арқылы тақырыптаманы көрсету. +profile = Профиль +menu-profiles = Профильдер... +clear-scrollback = Айналдыру тарихын тазарту +open-link = Сілтемені ашу +zoom-in = Үлкенірек мәтін +zoom-reset = Әдепкі мәтін өлшемі +zoom-out = Кішірек мәтін +next-tab = Келесі бет +previous-tab = Алдыңғы бет +split-horizontal = Горизонталды бөлу +split-vertical = Вертикалды бөлу +pane-toggle-maximize = Толық экран режимін ауыстыру +menu-color-schemes = Түс схемалары... +menu-about = COSMIC терминалы туралы... +menu-password-manager = Парольдер... +passwords-title = Парольдер +add-password = Пароль қосу +password-input = Пароль +password-input-description = Сипаттама diff --git a/i18n/ko/cosmic_term.ftl b/i18n/ko/cosmic_term.ftl index ba2f6bc..bdaae65 100644 --- a/i18n/ko/cosmic_term.ftl +++ b/i18n/ko/cosmic_term.ftl @@ -1,5 +1,5 @@ new-terminal = 새 터미널 -quit = 나가기 +quit = 종료 rename = 이름 바꾸기 theme = 테마 appearance = 외관 @@ -9,7 +9,7 @@ delete = 삭제 repository = 저장소 support = 지원 dark = 다크 -match-desktop = 데스크톱에 맞춤 +match-desktop = 시스템과 동기화 settings = 설정 file = 파일 cosmic-terminal = COSMIC 터미널 @@ -18,3 +18,62 @@ import-errors = 가져오기 오류 import = 가져오기 profiles = 프로필 command-line = 명령줄 +syntax-light = 라이트모드 색 구성표 +default-font-weight = 일반 글꼴 굵기 +add-profile = 프로필 추가 +find-next = 다음 찾기 +splits = 분할 +zoom-in = 텍스트 크게 +select-all = 모두 선택 +previous-tab = 이전 탭 +show-headerbar = 헤더 표시 +new-window = 새 창 +zoom-out = 텍스트 작게 +split-vertical = 세로로 분할 +syntax-dark = 다크모드 색 구성표 +menu-profiles = 프로필... +tab-title-description = 기본 탭 제목 재정의 +menu-about = COSMIC 터미널 정보... +remain-open = 자식 프로세스 종료 후 열린 상태를 유지합니다. +menu-color-schemes = 색 구성표... +working-directory = 작업 디렉터리 +opacity = 배경 투명도 +tab-title = 탭 제목 +zoom-reset = 기본 텍스트 크기 +passwords-title = 암호 +edit = 편집 +copy = 복사 +pane-toggle-maximize = 최대화 전환 +export = 내보내기 +password-input = 암호 +close-tab = 탭 닫기 +default-dim-font-weight = 희미한 글꼴 굵기 +advanced = 고급 +use-bright-bold = 굵은 텍스트를 더 밝게 표시 +default-bold-font-weight = 굵은 글꼴 굵기 +show-header-description = 오른쪽 클릭 메뉴를 통해 헤더를 나타냅니다. +password-input-description = 설명 +default-font = 글꼴 +paste = 붙여넣기 +menu-settings = 설정... +add-password = 암호 추가 +view = 보기 +default-font-stretch = 글꼴 늘이기 +hold = 유지 +menu-password-manager = 암호... +find-previous = 이전 찾기 +default-font-size = 글꼴 크기 +split-horizontal = 가로로 분할 +find-placeholder = 찾기... +focus-follow-mouse = 마우스가 위치한 곳에 입력 +advanced-font-settings = 고급 글꼴 설정 +font = 글꼴 +next-tab = 다음 탭 +default-zoom-step = 확대/축소 간격 +clear-scrollback = 이전 출력 내역 지우기 +open-link = 링크 열기 +make-default = 기본으로 설정 +new-profile = 새 프로필 +find = 찾기 +profile = 프로필 +new-tab = 새 탭 diff --git a/i18n/nl/cosmic_term.ftl b/i18n/nl/cosmic_term.ftl index 159546f..9a22d0f 100644 --- a/i18n/nl/cosmic_term.ftl +++ b/i18n/nl/cosmic_term.ftl @@ -80,7 +80,7 @@ find-next = Zoek volgende file = Bestand new-tab = Nieuw tabblad -new-window = Nieuw venster +new-window = Nieuw venster openen profile = Profiel menu-profiles = Profielen... close-tab = Sluit tabblad @@ -89,7 +89,7 @@ quit = Beëindig ## Edit edit = Bewerk -copy = Kopieer +copy = Kopiëer paste = Plak select-all = Selecteer alles find = Zoek @@ -107,7 +107,7 @@ split-horizontal = Splits horizontaal split-vertical = Splits verticaal pane-toggle-maximize = Gemaximaliseerd menu-color-schemes = Kleurenpaletten... -menu-settings = Instellingen... +menu-settings = Instellingen… menu-about = Over COSMIC Terminal… support = Ondersteuning repository = Bibliotheek diff --git a/i18n/uk/cosmic_term.ftl b/i18n/uk/cosmic_term.ftl index 01f110a..c48df88 100644 --- a/i18n/uk/cosmic_term.ftl +++ b/i18n/uk/cosmic_term.ftl @@ -9,9 +9,9 @@ new-terminal = Новий термінал ## Color schemes -color-schemes = Схеми кольорів +color-schemes = Кольорові схеми rename = Перейменувати -export = Експортувати +export = Експорт delete = Вилучити import = Імпортувати import-errors = Помилки імпорту @@ -21,7 +21,7 @@ import-errors = Помилки імпорту profiles = Профілі name = Назва command-line = Командний рядок -tab-title = Назва вкладки +tab-title = Заголовок вкладки tab-title-description = Замінити типовий заголовок вкладки add-profile = Додати профіль new-profile = Новий профіль @@ -41,27 +41,27 @@ theme = Тема match-desktop = Відповідно системі dark = Темна light = Світла -syntax-dark = Темна схема кольорів -syntax-light = Світла схема кольорів +syntax-dark = Темна колірна схема +syntax-light = Світла колірна схема default-zoom-step = Зміна масштабу opacity = Непрозорість тла ### Font font = Шрифт -advanced-font-settings = Розширені налаштування шрифтів +advanced-font-settings = Розширені налаштування шрифту default-font = Шрифт default-font-size = Розмір шрифту default-font-stretch = Розтягнення шрифту -default-font-weight = Звичайна товщина шрифту -default-dim-font-weight = Товщина тьмяного шрифту -default-bold-font-weight = Товщина жирного шрифту -use-bright-bold = Збільшити яскравість жирного шрифту +default-font-weight = Звичайне накреслення шрифту +default-dim-font-weight = Приглушене накреслення шрифту +default-bold-font-weight = Жирне накреслення шрифту +use-bright-bold = Зробити жирний текст яскравішим ### Splits splits = Розділення -focus-follow-mouse = Ділянка під мишею отримує фокус для введення даних +focus-follow-mouse = Фокус введення слідує за мишею ### Advanced @@ -105,15 +105,15 @@ previous-tab = Попередня вкладка split-horizontal = Розділити горизонтально split-vertical = Розділити вертикально pane-toggle-maximize = Перемкнути розгортання -menu-color-schemes = Схеми кольорів... +menu-color-schemes = Кольорові схеми... menu-settings = Налаштування... menu-about = Про Термінал COSMIC... repository = Репозиторій support = Підтримка -clear-scrollback = Очистити текст поза межами екрану +clear-scrollback = Очистити журнал прокрутки menu-password-manager = Паролі... passwords-title = Паролі add-password = Додати пароль password-input = Пароль password-input-description = Опис -open-link = Відкрити посилання +open-link = Відкрити ланку From e1d1aa5f6d4a9dc6d10164fae566d32f006866b1 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 29 Jan 2026 09:10:03 -0700 Subject: [PATCH 20/40] Fix ligatures with cosmic-text update --- Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 3603280..b47ec80 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1579,7 +1579,7 @@ dependencies = [ [[package]] name = "cosmic-text" version = "0.16.0" -source = "git+https://github.com/pop-os/cosmic-text.git#ee702e50901d90cd842dbd88154687bd2512b52c" +source = "git+https://github.com/pop-os/cosmic-text.git#d907e41bf3e6c66a5666a1ef8eb7f61aaa6054b3" dependencies = [ "bitflags 2.10.0", "fontdb 0.23.0", From d5f1ac4e9190b644f7c8d122ec6a69b8c0e6e9c9 Mon Sep 17 00:00:00 2001 From: nludwig Date: Thu, 29 Jan 2026 20:10:25 -0800 Subject: [PATCH 21/40] place shortcuts in existing config --- justfile | 5 -- .../v1/custom | 1 - src/config.rs | 5 +- src/main.rs | 50 +++++++------------ src/shortcuts.rs | 25 +--------- 5 files changed, 24 insertions(+), 62 deletions(-) delete mode 100644 res/com.system76.CosmicTerm.Shortcuts/v1/custom diff --git a/justfile b/justfile index d1dda03..9835c8e 100644 --- a/justfile +++ b/justfile @@ -23,9 +23,6 @@ metainfo-dst := clean(rootdir / prefix) / 'share' / 'metainfo' / metainfo icons-src := 'res' / 'icons' / 'hicolor' icons-dst := clean(rootdir / prefix) / 'share' / 'icons' / 'hicolor' -shortcuts-src := 'res' / 'com.system76.CosmicTerm.Shortcuts' / 'v1' -shortcuts-dst := clean(rootdir / prefix) / 'share' / 'cosmic' / 'com.system76.CosmicTerm.Shortcuts' / 'v1' - # Default recipe which runs `just build-release` default: build-release @@ -70,8 +67,6 @@ install: install -Dm0755 {{bin-src}} {{bin-dst}} install -Dm0644 {{desktop-src}} {{desktop-dst}} install -Dm0644 {{metainfo-src}} {{metainfo-dst}} - install -Dm0644 {{shortcuts-src}}/defaults {{shortcuts-dst}}/defaults - install -Dm0644 {{shortcuts-src}}/custom {{shortcuts-dst}}/custom for size in `ls {{icons-src}}`; do \ install -Dm0644 "{{icons-src}}/$size/apps/{{APPID}}.svg" "{{icons-dst}}/$size/apps/{{APPID}}.svg"; \ done diff --git a/res/com.system76.CosmicTerm.Shortcuts/v1/custom b/res/com.system76.CosmicTerm.Shortcuts/v1/custom deleted file mode 100644 index 0967ef4..0000000 --- a/res/com.system76.CosmicTerm.Shortcuts/v1/custom +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/src/config.rs b/src/config.rs index 9963994..39e6568 100644 --- a/src/config.rs +++ b/src/config.rs @@ -11,7 +11,7 @@ use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; use std::sync::OnceLock; -use crate::{fl, localize::LANGUAGE_SORTER}; +use crate::{fl, localize::LANGUAGE_SORTER, shortcuts::Shortcuts}; pub const CONFIG_VERSION: u64 = 1; pub const COSMIC_THEME_DARK: &str = "COSMIC Dark"; @@ -236,6 +236,8 @@ pub struct Config { pub syntax_theme_light: String, pub focus_follow_mouse: bool, pub default_profile: Option, + #[serde(default)] + pub shortcuts_custom: Shortcuts, } impl Default for Config { @@ -259,6 +261,7 @@ impl Default for Config { syntax_theme_light: COSMIC_THEME_LIGHT.to_string(), use_bright_bold: false, default_profile: None, + shortcuts_custom: Shortcuts::default(), } } } diff --git a/src/main.rs b/src/main.rs index 70b787c..6fbbcd7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -162,7 +162,10 @@ fn main() -> Result<(), Box> { } }; - let (shortcuts_config_handler, shortcuts_config) = shortcuts::load(); + let shortcuts_config = shortcuts::ShortcutsConfig { + defaults: shortcuts::Shortcuts::default(), + custom: config.shortcuts_custom.clone(), + }; let startup_options = if let Some(shell_program) = shell_program_opt { let options = tty::Options { @@ -192,7 +195,6 @@ fn main() -> Result<(), Box> { let flags = Flags { config_handler, config, - shortcuts_config_handler, shortcuts_config, startup_options, term_config, @@ -220,7 +222,6 @@ Options: pub struct Flags { config_handler: Option, config: Config, - shortcuts_config_handler: Option, shortcuts_config: shortcuts::ShortcutsConfig, startup_options: Option, term_config: term::Config, @@ -351,7 +352,6 @@ pub enum Message { ColorSchemeRenameSubmit, ColorSchemeTabActivate(widget::segmented_button::Entity), Config(Config), - ShortcutsConfig(shortcuts::ShortcutsConfig), Copy(Option), CopyOrSigint(Option), CopyPrimary(Option), @@ -451,7 +451,6 @@ pub struct App { pane_model: TerminalPaneGrid, config_handler: Option, config: Config, - shortcuts_config_handler: Option, shortcuts_config: shortcuts::ShortcutsConfig, key_binds: HashMap, app_themes: Vec, @@ -561,9 +560,13 @@ impl App { } fn save_shortcuts_custom(&mut self) { - match &self.shortcuts_config_handler { + self.config.shortcuts_custom = self.shortcuts_config.custom.clone(); + match &self.config_handler { Some(config_handler) => { - if let Err(err) = config_handler.set("custom", &self.shortcuts_config.custom) { + if let Err(err) = config_handler.set( + "shortcuts_custom", + &self.config.shortcuts_custom, + ) { log::warn!("failed to save shortcuts custom config: {}", err); } } @@ -1705,7 +1708,6 @@ impl Application for App { pane_model, config_handler: flags.config_handler, config: flags.config, - shortcuts_config_handler: flags.shortcuts_config_handler, shortcuts_config: flags.shortcuts_config, key_binds, app_themes, @@ -2023,19 +2025,21 @@ impl Application for App { } Message::Config(config) => { if config != self.config { + let shortcuts_changed = + config.shortcuts_custom != self.config.shortcuts_custom; log::info!("update config"); //TODO: update syntax theme by clearing tabs, only if needed self.config = config; + if shortcuts_changed { + self.shortcuts_config = shortcuts::ShortcutsConfig { + defaults: shortcuts::Shortcuts::default(), + custom: self.config.shortcuts_custom.clone(), + }; + self.key_binds = key_binds(&self.shortcuts_config); + } return self.update_config(); } } - Message::ShortcutsConfig(config) => { - if config != self.shortcuts_config { - log::info!("update shortcuts config"); - self.shortcuts_config = config; - self.key_binds = key_binds(&self.shortcuts_config); - } - } Message::Copy(entity_opt) => { if let Some(tab_model) = self.pane_model.active() { let entity = entity_opt.unwrap_or_else(|| tab_model.active()); @@ -3169,7 +3173,6 @@ impl Application for App { fn subscription(&self) -> Subscription { struct ConfigSubscription; - struct ShortcutsConfigSubscription; struct TerminalEventSubscription; Subscription::batch([ @@ -3216,21 +3219,6 @@ impl Application for App { } Message::Config(update.config) }), - cosmic_config::config_subscription::<_, shortcuts::ShortcutsConfig>( - TypeId::of::(), - shortcuts::SHORTCUTS_CONFIG_ID.into(), - shortcuts::SHORTCUTS_CONFIG_VERSION, - ) - .map(|update| { - if !update.errors.is_empty() { - log::debug!( - "errors loading shortcuts config {:?}: {:?}", - update.keys, - update.errors - ); - } - Message::ShortcutsConfig(update.config) - }), match &self.dialog_opt { Some(dialog) => dialog.subscription(), None => Subscription::none(), diff --git a/src/shortcuts.rs b/src/shortcuts.rs index 024a0f5..c65c00f 100644 --- a/src/shortcuts.rs +++ b/src/shortcuts.rs @@ -2,7 +2,6 @@ use cosmic::widget::menu::key_bind::{KeyBind, Modifier}; use cosmic::{ - cosmic_config::{self, CosmicConfigEntry, cosmic_config_derive::CosmicConfigEntry}, iced::keyboard::{Key, Modifiers}, iced_core::keyboard::key::Named, }; @@ -11,9 +10,6 @@ use std::collections::{BTreeMap, HashMap}; use crate::Action; -pub const SHORTCUTS_CONFIG_ID: &str = "com.system76.CosmicTerm.Shortcuts"; -pub const SHORTCUTS_CONFIG_VERSION: u64 = 1; - #[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub enum ModifierName { Ctrl, @@ -167,7 +163,7 @@ pub struct ResolvedBinding { pub source: BindingSource, } -#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize, CosmicConfigEntry)] +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] pub struct ShortcutsConfig { pub defaults: Shortcuts, pub custom: Shortcuts, @@ -231,25 +227,6 @@ impl ShortcutsConfig { } } -pub fn load() -> (Option, ShortcutsConfig) { - match cosmic_config::Config::new(SHORTCUTS_CONFIG_ID, SHORTCUTS_CONFIG_VERSION) { - Ok(config_handler) => { - let config = match ShortcutsConfig::get_entry(&config_handler) { - Ok(config) => config, - Err((errors, config)) => { - log::info!("errors loading shortcuts config: {:?}", errors); - config - } - }; - (Some(config_handler), config) - } - Err(err) => { - log::error!("failed to create shortcuts config handler: {}", err); - (None, ShortcutsConfig::default()) - } - } -} - pub fn action_label(action: KeyBindAction) -> &'static str { match action { KeyBindAction::Unbind => "Unbind", From 5e7112e794a237a2d4795062960af8e758b68dae Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 30 Jan 2026 21:06:39 +0100 Subject: [PATCH 22/40] i18n: translation updates from weblate Co-authored-by: Hafidz Nasruddin Co-authored-by: Hosted Weblate Co-authored-by: Languages add-on Co-authored-by: Zahid Rizky Fakhri Co-authored-by: lorduskordus Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/cs/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/id/ Translation: Pop OS/COSMIC Term --- i18n/cs/cosmic_term.ftl | 2 +- i18n/id/cosmic_term.ftl | 79 +++++++++++++++++++++++++++++++++++++++++ i18n/ms/cosmic_term.ftl | 0 i18n/uz/cosmic_term.ftl | 0 4 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 i18n/ms/cosmic_term.ftl create mode 100644 i18n/uz/cosmic_term.ftl diff --git a/i18n/cs/cosmic_term.ftl b/i18n/cs/cosmic_term.ftl index 728d695..dd10076 100644 --- a/i18n/cs/cosmic_term.ftl +++ b/i18n/cs/cosmic_term.ftl @@ -44,7 +44,7 @@ splits = Rozdělení focus-follow-mouse = Zaměření psaní sleduje myš advanced = Pokročilé show-headerbar = Zobrazit hlavičku -show-header-description = Hlavičku je možné odkrýt z kontextového menu. +show-header-description = Hlavičku je možné odkrýt z kontextového menu find-placeholder = Najít... find-previous = Najít předchozí find-next = Najít další diff --git a/i18n/id/cosmic_term.ftl b/i18n/id/cosmic_term.ftl index e69de29..51a9c43 100644 --- a/i18n/id/cosmic_term.ftl +++ b/i18n/id/cosmic_term.ftl @@ -0,0 +1,79 @@ +syntax-light = Skema warna terang +new-terminal = Terminal baru +repository = Repositori +support = Dukungan +color-schemes = Skema warna +cosmic-terminal = Terminal COSMIC +rename = Ganti nama +export = Ekspor +delete = Hapus +import = Impor +import-errors = Galat impor +profiles = Profil +name = Nama +command-line = Baris perintah +tab-title = Judul tab +tab-title-description = Timpakan judul tab bawaan +add-profile = Tambahkan profil +new-profile = Profil baru +make-default = Jadikan bawaan +working-directory = Direktori kerja +hold = Tahan +remain-open = Tetap buka setelah proses anak berakhir. +settings = Pengaturan +appearance = Tampilan +theme = Tema +match-desktop = Cocokkan desktop +dark = Gelap +light = Terang +syntax-dark = Skema warna gelap +default-zoom-step = Langkah pembesar +opacity = Opasitas latar belakang +font = Huruf +advanced-font-settings = Pengaturan huruf lanjutan +default-font = Huruf +default-font-size = Ukuran huruf +default-font-stretch = Peregangan huruf +default-font-weight = Bobot huruf normal +default-dim-font-weight = Bobot huruf redup +default-bold-font-weight = Bobot huruf tebal +use-bright-bold = Jadikan teks tebal lebih terang +splits = Pemisahan +focus-follow-mouse = Fokus pengetikan mengikuti tetikus +advanced = Lanjutan +show-header-description = Tampilkan tajuk dari menu klik kanan. +show-headerbar = Tampilkan tajuk +find-placeholder = Temukan... +find-previous = Temukan sebelumnya +find-next = Temukan selanjutnya +file = Berkas +new-tab = Tab baru +new-window = Jendela baru +profile = Profil +menu-profiles = Profil... +close-tab = Tutup tab +quit = Keluar +edit = Sunting +copy = Salin +paste = Tempel +select-all = Pilih semua +find = Temukan +clear-scrollback = Hapus riwayat gulir +open-link = Buka Tautan +view = Tampilan +zoom-in = Teks lebih besar +zoom-reset = Ukuran teks bawaan +zoom-out = Teks lebih kecil +next-tab = Tab selanjutnya +previous-tab = Tab sebelumnya +split-horizontal = Pemisahan horisontal +split-vertical = Pemisahan vertikal +pane-toggle-maximize = Alihkan ke maksimal +menu-color-schemes = Skema warna... +menu-settings = Pengaturan... +menu-about = Tentang Terminal COSMIC... +menu-password-manager = Kata Sandi... +passwords-title = Kata Sandi +add-password = Tambahkan Kata Sandi +password-input = Kata Sandi +password-input-description = Deskripsi diff --git a/i18n/ms/cosmic_term.ftl b/i18n/ms/cosmic_term.ftl new file mode 100644 index 0000000..e69de29 diff --git a/i18n/uz/cosmic_term.ftl b/i18n/uz/cosmic_term.ftl new file mode 100644 index 0000000..e69de29 From d582f56d0fc733bcdee41627bf745aae165075c7 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Fri, 30 Jan 2026 17:16:57 -0700 Subject: [PATCH 23/40] Epoch 1.0.5 version update Generated by cosmic-epoch scripts/version-update.sh --- Cargo.lock | 507 +++++++++++++++++++++++++++++++++++------------ Cargo.toml | 2 +- debian/changelog | 6 + 3 files changed, 390 insertions(+), 125 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b47ec80..cf375ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -391,9 +391,6 @@ dependencies = [ "serde_repr", "tokio", "url", - "wayland-backend", - "wayland-client", - "wayland-protocols", "zbus 5.13.2", ] @@ -1011,9 +1008,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.53" +version = "1.2.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "755d2fce177175ffca841e9a06afdb2c4ab0f593d53b4dee48147dfaade85932" +checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29" dependencies = [ "find-msvc-tools", "jobserver", @@ -1066,6 +1063,7 @@ dependencies = [ "js-sys", "num-traits", "pure-rust-locales", + "serde", "wasm-bindgen", "windows-link", ] @@ -1219,8 +1217,9 @@ dependencies = [ [[package]] name = "compio" -version = "0.17.0" -source = "git+https://github.com/jackpot51/compio.git#8235a1fcccde233362bb76df45b509c12ca79972" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b84ee96a86948d04388f3a0b8c36b9f0a6b40b3528ac0d65737e53632fb37fe" dependencies = [ "compio-buf", "compio-driver", @@ -1233,8 +1232,9 @@ dependencies = [ [[package]] name = "compio-buf" -version = "0.7.1" -source = "git+https://github.com/jackpot51/compio.git#8235a1fcccde233362bb76df45b509c12ca79972" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e8777c3ad31ab42f8a3a4a1bd629b78f688371df9b0f528d94dfbdbe5c945c9" dependencies = [ "arrayvec", "bytes", @@ -1243,8 +1243,9 @@ dependencies = [ [[package]] name = "compio-driver" -version = "0.10.0" -source = "git+https://github.com/jackpot51/compio.git#8235a1fcccde233362bb76df45b509c12ca79972" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "042d449def75fb78af58e53e865dd1343c36255294466e0abd5464b70a525be4" dependencies = [ "cfg-if", "cfg_aliases 0.2.1", @@ -1258,15 +1259,18 @@ dependencies = [ "paste", "pin-project-lite", "polling 3.11.0", - "socket2 0.6.1", + "smallvec", + "socket2 0.6.2", + "synchrony", "thin-cell", "windows-sys 0.61.2", ] [[package]] name = "compio-fs" -version = "0.10.0" -source = "git+https://github.com/jackpot51/compio.git#8235a1fcccde233362bb76df45b509c12ca79972" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65ee36e1acf2cec4835efe9a986c012b2462c5ef53580e4ee84ae6d5a3d8e3b3" dependencies = [ "cfg-if", "cfg_aliases 0.2.1", @@ -1276,24 +1280,28 @@ dependencies = [ "compio-runtime", "libc", "os_pipe", + "pin-project-lite", "widestring", "windows-sys 0.61.2", ] [[package]] name = "compio-io" -version = "0.8.4" -source = "git+https://github.com/jackpot51/compio.git#8235a1fcccde233362bb76df45b509c12ca79972" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b914ea4883d9a5b44b328c04e4d23011f043228b0282d1e4b9100ce6507594cc" dependencies = [ "compio-buf", "futures-util", "paste", + "synchrony", ] [[package]] name = "compio-log" version = "0.1.0" -source = "git+https://github.com/jackpot51/compio.git#8235a1fcccde233362bb76df45b509c12ca79972" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc4e560213c1996b618da369b7c9109564b41af9033802ae534465c4ee4e132f" dependencies = [ "tracing", ] @@ -1301,7 +1309,8 @@ dependencies = [ [[package]] name = "compio-macros" version = "0.1.2" -source = "git+https://github.com/jackpot51/compio.git#8235a1fcccde233362bb76df45b509c12ca79972" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05ed201484967dc70de77a8f7a02b29aaa8e6c81cbea2e75492ee0c8d97766b" dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", @@ -1311,8 +1320,9 @@ dependencies = [ [[package]] name = "compio-runtime" -version = "0.10.1" -source = "git+https://github.com/jackpot51/compio.git#8235a1fcccde233362bb76df45b509c12ca79972" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6c1c71f011bdd9c8f30e97d877b606505ee6d241c7782cfaed172f66acbd9cd" dependencies = [ "async-task", "compio-buf", @@ -1326,7 +1336,7 @@ dependencies = [ "pin-project-lite", "scoped-tls", "slab", - "socket2 0.6.1", + "socket2 0.6.2", "windows-sys 0.61.2", ] @@ -1429,8 +1439,8 @@ dependencies = [ [[package]] name = "cosmic-config" -version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" +version = "1.0.0" +source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1440,7 +1450,7 @@ dependencies = [ "iced_futures", "known-folders", "notify", - "ron", + "ron 0.12.0", "serde", "tokio", "tracing", @@ -1450,8 +1460,8 @@ dependencies = [ [[package]] name = "cosmic-config-derive" -version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" +version = "1.0.0" +source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" dependencies = [ "quote", "syn 2.0.114", @@ -1459,8 +1469,8 @@ dependencies = [ [[package]] name = "cosmic-files" -version = "1.0.0" -source = "git+https://github.com/pop-os/cosmic-files.git#34a33df5fc54f0543a3e238e88b2527e69d1c038" +version = "1.0.4" +source = "git+https://github.com/pop-os/cosmic-files.git#09eb076372c97d6f8d7f3daa58de82eb820e689d" dependencies = [ "anyhow", "chrono", @@ -1470,8 +1480,6 @@ dependencies = [ "env_logger", "flate2", "fork 0.6.0", - "freedesktop_entry_parser", - "futures", "glob", "i18n-embed", "i18n-embed-fl", @@ -1538,6 +1546,19 @@ dependencies = [ "wayland-server", ] +[[package]] +name = "cosmic-settings-config" +version = "0.1.0" +source = "git+https://github.com/pop-os/cosmic-settings-daemon#ef024bfd06bf9fbd57246a25c91d1fdd28153d05" +dependencies = [ + "cosmic-config", + "ron 0.11.0", + "serde", + "serde_with", + "tracing", + "xkbcommon 0.9.0", +] + [[package]] name = "cosmic-settings-daemon" version = "0.1.0" @@ -1548,7 +1569,7 @@ dependencies = [ [[package]] name = "cosmic-term" -version = "1.0.4" +version = "1.0.5" dependencies = [ "alacritty_terminal", "clap_lex", @@ -1559,13 +1580,13 @@ dependencies = [ "i18n-embed", "i18n-embed-fl", "icu", - "indexmap", + "indexmap 2.13.0", "libcosmic", "log", "open", "palette", "paste", - "ron", + "ron 0.11.0", "rust-embed", "secret-service", "secstr", @@ -1578,8 +1599,8 @@ dependencies = [ [[package]] name = "cosmic-text" -version = "0.16.0" -source = "git+https://github.com/pop-os/cosmic-text.git#d907e41bf3e6c66a5666a1ef8eb7f61aaa6054b3" +version = "0.17.1" +source = "git+https://github.com/pop-os/cosmic-text.git#d7dc22dd20773c132814e256fd38fe071ab1b742" dependencies = [ "bitflags 2.10.0", "fontdb 0.23.0", @@ -1587,10 +1608,10 @@ dependencies = [ "linebender_resource_handle", "log", "rangemap", - "rustc-hash 1.1.0", + "rustc-hash 2.1.1", "self_cell", - "skrifa 0.39.0", - "smol_str", + "skrifa 0.40.0", + "smol_str 0.3.2", "swash", "sys-locale", "unicode-bidi", @@ -1601,15 +1622,15 @@ dependencies = [ [[package]] name = "cosmic-theme" -version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" +version = "1.0.0" +source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" dependencies = [ "almost", "cosmic-config", "csscolorparser", "dirs 6.0.0", "palette", - "ron", + "ron 0.12.0", "serde", "serde_json", "thiserror 2.0.18", @@ -1706,12 +1727,14 @@ checksum = "42aaeae719fd78ce501d77c6cdf01f7e96f26bcd5617a4903a1c2b97e388543a" [[package]] name = "csscolorparser" -version = "0.7.2" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fda6aace1fbef3aa217b27f4c8d7d071ef2a70a5ca51050b1f17d40299d3f16" +checksum = "02ee6eae4d99456f92dc379ba21cf08f783ef5525f193c3854b4e921ece045c5" dependencies = [ - "phf 0.11.3", + "num-traits", + "phf 0.13.1", "serde", + "uncased", ] [[package]] @@ -1739,9 +1762,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.11" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" dependencies = [ "darling_core", "darling_macro", @@ -1749,9 +1772,9 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.11" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" dependencies = [ "fnv", "ident_case", @@ -1763,9 +1786,9 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.20.11" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core", "quote", @@ -1791,6 +1814,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ "powerfmt", + "serde_core", ] [[package]] @@ -1806,9 +1830,9 @@ dependencies = [ [[package]] name = "derive_setters" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae5c625eda104c228c06ecaf988d1c60e542176bd7a490e60eeda3493244c0c9" +checksum = "b7e6f6fa1f03c14ae082120b84b3c7fbd7b8588d924cf2d7c3daf9afd49df8b9" dependencies = [ "darling", "proc-macro2", @@ -2010,6 +2034,12 @@ dependencies = [ "linux-raw-sys 0.6.5", ] +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + [[package]] name = "either" version = "1.15.0" @@ -2261,9 +2291,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "fixed_decimal" @@ -2374,6 +2404,15 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "font-types" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4d2d0cf79d38430cc9dc9aadec84774bff2e1ba30ae2bf6c16cfce9385a23" +dependencies = [ + "bytemuck", +] + [[package]] name = "fontconfig-parser" version = "0.5.8" @@ -2466,13 +2505,18 @@ dependencies = [ ] [[package]] -name = "freedesktop_entry_parser" -version = "1.3.0" +name = "freedesktop-desktop-entry" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db9c27b72f19a99a895f8ca89e2d26e4ef31013376e56fdafef697627306c3e4" +checksum = "28273c5c6b97a5f07724f6652f064c0c7f637f9aa5e7c09c83bc3bc4ad4ea245" dependencies = [ - "nom 7.1.3", - "thiserror 1.0.69", + "bstr", + "gettext-rs", + "log", + "memchr", + "thiserror 2.0.18", + "unicase", + "xdg", ] [[package]] @@ -2647,6 +2691,26 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gettext-rs" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5857dc1b7f0fee86961de833f434e29494d72af102ce5355738c0664222bdf" +dependencies = [ + "gettext-sys", + "locale_config", +] + +[[package]] +name = "gettext-sys" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea859ab0dd7e70ff823032b3e077d03d39c965d68c6c10775add60e999d8ee9" +dependencies = [ + "cc", + "temp-dir", +] + [[package]] name = "gif" version = "0.13.3" @@ -2805,17 +2869,23 @@ dependencies = [ [[package]] name = "harfrust" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0caaee032384c10dd597af4579c67dee16650d862a9ccbe1233ff1a379abc07" +checksum = "4f9f40651a03bc0f7316bd75267ff5767e93017ef3cfffe76c6aa7252cc5a31c" dependencies = [ "bitflags 2.10.0", "bytemuck", "core_maths", - "read-fonts 0.36.0", + "read-fonts 0.37.0", "smallvec", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hashbrown" version = "0.15.5" @@ -2983,9 +3053,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.64" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -3008,7 +3078,7 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" +source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" dependencies = [ "dnd", "iced_accessibility", @@ -3026,7 +3096,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" +source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" dependencies = [ "accesskit", "accesskit_winit", @@ -3035,7 +3105,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" +source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" dependencies = [ "bitflags 2.10.0", "bytes", @@ -3050,7 +3120,7 @@ dependencies = [ "raw-window-handle", "rustc-hash 2.1.1", "serde", - "smol_str", + "smol_str 0.2.2", "thiserror 1.0.69", "web-time", "window_clipboard", @@ -3059,7 +3129,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" +source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" dependencies = [ "futures", "iced_core", @@ -3085,7 +3155,7 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" +source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" dependencies = [ "bitflags 2.10.0", "bytemuck", @@ -3107,7 +3177,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" +source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -3119,7 +3189,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" +source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" dependencies = [ "bytes", "cosmic-client-toolkit", @@ -3134,7 +3204,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" +source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" dependencies = [ "bytemuck", "cosmic-text", @@ -3150,7 +3220,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" +source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" dependencies = [ "as-raw-xcb-connection", "bitflags 2.10.0", @@ -3181,7 +3251,7 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" +source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -3200,7 +3270,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" +source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -3685,7 +3755,7 @@ dependencies = [ "rgb", "tiff", "zune-core 0.5.1", - "zune-jpeg 0.5.11", + "zune-jpeg 0.5.12", ] [[package]] @@ -3719,6 +3789,17 @@ dependencies = [ "arrayvec", ] +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + [[package]] name = "indexmap" version = "2.13.0" @@ -4194,6 +4275,12 @@ dependencies = [ "smallvec", ] +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + [[package]] name = "lebe" version = "0.5.3" @@ -4214,8 +4301,8 @@ checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" [[package]] name = "libcosmic" -version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#beddbf17703728182395a13267954d839226331d" +version = "1.0.0" +source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" dependencies = [ "apply", "ashpd 0.12.1", @@ -4224,10 +4311,12 @@ dependencies = [ "cosmic-client-toolkit", "cosmic-config", "cosmic-freedesktop-icons", + "cosmic-settings-config", "cosmic-settings-daemon", "cosmic-theme", "css-color", "derive_setters", + "freedesktop-desktop-entry", "futures", "i18n-embed", "i18n-embed-fl", @@ -4241,13 +4330,17 @@ dependencies = [ "iced_widget", "iced_winit", "image", + "libc", "log", + "mime 0.3.17", "palette", "phf 0.13.1", "raw-window-handle", "rfd", "rust-embed", + "rustix 1.1.3", "serde", + "shlex", "slotmap", "taffy", "thiserror 2.0.18", @@ -4280,9 +4373,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" @@ -4337,6 +4430,19 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" +[[package]] +name = "locale_config" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d2c35b16f4483f6c26f0e4e9550717a2f6575bcd6f12a53ff0c490a94a6934" +dependencies = [ + "lazy_static", + "objc", + "objc-foundation", + "regex", + "winapi", +] + [[package]] name = "lock_api" version = "0.4.14" @@ -4604,7 +4710,7 @@ dependencies = [ "cfg_aliases 0.1.1", "codespan-reporting", "hexf-parse", - "indexmap", + "indexmap 2.13.0", "log", "rustc-hash 1.1.0", "spirv", @@ -4715,9 +4821,9 @@ dependencies = [ [[package]] name = "notify-debouncer-full" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375bd3a138be7bfeff3480e4a623df4cbfb55b79df617c055cd810ba466fa078" +checksum = "c02b49179cfebc9932238d04d6079912d26de0379328872846118a0fa0dbb302" dependencies = [ "file-id", "log", @@ -4728,9 +4834,12 @@ dependencies = [ [[package]] name = "notify-types" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e0826a989adedc2a244799e823aece04662b66609d96af8dff7ac6df9a8925d" +checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" +dependencies = [ + "bitflags 2.10.0", +] [[package]] name = "num" @@ -5185,7 +5294,7 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfa78c92071bbd3628c22b1a964f7e0eb201dc1456555db072beb1662ecd6715" dependencies = [ - "indexmap", + "indexmap 2.13.0", "serde", "serde_core", ] @@ -5411,6 +5520,7 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.114", + "uncased", ] [[package]] @@ -5429,6 +5539,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" dependencies = [ "siphasher", + "uncased", ] [[package]] @@ -5582,9 +5693,9 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppmd-rust" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d558c559f0450f16f2a27a1f017ef38468c1090c9ce63c8e51366232d53717b4" +checksum = "efca4c95a19a79d1c98f791f10aebd5c1363b473244630bb7dbde1dc98455a24" [[package]] name = "ppv-lite86" @@ -5758,9 +5869,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.43" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" dependencies = [ "proc-macro2", ] @@ -5925,18 +6036,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6717cf23b488adf64b9d711329542ba34de147df262370221940dfabc2c91358" dependencies = [ "bytemuck", - "font-types", + "font-types 0.10.1", ] [[package]] name = "read-fonts" -version = "0.36.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eaa2941a4c05443ee3a7b26ab076a553c343ad5995230cc2b1d3e993bdc6345" +checksum = "7b634fabf032fab15307ffd272149b622260f55974d9fad689292a5d33df02e5" dependencies = [ "bytemuck", "core_maths", - "font-types", + "font-types 0.11.0", ] [[package]] @@ -6003,6 +6114,26 @@ dependencies = [ "thiserror 2.0.18", ] +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "regex" version = "1.12.2" @@ -6056,9 +6187,9 @@ dependencies = [ [[package]] name = "rfd" -version = "0.15.4" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" +checksum = "a15ad77d9e70a92437d8f74c35d99b4e4691128df018833e99f90bcd36152672" dependencies = [ "ashpd 0.11.1", "block2 0.6.2", @@ -6075,7 +6206,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -6100,6 +6231,20 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "ron" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd490c5b18261893f14449cbd28cb9c0b637aebf161cd77900bfdedaff21ec32" +dependencies = [ + "bitflags 2.10.0", + "once_cell", + "serde", + "serde_derive", + "typeid", + "unicode-ident", +] + [[package]] name = "roxmltree" version = "0.20.0" @@ -6234,6 +6379,30 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54e910108742c57a770f492731f99be216a52fadd361b06c8fb59d74ccc267d2" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -6329,7 +6498,7 @@ version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ - "indexmap", + "indexmap 2.13.0", "itoa", "memchr", "serde", @@ -6348,6 +6517,37 @@ dependencies = [ "syn 2.0.114", ] +[[package]] +name = "serde_with" +version = "3.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" +dependencies = [ + "base64", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.13.0", + "schemars 0.9.0", + "schemars 1.2.0", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "sha1" version = "0.10.6" @@ -6422,9 +6622,9 @@ dependencies = [ [[package]] name = "siphasher" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" [[package]] name = "skrifa" @@ -6438,12 +6638,12 @@ dependencies = [ [[package]] name = "skrifa" -version = "0.39.0" +version = "0.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9eb0b904a04d09bd68c65d946617b8ff733009999050f3b851c32fb3cfb60e" +checksum = "7fbdfe3d2475fbd7ddd1f3e5cf8288a30eb3e5f95832829570cd88115a7434ac" dependencies = [ "bytemuck", - "read-fonts 0.36.0", + "read-fonts 0.37.0", ] [[package]] @@ -6542,6 +6742,12 @@ dependencies = [ "serde", ] +[[package]] +name = "smol_str" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9676b89cd56310a87b93dec47b11af744f34d5fc9f367b829474eec0a891350d" + [[package]] name = "socket2" version = "0.4.10" @@ -6554,9 +6760,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" dependencies = [ "libc", "windows-sys 0.60.2", @@ -6692,6 +6898,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "synchrony" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de0208d3660701622272151bc63c35f5d32ca3d45c19785a9a8dc04dc797dc43" +dependencies = [ + "futures-util", +] + [[package]] name = "synstructure" version = "0.13.2" @@ -6735,6 +6950,12 @@ dependencies = [ "xattr", ] +[[package]] +name = "temp-dir" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83176759e9416cf81ee66cb6508dbfe9c96f20b8b56265a39917551c23c70964" + [[package]] name = "tempfile" version = "3.24.0" @@ -6824,11 +7045,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9e442fc33d7fdb45aa9bfeb312c095964abdf596f7567261062b2a7107aaabd" dependencies = [ "deranged", + "itoa", "js-sys", "num-conv", "powerfmt", "serde_core", "time-core", + "time-macros", ] [[package]] @@ -6837,6 +7060,16 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b36ee98fd31ec7426d599183e8fe26932a8dc1fb76ddb6214d05493377d34ca" +[[package]] +name = "time-macros" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e552d1249bf61ac2a52db88179fd0673def1e1ad8243a00d9ec9ed71fee3dd" +dependencies = [ + "num-conv", + "time-core", +] + [[package]] name = "tiny-skia" version = "0.11.4" @@ -6913,7 +7146,7 @@ dependencies = [ "mio", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.1", + "socket2 0.6.2", "tokio-macros", "tracing", "windows-sys 0.61.2", @@ -6971,7 +7204,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap", + "indexmap 2.13.0", "toml_datetime 0.6.11", "winnow 0.5.40", ] @@ -6982,7 +7215,7 @@ version = "0.23.10+spec-1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" dependencies = [ - "indexmap", + "indexmap 2.13.0", "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", "winnow 0.7.14", @@ -7072,9 +7305,15 @@ dependencies = [ [[package]] name = "typed-path" -version = "0.12.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7922f2cdc51280d47b491af9eafc41eb0cdab85eabcb390c854412fcbf26dbe8" +checksum = "3015e6ce46d5ad8751e4a772543a30c7511468070e98e64e20165f8f81155b64" + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" @@ -7093,6 +7332,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "uncased" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697" +dependencies = [ + "version_check", +] + [[package]] name = "unic-langid" version = "0.9.6" @@ -7256,9 +7504,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f" dependencies = [ "js-sys", "serde_core", @@ -7623,7 +7871,7 @@ dependencies = [ "bitflags 2.10.0", "cfg_aliases 0.1.1", "document-features", - "indexmap", + "indexmap 2.13.0", "log", "naga", "once_cell", @@ -8252,7 +8500,7 @@ dependencies = [ "rustix 0.38.44", "sctk-adwaita", "smithay-client-toolkit 0.19.2", - "smol_str", + "smol_str 0.2.2", "tracing", "unicode-segmentation", "wasm-bindgen", @@ -8407,6 +8655,17 @@ dependencies = [ "xkeysym", ] +[[package]] +name = "xkbcommon" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a974f48060a14e95705c01f24ad9c3345022f4d97441b8a36beb7ed5c4a02d" +dependencies = [ + "libc", + "memmap2 0.9.9", + "xkeysym", +] + [[package]] name = "xkbcommon-dl" version = "0.4.2" @@ -8613,18 +8872,18 @@ checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" [[package]] name = "zerocopy" -version = "0.8.33" +version = "0.8.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd" +checksum = "7456cf00f0685ad319c5b1693f291a650eaf345e941d082fc4e03df8a03996ac" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.33" +version = "0.8.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1" +checksum = "1328722bbf2115db7e19d69ebcc15e795719e2d66b60827c6a69a117365e37a0" dependencies = [ "proc-macro2", "quote", @@ -8721,7 +8980,7 @@ dependencies = [ "generic-array", "getrandom 0.3.4", "hmac", - "indexmap", + "indexmap 2.13.0", "lzma-rust2", "memchr", "pbkdf2", @@ -8742,9 +9001,9 @@ checksum = "40990edd51aae2c2b6907af74ffb635029d5788228222c4bb811e9351c0caad3" [[package]] name = "zmij" -version = "1.0.16" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfcd145825aace48cff44a8844de64bf75feec3080e0aa5cdbde72961ae51a65" +checksum = "1966f8ac2c1f76987d69a74d0e0f929241c10e78136434e3be70ff7f58f64214" [[package]] name = "zopfli" @@ -8818,9 +9077,9 @@ dependencies = [ [[package]] name = "zune-jpeg" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2959ca473aae96a14ecedf501d20b3608d2825ba280d5adb57d651721885b0c2" +checksum = "410e9ecef634c709e3831c2cfdb8d9c32164fae1c67496d5b68fff728eec37fe" dependencies = [ "zune-core 0.5.1", ] diff --git a/Cargo.toml b/Cargo.toml index cbc796c..c6c3f33 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmic-term" -version = "1.0.4" +version = "1.0.5" authors = ["Jeremy Soller "] edition = "2024" license = "GPL-3.0-only" diff --git a/debian/changelog b/debian/changelog index 4150128..71e3402 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +cosmic-term (1.0.5) noble; urgency=medium + + * Epoch 1.0.5 version update + + -- Jeremy Soller Fri, 30 Jan 2026 17:16:48 -0700 + cosmic-term (1.0.4) noble; urgency=medium * Epoch 1.0.4 version update From cc27b6ab30b9dd55e903bf37da3b026909836206 Mon Sep 17 00:00:00 2001 From: nludwig Date: Mon, 2 Feb 2026 15:20:28 -0800 Subject: [PATCH 24/40] fix localization --- i18n/en/cosmic_term.ftl | 24 +++++++++++ src/main.rs | 12 +++--- src/shortcuts.rs | 90 ++++++++++++++++++++--------------------- 3 files changed, 75 insertions(+), 51 deletions(-) diff --git a/i18n/en/cosmic_term.ftl b/i18n/en/cosmic_term.ftl index 88ed838..6b8ce21 100644 --- a/i18n/en/cosmic_term.ftl +++ b/i18n/en/cosmic_term.ftl @@ -62,6 +62,30 @@ advanced = Advanced show-headerbar = Show header show-header-description = Reveal the header from the right-click menu. +### Keyboard shortcuts +keyboard-shortcuts = Keyboard shortcuts +customize-shortcuts = Customize shortcuts +shortcut-capture-hint = Press new shortcut, or Esc to cancel +cancel = Cancel +no-shortcuts = No shortcuts +add-shortcut = + Add +shortcut-group-clipboard = Clipboard +shortcut-group-tabs = Tabs +shortcut-group-window = Window +shortcut-group-zoom = Zoom +shortcut-group-other = Other +unbind = Unbind +copy-or-sigint = Copy or SIGINT +paste-primary = Paste primary +focus-pane-left = Focus pane left +focus-pane-right = Focus pane right +focus-pane-up = Focus pane up +focus-pane-down = Focus pane down +toggle-fullscreen = Toggle fullscreen +close-window = Close window +password-manager = Password manager +tab-activate = Activate tab { $number } + # Find find-placeholder = Find... find-previous = Find previous diff --git a/src/main.rs b/src/main.rs index 6fbbcd7..c37f08a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1286,9 +1286,9 @@ impl App { ); let mut shortcuts_section = widget::settings::section() - .title("Keyboard shortcuts") + .title(fl!("keyboard-shortcuts")) .add( - widget::settings::item::builder("Customize shortcuts").control( + widget::settings::item::builder(fl!("customize-shortcuts")).control( if self.show_keyboard_shortcuts { widget::button::custom(icon_cache_get("go-up-symbolic", 16)) .on_press(Message::KeyboardShortcuts(false)) @@ -1314,10 +1314,10 @@ impl App { if self.shortcut_capture == Some(action) { rows.push( widget::row::with_children(vec![ - widget::text::body("Press new shortcut, or Esc to cancel") + widget::text::body(fl!("shortcut-capture-hint")) .into(), widget::horizontal_space().into(), - widget::button::standard("Cancel") + widget::button::standard(fl!("cancel")) .on_press(Message::ShortcutCaptureCancel) .into(), ]) @@ -1327,7 +1327,7 @@ impl App { } if bindings.is_empty() { - rows.push(widget::text::body("No shortcuts").into()); + rows.push(widget::text::body(fl!("no-shortcuts")).into()); } else { for resolved in bindings { let binding_text = widget::text::body( @@ -1363,7 +1363,7 @@ impl App { rows.push( widget::row::with_children(vec![ widget::horizontal_space().into(), - widget::button::standard("+ Add") + widget::button::standard(fl!("add-shortcut")) .on_press(Message::ShortcutCaptureStart(action)) .into(), ]) diff --git a/src/shortcuts.rs b/src/shortcuts.rs index c65c00f..74c9ac7 100644 --- a/src/shortcuts.rs +++ b/src/shortcuts.rs @@ -8,7 +8,7 @@ use cosmic::{ use serde::{Deserialize, Serialize}; use std::collections::{BTreeMap, HashMap}; -use crate::Action; +use crate::{Action, fl}; #[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub enum ModifierName { @@ -227,56 +227,56 @@ impl ShortcutsConfig { } } -pub fn action_label(action: KeyBindAction) -> &'static str { +pub fn action_label(action: KeyBindAction) -> String { match action { - KeyBindAction::Unbind => "Unbind", - KeyBindAction::ClearScrollback => "Clear scrollback", - KeyBindAction::Copy => "Copy", - KeyBindAction::CopyOrSigint => "Copy or SIGINT", - KeyBindAction::Find => "Find", - KeyBindAction::PaneFocusDown => "Focus pane down", - KeyBindAction::PaneFocusLeft => "Focus pane left", - KeyBindAction::PaneFocusRight => "Focus pane right", - KeyBindAction::PaneFocusUp => "Focus pane up", - KeyBindAction::PaneSplitHorizontal => "Split pane horizontally", - KeyBindAction::PaneSplitVertical => "Split pane vertically", - KeyBindAction::PaneToggleMaximized => "Toggle pane maximized", - KeyBindAction::Paste => "Paste", - KeyBindAction::PastePrimary => "Paste primary", - KeyBindAction::PasswordManager => "Password manager", - KeyBindAction::SelectAll => "Select all", - KeyBindAction::Settings => "Settings", - KeyBindAction::TabActivate0 => "Activate tab 1", - KeyBindAction::TabActivate1 => "Activate tab 2", - KeyBindAction::TabActivate2 => "Activate tab 3", - KeyBindAction::TabActivate3 => "Activate tab 4", - KeyBindAction::TabActivate4 => "Activate tab 5", - KeyBindAction::TabActivate5 => "Activate tab 6", - KeyBindAction::TabActivate6 => "Activate tab 7", - KeyBindAction::TabActivate7 => "Activate tab 8", - KeyBindAction::TabActivate8 => "Activate tab 9", - KeyBindAction::TabClose => "Close tab", - KeyBindAction::TabNew => "New tab", - KeyBindAction::TabNext => "Next tab", - KeyBindAction::TabPrev => "Previous tab", - KeyBindAction::ToggleFullscreen => "Toggle fullscreen", - KeyBindAction::WindowClose => "Close window", - KeyBindAction::WindowNew => "New window", - KeyBindAction::ZoomIn => "Zoom in", - KeyBindAction::ZoomOut => "Zoom out", - KeyBindAction::ZoomReset => "Reset zoom", + KeyBindAction::Unbind => fl!("unbind"), + KeyBindAction::ClearScrollback => fl!("clear-scrollback"), + KeyBindAction::Copy => fl!("copy"), + KeyBindAction::CopyOrSigint => fl!("copy-or-sigint"), + KeyBindAction::Find => fl!("find"), + KeyBindAction::PaneFocusDown => fl!("focus-pane-down"), + KeyBindAction::PaneFocusLeft => fl!("focus-pane-left"), + KeyBindAction::PaneFocusRight => fl!("focus-pane-right"), + KeyBindAction::PaneFocusUp => fl!("focus-pane-up"), + KeyBindAction::PaneSplitHorizontal => fl!("split-horizontal"), + KeyBindAction::PaneSplitVertical => fl!("split-vertical"), + KeyBindAction::PaneToggleMaximized => fl!("pane-toggle-maximize"), + KeyBindAction::Paste => fl!("paste"), + KeyBindAction::PastePrimary => fl!("paste-primary"), + KeyBindAction::PasswordManager => fl!("password-manager"), + KeyBindAction::SelectAll => fl!("select-all"), + KeyBindAction::Settings => fl!("settings"), + KeyBindAction::TabActivate0 => fl!("tab-activate", number = 1), + KeyBindAction::TabActivate1 => fl!("tab-activate", number = 2), + KeyBindAction::TabActivate2 => fl!("tab-activate", number = 3), + KeyBindAction::TabActivate3 => fl!("tab-activate", number = 4), + KeyBindAction::TabActivate4 => fl!("tab-activate", number = 5), + KeyBindAction::TabActivate5 => fl!("tab-activate", number = 6), + KeyBindAction::TabActivate6 => fl!("tab-activate", number = 7), + KeyBindAction::TabActivate7 => fl!("tab-activate", number = 8), + KeyBindAction::TabActivate8 => fl!("tab-activate", number = 9), + KeyBindAction::TabClose => fl!("close-tab"), + KeyBindAction::TabNew => fl!("new-tab"), + KeyBindAction::TabNext => fl!("next-tab"), + KeyBindAction::TabPrev => fl!("previous-tab"), + KeyBindAction::ToggleFullscreen => fl!("toggle-fullscreen"), + KeyBindAction::WindowClose => fl!("close-window"), + KeyBindAction::WindowNew => fl!("new-window"), + KeyBindAction::ZoomIn => fl!("zoom-in"), + KeyBindAction::ZoomOut => fl!("zoom-out"), + KeyBindAction::ZoomReset => fl!("zoom-reset"), } } pub struct ShortcutGroup { - pub title: &'static str, + pub title: String, pub actions: Vec, } pub fn shortcut_groups() -> Vec { let mut groups = Vec::new(); groups.push(ShortcutGroup { - title: "Clipboard", + title: fl!("shortcut-group-clipboard"), actions: vec![ KeyBindAction::SelectAll, KeyBindAction::Copy, @@ -287,7 +287,7 @@ pub fn shortcut_groups() -> Vec { ], }); groups.push(ShortcutGroup { - title: "Tabs", + title: fl!("shortcut-group-tabs"), actions: vec![ KeyBindAction::TabNew, KeyBindAction::TabClose, @@ -305,7 +305,7 @@ pub fn shortcut_groups() -> Vec { ], }); groups.push(ShortcutGroup { - title: "Splits", + title: fl!("splits"), actions: vec![ KeyBindAction::PaneSplitHorizontal, KeyBindAction::PaneSplitVertical, @@ -317,7 +317,7 @@ pub fn shortcut_groups() -> Vec { ], }); groups.push(ShortcutGroup { - title: "Window", + title: fl!("shortcut-group-window"), actions: vec![ KeyBindAction::WindowNew, KeyBindAction::WindowClose, @@ -326,7 +326,7 @@ pub fn shortcut_groups() -> Vec { ], }); groups.push(ShortcutGroup { - title: "Zoom", + title: fl!("shortcut-group-zoom"), actions: vec![ KeyBindAction::ZoomIn, KeyBindAction::ZoomOut, @@ -337,7 +337,7 @@ pub fn shortcut_groups() -> Vec { #[cfg(feature = "password_manager")] other_actions.push(KeyBindAction::PasswordManager); groups.push(ShortcutGroup { - title: "Other", + title: fl!("shortcut-group-other"), actions: other_actions, }); groups From 54b99741e8911e382b4e5e7ae22709319b928310 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Wed, 28 Jan 2026 20:08:44 -0500 Subject: [PATCH 25/40] feat: tab dnd --- Cargo.lock | 98 ++++++++++++++++++++++++++--------------------------- src/main.rs | 20 +++++++++++ 2 files changed, 69 insertions(+), 49 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cf375ab..950108f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -322,9 +322,9 @@ checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" [[package]] name = "arc-swap" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d03449bb8ca2cc2ef70869af31463d1ae5ccc8fa3e334b307203fbf815207e" +checksum = "9ded5f9a03ac8f24d1b8a25101ee812cd32cdc8c50a4c50237de2c4915850e73" dependencies = [ "rustversion", ] @@ -891,9 +891,9 @@ checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" [[package]] name = "bytemuck" -version = "1.24.0" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" dependencies = [ "bytemuck_derive", ] @@ -923,9 +923,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "bzip2" @@ -1440,7 +1440,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1461,7 +1461,7 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "quote", "syn 2.0.114", @@ -1469,8 +1469,8 @@ dependencies = [ [[package]] name = "cosmic-files" -version = "1.0.4" -source = "git+https://github.com/pop-os/cosmic-files.git#09eb076372c97d6f8d7f3daa58de82eb820e689d" +version = "1.0.5" +source = "git+https://github.com/pop-os/cosmic-files.git#40f19b0d02e308676aa0ae4c05a670bd0b692607" dependencies = [ "anyhow", "chrono", @@ -1549,7 +1549,7 @@ dependencies = [ [[package]] name = "cosmic-settings-config" version = "0.1.0" -source = "git+https://github.com/pop-os/cosmic-settings-daemon#ef024bfd06bf9fbd57246a25c91d1fdd28153d05" +source = "git+https://github.com/pop-os/cosmic-settings-daemon#020c4addd71fdca9ef3eda21039d6db27f7c31e5" dependencies = [ "cosmic-config", "ron 0.11.0", @@ -1623,7 +1623,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "almost", "cosmic-config", @@ -1727,9 +1727,9 @@ checksum = "42aaeae719fd78ce501d77c6cdf01f7e96f26bcd5617a4903a1c2b97e388543a" [[package]] name = "csscolorparser" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02ee6eae4d99456f92dc379ba21cf08f783ef5525f193c3854b4e921ece045c5" +checksum = "64a878cfd6075649977f548ed439564cfdbe1f190a6656a00b48af7740f2f148" dependencies = [ "num-traits", "phf 0.13.1", @@ -1739,9 +1739,9 @@ dependencies = [ [[package]] name = "ctor-lite" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f791803201ab277ace03903de1594460708d2d54df6053f2d9e82f592b19e3b" +checksum = "b29fccfdaeb0f9bd90da5759b1d0eaa2f6cfcfe90960124cfc83141ed4e111fd" [[package]] name = "cursor-icon" @@ -2308,9 +2308,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b375d6465b98090a5f25b1c7703f3859783755aa9a80433b36e0379a3ec2f369" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", "miniz_oxide", @@ -3078,7 +3078,7 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "dnd", "iced_accessibility", @@ -3096,7 +3096,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "accesskit", "accesskit_winit", @@ -3105,7 +3105,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "bitflags 2.10.0", "bytes", @@ -3129,7 +3129,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "futures", "iced_core", @@ -3155,7 +3155,7 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "bitflags 2.10.0", "bytemuck", @@ -3177,7 +3177,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -3189,7 +3189,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "bytes", "cosmic-client-toolkit", @@ -3204,7 +3204,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "bytemuck", "cosmic-text", @@ -3220,7 +3220,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "as-raw-xcb-connection", "bitflags 2.10.0", @@ -3251,7 +3251,7 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -3270,7 +3270,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -4302,7 +4302,7 @@ checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" [[package]] name = "libcosmic" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "apply", "ashpd 0.12.1", @@ -5661,15 +5661,15 @@ checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" [[package]] name = "portable-atomic" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" dependencies = [ "portable-atomic", ] @@ -6136,9 +6136,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.12.2" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", @@ -6148,9 +6148,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -6159,9 +6159,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" [[package]] name = "renderdoc-sys" @@ -6393,9 +6393,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e910108742c57a770f492731f99be216a52fadd361b06c8fb59d74ccc267d2" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" dependencies = [ "dyn-clone", "ref-cast", @@ -6529,7 +6529,7 @@ dependencies = [ "indexmap 1.9.3", "indexmap 2.13.0", "schemars 0.9.0", - "schemars 1.2.0", + "schemars 1.2.1", "serde_core", "serde_json", "serde_with_macros", @@ -6648,9 +6648,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "slotmap" @@ -8995,15 +8995,15 @@ dependencies = [ [[package]] name = "zlib-rs" -version = "0.5.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40990edd51aae2c2b6907af74ffb635029d5788228222c4bb811e9351c0caad3" +checksum = "a7948af682ccbc3342b6e9420e8c51c1fe5d7bf7756002b4a3c6cabfe96a7e3c" [[package]] name = "zmij" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1966f8ac2c1f76987d69a74d0e0f929241c10e78136434e3be70ff7f58f64214" +checksum = "3ff05f8caa9038894637571ae6b9e29466c1f4f829d26c9b28f869a29cbe3445" [[package]] name = "zopfli" diff --git a/src/main.rs b/src/main.rs index 422fe57..0ff88c3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,8 @@ use alacritty_terminal::{event::Event as TermEvent, term, term::color::Colors as use cosmic::iced::clipboard::dnd::DndAction; use cosmic::widget::menu::action::MenuAction; use cosmic::widget::menu::key_bind::KeyBind; +use cosmic::widget::pane_grid::Pane; +use cosmic::widget::segmented_button::ReorderEvent; use cosmic::{ Application, ApplicationExt, Element, action, app::{Core, Settings, Task, context_drawer}, @@ -390,6 +392,7 @@ pub enum Message { ProfileRemove(ProfileId), ProfileSyntaxTheme(ProfileId, ColorSchemeKind, usize), ProfileTabTitle(ProfileId, String), + ReorderTab(Pane, ReorderEvent), Surface(surface::Action), SelectAll(Option), ShowAdvancedFontSettings(bool), @@ -2751,6 +2754,20 @@ impl Application for App { cosmic::app::Action::Surface(a), )); } + Message::ReorderTab( + pane, + ReorderEvent { + dragged, + target, + position, + }, + ) => { + let Some(p) = self.pane_model.panes.get_mut(pane) else { + log::error!("Failed to find reordered tab model."); + return Task::none(); + }; + _ = p.reorder(dragged, target, position); + } } Task::none() @@ -2823,6 +2840,9 @@ impl Application for App { tab_column = tab_column.push( widget::container( widget::tab_bar::horizontal(tab_model) + .enable_tab_drag(String::from("x-cosmic-term/tab")) + .on_reorder(move |event| Message::ReorderTab(pane, event)) + .tab_drag_threshold(25.) .button_height(32) .button_spacing(space_xxs) .on_activate(Message::TabActivate) From 70e0f5a5f26103ff20441cb0f0a881363955dfe1 Mon Sep 17 00:00:00 2001 From: nludwig Date: Tue, 3 Feb 2026 22:08:34 -0800 Subject: [PATCH 26/40] add dialog box when replacing existing keybind --- i18n/en/cosmic_term.ftl | 3 ++ src/main.rs | 103 +++++++++++++++++++++++++++++++++++++++- src/shortcuts.rs | 12 +++++ 3 files changed, 116 insertions(+), 2 deletions(-) diff --git a/i18n/en/cosmic_term.ftl b/i18n/en/cosmic_term.ftl index 6b8ce21..ba0a5bd 100644 --- a/i18n/en/cosmic_term.ftl +++ b/i18n/en/cosmic_term.ftl @@ -67,6 +67,9 @@ keyboard-shortcuts = Keyboard shortcuts customize-shortcuts = Customize shortcuts shortcut-capture-hint = Press new shortcut, or Esc to cancel cancel = Cancel +replace = Replace +shortcut-replace-title = Replace shortcut? +shortcut-replace-body = { $binding } is already assigned to { $existing }. Replace it with { $new_action }? no-shortcuts = No shortcuts add-shortcut = + Add shortcut-group-clipboard = Clipboard diff --git a/src/main.rs b/src/main.rs index c37f08a..a627f82 100644 --- a/src/main.rs +++ b/src/main.rs @@ -377,6 +377,8 @@ pub enum Message { Modifiers(Modifiers), ShortcutCaptureCancel, ShortcutCaptureStart(shortcuts::KeyBindAction), + ShortcutConflictCancel, + ShortcutConflictReplace, ShortcutRemove(shortcuts::Binding, shortcuts::BindingSource), MouseEnter(pane_grid::Pane), Opacity(u8), @@ -444,6 +446,13 @@ pub enum ContextPage { PasswordManager, } +#[derive(Clone, Debug)] +struct ShortcutConflict { + binding: shortcuts::Binding, + existing_action: shortcuts::KeyBindAction, + new_action: shortcuts::KeyBindAction, +} + /// The [`App`] stores application-specific state. pub struct App { core: Core, @@ -488,6 +497,8 @@ pub struct App { show_advanced_font_settings: bool, show_keyboard_shortcuts: bool, shortcut_capture: Option, + shortcut_conflict: Option, + shortcut_conflict_overlay_restore: Option, modifiers: Modifiers, #[cfg(feature = "password_manager")] password_mgr: password_manager::PasswordManager, @@ -577,6 +588,37 @@ impl App { self.key_binds = key_binds(&self.shortcuts_config); } + fn apply_shortcut_binding( + &mut self, + binding: shortcuts::Binding, + action: shortcuts::KeyBindAction, + ) { + self.shortcuts_config.custom.0.insert(binding, action); + self.save_shortcuts_custom(); + } + + fn set_context_overlay(&mut self, overlay: bool) { + if self.core.window.context_is_overlay != overlay { + self.core.window.context_is_overlay = overlay; + self.core.set_show_context(self.core.window.show_context); + } + } + + fn begin_shortcut_conflict(&mut self, conflict: ShortcutConflict) { + if self.shortcut_conflict.is_none() { + self.shortcut_conflict_overlay_restore = Some(self.core.window.context_is_overlay); + self.set_context_overlay(false); + } + self.shortcut_conflict = Some(conflict); + } + + fn clear_shortcut_conflict(&mut self) { + self.shortcut_conflict = None; + if let Some(overlay) = self.shortcut_conflict_overlay_restore.take() { + self.set_context_overlay(overlay); + } + } + fn update_config(&mut self) -> Task { let theme = self.config.app_theme.theme(); @@ -1744,6 +1786,8 @@ impl Application for App { show_advanced_font_settings: false, show_keyboard_shortcuts: false, shortcut_capture: None, + shortcut_conflict: None, + shortcut_conflict_overlay_restore: None, modifiers: Modifiers::empty(), #[cfg(feature = "password_manager")] password_mgr: Default::default(), @@ -2284,6 +2328,12 @@ impl Application for App { config_set!(focus_follow_mouse, focus_follow_mouse); } Message::Key(modifiers, key) => { + if self.shortcut_conflict.is_some() { + if key == Key::Named(Named::Escape) { + self.clear_shortcut_conflict(); + } + return Task::none(); + } if let Some(action) = self.shortcut_capture { if key == Key::Named(Named::Escape) { self.shortcut_capture = None; @@ -2291,8 +2341,20 @@ impl Application for App { } if let Some(binding) = shortcuts::binding_from_key(modifiers, key) { self.shortcut_capture = None; - self.shortcuts_config.custom.0.insert(binding, action); - self.save_shortcuts_custom(); + if let Some(existing_action) = + self.shortcuts_config.action_for_binding(&binding) + { + if existing_action != action { + self.begin_shortcut_conflict(ShortcutConflict { + binding, + existing_action, + new_action: action, + }); + return Task::none(); + } + return Task::none(); + } + self.apply_shortcut_binding(binding, action); } return Task::none(); } @@ -2337,6 +2399,15 @@ impl Application for App { Message::ShortcutCaptureStart(action) => { self.shortcut_capture = Some(action); } + Message::ShortcutConflictCancel => { + self.clear_shortcut_conflict(); + } + Message::ShortcutConflictReplace => { + if let Some(conflict) = self.shortcut_conflict.clone() { + self.apply_shortcut_binding(conflict.binding, conflict.new_action); + } + self.clear_shortcut_conflict(); + } Message::ShortcutRemove(binding, source) => { match source { shortcuts::BindingSource::Default => { @@ -2988,6 +3059,34 @@ impl Application for App { }) } + fn dialog(&self) -> Option> { + let conflict = self.shortcut_conflict.as_ref()?; + let binding = shortcuts::binding_display(&conflict.binding); + let existing = shortcuts::action_label(conflict.existing_action); + let new_action = shortcuts::action_label(conflict.new_action); + let body = fl!( + "shortcut-replace-body", + binding = binding.as_str(), + existing = existing.as_str(), + new_action = new_action.as_str() + ); + + Some( + widget::dialog() + .title(fl!("shortcut-replace-title")) + .body(body) + .primary_action( + widget::button::suggested(fl!("replace")) + .on_press(Message::ShortcutConflictReplace), + ) + .secondary_action( + widget::button::standard(fl!("cancel")) + .on_press(Message::ShortcutConflictCancel), + ) + .into(), + ) + } + fn header_start(&self) -> Vec> { vec![menu_bar(&self.core, &self.config, &self.key_binds)] } diff --git a/src/shortcuts.rs b/src/shortcuts.rs index 74c9ac7..e5bbd5f 100644 --- a/src/shortcuts.rs +++ b/src/shortcuts.rs @@ -218,6 +218,18 @@ impl ShortcutsConfig { bindings } + pub fn action_for_binding(&self, binding: &Binding) -> Option { + if let Some(action) = self.custom.0.get(binding) { + if *action == KeyBindAction::Unbind { + return None; + } + return Some(*action); + } + + let defaults = self.defaults_or_fallback(); + defaults.0.get(binding).copied() + } + fn defaults_or_fallback(&self) -> Shortcuts { if self.defaults.0.is_empty() { fallback_shortcuts() From 1564a77e5feb27f6d180ecbbd70e75a2b22464bd Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 5 Feb 2026 10:34:58 -0700 Subject: [PATCH 27/40] Shortcut design updates and fix escape behavior --- src/main.rs | 246 +++++++++++++++++++++----------------------- src/terminal_box.rs | 6 +- 2 files changed, 117 insertions(+), 135 deletions(-) diff --git a/src/main.rs b/src/main.rs index 8897b33..a60157a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,9 +4,9 @@ use alacritty_terminal::tty::Options; use alacritty_terminal::{event::Event as TermEvent, term, term::color::Colors as TermColors, tty}; use cosmic::iced::clipboard::dnd::DndAction; +use cosmic::iced_core::keyboard::key::Named; use cosmic::widget::menu::action::MenuAction; use cosmic::widget::menu::key_bind::KeyBind; -use cosmic::iced_core::keyboard::key::Named; use cosmic::{ Application, ApplicationExt, Element, action, app::{Core, Settings, Task, context_drawer}, @@ -368,7 +368,6 @@ pub enum Message { FindNext, FindPrevious, FindSearchValueChanged(String), - KeyboardShortcuts(bool), MiddleClick(pane_grid::Pane, Option), FocusFollowMouse(bool), Key(Modifiers, Key), @@ -440,6 +439,7 @@ pub enum Message { pub enum ContextPage { About, ColorSchemes(ColorSchemeKind), + KeyboardShortcuts, Profiles, Settings, #[cfg(feature = "password_manager")] @@ -495,7 +495,6 @@ pub struct App { color_scheme_tab_model: widget::segmented_button::SingleSelectModel, profile_expanded: Option, show_advanced_font_settings: bool, - show_keyboard_shortcuts: bool, shortcut_capture: Option, shortcut_conflict: Option, shortcut_conflict_overlay_restore: Option, @@ -574,10 +573,9 @@ impl App { self.config.shortcuts_custom = self.shortcuts_config.custom.clone(); match &self.config_handler { Some(config_handler) => { - if let Err(err) = config_handler.set( - "shortcuts_custom", - &self.config.shortcuts_custom, - ) { + if let Err(err) = + config_handler.set("shortcuts_custom", &self.config.shortcuts_custom) + { log::warn!("failed to save shortcuts custom config: {}", err); } } @@ -946,6 +944,88 @@ impl App { widget::settings::view_column(sections).into() } + fn keyboard_shortcuts(&self) -> Element<'_, Message> { + let cosmic_theme::Spacing { + space_xxs, + space_xs, + space_m, + .. + } = self.core().system_theme().cosmic().spacing; + + let pad_m = [space_xxs, space_m]; + let div_m = 16; + let pad_l = [space_xxs, space_m + 32]; + let div_l = div_m + 32; + + let mut groups = Vec::new(); + for group in shortcuts::shortcut_groups() { + let mut list = widget::list::list_column(); + + for action in group.actions { + let bindings = self.shortcuts_config.bindings_for_action(action); + + list = list.list_item_padding(pad_m); + list = list.add( + widget::settings::item::builder(shortcuts::action_label(action)).control( + widget::button::custom(icon_cache_get("list-add-symbolic", 16)) + .class(style::Button::Icon) + .on_press(Message::ShortcutCaptureStart(action)), + ), + ); + list = list.divider_padding(div_m); + + if bindings.is_empty() { + list = list.list_item_padding(pad_l); + list = list.add(widget::text::body(fl!("no-shortcuts"))); + list = list.divider_padding(div_l); + } else { + for resolved in bindings { + list = list.list_item_padding(pad_l); + list = list.add( + widget::settings::item::builder(shortcuts::binding_display( + &resolved.binding, + )) + .control( + widget::button::custom(icon_cache_get("edit-delete-symbolic", 16)) + .class(style::Button::Icon) + .on_press(Message::ShortcutRemove( + resolved.binding.clone(), + resolved.source, + )), + ), + ); + list = list.divider_padding(div_l); + } + } + + if self.shortcut_capture == Some(action) { + list = list.list_item_padding(pad_l); + list = list.add( + widget::row::with_children(vec![ + widget::text::body(fl!("shortcut-capture-hint")).into(), + widget::horizontal_space().into(), + widget::button::standard(fl!("cancel")) + .on_press(Message::ShortcutCaptureCancel) + .into(), + ]) + .spacing(space_xxs), + ); + list = list.divider_padding(div_l); + } + } + + groups.push( + widget::settings::section::with_column(list) + .title(group.title) + .into(), + ); + } + + widget::column::with_children(groups) + .spacing(space_xs) + .into() + } + fn profiles(&self) -> Element<'_, Message> { let cosmic_theme::Spacing { space_s, @@ -1143,10 +1223,6 @@ impl App { } fn settings(&self) -> Element<'_, Message> { - let cosmic_theme::Spacing { - space_xxs, space_xs, .. - } = self.core().system_theme().cosmic().spacing; - let app_theme_selected = match self.config.app_theme { AppTheme::Dark => 1, AppTheme::Light => 2, @@ -1327,117 +1403,16 @@ impl App { .toggler(self.config.focus_follow_mouse, Message::FocusFollowMouse), ); - let mut shortcuts_section = widget::settings::section() + let shortcuts_section = widget::settings::section() .title(fl!("keyboard-shortcuts")) .add( widget::settings::item::builder(fl!("customize-shortcuts")).control( - if self.show_keyboard_shortcuts { - widget::button::custom(icon_cache_get("go-up-symbolic", 16)) - .on_press(Message::KeyboardShortcuts(false)) - } else { - widget::button::custom(icon_cache_get("go-down-symbolic", 16)) - .on_press(Message::KeyboardShortcuts(true)) - } - .class(style::Button::Icon), + widget::button::custom(icon_cache_get("go-next-symbolic", 16)) + .on_press(Message::ToggleContextPage(ContextPage::KeyboardShortcuts)) + .class(style::Button::Icon), ), ); - if self.show_keyboard_shortcuts { - let shortcuts_content = || { - let mut groups = Vec::new(); - - for group in shortcuts::shortcut_groups() { - let mut group_section = widget::settings::section().title(group.title); - - for action in group.actions { - let bindings = self.shortcuts_config.bindings_for_action(action); - let mut rows: Vec> = Vec::new(); - - if self.shortcut_capture == Some(action) { - rows.push( - widget::row::with_children(vec![ - widget::text::body(fl!("shortcut-capture-hint")) - .into(), - widget::horizontal_space().into(), - widget::button::standard(fl!("cancel")) - .on_press(Message::ShortcutCaptureCancel) - .into(), - ]) - .spacing(space_xxs) - .into(), - ); - } - - if bindings.is_empty() { - rows.push(widget::text::body(fl!("no-shortcuts")).into()); - } else { - for resolved in bindings { - let binding_text = widget::text::body( - shortcuts::binding_display(&resolved.binding), - ) - .width(Length::Fill) - .align_x(Alignment::End); - let binding_chip = widget::container( - widget::row::with_children(vec![ - binding_text.into(), - widget::button::custom(icon_cache_get( - "edit-delete-symbolic", - 16, - )) - .class(style::Button::Icon) - .on_press(Message::ShortcutRemove( - resolved.binding.clone(), - resolved.source, - )) - .into(), - ]) - .spacing(space_xxs) - .align_y(Alignment::Center) - .width(Length::Fill), - ) - .padding(Padding::new(6.0)) - .class(style::Container::Background) - .width(Length::Fill); - rows.push(binding_chip.into()); - } - } - - rows.push( - widget::row::with_children(vec![ - widget::horizontal_space().into(), - widget::button::standard(fl!("add-shortcut")) - .on_press(Message::ShortcutCaptureStart(action)) - .into(), - ]) - .into(), - ); - - let bindings_column = widget::column::with_children(rows) - .spacing(space_xxs) - .width(Length::Fill); - - group_section = group_section.add( - widget::settings::item::builder(shortcuts::action_label(action)) - .control(bindings_column), - ); - } - - groups.push(group_section.into()); - } - - widget::column::with_children(groups).spacing(space_xs) - }; - - let padding = Padding { - top: 0.0, - bottom: 0.0, - left: 12.0, - right: 12.0, - }; - shortcuts_section = - shortcuts_section.add(widget::container(shortcuts_content()).padding(padding)); - } - let advanced_section = widget::settings::section().title(fl!("advanced")).add( widget::settings::item::builder(fl!("show-headerbar")) .description(fl!("show-header-description")) @@ -1784,7 +1759,6 @@ impl Application for App { color_scheme_tab_model: widget::segmented_button::Model::default(), profile_expanded: None, show_advanced_font_settings: false, - show_keyboard_shortcuts: false, shortcut_capture: None, shortcut_conflict: None, shortcut_conflict_overlay_restore: None, @@ -1802,12 +1776,20 @@ impl Application for App { //TODO: currently the first escape unfocuses, and the second calls this function fn on_escape(&mut self) -> Task { if self.core.window.show_context { - // Close context drawer if open - self.core.window.show_context = false; - #[cfg(feature = "password_manager")] - if self.context_page == ContextPage::PasswordManager { - self.password_mgr.clear(); + // Handle keyboard shortcut page escape + if let ContextPage::KeyboardShortcuts = self.context_page { + // Cancel shortcut capture + if self.shortcut_capture.take().is_some() { + return Task::none(); + } + + // Cancel shortcut conflict dialog + if self.shortcut_conflict.take().is_some() { + return Task::none(); + } } + + return self.update(Message::ToggleContextPage(self.context_page)); } else if self.find { // Close find if open self.find = false; @@ -2069,8 +2051,7 @@ impl Application for App { } Message::Config(config) => { if config != self.config { - let shortcuts_changed = - config.shortcuts_custom != self.config.shortcuts_custom; + let shortcuts_changed = config.shortcuts_custom != self.config.shortcuts_custom; log::info!("update config"); //TODO: update syntax theme by clearing tabs, only if needed self.config = config; @@ -2308,12 +2289,6 @@ impl Application for App { Message::FindSearchValueChanged(value) => { self.find_search_value = value; } - Message::KeyboardShortcuts(show) => { - self.show_keyboard_shortcuts = show; - if !show { - self.shortcut_capture = None; - } - } Message::MiddleClick(pane, entity_opt) => { self.pane_model.set_focus(pane); return Task::batch([ @@ -2975,6 +2950,12 @@ impl Application for App { }); } + if let ContextPage::KeyboardShortcuts = context_page { + self.shortcut_capture = None; + self.shortcut_conflict = None; + self.shortcut_conflict_overlay_restore = None; + } + #[cfg(feature = "password_manager")] if ContextPage::PasswordManager == context_page { self.password_mgr.pane = Some(self.pane_model.focused()); @@ -3045,6 +3026,11 @@ impl Application for App { Message::ToggleContextPage(ContextPage::ColorSchemes(color_scheme_kind)), ) .title(fl!("color-schemes")), + ContextPage::KeyboardShortcuts => context_drawer::context_drawer( + self.keyboard_shortcuts(), + Message::ToggleContextPage(ContextPage::KeyboardShortcuts), + ) + .title(fl!("keyboard-shortcuts")), ContextPage::Profiles => context_drawer::context_drawer( self.profiles(), Message::ToggleContextPage(ContextPage::Profiles), diff --git a/src/terminal_box.rs b/src/terminal_box.rs index 7325bb0..3dc1b8d 100644 --- a/src/terminal_box.rs +++ b/src/terminal_box.rs @@ -46,11 +46,7 @@ use std::{ }; use crate::{ - Action, - Terminal, - TerminalScroll, - menu::MenuState, - mouse_reporter::MouseReporter, + Action, Terminal, TerminalScroll, menu::MenuState, mouse_reporter::MouseReporter, terminal::Metadata, }; From 92d22621e4b060df88cead8582454bc168b16fbe Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 5 Feb 2026 11:25:53 -0700 Subject: [PATCH 28/40] Implement shortcut search --- Cargo.lock | 1 + Cargo.toml | 1 + i18n/en/cosmic_term.ftl | 1 + src/main.rs | 106 +++++++++++++++++++++++++++++++++------- 4 files changed, 91 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cf375ab..ac17f42 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1586,6 +1586,7 @@ dependencies = [ "open", "palette", "paste", + "regex", "ron 0.11.0", "rust-embed", "secret-service", diff --git a/Cargo.toml b/Cargo.toml index c6c3f33..842dd09 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ log = "0.4" open = "5.3.2" palette = { version = "0.7", features = ["serde"] } paste = "1.0" +regex = "1" ron = "0.11" serde = { version = "1", features = ["serde_derive"] } shlex = "1" diff --git a/i18n/en/cosmic_term.ftl b/i18n/en/cosmic_term.ftl index ba0a5bd..b4f8c2d 100644 --- a/i18n/en/cosmic_term.ftl +++ b/i18n/en/cosmic_term.ftl @@ -63,6 +63,7 @@ show-headerbar = Show header show-header-description = Reveal the header from the right-click menu. ### Keyboard shortcuts +type-to-search = Type to search... keyboard-shortcuts = Keyboard shortcuts customize-shortcuts = Customize shortcuts shortcut-capture-hint = Press new shortcut, or Esc to cancel diff --git a/src/main.rs b/src/main.rs index a60157a..b730537 100644 --- a/src/main.rs +++ b/src/main.rs @@ -30,6 +30,7 @@ use cosmic_text::{Family, Stretch, Weight, fontdb::FaceInfo}; use localize::LANGUAGE_SORTER; use std::{ any::TypeId, + cell::Cell, cmp, collections::{BTreeMap, BTreeSet, HashMap}, env, @@ -379,6 +380,7 @@ pub enum Message { ShortcutConflictCancel, ShortcutConflictReplace, ShortcutRemove(shortcuts::Binding, shortcuts::BindingSource), + ShortcutSearch(String), MouseEnter(pane_grid::Pane), Opacity(u8), PaneClicked(pane_grid::Pane), @@ -498,6 +500,10 @@ pub struct App { shortcut_capture: Option, shortcut_conflict: Option, shortcut_conflict_overlay_restore: Option, + shortcut_search_focus: Cell, + shortcut_search_id: widget::Id, + shortcut_search_regex: Option, + shortcut_search_value: String, modifiers: Modifiers, #[cfg(feature = "password_manager")] password_mgr: password_manager::PasswordManager, @@ -617,6 +623,15 @@ impl App { } } + fn shortcut_page_toggle(&mut self) { + self.shortcut_capture = None; + self.clear_shortcut_conflict(); + self.shortcut_search_focus + .set(self.core.window.show_context); + self.shortcut_search_regex = None; + self.shortcut_search_value.clear(); + } + fn update_config(&mut self) -> Task { let theme = self.config.app_theme.theme(); @@ -712,7 +727,16 @@ impl App { if self.find { widget::text_input::focus(self.find_search_id.clone()) } else if self.core.window.show_context { - // TODO focus the context page? + match self.context_page { + ContextPage::KeyboardShortcuts => { + if self.shortcut_search_focus.get() { + self.shortcut_search_focus.set(false); + return widget::text_input::focus(self.shortcut_search_id.clone()); + } + } + // TODO focus for other context pages? + _ => {} + } Task::none() } else if let Some(terminal_id) = self.terminal_ids.get(&self.pane_model.focused()).cloned() { @@ -946,10 +970,7 @@ impl App { fn keyboard_shortcuts(&self) -> Element<'_, Message> { let cosmic_theme::Spacing { - space_xxs, - space_xs, - space_m, - .. + space_xxs, space_m, .. } = self.core().system_theme().cosmic().spacing; let pad_m = [space_xxs, space_m]; @@ -958,15 +979,33 @@ impl App { let div_l = div_m + 32; let mut groups = Vec::new(); + //TODO: fix text input focus going outside bounds + groups.push(widget::horizontal_space().into()); + groups.push( + widget::text_input::search_input(fl!("type-to-search"), &self.shortcut_search_value) + .id(self.shortcut_search_id.clone()) + .on_input(Message::ShortcutSearch) + .into(), + ); + for group in shortcuts::shortcut_groups() { let mut list = widget::list::list_column(); + let mut found_actions = false; for action in group.actions { + let action_label = shortcuts::action_label(action); + if let Some(regex) = &self.shortcut_search_regex { + if regex.find(&action_label).is_none() { + continue; + } + } + found_actions = true; + let bindings = self.shortcuts_config.bindings_for_action(action); list = list.list_item_padding(pad_m); list = list.add( - widget::settings::item::builder(shortcuts::action_label(action)).control( + widget::settings::item::builder(action_label).control( widget::button::custom(icon_cache_get("list-add-symbolic", 16)) .class(style::Button::Icon) .on_press(Message::ShortcutCaptureStart(action)), @@ -1014,16 +1053,16 @@ impl App { } } - groups.push( - widget::settings::section::with_column(list) - .title(group.title) - .into(), - ); + if found_actions { + groups.push( + widget::settings::section::with_column(list) + .title(group.title) + .into(), + ); + } } - widget::column::with_children(groups) - .spacing(space_xs) - .into() + widget::settings::view_column(groups).into() } fn profiles(&self) -> Element<'_, Message> { @@ -1762,13 +1801,21 @@ impl Application for App { shortcut_capture: None, shortcut_conflict: None, shortcut_conflict_overlay_restore: None, + shortcut_search_focus: Cell::new(true), + shortcut_search_id: widget::Id::unique(), + shortcut_search_regex: None, + shortcut_search_value: String::new(), modifiers: Modifiers::empty(), #[cfg(feature = "password_manager")] password_mgr: Default::default(), }; app.set_curr_font_weights_and_stretches(); - let command = Task::batch([app.update_config(), app.update_title(None)]); + let command = Task::batch([ + app.update_config(), + app.update_title(None), + app.update(Message::ToggleContextPage(ContextPage::KeyboardShortcuts)), + ]); (app, command) } @@ -2397,6 +2444,26 @@ impl Application for App { } self.save_shortcuts_custom(); } + Message::ShortcutSearch(search) => { + self.shortcut_search_focus.set(true); + self.shortcut_search_regex = None; + if !search.is_empty() { + let pattern = regex::escape(&search); + match regex::RegexBuilder::new(&pattern) + .case_insensitive(true) + .build() + { + Ok(regex) => { + self.shortcut_search_regex = Some(regex); + } + Err(err) => { + log::warn!("failed to parse regex {:?}: {}", pattern, err); + } + }; + } + self.shortcut_search_value = search; + return self.update_focus(); + } Message::Opacity(opacity) => { config_set!(opacity, cmp::min(100, opacity)); } @@ -2909,6 +2976,10 @@ impl Application for App { self.core.window.show_context = !self.core.window.show_context; self.pane_model.update_terminal_focus(); + if let ContextPage::KeyboardShortcuts = context_page { + self.shortcut_page_toggle(); + } + #[cfg(feature = "password_manager")] if ContextPage::PasswordManager == context_page { if self.core.window.show_context { @@ -2951,9 +3022,8 @@ impl Application for App { } if let ContextPage::KeyboardShortcuts = context_page { - self.shortcut_capture = None; - self.shortcut_conflict = None; - self.shortcut_conflict_overlay_restore = None; + self.shortcut_page_toggle(); + return self.update_focus(); } #[cfg(feature = "password_manager")] From 182e1549fd08f37b03f4142c7d8ff78d0872892b Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 5 Feb 2026 11:31:05 -0700 Subject: [PATCH 29/40] Move keyboard shortcuts to menu item --- i18n/en/cosmic_term.ftl | 1 + src/main.rs | 13 ++----------- src/menu.rs | 5 +++++ 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/i18n/en/cosmic_term.ftl b/i18n/en/cosmic_term.ftl index b4f8c2d..0eda393 100644 --- a/i18n/en/cosmic_term.ftl +++ b/i18n/en/cosmic_term.ftl @@ -65,6 +65,7 @@ show-header-description = Reveal the header from the right-click menu. ### Keyboard shortcuts type-to-search = Type to search... keyboard-shortcuts = Keyboard shortcuts +menu-keyboard-shortcuts = Keyboard shortcuts... customize-shortcuts = Customize shortcuts shortcut-capture-hint = Press new shortcut, or Esc to cancel cancel = Cancel diff --git a/src/main.rs b/src/main.rs index b730537..4ead9d5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -237,6 +237,7 @@ pub enum Action { CopyOrSigint, CopyPrimary, Find, + KeyboardShortcuts, LaunchUrlByMenu, PaneFocusDown, PaneFocusLeft, @@ -288,6 +289,7 @@ impl Action { Self::CopyOrSigint => Message::CopyOrSigint(entity_opt), Self::CopyPrimary => Message::CopyPrimary(entity_opt), Self::Find => Message::Find(true), + Self::KeyboardShortcuts => Message::ToggleContextPage(ContextPage::KeyboardShortcuts), Self::LaunchUrlByMenu => Message::LaunchUrlByMenu, Self::PaneFocusDown => Message::PaneFocusAdjacent(pane_grid::Direction::Down), Self::PaneFocusLeft => Message::PaneFocusAdjacent(pane_grid::Direction::Left), @@ -1442,16 +1444,6 @@ impl App { .toggler(self.config.focus_follow_mouse, Message::FocusFollowMouse), ); - let shortcuts_section = widget::settings::section() - .title(fl!("keyboard-shortcuts")) - .add( - widget::settings::item::builder(fl!("customize-shortcuts")).control( - widget::button::custom(icon_cache_get("go-next-symbolic", 16)) - .on_press(Message::ToggleContextPage(ContextPage::KeyboardShortcuts)) - .class(style::Button::Icon), - ), - ); - let advanced_section = widget::settings::section().title(fl!("advanced")).add( widget::settings::item::builder(fl!("show-headerbar")) .description(fl!("show-header-description")) @@ -1462,7 +1454,6 @@ impl App { appearance_section.into(), font_section.into(), splits_section.into(), - shortcuts_section.into(), advanced_section.into(), ]) .into() diff --git a/src/menu.rs b/src/menu.rs index 0e11dd2..520a608 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -265,6 +265,11 @@ pub fn menu_bar<'a>( None, Action::ColorSchemes(config.color_scheme_kind()), ), + MenuItem::Button( + fl!("menu-keyboard-shortcuts"), + None, + Action::KeyboardShortcuts, + ), MenuItem::Button(fl!("menu-settings"), None, Action::Settings), #[cfg(feature = "password_manager")] MenuItem::Button( From 6752b9a434792bfbfb6c7ab1b938623de48bb62d Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 5 Feb 2026 11:50:32 -0700 Subject: [PATCH 30/40] Do not automatically show keyboard shortcuts --- src/main.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index 4ead9d5..79b21ff 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1802,11 +1802,7 @@ impl Application for App { }; app.set_curr_font_weights_and_stretches(); - let command = Task::batch([ - app.update_config(), - app.update_title(None), - app.update(Message::ToggleContextPage(ContextPage::KeyboardShortcuts)), - ]); + let command = Task::batch([app.update_config(), app.update_title(None)]); (app, command) } From 1b980df309c7fd5c25083933bf7361a1e8dece75 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 5 Feb 2026 12:57:56 -0700 Subject: [PATCH 31/40] Implement key bind reset --- i18n/en/cosmic_term.ftl | 40 ++++++++++++------------- res/icons/edit-undo-symbolic.svg | 10 +++++++ src/icon_cache.rs | 1 + src/main.rs | 44 +++++++++++++++++---------- src/shortcuts.rs | 51 +++++++++++++++++++++----------- 5 files changed, 93 insertions(+), 53 deletions(-) create mode 100644 res/icons/edit-undo-symbolic.svg diff --git a/i18n/en/cosmic_term.ftl b/i18n/en/cosmic_term.ftl index 0eda393..4342436 100644 --- a/i18n/en/cosmic_term.ftl +++ b/i18n/en/cosmic_term.ftl @@ -63,33 +63,33 @@ show-headerbar = Show header show-header-description = Reveal the header from the right-click menu. ### Keyboard shortcuts -type-to-search = Type to search... -keyboard-shortcuts = Keyboard shortcuts -menu-keyboard-shortcuts = Keyboard shortcuts... -customize-shortcuts = Customize shortcuts -shortcut-capture-hint = Press new shortcut, or Esc to cancel +add-another-keybinding = Add another keybinding cancel = Cancel -replace = Replace -shortcut-replace-title = Replace shortcut? -shortcut-replace-body = { $binding } is already assigned to { $existing }. Replace it with { $new_action }? -no-shortcuts = No shortcuts -add-shortcut = + Add -shortcut-group-clipboard = Clipboard -shortcut-group-tabs = Tabs -shortcut-group-window = Window -shortcut-group-zoom = Zoom -shortcut-group-other = Other -unbind = Unbind +close-window = Close window copy-or-sigint = Copy or SIGINT -paste-primary = Paste primary +focus-pane-down = Focus pane down focus-pane-left = Focus pane left focus-pane-right = Focus pane right focus-pane-up = Focus pane up -focus-pane-down = Focus pane down -toggle-fullscreen = Toggle fullscreen -close-window = Close window +keyboard-shortcuts = Keyboard shortcuts +menu-keyboard-shortcuts = Keyboard shortcuts... +no-shortcuts = No shortcuts password-manager = Password manager +paste-primary = Paste primary +replace = Replace +reset-to-default = Reset to default +shortcut-capture-hint = Press new shortcut, or Esc to cancel +shortcut-group-clipboard = Clipboard +shortcut-group-other = Other +shortcut-group-tabs = Tabs +shortcut-group-window = Window +shortcut-group-zoom = Zoom +shortcut-replace-body = { $binding } is already assigned to { $existing }. Replace it with { $new_action }? +shortcut-replace-title = Replace shortcut? tab-activate = Activate tab { $number } +toggle-fullscreen = Toggle fullscreen +type-to-search = Type to search... +unbind = Unbind # Find find-placeholder = Find... diff --git a/res/icons/edit-undo-symbolic.svg b/res/icons/edit-undo-symbolic.svg new file mode 100644 index 0000000..7400969 --- /dev/null +++ b/res/icons/edit-undo-symbolic.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/icon_cache.rs b/src/icon_cache.rs index 59c9e0b..21a7dc9 100644 --- a/src/icon_cache.rs +++ b/src/icon_cache.rs @@ -33,6 +33,7 @@ impl IconCache { bundle!("dialog-error-symbolic", 16); bundle!("edit-clear-symbolic", 16); bundle!("edit-delete-symbolic", 16); + bundle!("edit-undo-symbolic", 16); bundle!("list-add-symbolic", 16); bundle!("go-down-symbolic", 16); bundle!("go-up-symbolic", 16); diff --git a/src/main.rs b/src/main.rs index 79b21ff..3ca2723 100644 --- a/src/main.rs +++ b/src/main.rs @@ -163,10 +163,7 @@ fn main() -> Result<(), Box> { } }; - let shortcuts_config = shortcuts::ShortcutsConfig { - defaults: shortcuts::Shortcuts::default(), - custom: config.shortcuts_custom.clone(), - }; + let shortcuts_config = shortcuts::ShortcutsConfig::new(config.shortcuts_custom.clone()); let startup_options = if let Some(shell_program) = shell_program_opt { let options = tty::Options { @@ -382,6 +379,7 @@ pub enum Message { ShortcutConflictCancel, ShortcutConflictReplace, ShortcutRemove(shortcuts::Binding, shortcuts::BindingSource), + ShortcutReset(shortcuts::KeyBindAction), ShortcutSearch(String), MouseEnter(pane_grid::Pane), Opacity(u8), @@ -1003,16 +1001,28 @@ impl App { } found_actions = true; - let bindings = self.shortcuts_config.bindings_for_action(action); + let (bindings, changed) = self.shortcuts_config.bindings_for_action(action); + + let mut buttons = widget::row::with_capacity(2); + if changed { + buttons = buttons.push(widget::tooltip( + widget::button::custom(icon_cache_get("edit-undo-symbolic", 16)) + .class(style::Button::Icon) + .on_press(Message::ShortcutReset(action)), + widget::text::body(fl!("reset-to-default")), + widget::tooltip::Position::Top, + )); + } + buttons = buttons.push(widget::tooltip( + widget::button::custom(icon_cache_get("list-add-symbolic", 16)) + .class(style::Button::Icon) + .on_press(Message::ShortcutCaptureStart(action)), + widget::text::body(fl!("add-another-keybinding")), + widget::tooltip::Position::Top, + )); list = list.list_item_padding(pad_m); - list = list.add( - widget::settings::item::builder(action_label).control( - widget::button::custom(icon_cache_get("list-add-symbolic", 16)) - .class(style::Button::Icon) - .on_press(Message::ShortcutCaptureStart(action)), - ), - ); + list = list.add(widget::settings::item::builder(action_label).control(buttons)); list = list.divider_padding(div_m); if bindings.is_empty() { @@ -2090,10 +2100,8 @@ impl Application for App { //TODO: update syntax theme by clearing tabs, only if needed self.config = config; if shortcuts_changed { - self.shortcuts_config = shortcuts::ShortcutsConfig { - defaults: shortcuts::Shortcuts::default(), - custom: self.config.shortcuts_custom.clone(), - }; + self.shortcuts_config = + shortcuts::ShortcutsConfig::new(self.config.shortcuts_custom.clone()); self.key_binds = key_binds(&self.shortcuts_config); } return self.update_config(); @@ -2431,6 +2439,10 @@ impl Application for App { } self.save_shortcuts_custom(); } + Message::ShortcutReset(reset_action) => { + self.shortcuts_config.reset_action(reset_action); + self.save_shortcuts_custom(); + } Message::ShortcutSearch(search) => { self.shortcut_search_focus.set(true); self.shortcut_search_regex = None; diff --git a/src/shortcuts.rs b/src/shortcuts.rs index e5bbd5f..b9b0d4a 100644 --- a/src/shortcuts.rs +++ b/src/shortcuts.rs @@ -163,38 +163,47 @@ pub struct ResolvedBinding { pub source: BindingSource, } -#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] +#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)] pub struct ShortcutsConfig { - pub defaults: Shortcuts, + defaults: Shortcuts, pub custom: Shortcuts, } impl ShortcutsConfig { + pub fn new(custom: Shortcuts) -> Self { + Self { + defaults: fallback_shortcuts(), + custom, + } + } + pub fn key_binds(&self) -> HashMap { let mut binds = HashMap::new(); - let defaults = self.defaults_or_fallback(); - insert_shortcuts(&defaults, &mut binds, false); + insert_shortcuts(&self.defaults, &mut binds, false); insert_shortcuts(&self.custom, &mut binds, true); binds } - pub fn bindings_for_action(&self, action: KeyBindAction) -> Vec { + pub fn bindings_for_action(&self, action: KeyBindAction) -> (Vec, bool) { let mut bindings = Vec::new(); - let defaults = self.defaults_or_fallback(); - for (binding, default_action) in &defaults.0 { + let mut changed = false; + for (binding, default_action) in &self.defaults.0 { if *default_action != action { continue; } match self.custom.0.get(binding) { - Some(KeyBindAction::Unbind) => (), + Some(KeyBindAction::Unbind) => { + changed = true; + } Some(custom_action) => { if *custom_action == action { bindings.push(ResolvedBinding { binding: binding.clone(), source: BindingSource::Custom, }); + changed = true; } } None => bindings.push(ResolvedBinding { @@ -212,10 +221,11 @@ impl ShortcutsConfig { binding: binding.clone(), source: BindingSource::Custom, }); + changed = true; } } - bindings + (bindings, changed) } pub fn action_for_binding(&self, binding: &Binding) -> Option { @@ -226,16 +236,23 @@ impl ShortcutsConfig { return Some(*action); } - let defaults = self.defaults_or_fallback(); - defaults.0.get(binding).copied() + self.defaults.0.get(binding).copied() } - fn defaults_or_fallback(&self) -> Shortcuts { - if self.defaults.0.is_empty() { - fallback_shortcuts() - } else { - self.defaults.clone() - } + pub fn reset_action(&mut self, reset_action: KeyBindAction) { + self.custom.0.retain(|binding, action| { + if *action == reset_action { + // Remove any matching bindings + return false; + } + if let Some(default_action) = self.defaults.0.get(binding) { + if *default_action == reset_action { + // Remove binding that overrode a default + return false; + } + } + true + }); } } From b9b21532307ba04e8f734624c41bbe77cc84c098 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 5 Feb 2026 13:17:18 -0700 Subject: [PATCH 32/40] Adjust to design and hard-code Copy and Paste special keys --- src/main.rs | 58 ++++++++++++++++++++++++++++++------------------ src/shortcuts.rs | 4 ---- 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/src/main.rs b/src/main.rs index 3ca2723..5d8a86b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -970,13 +970,18 @@ impl App { fn keyboard_shortcuts(&self) -> Element<'_, Message> { let cosmic_theme::Spacing { - space_xxs, space_m, .. + space_xxs, + space_s, + space_m, + space_l, + space_xl, + .. } = self.core().system_theme().cosmic().spacing; - let pad_m = [space_xxs, space_m]; - let div_m = 16; - let pad_l = [space_xxs, space_m + 32]; - let div_l = div_m + 32; + let pad_action = [space_xxs, space_m]; + let div_action = space_s; + let pad_binding = [space_xxs, space_xl]; + let div_binding = space_l; let mut groups = Vec::new(); //TODO: fix text input focus going outside bounds @@ -1021,17 +1026,22 @@ impl App { widget::tooltip::Position::Top, )); - list = list.list_item_padding(pad_m); - list = list.add(widget::settings::item::builder(action_label).control(buttons)); - list = list.divider_padding(div_m); + list = list.list_item_padding(pad_action); + list = list.divider_padding(div_action); + list = list.add(widget::settings::item_row(vec![ + widget::text::heading(action_label) + .width(Length::Fill) + .into(), + buttons.into(), + ])); if bindings.is_empty() { - list = list.list_item_padding(pad_l); + list = list.list_item_padding(pad_binding); list = list.add(widget::text::body(fl!("no-shortcuts"))); - list = list.divider_padding(div_l); + list = list.divider_padding(div_binding); } else { for resolved in bindings { - list = list.list_item_padding(pad_l); + list = list.list_item_padding(pad_binding); list = list.add( widget::settings::item::builder(shortcuts::binding_display( &resolved.binding, @@ -1045,12 +1055,12 @@ impl App { )), ), ); - list = list.divider_padding(div_l); + list = list.divider_padding(div_binding); } } if self.shortcut_capture == Some(action) { - list = list.list_item_padding(pad_l); + list = list.list_item_padding(pad_binding); list = list.add( widget::row::with_children(vec![ widget::text::body(fl!("shortcut-capture-hint")).into(), @@ -1061,7 +1071,7 @@ impl App { ]) .spacing(space_xxs), ); - list = list.divider_padding(div_l); + list = list.divider_padding(div_binding); } } @@ -2345,17 +2355,19 @@ impl Application for App { config_set!(focus_follow_mouse, focus_follow_mouse); } Message::Key(modifiers, key) => { - if self.shortcut_conflict.is_some() { - if key == Key::Named(Named::Escape) { - self.clear_shortcut_conflict(); + // Hard-coded keys + match key { + Key::Named(Named::Copy) => { + return self.update(Message::Copy(None)); } - return Task::none(); + Key::Named(Named::Paste) => { + return self.update(Message::Paste(None)); + } + _ => {} } + + // Handle shortcut capture if let Some(action) = self.shortcut_capture { - if key == Key::Named(Named::Escape) { - self.shortcut_capture = None; - return Task::none(); - } if let Some(binding) = shortcuts::binding_from_key(modifiers, key) { self.shortcut_capture = None; if let Some(existing_action) = @@ -2375,6 +2387,8 @@ impl Application for App { } return Task::none(); } + + // Handle configurable keys for (key_bind, action) in &self.key_binds { if key_bind.matches(modifiers, &key) { return self.update(action.message(None)); diff --git a/src/shortcuts.rs b/src/shortcuts.rs index b9b0d4a..7e922e9 100644 --- a/src/shortcuts.rs +++ b/src/shortcuts.rs @@ -446,14 +446,12 @@ fn fallback_shortcuts() -> Shortcuts { // Standard key bindings bind!([Ctrl, Shift], "A", SelectAll); bind!([Ctrl, Shift], "C", Copy); - bind!([], "Copy", Copy); bind!([Ctrl], "c", CopyOrSigint); bind!([Ctrl, Shift], "F", Find); bind!([Ctrl, Shift], "N", WindowNew); bind!([Ctrl, Shift], "Q", WindowClose); bind!([Ctrl, Shift], "T", TabNew); bind!([Ctrl, Shift], "V", Paste); - bind!([], "Paste", Paste); bind!([Shift], "Insert", PastePrimary); bind!([Ctrl, Shift], "W", TabClose); bind!([Ctrl], ",", Settings); @@ -507,8 +505,6 @@ fn fallback_shortcuts() -> Shortcuts { fn key_from_string(value: &str) -> Option { match value { - "Copy" => Some(Key::Named(Named::Copy)), - "Paste" => Some(Key::Named(Named::Paste)), "Insert" => Some(Key::Named(Named::Insert)), "Tab" => Some(Key::Named(Named::Tab)), "F11" => Some(Key::Named(Named::F11)), From 7d2f631c5d1e1e1249495eba871d4d1dec72eb85 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 5 Feb 2026 13:36:38 -0700 Subject: [PATCH 33/40] More design adjustments --- i18n/en/cosmic_term.ftl | 2 +- src/main.rs | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/i18n/en/cosmic_term.ftl b/i18n/en/cosmic_term.ftl index 4342436..2becb3c 100644 --- a/i18n/en/cosmic_term.ftl +++ b/i18n/en/cosmic_term.ftl @@ -78,7 +78,7 @@ password-manager = Password manager paste-primary = Paste primary replace = Replace reset-to-default = Reset to default -shortcut-capture-hint = Press new shortcut, or Esc to cancel +shortcut-capture-hint = Press the key combination shortcut-group-clipboard = Clipboard shortcut-group-other = Other shortcut-group-tabs = Tabs diff --git a/src/main.rs b/src/main.rs index 5d8a86b..f69aa5f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1062,10 +1062,11 @@ impl App { if self.shortcut_capture == Some(action) { list = list.list_item_padding(pad_binding); list = list.add( - widget::row::with_children(vec![ - widget::text::body(fl!("shortcut-capture-hint")).into(), - widget::horizontal_space().into(), - widget::button::standard(fl!("cancel")) + widget::settings::item_row(vec![ + widget::text::body(fl!("shortcut-capture-hint")) + .width(Length::Fill) + .into(), + widget::button::text(fl!("cancel")) .on_press(Message::ShortcutCaptureCancel) .into(), ]) From 3bb79a36acf63cee67b4c07e9966d00aeb6ca929 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 5 Feb 2026 13:39:32 -0700 Subject: [PATCH 34/40] Fix improper handling of escape --- src/main.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main.rs b/src/main.rs index f69aa5f..58b44e7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2364,6 +2364,10 @@ impl Application for App { Key::Named(Named::Paste) => { return self.update(Message::Paste(None)); } + Key::Named(Named::Escape) => { + // Handled by on_escape + return Task::none(); + } _ => {} } From f6f8772f5dd4e14580169069889cae6dfbf29322 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 5 Feb 2026 13:49:05 -0700 Subject: [PATCH 35/40] Change Unbind action to Disable to match cosmic-settings --- i18n/en/cosmic_term.ftl | 2 +- src/main.rs | 2 +- src/shortcuts.rs | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/i18n/en/cosmic_term.ftl b/i18n/en/cosmic_term.ftl index 2becb3c..00d892c 100644 --- a/i18n/en/cosmic_term.ftl +++ b/i18n/en/cosmic_term.ftl @@ -67,6 +67,7 @@ add-another-keybinding = Add another keybinding cancel = Cancel close-window = Close window copy-or-sigint = Copy or SIGINT +disable = Disable focus-pane-down = Focus pane down focus-pane-left = Focus pane left focus-pane-right = Focus pane right @@ -89,7 +90,6 @@ shortcut-replace-title = Replace shortcut? tab-activate = Activate tab { $number } toggle-fullscreen = Toggle fullscreen type-to-search = Type to search... -unbind = Unbind # Find find-placeholder = Find... diff --git a/src/main.rs b/src/main.rs index 58b44e7..22dcb69 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2450,7 +2450,7 @@ impl Application for App { self.shortcuts_config .custom .0 - .insert(binding, shortcuts::KeyBindAction::Unbind); + .insert(binding, shortcuts::KeyBindAction::Disable); } shortcuts::BindingSource::Custom => { self.shortcuts_config.custom.0.remove(&binding); diff --git a/src/shortcuts.rs b/src/shortcuts.rs index 7e922e9..427ed19 100644 --- a/src/shortcuts.rs +++ b/src/shortcuts.rs @@ -56,7 +56,7 @@ impl Binding { #[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)] pub enum KeyBindAction { - Unbind, + Disable, ClearScrollback, Copy, CopyOrSigint, @@ -98,7 +98,7 @@ pub enum KeyBindAction { impl KeyBindAction { fn to_action(self) -> Option { match self { - Self::Unbind => None, + Self::Disable => None, Self::ClearScrollback => Some(Action::ClearScrollback), Self::Copy => Some(Action::Copy), Self::CopyOrSigint => Some(Action::CopyOrSigint), @@ -194,7 +194,7 @@ impl ShortcutsConfig { } match self.custom.0.get(binding) { - Some(KeyBindAction::Unbind) => { + Some(KeyBindAction::Disable) => { changed = true; } Some(custom_action) => { @@ -230,7 +230,7 @@ impl ShortcutsConfig { pub fn action_for_binding(&self, binding: &Binding) -> Option { if let Some(action) = self.custom.0.get(binding) { - if *action == KeyBindAction::Unbind { + if *action == KeyBindAction::Disable { return None; } return Some(*action); @@ -258,7 +258,7 @@ impl ShortcutsConfig { pub fn action_label(action: KeyBindAction) -> String { match action { - KeyBindAction::Unbind => fl!("unbind"), + KeyBindAction::Disable => fl!("disable"), KeyBindAction::ClearScrollback => fl!("clear-scrollback"), KeyBindAction::Copy => fl!("copy"), KeyBindAction::CopyOrSigint => fl!("copy-or-sigint"), @@ -406,7 +406,7 @@ pub fn binding_from_key(modifiers: Modifiers, key: Key) -> Option { fn insert_shortcuts( shortcuts: &Shortcuts, binds: &mut HashMap, - allow_unbind: bool, + allow_disable: bool, ) { for (binding, action) in &shortcuts.0 { let key_bind = match binding.to_key_bind() { @@ -416,7 +416,7 @@ fn insert_shortcuts( continue; } }; - if allow_unbind && *action == KeyBindAction::Unbind { + if allow_disable && *action == KeyBindAction::Disable { binds.remove(&key_bind); continue; } From d7dcb707c0d8be3ab5aed3378de261c52708a253 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Fri, 6 Feb 2026 11:48:46 -0700 Subject: [PATCH 36/40] No longer WIP --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 65dc63a..34a88c5 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # cosmic-term -WIP COSMIC terminal emulator, built using [alacritty\_terminal](https://docs.rs/alacritty_terminal) that is provided by the [alacritty](https://github.com/alacritty/alacritty) project. `cosmic-term` provides bidirectional rendering and ligatures with a custom renderer based on [cosmic-text](https://github.com/pop-os/cosmic-text). +COSMIC terminal emulator, built using [alacritty\_terminal](https://docs.rs/alacritty_terminal) that is provided by the [alacritty](https://github.com/alacritty/alacritty) project. `cosmic-term` provides bidirectional rendering and ligatures with a custom renderer based on [cosmic-text](https://github.com/pop-os/cosmic-text). The `wgpu` feature, enabled by default, supports GPU rendering using `glyphon` and `wgpu`. If `wgpu` is not enabled or fails to initialize, then rendering falls From 7c1953ea26831df00cb1665e808952a5471e0f68 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Mon, 9 Feb 2026 20:28:33 +0100 Subject: [PATCH 37/40] i18n: translation updates from weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Aindriú Mac Giolla Eoin Co-authored-by: Arve Eriksson <031299870@telia.com> Co-authored-by: Baurzhan Muftakhidinov Co-authored-by: David Carvalho Co-authored-by: Ettore Atalan Co-authored-by: Fedorov Alexei Co-authored-by: Feike Donia Co-authored-by: Geeson Wan Co-authored-by: Hosted Weblate Co-authored-by: Julien Brouillard Co-authored-by: Mattias Eriksson Co-authored-by: Quentin PAGÈS Co-authored-by: Spiritable Co-authored-by: VandaL Co-authored-by: Yelysei Co-authored-by: Zahid Rizky Fakhri Co-authored-by: jickson john Co-authored-by: jonnysemon Co-authored-by: lorduskordus Co-authored-by: therealmate Co-authored-by: Димко Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/ar/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/be/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/cs/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/de/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/fr/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/ga/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/hu/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/id/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/kk/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/nl/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/pl/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/ru/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/sv/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/uk/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/zh_Hans/ Translation: Pop OS/COSMIC Term --- i18n/ar/cosmic_term.ftl | 25 +++++++++++++++++++++++++ i18n/be/cosmic_term.ftl | 4 ++-- i18n/cs/cosmic_term.ftl | 31 +++++++++++++++++++++++++++++-- i18n/de/cosmic_term.ftl | 1 + i18n/fr/cosmic_term.ftl | 27 +++++++++++++++++++++++++++ i18n/ga/cosmic_term.ftl | 27 +++++++++++++++++++++++++++ i18n/hu/cosmic_term.ftl | 27 +++++++++++++++++++++++++++ i18n/id/cosmic_term.ftl | 29 ++++++++++++++++++++++++++++- i18n/kk/cosmic_term.ftl | 27 +++++++++++++++++++++++++++ i18n/ml/cosmic_term.ftl | 0 i18n/nl/cosmic_term.ftl | 7 +++++-- i18n/oc/cosmic_term.ftl | 0 i18n/pl/cosmic_term.ftl | 27 +++++++++++++++++++++++++++ i18n/pt-BR/cosmic_term.ftl | 27 +++++++++++++++++++++++++++ i18n/ru/cosmic_term.ftl | 33 ++++++++++++++++++++++++++++++--- i18n/sv-SE/cosmic_term.ftl | 27 +++++++++++++++++++++++++++ i18n/uk/cosmic_term.ftl | 37 ++++++++++++++++++++++++++++++++----- i18n/zh-CN/cosmic_term.ftl | 27 +++++++++++++++++++++++++++ 18 files changed, 368 insertions(+), 15 deletions(-) create mode 100644 i18n/ml/cosmic_term.ftl create mode 100644 i18n/oc/cosmic_term.ftl diff --git a/i18n/ar/cosmic_term.ftl b/i18n/ar/cosmic_term.ftl index 00b7605..df282cd 100644 --- a/i18n/ar/cosmic_term.ftl +++ b/i18n/ar/cosmic_term.ftl @@ -117,3 +117,28 @@ open-link = افتح الرابط menu-password-manager = كلمات السر... password-input = كلمة السر password-input-description = الوصف +add-another-keybinding = أضِف ارتباطات مفاتيح أخرى +cancel = ألغِ +close-window = أغلِق النافذة +disable = عطِّل +focus-pane-left = تركيز على اللوحة الشِمالية +focus-pane-right = تركيز على اللوحة اليمنى +focus-pane-up = تركيز على اللوحة الفوقية +keyboard-shortcuts = اختصارات لوحة المفاتيح +menu-keyboard-shortcuts = اختصارات لوحة المفاتيح... +no-shortcuts = لا اختصارات +password-manager = مدير كلمات السر +paste-primary = ألصِق الرئيسي +replace = استبدل +reset-to-default = صفّر إلى المبدئي +shortcut-capture-hint = اضغط على تركيبة المفاتيح +shortcut-group-clipboard = الحافظة +shortcut-group-other = أخرى +shortcut-group-tabs = ألسنة +shortcut-group-window = نافذة +shortcut-group-zoom = كبِّر +shortcut-replace-body = عُيِّن { $binding } بالفعل لـ { $existing }. أتريد استبداله بـ { $new_action }؟ +shortcut-replace-title = استبدل الاختصار؟ +tab-activate = نشّط لسان { $number } +toggle-fullscreen = بدّل ملء الشاشة +type-to-search = اكتب للبحث... diff --git a/i18n/be/cosmic_term.ftl b/i18n/be/cosmic_term.ftl index 9b83864..00b22f6 100644 --- a/i18n/be/cosmic_term.ftl +++ b/i18n/be/cosmic_term.ftl @@ -44,7 +44,7 @@ light = Светлая syntax-dark = Цёмны сінтаксіс syntax-light = Светлы сінтаксіс default-zoom-step = Крок маштабавання -opacity = Непразрыстаць фону +opacity = Непразрыстасць фону ### Font @@ -97,7 +97,7 @@ find = Знайсці ## View view = Выгляд -zoom-in = Большы тэкст +zoom-in = Павялічыць тэкст zoom-reset = Прадв. памер тэксту zoom-out = Меньшы тэкст next-tab = Наступная ўкладка diff --git a/i18n/cs/cosmic_term.ftl b/i18n/cs/cosmic_term.ftl index dd10076..95405b1 100644 --- a/i18n/cs/cosmic_term.ftl +++ b/i18n/cs/cosmic_term.ftl @@ -60,9 +60,9 @@ select-all = Vybrat vše find = Najít clear-scrollback = Vymazat rolování view = Zobrazení -zoom-in = Větší text +zoom-in = Zvětšit text zoom-reset = Výchozí velikost textu -zoom-out = Menší text +zoom-out = Zmenšit text next-tab = Další karta previous-tab = Předchozí karta split-horizontal = Rozdělit horizontálně @@ -77,3 +77,30 @@ add-password = Přidat heslo password-input = Heslo password-input-description = Popis open-link = Otevřít odkaz +add-another-keybinding = Přidat další klávesovou zkratku +cancel = Zrušit +close-window = Zavřít okno +disable = Zakázat +keyboard-shortcuts = Klávesové zkratky +menu-keyboard-shortcuts = Klávesové zkratky... +no-shortcuts = Žádné zkratky +password-manager = Manažer hesel +replace = Nahradit +reset-to-default = Obnovit výchozí +shortcut-group-clipboard = Schránka +shortcut-group-tabs = Karty +shortcut-group-window = Okno +shortcut-replace-title = Nahradit zkratku? +tab-activate = Aktivovat kartu { $number } +shortcut-group-other = Ostatní +shortcut-group-zoom = Přiblížení +toggle-fullscreen = Přepnout režim celé obrazovky +type-to-search = Pište pro vyhledávání... +copy-or-sigint = Kopírovat nebo SIGINT +focus-pane-down = Zaměřit panel dole +focus-pane-left = Zaměřit panel vlevo +focus-pane-right = Zaměřit panel vpravo +focus-pane-up = Zaměřit panel nahoře +shortcut-replace-body = { $binding } je již přiřazena k „{ $existing }“. Nahradit za „{ $new_action }“? +shortcut-capture-hint = Stiskněte kombinaci kláves +paste-primary = Vložit primární diff --git a/i18n/de/cosmic_term.ftl b/i18n/de/cosmic_term.ftl index bf1bca3..4bbb64e 100644 --- a/i18n/de/cosmic_term.ftl +++ b/i18n/de/cosmic_term.ftl @@ -110,3 +110,4 @@ menu-color-schemes = Farbschemen... menu-settings = Einstellungen... menu-about = Über COSMIC Terminal... repository = Repository +cancel = Abbrechen diff --git a/i18n/fr/cosmic_term.ftl b/i18n/fr/cosmic_term.ftl index 2e2e715..febb158 100644 --- a/i18n/fr/cosmic_term.ftl +++ b/i18n/fr/cosmic_term.ftl @@ -117,3 +117,30 @@ add-password = Ajouter un mot de passe password-input = Mot de passe password-input-description = Description open-link = Ouvrir le lien +add-another-keybinding = Ajouter un autre raccourci clavier +cancel = Annuler +close-window = Fermer la fenêtre +copy-or-sigint = Copier ou SIGINT +disable = Désactiver +keyboard-shortcuts = Raccourcis clavier +menu-keyboard-shortcuts = Raccourcis clavier... +no-shortcuts = Aucun raccourci +password-manager = Gestionnaire de mots de passe +paste-primary = Coller primaire +replace = Remplacer +shortcut-capture-hint = Appuyer sur la combinaison de touches +shortcut-group-clipboard = Presse-papier +shortcut-group-other = Autre +shortcut-group-tabs = Onglets +shortcut-group-window = Fenêtre +shortcut-group-zoom = Zoom +shortcut-replace-body = { $binding } est déjà assigné à { $existing }. Le remplacer avec { $new_action } ? +shortcut-replace-title = Remplacer raccourci ? +tab-activate = Activer l'onglet { $number } +type-to-search = Taper pour chercher... +focus-pane-down = Passer au panneau du dessous +focus-pane-left = Passer au panneau de gauche +focus-pane-right = Passer au panneau de droite +focus-pane-up = Passer au panneau du dessus +reset-to-default = Rétablir les paramètres par défaut +toggle-fullscreen = Basculer en plein écran diff --git a/i18n/ga/cosmic_term.ftl b/i18n/ga/cosmic_term.ftl index 029c6e3..e71adfc 100644 --- a/i18n/ga/cosmic_term.ftl +++ b/i18n/ga/cosmic_term.ftl @@ -117,3 +117,30 @@ passwords-title = Pasfhocail add-password = Cuir Pasfhocal leis password-input = Pasfhocal password-input-description = Cur síos +add-another-keybinding = Cuir ceangal eochrach eile leis +cancel = Cealaigh +close-window = Dún an fhuinneog +copy-or-sigint = Cóipeáil nó SIGINT +disable = Díchumasaigh +focus-pane-down = Painéal fócais síos +focus-pane-left = Painéal fócais ar chlé +focus-pane-right = Painéal fócais ar dheis +focus-pane-up = Painéal fócais suas +keyboard-shortcuts = Aicearraí méarchláir +menu-keyboard-shortcuts = Aicearraí méarchláir... +no-shortcuts = Gan aicearraí +password-manager = Bainisteoir pasfhocal +paste-primary = Greamaigh príomhúil +replace = Athsholáthair +reset-to-default = Athshocraigh go réamhshocraithe +shortcut-capture-hint = Brúigh an teaglaim eochrach +shortcut-group-clipboard = Gearrthaisce +shortcut-group-other = Eile +shortcut-group-tabs = Cluaisíní +shortcut-group-window = Fuinneog +shortcut-group-zoom = Súmáil +shortcut-replace-body = Tá { $binding } sannta do { $existing } cheana féin. Cuir { $new_action } ina áit? +shortcut-replace-title = Aicearra a athsholáthar? +tab-activate = Gníomhachtaigh an cluaisín { $number } +toggle-fullscreen = Scoraigh lánscáileán +type-to-search = Clóscríobh le cuardach a dhéanamh... diff --git a/i18n/hu/cosmic_term.ftl b/i18n/hu/cosmic_term.ftl index 7eb0fda..37ce161 100644 --- a/i18n/hu/cosmic_term.ftl +++ b/i18n/hu/cosmic_term.ftl @@ -117,3 +117,30 @@ add-password = Jelszó hozzáadása password-input = Jelszó password-input-description = Leírás open-link = Hivatkozás megnyitása +add-another-keybinding = Új gyorsbillentyű hozzáadása +cancel = Mégse +close-window = Ablak bezárása +copy-or-sigint = Másolás vagy SIGINT +disable = Letiltás +focus-pane-down = Fókusz az alsó panelre +focus-pane-left = Fókusz a bal oldali panelre +focus-pane-right = Fókusz a jobb oldali panelre +keyboard-shortcuts = Gyorsbillentyűk +menu-keyboard-shortcuts = Gyorsbillentyűk… +no-shortcuts = Nincsenek gyorsbillentyűk +password-manager = Jelszókezelő +focus-pane-up = Fókusz a felső panelre +paste-primary = Elsődleges vágólap beillesztése +replace = Csere +reset-to-default = Visszaállítás alapértelmezettre +shortcut-capture-hint = Nyomd meg a billentyűkombinációt +shortcut-group-clipboard = Vágólap +shortcut-group-other = Egyéb +shortcut-group-tabs = Lapok +shortcut-group-window = Ablak +shortcut-group-zoom = Nagyítás +shortcut-replace-body = A(z) { $binding } már hozzá van rendelve ehhez: { $existing }. Lecseréled erre: { $new_action }? +shortcut-replace-title = Gyorsbillentyű cseréje? +tab-activate = { $number }. lap aktiválása +toggle-fullscreen = Teljes képernyő váltása +type-to-search = Gépelj a kereséshez… diff --git a/i18n/id/cosmic_term.ftl b/i18n/id/cosmic_term.ftl index 51a9c43..06e9cf3 100644 --- a/i18n/id/cosmic_term.ftl +++ b/i18n/id/cosmic_term.ftl @@ -68,7 +68,7 @@ next-tab = Tab selanjutnya previous-tab = Tab sebelumnya split-horizontal = Pemisahan horisontal split-vertical = Pemisahan vertikal -pane-toggle-maximize = Alihkan ke maksimal +pane-toggle-maximize = Ubah ke maksimal menu-color-schemes = Skema warna... menu-settings = Pengaturan... menu-about = Tentang Terminal COSMIC... @@ -77,3 +77,30 @@ passwords-title = Kata Sandi add-password = Tambahkan Kata Sandi password-input = Kata Sandi password-input-description = Deskripsi +add-another-keybinding = Tambahkan pintasan tombol lainnya +cancel = Batalkan +close-window = Tutup jendela +copy-or-sigint = Salin atau SIGINT +disable = Nonaktifkan +type-to-search = Ketik untuk mencari... +toggle-fullscreen = Ubah layar penuh +tab-activate = Aktifkan tab { $number } +replace = Ganti +shortcut-replace-title = Ganti pintasan? +shortcut-group-zoom = Zum +shortcut-group-window = Jendela +shortcut-group-tabs = Tab +shortcut-group-other = Lainnya +shortcut-group-clipboard = Papan klip +shortcut-capture-hint = Tekan kombinasi tombol +reset-to-default = Atur ulang ke bawaan +shortcut-replace-body = { $binding } sudah ditetapkan ke { $existing }. Ganti dengan { $new_action }? +paste-primary = Tempel primer +password-manager = Pengelolaan kata sandi +no-shortcuts = Tidak ada pintasan +menu-keyboard-shortcuts = Pintasan papan ketik... +keyboard-shortcuts = Pintasan papan ketik +focus-pane-down = Fokuskan panel ke bawah +focus-pane-left = Fokuskan panel ke kiri +focus-pane-right = Fokuskan panel ke kanan +focus-pane-up = Fokuskan panel ke atas diff --git a/i18n/kk/cosmic_term.ftl b/i18n/kk/cosmic_term.ftl index d5ba93d..c3e8a1e 100644 --- a/i18n/kk/cosmic_term.ftl +++ b/i18n/kk/cosmic_term.ftl @@ -77,3 +77,30 @@ passwords-title = Парольдер add-password = Пароль қосу password-input = Пароль password-input-description = Сипаттама +cancel = Бас тарту +add-another-keybinding = Басқа пернелер тіркесін қосу +close-window = Терезені жабу +copy-or-sigint = Көшіру немесе SIGINT +disable = Сөндіру +focus-pane-down = Төмендегі панельге фокустау +focus-pane-left = Сол жақтағы панельге фокустау +focus-pane-right = Оң жақтағы панельге фокустау +focus-pane-up = Жоғарыдағы панельге фокустау +keyboard-shortcuts = Пернетақта жарлықтары +menu-keyboard-shortcuts = Пернетақта жарлықтары... +no-shortcuts = Жарлықтар жоқ +password-manager = Парольдер менеджері +paste-primary = Негізгіні кірістіру +replace = Алмастыру +reset-to-default = Әдепкі күйге қайтару +shortcut-capture-hint = Пернелер комбинациясын басыңыз +shortcut-group-clipboard = Алмасу буфері +shortcut-group-other = Басқа +shortcut-group-tabs = Беттер +shortcut-group-window = Терезе +shortcut-group-zoom = Масштаб +shortcut-replace-body = { $binding } қазірдің өзінде { $existing } үшін тағайындалған. Оны { $new_action } әрекетімен алмастыру керек пе? +shortcut-replace-title = Жарлықты алмастыру керек пе? +tab-activate = { $number }-бетті белсендіру +toggle-fullscreen = Толық экран режиміне ауысу +type-to-search = Іздеу үшін теріңіз... diff --git a/i18n/ml/cosmic_term.ftl b/i18n/ml/cosmic_term.ftl new file mode 100644 index 0000000..e69de29 diff --git a/i18n/nl/cosmic_term.ftl b/i18n/nl/cosmic_term.ftl index 9a22d0f..10e1a1c 100644 --- a/i18n/nl/cosmic_term.ftl +++ b/i18n/nl/cosmic_term.ftl @@ -11,9 +11,9 @@ new-terminal = Nieuwe terminal color-schemes = Kleurenschema's rename = Hernoem -export = Exporteer +export = Exporteren delete = Verwijder -import = Importeer +import = Importeren import-errors = Importfouten ## Profiles @@ -111,3 +111,6 @@ menu-settings = Instellingen… menu-about = Over COSMIC Terminal… support = Ondersteuning repository = Bibliotheek +cancel = Annuleren +type-to-search = Typ om te zoeken… +replace = Vervangen diff --git a/i18n/oc/cosmic_term.ftl b/i18n/oc/cosmic_term.ftl new file mode 100644 index 0000000..e69de29 diff --git a/i18n/pl/cosmic_term.ftl b/i18n/pl/cosmic_term.ftl index 21329c7..9a01731 100644 --- a/i18n/pl/cosmic_term.ftl +++ b/i18n/pl/cosmic_term.ftl @@ -117,3 +117,30 @@ add-password = Dodaj Hasło password-input = Hasło password-input-description = Opis open-link = Otwórz Odnośnik +add-another-keybinding = Dodaj kolejny skrót klawiszowy +cancel = Anuluj +close-window = Zamknij okno +copy-or-sigint = Kopiuj lub SIGINT +disable = Wyłącz +keyboard-shortcuts = Skróty klawiszowe +menu-keyboard-shortcuts = Skróty klawiszowe… +no-shortcuts = Brak skrótów +password-manager = Menedżer haseł +paste-primary = Wklej główne +replace = Zastąp +reset-to-default = Przywróć domyślne +shortcut-capture-hint = Naciśnij kombinację klawiszy +shortcut-group-clipboard = Schowek +shortcut-group-other = Inne +shortcut-group-tabs = Karty +shortcut-group-window = Okno +shortcut-group-zoom = Przybliżenie +shortcut-replace-body = { $binding } jest już przypisany do { $existing }. Zastąpć je przez { $new_action }? +shortcut-replace-title = Zastąpić skrót klawiszowy? +tab-activate = Aktywuj kartę { $number } +toggle-fullscreen = Przełącznik pełnego ekranu +type-to-search = Zacznij pisać by wyszukać… +focus-pane-down = Aktywuj panel niżej +focus-pane-left = Aktywuj lewy panel +focus-pane-right = Aktywuj prawy panel +focus-pane-up = Aktywuj panel wyżej diff --git a/i18n/pt-BR/cosmic_term.ftl b/i18n/pt-BR/cosmic_term.ftl index 4118512..d9250fd 100644 --- a/i18n/pt-BR/cosmic_term.ftl +++ b/i18n/pt-BR/cosmic_term.ftl @@ -117,3 +117,30 @@ passwords-title = Senhas add-password = Adicionar Senha password-input = Senha password-input-description = Descrição +add-another-keybinding = Adicionar outra combinação de teclas +cancel = Cancelar +close-window = Fechar janela +copy-or-sigint = Copiar ou SIGINT +disable = Desabilitar +focus-pane-down = Focar painel abaixo +focus-pane-left = Focar painel à esquerda +focus-pane-right = Focar painel à direita +focus-pane-up = Focar painel acima +keyboard-shortcuts = Atalhos de teclado +menu-keyboard-shortcuts = Atalhos de teclado... +no-shortcuts = Sem atalhos +password-manager = Gerenciador de senhas +paste-primary = Colar +replace = Substituir +reset-to-default = Restaurar padrão +shortcut-capture-hint = Pressione a combinação de teclas +shortcut-group-clipboard = Área de transferência +shortcut-group-other = Outro +shortcut-group-tabs = Abas +shortcut-group-window = Janela +shortcut-group-zoom = Zoom +shortcut-replace-body = { $binding } já está atribuído a { $existing }. Substituir por { $new_action }? +shortcut-replace-title = Substituir atalho? +tab-activate = Ativar aba { $number } +toggle-fullscreen = Alternar para tela cheia +type-to-search = Digite para pesquisar... diff --git a/i18n/ru/cosmic_term.ftl b/i18n/ru/cosmic_term.ftl index 357d753..dfa6b60 100644 --- a/i18n/ru/cosmic_term.ftl +++ b/i18n/ru/cosmic_term.ftl @@ -13,7 +13,7 @@ color-schemes = Цветовые схемы rename = Переименовать export = Экспортировать delete = Удалить -import = Импортировать +import = Импорт import-errors = Ошибки при импорте ## Profiles @@ -39,8 +39,8 @@ settings = Параметры appearance = Оформление theme = Тема match-desktop = Как в системе -dark = Тёмное -light = Светлое +dark = Тёмная +light = Светлая syntax-dark = Тёмная цветовая схема syntax-light = Светлая цветовая схема default-zoom-step = Шаг масштабирования @@ -111,3 +111,30 @@ menu-about = О Терминале COSMIC... support = Поддержка repository = Репозиторий clear-scrollback = Очистить вывод команд +add-another-keybinding = Добавить сочетание клавиш +cancel = Отмена +close-window = Закрыть окно +copy-or-sigint = Копировать или SIGINT +disable = Отключить +focus-pane-down = Переместить фокус вниз +focus-pane-left = Переместить фокус налево +focus-pane-right = Переместить фокус направо +focus-pane-up = Переместить фокус вверх +keyboard-shortcuts = Сочетания клавиш +menu-keyboard-shortcuts = Сочетания клавиш... +no-shortcuts = Нет сочетаний клавиш +password-manager = Менеджер паролей +paste-primary = Вставить первичное выделение +replace = Заменить +reset-to-default = Вернуть по умолчанию +shortcut-capture-hint = Нажмите комбинацию клавиш +shortcut-group-clipboard = Буфер обмена +shortcut-group-other = Прочие +shortcut-group-tabs = Вкладки +shortcut-group-window = Окно +shortcut-group-zoom = Масштаб +shortcut-replace-body = { $binding } уже присвоено { $existing }. Заменить его на { $new_action }? +shortcut-replace-title = Заменить сочетание клавиш? +tab-activate = Активировать вкладку { $number } +toggle-fullscreen = Вкл./выкл. полноэкранный режим +type-to-search = Введите для поиска... diff --git a/i18n/sv-SE/cosmic_term.ftl b/i18n/sv-SE/cosmic_term.ftl index 8ad0927..cc21887 100644 --- a/i18n/sv-SE/cosmic_term.ftl +++ b/i18n/sv-SE/cosmic_term.ftl @@ -121,3 +121,30 @@ passwords-title = Lösenord add-password = Lägg till lösenord password-input = Lösenord password-input-description = Beskrivning +type-to-search = Skriv för att söka... +cancel = Avbryt +close-window = Stäng fönster +copy-or-sigint = Kopiera eller SIGINT +disable = Avaktivera +password-manager = Lösenordshanterare +replace = Ersätt +shortcut-capture-hint = Tryck tangentkombinationen +shortcut-group-window = Fönster +shortcut-replace-body = { $binding } har redan tilldelats till { $existing }. Ersätt den med { $new_action }? +shortcut-replace-title = Ersätt genväg? +tab-activate = Aktivera flik { $number } +toggle-fullscreen = Växla helskärmsläge +add-another-keybinding = Lägg till ytterligare tangentbindning +focus-pane-down = Fokusera fält nedåt +focus-pane-left = Fokusera fält vänster +focus-pane-right = Fokusera fält höger +focus-pane-up = Fokusera fält uppåt +keyboard-shortcuts = Tangentbordsgenvägar +menu-keyboard-shortcuts = Tangentbordsgenvägar... +no-shortcuts = Inga genvägar +paste-primary = Klistra in primär +reset-to-default = Återställ till standard +shortcut-group-clipboard = Urklipp +shortcut-group-other = Andra +shortcut-group-tabs = Flikar +shortcut-group-zoom = Zooma diff --git a/i18n/uk/cosmic_term.ftl b/i18n/uk/cosmic_term.ftl index c48df88..55756fe 100644 --- a/i18n/uk/cosmic_term.ftl +++ b/i18n/uk/cosmic_term.ftl @@ -12,7 +12,7 @@ new-terminal = Новий термінал color-schemes = Кольорові схеми rename = Перейменувати export = Експорт -delete = Вилучити +delete = Видалити import = Імпортувати import-errors = Помилки імпорту @@ -38,7 +38,7 @@ settings = Налаштування appearance = Зовнішній вигляд theme = Тема -match-desktop = Відповідно системі +match-desktop = Системна dark = Темна light = Світла syntax-dark = Темна колірна схема @@ -96,7 +96,7 @@ find = Знайти ## View -view = Вигляд +view = Вид zoom-in = Збільшити текст zoom-reset = Типовий розмір тексту zoom-out = Зменшити текст @@ -108,12 +108,39 @@ pane-toggle-maximize = Перемкнути розгортання menu-color-schemes = Кольорові схеми... menu-settings = Налаштування... menu-about = Про Термінал COSMIC... -repository = Репозиторій +repository = Сховище support = Підтримка -clear-scrollback = Очистити журнал прокрутки +clear-scrollback = Очистити прокрутку menu-password-manager = Паролі... passwords-title = Паролі add-password = Додати пароль password-input = Пароль password-input-description = Опис open-link = Відкрити ланку +cancel = Скасувати +close-window = Закрити вікно +disable = Вимкнути +keyboard-shortcuts = Сполучення клавіш +menu-keyboard-shortcuts = Сполучення клавіш... +password-manager = Менеджер паролів +replace = Замінити +reset-to-default = Типові значення +shortcut-group-tabs = Вкладки +shortcut-group-window = Вікно +shortcut-replace-body = { $binding } вже призначено { $existing }. Замінити на { $new_action }? +shortcut-replace-title = Замінити сполучення? +type-to-search = Введіть для пошуку… +copy-or-sigint = Копіювати або SIGINT +no-shortcuts = Сполучення не призначено +paste-primary = Вставити основне +shortcut-capture-hint = Натисніть комбінацію клавіш +shortcut-group-clipboard = Буфер обміну +shortcut-group-other = Інше +shortcut-group-zoom = Масштаб +tab-activate = Вибрати вкладку { $number } +toggle-fullscreen = На весь екран +add-another-keybinding = Додати ще сполучення +focus-pane-down = Фокус на нижню панель +focus-pane-left = Фокус на ліву панель +focus-pane-right = Фокус на праву панель +focus-pane-up = Фокус на верхню панель diff --git a/i18n/zh-CN/cosmic_term.ftl b/i18n/zh-CN/cosmic_term.ftl index fd291a4..de0da79 100644 --- a/i18n/zh-CN/cosmic_term.ftl +++ b/i18n/zh-CN/cosmic_term.ftl @@ -117,3 +117,30 @@ passwords-title = 密码 add-password = 添加密码 password-input = 密码 password-input-description = 描述 +cancel = 取消 +close-window = 关闭窗口 +disable = 禁用 +shortcut-group-window = 窗口 +add-another-keybinding = 添加另一个快捷键 +keyboard-shortcuts = 键盘快捷键 +menu-keyboard-shortcuts = 键盘快捷键… +no-shortcuts = 无快捷键 +password-manager = 密码管理器 +replace = 替换 +reset-to-default = 重置为默认值 +shortcut-group-clipboard = 剪切板 +shortcut-group-other = 其他 +shortcut-group-tabs = 标签 +shortcut-group-zoom = 缩放 +type-to-search = 输入即可搜索... +copy-or-sigint = 复制或 SIGINT +focus-pane-down = 聚焦下方窗格 +focus-pane-left = 聚焦左侧窗格 +focus-pane-right = 聚焦右侧窗格 +focus-pane-up = 聚焦上方窗格 +paste-primary = 粘贴主要 +shortcut-capture-hint = 按下组合键 +shortcut-replace-body = { $binding } 已分配给 { $existing }。是否将其替换为 { $new_action }? +shortcut-replace-title = 是否替换快捷键? +tab-activate = 启用标签 { $number } +toggle-fullscreen = 切换全屏 From 93c25f46a959cdb60eadabf90b5e8a610c540f57 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 5 Feb 2026 15:23:47 -0700 Subject: [PATCH 38/40] Epoch 1.0.6 version update Generated by cosmic-epoch scripts/version-update.sh --- Cargo.lock | 125 +++++++++++++++++++++++------------------------ Cargo.toml | 2 +- debian/changelog | 6 +++ 3 files changed, 69 insertions(+), 64 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ac17f42..7e5b5f9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -295,9 +295,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.100" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" [[package]] name = "apply" @@ -322,9 +322,9 @@ checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" [[package]] name = "arc-swap" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d03449bb8ca2cc2ef70869af31463d1ae5ccc8fa3e334b307203fbf815207e" +checksum = "9ded5f9a03ac8f24d1b8a25101ee812cd32cdc8c50a4c50237de2c4915850e73" dependencies = [ "rustversion", ] @@ -891,9 +891,9 @@ checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" [[package]] name = "bytemuck" -version = "1.24.0" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" dependencies = [ "bytemuck_derive", ] @@ -923,9 +923,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "bzip2" @@ -1440,7 +1440,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1461,7 +1461,7 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "quote", "syn 2.0.114", @@ -1469,8 +1469,8 @@ dependencies = [ [[package]] name = "cosmic-files" -version = "1.0.4" -source = "git+https://github.com/pop-os/cosmic-files.git#09eb076372c97d6f8d7f3daa58de82eb820e689d" +version = "1.0.5" +source = "git+https://github.com/pop-os/cosmic-files.git#055d9e371ca0be7dd2959a670212122c1010221b" dependencies = [ "anyhow", "chrono", @@ -1549,7 +1549,7 @@ dependencies = [ [[package]] name = "cosmic-settings-config" version = "0.1.0" -source = "git+https://github.com/pop-os/cosmic-settings-daemon#ef024bfd06bf9fbd57246a25c91d1fdd28153d05" +source = "git+https://github.com/pop-os/cosmic-settings-daemon#020c4addd71fdca9ef3eda21039d6db27f7c31e5" dependencies = [ "cosmic-config", "ron 0.11.0", @@ -1569,7 +1569,7 @@ dependencies = [ [[package]] name = "cosmic-term" -version = "1.0.5" +version = "1.0.6" dependencies = [ "alacritty_terminal", "clap_lex", @@ -1624,7 +1624,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "almost", "cosmic-config", @@ -1728,9 +1728,9 @@ checksum = "42aaeae719fd78ce501d77c6cdf01f7e96f26bcd5617a4903a1c2b97e388543a" [[package]] name = "csscolorparser" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02ee6eae4d99456f92dc379ba21cf08f783ef5525f193c3854b4e921ece045c5" +checksum = "64a878cfd6075649977f548ed439564cfdbe1f190a6656a00b48af7740f2f148" dependencies = [ "num-traits", "phf 0.13.1", @@ -1740,9 +1740,9 @@ dependencies = [ [[package]] name = "ctor-lite" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f791803201ab277ace03903de1594460708d2d54df6053f2d9e82f592b19e3b" +checksum = "b29fccfdaeb0f9bd90da5759b1d0eaa2f6cfcfe90960124cfc83141ed4e111fd" [[package]] name = "cursor-icon" @@ -2309,9 +2309,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b375d6465b98090a5f25b1c7703f3859783755aa9a80433b36e0379a3ec2f369" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", "miniz_oxide", @@ -3079,7 +3079,7 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "dnd", "iced_accessibility", @@ -3097,7 +3097,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "accesskit", "accesskit_winit", @@ -3106,7 +3106,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "bitflags 2.10.0", "bytes", @@ -3130,7 +3130,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "futures", "iced_core", @@ -3156,7 +3156,7 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "bitflags 2.10.0", "bytemuck", @@ -3178,7 +3178,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -3190,7 +3190,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "bytes", "cosmic-client-toolkit", @@ -3205,7 +3205,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "bytemuck", "cosmic-text", @@ -3221,7 +3221,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "as-raw-xcb-connection", "bitflags 2.10.0", @@ -3252,7 +3252,7 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -3271,7 +3271,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -3950,9 +3950,9 @@ checksum = "84de9d95a6d2547d9b77ee3f25fa0ee32e3c3a6484d47a55adebc0439c077992" [[package]] name = "jiff" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67e8da4c49d6d9909fe03361f9b620f58898859f5c7aded68351e85e71ecf50" +checksum = "d89a5b5e10d5a9ad6e5d1f4bd58225f655d6fe9767575a5e8ac5a6fe64e04495" dependencies = [ "jiff-static", "log", @@ -3963,9 +3963,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c84ee7f197eca9a86c6fd6cb771e55eb991632f15f2bc3ca6ec838929e6e78" +checksum = "ff7a39c8862fc1369215ccf0a8f12dd4598c7f6484704359f0351bd617034dbf" dependencies = [ "proc-macro2", "quote", @@ -4303,7 +4303,7 @@ checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" [[package]] name = "libcosmic" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#fdcba7d8ececc35c09a7871b018930f752ac784b" +source = "git+https://github.com/pop-os/libcosmic.git#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "apply", "ashpd 0.12.1", @@ -5662,15 +5662,15 @@ checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" [[package]] name = "portable-atomic" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" dependencies = [ "portable-atomic", ] @@ -6137,9 +6137,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.12.2" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", @@ -6149,9 +6149,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -6160,9 +6160,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" [[package]] name = "renderdoc-sys" @@ -6394,9 +6394,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e910108742c57a770f492731f99be216a52fadd361b06c8fb59d74ccc267d2" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" dependencies = [ "dyn-clone", "ref-cast", @@ -6530,7 +6530,7 @@ dependencies = [ "indexmap 1.9.3", "indexmap 2.13.0", "schemars 0.9.0", - "schemars 1.2.0", + "schemars 1.2.1", "serde_core", "serde_json", "serde_with_macros", @@ -6649,9 +6649,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "slotmap" @@ -8873,18 +8873,18 @@ checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" [[package]] name = "zerocopy" -version = "0.8.37" +version = "0.8.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7456cf00f0685ad319c5b1693f291a650eaf345e941d082fc4e03df8a03996ac" +checksum = "57cf3aa6855b23711ee9852dfc97dfaa51c45feaba5b645d0c777414d494a961" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.37" +version = "0.8.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1328722bbf2115db7e19d69ebcc15e795719e2d66b60827c6a69a117365e37a0" +checksum = "8a616990af1a287837c4fe6596ad77ef57948f787e46ce28e166facc0cc1cb75" dependencies = [ "proc-macro2", "quote", @@ -8968,9 +8968,9 @@ dependencies = [ [[package]] name = "zip" -version = "7.2.0" +version = "7.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42e33efc22a0650c311c2ef19115ce232583abbe80850bc8b66509ebef02de0" +checksum = "268bf6f9ceb991e07155234071501490bb41fd1e39c6a588106dad10ae2a5804" dependencies = [ "aes", "bzip2", @@ -8978,7 +8978,6 @@ dependencies = [ "crc32fast", "deflate64", "flate2", - "generic-array", "getrandom 0.3.4", "hmac", "indexmap 2.13.0", @@ -8996,15 +8995,15 @@ dependencies = [ [[package]] name = "zlib-rs" -version = "0.5.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40990edd51aae2c2b6907af74ffb635029d5788228222c4bb811e9351c0caad3" +checksum = "a7948af682ccbc3342b6e9420e8c51c1fe5d7bf7756002b4a3c6cabfe96a7e3c" [[package]] name = "zmij" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1966f8ac2c1f76987d69a74d0e0f929241c10e78136434e3be70ff7f58f64214" +checksum = "3ff05f8caa9038894637571ae6b9e29466c1f4f829d26c9b28f869a29cbe3445" [[package]] name = "zopfli" diff --git a/Cargo.toml b/Cargo.toml index 842dd09..30fda4a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmic-term" -version = "1.0.5" +version = "1.0.6" authors = ["Jeremy Soller "] edition = "2024" license = "GPL-3.0-only" diff --git a/debian/changelog b/debian/changelog index 71e3402..4a9c877 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +cosmic-term (1.0.6) noble; urgency=medium + + * Epoch 1.0.6 version update + + -- Jeremy Soller Thu, 05 Feb 2026 15:23:41 -0700 + cosmic-term (1.0.5) noble; urgency=medium * Epoch 1.0.5 version update From 51454564cc8da7eb559c615484eeff898e85b91e Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 12 Feb 2026 15:23:04 -0700 Subject: [PATCH 39/40] Generate translated desktop and metainfo files with xdgen --- Cargo.lock | 38 ++++++++++++++++++++++++ Cargo.toml | 3 ++ build.rs | 24 +++++++++++++++ i18n/ar/cosmic_term.ftl | 2 ++ i18n/cs/cosmic_term.ftl | 2 ++ i18n/en/cosmic_term.ftl | 2 ++ i18n/es-ES/cosmic_term.ftl | 2 ++ i18n/hu/cosmic_term.ftl | 2 ++ i18n/it/cosmic_term.ftl | 2 ++ i18n/pl/cosmic_term.ftl | 2 ++ i18n/pt-BR/cosmic_term.ftl | 2 ++ i18n/pt/cosmic_term.ftl | 2 ++ i18n/ru/cosmic_term.ftl | 2 ++ i18n/sk/cosmic_term.ftl | 2 ++ i18n/sv-SE/cosmic_term.ftl | 2 ++ justfile | 4 +-- res/com.system76.CosmicTerm.desktop | 31 ------------------- res/com.system76.CosmicTerm.metainfo.xml | 26 ++++------------ src/main.rs | 1 + 19 files changed, 98 insertions(+), 53 deletions(-) create mode 100644 build.rs diff --git a/Cargo.lock b/Cargo.lock index 7e5b5f9..6f5f998 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1596,6 +1596,7 @@ dependencies = [ "thiserror 2.0.18", "tokio", "url", + "xdgen", ] [[package]] @@ -2520,6 +2521,16 @@ dependencies = [ "xdg", ] +[[package]] +name = "freedesktop_entry_parser" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6d3a3635983a889f065aa9ce760384713f23a9b4a04f696f86c39a5d7a6a5a" +dependencies = [ + "indexmap 2.13.0", + "nom 8.0.0", +] + [[package]] name = "fsevent-sys" version = "4.1.0" @@ -8634,6 +8645,18 @@ dependencies = [ "unicase", ] +[[package]] +name = "xdgen" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25af88f104f06d5aeb80c77e5eb85e6f6f355f86f6e34307a14befd716efe4bf" +dependencies = [ + "fluent", + "freedesktop_entry_parser", + "unic-langid", + "xmltree", +] + [[package]] name = "xkbcommon" version = "0.7.0" @@ -8689,12 +8712,27 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "xml" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8aa498d22c9bbaf482329839bc5620c46be275a19a812e9a22a2b07529a642a" + [[package]] name = "xml-rs" version = "0.8.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" +[[package]] +name = "xmltree" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbc04313cab124e498ab1724e739720807b6dc405b9ed0edc5860164d2e4ff70" +dependencies = [ + "xml", +] + [[package]] name = "xmlwriter" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 30fda4a..e2c2f25 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,6 +53,9 @@ features = ["about", "multi-window", "tokio", "winit", "surface-message"] [target.'cfg(unix)'.dependencies] fork = "0.4" +[build-dependencies] +xdgen = "0.1" + [features] default = ["dbus-config", "wgpu", "wayland", "password_manager"] dbus-config = ["libcosmic/dbus-config"] diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..fc799c2 --- /dev/null +++ b/build.rs @@ -0,0 +1,24 @@ +use std::{env, fs, path::PathBuf}; +use xdgen::{App, Context, FluentString}; + +fn main() { + let id = "com.system76.CosmicTerm"; + let ctx = Context::new("i18n", env::var("CARGO_PKG_NAME").unwrap()).unwrap(); + let app = App::new(FluentString("cosmic-terminal")) + .comment(FluentString("comment")) + .keywords(FluentString("keywords")); + let output = PathBuf::from("target/xdgen"); + fs::create_dir_all(&output).unwrap(); + fs::write( + output.join(format!("{}.desktop", id)), + app.expand_desktop(format!("res/{}.desktop", id), &ctx) + .unwrap(), + ) + .unwrap(); + fs::write( + output.join(format!("{}.metainfo.xml", id)), + app.expand_metainfo(format!("res/{}.metainfo.xml", id), &ctx) + .unwrap(), + ) + .unwrap(); +} diff --git a/i18n/ar/cosmic_term.ftl b/i18n/ar/cosmic_term.ftl index df282cd..1c2f4e2 100644 --- a/i18n/ar/cosmic_term.ftl +++ b/i18n/ar/cosmic_term.ftl @@ -1,4 +1,6 @@ cosmic-terminal = طرفية COSMIC +comment = محاكي طرفي لسطح مكتب COSMIC +keywords = cli;طرفية;أوامر;صدفة; new-terminal = طرفية جديدة # Context Pages diff --git a/i18n/cs/cosmic_term.ftl b/i18n/cs/cosmic_term.ftl index 95405b1..21f42f0 100644 --- a/i18n/cs/cosmic_term.ftl +++ b/i18n/cs/cosmic_term.ftl @@ -1,3 +1,5 @@ +comment = Emulátor terminálu pro pracovní prostředí COSMIC +keywords = Příkaz;Shell;Terminál;Konzole;CLI; settings = Nastavení appearance = Vzhled theme = Motiv diff --git a/i18n/en/cosmic_term.ftl b/i18n/en/cosmic_term.ftl index 00d892c..08bc0a4 100644 --- a/i18n/en/cosmic_term.ftl +++ b/i18n/en/cosmic_term.ftl @@ -1,4 +1,6 @@ cosmic-terminal = COSMIC Terminal +comment = Terminal emulator for the COSMIC desktop +keywords = Command;Shell;Terminal;CLI; new-terminal = New terminal # Context Pages diff --git a/i18n/es-ES/cosmic_term.ftl b/i18n/es-ES/cosmic_term.ftl index 154f5bd..e0ad38b 100644 --- a/i18n/es-ES/cosmic_term.ftl +++ b/i18n/es-ES/cosmic_term.ftl @@ -1,4 +1,6 @@ cosmic-terminal = Terminal COSMIC +comment = Emulador de terminal de escritorio COSMIC +keywords = Comando;Shell;Terminal;Consola; new-terminal = Nuevo terminal # Context Pages diff --git a/i18n/hu/cosmic_term.ftl b/i18n/hu/cosmic_term.ftl index 37ce161..13cabd1 100644 --- a/i18n/hu/cosmic_term.ftl +++ b/i18n/hu/cosmic_term.ftl @@ -1,4 +1,6 @@ cosmic-terminal = COSMIC Terminál +comment = Terminálemulátor a COSMIC asztali környezethez +keywords = parancssor;terminál; new-terminal = Új terminál # Context Pages diff --git a/i18n/it/cosmic_term.ftl b/i18n/it/cosmic_term.ftl index 9d96497..ba59cf0 100644 --- a/i18n/it/cosmic_term.ftl +++ b/i18n/it/cosmic_term.ftl @@ -1,4 +1,6 @@ cosmic-terminal = Terminale COSMIC +comment = Emulatore di terminale di COSMIC +keywords = Comando;Shell;Terminale;Console; new-terminal = Nuovo terminale # Context Pages diff --git a/i18n/pl/cosmic_term.ftl b/i18n/pl/cosmic_term.ftl index 9a01731..0ee3fc3 100644 --- a/i18n/pl/cosmic_term.ftl +++ b/i18n/pl/cosmic_term.ftl @@ -1,4 +1,6 @@ cosmic-terminal = Terminal COSMIC +comment = Emulator terminala dla pulpitu COSMIC +keywords = Cli;WierszPoleceń;Powłoka;Terminal; new-terminal = Nowy terminal # Context Pages diff --git a/i18n/pt-BR/cosmic_term.ftl b/i18n/pt-BR/cosmic_term.ftl index d9250fd..367cfd2 100644 --- a/i18n/pt-BR/cosmic_term.ftl +++ b/i18n/pt-BR/cosmic_term.ftl @@ -1,4 +1,6 @@ cosmic-terminal = Terminal COSMIC +comment = Emulador de terminal do desktop COSMIC +keywords = Comando;Shell;Terminal; new-terminal = Novo terminal # Context Pages diff --git a/i18n/pt/cosmic_term.ftl b/i18n/pt/cosmic_term.ftl index e29b2ec..f4b63bd 100644 --- a/i18n/pt/cosmic_term.ftl +++ b/i18n/pt/cosmic_term.ftl @@ -1,4 +1,6 @@ cosmic-terminal = Terminal COSMIC +comment = Emulador de terminal do desktop COSMIC +keywords = Comando;Shell;Terminal;Console; new-terminal = Novo terminal # Context Pages diff --git a/i18n/ru/cosmic_term.ftl b/i18n/ru/cosmic_term.ftl index dfa6b60..d351b38 100644 --- a/i18n/ru/cosmic_term.ftl +++ b/i18n/ru/cosmic_term.ftl @@ -1,4 +1,6 @@ cosmic-terminal = Терминал COSMIC +comment = Эмулятор терминала для рабочей среды COSMIC +keywords = Команда;Оболочка;Терминал;Консоль; new-terminal = Новый терминал # Context Pages diff --git a/i18n/sk/cosmic_term.ftl b/i18n/sk/cosmic_term.ftl index 5c101b5..48bf133 100644 --- a/i18n/sk/cosmic_term.ftl +++ b/i18n/sk/cosmic_term.ftl @@ -1,4 +1,6 @@ cosmic-terminal = Terminál COSMIC +comment = Emulátor terminálu pre pracovné prostredie COSMIC +keywords = Príkaz;Shell;Terminál;Konzola; new-terminal = Nový terminál # Kontextové stránky diff --git a/i18n/sv-SE/cosmic_term.ftl b/i18n/sv-SE/cosmic_term.ftl index cc21887..2664e5e 100644 --- a/i18n/sv-SE/cosmic_term.ftl +++ b/i18n/sv-SE/cosmic_term.ftl @@ -1,4 +1,6 @@ cosmic-terminal = COSMIC Terminal +comment = Terminalemulator för skribordsmiljön COSMIC +keywords = Kommando;Skal;Terminal;CLI;Konsol; new-terminal = Ny terminal # Context Pages diff --git a/justfile b/justfile index 9835c8e..93be2ca 100644 --- a/justfile +++ b/justfile @@ -13,11 +13,11 @@ bin-src := cargo-target-dir / 'release' / name bin-dst := base-dir / 'bin' / name desktop := APPID + '.desktop' -desktop-src := 'res' / desktop +desktop-src := 'target/xdgen' / desktop desktop-dst := clean(rootdir / prefix) / 'share' / 'applications' / desktop metainfo := APPID + '.metainfo.xml' -metainfo-src := 'res' / metainfo +metainfo-src := 'target/xdgen' / metainfo metainfo-dst := clean(rootdir / prefix) / 'share' / 'metainfo' / metainfo icons-src := 'res' / 'icons' / 'hicolor' diff --git a/res/com.system76.CosmicTerm.desktop b/res/com.system76.CosmicTerm.desktop index dd19157..de41169 100644 --- a/res/com.system76.CosmicTerm.desktop +++ b/res/com.system76.CosmicTerm.desktop @@ -1,26 +1,6 @@ -#TODO: more build-out, desktop actions, translations? [Desktop Entry] Name=COSMIC Terminal -Name[ar]=طرفية COSMIC -Name[cs]=Terminál COSMIC -Name[zh_CN]=COSMIC 终端 -Name[pl]=Terminal COSMIC -Name[pt_BR]=Terminal -Name[ru]=Терминал -Name[hu]=COSMIC Terminál -Name[pt]=Terminal -Name[sk]=Terminál COSMIC -Name[es]=Terminal COSMIC -Name[it]=Terminale di COSMIC -Name[sv]=COSMIC Terminal Comment=Terminal emulator for the COSMIC desktop -Comment[ar]=محاكي طرفي لسطح مكتب COSMIC -Comment[cs]=Emulátor terminálu pro pracovní prostředí COSMIC -Comment[sk]=Emulátor terminálu pre pracovné prostredie COSMIC -Comment[ru]=Эмулятор терминала для рабочей среды COSMIC -Comment[hu]=Terminálemulátor a COSMIC asztali környezethez -Comment[it]=Emulatore di terminale di COSMIC -Comment[sv]=Terminalemulator för skribordsmiljön COSMIC Exec=cosmic-term Terminal=false Type=Application @@ -28,14 +8,3 @@ StartupNotify=true Icon=com.system76.CosmicTerm Categories=COSMIC;System;TerminalEmulator; Keywords=Command;Shell;Terminal;CLI; -Keywords[ar]=cli;طرفية;أوامر;صدفة; -Keywords[cs]=Příkaz;Shell;Terminál;Konzole;CLI; -Keywords[pl]=Cli;WierszPoleceń;Powłoka;Terminal; -Keywords[pt_BR]=Comando;Shell;Terminal; -Keywords[hu]=parancssor;terminál; -Keywords[pt]=Comando;Shell;Terminal;Console; -Keywords[sk]=Príkaz;Shell;Terminál;Konzola; -Keywords[ru]=Команда;Оболочка;Терминал;Консоль; -Keywords[es]=Comando;Shell;Terminal;Consola; -Keywords[it]=Comando;Shell;Terminale;Console; -Keywords[sv]=Kommando;Skal;Terminal;CLI;Konsol diff --git a/res/com.system76.CosmicTerm.metainfo.xml b/res/com.system76.CosmicTerm.metainfo.xml index 0ff2aca..dcc3635 100644 --- a/res/com.system76.CosmicTerm.metainfo.xml +++ b/res/com.system76.CosmicTerm.metainfo.xml @@ -9,27 +9,7 @@ https://github.com/pop-os/cosmic-term https://github.com/pop-os/cosmic-term COSMIC Terminal - طرفية COSMIC - Terminál COSMIC - Terminal COSMIC - COSMIC Terminál - Terminal - Terminal - Terminál COSMIC - Terminal COSMIC - Terminale di COSMIC - COSMIC Terminal Terminal emulator for the COSMIC desktop - محاكي طرفي لسطح مكتب COSMIC - Emulátor terminálu pro pracovní prostředí COSMIC - Emulator terminala dla pulpitu COSMIC - Terminálemulátor a COSMIC asztali környezethez - Emulador de terminal do desktop COSMIC - Emulador de terminal do desktop COSMIC - Emulátor terminálu pre pracovné prostredie COSMIC - Emulador de terminal de escritorio COSMIC - Emulatore di terminale di COSMIC - Terminalemulator för skrivbordsmiljön COSMIC

Terminal emulator for the COSMIC desktop

محاكي طرفي لسطح مكتب COSMIC

@@ -43,6 +23,12 @@

Emulatore di terminale di COSMIC

Terminalemulator för skrivbordsmiljön COSMIC

+ + Command + Shell + Terminal + CLI + com.system76.CosmicTerm.desktop https://raw.githubusercontent.com/pop-os/cosmic-term/master/res/icons/hicolor/256x256/apps/com.system76.CosmicTerm.svg diff --git a/src/main.rs b/src/main.rs index 0984566..6cc48ca 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1761,6 +1761,7 @@ impl Application for App { .icon(widget::icon::from_name(Self::APP_ID)) .version(env!("CARGO_PKG_VERSION")) .author("System76") + .comments(fl!("comment")) .license("GPL-3.0-only") .license_url("https://spdx.org/licenses/GPL-3.0-only") .developers([("Jeremy Soller", "jeremy@system76.com")]) From a9c9d5684dce02d3e676e40855a34dbdb66f4d82 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Fri, 13 Feb 2026 12:35:27 -0700 Subject: [PATCH 40/40] Add pull request template --- .github/PULL_REQUEST_TEMPLATE.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..e6ca28b --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,8 @@ +- [ ] I have disclosed use of any AI generated code in my commit messages. + - If you are using an LLM, and do not fully understand the changes it is making to the code base, do not create a PR. + - In our experience, AI generated code often results in overly complex code that lacks enough context for a proper fix or feature inclusion. This results in considerably longer code reviews. Due to this, AI authored or partially authored PRs may be closed without comment. +- [ ] I understand these changes in full and will be able to respond to review comments. +- [ ] My change is accurately described in the commit message. +- [ ] My contribution is tested and working as described. +- [ ] I have read the [Developer Certificate of Origin](https://developercertificate.org/) and certify my contribution under its conditions. +