diff --git a/CHANGELOG.md b/CHANGELOG.md index 2be6854f..d64baabb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Changed +- Refine graphics mode switching: + + Disallow switching to compute or vfio mode unless existing mode is "Integrated" # [3.7.0] - 2021-06-06 ### Changed diff --git a/Makefile b/Makefile index a1f8def5..0125072d 100644 --- a/Makefile +++ b/Makefile @@ -56,6 +56,13 @@ install: $(INSTALL_DATA) "./data/icons/asus_notif_yellow.png" "$(DESTDIR)$(datarootdir)/icons/hicolor/512x512/apps/asus_notif_yellow.png" $(INSTALL_DATA) "./data/icons/asus_notif_green.png" "$(DESTDIR)$(datarootdir)/icons/hicolor/512x512/apps/asus_notif_green.png" $(INSTALL_DATA) "./data/icons/asus_notif_red.png" "$(DESTDIR)$(datarootdir)/icons/hicolor/512x512/apps/asus_notif_red.png" + + $(INSTALL_DATA) "./data/icons/scalable/gpu-compute.svg" "$(DESTDIR)$(datarootdir)/icons/hicolor/scalable/status/gpu-compute.svg" + $(INSTALL_DATA) "./data/icons/scalable/gpu-hybrid.svg" "$(DESTDIR)$(datarootdir)/icons/hicolor/scalable/status/gpu-hybrid.svg" + $(INSTALL_DATA) "./data/icons/scalable/gpu-integrated.svg" "$(DESTDIR)$(datarootdir)/icons/hicolor/scalable/status/gpu-integrated.svg" + $(INSTALL_DATA) "./data/icons/scalable/gpu-nvidia.svg" "$(DESTDIR)$(datarootdir)/icons/hicolor/scalable/status/gpu-nvidia.svg" + $(INSTALL_DATA) "./data/icons/scalable/gpu-vfio.svg" "$(DESTDIR)$(datarootdir)/icons/hicolor/scalable/status/gpu-vfio.svg" + $(INSTALL_DATA) "./data/icons/scalable/notification-reboot.svg" "$(DESTDIR)$(datarootdir)/icons/hicolor/scalable/status/notification-reboot.svg" $(INSTALL_DATA) "./data/_asusctl" "$(DESTDIR)$(zshcpl)/_asusctl" $(INSTALL_DATA) "./data/completions/asusctl.fish" "$(DESTDIR)$(datarootdir)/fish/vendor_completions.d/asusctl.fish" cd data && find "./anime" -type f -exec install -Dm 755 "{}" "$(DESTDIR)$(datarootdir)/asusd/{}" \; @@ -74,6 +81,12 @@ uninstall: rm -r "$(DESTDIR)$(datarootdir)/icons/hicolor/512x512/apps/asus_notif_yellow.png" rm -r "$(DESTDIR)$(datarootdir)/icons/hicolor/512x512/apps/asus_notif_green.png" rm -r "$(DESTDIR)$(datarootdir)/icons/hicolor/512x512/apps/asus_notif_red.png" + rm -r "$(DESTDIR)$(datarootdir)/icons/hicolor/scalable/status/gpu-compute.svg" + rm -r "$(DESTDIR)$(datarootdir)/icons/hicolor/scalable/status/gpu-hybrid.svg" + rm -r "$(DESTDIR)$(datarootdir)/icons/hicolor/scalable/status/gpu-integrated.svg" + rm -r "$(DESTDIR)$(datarootdir)/icons/hicolor/scalable/status/gpu-nvidia.svg" + rm -r "$(DESTDIR)$(datarootdir)/icons/hicolor/scalable/status/gpu-vfio.svg" + rm -r "$(DESTDIR)$(datarootdir)/icons/hicolor/scalable/status/notification-reboot.svg" rm -f "$(DESTDIR)$(zshcpl)/_asusctl" rm -f "$(DESTDIR)$(datarootdir)/fish/vendor_completions.d/asusctl.fish" rm -rf "$(DESTDIR)$(datarootdir)/asusd" diff --git a/asus-notify/src/main.rs b/asus-notify/src/main.rs index dc6cade6..71910957 100644 --- a/asus-notify/src/main.rs +++ b/asus-notify/src/main.rs @@ -2,8 +2,10 @@ use notify_rust::{Hint, Notification, NotificationHandle}; use rog_aura::AuraEffect; use rog_dbus::{DbusProxies, Signals}; use rog_profiles::profiles::{FanLevel, Profile}; +use rog_types::gfx_vendors::GfxRequiredUserAction; use rog_types::gfx_vendors::GfxVendors; use std::error::Error; +use std::process; use std::thread::sleep; use std::time::Duration; @@ -20,6 +22,16 @@ macro_rules! notify { }; } +macro_rules! base_notification { + ($body:expr) => { + Notification::new() + .summary(NOTIF_HEADER) + .body($body) + .timeout(2000) + .show() + }; +} + fn main() -> Result<(), Box> { println!("asus-notify version {}", env!("CARGO_PKG_VERSION")); println!(" rog-dbus version {}", rog_dbus::VERSION); @@ -59,6 +71,19 @@ fn main() -> Result<(), Box> { if let Ok(data) = signals.gfx_vendor.try_recv() { notify!(do_gfx_notif, last_notification, &data); } + if let Ok(data) = signals.gfx_action.try_recv() { + match data { + GfxRequiredUserAction::Logout | GfxRequiredUserAction::Reboot => { + do_gfx_action_notif(&data)?; + } + GfxRequiredUserAction::Integrated => { + base_notification!( + "You must be in integrated mode first to switch to the requested mode" + )?; + } + GfxRequiredUserAction::None => {} + } + } } } @@ -86,16 +111,6 @@ fn do_thermal_notif(profile: &Profile) -> Result { - Notification::new() - .summary(NOTIF_HEADER) - .body($body) - .timeout(2000) - .show() - }; -} - fn do_led_notif(ledmode: &AuraEffect) -> Result { base_notification!(&format!( "Keyboard LED mode changed to {}", @@ -108,8 +123,50 @@ fn do_charge_notif(limit: &u8) -> Result Result { - base_notification!(&format!( - "Graphics mode changed to {}", - <&str>::from(vendor) - )) + let icon = match vendor { + GfxVendors::Nvidia => "/usr/share/icons/hicolor/scalable/status/gpu-nvidia.svg", + GfxVendors::Integrated => "/usr/share/icons/hicolor/scalable/status/gpu-integrated.svg", + GfxVendors::Compute => "/usr/share/icons/hicolor/scalable/status/gpu-compute.svg", + GfxVendors::Vfio => "/usr/share/icons/hicolor/scalable/status/gpu-vfio.svg", + GfxVendors::Hybrid => "/usr/share/icons/hicolor/scalable/status/gpu-hybrid.svg", + }; + Notification::new() + .summary(NOTIF_HEADER) + .body(&format!( + "Graphics mode changed to {}", + <&str>::from(vendor) + )) + .timeout(2000) + .icon(icon) + .show() +} + +fn do_gfx_action_notif(vendor: &GfxRequiredUserAction) -> Result<(), notify_rust::error::Error> { + let mut notif = Notification::new() + .summary(NOTIF_HEADER) + .timeout(2000) + .urgency(notify_rust::Urgency::Critical) + .icon("/usr/share/icons/hicolor/scalable/status/notification-reboot.svg") + .finalize(); + + if matches!(vendor, GfxRequiredUserAction::Logout) { + notif.action("logout", "Logout now?"); + } else if matches!(vendor, GfxRequiredUserAction::Reboot) { + notif.action("reboot", "Reboot now?"); + } + + notif.body("Graphics mode changed"); + notif.show()?.wait_for_action(|action| match action { + "logout" => { + process::Command::new("gnome-session-quit").spawn().ok(); + } + "reboot" => { + process::Command::new("systemctl") + .arg("reboot") + .spawn() + .ok(); + } + _ => (), + }); + Ok(()) } diff --git a/data/icons/scalable/gpu-compute.svg b/data/icons/scalable/gpu-compute.svg new file mode 100644 index 00000000..37509170 --- /dev/null +++ b/data/icons/scalable/gpu-compute.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/scalable/gpu-hybrid.svg b/data/icons/scalable/gpu-hybrid.svg new file mode 100644 index 00000000..abafc73e --- /dev/null +++ b/data/icons/scalable/gpu-hybrid.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/scalable/gpu-integrated.svg b/data/icons/scalable/gpu-integrated.svg new file mode 100644 index 00000000..90df643f --- /dev/null +++ b/data/icons/scalable/gpu-integrated.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + diff --git a/data/icons/scalable/gpu-nvidia.svg b/data/icons/scalable/gpu-nvidia.svg new file mode 100644 index 00000000..d73963a3 --- /dev/null +++ b/data/icons/scalable/gpu-nvidia.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + diff --git a/data/icons/scalable/gpu-vfio.svg b/data/icons/scalable/gpu-vfio.svg new file mode 100644 index 00000000..e74d450a --- /dev/null +++ b/data/icons/scalable/gpu-vfio.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/scalable/notification-reboot.svg b/data/icons/scalable/notification-reboot.svg new file mode 100644 index 00000000..8783bc2d --- /dev/null +++ b/data/icons/scalable/notification-reboot.svg @@ -0,0 +1 @@ + \ No newline at end of file