diff --git a/Cargo.lock b/Cargo.lock index bdd37740..8026e49d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1308,7 +1308,7 @@ dependencies = [ [[package]] name = "cosmic-client-toolkit" version = "0.2.0" -source = "git+https://github.com/pop-os/cosmic-protocols//?branch=main#c253ec1d6804afbcdf250f5cc37ae1194bba7bd2" +source = "git+https://github.com/pop-os/cosmic-protocols//?rev=a7d2d7a#a7d2d7a6188425f699eaddf7a025617ce56068ae" dependencies = [ "bitflags 2.11.1", "cosmic-protocols", @@ -1331,7 +1331,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic#758c13723fc35b1d82d7fa4f35859c9f7f3c1b0c" +source = "git+https://github.com/pop-os/libcosmic//?branch=theme-v2#ed83072293695382790cec8d697490a61217a631" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1352,7 +1352,7 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic#758c13723fc35b1d82d7fa4f35859c9f7f3c1b0c" +source = "git+https://github.com/pop-os/libcosmic//?branch=theme-v2#ed83072293695382790cec8d697490a61217a631" dependencies = [ "quote", "syn", @@ -1446,7 +1446,7 @@ dependencies = [ [[package]] name = "cosmic-protocols" version = "0.2.0" -source = "git+https://github.com/pop-os/cosmic-protocols//?branch=main#c253ec1d6804afbcdf250f5cc37ae1194bba7bd2" +source = "git+https://github.com/pop-os/cosmic-protocols//?rev=a7d2d7a#a7d2d7a6188425f699eaddf7a025617ce56068ae" dependencies = [ "bitflags 2.11.1", "wayland-backend", @@ -1567,7 +1567,6 @@ dependencies = [ [[package]] name = "cosmic-settings-upower-subscription" version = "1.0.7" -source = "git+https://github.com/pop-os/cosmic-settings#1f225d19ce582423fe8713fc6669c51d162f256f" dependencies = [ "futures", "iced_futures", @@ -1605,13 +1604,14 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic#758c13723fc35b1d82d7fa4f35859c9f7f3c1b0c" +source = "git+https://github.com/pop-os/libcosmic//?branch=theme-v2#ed83072293695382790cec8d697490a61217a631" dependencies = [ "almost", "configparser", "cosmic-config", "csscolorparser", "dirs", + "hex_color", "palette", "ron 0.12.1", "serde", @@ -2706,7 +2706,7 @@ dependencies = [ "log", "presser", "thiserror 2.0.18", - "windows 0.62.2", + "windows 0.58.0", ] [[package]] @@ -2832,6 +2832,17 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hex_color" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d37f101bf4c633f7ca2e4b5e136050314503dd198e78e325ea602c327c484ef0" +dependencies = [ + "arrayvec", + "rand 0.8.6", + "serde", +] + [[package]] name = "hexf-parse" version = "0.2.1" @@ -2950,7 +2961,7 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic#758c13723fc35b1d82d7fa4f35859c9f7f3c1b0c" +source = "git+https://github.com/pop-os/libcosmic//?branch=theme-v2#ed83072293695382790cec8d697490a61217a631" dependencies = [ "dnd", "iced_accessibility", @@ -2971,7 +2982,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#758c13723fc35b1d82d7fa4f35859c9f7f3c1b0c" +source = "git+https://github.com/pop-os/libcosmic//?branch=theme-v2#ed83072293695382790cec8d697490a61217a631" dependencies = [ "accesskit", "accesskit_winit", @@ -2980,7 +2991,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic#758c13723fc35b1d82d7fa4f35859c9f7f3c1b0c" +source = "git+https://github.com/pop-os/libcosmic//?branch=theme-v2#ed83072293695382790cec8d697490a61217a631" dependencies = [ "bitflags 2.11.1", "bytes", @@ -3005,7 +3016,7 @@ dependencies = [ [[package]] name = "iced_debug" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic#758c13723fc35b1d82d7fa4f35859c9f7f3c1b0c" +source = "git+https://github.com/pop-os/libcosmic//?branch=theme-v2#ed83072293695382790cec8d697490a61217a631" dependencies = [ "iced_core", "iced_futures", @@ -3015,7 +3026,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic#758c13723fc35b1d82d7fa4f35859c9f7f3c1b0c" +source = "git+https://github.com/pop-os/libcosmic//?branch=theme-v2#ed83072293695382790cec8d697490a61217a631" dependencies = [ "futures", "iced_core", @@ -3029,7 +3040,7 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic#758c13723fc35b1d82d7fa4f35859c9f7f3c1b0c" +source = "git+https://github.com/pop-os/libcosmic//?branch=theme-v2#ed83072293695382790cec8d697490a61217a631" dependencies = [ "bitflags 2.11.1", "bytemuck", @@ -3050,7 +3061,7 @@ dependencies = [ [[package]] name = "iced_program" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic#758c13723fc35b1d82d7fa4f35859c9f7f3c1b0c" +source = "git+https://github.com/pop-os/libcosmic//?branch=theme-v2#ed83072293695382790cec8d697490a61217a631" dependencies = [ "iced_graphics", "iced_runtime", @@ -3059,7 +3070,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic#758c13723fc35b1d82d7fa4f35859c9f7f3c1b0c" +source = "git+https://github.com/pop-os/libcosmic//?branch=theme-v2#ed83072293695382790cec8d697490a61217a631" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -3071,7 +3082,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic#758c13723fc35b1d82d7fa4f35859c9f7f3c1b0c" +source = "git+https://github.com/pop-os/libcosmic//?branch=theme-v2#ed83072293695382790cec8d697490a61217a631" dependencies = [ "bytes", "cosmic-client-toolkit", @@ -3086,7 +3097,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic#758c13723fc35b1d82d7fa4f35859c9f7f3c1b0c" +source = "git+https://github.com/pop-os/libcosmic//?branch=theme-v2#ed83072293695382790cec8d697490a61217a631" dependencies = [ "bytemuck", "cosmic-text", @@ -3103,7 +3114,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic#758c13723fc35b1d82d7fa4f35859c9f7f3c1b0c" +source = "git+https://github.com/pop-os/libcosmic//?branch=theme-v2#ed83072293695382790cec8d697490a61217a631" dependencies = [ "as-raw-xcb-connection", "bitflags 2.11.1", @@ -3134,7 +3145,7 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.14.2" -source = "git+https://github.com/pop-os/libcosmic#758c13723fc35b1d82d7fa4f35859c9f7f3c1b0c" +source = "git+https://github.com/pop-os/libcosmic//?branch=theme-v2#ed83072293695382790cec8d697490a61217a631" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -3152,7 +3163,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic#758c13723fc35b1d82d7fa4f35859c9f7f3c1b0c" +source = "git+https://github.com/pop-os/libcosmic//?branch=theme-v2#ed83072293695382790cec8d697490a61217a631" dependencies = [ "cosmic-client-toolkit", "cursor-icon", @@ -4010,7 +4021,7 @@ checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libcosmic" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic#758c13723fc35b1d82d7fa4f35859c9f7f3c1b0c" +source = "git+https://github.com/pop-os/libcosmic//?branch=theme-v2#ed83072293695382790cec8d697490a61217a631" dependencies = [ "apply", "ashpd 0.12.3", @@ -4024,6 +4035,7 @@ dependencies = [ "cosmic-theme", "css-color", "derive_setters", + "enumflags2", "float-cmp 0.10.0", "freedesktop-desktop-entry", "futures", @@ -5375,6 +5387,8 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ + "libc", + "rand_chacha 0.3.1", "rand_core 0.6.4", ] @@ -5384,10 +5398,20 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ - "rand_chacha", + "rand_chacha 0.9.0", "rand_core 0.9.5", ] +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + [[package]] name = "rand_chacha" version = "0.9.0" @@ -5403,6 +5427,9 @@ name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] [[package]] name = "rand_core" @@ -7368,6 +7395,16 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows" version = "0.61.3" @@ -7411,14 +7448,27 @@ dependencies = [ "windows-core 0.62.2", ] +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings 0.1.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows-core" version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-implement", - "windows-interface", + "windows-implement 0.60.2", + "windows-interface 0.59.3", "windows-link 0.1.3", "windows-result 0.3.4", "windows-strings 0.4.2", @@ -7430,8 +7480,8 @@ version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ - "windows-implement", - "windows-interface", + "windows-implement 0.60.2", + "windows-interface 0.59.3", "windows-link 0.2.1", "windows-result 0.4.1", "windows-strings 0.5.1", @@ -7459,6 +7509,17 @@ dependencies = [ "windows-threading 0.2.1", ] +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-implement" version = "0.60.2" @@ -7470,6 +7531,17 @@ dependencies = [ "syn", ] +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-interface" version = "0.59.3" @@ -7513,6 +7585,15 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-result" version = "0.3.4" @@ -7531,6 +7612,16 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result 0.2.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows-strings" version = "0.4.2" diff --git a/Cargo.toml b/Cargo.toml index f97b6b28..8c94e4b8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,11 +25,11 @@ resolver = "3" [workspace.dependencies] anyhow = "1.0.102" -cctk = { git = "https://github.com/pop-os/cosmic-protocols", package = "cosmic-client-toolkit", rev = "d0e95be" } +cctk = { git = "https://github.com/pop-os/cosmic-protocols", package = "cosmic-client-toolkit", rev = "a7d2d7a" } cosmic-applets-config = { path = "cosmic-applets-config" } cosmic-protocols = { git = "https://github.com/pop-os/cosmic-protocols", default-features = false, features = [ "client", -], rev = "d0e95be" } +], rev = "a7d2d7a" } futures = "0.3" futures-util = "0.3" @@ -70,24 +70,20 @@ lto = "thin" [workspace.metadata.cargo-machete] ignored = ["libcosmic"] -# [patch."https://github.com/pop-os/libcosmic"] +[patch."https://github.com/pop-os/libcosmic"] # cosmic-config = { path = "../libcosmic/cosmic-config" } # libcosmic = { path = "../libcosmic" } # iced_futures = { path = "../libcosmic/iced/futures" } -# cosmic-config = { git = "https://github.com/pop-os/libcosmic//" } -# libcosmic = { git = "https://github.com/pop-os/libcosmic//" } -# iced_futures = { git = "https://github.com/pop-os/libcosmic//" } - -# [patch."https://github.com/pop-os/winit.git"] -# winit = { git = "https://github.com/rust-windowing/winit.git", rev = "241b7a80bba96c91fa3901729cd5dec66abb9be4" } -# winit = { path = "../winit" } +cosmic-config = { git = "https://github.com/pop-os/libcosmic//", branch = "theme-v2" } +libcosmic = { git = "https://github.com/pop-os/libcosmic//", branch = "theme-v2" } +iced_futures = { git = "https://github.com/pop-os/libcosmic//", branch = "theme-v2" } [patch."https://github.com/smithay/client-toolkit.git"] sctk = { package = "smithay-client-toolkit", version = "0.20.0" } [patch."https://github.com/pop-os/cosmic-protocols"] -cosmic-protocols = { git = "https://github.com/pop-os/cosmic-protocols//", branch = "main" } -cosmic-client-toolkit = { git = "https://github.com/pop-os/cosmic-protocols//", branch = "main" } +cosmic-protocols = { git = "https://github.com/pop-os/cosmic-protocols//", rev = "a7d2d7a" } +cosmic-client-toolkit = { git = "https://github.com/pop-os/cosmic-protocols//", rev = "a7d2d7a" } # [patch.'https://github.com/pop-os/dbus-settings-bindings'] # cosmic-dbus-networkmanager = { path = "../dbus-settings-bindings/networkmanager" } diff --git a/cosmic-app-list/src/app.rs b/cosmic-app-list/src/app.rs index 932ffd6c..50dd375b 100755 --- a/cosmic-app-list/src/app.rs +++ b/cosmic-app-list/src/app.rs @@ -906,44 +906,52 @@ impl cosmic::Application for CosmicAppList { .iter() .chain(self.pinned_list.iter()) .find(|t| t.id == id) + .cloned() { - let Some(rectangle) = self.rectangles.get(&toplevel_group.id.into()) else { + let Some(rectangle) = self.rectangles.get(&toplevel_group.id.into()).copied() + else { tracing::error!("No rectangle found for toplevel group"); return Task::none(); }; + let popup_task = + cosmic::surface::surface_task(cosmic::surface::action::app_popup( + move |app: &mut Self| { + let new_id = window::Id::unique(); + app.popup = Some(Popup { + parent: parent_window_id, + id: new_id, + dock_item: toplevel_group.clone(), + popup_type: PopupType::RightClickMenu, + }); - let new_id = window::Id::unique(); - self.popup = Some(Popup { - parent: parent_window_id, - id: new_id, - dock_item: toplevel_group.clone(), - popup_type: PopupType::RightClickMenu, - }); - - let mut popup_settings = self.core.applet.get_popup_settings( - parent_window_id, - new_id, - None, - None, - None, - ); - let iced::Rectangle { - x, - y, - width, - height, - } = *rectangle; - popup_settings.positioner.anchor_rect = iced::Rectangle:: { - x: x as i32, - y: y as i32, - width: width as i32, - height: height as i32, - }; + let mut popup_settings = app.core.applet.get_popup_settings( + parent_window_id, + new_id, + None, + None, + None, + ); + let iced::Rectangle { + x, + y, + width, + height, + } = rectangle; + popup_settings.positioner.anchor_rect = iced::Rectangle:: { + x: x as i32, + y: y as i32, + width: width as i32, + height: height as i32, + }; + popup_settings + }, + None, + )); let gpu_update = Task::perform(try_get_gpus(), |gpus| { cosmic::Action::App(Message::GpuRequest(gpus)) }); - return Task::batch([gpu_update, get_popup(popup_settings)]); + return Task::batch([gpu_update, popup_task]); } } Message::ToplevelListPopup(id, parent_window_id) => { @@ -974,10 +982,10 @@ impl cosmic::Application for CosmicAppList { } } - let Some(rectangle) = self.rectangles.get(&toplevel_group.id.into()) else { + let Some(rectangle) = self.rectangles.get(&toplevel_group.id.into()).copied() + else { return Task::none(); }; - let new_id = window::Id::unique(); self.popup = Some(Popup { parent: parent_window_id, @@ -985,48 +993,55 @@ impl cosmic::Application for CosmicAppList { dock_item: toplevel_group.clone(), popup_type: PopupType::ToplevelList, }); + let popup_task = + cosmic::surface::surface_task(cosmic::surface::action::app_popup( + move |app: &mut Self| { + let mut popup_settings = app.core.applet.get_popup_settings( + parent_window_id, + new_id, + None, + None, + None, + ); + let iced::Rectangle { + x, + y, + width, + height, + } = rectangle; + popup_settings.positioner.anchor_rect = iced::Rectangle:: { + x: x as i32, + y: y as i32, + width: width as i32, + height: height as i32, + }; + let max_windows = 7.0; + let window_spacing = 8.0; + popup_settings.positioner.size_limits = match app.core.applet.anchor + { + PanelAnchor::Right | PanelAnchor::Left => Limits::NONE + .min_width(100.0) + .min_height(30.0) + .max_width(window_spacing * 2.0 + TOPLEVEL_BUTTON_WIDTH) + .max_height( + TOPLEVEL_BUTTON_HEIGHT * max_windows + + window_spacing * (max_windows + 1.0), + ), + PanelAnchor::Bottom | PanelAnchor::Top => Limits::NONE + .min_width(30.0) + .min_height(100.0) + .max_width( + TOPLEVEL_BUTTON_WIDTH * max_windows + + window_spacing * (max_windows + 1.0), + ) + .max_height(window_spacing * 2.0 + TOPLEVEL_BUTTON_HEIGHT), + }; + popup_settings + }, + None, + )); - let mut popup_settings = self.core.applet.get_popup_settings( - parent_window_id, - new_id, - None, - None, - None, - ); - let iced::Rectangle { - x, - y, - width, - height, - } = *rectangle; - popup_settings.positioner.anchor_rect = iced::Rectangle:: { - x: x as i32, - y: y as i32, - width: width as i32, - height: height as i32, - }; - let max_windows = 7.0; - let window_spacing = 8.0; - popup_settings.positioner.size_limits = match self.core.applet.anchor { - PanelAnchor::Right | PanelAnchor::Left => Limits::NONE - .min_width(100.0) - .min_height(30.0) - .max_width(window_spacing * 2.0 + TOPLEVEL_BUTTON_WIDTH) - .max_height( - TOPLEVEL_BUTTON_HEIGHT * max_windows - + window_spacing * (max_windows + 1.0), - ), - PanelAnchor::Bottom | PanelAnchor::Top => Limits::NONE - .min_width(30.0) - .min_height(100.0) - .max_width( - TOPLEVEL_BUTTON_WIDTH * max_windows - + window_spacing * (max_windows + 1.0), - ) - .max_height(window_spacing * 2.0 + TOPLEVEL_BUTTON_HEIGHT), - }; - - return get_popup(popup_settings); + return popup_task; } } Message::ToplevelHoverChanged(handle, entering) => { @@ -1590,52 +1605,62 @@ impl cosmic::Application for CosmicAppList { if create_new { let new_id = window::Id::unique(); self.overflow_active_popup = Some(new_id); - let rectangle = self.rectangles.get(&DockItemId::ActiveOverflow); - let mut popup_settings = self.core.applet.get_popup_settings( - self.core.main_window_id().unwrap(), - new_id, - None, - None, - None, - ); - if let Some(iced::Rectangle { + let Some(iced::Rectangle { x, y, width, height, - }) = rectangle - { - popup_settings.positioner.anchor_rect = iced::Rectangle:: { - x: *x as i32, - y: *y as i32, - width: *width as i32, - height: *height as i32, - }; - } - let applet_suggested_size = self.core.applet.suggested_size(false).0 - + 2 * self.core.applet.suggested_padding(false).0; - let (_favorite_popup_cutoff, active_popup_cutoff) = - self.panel_overflow_lengths(); - let popup_applet_count = - self.active_list.len().saturating_sub( - (active_popup_cutoff.unwrap_or_default()).saturating_sub(1), - ) as f32; - let popup_applet_size = applet_suggested_size as f32 * popup_applet_count - + 4.0 * (popup_applet_count - 1.); - let (max_width, max_height) = match self.core.applet.anchor { - PanelAnchor::Top | PanelAnchor::Bottom => { - (popup_applet_size, applet_suggested_size as f32) - } - PanelAnchor::Left | PanelAnchor::Right => { - (applet_suggested_size as f32, popup_applet_size) - } + }) = self.rectangles.get(&DockItemId::ActiveOverflow).copied() + else { + return Task::none(); }; - popup_settings.positioner.size_limits = Limits::NONE - .max_width(max_width) - .min_width(1.) - .max_height(max_height) - .min_height(1.); - cmds.push(get_popup(popup_settings)); + + let popup_task = + cosmic::surface::surface_task(cosmic::surface::action::app_popup( + move |app: &mut Self| { + let mut popup_settings = app.core.applet.get_popup_settings( + app.core.main_window_id().unwrap(), + new_id, + None, + None, + None, + ); + + popup_settings.positioner.anchor_rect = iced::Rectangle:: { + x: x as i32, + y: y as i32, + width: width as i32, + height: height as i32, + }; + + let applet_suggested_size = app.core.applet.suggested_size(false).0 + + 2 * app.core.applet.suggested_padding(false).0; + let (_favorite_popup_cutoff, active_popup_cutoff) = + app.panel_overflow_lengths(); + let popup_applet_count = app.active_list.len().saturating_sub( + (active_popup_cutoff.unwrap_or_default()).saturating_sub(1), + ) as f32; + let popup_applet_size = applet_suggested_size as f32 + * popup_applet_count + + 4.0 * (popup_applet_count - 1.); + let (max_width, max_height) = match app.core.applet.anchor { + PanelAnchor::Top | PanelAnchor::Bottom => { + (popup_applet_size, applet_suggested_size as f32) + } + PanelAnchor::Left | PanelAnchor::Right => { + (applet_suggested_size as f32, popup_applet_size) + } + }; + popup_settings.positioner.size_limits = Limits::NONE + .max_width(max_width) + .min_width(1.) + .max_height(max_height) + .min_height(1.); + popup_settings + }, + None, + )); + cmds.push(popup_task); } return Task::batch(cmds); } @@ -1647,52 +1672,62 @@ impl cosmic::Application for CosmicAppList { if create_new { let new_id = window::Id::unique(); self.overflow_favorites_popup = Some(new_id); - let rectangle = self.rectangles.get(&DockItemId::FavoritesOverflow); - let mut popup_settings = self.core.applet.get_popup_settings( - self.core.main_window_id().unwrap(), - new_id, - None, - None, - None, - ); - if let Some(iced::Rectangle { + let Some(iced::Rectangle { x, y, width, height, - }) = rectangle - { - popup_settings.positioner.anchor_rect = iced::Rectangle:: { - x: *x as i32, - y: *y as i32, - width: *width as i32, - height: *height as i32, - }; - } - let applet_suggested_size = self.core.applet.suggested_size(false).0 - + 2 * self.core.applet.suggested_padding(false).0; - let (favorite_popup_cutoff, _active_popup_cutoff) = - self.panel_overflow_lengths(); - let popup_applet_count = - self.pinned_list.len().saturating_sub( - favorite_popup_cutoff.unwrap_or_default().saturating_sub(1), - ) as f32; - let popup_applet_size = applet_suggested_size as f32 * popup_applet_count - + 4.0 * (popup_applet_count - 1.); - let (max_width, max_height) = match self.core.applet.anchor { - PanelAnchor::Top | PanelAnchor::Bottom => { - (popup_applet_size, applet_suggested_size as f32) - } - PanelAnchor::Left | PanelAnchor::Right => { - (applet_suggested_size as f32, popup_applet_size) - } + }) = self.rectangles.get(&DockItemId::FavoritesOverflow).copied() + else { + return Task::none(); }; - popup_settings.positioner.size_limits = Limits::NONE - .max_width(max_width) - .min_width(1.) - .max_height(max_height) - .min_height(1.); - cmds.push(get_popup(popup_settings)); + + let popup_task = + cosmic::surface::surface_task(cosmic::surface::action::app_popup( + move |app: &mut Self| { + let mut popup_settings = app.core.applet.get_popup_settings( + app.core.main_window_id().unwrap(), + new_id, + None, + None, + None, + ); + + popup_settings.positioner.anchor_rect = iced::Rectangle:: { + x: x as i32, + y: y as i32, + width: width as i32, + height: height as i32, + }; + + let applet_suggested_size = app.core.applet.suggested_size(false).0 + + 2 * app.core.applet.suggested_padding(false).0; + let (favorite_popup_cutoff, _active_popup_cutoff) = + app.panel_overflow_lengths(); + let popup_applet_count = app.pinned_list.len().saturating_sub( + favorite_popup_cutoff.unwrap_or_default().saturating_sub(1), + ) as f32; + let popup_applet_size = applet_suggested_size as f32 + * popup_applet_count + + 4.0 * (popup_applet_count - 1.); + let (max_width, max_height) = match app.core.applet.anchor { + PanelAnchor::Top | PanelAnchor::Bottom => { + (popup_applet_size, applet_suggested_size as f32) + } + PanelAnchor::Left | PanelAnchor::Right => { + (applet_suggested_size as f32, popup_applet_size) + } + }; + popup_settings.positioner.size_limits = Limits::NONE + .max_width(max_width) + .min_width(1.) + .max_height(max_height) + .min_height(1.); + popup_settings + }, + None, + )); + cmds.push(popup_task); } return Task::batch(cmds); } @@ -2200,7 +2235,7 @@ impl cosmic::Application for CosmicAppList { //TODO: move style to libcosmic .class(theme::Container::custom(|theme| { let cosmic = theme.cosmic(); - let component = &cosmic.background.component; + let component = &cosmic.background(theme.transparent).component; container::Style { icon_color: Some(component.on.into()), text_color: Some(component.on.into()), diff --git a/cosmic-applet-a11y/src/app.rs b/cosmic-applet-a11y/src/app.rs index ad5f2a1e..a20551b0 100644 --- a/cosmic-applet-a11y/src/app.rs +++ b/cosmic-applet-a11y/src/app.rs @@ -133,20 +133,26 @@ impl cosmic::Application for CosmicA11yApplet { } Message::TogglePopup => { if let Some(p) = self.popup.take() { - return destroy_popup(p); + return cosmic::surface::surface_task(cosmic::surface::action::destroy_popup( + p, + )); } else { - let new_id = window::Id::unique(); - self.popup.replace(new_id); + return cosmic::surface::surface_task(cosmic::surface::action::app_popup( + |app: &mut CosmicA11yApplet| { + let new_id = window::Id::unique(); + app.popup.replace(new_id); - let popup_settings = self.core.applet.get_popup_settings( - self.core.main_window_id().unwrap(), - new_id, - Some((1, 1)), + let popup_settings = app.core.applet.get_popup_settings( + app.core.main_window_id().unwrap(), + new_id, + Some((1, 1)), + None, + None, + ); + popup_settings + }, None, - None, - ); - - return get_popup(popup_settings); + )); } } Message::CloseRequested(id) => { diff --git a/cosmic-applet-audio/src/lib.rs b/cosmic-applet-audio/src/lib.rs index 9bd585d9..e0c12631 100644 --- a/cosmic-applet-audio/src/lib.rs +++ b/cosmic-applet-audio/src/lib.rs @@ -290,39 +290,47 @@ impl cosmic::Application for Audio { Message::Ignore => {} Message::TogglePopup => { if let Some(p) = self.popup.take() { - return destroy_popup(p); + return cosmic::surface::surface_task(cosmic::surface::action::destroy_popup( + p, + )); } else { - let new_id = window::Id::unique(); - self.popup.replace(new_id); + return cosmic::surface::surface_task(cosmic::surface::action::app_popup( + |app: &mut Self| { + let new_id = window::Id::unique(); + app.popup.replace(new_id); - (self.max_sink_volume, self.sink_breakpoints) = if amplification_sink() { - (150, &[100][..]) - } else { - (100, &[][..]) - }; + (app.max_sink_volume, app.sink_breakpoints) = if amplification_sink() { + (150, &[100][..]) + } else { + (100, &[][..]) + }; - (self.max_source_volume, self.source_breakpoints) = if amplification_source() { - (150, &[100][..]) - } else { - (100, &[][..]) - }; + (app.max_source_volume, app.source_breakpoints) = + if amplification_source() { + (150, &[100][..]) + } else { + (100, &[][..]) + }; - let mut popup_settings = self.core.applet.get_popup_settings( - self.core.main_window_id().unwrap(), - new_id, + let popup_settings = app.core.applet.get_popup_settings( + app.core.main_window_id().unwrap(), + new_id, + None, + None, + None, + ); + if let Some(r) = app.rectangle { + popup_settings.positioner.anchor_rect = Rectangle { + x: r.x as i32, + y: r.y as i32, + width: r.width as i32, + height: r.height as i32, + }; + } + popup_settings + }, None, - None, - None, - ); - if let Some(r) = self.rectangle { - popup_settings.positioner.anchor_rect = Rectangle { - x: r.x as i32, - y: r.y as i32, - width: r.width as i32, - height: r.height as i32, - }; - } - return get_popup(popup_settings); + )); } } diff --git a/cosmic-applet-battery/Cargo.toml b/cosmic-applet-battery/Cargo.toml index 8c8f6e1d..14549ea4 100644 --- a/cosmic-applet-battery/Cargo.toml +++ b/cosmic-applet-battery/Cargo.toml @@ -24,8 +24,8 @@ zbus.workspace = true serde.workspace = true [dependencies.cosmic-settings-upower-subscription] -git = "https://github.com/pop-os/cosmic-settings" -# path = "../../cosmic-settings/subscriptions/upower" +# git = "https://github.com/pop-os/cosmic-settings" +path = "../../cosmic-settings/subscriptions/upower" [dependencies.cosmic-settings-daemon-subscription] git = "https://github.com/pop-os/cosmic-settings" diff --git a/cosmic-applet-battery/src/app.rs b/cosmic-applet-battery/src/app.rs index c210d51a..24b85b0d 100644 --- a/cosmic-applet-battery/src/app.rs +++ b/cosmic-applet-battery/src/app.rs @@ -365,23 +365,30 @@ impl cosmic::Application for CosmicBatteryApplet { let _ = tx.send(KeyboardBacklightRequest::Get); } - let new_id = window::Id::unique(); - self.popup.replace(new_id); - - let popup_settings = self.core.applet.get_popup_settings( - self.core.main_window_id().unwrap(), - new_id, - Some((1, 1)), - None, - None, - ); if let Some(tx) = self.power_profile_sender.as_ref() { let _ = tx.send(PowerProfileRequest::Get); } if let Some(tx) = self.update_trigger.as_ref() { let _ = tx.send(()); } - let mut tasks = vec![get_popup(popup_settings)]; + let mut tasks = vec![cosmic::surface::surface_task( + cosmic::surface::action::app_popup( + |app: &mut Self| { + let new_id = window::Id::unique(); + app.popup.replace(new_id); + + let popup_settings = app.core.applet.get_popup_settings( + app.core.main_window_id().unwrap(), + new_id, + Some((1, 1)), + None, + None, + ); + popup_settings + }, + None, + ), + )]; if let Some(tx) = &self.settings_daemon_sender { let _ = tx.send(settings_daemon::Request::GetDisplayBrightness); let _ = tx.send(settings_daemon::Request::GetMaxDisplayBrightness); diff --git a/cosmic-applet-bluetooth/src/app.rs b/cosmic-applet-bluetooth/src/app.rs index e27af8ef..08d2ca47 100644 --- a/cosmic-applet-bluetooth/src/app.rs +++ b/cosmic-applet-bluetooth/src/app.rs @@ -120,20 +120,24 @@ impl cosmic::Application for CosmicBluetoothApplet { } else { set_discovery(true); - // TODO request update of state maybe - let new_id = window::Id::unique(); - self.popup.replace(new_id); - - let popup_settings = self.core.applet.get_popup_settings( - self.core.main_window_id().unwrap(), - new_id, - None, - None, - None, - ); + let get_popup_task = + cosmic::surface::surface_task(cosmic::surface::action::app_popup( + move |app: &mut Self| { + let new_id = window::Id::unique(); + app.popup.replace(new_id); + app.core.applet.get_popup_settings( + app.core.main_window_id().unwrap(), + new_id, + None, + None, + None, + ) + }, + None, + )); return Task::batch([ - get_popup(popup_settings), + get_popup_task, cosmic::task::future(set_tick(Duration::from_secs(3))) .map(|()| cosmic::Action::App(Message::Ignore)), ]); diff --git a/cosmic-applet-input-sources/src/lib.rs b/cosmic-applet-input-sources/src/lib.rs index 93e84283..0f448a94 100644 --- a/cosmic-applet-input-sources/src/lib.rs +++ b/cosmic-applet-input-sources/src/lib.rs @@ -142,19 +142,23 @@ impl cosmic::Application for Window { match message { Message::TogglePopup => { return if let Some(p) = self.popup.take() { - destroy_popup(p) + return crate::surface::surface_task(crate::surface::action::destroy_popup(p)); } else { - let new_id = Id::unique(); - self.popup.replace(new_id); - let popup_settings = self.core.applet.get_popup_settings( - self.core.main_window_id().unwrap(), - new_id, + return crate::surface::surface_task(crate::surface::action::app_popup( + |app: &mut Window| { + let new_id = Id::unique(); + app.popup.replace(new_id); + let popup_settings = app.core.applet.get_popup_settings( + app.core.main_window_id().unwrap(), + new_id, + None, + None, + None, + ); + popup_settings + }, None, - None, - None, - ); - - get_popup(popup_settings) + )); }; } Message::PopupClosed(id) => { diff --git a/cosmic-applet-minimize/src/lib.rs b/cosmic-applet-minimize/src/lib.rs index e40a7551..b4390cbb 100644 --- a/cosmic-applet-minimize/src/lib.rs +++ b/cosmic-applet-minimize/src/lib.rs @@ -248,40 +248,47 @@ impl cosmic::Application for Minimize { } Message::OpenOverflowPopup => { if let Some(id) = self.overflow_popup.take() { - return destroy_popup(id); + return cosmic::surface::surface_task(cosmic::surface::action::destroy_popup( + id, + )); } else { - let new_id = window::Id::unique(); - let pos = self.max_icon_count().unwrap_or_default(); + return cosmic::surface::surface_task(cosmic::surface::action::app_popup( + |app: &mut Self| { + let new_id = window::Id::unique(); + let pos = app.max_icon_count().unwrap_or_default(); - self.overflow_popup = Some(new_id); - let icon_size = self.core.applet.suggested_size(true).0 as u32 - + 2 * self.core.applet.suggested_padding(true).1 as u32; - let spacing = self.core.system_theme().cosmic().space_xxs() as u32; - let major_axis_len = (icon_size + spacing) * (pos.saturating_sub(1) as u32); - let rectangle = match self.core.applet.anchor { - PanelAnchor::Top | PanelAnchor::Bottom => iced::Rectangle { - x: major_axis_len as i32, - y: 0, - width: icon_size as i32, - height: icon_size as i32, + app.overflow_popup = Some(new_id); + let icon_size = app.core.applet.suggested_size(true).0 as u32 + + 2 * app.core.applet.suggested_padding(true).1 as u32; + let spacing = app.core.system_theme().cosmic().space_xxs() as u32; + let major_axis_len = + (icon_size + spacing) * (pos.saturating_sub(1) as u32); + let rectangle = match app.core.applet.anchor { + PanelAnchor::Top | PanelAnchor::Bottom => iced::Rectangle { + x: major_axis_len as i32, + y: 0, + width: icon_size as i32, + height: icon_size as i32, + }, + PanelAnchor::Left | PanelAnchor::Right => iced::Rectangle { + x: 0, + y: major_axis_len as i32, + width: icon_size as i32, + height: icon_size as i32, + }, + }; + let mut popup_settings = app.core.applet.get_popup_settings( + app.core.main_window_id().unwrap(), + new_id, + None, + None, + None, + ); + popup_settings.positioner.anchor_rect = rectangle; + popup_settings }, - PanelAnchor::Left | PanelAnchor::Right => iced::Rectangle { - x: 0, - y: major_axis_len as i32, - width: icon_size as i32, - height: icon_size as i32, - }, - }; - let mut popup_settings = self.core.applet.get_popup_settings( - self.core.main_window_id().unwrap(), - new_id, None, - None, - None, - ); - popup_settings.positioner.anchor_rect = rectangle; - - return get_popup(popup_settings); + )); } } Message::CloseOverflowPopup => todo!(), diff --git a/cosmic-applet-network/src/app.rs b/cosmic-applet-network/src/app.rs index 0b6dbe24..805cec41 100644 --- a/cosmic-applet-network/src/app.rs +++ b/cosmic-applet-network/src/app.rs @@ -741,22 +741,29 @@ impl cosmic::Application for CosmicNetworkApplet { ); tasks.push(secret_agent_task(my_id).map(Message::SecretAgent)); } - // TODO request update of state maybe - let new_id = window::Id::unique(); - self.popup.replace(new_id); - let popup_settings = self.core.applet.get_popup_settings( - self.core.main_window_id().unwrap(), - new_id, - None, - None, - None, - ); + tasks.push(system_conn().map(cosmic::Action::App)); - tasks.push(system_conn()); - tasks.push(get_popup(popup_settings)); + tasks.push(cosmic::surface::surface_task( + cosmic::surface::action::app_popup( + |app: &mut Self| { + let new_id = window::Id::unique(); + app.popup.replace(new_id); - return Task::batch(tasks).map(cosmic::Action::App); + let popup_settings = app.core.applet.get_popup_settings( + app.core.main_window_id().unwrap(), + new_id, + None, + None, + None, + ); + popup_settings + }, + None, + ), + )); + + return Task::batch(tasks); } } Message::ToggleAirplaneMode(enabled) => { diff --git a/cosmic-applet-notifications/src/lib.rs b/cosmic-applet-notifications/src/lib.rs index 438696b9..896b72c9 100644 --- a/cosmic-applet-notifications/src/lib.rs +++ b/cosmic-applet-notifications/src/lib.rs @@ -157,18 +157,22 @@ impl cosmic::Application for Notifications { if let Some(p) = self.popup.take() { return destroy_popup(p); } else { - let new_id = window::Id::unique(); - self.popup.replace(new_id); + return cosmic::surface::surface_task(cosmic::surface::action::app_popup( + |app: &mut Self| { + let new_id = window::Id::unique(); + app.popup.replace(new_id); - let popup_settings = self.core.applet.get_popup_settings( - self.core.main_window_id().unwrap(), - new_id, + let popup_settings = app.core.applet.get_popup_settings( + app.core.main_window_id().unwrap(), + new_id, + None, + None, + None, + ); + popup_settings + }, None, - None, - None, - ); - - return get_popup(popup_settings); + )); } } Message::DoNotDisturb(b) => { diff --git a/cosmic-applet-power/src/lib.rs b/cosmic-applet-power/src/lib.rs index 67725fbc..3ef10d71 100644 --- a/cosmic-applet-power/src/lib.rs +++ b/cosmic-applet-power/src/lib.rs @@ -120,20 +120,26 @@ impl cosmic::Application for Power { match message { Message::TogglePopup => { if let Some(p) = self.popup.take() { - return destroy_popup(p); + return cosmic::surface::surface_task(cosmic::surface::action::destroy_popup( + p, + )); } else { - let new_id = window::Id::unique(); - self.popup.replace(new_id); + return cosmic::surface::surface_task(cosmic::surface::action::app_popup( + |app: &mut Power| { + let new_id = window::Id::unique(); + app.popup.replace(new_id); - let popup_settings = self.core.applet.get_popup_settings( - self.core.main_window_id().unwrap(), - new_id, + let popup_settings = app.core.applet.get_popup_settings( + app.core.main_window_id().unwrap(), + new_id, + None, + None, + None, + ); + popup_settings + }, None, - None, - None, - ); - - return get_popup(popup_settings); + )); } } Message::OpenSettings => { diff --git a/cosmic-applet-status-area/src/components/app.rs b/cosmic-applet-status-area/src/components/app.rs index 1071d7ac..3c5272c5 100644 --- a/cosmic-applet-status-area/src/components/app.rs +++ b/cosmic-applet-status-area/src/components/app.rs @@ -237,38 +237,48 @@ impl cosmic::Application for App { if let Some(popup_id) = self.popup.take() { cmds.push(destroy_popup(popup_id)); } - let popup_id = self.next_popup_id(); - let i = self.menus.keys().position(|&i| i == id).unwrap(); - let (i, parent) = self - .overflow_index() - .and_then(|overflow_i| { - if overflow_i <= i { - Some(i - overflow_i).zip(self.overflow_popup) - } else { - Some((i, self.core.main_window_id().unwrap())) - } - }) - .unwrap_or((i, self.core.main_window_id().unwrap())); - let mut popup_settings = self - .core - .applet - .get_popup_settings(parent, popup_id, None, None, None); - self.popup = Some(popup_id); + let popup_task = + cosmic::surface::surface_task(cosmic::surface::action::app_popup( + move |app: &mut Self| { + let popup_id = app.next_popup_id(); + let i = app.menus.keys().position(|&i| i == id).unwrap(); + let (i, parent) = app + .overflow_index() + .and_then(|overflow_i| { + if overflow_i <= i { + Some(i - overflow_i).zip(app.overflow_popup) + } else { + Some((i, app.core.main_window_id().unwrap())) + } + }) + .unwrap_or((i, app.core.main_window_id().unwrap())); - if matches!( - self.core.applet.anchor, - PanelAnchor::Left | PanelAnchor::Right - ) { - let suggested_size = self.core.applet.suggested_size(false).1 - + 2 * self.core.applet.suggested_padding(false).1; - popup_settings.positioner.anchor_rect.y = i as i32 * suggested_size as i32; - } else { - let suggested_size = self.core.applet.suggested_size(false).0 - + 2 * self.core.applet.suggested_padding(false).1; - popup_settings.positioner.anchor_rect.x = i as i32 * suggested_size as i32; - } - cmds.push(get_popup(popup_settings)); + let mut popup_settings = app + .core + .applet + .get_popup_settings(parent, popup_id, None, None, None); + app.popup = Some(popup_id); + + if matches!( + app.core.applet.anchor, + PanelAnchor::Left | PanelAnchor::Right + ) { + let suggested_size = app.core.applet.suggested_size(false).1 + + 2 * app.core.applet.suggested_padding(false).1; + popup_settings.positioner.anchor_rect.y = + i as i32 * suggested_size as i32; + } else { + let suggested_size = app.core.applet.suggested_size(false).0 + + 2 * app.core.applet.suggested_padding(false).1; + popup_settings.positioner.anchor_rect.x = + i as i32 * suggested_size as i32; + } + popup_settings + }, + None, + )); + cmds.push(popup_task); return app::Task::batch(cmds); } else if let Some(popup_id) = self.popup { self.menus[&id].closed(); @@ -326,39 +336,48 @@ impl cosmic::Application for App { } else { return Task::none(); } - let popup_id = self.next_popup_id(); - let i = self.menus.keys().position(|&i| i == id).unwrap(); + let popup_task = cosmic::surface::surface_task(cosmic::surface::action::app_popup( + move |app: &mut Self| { + let popup_id = app.next_popup_id(); + let i = app.menus.keys().position(|&i| i == id).unwrap(); - let (i, parent) = self - .overflow_index() - .and_then(|overflow_i| { - if overflow_i <= i { - Some(i - overflow_i).zip(self.overflow_popup) + let (i, parent) = app + .overflow_index() + .and_then(|overflow_i| { + if overflow_i <= i { + Some(i - overflow_i).zip(app.overflow_popup) + } else { + Some((i, app.core.main_window_id().unwrap())) + } + }) + .unwrap_or((i, app.core.main_window_id().unwrap())); + + let mut popup_settings = app + .core + .applet + .get_popup_settings(parent, popup_id, None, None, None); + app.popup = Some(popup_id); + + if matches!( + app.core.applet.anchor, + PanelAnchor::Left | PanelAnchor::Right + ) { + let suggested_size = app.core.applet.suggested_size(true).1 + + 2 * app.core.applet.suggested_padding(true).1; + popup_settings.positioner.anchor_rect.y = + i as i32 * suggested_size as i32; } else { - Some((i, self.core.main_window_id().unwrap())) + let suggested_size = app.core.applet.suggested_size(true).0 + + 2 * app.core.applet.suggested_padding(true).0; + popup_settings.positioner.anchor_rect.x = + i as i32 * suggested_size as i32; } - }) - .unwrap_or((i, self.core.main_window_id().unwrap())); + popup_settings + }, + None, + )); + cmds.push(popup_task); - let mut popup_settings = self - .core - .applet - .get_popup_settings(parent, popup_id, None, None, None); - self.popup = Some(popup_id); - - if matches!( - self.core.applet.anchor, - PanelAnchor::Left | PanelAnchor::Right - ) { - let suggested_size = self.core.applet.suggested_size(true).1 - + 2 * self.core.applet.suggested_padding(true).1; - popup_settings.positioner.anchor_rect.y = i as i32 * suggested_size as i32; - } else { - let suggested_size = self.core.applet.suggested_size(true).0 - + 2 * self.core.applet.suggested_padding(true).0; - popup_settings.positioner.anchor_rect.x = i as i32 * suggested_size as i32; - } - cmds.push(get_popup(popup_settings)); Task::batch(cmds) } Msg::Surface(a) => { @@ -373,33 +392,40 @@ impl cosmic::Application for App { return destroy_popup(popup_id); } else if let Some(overflow_index) = self.overflow_index() { // If we don't have an overflow, create it - let popup_id = self.next_popup_id(); - let mut popup_settings = self.core.applet.get_popup_settings( - self.core.main_window_id().unwrap(), - popup_id, - None, - None, - None, - ); - popup_settings.close_with_children = false; + let popup_task = + cosmic::surface::surface_task(cosmic::surface::action::app_popup( + move |app: &mut Self| { + let popup_id = app.next_popup_id(); + let mut popup_settings = app.core.applet.get_popup_settings( + app.core.main_window_id().unwrap(), + popup_id, + None, + None, + None, + ); + popup_settings.close_with_children = false; - if matches!( - self.core.applet.anchor, - PanelAnchor::Left | PanelAnchor::Right - ) { - let suggested_size = self.core.applet.suggested_size(true).1 - + 2 * self.core.applet.suggested_padding(true).1; - popup_settings.positioner.anchor_rect.y = - overflow_index as i32 * suggested_size as i32; - } else { - let suggested_size = self.core.applet.suggested_size(true).0 - + 2 * self.core.applet.suggested_padding(true).0; - popup_settings.positioner.anchor_rect.x = - overflow_index as i32 * suggested_size as i32; - } + if matches!( + app.core.applet.anchor, + PanelAnchor::Left | PanelAnchor::Right + ) { + let suggested_size = app.core.applet.suggested_size(true).1 + + 2 * app.core.applet.suggested_padding(true).1; + popup_settings.positioner.anchor_rect.y = + overflow_index as i32 * suggested_size as i32; + } else { + let suggested_size = app.core.applet.suggested_size(true).0 + + 2 * app.core.applet.suggested_padding(true).0; + popup_settings.positioner.anchor_rect.x = + overflow_index as i32 * suggested_size as i32; + } - self.overflow_popup = Some(popup_id); - return get_popup(popup_settings); + app.overflow_popup = Some(popup_id); + popup_settings + }, + None, + )); + return popup_task; } else { return Task::none(); } @@ -417,34 +443,40 @@ impl cosmic::Application for App { } else { return Task::none(); } - - let popup_id = self.next_popup_id(); - let mut popup_settings = self.core.applet.get_popup_settings( - self.core.main_window_id().unwrap(), - popup_id, - None, - None, - None, - ); - self.popup = Some(popup_id); - let Some(i) = self.overflow_index() else { return Task::batch(cmds); }; + let popup_task = cosmic::surface::surface_task(cosmic::surface::action::app_popup( + move |app: &mut Self| { + let popup_id = app.next_popup_id(); + let mut popup_settings = app.core.applet.get_popup_settings( + app.core.main_window_id().unwrap(), + popup_id, + None, + None, + None, + ); + app.popup = Some(popup_id); - if matches!( - self.core.applet.anchor, - PanelAnchor::Left | PanelAnchor::Right - ) { - let suggested_size = self.core.applet.suggested_size(false).1 - + 2 * self.core.applet.suggested_padding(false).1; - popup_settings.positioner.anchor_rect.y = i as i32 * suggested_size as i32; - } else { - let suggested_size = self.core.applet.suggested_size(false).0 - + 2 * self.core.applet.suggested_padding(false).1; - popup_settings.positioner.anchor_rect.x = i as i32 * suggested_size as i32; - } - cmds.push(get_popup(popup_settings)); + if matches!( + app.core.applet.anchor, + PanelAnchor::Left | PanelAnchor::Right + ) { + let suggested_size = app.core.applet.suggested_size(false).1 + + 2 * app.core.applet.suggested_padding(false).1; + popup_settings.positioner.anchor_rect.y = + i as i32 * suggested_size as i32; + } else { + let suggested_size = app.core.applet.suggested_size(false).0 + + 2 * app.core.applet.suggested_padding(false).1; + popup_settings.positioner.anchor_rect.x = + i as i32 * suggested_size as i32; + } + popup_settings + }, + None, + )); + cmds.push(popup_task); Task::batch(cmds) } } @@ -595,7 +627,7 @@ fn menu_icon_button<'a>( .class(if symbolic { cosmic::theme::Svg::Custom(std::rc::Rc::new(|theme| { cosmic::iced::widget::svg::Style { - color: Some(theme.cosmic().background.on.into()), + color: Some(theme.cosmic().background(theme.transparent).on.into()), } })) } else { diff --git a/cosmic-applet-tiling/src/window.rs b/cosmic-applet-tiling/src/window.rs index 327d5d75..da6098f9 100644 --- a/cosmic-applet-tiling/src/window.rs +++ b/cosmic-applet-tiling/src/window.rs @@ -146,17 +146,21 @@ impl cosmic::Application for Window { return if let Some(p) = self.popup.take() { destroy_popup(p) } else { - let new_id = Id::unique(); - self.popup = Some(new_id); - let popup_settings = self.core.applet.get_popup_settings( - self.core.main_window_id().unwrap(), - new_id, - Some((1, 1)), + return cosmic::surface::surface_task(cosmic::surface::action::app_popup( + |app: &mut Self| { + let new_id = Id::unique(); + app.popup = Some(new_id); + let popup_settings = app.core.applet.get_popup_settings( + app.core.main_window_id().unwrap(), + new_id, + Some((1, 1)), + None, + None, + ); + popup_settings + }, None, - None, - ); - - get_popup(popup_settings) + )); }; } Message::PopupClosed(id) => { diff --git a/cosmic-applet-time/src/window.rs b/cosmic-applet-time/src/window.rs index a44d81ee..6a529b20 100644 --- a/cosmic-applet-time/src/window.rs +++ b/cosmic-applet-time/src/window.rs @@ -520,35 +520,39 @@ impl cosmic::Application for Window { if let Some(p) = self.popup.take() { destroy_popup(p) } else { - self.date_today = self.now.date(); - self.date_selected = self.date_today; + return cosmic::surface::surface_task(cosmic::surface::action::app_popup( + |app: &mut Self| { + app.date_today = app.now.date(); + app.date_selected = app.date_today; - let new_id = window::Id::unique(); - self.popup = Some(new_id); + let new_id = window::Id::unique(); + app.popup = Some(new_id); - let mut popup_settings = self.core.applet.get_popup_settings( - self.core.main_window_id().unwrap(), - new_id, + let mut popup_settings = app.core.applet.get_popup_settings( + app.core.main_window_id().unwrap(), + new_id, + None, + None, + None, + ); + let Rectangle { + x, + y, + width, + height, + } = app.rectangle; + popup_settings.positioner.anchor_rect = Rectangle:: { + x: x.max(1.) as i32, + y: y.max(1.) as i32, + width: width.max(1.) as i32, + height: height.max(1.) as i32, + }; + + popup_settings.positioner.size = None; + popup_settings + }, None, - None, - None, - ); - let Rectangle { - x, - y, - width, - height, - } = self.rectangle; - popup_settings.positioner.anchor_rect = Rectangle:: { - x: x.max(1.) as i32, - y: y.max(1.) as i32, - width: width.max(1.) as i32, - height: height.max(1.) as i32, - }; - - popup_settings.positioner.size = None; - - get_popup(popup_settings) + )); } } Message::Tick => { diff --git a/cosmic-applet-workspaces/src/components/app.rs b/cosmic-applet-workspaces/src/components/app.rs index dc4ccdc4..62680f77 100644 --- a/cosmic-applet-workspaces/src/components/app.rs +++ b/cosmic-applet-workspaces/src/components/app.rs @@ -202,24 +202,20 @@ impl cosmic::Application for IcedWorkspacesApplet { let content = column!(content, space::horizontal().width(Length::Fixed(width))) .align_x(Alignment::Center); - let btn = button( - container(content) - .align_x(Alignment::Center) - .align_y(Alignment::Center), - ) - .padding(if horizontal { - [0, self.core.applet.suggested_padding(true).1] - } else { - [self.core.applet.suggested_padding(true).1, 0] - }) - .on_press( - if w.state.contains(ext_workspace_handle_v1::State::Active) { - Message::WorkspaceOverview + let btn = button(content) + .padding(if horizontal { + [0, self.core.applet.suggested_padding(true).1] } else { - Message::WorkspacePressed(w.handle.clone()) - }, - ) - .padding(0); + [self.core.applet.suggested_padding(true).1, 0] + }) + .on_press( + if w.state.contains(ext_workspace_handle_v1::State::Active) { + Message::WorkspaceOverview + } else { + Message::WorkspacePressed(w.handle.clone()) + }, + ) + .padding(0); btn.class( if w.state.contains(ext_workspace_handle_v1::State::Active) { diff --git a/cosmic-panel-button/src/lib.rs b/cosmic-panel-button/src/lib.rs index 45ee1ca2..fe411f82 100644 --- a/cosmic-panel-button/src/lib.rs +++ b/cosmic-panel-button/src/lib.rs @@ -66,7 +66,7 @@ impl Button { .class(if symbolic { cosmic::theme::Svg::Custom(std::rc::Rc::new(|theme| { cosmic::iced::widget::svg::Style { - color: Some(theme.cosmic().background.on.into()), + color: Some(theme.cosmic().background(theme.transparent).on.into()), } })) } else {