From 4ad6b55aea08a4232776542b960022f6489c587f Mon Sep 17 00:00:00 2001 From: Frederic Laing Date: Mon, 12 Oct 2026 21:32:35 +0200 Subject: [PATCH 1/2] chore: update libcosmic --- Cargo.lock | 56 +++++++++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 08f54d35..72047efb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -657,7 +657,7 @@ dependencies = [ [[package]] name = "build_helpers" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic#5a8bd9482a35ae94c1e54edf77b331c6b970f170" +source = "git+https://github.com/pop-os/libcosmic#a6ac45c7cd3645df3b4e25c4e0636e66e9d662fa" dependencies = [ "cfg_aliases", ] @@ -1321,7 +1321,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic#5a8bd9482a35ae94c1e54edf77b331c6b970f170" +source = "git+https://github.com/pop-os/libcosmic#a6ac45c7cd3645df3b4e25c4e0636e66e9d662fa" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1342,7 +1342,7 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic#5a8bd9482a35ae94c1e54edf77b331c6b970f170" +source = "git+https://github.com/pop-os/libcosmic#a6ac45c7cd3645df3b4e25c4e0636e66e9d662fa" dependencies = [ "quote", "syn 2.0.119", @@ -1417,8 +1417,8 @@ dependencies = [ [[package]] name = "cosmic-panel-config" -version = "1.9.0" -source = "git+https://github.com/pop-os/cosmic-panel#f4ba4efb89bf070df91efe291272788e6d009da7" +version = "1.10.0" +source = "git+https://github.com/pop-os/cosmic-panel#3ce6ce1cec97669f91e809962d9446aaefe8a06e" dependencies = [ "anyhow", "cosmic-config", @@ -1472,8 +1472,8 @@ dependencies = [ [[package]] name = "cosmic-settings-audio-client" -version = "1.9.0" -source = "git+https://github.com/pop-os/cosmic-settings-daemon#30aecb52621a1e0b8dc1cf5ccaf0555736d6bec4" +version = "1.10.0" +source = "git+https://github.com/pop-os/cosmic-settings-daemon#9e4ae69fc175191f15789d35423806ea0f093c9d" dependencies = [ "cosmic-settings-audio-core", "dirs", @@ -1488,8 +1488,8 @@ dependencies = [ [[package]] name = "cosmic-settings-audio-core" -version = "1.9.0" -source = "git+https://github.com/pop-os/cosmic-settings-daemon#30aecb52621a1e0b8dc1cf5ccaf0555736d6bec4" +version = "1.10.0" +source = "git+https://github.com/pop-os/cosmic-settings-daemon#9e4ae69fc175191f15789d35423806ea0f093c9d" dependencies = [ "dirs", "ron 0.12.2", @@ -1499,8 +1499,8 @@ dependencies = [ [[package]] name = "cosmic-settings-config" -version = "1.9.0" -source = "git+https://github.com/pop-os/cosmic-settings-daemon#30aecb52621a1e0b8dc1cf5ccaf0555736d6bec4" +version = "1.10.0" +source = "git+https://github.com/pop-os/cosmic-settings-daemon#9e4ae69fc175191f15789d35423806ea0f093c9d" dependencies = [ "cosmic-config", "ron 0.11.0", @@ -1572,7 +1572,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic#5a8bd9482a35ae94c1e54edf77b331c6b970f170" +source = "git+https://github.com/pop-os/libcosmic#a6ac45c7cd3645df3b4e25c4e0636e66e9d662fa" dependencies = [ "almost", "configparser", @@ -2909,7 +2909,7 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic#5a8bd9482a35ae94c1e54edf77b331c6b970f170" +source = "git+https://github.com/pop-os/libcosmic#a6ac45c7cd3645df3b4e25c4e0636e66e9d662fa" dependencies = [ "build_helpers", "dnd", @@ -2931,7 +2931,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#5a8bd9482a35ae94c1e54edf77b331c6b970f170" +source = "git+https://github.com/pop-os/libcosmic#a6ac45c7cd3645df3b4e25c4e0636e66e9d662fa" dependencies = [ "accesskit", "accesskit_winit", @@ -2940,7 +2940,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic#5a8bd9482a35ae94c1e54edf77b331c6b970f170" +source = "git+https://github.com/pop-os/libcosmic#a6ac45c7cd3645df3b4e25c4e0636e66e9d662fa" dependencies = [ "bitflags 2.13.2", "build_helpers", @@ -2966,7 +2966,7 @@ dependencies = [ [[package]] name = "iced_debug" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic#5a8bd9482a35ae94c1e54edf77b331c6b970f170" +source = "git+https://github.com/pop-os/libcosmic#a6ac45c7cd3645df3b4e25c4e0636e66e9d662fa" dependencies = [ "iced_core", "iced_futures", @@ -2976,7 +2976,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic#5a8bd9482a35ae94c1e54edf77b331c6b970f170" +source = "git+https://github.com/pop-os/libcosmic#a6ac45c7cd3645df3b4e25c4e0636e66e9d662fa" dependencies = [ "futures", "iced_core", @@ -2990,7 +2990,7 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic#5a8bd9482a35ae94c1e54edf77b331c6b970f170" +source = "git+https://github.com/pop-os/libcosmic#a6ac45c7cd3645df3b4e25c4e0636e66e9d662fa" dependencies = [ "bitflags 2.13.2", "bytemuck", @@ -3011,7 +3011,7 @@ dependencies = [ [[package]] name = "iced_program" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic#5a8bd9482a35ae94c1e54edf77b331c6b970f170" +source = "git+https://github.com/pop-os/libcosmic#a6ac45c7cd3645df3b4e25c4e0636e66e9d662fa" dependencies = [ "iced_graphics", "iced_runtime", @@ -3020,7 +3020,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic#5a8bd9482a35ae94c1e54edf77b331c6b970f170" +source = "git+https://github.com/pop-os/libcosmic#a6ac45c7cd3645df3b4e25c4e0636e66e9d662fa" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -3032,7 +3032,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic#5a8bd9482a35ae94c1e54edf77b331c6b970f170" +source = "git+https://github.com/pop-os/libcosmic#a6ac45c7cd3645df3b4e25c4e0636e66e9d662fa" dependencies = [ "build_helpers", "bytes", @@ -3048,7 +3048,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic#5a8bd9482a35ae94c1e54edf77b331c6b970f170" +source = "git+https://github.com/pop-os/libcosmic#a6ac45c7cd3645df3b4e25c4e0636e66e9d662fa" dependencies = [ "bytemuck", "cosmic-text", @@ -3065,7 +3065,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic#5a8bd9482a35ae94c1e54edf77b331c6b970f170" +source = "git+https://github.com/pop-os/libcosmic#a6ac45c7cd3645df3b4e25c4e0636e66e9d662fa" dependencies = [ "as-raw-xcb-connection", "bitflags 2.13.2", @@ -3097,7 +3097,7 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.14.2" -source = "git+https://github.com/pop-os/libcosmic#5a8bd9482a35ae94c1e54edf77b331c6b970f170" +source = "git+https://github.com/pop-os/libcosmic#a6ac45c7cd3645df3b4e25c4e0636e66e9d662fa" dependencies = [ "build_helpers", "cosmic-client-toolkit", @@ -3116,7 +3116,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic#5a8bd9482a35ae94c1e54edf77b331c6b970f170" +source = "git+https://github.com/pop-os/libcosmic#a6ac45c7cd3645df3b4e25c4e0636e66e9d662fa" dependencies = [ "build_helpers", "cosmic-client-toolkit", @@ -3979,7 +3979,7 @@ checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" [[package]] name = "libcosmic" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic#5a8bd9482a35ae94c1e54edf77b331c6b970f170" +source = "git+https://github.com/pop-os/libcosmic#a6ac45c7cd3645df3b4e25c4e0636e66e9d662fa" dependencies = [ "apply", "ashpd 0.12.3", @@ -7980,8 +7980,8 @@ checksum = "2fb433233f2df9344722454bc7e96465c9d03bff9d77c248f9e7523fe79585b5" [[package]] name = "xdg-shell-wrapper-config" -version = "1.9.0" -source = "git+https://github.com/pop-os/cosmic-panel#f4ba4efb89bf070df91efe291272788e6d009da7" +version = "1.10.0" +source = "git+https://github.com/pop-os/cosmic-panel#3ce6ce1cec97669f91e809962d9446aaefe8a06e" dependencies = [ "serde", "wayland-protocols-wlr", From b8994f35a31033bee9a0a2a101aa272a364e64fa Mon Sep 17 00:00:00 2001 From: Frederic Laing Date: Mon, 12 Oct 2026 21:41:27 +0200 Subject: [PATCH 2/2] fix: retain the default discrete GPU --- cosmic-app-list/src/app.rs | 88 +++++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 35 deletions(-) diff --git a/cosmic-app-list/src/app.rs b/cosmic-app-list/src/app.rs index 3e5a3a6d..ec26a8f4 100755 --- a/cosmic-app-list/src/app.rs +++ b/cosmic-app-list/src/app.rs @@ -26,7 +26,10 @@ use cosmic::{ cosmic_panel_config::{PanelAnchor, PanelSize}, }, cosmic_config::{Config, CosmicConfigEntry}, - desktop::IconSourceExt, + desktop::{ + IconSourceExt, + gpu::{Descriptor, Preference}, + }, iced::{ self, Alignment, Background, Border, Length, Limits, Padding, Subscription, advanced::text::{Ellipsize, EllipsizeHeightLimit}, @@ -62,7 +65,6 @@ use cosmic_protocols::toplevel_info::v1::client::zcosmic_toplevel_handle_v1::Sta use futures::future::pending; use rustc_hash::FxHashMap; use std::{borrow::Cow, path::PathBuf, rc::Rc, str::FromStr, time::Duration}; -use switcheroo_control::Gpu; use tokio::time::sleep; use url::Url; @@ -185,7 +187,7 @@ impl DockItem { rectangle_tracker: Option<&RectangleTracker>, interaction_enabled: bool, dnd_source_enabled: bool, - gpus: Option<&[Gpu]>, + gpus: Option<&[Descriptor]>, is_focused: bool, dot_border_radius: [f32; 4], window_id: window::Id, @@ -372,7 +374,7 @@ struct CosmicAppList { rectangles: FxHashMap, dnd_offer: Option, is_listening_for_dnd: bool, - gpus: Option>, + gpus: Option>, active_workspaces: Vec, output_list: FxHashMap, locales: Vec, @@ -396,7 +398,7 @@ enum Message { Pressed(window::Id), ToplevelListPopup(u32, window::Id), ToplevelHoverChanged(ExtForeignToplevelHandleV1, bool), - GpuRequest(Option>), + GpuRequest(Option>), CloseRequested(window::Id), ClosePopup, Activate(ExtForeignToplevelHandleV1), @@ -461,7 +463,7 @@ fn index_in_list( } } -async fn try_get_gpus() -> Option> { +async fn try_get_gpus() -> Option> { let connection = zbus::Connection::system().await.ok()?; let proxy = switcheroo_control::SwitcherooControlProxy::new(&connection) .await @@ -476,7 +478,16 @@ async fn try_get_gpus() -> Option> { return None; } - Some(gpus) + Some( + gpus.into_iter() + .map(|gpu| Descriptor { + name: gpu.name, + environment: gpu.environment, + default: gpu.default, + discrete: gpu.discrete, + }) + .collect(), + ) } const TOPLEVEL_BUTTON_WIDTH: f32 = 192.0; @@ -1495,12 +1506,14 @@ impl cosmic::Application for CosmicAppList { envs.push(("XDG_ACTIVATION_TOKEN".to_string(), token.clone())); envs.push(("DESKTOP_STARTUP_ID".to_string(), token)); } - if let (Some(gpus), Some(idx)) = (self.gpus.as_ref(), gpu_idx) { + if let Some(gpu) = self + .gpus + .as_deref() + .zip(gpu_idx) + .and_then(|(gpus, idx)| gpus.get(idx)) + { envs.extend( - gpus[idx] - .environment - .iter() - .map(|(k, v)| (k.clone(), v.clone())), + gpu.environment.iter().map(|(k, v)| (k.clone(), v.clone())), ); } tokio::spawn(async move { @@ -2134,16 +2147,16 @@ impl cosmic::Application for CosmicAppList { if !toplevels.is_empty() { content = content.push(menu_button(text::body(fl!("new-window"))).on_press( - Message::Exec(exec.to_string(), None, desktop_info.terminal()), + launch_exec(desktop_info, exec, self.gpus.as_deref()), )); } else if let Some(gpus) = self.gpus.as_ref() { - let default_idx = preferred_gpu_idx(desktop_info, gpus.iter()); + let default_idx = gpu_preference(desktop_info).preferred(gpus); for (i, gpu) in gpus.iter().enumerate() { content = content.push( menu_button(text::body(format!( "{} {}", fl!("run-on", gpu = gpu.name.clone()), - if i == default_idx { + if Some(i) == default_idx { fl!("run-on-default") } else { String::new() @@ -2157,9 +2170,10 @@ impl cosmic::Application for CosmicAppList { ); } } else { - content = content.push(menu_button(text::body(fl!("run"))).on_press( - Message::Exec(exec.to_string(), None, desktop_info.terminal()), - )); + content = + content.push(menu_button(text::body(fl!("run"))).on_press( + launch_exec(desktop_info, exec, self.gpus.as_deref()), + )); } for action in desktop_info.actions().into_iter().flatten() { if action == "new-window" { @@ -2174,9 +2188,12 @@ impl cosmic::Application for CosmicAppList { else { continue; }; - content = content.push(menu_button(text::body(name)).on_press( - Message::Exec(exec.into(), None, desktop_info.terminal()), - )); + content = + content.push(menu_button(text::body(name)).on_press(launch_exec( + desktop_info, + exec, + self.gpus.as_deref(), + ))); } content = content.push(divider::horizontal::light()); } @@ -2538,24 +2555,25 @@ impl cosmic::Application for CosmicAppList { } } -fn launch_on_preferred_gpu(desktop_info: &DesktopEntry, gpus: Option<&[Gpu]>) -> Option { +fn launch_on_preferred_gpu( + desktop_info: &DesktopEntry, + gpus: Option<&[Descriptor]>, +) -> Option { let exec = desktop_info.exec()?; + Some(launch_exec(desktop_info, exec, gpus)) +} - let gpu_idx = gpus.map(|gpus| preferred_gpu_idx(desktop_info, gpus.iter())); - - Some(Message::Exec( - exec.to_string(), - gpu_idx, - desktop_info.terminal(), - )) +fn launch_exec(desktop_info: &DesktopEntry, exec: &str, gpus: Option<&[Descriptor]>) -> Message { + let gpu_idx = gpus.and_then(|gpus| gpu_preference(desktop_info).select(gpus)); + Message::Exec(exec.to_string(), gpu_idx, desktop_info.terminal()) } -fn preferred_gpu_idx<'a, I>(desktop_info: &DesktopEntry, mut gpus: I) -> usize -where - I: Iterator, -{ - gpus.position(|gpu| gpu.default ^ desktop_info.prefers_non_default_gpu()) - .unwrap_or(0) +fn gpu_preference(desktop_info: &DesktopEntry) -> Preference { + if desktop_info.prefers_non_default_gpu() { + Preference::NonDefault + } else { + Preference::Default + } } #[derive(Debug, Default, Clone)]