diff --git a/Cargo.lock b/Cargo.lock
index 84548f14..ff7565e3 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -927,19 +927,6 @@ dependencies = [
"tracing-subscriber",
]
-[[package]]
-name = "cosmic-applet-graphics"
-version = "0.1.0"
-dependencies = [
- "i18n-embed 0.13.9",
- "i18n-embed-fl 0.6.7",
- "libcosmic",
- "once_cell",
- "rust-embed 6.8.1",
- "tracing",
- "zbus",
-]
-
[[package]]
name = "cosmic-applet-network"
version = "0.1.0"
diff --git a/Cargo.toml b/Cargo.toml
index 65414bea..006caf4c 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -5,7 +5,6 @@ members = [
"cosmic-applet-audio",
"cosmic-applet-battery",
"cosmic-applet-bluetooth",
- "cosmic-applet-graphics",
"cosmic-applet-network",
"cosmic-applet-notifications",
"cosmic-applet-power",
diff --git a/cosmic-applet-graphics/Cargo.toml b/cosmic-applet-graphics/Cargo.toml
deleted file mode 100644
index 18df3755..00000000
--- a/cosmic-applet-graphics/Cargo.toml
+++ /dev/null
@@ -1,16 +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.workspace = true
-libcosmic.workspace = true
-once_cell = "1"
-# Application i18n
-i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] }
-i18n-embed-fl = "0.6.4"
-rust-embed = "6.3.0"
-tracing = "0.1"
diff --git a/cosmic-applet-graphics/data/com.system76.CosmicAppletGraphics.desktop b/cosmic-applet-graphics/data/com.system76.CosmicAppletGraphics.desktop
deleted file mode 100644
index 6f22840e..00000000
--- a/cosmic-applet-graphics/data/com.system76.CosmicAppletGraphics.desktop
+++ /dev/null
@@ -1,13 +0,0 @@
-[Desktop Entry]
-Name=Cosmic Applet Graphics
-Comment=Applet for Cosmic Panel
-Type=Application
-Exec=cosmic-applet-graphics
-Terminal=false
-Categories=Cosmic;Iced;
-Keywords=Cosmic;Iced;
-# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
-Icon=com.system76.CosmicAppletGraphics
-StartupNotify=true
-NoDisplay=true
-X-CosmicApplet=true
diff --git a/cosmic-applet-graphics/data/icons/scalable/apps/com.system76.CosmicAppletGraphics.svg b/cosmic-applet-graphics/data/icons/scalable/apps/com.system76.CosmicAppletGraphics.svg
deleted file mode 100644
index 3d5c7509..00000000
--- a/cosmic-applet-graphics/data/icons/scalable/apps/com.system76.CosmicAppletGraphics.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-
diff --git a/cosmic-applet-graphics/i18n.toml b/cosmic-applet-graphics/i18n.toml
deleted file mode 100644
index 05c50ba2..00000000
--- a/cosmic-applet-graphics/i18n.toml
+++ /dev/null
@@ -1,4 +0,0 @@
-fallback_language = "en"
-
-[fluent]
-assets_dir = "i18n"
\ No newline at end of file
diff --git a/cosmic-applet-graphics/i18n/de/cosmic_applet_graphics.ftl b/cosmic-applet-graphics/i18n/de/cosmic_applet_graphics.ftl
deleted file mode 100644
index 895a570a..00000000
--- a/cosmic-applet-graphics/i18n/de/cosmic_applet_graphics.ftl
+++ /dev/null
@@ -1,9 +0,0 @@
-graphics-mode = Grafikmodus
-graphics = Graphik
-integrated = Integriert
-integrated-desc = Deaktiviert externe Bildschirme. Neustart erforderlich.
-nvidia = NVIDIA
-hybrid = Hybrid
-hybrid-desc = Neustart erforderlich.
-compute = Compute
-compute-desc = Deaktiviert externe Bildschirme. Neustart erforderlich.
\ No newline at end of file
diff --git a/cosmic-applet-graphics/i18n/en/cosmic_applet_graphics.ftl b/cosmic-applet-graphics/i18n/en/cosmic_applet_graphics.ftl
deleted file mode 100644
index 78cf0aba..00000000
--- a/cosmic-applet-graphics/i18n/en/cosmic_applet_graphics.ftl
+++ /dev/null
@@ -1,9 +0,0 @@
-graphics-mode = Graphics Mode
-graphics = Graphics
-integrated = Integrated
-integrated-desc = Disables external displays. Requires Restart.
-nvidia = NVIDIA
-hybrid = Hybrid
-hybrid-desc = Requires Restart.
-compute = Compute
-compute-desc = Disables external displays. Requires Restart.
\ No newline at end of file
diff --git a/cosmic-applet-graphics/i18n/fa/cosmic_applet_graphics.ftl b/cosmic-applet-graphics/i18n/fa/cosmic_applet_graphics.ftl
deleted file mode 100644
index 8b8aa5ef..00000000
--- a/cosmic-applet-graphics/i18n/fa/cosmic_applet_graphics.ftl
+++ /dev/null
@@ -1,9 +0,0 @@
-graphics-mode = حالت گرافیکی
-graphics = گرافیک
-integrated = Integrated
-integrated-desc = نمایشگر های خارجی را غیر فعال می کنم، نیازمند راه اندازی مجدد
-nvidia = انویدیا
-hybrid = Hybrid
-hybrid-desc = نیازمند راه اندازی مجدد.
-compute = Compute
-compute-desc = نمایشگر های خارجی را غیر فعال می کنم، نیازمند راه اندازی مجدد
diff --git a/cosmic-applet-graphics/i18n/fi/cosmic_applet_graphics.ftl b/cosmic-applet-graphics/i18n/fi/cosmic_applet_graphics.ftl
deleted file mode 100644
index 508548ac..00000000
--- a/cosmic-applet-graphics/i18n/fi/cosmic_applet_graphics.ftl
+++ /dev/null
@@ -1,9 +0,0 @@
-graphics-mode = Grafiikkatila
-graphics = Grafiikka
-integrated = Integroitu
-integrated-desc = Poistaa ulkoiset näytöt käytöstä. Vaatii Uudelleenkäynnistyksen.
-nvidia = NVIDIA
-hybrid = Hybridi
-hybrid-desc = Vaatii Uudelleenkäynnistyksen.
-compute = Laskelmoi
-compute-desc = Poistaa ulkoiset näytöt käytöstä. Vaatii Uudelleenkäynnistyksen.
diff --git a/cosmic-applet-graphics/i18n/fr/cosmic_applet_graphics.ftl b/cosmic-applet-graphics/i18n/fr/cosmic_applet_graphics.ftl
deleted file mode 100644
index 2e562e34..00000000
--- a/cosmic-applet-graphics/i18n/fr/cosmic_applet_graphics.ftl
+++ /dev/null
@@ -1,9 +0,0 @@
-graphics-mode = Modes graphique
-graphics = Graphiques
-integrated = Intégré
-integrated-desc = Désactive les moniteurs externes. Nécessite un redémarrage.
-nvidia = NVIDIA
-hybrid = Hybride
-hybrid-desc = Nécessite un redémarrage.
-compute = Calcul
-compute-desc = Désactive les moniteurs externes. Nécessite un redémarrage.
\ No newline at end of file
diff --git a/cosmic-applet-graphics/i18n/ja/cosmic-applet-graphics.ftl b/cosmic-applet-graphics/i18n/ja/cosmic-applet-graphics.ftl
deleted file mode 100644
index 2e840cde..00000000
--- a/cosmic-applet-graphics/i18n/ja/cosmic-applet-graphics.ftl
+++ /dev/null
@@ -1,9 +0,0 @@
-graphics-mode = グラフィックスモード
-graphics = グラフィックス
-integrated = 内蔵
-integrated-desc = 再起動して外付けのモニターを無効にすることは必要です。
-nvidia = NVIDIA
-hybrid = ハイブリッド
-hybrid-desc = 再起動が必要です。
-compute = 計算
-compute-desc = 再起動して外付けのモニターを無効にすることは必要です。
diff --git a/cosmic-applet-graphics/i18n/ko/cosmic_applet_graphics.ftl b/cosmic-applet-graphics/i18n/ko/cosmic_applet_graphics.ftl
deleted file mode 100644
index 2471dcad..00000000
--- a/cosmic-applet-graphics/i18n/ko/cosmic_applet_graphics.ftl
+++ /dev/null
@@ -1,9 +0,0 @@
-graphics-mode = 그래픽 모드
-graphics = 그래픽
-integrated = 내장 그래픽
-integrated-desc = 외부 디스플레이를 비활성화하며, 시스템을 다시 시작해야 합니다.
-nvidia = NVIDIA
-hybrid = 하이브리드
-hybrid-desc = 시스템을 다시 시작해야 합니다.
-compute = 컴퓨팅
-compute-desc = 외부 디스플레이를 비활성화하며, 시스템을 다시 시작해야 합니다.
diff --git a/cosmic-applet-graphics/i18n/nl/cosmic_applet_graphics.ftl b/cosmic-applet-graphics/i18n/nl/cosmic_applet_graphics.ftl
deleted file mode 100644
index 69744c80..00000000
--- a/cosmic-applet-graphics/i18n/nl/cosmic_applet_graphics.ftl
+++ /dev/null
@@ -1,9 +0,0 @@
-graphics-mode = Grafische Modus
-graphics = Grafisch
-integrated = Geïntegreerd
-integrated-desc = Zet alle externe schermen af. Herstart vereist.
-nvidia = NVIDIA
-hybrid = Hybride
-hybrid-desc = Hertart vereist.
-compute = Bereken
-compute-desc = Zet alle externe schermen af. Herstart vereist.
\ No newline at end of file
diff --git a/cosmic-applet-graphics/i18n/pl/cosmic_applet_graphics.ftl b/cosmic-applet-graphics/i18n/pl/cosmic_applet_graphics.ftl
deleted file mode 100644
index 683676d3..00000000
--- a/cosmic-applet-graphics/i18n/pl/cosmic_applet_graphics.ftl
+++ /dev/null
@@ -1,9 +0,0 @@
-graphics-mode = Tryb Graficzny
-graphics = Grafika
-integrated = Zintegrowana
-integrated-desc = Wyłącza zewnętrzne wyświetlacze. Wymaga Restartu.
-nvidia = NVIDIA
-hybrid = Hybrydowa
-hybrid-desc = Wymaga Restartu.
-compute = Oblicz
-compute-desc = Wyłącza zewnętrzne wyświetlacze. Wymaga Restartu.
diff --git a/cosmic-applet-graphics/i18n/pt-BR/cosmic_applet_graphics.ftl b/cosmic-applet-graphics/i18n/pt-BR/cosmic_applet_graphics.ftl
deleted file mode 100644
index 5e49a91e..00000000
--- a/cosmic-applet-graphics/i18n/pt-BR/cosmic_applet_graphics.ftl
+++ /dev/null
@@ -1,9 +0,0 @@
-graphics-mode = Modo Gráfico
-graphics = Gráfico
-integrated = Integrado
-integrated-desc = Desativa monitores externos. Requer reinicialização.
-nvidia = NVIDIA
-hybrid = Híbrido
-hybrid-desc = Requer reinicialização.
-compute = Calcular
-compute-desc = Desativa monitores externos. Requer reinicialização.
diff --git a/cosmic-applet-graphics/i18n/ru/cosmic_applet_graphics.ftl b/cosmic-applet-graphics/i18n/ru/cosmic_applet_graphics.ftl
deleted file mode 100644
index 2ba050d5..00000000
--- a/cosmic-applet-graphics/i18n/ru/cosmic_applet_graphics.ftl
+++ /dev/null
@@ -1,9 +0,0 @@
-graphics-mode = Режим графики
-graphics = Графика
-integrated = Интегрированная
-integrated-desc = Отключит внешние дисплеи. Требуется перезагрузка.
-nvidia = NVIDIA
-hybrid = Гибридная
-hybrid-desc = Требуется перезагрузка.
-compute = Вычислительная
-compute-desc = Отключит внешние дисплеи. Требуется перезагрузка.
\ No newline at end of file
diff --git a/cosmic-applet-graphics/i18n/sr-Cyrl/cosmic_applet_graphics.ftl b/cosmic-applet-graphics/i18n/sr-Cyrl/cosmic_applet_graphics.ftl
deleted file mode 100644
index ccfb60a6..00000000
--- a/cosmic-applet-graphics/i18n/sr-Cyrl/cosmic_applet_graphics.ftl
+++ /dev/null
@@ -1,9 +0,0 @@
-graphics-mode = Графички режим
-graphics = Графика
-integrated = Интегрисани
-integrated-desc = Искључује екстерне дисплеје. Захтева поновно покретање система.
-nvidia = NVIDIA
-hybrid = Хибридни
-hybrid-desc = Захтева поновно покретање система.
-compute = Рачунски
-compute-desc = Искључује екстерне дисплеје. Захтева поновно покретање система.
diff --git a/cosmic-applet-graphics/i18n/sr-Latn/cosmic_applet_graphics.ftl b/cosmic-applet-graphics/i18n/sr-Latn/cosmic_applet_graphics.ftl
deleted file mode 100644
index 89f1ee0a..00000000
--- a/cosmic-applet-graphics/i18n/sr-Latn/cosmic_applet_graphics.ftl
+++ /dev/null
@@ -1,9 +0,0 @@
-graphics-mode = Grafički režim
-graphics = Grafika
-integrated = Integrisani
-integrated-desc = Isključuje eksterne displeje. Zahteva ponovno pokretanje sistema.
-nvidia = NVIDIA
-hybrid = Hibridni
-hybrid-desc = Zahteva ponovno pokretanje sistema.
-compute = Računski
-compute-desc = Isključuje eksterne displeje. Zahteva ponovno pokretanje sistema.
diff --git a/cosmic-applet-graphics/i18n/uk/cosmic_applet_graphics.ftl b/cosmic-applet-graphics/i18n/uk/cosmic_applet_graphics.ftl
deleted file mode 100644
index f9a482b3..00000000
--- a/cosmic-applet-graphics/i18n/uk/cosmic_applet_graphics.ftl
+++ /dev/null
@@ -1,9 +0,0 @@
-graphics-mode = Режим графіки
-graphics = Графіка
-integrated = Інтегрована
-integrated-desc = Вимикає зовнішні дисплеї. Потребує перезапуску.
-nvidia = NVIDIA
-hybrid = Гібридна
-hybrid-desc = Потребує перезапуску.
-compute = Обчислювальна
-compute-desc = Вимикає зовнішні дисплеї. Потребує перезапуску.
diff --git a/cosmic-applet-graphics/src/dbus.rs b/cosmic-applet-graphics/src/dbus.rs
deleted file mode 100644
index 071ef5d5..00000000
--- a/cosmic-applet-graphics/src/dbus.rs
+++ /dev/null
@@ -1,100 +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,
- };
-
- if matches!(
- proxy.introspect().await,
- Err(zbus::fdo::Error::ServiceUnknown(_))
- ) {
- return None;
- }
-
- Some((conn, proxy))
-}
diff --git a/cosmic-applet-graphics/src/graphics.rs b/cosmic-applet-graphics/src/graphics.rs
deleted file mode 100644
index 8f409330..00000000
--- a/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/cosmic-applet-graphics/src/localize.rs b/cosmic-applet-graphics/src/localize.rs
deleted file mode 100644
index baa05d0d..00000000
--- a/cosmic-applet-graphics/src/localize.rs
+++ /dev/null
@@ -1,47 +0,0 @@
-// SPDX-License-Identifier: MPL-2.0-only
-
-use i18n_embed::{
- fluent::{fluent_language_loader, FluentLanguageLoader},
- DefaultLocalizer, LanguageLoader, Localizer,
-};
-use once_cell::sync::Lazy;
-use rust_embed::RustEmbed;
-
-#[derive(RustEmbed)]
-#[folder = "i18n/"]
-struct Localizations;
-
-pub static LANGUAGE_LOADER: Lazy = Lazy::new(|| {
- let loader: FluentLanguageLoader = fluent_language_loader!();
-
- loader
- .load_fallback_language(&Localizations)
- .expect("Error while loading fallback language");
-
- loader
-});
-
-#[macro_export]
-macro_rules! fl {
- ($message_id:literal) => {{
- i18n_embed_fl::fl!($crate::localize::LANGUAGE_LOADER, $message_id)
- }};
-
- ($message_id:literal, $($args:expr),*) => {{
- i18n_embed_fl::fl!($crate::localize::LANGUAGE_LOADER, $message_id, $($args), *)
- }};
-}
-
-// Get the `Localizer` to be used for localizing this library.
-pub fn localizer() -> Box {
- Box::from(DefaultLocalizer::new(&*LANGUAGE_LOADER, &Localizations))
-}
-
-pub fn localize() {
- let localizer = localizer();
- let requested_languages = i18n_embed::DesktopLanguageRequester::requested_languages();
-
- if let Err(error) = localizer.select(&requested_languages) {
- eprintln!("Error while loading language for App List {}", error);
- }
-}
diff --git a/cosmic-applet-graphics/src/main.rs b/cosmic-applet-graphics/src/main.rs
deleted file mode 100644
index 5efd6628..00000000
--- a/cosmic-applet-graphics/src/main.rs
+++ /dev/null
@@ -1,12 +0,0 @@
-mod dbus;
-mod graphics;
-mod localize;
-mod window;
-
-use window::*;
-
-pub fn main() -> cosmic::iced::Result {
- localize::localize();
-
- cosmic::applet::run::(true, ())
-}
diff --git a/cosmic-applet-graphics/src/window.rs b/cosmic-applet-graphics/src/window.rs
deleted file mode 100644
index 62751c25..00000000
--- a/cosmic-applet-graphics/src/window.rs
+++ /dev/null
@@ -1,376 +0,0 @@
-use crate::dbus::{self, PowerDaemonProxy};
-use crate::fl;
-use crate::graphics::{get_current_graphics, set_graphics, Graphics};
-use cosmic::applet::{menu_button, padded_control};
-use cosmic::iced::wayland::popup::{destroy_popup, get_popup};
-use cosmic::iced_runtime::core::alignment::Horizontal;
-use cosmic::iced_runtime::core::Alignment;
-use cosmic::iced_style::application;
-use cosmic::widget::{horizontal_space, icon, Container, Icon};
-use cosmic::{applet::cosmic_panel_config::PanelAnchor, Command};
-use cosmic::{
- iced::widget::{column, row, text},
- iced::{self, Length},
- iced_runtime::core::window,
- theme::Theme,
- widget::{button, divider},
- Element,
-};
-use zbus::Connection;
-
-const ID: &str = "com.system76.CosmicAppletGraphics";
-
-#[derive(Clone, Copy)]
-enum GraphicsMode {
- Applied(Graphics),
- Selected { prev: Graphics, new: Graphics },
- Current(Graphics),
-}
-
-impl GraphicsMode {
- fn inner(&self) -> Graphics {
- match self {
- Self::Selected { new, .. } => *new,
- Self::Current(g) => *g,
- Self::Applied(g) => *g,
- }
- }
-}
-
-#[derive(Default)]
-pub struct Window {
- core: cosmic::app::Core,
- popup: Option,
- graphics_mode: Option,
- dbus: Option<(Connection, PowerDaemonProxy<'static>)>,
- switchable: bool,
-}
-
-#[allow(dead_code)]
-#[derive(Clone, Debug)]
-pub enum Message {
- CurrentGraphics(Option),
- AppliedGraphics(Option),
- DBusInit(Option<(Connection, PowerDaemonProxy<'static>)>, bool),
- SelectGraphicsMode(Graphics),
- TogglePopup,
- PopupClosed(window::Id),
-}
-
-impl cosmic::Application for Window {
- type Executor = cosmic::SingleThreadExecutor;
- type Flags = ();
- type Message = Message;
- const APP_ID: &'static str = ID;
-
- fn init(
- core: cosmic::app::Core,
- _flags: Self::Flags,
- ) -> (Self, iced::Command>) {
- let window = Self {
- core,
- ..Default::default()
- };
- (
- window,
- iced::Command::perform(
- async {
- let dbus = dbus::init().await;
- let switchable = if let Some((_, proxy)) = dbus.as_ref() {
- proxy.get_switchable().await.ok().unwrap_or(false)
- } else {
- false
- };
- (dbus, switchable)
- },
- |(dbus, switchable)| cosmic::app::message::app(Message::DBusInit(dbus, switchable)),
- ),
- )
- }
-
- fn core(&self) -> &cosmic::app::Core {
- &self.core
- }
-
- fn core_mut(&mut self) -> &mut cosmic::app::Core {
- &mut self.core
- }
-
- fn update(
- &mut self,
- message: Self::Message,
- ) -> iced::Command> {
- match message {
- Message::SelectGraphicsMode(new) => {
- if let Some((_, proxy)) = self.dbus.as_ref() {
- let prev = self
- .graphics_mode
- .map(|m| m.inner())
- .unwrap_or_else(|| Graphics::Integrated);
- self.graphics_mode = Some(GraphicsMode::Selected { prev, new });
- return iced::Command::perform(
- set_graphics(proxy.clone(), new),
- move |success| {
- cosmic::app::message::app(Message::AppliedGraphics(
- success.ok().map(|_| new),
- ))
- },
- );
- }
- }
- Message::TogglePopup => {
- if let Some(p) = self.popup.take() {
- return destroy_popup(p);
- } else {
- let new_id = window::Id::unique();
- self.popup.replace(new_id);
- let mut commands = Vec::new();
- if let Some((_, proxy)) = self.dbus.as_ref() {
- commands.push(iced::Command::perform(
- get_current_graphics(proxy.clone()),
- |cur_graphics| Message::CurrentGraphics(cur_graphics.ok()),
- ));
- }
- let popup_settings = self.core.applet.get_popup_settings(
- window::Id::MAIN,
- new_id,
- None,
- None,
- None,
- );
- commands.push(get_popup(popup_settings));
- return iced::Command::batch(commands).map(cosmic::app::message::app);
- }
- }
- Message::DBusInit(dbus, switchable) => {
- self.switchable = switchable;
- if !switchable {
- std::process::exit(0);
- }
- if dbus.is_none() {
- eprintln!("Could not connect to com.system76.PowerDaemon. Exiting.");
- std::process::exit(0);
- }
- self.dbus = dbus;
- return iced::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) => {
- eprintln!("{err:?}");
- None
- }
- })
- },
- )
- .map(cosmic::app::message::app);
- }
- Message::CurrentGraphics(g) => {
- if let Some(g) = g {
- self.graphics_mode = Some(match self.graphics_mode.take() {
- Some(GraphicsMode::Current(_)) | None => GraphicsMode::Current(g),
- Some(g) => g,
- });
- }
- }
- Message::PopupClosed(id) => {
- if self.popup.as_ref() == Some(&id) {
- self.popup = None;
- }
- }
- Message::AppliedGraphics(g) => {
- if let Some(g) = g {
- self.graphics_mode = Some(GraphicsMode::Applied(g));
- } else {
- // Reset graphics
- match self.graphics_mode {
- Some(GraphicsMode::Selected { prev, new }) => {
- // TODO send notification with error?
- self.graphics_mode = Some(GraphicsMode::Applied(prev));
- // Reset to prev after failing
- // https://github.com/pop-os/system76-power/issues/387
- if let Some((_, proxy)) = self.dbus.as_ref() {
- return iced::Command::perform(
- set_graphics(proxy.clone(), prev),
- move |success| {
- Message::AppliedGraphics(success.ok().map(|_| new))
- },
- )
- .map(cosmic::app::message::app);
- }
- }
- _ => {
- return iced::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) => {
- tracing::error!("{:?}", err);
- None
- }
- })
- },
- )
- .map(cosmic::app::message::app)
- }
- };
- }
- }
- }
- Command::none()
- }
-
- fn view(&self) -> Element {
- if !self.switchable {
- return horizontal_space(1.0).into();
- }
- match self.core.applet.anchor {
- PanelAnchor::Left | PanelAnchor::Right => self
- .core
- .applet
- .icon_button(ID)
- .on_press(Message::TogglePopup)
- .into(),
- PanelAnchor::Top | PanelAnchor::Bottom => button(
- row![
- Icon::from(
- icon::from_name(ID)
- .size(self.core.applet.suggested_size().0)
- .symbolic(true)
- )
- .style(cosmic::theme::Svg::Custom(std::rc::Rc::new(
- |theme| {
- cosmic::iced_style::svg::Appearance {
- color: Some(theme.cosmic().background.on.into()),
- }
- }
- ))),
- text(match self.graphics_mode.map(|g| g.inner()) {
- Some(Graphics::Integrated) => fl!("integrated"),
- Some(Graphics::Nvidia) => fl!("nvidia"),
- Some(Graphics::Compute) => fl!("compute"),
- Some(Graphics::Hybrid) => fl!("hybrid"),
- None => "".into(),
- })
- .size(14)
- ]
- .spacing(8)
- .padding([0, self.core.applet.suggested_size().0 / 2])
- .align_items(Alignment::Center),
- )
- .on_press(Message::TogglePopup)
- .padding(8)
- .width(Length::Shrink)
- .height(Length::Shrink)
- .style(cosmic::theme::Button::AppletIcon)
- .into(),
- }
- }
-
- fn view_window(&self, _id: window::Id) -> Element {
- let content_list = vec![
- menu_button(
- row![
- column![
- text(format!("{} {}", fl!("integrated"), fl!("graphics"))).size(14),
- text(fl!("integrated-desc")).size(12)
- ]
- .width(Length::Fill),
- button_icon(self.graphics_mode, Graphics::Integrated)
- ]
- .align_items(Alignment::Center),
- )
- .on_press(Message::SelectGraphicsMode(Graphics::Integrated))
- .into(),
- menu_button(
- row![
- column![text(format!("{} {}", fl!("nvidia"), fl!("graphics"))).size(14)]
- .width(Length::Fill),
- button_icon(self.graphics_mode, Graphics::Nvidia)
- ]
- .align_items(Alignment::Center),
- )
- .on_press(Message::SelectGraphicsMode(Graphics::Nvidia))
- .into(),
- menu_button(
- row![
- column![
- text(format!("{} {}", fl!("hybrid"), fl!("graphics"))).size(14),
- text(fl!("hybrid-desc")).size(12)
- ]
- .width(Length::Fill),
- button_icon(self.graphics_mode, Graphics::Hybrid)
- ]
- .align_items(Alignment::Center),
- )
- .on_press(Message::SelectGraphicsMode(Graphics::Hybrid))
- .into(),
- menu_button(
- row![
- column![
- text(format!("{} {}", fl!("compute"), fl!("graphics"))).size(14),
- text(fl!("compute-desc")).size(12)
- ]
- .width(Length::Fill),
- button_icon(self.graphics_mode, Graphics::Compute)
- ]
- .align_items(Alignment::Center),
- )
- .on_press(Message::SelectGraphicsMode(Graphics::Compute))
- .into(),
- ];
-
- self.core
- .applet
- .popup_container(
- column(vec![
- padded_control(
- text(fl!("graphics-mode"))
- .width(Length::Fill)
- .horizontal_alignment(Horizontal::Left)
- .size(14),
- )
- .into(),
- padded_control(divider::horizontal::default()).into(),
- column(content_list).into(),
- ])
- .padding([16, 0, 8, 0]),
- )
- .into()
- }
-
- fn style(&self) -> Option<::Style> {
- Some(cosmic::applet::style())
- }
-
- fn on_close_requested(&self, id: window::Id) -> Option {
- Some(Message::PopupClosed(id))
- }
-}
-
-fn button_icon<'a>(
- cur_mode: Option,
- button_mode: Graphics,
-) -> Container<'a, Message, cosmic::Theme, cosmic::Renderer> {
- match cur_mode {
- Some(GraphicsMode::Selected { prev: _, new }) if new == button_mode => {
- cosmic::widget::container(
- icon::from_name("process-working-symbolic")
- .size(12)
- .symbolic(true)
- .prefer_svg(true),
- )
- }
- Some(GraphicsMode::Applied(g) | GraphicsMode::Current(g)) if g == button_mode => {
- cosmic::widget::container(
- icon::from_name("emblem-ok-symbolic")
- .size(12)
- .symbolic(true)
- .prefer_svg(true),
- )
- }
- _ => cosmic::widget::container(horizontal_space(1.0)),
- }
-}
diff --git a/justfile b/justfile
index d9ad8650..80c0e82c 100644
--- a/justfile
+++ b/justfile
@@ -39,7 +39,6 @@ _install_app_list: (_install 'com.system76.CosmicAppList' 'cosmic-app-list')
_install_audio: (_install 'com.system76.CosmicAppletAudio' 'cosmic-applet-audio')
_install_battery: (_install 'com.system76.CosmicAppletBattery' 'cosmic-applet-battery')
_install_bluetooth: (_install 'com.system76.CosmicAppletBluetooth' 'cosmic-applet-bluetooth')
-_install_graphics: (_install 'com.system76.CosmicAppletGraphics' 'cosmic-applet-graphics')
_install_network: (_install 'com.system76.CosmicAppletNetwork' 'cosmic-applet-network')
_install_notifications: (_install 'com.system76.CosmicAppletNotifications' 'cosmic-applet-notifications')
_install_power: (_install 'com.system76.CosmicAppletPower' 'cosmic-applet-power')
@@ -55,7 +54,7 @@ _install_app_button: (_install_button 'com.system76.CosmicPanelAppButton' 'cosmi
_install_workspaces_button: (_install_button 'com.system76.CosmicPanelWorkspacesButton' 'cosmic-panel-workspaces-button')
# Installs files into the system
-install: _install_app_list _install_audio _install_battery _install_bluetooth _install_graphics _install_network _install_notifications _install_power _install_workspace _install_time _install_tiling _install_panel_button _install_app_button _install_workspaces_button _install_status_area
+install: _install_app_list _install_audio _install_battery _install_bluetooth _install_network _install_notifications _install_power _install_workspace _install_time _install_tiling _install_panel_button _install_app_button _install_workspaces_button _install_status_area
# Extracts vendored dependencies if vendor=1
_extract_vendor: