trayicon: added restart and show/hide console option to popupmenu

Dieser Commit ist enthalten in:
Reinder Feenstra 2022-05-11 00:00:46 +02:00
Ursprung c7b1c35f21
Commit 7469c41541
3 geänderte Dateien mit 40 neuen und 11 gelöschten Zeilen

Datei anzeigen

@ -146,7 +146,7 @@ int main(int argc, char* argv[])
if(options.tray)
{
Windows::setConsoleWindowVisible(false);
enableConsoleLogger = false;
enableConsoleLogger = Windows::hasConsoleWindow();
}
#endif

Datei anzeigen

@ -24,6 +24,7 @@
#include <cassert>
#include <version.hpp>
#include <traintastic/codename.hpp>
#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<MenuItem>(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<UINT>(id);
item.dwTypeData = const_cast<LPSTR>(text.c_str());
InsertMenuItem(s_menu, 0, TRUE, &item);
item.dwTypeData = const_cast<LPSTR>(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);
}
}

Datei anzeigen

@ -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 <windows.h>
#undef _WINSOCKAPI_
//#include <shellapi.h>
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();