From 7469c415413031ca7a37c352fce2c9dc6035e65b Mon Sep 17 00:00:00 2001 From: Reinder Feenstra Date: Wed, 11 May 2022 00:00:46 +0200 Subject: [PATCH] trayicon: added restart and show/hide console option to popupmenu --- server/src/main.cpp | 2 +- server/src/os/windows/trayicon.cpp | 39 +++++++++++++++++++++++++----- server/src/os/windows/trayicon.hpp | 10 +++++--- 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/server/src/main.cpp b/server/src/main.cpp index 8662df14..d1de9a71 100644 --- a/server/src/main.cpp +++ b/server/src/main.cpp @@ -146,7 +146,7 @@ int main(int argc, char* argv[]) if(options.tray) { Windows::setConsoleWindowVisible(false); - enableConsoleLogger = false; + enableConsoleLogger = Windows::hasConsoleWindow(); } #endif diff --git a/server/src/os/windows/trayicon.cpp b/server/src/os/windows/trayicon.cpp index 74411f40..3c70a413 100644 --- a/server/src/os/windows/trayicon.cpp +++ b/server/src/os/windows/trayicon.cpp @@ -24,6 +24,7 @@ #include #include #include +#include "consolewindow.hpp" #include "../../core/eventloop.hpp" #include "../../traintastic/traintastic.hpp" @@ -70,7 +71,10 @@ void TrayIcon::run() // create menu: s_menu = CreatePopupMenu(); - menuAddItem(MenuItem::Quit, "Quit"); + menuAddItem(MenuItem::ShowHideConsole, "Show/hide console", hasConsoleWindow()); + menuAddSeperator(); + menuAddItem(MenuItem::Restart, "Restart"); + menuAddItem(MenuItem::Shutdown, "Shutdown"); // setup tray icon: static NOTIFYICONDATA notifyIconData; @@ -143,20 +147,32 @@ LRESULT CALLBACK TrayIcon::windowProc(_In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARA case WM_COMMAND: switch(static_cast(wParam)) { - case MenuItem::Quit: + case MenuItem::Shutdown: EventLoop::call( []() { Traintastic::instance->exit(); }); return 0; + + case MenuItem::Restart: + EventLoop::call( + []() + { + Traintastic::instance->restart(); + }); + return 0; + + case MenuItem::ShowHideConsole: + setConsoleWindowVisible(!isConsoleWindowVisible()); + return 0; } break; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } -void TrayIcon::menuAddItem(MenuItem id, const std::string& text) +void TrayIcon::menuAddItem(MenuItem id, const LPSTR text, bool enabled) { assert(s_menu); MENUITEMINFO item; @@ -164,10 +180,21 @@ void TrayIcon::menuAddItem(MenuItem id, const std::string& text) item.cbSize = sizeof(item); item.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; item.fType = 0; - item.fState = 0; + item.fState = enabled ? MFS_ENABLED : MFS_DISABLED; item.wID = static_cast(id); - item.dwTypeData = const_cast(text.c_str()); - InsertMenuItem(s_menu, 0, TRUE, &item); + item.dwTypeData = const_cast(text); + InsertMenuItem(s_menu, GetMenuItemCount(s_menu), TRUE, &item); +} + +void TrayIcon::menuAddSeperator() +{ + assert(s_menu); + MENUITEMINFO item; + memset(&item, 0, sizeof(item)); + item.cbSize = sizeof(item); + item.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; + item.fType = MFT_SEPARATOR; + InsertMenuItem(s_menu, GetMenuItemCount(s_menu), TRUE, &item); } } diff --git a/server/src/os/windows/trayicon.hpp b/server/src/os/windows/trayicon.hpp index 96d4122b..f5154699 100644 --- a/server/src/os/windows/trayicon.hpp +++ b/server/src/os/windows/trayicon.hpp @@ -3,7 +3,7 @@ * * This file is part of the traintastic source code. * - * Copyright (C) 2021 Reinder Feenstra + * Copyright (C) 2021-2022 Reinder Feenstra * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -29,7 +29,6 @@ #define _WINSOCKAPI_ // prevent windows.h including winsock.h #include #undef _WINSOCKAPI_ -//#include namespace Windows { @@ -41,7 +40,9 @@ class TrayIcon protected: enum class MenuItem : UINT { - Quit = 1, + Shutdown = 1, + Restart = 2, + ShowHideConsole = 3, }; static constexpr UINT WM_NOTIFYICON_CALLBACK = WM_USER + 1; @@ -53,7 +54,8 @@ class TrayIcon static void run(); static LRESULT CALLBACK windowProc(_In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam); - static void menuAddItem(MenuItem id, const std::string& text); + static void menuAddItem(MenuItem id, const LPSTR text, bool enabled = true); + static void menuAddSeperator(); public: static void add();