diff --git a/Cargo.lock b/Cargo.lock index 5ecab30..e9205b2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1199,7 +1199,7 @@ checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" dependencies = [ "serde", "termcolor", - "unicode-width 0.2.2", + "unicode-width 0.1.14", ] [[package]] @@ -1391,6 +1391,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "1.0.0" +source = "git+https://github.com/pop-os/libcosmic#3f9e93067b31d9ba81a4e3a28653b3380c61c352" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1411,6 +1412,7 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "1.0.0" +source = "git+https://github.com/pop-os/libcosmic#3f9e93067b31d9ba81a4e3a28653b3380c61c352" dependencies = [ "quote", "syn 2.0.117", @@ -1586,7 +1588,7 @@ dependencies = [ "itertools 0.14.0", "itoa", "jiff", - "libcosmic-yoda", + "libcosmic", "locale1", "locales-rs", "mime 0.3.17", @@ -1735,7 +1737,7 @@ version = "1.0.7" dependencies = [ "derive_setters", "downcast-rs 2.0.2", - "libcosmic-yoda", + "libcosmic", "regex", "slab", "slotmap", @@ -1760,7 +1762,7 @@ dependencies = [ "cosmic-pipewire", "futures", "intmap", - "libcosmic-yoda", + "libcosmic", "numtoa", "rustix 1.1.4", "tokio", @@ -1825,6 +1827,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "1.0.0" +source = "git+https://github.com/pop-os/libcosmic#3f9e93067b31d9ba81a4e3a28653b3380c61c352" dependencies = [ "almost", "configparser", @@ -3247,6 +3250,7 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic#3f9e93067b31d9ba81a4e3a28653b3380c61c352" dependencies = [ "dnd", "iced_accessibility", @@ -3267,6 +3271,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" +source = "git+https://github.com/pop-os/libcosmic#3f9e93067b31d9ba81a4e3a28653b3380c61c352" dependencies = [ "accesskit", "accesskit_winit", @@ -3275,6 +3280,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic#3f9e93067b31d9ba81a4e3a28653b3380c61c352" dependencies = [ "bitflags 2.11.1", "bytes", @@ -3299,6 +3305,7 @@ dependencies = [ [[package]] name = "iced_debug" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic#3f9e93067b31d9ba81a4e3a28653b3380c61c352" dependencies = [ "iced_core", "iced_futures", @@ -3308,6 +3315,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic#3f9e93067b31d9ba81a4e3a28653b3380c61c352" dependencies = [ "futures", "iced_core", @@ -3321,6 +3329,7 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic#3f9e93067b31d9ba81a4e3a28653b3380c61c352" dependencies = [ "bitflags 2.11.1", "bytemuck", @@ -3341,6 +3350,7 @@ dependencies = [ [[package]] name = "iced_program" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic#3f9e93067b31d9ba81a4e3a28653b3380c61c352" dependencies = [ "iced_graphics", "iced_runtime", @@ -3349,6 +3359,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic#3f9e93067b31d9ba81a4e3a28653b3380c61c352" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -3360,6 +3371,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic#3f9e93067b31d9ba81a4e3a28653b3380c61c352" dependencies = [ "bytes", "cosmic-client-toolkit", @@ -3375,6 +3387,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic#3f9e93067b31d9ba81a4e3a28653b3380c61c352" dependencies = [ "bytemuck", "cosmic-text", @@ -3391,6 +3404,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic#3f9e93067b31d9ba81a4e3a28653b3380c61c352" dependencies = [ "as-raw-xcb-connection", "bitflags 2.11.1", @@ -3421,6 +3435,7 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.14.2" +source = "git+https://github.com/pop-os/libcosmic#3f9e93067b31d9ba81a4e3a28653b3380c61c352" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -3440,6 +3455,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic#3f9e93067b31d9ba81a4e3a28653b3380c61c352" dependencies = [ "cosmic-client-toolkit", "cursor-icon", @@ -4549,8 +4565,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" [[package]] -name = "libcosmic-yoda" -version = "0.1.0-yoda" +name = "libcosmic" +version = "1.0.0" +source = "git+https://github.com/pop-os/libcosmic#3f9e93067b31d9ba81a4e3a28653b3380c61c352" dependencies = [ "apply", "ashpd 0.12.3", diff --git a/Cargo.toml b/Cargo.toml index ca0a1cd..c42187c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,23 +9,21 @@ rust-version = "1.90" [workspace.dependencies] cosmic-randr = { git = "https://github.com/pop-os/cosmic-randr" } tokio = { version = "1.49.0", features = ["macros"] } -# Yoda fork: direct path dep on iced_winit in libcosmic-yoda's submodule. -iced_winit = { path = "/home/lionel/Devels/libcosmic/iced/winit", default-features = false } +iced_winit = { git = "https://github.com/pop-os/libcosmic", default-features = false } -# Yoda fork — libcosmic-yoda by path, replaces upstream git dep. -[workspace.dependencies.libcosmic-yoda] +[workspace.dependencies.libcosmic] features = [ "dbus-config", "desktop", "multi-window", - "wayland", + "winit", "tokio", "qr_code", ] -path = "/home/lionel/Devels/libcosmic" +git = "https://github.com/pop-os/libcosmic" [workspace.dependencies.cosmic-config] -path = "/home/lionel/Devels/libcosmic/cosmic-config" +git = "https://github.com/pop-os/libcosmic" [workspace.dependencies.cosmic-bg-config] git = "https://github.com/pop-os/cosmic-bg" @@ -71,15 +69,19 @@ cosmic-client-toolkit = { git = "https://github.com/pop-os/cosmic-protocols//", # [patch.'https://github.com/pop-os/cosmic-settings-daemon'] # cosmic-settings-config = { git = "https://github.com/pop-os/cosmic-settings-daemon//", branch = "input_nobuild" } -# Yoda fork: redirect every transitive dep that asks for pop-os/libcosmic -# (cosmic-bg-config, cosmic-comp-config, cosmic-idle-config, cosmic-panel-config, -# cosmic-settings-config, cosmic-settings-daemon-config) to our local paths so -# the whole graph resolves against a single cosmic-config / cosmic-theme / iced_*. -[patch.'https://github.com/pop-os/libcosmic'] -cosmic-config = { path = "/home/lionel/Devels/libcosmic/cosmic-config" } -cosmic-theme = { path = "/home/lionel/Devels/libcosmic/cosmic-theme" } -iced_futures = { path = "/home/lionel/Devels/libcosmic/iced/futures" } -iced_winit = { path = "/home/lionel/Devels/libcosmic/iced/winit" } +# For development and testing purposes +# [patch.'https://github.com/pop-os/libcosmic'] +# libcosmic = { path = "../libcosmic" } +# cosmic-config = { path = "../libcosmic/cosmic-config" } +# cosmic-theme = { path = "../libcosmic/cosmic-theme" } +# iced_futures = { path = "../libcosmic/iced/futures" } +# iced_winit = { path = "../libcosmic/iced/winit" } + +# libcosmic = { git = "https://github.com/pop-os/libcosmic//" } +# cosmic-config = { git = "https://github.com/pop-os/libcosmic//" } +# cosmic-theme = { git = "https://github.com/pop-os/libcosmic//" } +# iced_futures = { git = "https://github.com/pop-os/libcosmic//" } +# iced_winit = { git = "https://github.com/pop-os/libcosmic//" } # [patch.'https://github.com/pop-os/dbus-settings-bindings'] # cosmic-dbus-networkmanager = { path = "../dbus-settings-bindings/networkmanager" } diff --git a/cosmic-settings/Cargo.toml b/cosmic-settings/Cargo.toml index c5e3cca..03c7a70 100644 --- a/cosmic-settings/Cargo.toml +++ b/cosmic-settings/Cargo.toml @@ -59,7 +59,7 @@ image = { version = "0.25", default-features = false, features = [ indexmap = "2.13.0" itertools = "0.14.0" itoa = "1.0.17" -libcosmic-yoda.workspace = true +libcosmic.workspace = true iced_winit.workspace = true locale1 = { git = "https://github.com/pop-os/dbus-settings-bindings", optional = true } sysinfo = { version = "=0.38.0", optional = true } @@ -187,12 +187,12 @@ page-window-management = ["cosmic-comp-config", "dep:cosmic-settings-config"] page-workspaces = ["cosmic-comp-config"] # Other features -a11y = ["libcosmic-yoda/a11y"] +a11y = ["libcosmic/a11y"] ashpd = ["dep:ashpd"] cosmic-comp-config = ["dep:cosmic-comp-config"] -dbus-config = ["libcosmic-yoda/dbus-config", "cosmic-config/dbus"] -single-instance = ["libcosmic-yoda/single-instance"] +dbus-config = ["libcosmic/dbus-config", "cosmic-config/dbus"] +single-instance = ["libcosmic/single-instance"] test = [] -wayland = ["libcosmic-yoda/wayland", "dep:cosmic-panel-config", "dep:cosmic-randr", "iced_winit/cctk"] -wgpu = ["libcosmic-yoda/wgpu"] -xdg-portal = ["ashpd", "libcosmic-yoda/xdg-portal"] +wayland = ["libcosmic/wayland", "dep:cosmic-panel-config", "dep:cosmic-randr", "iced_winit/cctk"] +wgpu = ["libcosmic/wgpu"] +xdg-portal = ["ashpd", "libcosmic/xdg-portal"] diff --git a/cosmic-settings/src/pages/applications/default_apps.rs b/cosmic-settings/src/pages/applications/default_apps.rs index ee759e3..89b28c0 100644 --- a/cosmic-settings/src/pages/applications/default_apps.rs +++ b/cosmic-settings/src/pages/applications/default_apps.rs @@ -11,7 +11,7 @@ use std::{ use cosmic::{ Apply, Element, Task, - iced::{Alignment, Length}, + iced::Alignment, surface, widget::{self, dropdown, icon, settings}, }; @@ -281,83 +281,269 @@ impl Page { } } -fn app_item(meta: &AppMeta, label: String, category: Category) -> widget::FlexRow<'_, Message> { - // Avoid creating popup_dropdown for empty app lists. - // Empty categories are rendered as non-interactive text to prevent Wayland crashes. - settings::flex_item( - label, - if meta.apps.is_empty() { - widget::text(fl!("default-apps", "not-installed")).apply(Element::from) - } else { - dropdown::popup_dropdown( - &meta.apps, - meta.selected, - move |id| Message::SetDefault(category, id), - cosmic::iced::window::Id::RESERVED, - Message::Surface, - |a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), - ) - .icons(Cow::Borrowed(&meta.icons)) - .apply(Element::from) - }, - ) - .align_items(Alignment::Center) - .width(Length::Shrink) -} - fn apps() -> Section { Section::default().view::(move |_binder, page, section| { let Some(mime_apps) = page.mime_apps.as_ref() else { return widget::space().into(); }; - settings::section::with_capacity(9) + // Avoid creating popup_dropdown for empty app lists. + // Empty categories are rendered as non-interactive text to prevent Wayland crashes. + settings::section() .title(§ion.title) - .add(app_item( - &mime_apps.apps[DROPDOWN_WEB_BROWSER], - fl!("default-apps", "web-browser"), - Category::WebBrowser, - )) - .add(app_item( - &mime_apps.apps[DROPDOWN_FILE_MANAGER], - fl!("default-apps", "file-manager"), - Category::FileManager, - )) - .add(app_item( - &mime_apps.apps[DROPDOWN_MAIL], - fl!("default-apps", "mail-client"), - Category::Mail, - )) - .add(app_item( - &mime_apps.apps[DROPDOWN_MUSIC], - fl!("default-apps", "music"), - Category::Audio, - )) - .add(app_item( - &mime_apps.apps[DROPDOWN_VIDEO], - fl!("default-apps", "video"), - Category::Video, - )) - .add(app_item( - &mime_apps.apps[DROPDOWN_PHOTO], - fl!("default-apps", "photos"), - Category::Image, - )) - .add(app_item( - &mime_apps.apps[DROPDOWN_CALENDAR], - fl!("default-apps", "calendar"), - Category::Calendar, - )) - .add(app_item( - &mime_apps.apps[DROPDOWN_TERMINAL], - fl!("default-apps", "terminal"), - Category::Terminal, - )) - .add(app_item( - &mime_apps.apps[DROPDOWN_TEXT_EDITOR], - fl!("default-apps", "text-editor"), - Category::TextEditor, - )) + .add({ + let meta = &mime_apps.apps[DROPDOWN_WEB_BROWSER]; + if meta.apps.is_empty() { + settings::flex_item( + fl!("default-apps", "web-browser"), + widget::text(fl!("default-apps", "not-installed")), + ) + .align_items(Alignment::Center) + } else { + settings::flex_item( + fl!("default-apps", "web-browser"), + dropdown::popup_dropdown( + &meta.apps, + meta.selected, + |id| Message::SetDefault(Category::WebBrowser, id), + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage( + crate::pages::Message::DefaultApps(a), + ) + }, + ) + .icons(Cow::Borrowed(&meta.icons)), + ) + .align_items(Alignment::Center) + .min_item_width(300.0) + } + }) + .add({ + let meta = &mime_apps.apps[DROPDOWN_FILE_MANAGER]; + if meta.apps.is_empty() { + settings::flex_item( + fl!("default-apps", "file-manager"), + widget::text(fl!("default-apps", "not-installed")), + ) + .align_items(Alignment::Center) + } else { + settings::flex_item( + fl!("default-apps", "file-manager"), + dropdown::popup_dropdown( + &meta.apps, + meta.selected, + |id| Message::SetDefault(Category::FileManager, id), + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage( + crate::pages::Message::DefaultApps(a), + ) + }, + ) + .icons(Cow::Borrowed(&meta.icons)), + ) + .align_items(Alignment::Center) + } + }) + .add({ + let meta = &mime_apps.apps[DROPDOWN_MAIL]; + if meta.apps.is_empty() { + settings::flex_item( + fl!("default-apps", "mail-client"), + widget::text(fl!("default-apps", "not-installed")), + ) + .align_items(Alignment::Center) + } else { + settings::flex_item( + fl!("default-apps", "mail-client"), + dropdown::popup_dropdown( + &meta.apps, + meta.selected, + |id| Message::SetDefault(Category::Mail, id), + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage( + crate::pages::Message::DefaultApps(a), + ) + }, + ) + .icons(Cow::Borrowed(&meta.icons)), + ) + .align_items(Alignment::Center) + } + }) + .add({ + let meta = &mime_apps.apps[DROPDOWN_MUSIC]; + if meta.apps.is_empty() { + settings::flex_item( + fl!("default-apps", "music"), + widget::text(fl!("default-apps", "not-installed")), + ) + .align_items(Alignment::Center) + } else { + settings::flex_item( + fl!("default-apps", "music"), + dropdown::popup_dropdown( + &meta.apps, + meta.selected, + |id| Message::SetDefault(Category::Audio, id), + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage( + crate::pages::Message::DefaultApps(a), + ) + }, + ) + .icons(Cow::Borrowed(&meta.icons)), + ) + .align_items(Alignment::Center) + } + }) + .add({ + let meta = &mime_apps.apps[DROPDOWN_VIDEO]; + if meta.apps.is_empty() { + settings::flex_item( + fl!("default-apps", "video"), + widget::text(fl!("default-apps", "not-installed")), + ) + .align_items(Alignment::Center) + } else { + settings::flex_item( + fl!("default-apps", "video"), + dropdown::popup_dropdown( + &meta.apps, + meta.selected, + |id| Message::SetDefault(Category::Video, id), + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage( + crate::pages::Message::DefaultApps(a), + ) + }, + ) + .icons(Cow::Borrowed(&meta.icons)), + ) + .align_items(Alignment::Center) + } + }) + .add({ + let meta = &mime_apps.apps[DROPDOWN_PHOTO]; + if meta.apps.is_empty() { + settings::flex_item( + fl!("default-apps", "photos"), + widget::text(fl!("default-apps", "not-installed")), + ) + .align_items(Alignment::Center) + } else { + settings::flex_item( + fl!("default-apps", "photos"), + dropdown::popup_dropdown( + &meta.apps, + meta.selected, + |id| Message::SetDefault(Category::Image, id), + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage( + crate::pages::Message::DefaultApps(a), + ) + }, + ) + .icons(Cow::Borrowed(&meta.icons)), + ) + .align_items(Alignment::Center) + } + }) + .add({ + let meta = &mime_apps.apps[DROPDOWN_CALENDAR]; + if meta.apps.is_empty() { + settings::flex_item( + fl!("default-apps", "calendar"), + widget::text(fl!("default-apps", "not-installed")), + ) + .align_items(Alignment::Center) + } else { + settings::flex_item( + fl!("default-apps", "calendar"), + dropdown::popup_dropdown( + &meta.apps, + meta.selected, + |id| Message::SetDefault(Category::Calendar, id), + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage( + crate::pages::Message::DefaultApps(a), + ) + }, + ) + .icons(Cow::Borrowed(&meta.icons)), + ) + .align_items(Alignment::Center) + } + }) + .add({ + let meta = &mime_apps.apps[DROPDOWN_TERMINAL]; + if meta.apps.is_empty() { + settings::flex_item( + fl!("default-apps", "terminal"), + widget::text(fl!("default-apps", "not-installed")), + ) + .align_items(Alignment::Center) + } else { + settings::flex_item( + fl!("default-apps", "terminal"), + dropdown::popup_dropdown( + &meta.apps, + meta.selected, + |id| Message::SetDefault(Category::Terminal, id), + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage( + crate::pages::Message::DefaultApps(a), + ) + }, + ) + .icons(Cow::Borrowed(&meta.icons)), + ) + .align_items(Alignment::Center) + } + }) + .add({ + let meta = &mime_apps.apps[DROPDOWN_TEXT_EDITOR]; + if meta.apps.is_empty() { + settings::flex_item( + fl!("default-apps", "text-editor"), + widget::text(fl!("default-apps", "not-installed")), + ) + .align_items(Alignment::Center) + } else { + settings::flex_item( + fl!("default-apps", "text-editor"), + dropdown::popup_dropdown( + &meta.apps, + meta.selected, + |id| Message::SetDefault(Category::TextEditor, id), + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage( + crate::pages::Message::DefaultApps(a), + ) + }, + ) + .icons(Cow::Borrowed(&meta.icons)), + ) + .align_items(Alignment::Center) + } + }) .apply(Element::from) .map(crate::pages::Message::DefaultApps) }) diff --git a/cosmic-settings/src/pages/desktop/panel/inner.rs b/cosmic-settings/src/pages/desktop/panel/inner.rs index 9974e54..bcd7bb3 100644 --- a/cosmic-settings/src/pages/desktop/panel/inner.rs +++ b/cosmic-settings/src/pages/desktop/panel/inner.rs @@ -22,9 +22,9 @@ use crate::pages::desktop::appearance::Roundness; pub struct PageInner { pub(crate) config_helper: Option, pub(crate) panel_config: Option, + pub size: Option, pub opacity: f32, pub opacity_changing: bool, - pub size: PanelSize, pub outputs: Vec, pub anchors: Vec, pub backgrounds: Vec, @@ -40,9 +40,9 @@ impl Default for PageInner { Self { config_helper: Option::default(), panel_config: Option::default(), + size: Option::default(), opacity: 0.0, opacity_changing: false, - size: PanelSize::M, outputs: vec![fl!("all-displays")], anchors: vec![ Anchor(PanelAnchor::Left).to_string(), @@ -209,7 +209,9 @@ pub(crate) fn style< text::body(fl!("small")).into(), slider( 0..=4, - match inner.size { + match inner.size.as_ref().expect( + "PageInner.size is None even though PageInner.panel_config is Some", + ) { PanelSize::XS => 0, PanelSize::S => 1, PanelSize::M => 2, @@ -504,7 +506,7 @@ impl PageInner { if let Err(err) = default.write_entry(config) { tracing::error!(?err, "Error resetting panel config."); } - self.size.clone_from(&default.size); + self.size = Some(default.size.clone()); self.system_default = Some(default.clone()); self.panel_config.clone_from(&self.system_default); } else { @@ -603,10 +605,16 @@ impl PageInner { _ = panel_config.set_border_radius(helper, new_radius).unwrap(); } Message::PanelSize(size) => { - self.size = size; + self.size = Some(size); } Message::PanelSizeCommit => { - _ = panel_config.set_size(helper, self.size.clone()); + _ = panel_config.set_size( + helper, + self.size + .as_ref() + .expect("PageInner.size is None even though it should be Some, since PageInner.panel_config is Some") + .clone() + ); // Reset any size overrides the user might have set _ = panel_config.set_size_center(helper, None); _ = panel_config.set_size_wings(helper, None); @@ -669,7 +677,7 @@ impl PageInner { } } Message::PanelConfig(c) => { - self.size = c.size.clone(); + self.size = Some(c.size.clone()); self.panel_config = Some(*c); return Task::none(); } diff --git a/cosmic-settings/src/pages/desktop/panel/mod.rs b/cosmic-settings/src/pages/desktop/panel/mod.rs index 4f98e64..7748618 100644 --- a/cosmic-settings/src/pages/desktop/panel/mod.rs +++ b/cosmic-settings/src/pages/desktop/panel/mod.rs @@ -79,6 +79,7 @@ impl Default for Page { // If the config is not present, it will be created with the default values and the name will not match (panel_config.name == "Panel").then_some(panel_config) }); + let size = panel_config.as_ref().map(|c| c.size.clone()); let system_default = cosmic::cosmic_config::Config::system( &format!("{}.Panel", cosmic_panel_config::NAME), CosmicPanelConfig::VERSION, @@ -98,6 +99,7 @@ impl Default for Page { inner: PageInner { config_helper, panel_config, + size, container_config, outputs_map: HashMap::new(), system_default, diff --git a/cosmic-settings/src/pages/desktop/window_management.rs b/cosmic-settings/src/pages/desktop/window_management.rs index 7b68acc..b93e0f8 100644 --- a/cosmic-settings/src/pages/desktop/window_management.rs +++ b/cosmic-settings/src/pages/desktop/window_management.rs @@ -27,7 +27,6 @@ pub enum Message { ShowActiveWindowHint(bool), ShowMaximizeButton(bool), ShowMinimizeButton(bool), - WindowControlsPositionStart(bool), SetEdgeSnapThreshold(u32), Surface(surface::Action), } @@ -178,19 +177,6 @@ impl Page { .set_show_minimize(&config, value); } } - Message::WindowControlsPositionStart(left) => { - if let Ok(config) = cosmic::config::CosmicTk::config() { - let position = if left { - cosmic::widget::WindowControlsPosition::Start - } else { - cosmic::widget::WindowControlsPosition::End - }; - let _res = cosmic::config::COSMIC_TK - .write() - .unwrap() - .set_window_controls_position(&config, position); - } - } Message::ShowActiveWindowHint(value) => { self.show_active_hint = value; if let Err(err) = self.comp_config.set("active_hint", value) { @@ -288,7 +274,6 @@ pub fn window_controls() -> Section { maximize = fl!("window-controls", "maximize"); minimize = fl!("window-controls", "minimize"); active_window_hint = fl!("window-controls", "active-window-hint"); - position_start = fl!("window-controls", "position-start"); }); Section::default() @@ -311,13 +296,6 @@ pub fn window_controls() -> Section { settings::item::builder(&descriptions[minimize]) .toggler(cosmic::config::show_minimize(), Message::ShowMinimizeButton), ) - .add(settings::item::builder(&descriptions[position_start]).toggler( - matches!( - cosmic::config::window_controls_position(), - cosmic::widget::WindowControlsPosition::Start - ), - Message::WindowControlsPositionStart, - )) .apply(Element::from) .map(crate::pages::Message::WindowManagement) }) diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs index 669c3e7..70e1952 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs @@ -8,7 +8,7 @@ use cosmic::iced::keyboard::{Key, Location, Modifiers}; use cosmic::iced::platform_specific::shell::wayland::commands::keyboard_shortcuts_inhibit; use cosmic::iced::platform_specific::shell::wayland::keymap; use cosmic::iced::{self, Alignment, Length}; -use cosmic::widget::{self, button, icon, list, settings, text}; +use cosmic::widget::{self, button, icon, settings, text}; use cosmic::{Apply, Element, Task, theme}; use cosmic_config::{ConfigGet, ConfigSet}; use cosmic_settings_config::shortcuts::{self, Action, Binding, Shortcuts}; @@ -865,11 +865,13 @@ fn context_drawer<'a>( } /// Display a shortcut as a list item -fn shortcut_item( - custom: bool, - id: usize, - data: &ShortcutModel, -) -> list::ListButton<'_, ShortcutMessage> { +fn shortcut_item(custom: bool, id: usize, data: &ShortcutModel) -> Element<'_, ShortcutMessage> { + #[derive(Copy, Clone, Debug)] + enum LocalMessage { + Remove, + Show, + } + let bindings = data .bindings .iter() @@ -878,7 +880,7 @@ fn shortcut_item( .map(|(_, shortcut)| text::body(shortcut.binding.to_string()).into()) .collect::>(); - let shortcuts: Element = if bindings.is_empty() { + let shortcuts: Element = if bindings.is_empty() { text::body(fl!("disabled")).into() } else { widget::column::with_children(bindings) @@ -898,7 +900,7 @@ fn shortcut_item( .push(icon::from_name("go-next-symbolic").size(16)) .push_maybe(custom.then(|| { widget::button::icon(icon::from_name("edit-delete-symbolic")) - .on_press(ShortcutMessage::DeleteShortcut(id)) + .on_press(LocalMessage::Remove) })) .align_y(Alignment::Center) .spacing(8); @@ -907,7 +909,14 @@ fn shortcut_item( .flex_control(control) .align_items(Alignment::Center) .spacing(16) - .width(Length::Shrink) - .apply(list::button) - .on_press(ShortcutMessage::ShowShortcut(id, data.description.clone())) + .apply(widget::container) + .class(theme::Container::List) + .apply(widget::button::custom) + .class(theme::Button::Transparent) + .on_press(LocalMessage::Show) + .apply(Element::from) + .map(move |message| match message { + LocalMessage::Show => ShortcutMessage::ShowShortcut(id, data.description.clone()), + LocalMessage::Remove => ShortcutMessage::DeleteShortcut(id), + }) } diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/mod.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/mod.rs index ab60609..5a5b1bb 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/mod.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/mod.rs @@ -15,8 +15,8 @@ pub mod tiling; use cosmic::app::ContextDrawer; use cosmic::iced::Length; -use cosmic::widget::{self, list::ListButton, settings, text}; -use cosmic::{Apply, Element, Task}; +use cosmic::widget::{self, icon, settings, text}; +use cosmic::{Apply, Element, Task, theme}; use cosmic_config::ConfigGet; use cosmic_settings_config::Binding; use cosmic_settings_config::shortcuts::action::{ @@ -222,13 +222,11 @@ impl Page { self.search.localized = SecondaryMap::new(); self.search.input = String::new(); self.search_model.on_clear(); - self.modified.accessibility = 0; + self.modified.custom = 0; self.modified.manage_windows = 0; self.modified.move_windows = 0; self.modified.nav = 0; self.modified.system = 0; - self.modified.window_tiling = 0; - self.modified.custom = 0; } fn reload_search(&mut self) { @@ -499,18 +497,32 @@ fn shortcuts() -> Section { } /// Display a category as a list item -fn category_item(category: Category, name: &str, modified: u16) -> ListButton<'_, Message> { - crate::widget::go_next_with_item( - name, - (modified > 0).then(|| text::body(fl!("modified", count = modified)).apply(Element::from)), - Message::Category(category), - ) +fn category_item(category: Category, name: &str, modified: u16) -> Element<'_, Message> { + let icon = icon::from_name("go-next-symbolic").size(16); + + let control = if modified == 0 { + Element::from(icon) + } else { + widget::row::with_capacity(2) + .push(text::body(fl!("modified", count = modified))) + .push(icon) + .into() + }; + + settings::item::builder(name) + .control(control) + .spacing(16) + .apply(widget::container) + .class(theme::Container::List) + .apply(widget::button::custom) + .class(theme::Button::Transparent) + .width(Length::Fill) + .on_press(Message::Category(category)) + .into() } fn action_category(action: &Action) -> Option { - Some(if accessibility::actions().contains(action) { - Category::Accessibility - } else if manage_windows::actions().contains(action) { + Some(if manage_windows::actions().contains(action) { Category::ManageWindow } else if move_window::actions().contains(action) { Category::MoveWindow @@ -518,8 +530,6 @@ fn action_category(action: &Action) -> Option { Category::Nav } else if system::actions().contains(action) { Category::System - } else if tiling::actions().contains(action) { - Category::WindowTiling } else { return None; }) diff --git a/cosmic-settings/src/pages/time/date.rs b/cosmic-settings/src/pages/time/date.rs index 2ff4e67..16cc382 100644 --- a/cosmic-settings/src/pages/time/date.rs +++ b/cosmic-settings/src/pages/time/date.rs @@ -8,7 +8,7 @@ use cosmic::{ cosmic_config::{self, ConfigGet, ConfigSet}, iced::core::text::Wrapping, surface, - widget::{self, dropdown, settings}, + widget::{self, dropdown, list, settings}, }; use cosmic_settings_page::{self as page, Section, section}; use icu::{ diff --git a/cosmic-settings/src/pages/time/region.rs b/cosmic-settings/src/pages/time/region.rs index 8a9be3f..36128f7 100644 --- a/cosmic-settings/src/pages/time/region.rs +++ b/cosmic-settings/src/pages/time/region.rs @@ -7,7 +7,7 @@ use std::sync::Arc; use crate::widget::selection_context_item; use cosmic::app::{ContextDrawer, context_drawer}; use cosmic::iced::{Alignment, Length}; -use cosmic::widget::{self, button}; +use cosmic::widget::{self, button, list}; use cosmic::{Apply, Element}; use cosmic_config::{ConfigGet, ConfigSet}; use cosmic_settings_page::Section; diff --git a/cosmic-settings/src/widget/mod.rs b/cosmic-settings/src/widget/mod.rs index 5646dc6..a5b8322 100644 --- a/cosmic-settings/src/widget/mod.rs +++ b/cosmic-settings/src/widget/mod.rs @@ -206,10 +206,8 @@ pub fn go_next_with_item<'a, Msg: 'static>( msg_opt: impl Into>, ) -> list::ListButton<'a, Msg> { settings::item_row(vec![ - text::body(description) - .width(Length::Fill) - .wrapping(Wrapping::Word) - .into(), + text::body(description).wrapping(Wrapping::Word).into(), + horizontal().into(), row::with_capacity(2) .push(item) .push(icon::from_name("go-next-symbolic").size(16).icon()) diff --git a/i18n/en/cosmic_settings.ftl b/i18n/en/cosmic_settings.ftl index f5a614e..535477b 100644 --- a/i18n/en/cosmic_settings.ftl +++ b/i18n/en/cosmic_settings.ftl @@ -484,7 +484,6 @@ window-controls = Window controls .maximize = Show maximize button .minimize = Show minimize button .active-window-hint = Show active window hint - .position-start = Place buttons on the left (macOS style) focus-navigation = Focus navigation .focus-follows-cursor = Focus follows cursor diff --git a/i18n/fr/cosmic_settings.ftl b/i18n/fr/cosmic_settings.ftl index 098a741..419dc72 100644 --- a/i18n/fr/cosmic_settings.ftl +++ b/i18n/fr/cosmic_settings.ftl @@ -322,7 +322,6 @@ window-controls = Contrôles des fenêtres .maximize = Afficher le bouton maximiser .minimize = Afficher le bouton minimiser .active-window-hint = Afficher l'indice de la fenêtre active - .position-start = Placer les boutons à gauche (style macOS) focus-navigation = Navigation par le focus .focus-follows-cursor = Le focus suit le curseur .focus-follows-cursor-delay = Délai de suivi du focus en ms diff --git a/page/Cargo.toml b/page/Cargo.toml index d45d828..7547599 100644 --- a/page/Cargo.toml +++ b/page/Cargo.toml @@ -7,7 +7,7 @@ edition = "2024" derive_setters = "0.1.9" regex = "1.12.3" slotmap = "1.1.1" -libcosmic-yoda = { workspace = true } +libcosmic = { workspace = true } downcast-rs = "2.0.2" url = "2.5.8" slab = "0.4.12" diff --git a/pages/wallpapers/src/lib.rs b/pages/wallpapers/src/lib.rs index 921117c..498b424 100644 --- a/pages/wallpapers/src/lib.rs +++ b/pages/wallpapers/src/lib.rs @@ -104,7 +104,6 @@ pub async fn load_each_from_path( ) -> Pin>> { let candidate_paths: Vec<_> = WalkDir::new(path) .max_depth(3) - .follow_links(true) .into_iter() .filter_map(Result::ok) .filter(|entry| entry.file_type().is_file()) diff --git a/subscriptions/sound/Cargo.toml b/subscriptions/sound/Cargo.toml index e8c81e2..adf5891 100644 --- a/subscriptions/sound/Cargo.toml +++ b/subscriptions/sound/Cargo.toml @@ -10,7 +10,7 @@ publish = true cosmic-pipewire = { path = "../../crates/cosmic-pipewire" } futures = "0.3.32" intmap = "3.1.3" -libcosmic-yoda = { path = "/home/lionel/Devels/libcosmic", default-features = false } +libcosmic = { git = "https://github.com/pop-os/libcosmic", default-features = false } numtoa = "1.0.0-alpha1" rustix = "1.1.3" tokio = { version = "1.49.0", features = ["process", "rt", "time"] }