graphics: Remove unused applet
This commit is contained in:
parent
5be328f8ad
commit
28e6079ee7
26 changed files with 1 additions and 783 deletions
13
Cargo.lock
generated
13
Cargo.lock
generated
|
|
@ -927,19 +927,6 @@ dependencies = [
|
||||||
"tracing-subscriber",
|
"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]]
|
[[package]]
|
||||||
name = "cosmic-applet-network"
|
name = "cosmic-applet-network"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ members = [
|
||||||
"cosmic-applet-audio",
|
"cosmic-applet-audio",
|
||||||
"cosmic-applet-battery",
|
"cosmic-applet-battery",
|
||||||
"cosmic-applet-bluetooth",
|
"cosmic-applet-bluetooth",
|
||||||
"cosmic-applet-graphics",
|
|
||||||
"cosmic-applet-network",
|
"cosmic-applet-network",
|
||||||
"cosmic-applet-notifications",
|
"cosmic-applet-notifications",
|
||||||
"cosmic-applet-power",
|
"cosmic-applet-power",
|
||||||
|
|
|
||||||
|
|
@ -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"
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
||||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<g id="applet-graphics-mode">
|
|
||||||
<rect id="Rectangle 47" x="4" y="4" width="8" height="8" fill="#232323"/>
|
|
||||||
<g id="Rectangle 48">
|
|
||||||
<path d="M4 0.75C4 0.75 4 0 5 0C6 0 6 0.75 6 0.75V3H4V0.75Z" fill="#232323"/>
|
|
||||||
</g>
|
|
||||||
<g id="Rectangle 54">
|
|
||||||
<path d="M0.75 6C0.75 6 0 6 0 5C0 4 0.75 4 0.75 4H3V6H0.75Z" fill="#232323"/>
|
|
||||||
</g>
|
|
||||||
<g id="Rectangle 57">
|
|
||||||
<path d="M15.25 6C15.25 6 16 6 16 5C16 4 15.25 4 15.25 4H13V6H15.25Z" fill="#232323"/>
|
|
||||||
</g>
|
|
||||||
<g id="Rectangle 51">
|
|
||||||
<path d="M4 15.25C4 15.25 4 16 5 16C6 16 6 15.25 6 15.25V13H4V15.25Z" fill="#232323"/>
|
|
||||||
</g>
|
|
||||||
<g id="Rectangle 49">
|
|
||||||
<path d="M7 0.75C7 0.75 7 0 8 0C9 0 9 0.75 9 0.75V3H7V0.75Z" fill="#232323"/>
|
|
||||||
</g>
|
|
||||||
<g id="Rectangle 55">
|
|
||||||
<path d="M0.75 9C0.75 9 0 9 0 8C0 7 0.75 7 0.75 7H3V9H0.75Z" fill="#232323"/>
|
|
||||||
</g>
|
|
||||||
<g id="Rectangle 58">
|
|
||||||
<path d="M15.25 9C15.25 9 16 9 16 8C16 7 15.25 7 15.25 7H13V9H15.25Z" fill="#232323"/>
|
|
||||||
</g>
|
|
||||||
<g id="Rectangle 52">
|
|
||||||
<path d="M7 15.25C7 15.25 7 16 8 16C9 16 9 15.25 9 15.25V13H7V15.25Z" fill="#232323"/>
|
|
||||||
</g>
|
|
||||||
<g id="Rectangle 50">
|
|
||||||
<path d="M10 0.75C10 0.75 10 0 11 0C12 0 12 0.75 12 0.75V3H10V0.75Z" fill="#232323"/>
|
|
||||||
</g>
|
|
||||||
<g id="Rectangle 56">
|
|
||||||
<path d="M0.75 12C0.75 12 0 12 0 11C0 10 0.75 10 0.75 10H3V12H0.75Z" fill="#232323"/>
|
|
||||||
</g>
|
|
||||||
<g id="Rectangle 59">
|
|
||||||
<path d="M15.25 12C15.25 12 16 12 16 11C16 10 15.25 10 15.25 10H13V12H15.25Z" fill="#232323"/>
|
|
||||||
</g>
|
|
||||||
<g id="Rectangle 53">
|
|
||||||
<path d="M10 15.25C10 15.25 10 16 11 16C12 16 12 15.25 12 15.25V13H10V15.25Z" fill="#232323"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.5 KiB |
|
|
@ -1,4 +0,0 @@
|
||||||
fallback_language = "en"
|
|
||||||
|
|
||||||
[fluent]
|
|
||||||
assets_dir = "i18n"
|
|
||||||
|
|
@ -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.
|
|
||||||
|
|
@ -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.
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
graphics-mode = حالت گرافیکی
|
|
||||||
graphics = گرافیک
|
|
||||||
integrated = Integrated
|
|
||||||
integrated-desc = نمایشگر های خارجی را غیر فعال می کنم، نیازمند راه اندازی مجدد
|
|
||||||
nvidia = انویدیا
|
|
||||||
hybrid = Hybrid
|
|
||||||
hybrid-desc = نیازمند راه اندازی مجدد.
|
|
||||||
compute = Compute
|
|
||||||
compute-desc = نمایشگر های خارجی را غیر فعال می کنم، نیازمند راه اندازی مجدد
|
|
||||||
|
|
@ -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.
|
|
||||||
|
|
@ -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.
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
graphics-mode = グラフィックスモード
|
|
||||||
graphics = グラフィックス
|
|
||||||
integrated = 内蔵
|
|
||||||
integrated-desc = 再起動して外付けのモニターを無効にすることは必要です。
|
|
||||||
nvidia = NVIDIA
|
|
||||||
hybrid = ハイブリッド
|
|
||||||
hybrid-desc = 再起動が必要です。
|
|
||||||
compute = 計算
|
|
||||||
compute-desc = 再起動して外付けのモニターを無効にすることは必要です。
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
graphics-mode = 그래픽 모드
|
|
||||||
graphics = 그래픽
|
|
||||||
integrated = 내장 그래픽
|
|
||||||
integrated-desc = 외부 디스플레이를 비활성화하며, 시스템을 다시 시작해야 합니다.
|
|
||||||
nvidia = NVIDIA
|
|
||||||
hybrid = 하이브리드
|
|
||||||
hybrid-desc = 시스템을 다시 시작해야 합니다.
|
|
||||||
compute = 컴퓨팅
|
|
||||||
compute-desc = 외부 디스플레이를 비활성화하며, 시스템을 다시 시작해야 합니다.
|
|
||||||
|
|
@ -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.
|
|
||||||
|
|
@ -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.
|
|
||||||
|
|
@ -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.
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
graphics-mode = Режим графики
|
|
||||||
graphics = Графика
|
|
||||||
integrated = Интегрированная
|
|
||||||
integrated-desc = Отключит внешние дисплеи. Требуется перезагрузка.
|
|
||||||
nvidia = NVIDIA
|
|
||||||
hybrid = Гибридная
|
|
||||||
hybrid-desc = Требуется перезагрузка.
|
|
||||||
compute = Вычислительная
|
|
||||||
compute-desc = Отключит внешние дисплеи. Требуется перезагрузка.
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
graphics-mode = Графички режим
|
|
||||||
graphics = Графика
|
|
||||||
integrated = Интегрисани
|
|
||||||
integrated-desc = Искључује екстерне дисплеје. Захтева поновно покретање система.
|
|
||||||
nvidia = NVIDIA
|
|
||||||
hybrid = Хибридни
|
|
||||||
hybrid-desc = Захтева поновно покретање система.
|
|
||||||
compute = Рачунски
|
|
||||||
compute-desc = Искључује екстерне дисплеје. Захтева поновно покретање система.
|
|
||||||
|
|
@ -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.
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
graphics-mode = Режим графіки
|
|
||||||
graphics = Графіка
|
|
||||||
integrated = Інтегрована
|
|
||||||
integrated-desc = Вимикає зовнішні дисплеї. Потребує перезапуску.
|
|
||||||
nvidia = NVIDIA
|
|
||||||
hybrid = Гібридна
|
|
||||||
hybrid-desc = Потребує перезапуску.
|
|
||||||
compute = Обчислювальна
|
|
||||||
compute-desc = Вимикає зовнішні дисплеї. Потребує перезапуску.
|
|
||||||
|
|
@ -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<Vec<std::collections::HashMap<String, zbus::zvariant::OwnedValue>>>;
|
|
||||||
|
|
||||||
/// GetChargeThresholds method
|
|
||||||
fn get_charge_thresholds(&self) -> zbus::Result<(u8, u8)>;
|
|
||||||
|
|
||||||
/// GetDefaultGraphics method
|
|
||||||
fn get_default_graphics(&self) -> zbus::Result<String>;
|
|
||||||
|
|
||||||
/// GetExternalDisplaysRequireDGPU method
|
|
||||||
fn get_external_displays_require_dgpu(&self) -> zbus::Result<bool>;
|
|
||||||
|
|
||||||
/// GetGraphics method
|
|
||||||
fn get_graphics(&self) -> zbus::Result<String>;
|
|
||||||
|
|
||||||
/// GetGraphicsPower method
|
|
||||||
fn get_graphics_power(&self) -> zbus::Result<bool>;
|
|
||||||
|
|
||||||
/// GetProfile method
|
|
||||||
fn get_profile(&self) -> zbus::Result<String>;
|
|
||||||
|
|
||||||
/// GetSwitchable method
|
|
||||||
fn get_switchable(&self) -> zbus::Result<bool>;
|
|
||||||
|
|
||||||
/// 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))
|
|
||||||
}
|
|
||||||
|
|
@ -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<Graphics> {
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
@ -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<FluentLanguageLoader> = 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<dyn Localizer> {
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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::<Window>(true, ())
|
|
||||||
}
|
|
||||||
|
|
@ -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<window::Id>,
|
|
||||||
graphics_mode: Option<GraphicsMode>,
|
|
||||||
dbus: Option<(Connection, PowerDaemonProxy<'static>)>,
|
|
||||||
switchable: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[allow(dead_code)]
|
|
||||||
#[derive(Clone, Debug)]
|
|
||||||
pub enum Message {
|
|
||||||
CurrentGraphics(Option<Graphics>),
|
|
||||||
AppliedGraphics(Option<Graphics>),
|
|
||||||
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<cosmic::app::Message<Self::Message>>) {
|
|
||||||
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<cosmic::app::Message<Self::Message>> {
|
|
||||||
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<Message> {
|
|
||||||
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<Message> {
|
|
||||||
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<<Theme as application::StyleSheet>::Style> {
|
|
||||||
Some(cosmic::applet::style())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn on_close_requested(&self, id: window::Id) -> Option<Message> {
|
|
||||||
Some(Message::PopupClosed(id))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn button_icon<'a>(
|
|
||||||
cur_mode: Option<GraphicsMode>,
|
|
||||||
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)),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
3
justfile
3
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_audio: (_install 'com.system76.CosmicAppletAudio' 'cosmic-applet-audio')
|
||||||
_install_battery: (_install 'com.system76.CosmicAppletBattery' 'cosmic-applet-battery')
|
_install_battery: (_install 'com.system76.CosmicAppletBattery' 'cosmic-applet-battery')
|
||||||
_install_bluetooth: (_install 'com.system76.CosmicAppletBluetooth' 'cosmic-applet-bluetooth')
|
_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_network: (_install 'com.system76.CosmicAppletNetwork' 'cosmic-applet-network')
|
||||||
_install_notifications: (_install 'com.system76.CosmicAppletNotifications' 'cosmic-applet-notifications')
|
_install_notifications: (_install 'com.system76.CosmicAppletNotifications' 'cosmic-applet-notifications')
|
||||||
_install_power: (_install 'com.system76.CosmicAppletPower' 'cosmic-applet-power')
|
_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')
|
_install_workspaces_button: (_install_button 'com.system76.CosmicPanelWorkspacesButton' 'cosmic-panel-workspaces-button')
|
||||||
|
|
||||||
# Installs files into the system
|
# 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
|
# Extracts vendored dependencies if vendor=1
|
||||||
_extract_vendor:
|
_extract_vendor:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue