wip: blur

This commit is contained in:
Ashley Wulber 2026-04-29 11:54:20 -04:00
parent 0441c67b10
commit 405fddda2d
18 changed files with 706 additions and 495 deletions

143
Cargo.lock generated
View file

@ -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"

View file

@ -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" }

View file

@ -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::<i32> {
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::<i32> {
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::<i32> {
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::<i32> {
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::<i32> {
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::<i32> {
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::<i32> {
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::<i32> {
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()),

View file

@ -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) => {

View file

@ -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);
));
}
}

View file

@ -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"

View file

@ -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);

View file

@ -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)),
]);

View file

@ -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) => {

View file

@ -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!(),

View file

@ -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) => {

View file

@ -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) => {

View file

@ -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 => {

View file

@ -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 {

View file

@ -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) => {

View file

@ -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::<i32> {
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::<i32> {
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 => {

View file

@ -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) {

View file

@ -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 {