diff --git a/pppc.cc b/pppc.cc index d21705d..59693ee 100644 --- a/pppc.cc +++ b/pppc.cc @@ -17,6 +17,8 @@ using namespace std; (((var) >> (position)) & 0x1) static LRESULT WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); +const char * PPPC::ConfigEntryCaptions[3] = + {"Auto", "Manual: Off", "Manual: On"}; static HMENU g_popupMenu; @@ -110,6 +112,26 @@ HMENU addMenuSubMenu(HMENU hMenu, const CHAR * itemstr, WORD id) return submenu; } +void updateMenuInfo(HMENU hMenu, int index, const CHAR * itemstr, WORD id, bool checked) +{ + MENUITEMINFO mii; + memset(&mii, 0, sizeof(mii)); + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_STRING | MIIM_ID; + if (checked) + { + mii.fMask |= MIIM_STATE; + mii.fState = MFS_CHECKED; + } + mii.wID = id; + mii.dwTypeData = (CHAR *) itemstr; + mii.cch = strlen(mii.dwTypeData); + if (::SetMenuItemInfo(hMenu, index, TRUE, &mii) == 0) + { + cerr << "Warning: InsertMenuItem(): " << GetLastError() << endl; + } +} + PPPC::PPPC(HINSTANCE hInstance, const char * config_file) { m_pins = 0u; @@ -168,9 +190,12 @@ PPPC::PPPC(HINSTANCE hInstance, const char * config_file) HMENU submenu = addMenuSubMenu(m_popupMenu, m_config.entries[i].name.c_str(), (config_id << 8)); - addMenuItem(submenu, "Auto", (config_id << 8) | 0x1); - addMenuItem(submenu, "Manual: Off", (config_id << 8) | 0x2); - addMenuItem(submenu, "Manual: On", (config_id << 8) | 0x3); + addMenuItem(submenu, ConfigEntryCaptions[0], (config_id << 8) | 0x1); + addMenuItem(submenu, ConfigEntryCaptions[1], (config_id << 8) | 0x2); + addMenuItem(submenu, ConfigEntryCaptions[2], (config_id << 8) | 0x3); + m_menus.push_back(submenu); + m_modes.push_back(AUTO); + updateConfigMenus(i); } /* Create the notify icon data */ @@ -193,6 +218,15 @@ PPPC::PPPC(HINSTANCE hInstance, const char * config_file) session_notification_enable(m_hWnd); } +void PPPC::updateConfigMenus(int i) +{ + for (int index = 0; index < 3; index++) + { + updateMenuInfo(m_menus[i], index, ConfigEntryCaptions[index], + (((i + 1) << 8) | (index + 1)), index == m_modes[i]); + } +} + BOOL PPPC::mainLoop() { BOOL bRet; diff --git a/pppc.h b/pppc.h index 62d7c92..26aa7be 100644 --- a/pppc.h +++ b/pppc.h @@ -3,6 +3,7 @@ #define PPPC_H #include "Config.h" +#include #define APP_NAME "Parallel Port Power Controller" #define WM_ICON_NOTIFY (WM_APP + 42) @@ -10,6 +11,9 @@ class PPPC { public: + enum ConfigEntryMode { AUTO, MANUAL_OFF, MANUAL_ON }; + static const char * ConfigEntryCaptions[3]; + PPPC(HINSTANCE hInstance, const char * config_file = NULL); ~PPPC(); BOOL mainLoop(); @@ -20,6 +24,7 @@ class PPPC void event_lock(); void event_unlock(); void update_pins(); + void updateConfigMenus(int i); Config m_config; HWND m_hWnd; @@ -27,10 +32,13 @@ class PPPC unsigned char m_pins; unsigned char m_previous_pins; HMENU m_popupMenu; + std::vector m_menus; + std::vector m_modes; }; /* non class-member functions */ void addMenuItem(HMENU hMenu, const CHAR * itemstr, WORD id); HMENU addMenuSubMenu(HMENU hMenu, const CHAR * itemstr, WORD id); +void updateMenuInfo(HMENU hMenu, int index, const CHAR * itemstr, WORD id, bool checked); #endif