diff options
| -rw-r--r-- | Cargo.lock | 3 | ||||
| -rw-r--r-- | Cargo.toml | 19 | ||||
| -rw-r--r-- | src/main.rs | 16 | ||||
| -rw-r--r-- | src/tray.rs | 132 |
4 files changed, 112 insertions, 58 deletions
@@ -399,7 +399,7 @@ checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" [[package]] name = "elem" -version = "0.1.1" +version = "0.1.2" dependencies = [ "image", "lodepng", @@ -411,6 +411,7 @@ dependencies = [ "tao", "tungstenite", "url", + "winapi", ] [[package]] @@ -2,7 +2,7 @@ [package] name = "elem" -version = "0.1.1" +version = "0.1.2" authors = ["Fuwn <[email protected]>"] edition = "2021" description = "Logitech Battery Level Tray Indicator" @@ -19,13 +19,26 @@ codegen-units = 1 opt-level = 3 [dependencies] -url = "2.3.1" -serde_json = "1.0.91" +url = "2.3.1" # URL Implementation + +# Serialization serde = "1.0.151" serde_derive = "1.0.151" +serde_json = "1.0.91" + +# Image Generation and Manipulation lodepng = "3.7.2" image = "0.24.5" + +# Event Loop and System Tray tao = { version = "0.15.8", features = ["tray"] } + +# WebSocket Client tungstenite = "0.18.0" + +# Logging pretty_env_logger = "0.4.0" log = "0.4.17" + +# Windows API +winapi = { version = "0.3.9", features = ["winuser"] } diff --git a/src/main.rs b/src/main.rs index 307ece4..0a685bf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,12 +21,12 @@ unused, future_incompatible, rust_2018_idioms, - unsafe_code, clippy::all, clippy::nursery, clippy::pedantic )] #![recursion_limit = "128"] +#![windows_subsystem = "windows"] mod ascii_art; mod logitech; @@ -35,9 +35,15 @@ mod tray; #[macro_use] extern crate log; +use winapi::{um, um::winuser}; + fn main() { - std::env::set_var("RUST_LOG", "elem=trace"); - pretty_env_logger::init(); - info!("starting elem"); - tray::Tray::new(std::env::args().nth(1)).run(); + unsafe { + um::consoleapi::AllocConsole(); + winuser::ShowWindow(um::wincon::GetConsoleWindow(), winuser::SW_HIDE); + std::env::set_var("RUST_LOG", "elem=trace"); + pretty_env_logger::init(); + info!("starting elem"); + tray::Tray::new(std::env::args().nth(1)).run(); + } } diff --git a/src/tray.rs b/src/tray.rs index 5bd8ecc..a33d081 100644 --- a/src/tray.rs +++ b/src/tray.rs @@ -21,6 +21,7 @@ use tao::{ event::Event, event_loop::ControlFlow, menu, menu::CustomMenuItem, system_tray, system_tray::Icon, }; +use winapi::um::{wincon::GetConsoleWindow, winuser, winuser::ShowWindow}; const DEFAULT_UPDATE_FREQUENCY: u64 = 60000; @@ -241,6 +242,9 @@ impl Tray { menu }); + let mut log_window = + tray_menu.add_item(menu::MenuItemAttributes::new("Show Log Window")); + let mut log_window_state = false; let quit = tray_menu.add_item(menu::MenuItemAttributes::new("Quit")); let system_tray = Arc::new(Mutex::new( system_tray::SystemTrayBuilder::new( @@ -266,67 +270,97 @@ impl Tray { event_loop.run(move |event, _event_loop, control_flow| { *control_flow = ControlFlow::Wait; - if let Event::MenuEvent { - menu_id, - origin: menu::MenuType::ContextMenu, - .. - } = event - { - if menu_id == quit.clone().id() { - info!("quitting"); + match event { + Event::MenuEvent { + menu_id, + origin: menu::MenuType::ContextMenu, + .. + } => { + if menu_id == quit.clone().id() { + info!("quitting"); - *control_flow = ControlFlow::Exit; - } + *control_flow = ControlFlow::Exit; + } + + if menu_id == log_window.clone().id() { + if log_window_state { + unsafe { ShowWindow(GetConsoleWindow(), winuser::SW_HIDE) }; + + log_window.set_title("Show Log Window"); + trace!("hiding log window from intent"); - // Checking to see if a new device was selected - // - // If a new device was selected, update the icon and update the menu - // accordingly. - if devices.iter().any(|d| d.clone().id() == menu_id) { - for device in &mut devices { - if menu_id == device.clone().id() { - debug!("selected device: {}", device.clone().title()); - device.set_selected(true); - // Ellipsis icon to indicate background process - system_tray - .lock() - .unwrap() - .set_icon(Self::force_icon("80085")); - trace!("updating system tray icon from intent"); - - // If the selected device is the dummy device, set a dummy icon - if device.0.title() == "Dummy (Debug)" { + log_window_state = false; + } else { + unsafe { ShowWindow(GetConsoleWindow(), winuser::SW_SHOW) }; + + log_window.set_title("Hide Log Window"); + trace!("showing log window from intent"); + + log_window_state = true; + } + } + + // Checking to see if a new device was selected + // + // If a new device was selected, update the icon and update the menu + // accordingly. + if devices.iter().any(|d| d.clone().id() == menu_id) { + for device in &mut devices { + if menu_id == device.clone().id() { + debug!("selected device: {}", device.clone().title()); + device.set_selected(true); + // Ellipsis icon to indicate background process system_tray .lock() .unwrap() - .set_icon(Self::force_icon("43770")); - } else { + .set_icon(Self::force_icon("80085")); + trace!("updating system tray icon from intent"); + + // If the selected device is the dummy device, set a dummy icon + if device.0.title() == "Dummy (Debug)" { + system_tray + .lock() + .unwrap() + .set_icon(Self::force_icon("43770")); + } else { + system_tray + .lock() + .unwrap() + .set_icon(Self::icon(&Some(device.0.title()))); + } + + trace!("updated system tray icon from intent"); + system_tray.lock().unwrap().set_tooltip(&format!( + "elem (updating {} from intent)", + device.0.title() + )); + local_self.lock().unwrap().selected_device_display_name = + Some(device.0.title()); system_tray .lock() .unwrap() - .set_icon(Self::icon(&Some(device.0.title()))); + .set_tooltip(&format!("elem ({})", device.0.title())); + info!( + "completed device selection ({}) and associated tasks", + device.0.title() + ); + } else { + device.set_selected(false); } - - trace!("updated system tray icon from intent"); - system_tray.lock().unwrap().set_tooltip(&format!( - "elem (updating {} from intent)", - device.0.title() - )); - local_self.lock().unwrap().selected_device_display_name = - Some(device.0.title()); - system_tray - .lock() - .unwrap() - .set_tooltip(&format!("elem ({})", device.0.title())); - info!( - "completed device selection ({}) and associated tasks", - device.0.title() - ); - } else { - device.set_selected(false); } } } + Event::TrayEvent { id, event, .. } => { + if id == main_tray_id + && event == tao::event::TrayEvent::LeftClick + && !log_window_state + { + unsafe { ShowWindow(GetConsoleWindow(), winuser::SW_SHOW) }; + + trace!("showing log window from tray event"); + } + } + _ => {} } }); } |