mirror of
https://gitlab.com/asus-linux/asusctl.git
synced 2026-02-06 00:15:04 +01:00
Add missing file
This commit is contained in:
75
rog-control-center/src/tray.rs
Normal file
75
rog-control-center/src/tray.rs
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
//! A seld-contained tray icon with menus. The control of app<->tray is done via
|
||||||
|
//! commands over an MPSC channel.
|
||||||
|
|
||||||
|
use std::{
|
||||||
|
sync::{
|
||||||
|
mpsc::{channel, Receiver},
|
||||||
|
Arc, Mutex,
|
||||||
|
},
|
||||||
|
time::Duration,
|
||||||
|
io::Write,
|
||||||
|
};
|
||||||
|
|
||||||
|
use supergfxctl::pci_device::GfxPower;
|
||||||
|
use tray_item::TrayItem;
|
||||||
|
use crate::{SHOW_GUI, get_ipc_file};
|
||||||
|
|
||||||
|
pub enum AppToTray {
|
||||||
|
DgpuStatus(GfxPower),
|
||||||
|
}
|
||||||
|
|
||||||
|
pub enum TrayToApp {
|
||||||
|
Open,
|
||||||
|
Quit,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn init_tray(recv_command: Receiver<AppToTray>) -> Receiver<TrayToApp> {
|
||||||
|
let (send, recv) = channel();
|
||||||
|
let send = Arc::new(Mutex::new(send));
|
||||||
|
|
||||||
|
std::thread::spawn(move || {
|
||||||
|
gtk::init().unwrap(); // Make this the main thread for gtk
|
||||||
|
|
||||||
|
let mut tray = TrayItem::new("ROG Control Center", "rog-control-center").unwrap();
|
||||||
|
|
||||||
|
tray.add_menu_item("Open app", move || {
|
||||||
|
get_ipc_file().unwrap().write_all(&[SHOW_GUI]).ok();
|
||||||
|
})
|
||||||
|
.ok();
|
||||||
|
|
||||||
|
let s1 = send.clone();
|
||||||
|
tray.add_menu_item("Quit", move || {
|
||||||
|
let lock = s1.lock().unwrap();
|
||||||
|
lock.send(TrayToApp::Quit).ok();
|
||||||
|
})
|
||||||
|
.ok();
|
||||||
|
|
||||||
|
loop {
|
||||||
|
if let Ok(command) = recv_command.try_recv() {
|
||||||
|
match command {
|
||||||
|
AppToTray::DgpuStatus(s) => {
|
||||||
|
match s {
|
||||||
|
GfxPower::Active => tray.set_icon("gpu-nvidia"),
|
||||||
|
GfxPower::Suspended => tray.set_icon("gpu-integrated"),
|
||||||
|
GfxPower::Off => tray.set_icon("rog-control-center"),
|
||||||
|
GfxPower::AsusDisabled => tray.set_icon("gpu-integrated"),
|
||||||
|
GfxPower::AsusMuxDiscreet => tray.set_icon("gpu-nvidia"),
|
||||||
|
GfxPower::Unknown => tray.set_icon("gpu-integrated"),
|
||||||
|
}
|
||||||
|
.ok();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if gtk::events_pending() {
|
||||||
|
// This is blocking until any events are available
|
||||||
|
gtk::main_iteration();
|
||||||
|
} else {
|
||||||
|
// Don't spool at max speed if no gtk events
|
||||||
|
std::thread::sleep(Duration::from_millis(300));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
recv
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user