From 0ae6f0b9f92b0a898de841b6c29fb90009f22c6e Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Fri, 28 Feb 2025 15:19:40 -0500 Subject: [PATCH 1/2] chore: update libcosmic --- .vscode/settings.json | 4 +- Cargo.lock | 74 ++++++++++++------- Cargo.toml | 16 ++-- cosmic-settings/src/app.rs | 22 +++++- .../src/pages/desktop/window_management.rs | 2 +- .../pages/input/keyboard/shortcuts/common.rs | 2 +- .../pages/input/keyboard/shortcuts/custom.rs | 6 +- .../src/pages/networking/vpn/mod.rs | 2 +- cosmic-settings/src/pages/networking/wifi.rs | 2 +- cosmic-settings/src/pages/system/about.rs | 2 +- cosmic-settings/src/pages/system/users/mod.rs | 6 +- 11 files changed, 88 insertions(+), 50 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index fd4ea640..6555122d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,3 @@ { - "rust-analyzer.check.overrideCommand": ["just", "check-json"] -} + // "rust-analyzer.check.overrideCommand": ["just", "check-json"] +} \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 55cca4d8..8666393f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1519,14 +1519,13 @@ dependencies = [ [[package]] name = "cosmic-config" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#8a0e74b189f53dae9b8001c6fa5cf1820b3ececb" dependencies = [ "atomicwrites", "cosmic-config-derive", "cosmic-settings-daemon", "dirs", "futures-util", - "iced_futures", + "iced_futures 0.14.0-dev", "known-folders", "notify", "once_cell", @@ -1541,7 +1540,6 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#8a0e74b189f53dae9b8001c6fa5cf1820b3ececb" dependencies = [ "quote", "syn 1.0.109", @@ -1773,7 +1771,7 @@ dependencies = [ "bluez-zbus", "cosmic-dbus-networkmanager", "futures", - "iced_futures", + "iced_futures 0.14.0-dev (git+https://github.com/pop-os/libcosmic)", "itertools 0.13.0", "libpulse-binding", "log", @@ -1845,7 +1843,6 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#8a0e74b189f53dae9b8001c6fa5cf1820b3ececb" dependencies = [ "almost", "cosmic-config", @@ -3218,12 +3215,11 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#8a0e74b189f53dae9b8001c6fa5cf1820b3ececb" dependencies = [ "dnd", "iced_accessibility", - "iced_core", - "iced_futures", + "iced_core 0.14.0-dev", + "iced_futures 0.14.0-dev", "iced_renderer", "iced_widget", "iced_winit", @@ -3236,7 +3232,6 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#8a0e74b189f53dae9b8001c6fa5cf1820b3ececb" dependencies = [ "accesskit", "accesskit_winit", @@ -3245,7 +3240,6 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#8a0e74b189f53dae9b8001c6fa5cf1820b3ececb" dependencies = [ "bitflags 2.8.0", "bytes", @@ -3267,13 +3261,34 @@ dependencies = [ "window_clipboard", ] +[[package]] +name = "iced_core" +version = "0.14.0-dev" +source = "git+https://github.com/pop-os/libcosmic#3f25af87a3a41c53bdbd69878f32766bbcda2194" +dependencies = [ + "bitflags 2.8.0", + "bytes", + "dnd", + "glam", + "log", + "mime 0.1.0", + "num-traits", + "once_cell", + "palette", + "raw-window-handle", + "rustc-hash 2.1.1", + "smol_str", + "thiserror 1.0.69", + "web-time", + "window_clipboard", +] + [[package]] name = "iced_futures" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#8a0e74b189f53dae9b8001c6fa5cf1820b3ececb" dependencies = [ "futures", - "iced_core", + "iced_core 0.14.0-dev", "log", "rustc-hash 2.1.1", "tokio", @@ -3281,6 +3296,19 @@ dependencies = [ "wasm-timer", ] +[[package]] +name = "iced_futures" +version = "0.14.0-dev" +source = "git+https://github.com/pop-os/libcosmic#8a0e74b189f53dae9b8001c6fa5cf1820b3ececb" +dependencies = [ + "futures", + "iced_core 0.14.0-dev (git+https://github.com/pop-os/libcosmic)", + "log", + "rustc-hash 2.1.1", + "wasm-bindgen-futures", + "wasm-timer", +] + [[package]] name = "iced_glyphon" version = "0.6.0" @@ -3296,14 +3324,13 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#8a0e74b189f53dae9b8001c6fa5cf1820b3ececb" dependencies = [ "bitflags 2.8.0", "bytemuck", "cosmic-text", "half", - "iced_core", - "iced_futures", + "iced_core 0.14.0-dev", + "iced_futures 0.14.0-dev", "image", "kamadak-exif", "log", @@ -3318,7 +3345,6 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#8a0e74b189f53dae9b8001c6fa5cf1820b3ececb" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -3330,14 +3356,13 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#8a0e74b189f53dae9b8001c6fa5cf1820b3ececb" dependencies = [ "bytes", "cosmic-client-toolkit", "dnd", "iced_accessibility", - "iced_core", - "iced_futures", + "iced_core 0.14.0-dev", + "iced_futures 0.14.0-dev", "raw-window-handle", "thiserror 1.0.69", "window_clipboard", @@ -3346,7 +3371,6 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#8a0e74b189f53dae9b8001c6fa5cf1820b3ececb" dependencies = [ "bytemuck", "cosmic-text", @@ -3362,7 +3386,6 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#8a0e74b189f53dae9b8001c6fa5cf1820b3ececb" dependencies = [ "as-raw-xcb-connection", "bitflags 2.8.0", @@ -3393,7 +3416,6 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#8a0e74b189f53dae9b8001c6fa5cf1820b3ececb" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -3412,12 +3434,11 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#8a0e74b189f53dae9b8001c6fa5cf1820b3ececb" dependencies = [ "cosmic-client-toolkit", "dnd", "iced_accessibility", - "iced_futures", + "iced_futures 0.14.0-dev", "iced_graphics", "iced_runtime", "log", @@ -4418,7 +4439,6 @@ checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libcosmic" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#8a0e74b189f53dae9b8001c6fa5cf1820b3ececb" dependencies = [ "apply", "ashpd 0.9.2", @@ -4432,8 +4452,8 @@ dependencies = [ "derive_setters", "iced", "iced_accessibility", - "iced_core", - "iced_futures", + "iced_core 0.14.0-dev", + "iced_futures 0.14.0-dev", "iced_renderer", "iced_runtime", "iced_tiny_skia", diff --git a/Cargo.toml b/Cargo.toml index bc7526b6..0a3995b5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -56,15 +56,13 @@ cosmic-client-toolkit = { git = "https://github.com/pop-os/cosmic-protocols//", # cosmic-settings-config = { git = "https://github.com/pop-os/cosmic-settings-daemon//", branch = "input_nobuild" } # For development and testing purposes -# [patch.'https://github.com/pop-os/libcosmic'] -# libcosmic = { git = "https://github.com/pop-os/libcosmic//", branch = "font" } -# cosmic-config = { git = "https://github.com/pop-os/libcosmic//", branch = "font" } -# cosmic-theme = { git = "https://github.com/pop-os/libcosmic//", branch = "font" } -# iced_futures = { git = "https://github.com/pop-os/libcosmic//", branch = "font" } - -# libcosmic = { path = "../libcosmic" } -# cosmic-config = { path = "../libcosmic/cosmic-config" } -# cosmic-theme = { path = "../libcosmic/cosmic-theme" } +[patch.'https://github.com/pop-os/libcosmic'] +# libcosmic = { git = "https://github.com/pop-os/libcosmic//", branch = "fontconfig" } +# cosmic-config = { git = "https://github.com/pop-os/libcosmic//", branch = "fontconfig" } +# cosmic-theme = { git = "https://github.com/pop-os/libcosmic//", branch = "fontconfig" } +libcosmic = { path = "../libcosmic" } +cosmic-config = { path = "../libcosmic/cosmic-config" } +cosmic-theme = { path = "../libcosmic/cosmic-theme" } # [patch.'https://github.com/pop-os/dbus-settings-bindings'] # cosmic-dbus-networkmanager = { path = "../dbus-settings-bindings/networkmanager" } diff --git a/cosmic-settings/src/app.rs b/cosmic-settings/src/app.rs index ce70ff6a..83205ad8 100644 --- a/cosmic-settings/src/app.rs +++ b/cosmic-settings/src/app.rs @@ -26,6 +26,7 @@ use cosmic::app::DbusActivationMessage; #[cfg(feature = "wayland")] use cosmic::cctk::{sctk::output::OutputInfo, wayland_client::protocol::wl_output::WlOutput}; use cosmic::iced::Subscription; +use cosmic::surface_message::SurfaceMessage; use cosmic::widget::{self, button, row, text_input}; use cosmic::{ app::{Core, Task}, @@ -139,6 +140,23 @@ impl SettingsApp { } } +#[cfg(feature = "wayland")] +impl From for cosmic::surface_message::MessageWrapper { + fn from(value: Message) -> Self { + match value { + Message::Surface(msg) => cosmic::surface_message::MessageWrapper::Surface(msg), + msg => cosmic::surface_message::MessageWrapper::Message(msg), + } + } +} + +#[cfg(feature = "wayland")] +impl From for Message { + fn from(value: SurfaceMessage) -> Self { + Message::Surface(value) + } +} + #[derive(Clone, Debug)] pub enum Message { CloseContextDrawer, @@ -161,6 +179,7 @@ pub enum Message { SearchSubmit, SetTheme(cosmic::theme::Theme), SetWindowTitle, + Surface(SurfaceMessage), } impl cosmic::Application for SettingsApp { @@ -240,7 +259,7 @@ impl cosmic::Application for SettingsApp { .id(self.search_id.clone()) .on_clear(Message::SearchClear) .on_input(Message::SearchChanged) - .on_submit(Message::SearchSubmit) + .on_submit(|_| Message::SearchSubmit) .into() } else { icon::from_name("system-search-symbolic") @@ -734,6 +753,7 @@ impl cosmic::Application for SettingsApp { Message::Error(error) => { tracing::error!(error, "error occurred"); } + Message::Surface(_) => {} } Task::none() diff --git a/cosmic-settings/src/pages/desktop/window_management.rs b/cosmic-settings/src/pages/desktop/window_management.rs index 33c4baf8..90188813 100644 --- a/cosmic-settings/src/pages/desktop/window_management.rs +++ b/cosmic-settings/src/pages/desktop/window_management.rs @@ -310,7 +310,7 @@ pub fn focus_navigation() -> Section { }) .select_on_focus(true) .on_input(Message::SetFocusFollowsCursorDelay) - .on_submit(Message::SaveFocusFollowsCursorDelay(true)) + .on_submit(|_| Message::SaveFocusFollowsCursorDelay(true)) .width(Length::Fixed(80.0)), )) .add(settings::item( diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs index f3046805..ff0c8503 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs @@ -516,7 +516,7 @@ fn context_drawer( }) .select_on_focus(true) .on_input(move |text| ShortcutMessage::InputBinding(bind_id, text)) - .on_submit(ShortcutMessage::SubmitBinding(bind_id)) + .on_submit(move |_| ShortcutMessage::SubmitBinding(bind_id)) .padding([0, space_xs]) .id(shortcut.id.clone()) .into(); diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/custom.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/custom.rs index d9b9e835..07b523a5 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/custom.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/custom.rs @@ -231,13 +231,13 @@ impl Page { let name_input = widget::text_input("", &self.add_shortcut.name) .padding([6, 12]) .on_input(Message::NameInput) - .on_submit(Message::NameSubmit) + .on_submit(|_| Message::NameSubmit) .id(self.name_id.clone()); let task_input = widget::text_input("", &self.add_shortcut.task) .padding([6, 12]) .on_input(Message::TaskInput) - .on_submit(Message::EditCombination) + .on_submit(|_| Message::EditCombination) .id(self.task_id.clone()); let name_control = widget::column() @@ -267,7 +267,7 @@ impl Page { ) .padding([0, 12]) .on_input(move |input| Message::KeyInput(id, input)) - .on_submit(Message::AddKeybinding) + .on_submit(|_| Message::AddKeybinding) .id(widget_id.clone()) .apply(widget::container) .padding([8, 24]); diff --git a/cosmic-settings/src/pages/networking/vpn/mod.rs b/cosmic-settings/src/pages/networking/vpn/mod.rs index dc04812c..3d173f99 100644 --- a/cosmic-settings/src/pages/networking/vpn/mod.rs +++ b/cosmic-settings/src/pages/networking/vpn/mod.rs @@ -250,7 +250,7 @@ impl page::Page for Page { *password_hidden, ) .on_input(|input| Message::PasswordUpdate(SecureString::from(input))) - .on_submit(Message::ConnectWithPassword); + .on_submit(|_| Message::ConnectWithPassword); let controls = widget::column::with_capacity(2) .spacing(12) diff --git a/cosmic-settings/src/pages/networking/wifi.rs b/cosmic-settings/src/pages/networking/wifi.rs index b4020eed..dd3347c4 100644 --- a/cosmic-settings/src/pages/networking/wifi.rs +++ b/cosmic-settings/src/pages/networking/wifi.rs @@ -145,7 +145,7 @@ impl page::Page for Page { *password_hidden, ) .on_input(|input| Message::PasswordUpdate(SecureString::from(input))) - .on_submit(Message::ConnectWithPassword); + .on_submit(|_| Message::ConnectWithPassword); let primary_action = widget::button::suggested(fl!("connect")) .on_press(Message::ConnectWithPassword); diff --git a/cosmic-settings/src/pages/system/about.rs b/cosmic-settings/src/pages/system/about.rs index 9833da56..aa73eabb 100644 --- a/cosmic-settings/src/pages/system/about.rs +++ b/cosmic-settings/src/pages/system/about.rs @@ -137,7 +137,7 @@ fn device() -> Section { ) .width(250) .on_input(Message::HostnameInput) - .on_submit(Message::HostnameSubmit); + .on_submit(|_| Message::HostnameSubmit); let device_name = settings::item::builder(&*desc[device]) .description(&*desc[device_desc]) diff --git a/cosmic-settings/src/pages/system/users/mod.rs b/cosmic-settings/src/pages/system/users/mod.rs index 89f86e04..b6704477 100644 --- a/cosmic-settings/src/pages/system/users/mod.rs +++ b/cosmic-settings/src/pages/system/users/mod.rs @@ -600,14 +600,14 @@ fn user_list() -> Section { Message::ToggleEdit(idx, EditorField::Username) }) .on_input(move |name| Message::Edit(idx, EditorField::Username, name)) - .on_submit(Message::ApplyEdit(idx, EditorField::Username)); + .on_submit(move |_| Message::ApplyEdit(idx, EditorField::Username)); let password = widget::editable_input("", &user.password, user.password_edit, move |_| { Message::ToggleEdit(idx, EditorField::Password) }) .on_input(move |pass| Message::Edit(idx, EditorField::Password, pass)) - .on_submit(Message::ApplyEdit(idx, EditorField::Password)) + .on_submit(move |_| Message::ApplyEdit(idx, EditorField::Password)) .password(); let fullname = widget::editable_input( @@ -617,7 +617,7 @@ fn user_list() -> Section { move |_| Message::ToggleEdit(idx, EditorField::FullName), ) .on_input(move |name| Message::Edit(idx, EditorField::FullName, name)) - .on_submit(Message::ApplyEdit(idx, EditorField::FullName)); + .on_submit(move |_| Message::ApplyEdit(idx, EditorField::FullName)); let fullname_text = text::body(&user.full_name); From a3298042449472893e1ca84d8c11cc1a9e67b664 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Tue, 11 Mar 2025 16:11:54 -0400 Subject: [PATCH 2/2] chore: dropdown popups --- Cargo.lock | 75 +++++++------ Cargo.toml | 12 +- cosmic-settings/src/app.rs | 44 +++----- .../src/pages/accessibility/magnifier.rs | 14 ++- cosmic-settings/src/pages/desktop/dock/mod.rs | 17 ++- .../src/pages/desktop/panel/inner.rs | 33 +++++- .../src/pages/desktop/panel/mod.rs | 14 ++- .../src/pages/desktop/wallpaper/mod.rs | 41 +++++-- .../src/pages/desktop/window_management.rs | 29 +++-- cosmic-settings/src/pages/display/mod.rs | 46 +++++++- cosmic-settings/src/pages/power/mod.rs | 18 ++- cosmic-settings/src/pages/sound.rs | 49 ++++---- .../src/pages/system/default_apps.rs | 105 +++++++++++++----- cosmic-settings/src/pages/time/date.rs | 49 +++++--- 14 files changed, 365 insertions(+), 181 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8666393f..ef480cac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1013,24 +1013,24 @@ checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" [[package]] name = "cached" -version = "0.54.0" +version = "0.55.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9718806c4a2fe9e8a56fd736f97b340dd10ed1be8ed733ed50449f351dc33cae" +checksum = "b0839c297f8783316fcca9d90344424e968395413f0662a5481f79c6648bbc14" dependencies = [ "ahash 0.8.11", "cached_proc_macro", "cached_proc_macro_types", "hashbrown 0.14.5", "once_cell", - "thiserror 1.0.69", + "thiserror 2.0.11", "web-time", ] [[package]] name = "cached_proc_macro" -version = "0.23.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f42a145ed2d10dce2191e1dcf30cfccfea9026660e143662ba5eec4017d5daa" +checksum = "673992d934f0711b68ebb3e1b79cdc4be31634b37c98f26867ced0438ca5c603" dependencies = [ "darling 0.20.10", "proc-macro2", @@ -1519,13 +1519,14 @@ dependencies = [ [[package]] name = "cosmic-config" version = "0.1.0" +source = "git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes#c9d0466c42c9711a63869d4f50b83cd639a3e6ee" dependencies = [ "atomicwrites", "cosmic-config-derive", "cosmic-settings-daemon", "dirs", "futures-util", - "iced_futures 0.14.0-dev", + "iced_futures 0.14.0-dev (git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes)", "known-folders", "notify", "once_cell", @@ -1540,6 +1541,7 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "0.1.0" +source = "git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes#c9d0466c42c9711a63869d4f50b83cd639a3e6ee" dependencies = [ "quote", "syn 1.0.109", @@ -1584,7 +1586,7 @@ dependencies = [ [[package]] name = "cosmic-mime-apps" version = "0.1.0" -source = "git+https://github.com/pop-os/cosmic-mime-apps#a5aefbd2e914682c151f3b8054dd711e7f57941d" +source = "git+https://github.com/pop-os/cosmic-mime-apps#b0b85933dd7bc6e6f51d3d2a7312dbd6dc162cf3" dependencies = [ "freedesktop-desktop-entry", "mime 0.3.17", @@ -1821,7 +1823,7 @@ dependencies = [ [[package]] name = "cosmic-text" version = "0.12.1" -source = "git+https://github.com/pop-os/cosmic-text.git#9125dd48b771e9aa7833d106a9850e935f71eaa6" +source = "git+https://github.com/pop-os/cosmic-text.git#974ddaed96b334f560b606ebe5d2ca2d2f9f23ef" dependencies = [ "bitflags 2.8.0", "fontdb 0.16.2", @@ -1843,6 +1845,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "0.1.0" +source = "git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes#c9d0466c42c9711a63869d4f50b83cd639a3e6ee" dependencies = [ "almost", "cosmic-config", @@ -2316,7 +2319,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -2644,17 +2647,15 @@ dependencies = [ [[package]] name = "freedesktop-desktop-entry" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016f6ee9509f11c985aa402451f4ee900d1fafeb501a4c3d734ebecfc1130e05" +checksum = "e6a4cdc5571033a6a329b9e8a8430594d1e3b60f42bb79e79686cadef34740ea" dependencies = [ "cached", - "dirs", "gettext-rs", "log", "memchr", "strsim 0.11.1", - "textdistance", "thiserror 2.0.11", "xdg", ] @@ -3215,11 +3216,12 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0-dev" +source = "git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes#c9d0466c42c9711a63869d4f50b83cd639a3e6ee" dependencies = [ "dnd", "iced_accessibility", - "iced_core 0.14.0-dev", - "iced_futures 0.14.0-dev", + "iced_core 0.14.0-dev (git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes)", + "iced_futures 0.14.0-dev (git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes)", "iced_renderer", "iced_widget", "iced_winit", @@ -3232,6 +3234,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" +source = "git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes#c9d0466c42c9711a63869d4f50b83cd639a3e6ee" dependencies = [ "accesskit", "accesskit_winit", @@ -3240,6 +3243,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0-dev" +source = "git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes#c9d0466c42c9711a63869d4f50b83cd639a3e6ee" dependencies = [ "bitflags 2.8.0", "bytes", @@ -3264,7 +3268,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#3f25af87a3a41c53bdbd69878f32766bbcda2194" +source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463" dependencies = [ "bitflags 2.8.0", "bytes", @@ -3286,9 +3290,10 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0-dev" +source = "git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes#c9d0466c42c9711a63869d4f50b83cd639a3e6ee" dependencies = [ "futures", - "iced_core 0.14.0-dev", + "iced_core 0.14.0-dev (git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes)", "log", "rustc-hash 2.1.1", "tokio", @@ -3299,7 +3304,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#8a0e74b189f53dae9b8001c6fa5cf1820b3ececb" +source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463" dependencies = [ "futures", "iced_core 0.14.0-dev (git+https://github.com/pop-os/libcosmic)", @@ -3324,13 +3329,14 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0-dev" +source = "git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes#c9d0466c42c9711a63869d4f50b83cd639a3e6ee" dependencies = [ "bitflags 2.8.0", "bytemuck", "cosmic-text", "half", - "iced_core 0.14.0-dev", - "iced_futures 0.14.0-dev", + "iced_core 0.14.0-dev (git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes)", + "iced_futures 0.14.0-dev (git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes)", "image", "kamadak-exif", "log", @@ -3345,6 +3351,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0-dev" +source = "git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes#c9d0466c42c9711a63869d4f50b83cd639a3e6ee" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -3356,13 +3363,14 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0-dev" +source = "git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes#c9d0466c42c9711a63869d4f50b83cd639a3e6ee" dependencies = [ "bytes", "cosmic-client-toolkit", "dnd", "iced_accessibility", - "iced_core 0.14.0-dev", - "iced_futures 0.14.0-dev", + "iced_core 0.14.0-dev (git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes)", + "iced_futures 0.14.0-dev (git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes)", "raw-window-handle", "thiserror 1.0.69", "window_clipboard", @@ -3371,6 +3379,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0-dev" +source = "git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes#c9d0466c42c9711a63869d4f50b83cd639a3e6ee" dependencies = [ "bytemuck", "cosmic-text", @@ -3386,6 +3395,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0-dev" +source = "git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes#c9d0466c42c9711a63869d4f50b83cd639a3e6ee" dependencies = [ "as-raw-xcb-connection", "bitflags 2.8.0", @@ -3416,6 +3426,7 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.14.0-dev" +source = "git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes#c9d0466c42c9711a63869d4f50b83cd639a3e6ee" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -3434,11 +3445,12 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0-dev" +source = "git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes#c9d0466c42c9711a63869d4f50b83cd639a3e6ee" dependencies = [ "cosmic-client-toolkit", "dnd", "iced_accessibility", - "iced_futures 0.14.0-dev", + "iced_futures 0.14.0-dev (git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes)", "iced_graphics", "iced_runtime", "log", @@ -4439,6 +4451,7 @@ checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libcosmic" version = "0.1.0" +source = "git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes#c9d0466c42c9711a63869d4f50b83cd639a3e6ee" dependencies = [ "apply", "ashpd 0.9.2", @@ -4452,8 +4465,8 @@ dependencies = [ "derive_setters", "iced", "iced_accessibility", - "iced_core 0.14.0-dev", - "iced_futures 0.14.0-dev", + "iced_core 0.14.0-dev (git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes)", + "iced_futures 0.14.0-dev (git+https://github.com/pop-os/libcosmic//?branch=drop-menu-tree-changes)", "iced_renderer", "iced_runtime", "iced_tiny_skia", @@ -6392,7 +6405,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -7055,7 +7068,7 @@ dependencies = [ "getrandom 0.3.1", "once_cell", "rustix 0.38.44", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -7067,12 +7080,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "textdistance" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa672c55ab69f787dbc9126cc387dbe57fdd595f585e4524cf89018fa44ab819" - [[package]] name = "thiserror" version = "1.0.69" @@ -8061,7 +8068,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 0a3995b5..e66327e7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -57,12 +57,12 @@ cosmic-client-toolkit = { git = "https://github.com/pop-os/cosmic-protocols//", # For development and testing purposes [patch.'https://github.com/pop-os/libcosmic'] -# libcosmic = { git = "https://github.com/pop-os/libcosmic//", branch = "fontconfig" } -# cosmic-config = { git = "https://github.com/pop-os/libcosmic//", branch = "fontconfig" } -# cosmic-theme = { git = "https://github.com/pop-os/libcosmic//", branch = "fontconfig" } -libcosmic = { path = "../libcosmic" } -cosmic-config = { path = "../libcosmic/cosmic-config" } -cosmic-theme = { path = "../libcosmic/cosmic-theme" } +libcosmic = { git = "https://github.com/pop-os/libcosmic//", branch = "drop-menu-tree-changes" } +cosmic-config = { git = "https://github.com/pop-os/libcosmic//", branch = "drop-menu-tree-changes" } +cosmic-theme = { git = "https://github.com/pop-os/libcosmic//", branch = "drop-menu-tree-changes" } +# libcosmic = { path = "../libcosmic" } +# cosmic-config = { path = "../libcosmic/cosmic-config" } +# cosmic-theme = { path = "../libcosmic/cosmic-theme" } # [patch.'https://github.com/pop-os/dbus-settings-bindings'] # cosmic-dbus-networkmanager = { path = "../dbus-settings-bindings/networkmanager" } diff --git a/cosmic-settings/src/app.rs b/cosmic-settings/src/app.rs index 83205ad8..1d2f747d 100644 --- a/cosmic-settings/src/app.rs +++ b/cosmic-settings/src/app.rs @@ -19,14 +19,10 @@ use crate::pages::{self, display, system, time}; use crate::subscription::desktop_files; use crate::widget::{page_title, search_header}; use crate::PageCommands; -use cosmic::app::command::set_theme; use cosmic::app::context_drawer::ContextDrawer; -#[cfg(feature = "single-instance")] -use cosmic::app::DbusActivationMessage; #[cfg(feature = "wayland")] use cosmic::cctk::{sctk::output::OutputInfo, wayland_client::protocol::wl_output::WlOutput}; use cosmic::iced::Subscription; -use cosmic::surface_message::SurfaceMessage; use cosmic::widget::{self, button, row, text_input}; use cosmic::{ app::{Core, Task}, @@ -36,6 +32,7 @@ use cosmic::{ window, Length, }, prelude::*, + surface, widget::{ column, container, icon, id_container, nav_bar, scrollable, segmented_button, settings, }, @@ -140,23 +137,6 @@ impl SettingsApp { } } -#[cfg(feature = "wayland")] -impl From for cosmic::surface_message::MessageWrapper { - fn from(value: Message) -> Self { - match value { - Message::Surface(msg) => cosmic::surface_message::MessageWrapper::Surface(msg), - msg => cosmic::surface_message::MessageWrapper::Message(msg), - } - } -} - -#[cfg(feature = "wayland")] -impl From for Message { - fn from(value: SurfaceMessage) -> Self { - Message::Surface(value) - } -} - #[derive(Clone, Debug)] pub enum Message { CloseContextDrawer, @@ -179,7 +159,7 @@ pub enum Message { SearchSubmit, SetTheme(cosmic::theme::Theme), SetWindowTitle, - Surface(SurfaceMessage), + Surface(surface::Action), } impl cosmic::Application for SettingsApp { @@ -593,7 +573,9 @@ impl cosmic::Application for SettingsApp { #[cfg(feature = "page-power")] crate::pages::Message::Power(message) => { - page::update!(self.pages, message, power::Page); + if let Some(page) = self.pages.page_mut::() { + return page.update(message).map(Into::into); + } } #[cfg(feature = "page-networking")] @@ -737,7 +719,7 @@ impl cosmic::Application for SettingsApp { } } - Message::SetTheme(t) => return set_theme(t), + Message::SetTheme(t) => return cosmic::command::set_theme(t), Message::OpenContextDrawer(page, title) => { self.core.window.show_context = true; @@ -753,18 +735,22 @@ impl cosmic::Application for SettingsApp { Message::Error(error) => { tracing::error!(error, "error occurred"); } - Message::Surface(_) => {} + Message::Surface(a) => { + return cosmic::task::message(cosmic::Action::Cosmic( + cosmic::app::Action::Surface(a), + )); + } } Task::none() } #[cfg(feature = "single-instance")] - fn dbus_activation(&mut self, msg: DbusActivationMessage) -> Task { + fn dbus_activation(&mut self, msg: cosmic::dbus_activation::Message) -> Task { match msg.msg { - cosmic::app::DbusActivationDetails::Activate - | cosmic::app::DbusActivationDetails::Open { .. } => None, - cosmic::app::DbusActivationDetails::ActivateAction { action, .. } => { + cosmic::dbus_activation::Details::Activate + | cosmic::dbus_activation::Details::Open { .. } => None, + cosmic::dbus_activation::Details::ActivateAction { action, .. } => { PageCommands::from_str(&action) .ok() .and_then(|action| self.subtask_to_page(&action)) diff --git a/cosmic-settings/src/pages/accessibility/magnifier.rs b/cosmic-settings/src/pages/accessibility/magnifier.rs index 049ebbdb..a2eb0da2 100644 --- a/cosmic-settings/src/pages/accessibility/magnifier.rs +++ b/cosmic-settings/src/pages/accessibility/magnifier.rs @@ -3,6 +3,7 @@ use std::collections::HashSet; use cosmic::{ iced::{Element, Length}, iced_core::text::Wrapping, + surface, widget::{self, icon, settings, svg, text}, Apply, }; @@ -39,6 +40,7 @@ pub enum Message { SetIncrement(usize), SetSignin(bool), SetMovement(ZoomMovement), + Surface(surface::Action), } impl Default for Page { @@ -186,10 +188,17 @@ pub fn magnifier() -> section::Section { ) .add(settings::item( &descriptions[increment], - widget::dropdown( + widget::dropdown::popup_dropdown( &page.increment_values, page.increment_idx, Message::SetIncrement, + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage( + crate::pages::Message::AccessibilityMagnifier(a), + ) + }, ), )) .add(settings::item( @@ -332,6 +341,9 @@ impl Page { )); } } + Message::Surface(a) => { + return cosmic::task::message(crate::app::Message::Surface(a)); + } } cosmic::iced::Task::none() diff --git a/cosmic-settings/src/pages/desktop/dock/mod.rs b/cosmic-settings/src/pages/desktop/dock/mod.rs index a32f85ec..bd738355 100644 --- a/cosmic-settings/src/pages/desktop/dock/mod.rs +++ b/cosmic-settings/src/pages/desktop/dock/mod.rs @@ -66,12 +66,17 @@ impl Page { Task::none() } - Message::Inner(inner) => self - .inner - .update(inner) - .map(Message::Inner) - .map(crate::pages::Message::Dock) - .map(crate::app::Message::PageMessage), + Message::Inner(inner) => { + if let inner::Message::Surface(a) = inner { + return cosmic::task::message(crate::app::Message::Surface(a)); + } else { + self.inner + .update(inner) + .map(Message::Inner) + .map(crate::pages::Message::Dock) + .map(crate::app::Message::PageMessage) + } + } } } } diff --git a/cosmic-settings/src/pages/desktop/panel/inner.rs b/cosmic-settings/src/pages/desktop/panel/inner.rs index a59f72b8..e8e1956a 100644 --- a/cosmic-settings/src/pages/desktop/panel/inner.rs +++ b/cosmic-settings/src/pages/desktop/panel/inner.rs @@ -2,7 +2,7 @@ use cosmic::{ cctk::sctk::reexports::client::{backend::ObjectId, protocol::wl_output::WlOutput, Proxy}, cosmic_config::{self, CosmicConfigEntry}, iced::{Alignment, Length}, - theme, + surface, theme, widget::{ button, container, dropdown, horizontal_space, icon, row, settings, slider, text, toggler, }, @@ -122,15 +122,22 @@ pub(crate) fn behavior_and_position< )) .add(settings::item( &descriptions[position], - dropdown( + dropdown::popup_dropdown( page.anchors.as_slice(), Some(panel_config.anchor as usize), Message::PanelAnchor, + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage(crate::pages::Message::Panel( + super::Message(a), + )) + }, ), )) .add(settings::item( &descriptions[display], - dropdown( + dropdown::popup_dropdown( page.outputs.as_slice(), match &panel_config.output { CosmicPanelOuput::All => Some(0), @@ -138,6 +145,13 @@ pub(crate) fn behavior_and_position< CosmicPanelOuput::Name(n) => page.outputs.iter().position(|o| o == n), }, Message::Output, + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage(crate::pages::Message::Panel( + super::Message(a), + )) + }, ), )) .apply(Element::from) @@ -181,7 +195,7 @@ pub(crate) fn style< )) .add(settings::item( &descriptions[appearance], - dropdown( + dropdown::popup_dropdown( inner.backgrounds.as_slice(), match panel_config.background { CosmicPanelBackground::ThemeDefault => Some(0), @@ -190,6 +204,13 @@ pub(crate) fn style< CosmicPanelBackground::Color(_) => None, }, Message::Appearance, + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage(crate::pages::Message::Panel( + super::Message(a), + )) + }, ), )) .add(settings::flex_item( @@ -423,6 +444,7 @@ pub enum Message { PanelConfig(CosmicPanelConfig), ResetPanel, FullReset, + Surface(surface::Action), } impl PageInner { @@ -570,6 +592,9 @@ impl PageInner { return Task::none(); } Message::ResetPanel | Message::FullReset => {} + Message::Surface(a) => { + unimplemented!() + } } if panel_config.anchor_gap || !panel_config.expand_to_edges { diff --git a/cosmic-settings/src/pages/desktop/panel/mod.rs b/cosmic-settings/src/pages/desktop/panel/mod.rs index ae0bffee..a56fc092 100644 --- a/cosmic-settings/src/pages/desktop/panel/mod.rs +++ b/cosmic-settings/src/pages/desktop/panel/mod.rs @@ -23,11 +23,15 @@ pub struct Message(pub inner::Message); impl Page { pub fn update(&mut self, message: Message) -> Task { - self.inner - .update(message.0) - .map(Message) - .map(crate::pages::Message::Panel) - .map(crate::app::Message::PageMessage) + if let inner::Message::Surface(a) = message.0 { + return cosmic::task::message(crate::app::Message::Surface(a)); + } else { + self.inner + .update(message.0) + .map(Message) + .map(crate::pages::Message::Panel) + .map(crate::app::Message::PageMessage) + } } } diff --git a/cosmic-settings/src/pages/desktop/wallpaper/mod.rs b/cosmic-settings/src/pages/desktop/wallpaper/mod.rs index e1ff6d19..dc847997 100644 --- a/cosmic-settings/src/pages/desktop/wallpaper/mod.rs +++ b/cosmic-settings/src/pages/desktop/wallpaper/mod.rs @@ -16,13 +16,16 @@ use std::{ #[cfg(feature = "xdg-portal")] use cosmic::dialog::file_chooser; -use cosmic::iced::{Alignment, Color, Length}; use cosmic::iced_runtime::core::image::Handle as ImageHandle; use cosmic::widget::{ button, dropdown, list_column, row, segmented_button::{self, SingleSelectModel}, settings, tab_bar, text, toggler, }; +use cosmic::{ + iced::{window, Alignment, Color, Length}, + surface, +}; use cosmic::{ widget::{color_picker::ColorPickerUpdate, icon, ColorPickerModel}, Apply, Element, Task, @@ -106,6 +109,7 @@ pub enum Message { Slideshow(bool), /// State change from cosmic-bg UpdateState(cosmic_bg_config::state::State), + Surface(surface::Action), } impl From for crate::app::Message { @@ -990,6 +994,9 @@ impl Page { ))), ); } + Message::Surface(a) => { + return cosmic::task::message(crate::app::Message::Surface(a)); + } } self.config_apply(); @@ -1236,8 +1243,14 @@ pub fn settings() -> Section { children.push(element.into()); } - let wallpaper_fit = - cosmic::widget::dropdown(&page.fit_options, Some(page.selected_fit), Message::Fit); + let wallpaper_fit = cosmic::widget::dropdown::popup_dropdown( + &page.fit_options, + Some(page.selected_fit), + Message::Fit, + window::Id::RESERVED, + Message::Surface, + |a| crate::app::Message::PageMessage(crate::pages::Message::DesktopWallpaper(a)), + ); children.push({ let mut column = list_column() @@ -1258,14 +1271,26 @@ pub fn settings() -> Section { // The rotation frequency dropdown should only be shown when the slideshow is enabled. if slideshow_enabled { column - .add(settings::item( - &descriptions[change_label], - dropdown( + .add(settings::item(&descriptions[change_label], { + let dropdown = dropdown( &page.rotation_options, Some(page.selected_rotation), Message::RotationFrequency, - ), - )) + ); + #[cfg(feature = "wayland")] + let dropdown = { + dropdown.with_popup( + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage( + crate::pages::Message::DesktopWallpaper(a), + ) + }, + ) + }; + dropdown + })) .into() } else { column.into() diff --git a/cosmic-settings/src/pages/desktop/window_management.rs b/cosmic-settings/src/pages/desktop/window_management.rs index 90188813..2089d3e0 100644 --- a/cosmic-settings/src/pages/desktop/window_management.rs +++ b/cosmic-settings/src/pages/desktop/window_management.rs @@ -3,8 +3,9 @@ use cosmic::{ iced::Length, + surface, widget::{self, settings, toggler}, - Apply, Element, + Apply, Element, Task, }; use cosmic_config::{ConfigGet, ConfigSet}; @@ -26,6 +27,7 @@ pub enum Message { ShowMaximizeButton(bool), ShowMinimizeButton(bool), SetEdgeSnapThreshold(u32), + Surface(surface::Action), } pub struct Page { @@ -107,7 +109,7 @@ impl Default for Page { } impl Page { - pub fn update(&mut self, message: Message) { + pub fn update(&mut self, message: Message) -> cosmic::iced::Task { match message { Message::SuperKey(id) => { let action = match id { @@ -115,7 +117,7 @@ impl Page { 1 => Some(shortcuts::action::System::WorkspaceOverview), 2 => Some(shortcuts::action::System::AppLibrary), 3 => None, - _ => return, + _ => return cosmic::iced::Task::none(), }; self.super_key_active = Some(id); @@ -186,7 +188,11 @@ impl Page { error!(?err, "Failed to set config 'edge_snap_threshold'"); } } - } + Message::Surface(a) => { + return cosmic::task::message(crate::app::Message::Surface(a)); + } + }; + cosmic::iced::Task::none() } } @@ -233,13 +239,20 @@ pub fn window_management() -> Section { settings::section() .title(§ion.title) - .add( - settings::item::builder(&descriptions[super_key]).control(widget::dropdown( + .add(settings::item::builder(&descriptions[super_key]).control( + widget::dropdown::popup_dropdown( &page.super_key_selections, page.super_key_active, Message::SuperKey, - )), - ) + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage( + crate::pages::Message::WindowManagement(a), + ) + }, + ), + )) .add(settings::flex_item( &descriptions[edge_gravity], toggler(page.edge_snap_threshold != 0).on_toggle(|is_enabled| { diff --git a/cosmic-settings/src/pages/display/mod.rs b/cosmic-settings/src/pages/display/mod.rs index 3f07b621..4191378c 100644 --- a/cosmic-settings/src/pages/display/mod.rs +++ b/cosmic-settings/src/pages/display/mod.rs @@ -11,7 +11,7 @@ use cosmic::iced_widget::scrollable::{Direction, RelativeOffset, Scrollbar}; use cosmic::widget::{ self, column, container, dropdown, list_column, segmented_button, tab_bar, text, toggler, }; -use cosmic::{Apply, Element, Task}; +use cosmic::{surface, Apply, Element, Task}; use cosmic_config::{ConfigGet, ConfigSet}; use cosmic_randr_shell::{ AdaptiveSyncAvailability, AdaptiveSyncState, List, Output, OutputKey, Transform, @@ -108,6 +108,7 @@ pub enum Message { randr: Arc>, }, SetXwaylandDescaling(bool), + Surface(surface::Action), } impl From for app::Message { @@ -626,6 +627,10 @@ impl Page { error!(?err, "Failed to set config 'descale_xwayland'"); } } + + Message::Surface(a) => { + return cosmic::task::message(crate::app::Message::Surface(a)); + } } self.last_pan = 0.5; @@ -1226,18 +1231,28 @@ pub fn display_configuration() -> Section { let mut items = vec![ widget::settings::item( &descriptions[resolution], - dropdown( + dropdown::popup_dropdown( &page.cache.resolutions, page.cache.resolution_selected, Message::Resolution, + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage(crate::pages::Message::Displays(a)) + }, ), ), widget::settings::item( &descriptions[refresh_rate], - dropdown( + dropdown::popup_dropdown( &page.cache.refresh_rates, page.cache.refresh_rate_selected, Message::RefreshRate, + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage(crate::pages::Message::Displays(a)) + }, ), ), ]; @@ -1245,10 +1260,15 @@ pub fn display_configuration() -> Section { if let Some(vrr_selected) = page.cache.vrr_selected { items.push(widget::settings::item( &descriptions[vrr], - dropdown( + dropdown::popup_dropdown( &page.cache.vrr_modes, Some(vrr_selected), Message::VariableRefreshRate, + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage(crate::pages::Message::Displays(a)) + }, ), )); } @@ -1256,7 +1276,16 @@ pub fn display_configuration() -> Section { items.extend(vec![ widget::settings::item( &descriptions[scale], - dropdown(&DPI_SCALE_LABELS, page.cache.scale_selected, Message::Scale), + dropdown::popup_dropdown( + &DPI_SCALE_LABELS, + page.cache.scale_selected, + Message::Scale, + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage(crate::pages::Message::Displays(a)) + }, + ), ), widget::settings::item( &descriptions[additional_scale_options], @@ -1271,7 +1300,7 @@ pub fn display_configuration() -> Section { ), widget::settings::item( &descriptions[orientation], - dropdown( + dropdown::popup_dropdown( &page.cache.orientations, page.cache.orientation_selected, |id| { @@ -1282,6 +1311,11 @@ pub fn display_configuration() -> Section { _ => Transform::Rotate270, }) }, + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage(crate::pages::Message::Displays(a)) + }, ), ), ]); diff --git a/cosmic-settings/src/pages/power/mod.rs b/cosmic-settings/src/pages/power/mod.rs index dc515e82..e5e8ef20 100644 --- a/cosmic-settings/src/pages/power/mod.rs +++ b/cosmic-settings/src/pages/power/mod.rs @@ -7,8 +7,8 @@ use chrono::TimeDelta; use cosmic::iced::{Alignment, Length}; use cosmic::iced_widget::{column, row}; use cosmic::widget::{self, radio, settings, text}; -use cosmic::Apply; use cosmic::Task; +use cosmic::{surface, Apply}; use cosmic_config::{Config, CosmicConfigEntry}; use cosmic_idle_config::CosmicIdleConfig; use cosmic_settings_page::{self as page, section, Section}; @@ -193,10 +193,11 @@ pub enum Message { ScreenOffTimeChange(Option), SuspendOnAcTimeChange(Option), SuspendOnBatteryTimeChange(Option), + Surface(surface::Action), } impl Page { - pub fn update(&mut self, message: Message) { + pub fn update(&mut self, message: Message) -> Task { let runtime = tokio::runtime::Runtime::new().unwrap(); let backend = runtime.block_on(backend::get_backend()); @@ -241,7 +242,11 @@ impl Page { Message::DeviceConnect(connected_device) => { self.connected_devices.push(connected_device) } + Message::Surface(a) => { + return cosmic::task::message(crate::app::Message::Surface(a)); + } }; + Task::none() } } @@ -417,7 +422,14 @@ fn power_saving_row<'a>( settings::item( label, - widget::dropdown(labels, selected, move |i| on_select(times.get(i).copied())), + widget::dropdown::popup_dropdown( + labels, + selected, + move |i| on_select(times.get(i).copied()), + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| crate::app::Message::PageMessage(crate::pages::Message::Power(a)), + ), ) .into() } diff --git a/cosmic-settings/src/pages/sound.rs b/cosmic-settings/src/pages/sound.rs index 5b41a3b0..83f92d62 100644 --- a/cosmic-settings/src/pages/sound.rs +++ b/cosmic-settings/src/pages/sound.rs @@ -4,7 +4,8 @@ use std::{collections::BTreeMap, time::Duration}; use cosmic::{ - iced::{Alignment, Length}, + iced::{window, Alignment, Length}, + surface, widget::{self, settings}, Element, Task, }; @@ -48,6 +49,8 @@ pub enum Message { SourceVolumeApply(NodeId), /// Toggle the mute status of the input output. SourceMuteToggle, + /// Surface Action + Surface(surface::Action), } #[derive(Debug)] @@ -315,7 +318,6 @@ impl Page { return command; } } - Message::Pulse(pulse::Event::SourceVolume(volume)) => { if self.sink_volume_debounce { return Task::none(); @@ -324,7 +326,6 @@ impl Page { self.source_volume = volume; self.source_volume_text = volume.to_string(); } - Message::SinkVolumeChanged(volume) => { self.sink_volume = volume; self.sink_volume_text = volume.to_string(); @@ -345,7 +346,6 @@ impl Page { return command; } } - Message::Pulse(pulse::Event::SinkVolume(volume)) => { if self.sink_volume_debounce { return Task::none(); @@ -354,27 +354,22 @@ impl Page { self.sink_volume = volume; self.sink_volume_text = volume.to_string(); } - Message::Pulse(pulse::Event::DefaultSink(sink)) => { if !self.changing_sink_profile { self.set_default_sink(sink); } } - Message::Pulse(pulse::Event::DefaultSource(source)) => { if !self.changing_source_profile { self.set_default_source(source); } } - Message::Pulse(pulse::Event::SinkMute(mute)) => { self.sink_mute = mute; } - Message::Pulse(pulse::Event::SourceMute(mute)) => { self.source_mute = mute; } - Message::Pulse(pulse::Event::CardInfo(card)) => { let device_id = match card.variant { pulse::DeviceVariant::Alsa { alsa_card, .. } => DeviceId::Alsa(alsa_card), @@ -386,7 +381,6 @@ impl Page { self.active_profiles .insert(device_id, card.active_profile.map(|p| p.name)); } - Message::Pipewire(pipewire::DeviceEvent::Add(device)) => { let device_id = match device.variant { pipewire::DeviceVariant::Alsa { alsa_card, .. } => DeviceId::Alsa(alsa_card), @@ -439,7 +433,6 @@ impl Page { card.devices .sort_unstable_by(|_, av, _, bv| av.description.cmp(&bv.description)); } - Message::Pipewire(pipewire::DeviceEvent::Remove(node_id)) => { let mut remove = None; for (card_id, card) in &mut self.devices { @@ -473,7 +466,6 @@ impl Page { } } } - Message::SinkChanged(pos) => { if let Some(node_id) = self.sink_ids.get(pos) { for card in self.devices.values() { @@ -488,7 +480,6 @@ impl Page { } } } - Message::SourceChanged(pos) => { if let Some(node_id) = self.source_ids.get(pos) { for card in self.devices.values() { @@ -503,31 +494,26 @@ impl Page { } } } - Message::SinkVolumeApply(node_id) => { self.sink_volume_debounce = false; wpctl_set_volume(node_id, self.sink_volume); } - Message::SourceVolumeApply(node_id) => { self.source_volume_debounce = false; wpctl_set_volume(node_id, self.source_volume); } - Message::SinkMuteToggle => { self.sink_mute = !self.sink_mute; if let Some(&node_id) = self.sink_ids.get(self.active_sink.unwrap_or(0)) { wpctl_set_mute(node_id, self.sink_mute); } } - Message::SourceMuteToggle => { self.source_mute = !self.source_mute; if let Some(&node_id) = self.source_ids.get(self.active_source.unwrap_or(0)) { wpctl_set_mute(node_id, self.source_mute); } } - Message::SinkProfileChanged(profile) => { self.active_sink_profile = Some(profile); @@ -548,7 +534,6 @@ impl Page { } } } - Message::SinkProfileSelect(device_id) => { self.changing_sink_profile = false; let sink_pos = self.active_sink.unwrap_or(0); @@ -560,7 +545,6 @@ impl Page { } } } - Message::SourceProfileChanged(profile) => { self.active_source_profile = Some(profile); if let Some(profile) = self.source_profile_names.get(profile).cloned() { @@ -580,7 +564,6 @@ impl Page { } } } - Message::SourceProfileSelect(device_id) => { self.changing_source_profile = false; let source_pos = self.active_source.unwrap_or(0); @@ -592,6 +575,9 @@ impl Page { } } } + Message::Surface(a) => { + return cosmic::task::message(crate::app::Message::Surface(a)); + } } Task::none() } @@ -629,11 +615,13 @@ fn input() -> Section { widget::slider(0..=150, page.source_volume, Message::SourceVolumeChanged) .breakpoints(&[100]), ); - - let devices = widget::dropdown( + let mut devices = widget::dropdown::popup_dropdown( &page.sources, Some(page.active_source.unwrap_or(0)), Message::SourceChanged, + window::Id::RESERVED, + Message::Surface, + |a| crate::app::Message::PageMessage(crate::pages::Message::Sound(a)), ); let mut controls = settings::section() @@ -645,10 +633,13 @@ fn input() -> Section { .add(settings::item(&*section.descriptions[device], devices)); if !page.source_profiles.is_empty() { - let dropdown = widget::dropdown( + let mut dropdown = widget::dropdown::popup_dropdown( &page.source_profiles, page.active_source_profile, Message::SourceProfileChanged, + window::Id::RESERVED, + Message::Surface, + |a| crate::app::Message::PageMessage(crate::pages::Message::Sound(a)), ); controls = controls.add(settings::item(&*section.descriptions[profile], dropdown)); @@ -692,10 +683,13 @@ fn output() -> Section { .breakpoints(&[100]), ); - let devices = widget::dropdown( + let devices = widget::dropdown::popup_dropdown( &page.sinks, Some(page.active_sink.unwrap_or(0)), Message::SinkChanged, + window::Id::RESERVED, + Message::Surface, + |a| crate::app::Message::PageMessage(crate::pages::Message::Sound(a)), ); let mut controls = settings::section() @@ -707,10 +701,13 @@ fn output() -> Section { .add(settings::item(&*section.descriptions[device], devices)); if !page.sink_profiles.is_empty() { - let dropdown = widget::dropdown( + let dropdown = widget::dropdown::popup_dropdown( &page.sink_profiles, page.active_sink_profile, Message::SinkProfileChanged, + window::Id::RESERVED, + Message::Surface, + |a| crate::app::Message::PageMessage(crate::pages::Message::Sound(a)), ); controls = controls.add(settings::item(&*section.descriptions[profile], dropdown)); diff --git a/cosmic-settings/src/pages/system/default_apps.rs b/cosmic-settings/src/pages/system/default_apps.rs index f73ac55e..5fec6826 100644 --- a/cosmic-settings/src/pages/system/default_apps.rs +++ b/cosmic-settings/src/pages/system/default_apps.rs @@ -9,6 +9,7 @@ use std::{ }; use cosmic::{ + surface, widget::{self, dropdown, icon, settings}, Apply, Element, Task, }; @@ -50,6 +51,7 @@ pub enum Category { pub enum Message { SetDefault(Category, usize), Update(CachedMimeApps), + Surface(surface::Action), } impl From for crate::app::Message { @@ -267,10 +269,12 @@ impl Page { _ = std::process::Command::new("update-desktop-database").status(); } } - Message::Update(mime_apps) => { self.mime_apps = Some(mime_apps); } + Message::Surface(a) => { + return cosmic::task::message(crate::app::Message::Surface(a)); + } } Task::none() @@ -289,9 +293,14 @@ fn apps() -> Section { let meta = &mime_apps.apps[DROPDOWN_WEB_BROWSER]; settings::flex_item( fl!("default-apps", "web-browser"), - dropdown(&meta.apps, meta.selected, |id| { - Message::SetDefault(Category::WebBrowser, id) - }) + 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(&meta.icons), ) .min_item_width(300.0) @@ -300,9 +309,14 @@ fn apps() -> Section { let meta = &mime_apps.apps[DROPDOWN_FILE_MANAGER]; settings::flex_item( fl!("default-apps", "file-manager"), - dropdown(&meta.apps, meta.selected, |id| { - Message::SetDefault(Category::FileManager, id) - }) + 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(&meta.icons), ) }) @@ -310,9 +324,14 @@ fn apps() -> Section { let meta = &mime_apps.apps[DROPDOWN_MAIL]; settings::flex_item( fl!("default-apps", "mail-client"), - dropdown(&meta.apps, meta.selected, |id| { - Message::SetDefault(Category::Mail, id) - }) + 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(&meta.icons), ) }) @@ -320,9 +339,14 @@ fn apps() -> Section { let meta = &mime_apps.apps[DROPDOWN_MUSIC]; settings::flex_item( fl!("default-apps", "music"), - dropdown(&meta.apps, meta.selected, |id| { - Message::SetDefault(Category::Audio, id) - }) + 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(&meta.icons), ) }) @@ -330,9 +354,14 @@ fn apps() -> Section { let meta = &mime_apps.apps[DROPDOWN_VIDEO]; settings::flex_item( fl!("default-apps", "video"), - dropdown(&meta.apps, meta.selected, |id| { - Message::SetDefault(Category::Video, id) - }) + 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(&meta.icons), ) }) @@ -340,9 +369,14 @@ fn apps() -> Section { let meta = &mime_apps.apps[DROPDOWN_PHOTO]; settings::flex_item( fl!("default-apps", "photos"), - dropdown(&meta.apps, meta.selected, |id| { - Message::SetDefault(Category::Image, id) - }) + 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(&meta.icons), ) }) @@ -350,9 +384,14 @@ fn apps() -> Section { let meta = &mime_apps.apps[DROPDOWN_CALENDAR]; settings::flex_item( fl!("default-apps", "calendar"), - dropdown(&meta.apps, meta.selected, |id| { - Message::SetDefault(Category::Calendar, id) - }) + 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(&meta.icons), ) }) @@ -360,9 +399,14 @@ fn apps() -> Section { let meta = &mime_apps.apps[DROPDOWN_TERMINAL]; settings::flex_item( fl!("default-apps", "terminal"), - dropdown(&meta.apps, meta.selected, |id| { - Message::SetDefault(Category::Terminal, id) - }) + 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(&meta.icons), ) }) @@ -370,9 +414,14 @@ fn apps() -> Section { let meta = &mime_apps.apps[DROPDOWN_TEXT_EDITOR]; settings::flex_item( fl!("default-apps", "text-editor"), - dropdown(&meta.apps, meta.selected, |id| { - Message::SetDefault(Category::TextEditor, id) - }) + 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(&meta.icons), ) }) diff --git a/cosmic-settings/src/pages/time/date.rs b/cosmic-settings/src/pages/time/date.rs index 9547883b..e9510764 100644 --- a/cosmic-settings/src/pages/time/date.rs +++ b/cosmic-settings/src/pages/time/date.rs @@ -7,6 +7,7 @@ use chrono::{Datelike, Timelike}; use cosmic::{ cosmic_config::{self, ConfigGet, ConfigSet}, iced_core::text::Wrapping, + surface, widget::{self, dropdown, settings}, Apply, Element, Task, }; @@ -276,6 +277,10 @@ impl Page { self.update_local_time(); } + Message::Surface(a) => { + return cosmic::task::message(crate::app::Message::Surface(a)); + } + Message::None => (), } @@ -365,6 +370,7 @@ pub enum Message { TimezoneContext, TimezoneSearch(String), UpdateTime, + Surface(surface::Action), } impl page::AutoBind for Page {} @@ -416,23 +422,32 @@ fn format() -> Section { ) // First day of week .add( - settings::item::builder(§ion.descriptions[first]).control(dropdown( - &*WEEKDAYS, - match page.first_day_of_week { - 4 => Some(0), // friday - 5 => Some(1), // saturday - 0 => Some(3), // monday - _ => Some(2), // sunday - }, - |v| { - match v { - 0 => Message::FirstDayOfWeek(4), // friday - 1 => Message::FirstDayOfWeek(5), // saturday - 3 => Message::FirstDayOfWeek(0), // monday - _ => Message::FirstDayOfWeek(6), // sunday - } - }, - )), + settings::item::builder(§ion.descriptions[first]).control( + dropdown::popup_dropdown( + &*WEEKDAYS, + match page.first_day_of_week { + 4 => Some(0), // friday + 5 => Some(1), // saturday + 0 => Some(3), // monday + _ => Some(2), // sunday + }, + |v| { + match v { + 0 => Message::FirstDayOfWeek(4), // friday + 1 => Message::FirstDayOfWeek(5), // saturday + 3 => Message::FirstDayOfWeek(0), // monday + _ => Message::FirstDayOfWeek(6), // sunday + } + }, + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage( + crate::pages::Message::DateAndTime(a), + ) + }, + ), + ), ) // Date on top panel toggle .add(