From ee542bd0462feca65ffb89cfe8a318db756e50e7 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Mon, 14 Nov 2022 23:51:38 +0100 Subject: [PATCH] refactor: simplify application trait --- examples/cosmic-applet-graphics/Cargo.toml | 13 - .../com.system76.CosmicAppletGraphics.desktop | 12 - .../com.system76.CosmicAppletGraphics.svg | 60 ---- .../data/resources/resources.gresource.xml | 6 - examples/cosmic-applet-graphics/src/dbus.rs | 93 ------ .../cosmic-applet-graphics/src/graphics.rs | 32 --- examples/cosmic-applet-graphics/src/main.rs | 37 --- examples/cosmic-applet-graphics/src/window.rs | 270 ------------------ examples/cosmic-sctk/Cargo.toml | 1 + examples/cosmic-sctk/src/window.rs | 29 +- 10 files changed, 9 insertions(+), 544 deletions(-) delete mode 100644 examples/cosmic-applet-graphics/Cargo.toml delete mode 100644 examples/cosmic-applet-graphics/data/com.system76.CosmicAppletGraphics.desktop delete mode 100644 examples/cosmic-applet-graphics/data/icons/com.system76.CosmicAppletGraphics.svg delete mode 100644 examples/cosmic-applet-graphics/data/resources/resources.gresource.xml delete mode 100644 examples/cosmic-applet-graphics/src/dbus.rs delete mode 100644 examples/cosmic-applet-graphics/src/graphics.rs delete mode 100644 examples/cosmic-applet-graphics/src/main.rs delete mode 100644 examples/cosmic-applet-graphics/src/window.rs diff --git a/examples/cosmic-applet-graphics/Cargo.toml b/examples/cosmic-applet-graphics/Cargo.toml deleted file mode 100644 index d712985..0000000 --- a/examples/cosmic-applet-graphics/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "cosmic-applet-graphics" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -zbus = "3.4" -libcosmic = { path = "../..", default-features = false, features = ["debug", "wayland", "applet"] } -cosmic-panel-config = {git = "https://github.com/pop-os/cosmic-panel", default-features = false } -iced_sctk = { git = "https://github.com/pop-os/iced-sctk" } -sctk = { package = "smithay-client-toolkit", git = "https://github.com/Smithay/client-toolkit" } diff --git a/examples/cosmic-applet-graphics/data/com.system76.CosmicAppletGraphics.desktop b/examples/cosmic-applet-graphics/data/com.system76.CosmicAppletGraphics.desktop deleted file mode 100644 index b0ac1b8..0000000 --- a/examples/cosmic-applet-graphics/data/com.system76.CosmicAppletGraphics.desktop +++ /dev/null @@ -1,12 +0,0 @@ -[Desktop Entry] -Name=Cosmic Applet Graphics -Comment=Write a GTK + Rust application -Type=Application -Exec=cosmic-applet-graphics -Terminal=false -Categories=GNOME;GTK; -Keywords=Gnome;GTK; -# Translators: Do NOT translate or transliterate this text (this is an icon file name)! -Icon=com.system76.CosmicAppletGraphics.svg -StartupNotify=true -NoDisplay=true diff --git a/examples/cosmic-applet-graphics/data/icons/com.system76.CosmicAppletGraphics.svg b/examples/cosmic-applet-graphics/data/icons/com.system76.CosmicAppletGraphics.svg deleted file mode 100644 index c2bd5b1..0000000 --- a/examples/cosmic-applet-graphics/data/icons/com.system76.CosmicAppletGraphics.svg +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/cosmic-applet-graphics/data/resources/resources.gresource.xml b/examples/cosmic-applet-graphics/data/resources/resources.gresource.xml deleted file mode 100644 index 2cf0970..0000000 --- a/examples/cosmic-applet-graphics/data/resources/resources.gresource.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/examples/cosmic-applet-graphics/src/dbus.rs b/examples/cosmic-applet-graphics/src/dbus.rs deleted file mode 100644 index 2ec4aa7..0000000 --- a/examples/cosmic-applet-graphics/src/dbus.rs +++ /dev/null @@ -1,93 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -//! # DBus interface proxy for: `com.system76.PowerDaemon` -//! -//! This code was generated by `zbus-xmlgen` `3.0.0` from DBus introspection data. -//! Source: `Interface '/com/system76/PowerDaemon' from service 'com.system76.PowerDaemon' on system bus`. -//! -//! You may prefer to adapt it, instead of using it verbatim. -//! -//! More information can be found in the -//! [Writing a client proxy](https://dbus.pages.freedesktop.org/zbus/client.html) -//! section of the zbus documentation. -//! -//! This DBus object implements -//! [standard DBus interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html), -//! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used: -//! -//! * [`zbus::fdo::IntrospectableProxy`] -//! -//! …consequently `zbus-xmlgen` did not generate code for the above interfaces. - -use zbus::{dbus_proxy, Connection}; - -#[dbus_proxy( - interface = "com.system76.PowerDaemon", - default_path = "/com/system76/PowerDaemon" -)] -trait PowerDaemon { - /// Balanced method - fn balanced(&self) -> zbus::Result<()>; - - /// Battery method - fn battery(&self) -> zbus::Result<()>; - - /// GetChargeProfiles method - fn get_charge_profiles( - &self, - ) -> zbus::Result>>; - - /// GetChargeThresholds method - fn get_charge_thresholds(&self) -> zbus::Result<(u8, u8)>; - - /// GetDefaultGraphics method - fn get_default_graphics(&self) -> zbus::Result; - - /// GetExternalDisplaysRequireDGPU method - fn get_external_displays_require_dgpu(&self) -> zbus::Result; - - /// GetGraphics method - fn get_graphics(&self) -> zbus::Result; - - /// GetGraphicsPower method - fn get_graphics_power(&self) -> zbus::Result; - - /// GetProfile method - fn get_profile(&self) -> zbus::Result; - - /// GetSwitchable method - fn get_switchable(&self) -> zbus::Result; - - /// Performance method - fn performance(&self) -> zbus::Result<()>; - - /// SetChargeThresholds method - fn set_charge_thresholds(&self, thresholds: &(u8, u8)) -> zbus::Result<()>; - - /// SetGraphics method - fn set_graphics(&self, vendor: &str) -> zbus::Result<()>; - - /// SetGraphicsPower method - fn set_graphics_power(&self, power: bool) -> zbus::Result<()>; - - /// HotPlugDetect signal - #[dbus_proxy(signal)] - fn hot_plug_detect(&self, port: u64) -> zbus::Result<()>; - - /// PowerProfileSwitch signal - #[dbus_proxy(signal)] - fn power_profile_switch(&self, profile: &str) -> zbus::Result<()>; -} - -pub async fn init() -> Option<(Connection, PowerDaemonProxy<'static>)> { - let conn = match Connection::system().await { - Ok(conn) => conn, - _ => return None, - }; - - let proxy = match PowerDaemonProxy::new(&conn).await { - Ok(p) => p, - _ => return None, - }; - - Some((conn, proxy)) -} diff --git a/examples/cosmic-applet-graphics/src/graphics.rs b/examples/cosmic-applet-graphics/src/graphics.rs deleted file mode 100644 index 8f40933..0000000 --- a/examples/cosmic-applet-graphics/src/graphics.rs +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -use crate::dbus::PowerDaemonProxy; -use zbus::Result; - -#[derive(PartialEq, Eq, Copy, Clone, Debug)] -pub enum Graphics { - Integrated, - Hybrid, - Nvidia, - Compute, -} - -pub async fn get_current_graphics(daemon: PowerDaemonProxy<'_>) -> Result { - let graphics = daemon.get_graphics().await?; - match graphics.as_str() { - "integrated" => Ok(Graphics::Integrated), - "hybrid" => Ok(Graphics::Hybrid), - "nvidia" => Ok(Graphics::Nvidia), - "compute" => Ok(Graphics::Compute), - _ => panic!("Unknown graphics profile: {}", graphics), - } -} - -pub async fn set_graphics(daemon: PowerDaemonProxy<'_>, graphics: Graphics) -> Result<()> { - let graphics_str = match graphics { - Graphics::Integrated => "integrated", - Graphics::Hybrid => "hybrid", - Graphics::Nvidia => "nvidia", - Graphics::Compute => "compute", - }; - daemon.set_graphics(graphics_str).await -} diff --git a/examples/cosmic-applet-graphics/src/main.rs b/examples/cosmic-applet-graphics/src/main.rs deleted file mode 100644 index 192a501..0000000 --- a/examples/cosmic-applet-graphics/src/main.rs +++ /dev/null @@ -1,37 +0,0 @@ -mod dbus; -mod graphics; -mod window; - -use cosmic::{ - iced::{sctk_settings::InitialSurface, Application}, - iced_native::command::platform_specific::wayland::window::SctkWindowSettings, - iced_native::window::Settings, - settings, -}; -use cosmic_panel_config::PanelSize; -use window::*; - -pub fn main() -> cosmic::iced::Result { - let mut settings = settings(); - let pixels = std::env::var("COSMIC_PANEL_SIZE") - .ok() - .and_then(|size| match size.parse::() { - Ok(PanelSize::XL) => Some(64), - Ok(PanelSize::L) => Some(48), - Ok(PanelSize::M) => Some(36), - Ok(PanelSize::S) => Some(24), - Ok(PanelSize::XS) => Some(18), - Err(_) => Some(36), - }) - .unwrap_or(36); - settings.initial_surface = InitialSurface::XdgWindow(SctkWindowSettings { - iced_settings: Settings { - size: (pixels + 32, pixels + 16), - min_size: Some((pixels + 32, pixels + 16)), - max_size: Some((pixels + 32, pixels + 16)), - ..Default::default() - }, - ..Default::default() - }); - Window::run(settings) -} diff --git a/examples/cosmic-applet-graphics/src/window.rs b/examples/cosmic-applet-graphics/src/window.rs deleted file mode 100644 index 7ba0565..0000000 --- a/examples/cosmic-applet-graphics/src/window.rs +++ /dev/null @@ -1,270 +0,0 @@ -use crate::dbus::{self, PowerDaemonProxy}; -use crate::graphics::{get_current_graphics, set_graphics, Graphics}; -use cosmic::applet::{get_popup_settings, icon_button, popup_container}; -use cosmic::iced_style::application::{self, Appearance}; -use cosmic::separator; -use cosmic::theme::Container; -use cosmic::widget::widget::container; -use cosmic::{ - iced::widget::{column, radio, text}, - iced::{self, Application, Command, Length}, - iced_native::window, - theme::{self, Theme}, - Element, -}; -use cosmic_panel_config::{PanelAnchor, PanelSize}; -use iced_sctk::alignment::{Horizontal, Vertical}; -use iced_sctk::commands::popup::{destroy_popup, get_popup}; -use iced_sctk::Color; -use zbus::Connection; - -#[derive(Clone, Copy)] -enum State { - SelectGraphicsMode(bool), - SettingGraphicsMode(Graphics), -} - -impl Default for State { - fn default() -> Self { - Self::SelectGraphicsMode(false) - } -} - -#[derive(Default)] -pub struct Window { - popup: Option, - graphics_mode: Option, - id_ctr: u32, - icon_size: u16, - anchor: PanelAnchor, - theme: Theme, - dbus: Option<(Connection, PowerDaemonProxy<'static>)>, - state: State, -} - -#[allow(dead_code)] -#[derive(Clone, Debug)] -pub enum Message { - CurrentGraphics(Option), - AppliedGraphicsMode(Option), - DBusInit(Option<(Connection, PowerDaemonProxy<'static>)>), - SelectGraphicsMode(Graphics), - TogglePopup, -} - -impl Application for Window { - type Executor = iced::executor::Default; - type Flags = (); - type Message = Message; - type Theme = Theme; - - fn new(_flags: ()) -> (Self, Command) { - let mut window = Window::default(); - let pixels = std::env::var("COSMIC_PANEL_SIZE") - .ok() - .and_then(|size| match size.parse::() { - Ok(PanelSize::XL) => Some(64), - Ok(PanelSize::L) => Some(36), - Ok(PanelSize::M) => Some(24), - Ok(PanelSize::S) => Some(16), - Ok(PanelSize::XS) => Some(12), - Err(_) => Some(12), - }) - .unwrap_or(16); - window.icon_size = pixels; - window.anchor = std::env::var("COSMIC_PANEL_ANCHOR") - .ok() - .map(|size| match size.parse::() { - Ok(p) => p, - Err(_) => PanelAnchor::Top, - }) - .unwrap_or(PanelAnchor::Top); - ( - window, - Command::perform(dbus::init(), |dbus_init| Message::DBusInit(dbus_init)), - ) - } - - fn title(&self) -> String { - String::from("Cosmic Graphics Applet") - } - - fn update(&mut self, message: Message) -> iced::Command { - match message { - Message::SelectGraphicsMode(new_graphics_mode) => { - if let Some((_, proxy)) = self.dbus.as_ref() { - self.state = State::SettingGraphicsMode(new_graphics_mode); - return Command::perform( - set_graphics(proxy.clone(), new_graphics_mode), - move |success| { - Message::AppliedGraphicsMode(success.ok().map(|_| new_graphics_mode)) - }, - ); - } - } - Message::AppliedGraphicsMode(g) => { - if let Some(g) = g { - self.graphics_mode.replace(g); - self.state = State::SelectGraphicsMode(true); - } - } - Message::TogglePopup => { - if let Some(p) = self.popup.take() { - return destroy_popup(p); - } else { - self.id_ctr += 1; - let new_id = window::Id::new(self.id_ctr); - self.popup.replace(new_id); - let mut commands = Vec::new(); - if let Some((_, proxy)) = self.dbus.as_ref() { - commands.push(Command::perform( - get_current_graphics(proxy.clone()), - |cur_graphics| Message::CurrentGraphics(cur_graphics.ok()), - )); - } - let mut popup_settings = - get_popup_settings(window::Id::new(0), new_id, None, None); - popup_settings.positioner.size = (200, 240); - commands.push(get_popup(popup_settings)); - return Command::batch(commands); - } - } - Message::DBusInit(dbus) => { - self.dbus = dbus; - return Command::perform( - get_current_graphics(self.dbus.as_ref().unwrap().1.clone()), - |cur_graphics| { - Message::CurrentGraphics(match cur_graphics { - Ok(g) => Some(g), - Err(err) => { - dbg!(err); - None - } - }) - }, - ); - } - Message::CurrentGraphics(g) => { - if let Some(g) = g { - self.graphics_mode.replace(g); - } - } - } - Command::none() - } - - fn view_popup(&self, _: window::Id) -> Element { - let content = match self.state { - State::SelectGraphicsMode(pending_restart) => { - let mut content_list = vec![ - radio( - "Integrated Graphics", - Graphics::Integrated, - self.graphics_mode, - |g| Message::SelectGraphicsMode(g), - ) - .into(), - radio( - "Nvidia Graphics", - Graphics::Nvidia, - self.graphics_mode, - |g| Message::SelectGraphicsMode(g), - ) - .into(), - radio( - "Hybrid Graphics", - Graphics::Hybrid, - self.graphics_mode, - |g| Message::SelectGraphicsMode(g), - ) - .into(), - radio( - "Compute Graphics", - Graphics::Compute, - self.graphics_mode, - |g| Message::SelectGraphicsMode(g), - ) - .into(), - ]; - if pending_restart { - content_list.insert( - 0, - text("Restart to apply changes") - .width(Length::Fill) - .horizontal_alignment(Horizontal::Center) - .size(16) - .into(), - ) - } - column(content_list).padding([8, 0]).spacing(8).into() - } - State::SettingGraphicsMode(graphics) => { - let graphics_str = match graphics { - Graphics::Integrated => "integrated", - Graphics::Hybrid => "hybrid", - Graphics::Nvidia => "nvidia", - Graphics::Compute => "compute", - }; - column(vec![text(format!( - "Setting graphics mode to {graphics_str}..." - )) - .width(Length::Fill) - .horizontal_alignment(Horizontal::Center) - .into()]) - .into() - } - }; - popup_container( - column(vec![ - text("Graphics Mode") - .width(Length::Fill) - .horizontal_alignment(Horizontal::Center) - .size(24) - .into(), - separator!(1).into(), - content, - ]) - .padding(4) - .spacing(4), - ) - .into() - } - - fn view_layer_surface( - &self, - _: cosmic::iced_native::window::Id, - ) -> iced::Element<'_, Self::Message, iced::Renderer> { - unimplemented!() - } - fn close_window_requested(&self, _: cosmic::iced_native::window::Id) -> Self::Message { - unimplemented!() - } - fn popup_done(&self, _: cosmic::iced_native::window::Id) -> Self::Message { - unimplemented!() - } - fn layer_surface_done(&self, _: cosmic::iced_native::window::Id) -> Self::Message { - unimplemented!() - } - - fn style(&self) -> ::Style { - ::Style::Custom(|theme| Appearance { - background_color: Color::from_rgba(0.0, 0.0, 0.0, 0.0), - text_color: theme.cosmic().on_bg_color().into(), - }) - } - - fn view_window(&self, _: window::Id) -> Element { - // TODO use panel config crate after resolving version mismatch - - let btn = icon_button().on_press(Message::TogglePopup); - btn.into() - } - - fn should_exit(&self) -> bool { - false - } - - fn theme(&self) -> Theme { - self.theme - } -} diff --git a/examples/cosmic-sctk/Cargo.toml b/examples/cosmic-sctk/Cargo.toml index a599be5..ec6669e 100644 --- a/examples/cosmic-sctk/Cargo.toml +++ b/examples/cosmic-sctk/Cargo.toml @@ -7,3 +7,4 @@ publish = false [dependencies] libcosmic = { path = "../..", default-features = false, features = ["debug", "wayland"] } +iced_sctk = { git = "https://github.com/pop-os/iced-sctk" } diff --git a/examples/cosmic-sctk/src/window.rs b/examples/cosmic-sctk/src/window.rs index b145d8b..17ccd8e 100644 --- a/examples/cosmic-sctk/src/window.rs +++ b/examples/cosmic-sctk/src/window.rs @@ -7,12 +7,12 @@ use cosmic::{ iced::{self, Alignment, Application, Color, Command, Length}, iced_lazy::responsive, iced_native::window, - iced_winit::window::{drag, maximize, minimize}, list_view, list_view_item, list_view_row, list_view_section, scrollable, theme::{self, Theme}, widget::{button, header_bar, list_box, list_row, list_view::*, toggler}, Element, }; +use iced_sctk::application::SurfaceIdWrapper; use std::collections::BTreeMap; #[derive(Default)] @@ -99,34 +99,21 @@ impl Application for Window { Message::PickListSelected(value) => self.pick_list_selected = Some(value), Message::Close => self.exit = true, Message::ToggleSidebar => self.sidebar_toggled = !self.sidebar_toggled, - Message::Drag => return drag(window::Id::new(0)), - Message::Minimize => return minimize(window::Id::new(0), true), - Message::Maximize => return maximize(window::Id::new(0), true), + // Message::Drag => return drag(window::Id::new(0)), + // Message::Minimize => return minimize(window::Id::new(0), true), + // Message::Maximize => return maximize(window::Id::new(0), true), Message::RowSelected(row) => println!("Selected row {row}"), + _ => {} } Command::none() } - fn view_popup(&self, id: window::Id) -> Element { - unimplemented!() - } - fn view_layer_surface( - &self, - window: cosmic::iced_native::window::Id, - ) -> iced::Element<'_, Self::Message, iced::Renderer> { - unimplemented!() - } - fn close_window_requested(&self, window: cosmic::iced_native::window::Id) -> Self::Message { - unimplemented!() - } - fn popup_done(&self, window: cosmic::iced_native::window::Id) -> Self::Message { - unimplemented!() - } - fn layer_surface_done(&self, window: cosmic::iced_native::window::Id) -> Self::Message { + + fn close_requested(&self, _: SurfaceIdWrapper) -> Self::Message { unimplemented!() } - fn view_window(&self, id: window::Id) -> Element { + fn view(&self, _: SurfaceIdWrapper) -> Element { let mut header: Element = header_bar() .title(self.title()) .nav_title(String::from("Settings"))