From 9b4b68452e69f9ca59af4d251b0bb147330d4a0c Mon Sep 17 00:00:00 2001 From: Fuwn Date: Thu, 29 Dec 2022 09:55:35 +0000 Subject: feat: hide/show log window --- src/main.rs | 16 +++++--- src/tray.rs | 132 ++++++++++++++++++++++++++++++++++++++---------------------- 2 files changed, 94 insertions(+), 54 deletions(-) (limited to 'src') 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"); + } + } + _ => {} } }); } -- cgit v1.2.3