now creating submenus for the different configurations but not using them yet. also need to add checkmarks to the active ones

git-svn-id: http://apu.dw.local/svnusers/JoshHoltrop/pppc/trunk@58 8131a0b2-b21c-1c47-bd6a-f003126495bd
This commit is contained in:
joshholtrop 2009-08-25 17:01:06 +00:00
parent 16e33fafa7
commit 119f5a74b6
3 changed files with 51 additions and 12 deletions

View File

@ -29,6 +29,7 @@ class Config
Config(); Config();
void read(const char * file); void read(const char * file);
size_t num_entries() const { return entries.size(); }
protected: protected:
void reset(); void reset();

58
pppc.cc
View File

@ -18,6 +18,8 @@ using namespace std;
static LRESULT WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); static LRESULT WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
static HMENU g_popupMenu;
int WinMain( int WinMain(
HINSTANCE hInstance, HINSTANCE hInstance,
HINSTANCE hPrevInstance, HINSTANCE hPrevInstance,
@ -61,17 +63,13 @@ static LRESULT WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{ {
if (LOWORD(lParam) == WM_RBUTTONUP) if (LOWORD(lParam) == WM_RBUTTONUP)
{ {
HMENU hMenu = ::CreatePopupMenu();
addMenuItem(hMenu, "E&xit", 0);
POINT pos; POINT pos;
GetCursorPos(&pos); GetCursorPos(&pos);
::SetForegroundWindow(hWnd); ::SetForegroundWindow(hWnd);
::TrackPopupMenu(hMenu, 0, pos.x, pos.y, 0, hWnd, NULL); ::TrackPopupMenu(g_popupMenu, 0, pos.x, pos.y, 0, hWnd, NULL);
// BUGFIX: See "PRB: Menus for Notification Icons Don't Work Correctly" // BUGFIX: See "PRB: Menus for Notification Icons Don't Work Correctly"
::PostMessage(hWnd, WM_NULL, 0, 0); ::PostMessage(hWnd, WM_NULL, 0, 0);
::DestroyMenu(hMenu);
} }
} }
break; break;
@ -79,14 +77,14 @@ static LRESULT WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
return 0; return 0;
} }
void addMenuItem(HMENU hMenu, CHAR * itemstr, WORD id) void addMenuItem(HMENU hMenu, const CHAR * itemstr, WORD id)
{ {
MENUITEMINFO mii; MENUITEMINFO mii;
memset(&mii, 0, sizeof(mii)); memset(&mii, 0, sizeof(mii));
mii.cbSize = sizeof(mii); mii.cbSize = sizeof(mii);
mii.fMask = MIIM_STRING | MIIM_ID; mii.fMask = MIIM_STRING | MIIM_ID;
mii.wID = id; mii.wID = id;
mii.dwTypeData = itemstr; mii.dwTypeData = (CHAR *) itemstr;
mii.cch = strlen(mii.dwTypeData); mii.cch = strlen(mii.dwTypeData);
if (::InsertMenuItem(hMenu, 0, TRUE, &mii) == 0) if (::InsertMenuItem(hMenu, 0, TRUE, &mii) == 0)
{ {
@ -94,6 +92,24 @@ void addMenuItem(HMENU hMenu, CHAR * itemstr, WORD id)
} }
} }
HMENU addMenuSubMenu(HMENU hMenu, const CHAR * itemstr, WORD id)
{
HMENU submenu = ::CreatePopupMenu();
MENUITEMINFO mii;
memset(&mii, 0, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_STRING | MIIM_SUBMENU | MIIM_ID;
mii.wID = id;
mii.dwTypeData = (CHAR *) itemstr;
mii.cch = strlen(mii.dwTypeData);
mii.hSubMenu = submenu;
if (::InsertMenuItem(hMenu, 0, TRUE, &mii) == 0)
{
cerr << "Warning: InsertMenuItem(): " << GetLastError() << endl;
}
return submenu;
}
PPPC::PPPC(HINSTANCE hInstance, const char * config_file) PPPC::PPPC(HINSTANCE hInstance, const char * config_file)
{ {
m_pins = 0u; m_pins = 0u;
@ -142,6 +158,21 @@ PPPC::PPPC(HINSTANCE hInstance, const char * config_file)
cerr << "Warning: CreateWindow(): " << GetLastError() << endl; cerr << "Warning: CreateWindow(): " << GetLastError() << endl;
} }
/* Create the right-click icon context menu */
m_popupMenu = ::CreatePopupMenu();
g_popupMenu = m_popupMenu;
addMenuItem(m_popupMenu, "E&xit", 0);
for (int sz = m_config.num_entries(), i = 0; i < sz; i++)
{
int config_id = i + 1;
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);
}
/* Create the notify icon data */ /* Create the notify icon data */
memset(&m_nid, 0, sizeof(m_nid)); memset(&m_nid, 0, sizeof(m_nid));
m_nid.cbSize = sizeof(NOTIFYICONDATA); m_nid.cbSize = sizeof(NOTIFYICONDATA);
@ -211,7 +242,12 @@ BOOL PPPC::mainLoop()
PPPC::~PPPC() PPPC::~PPPC()
{ {
::DestroyMenu(m_popupMenu);
/* TODO: turned off temporarily for debugging. Re-enable! */
#if 0
event_exit(); event_exit();
#endif
/* delete the tray icon */ /* delete the tray icon */
Shell_NotifyIcon(NIM_DELETE, &m_nid); Shell_NotifyIcon(NIM_DELETE, &m_nid);
@ -222,7 +258,7 @@ PPPC::~PPPC()
void PPPC::event_start() void PPPC::event_start()
{ {
for (int sz = m_config.entries.size(), i = 0; i < sz; i++) for (int sz = m_config.num_entries(), i = 0; i < sz; i++)
{ {
switch (m_config.entries[i].on_start) switch (m_config.entries[i].on_start)
{ {
@ -241,7 +277,7 @@ void PPPC::event_start()
void PPPC::event_exit() void PPPC::event_exit()
{ {
for (int sz = m_config.entries.size(), i = 0; i < sz; i++) for (int sz = m_config.num_entries(), i = 0; i < sz; i++)
{ {
switch (m_config.entries[i].on_exit) switch (m_config.entries[i].on_exit)
{ {
@ -260,7 +296,7 @@ void PPPC::event_exit()
void PPPC::event_lock() void PPPC::event_lock()
{ {
for (int sz = m_config.entries.size(), i = 0; i < sz; i++) for (int sz = m_config.num_entries(), i = 0; i < sz; i++)
{ {
switch (m_config.entries[i].on_lock) switch (m_config.entries[i].on_lock)
{ {
@ -280,7 +316,7 @@ void PPPC::event_lock()
void PPPC::event_unlock() void PPPC::event_unlock()
{ {
for (int sz = m_config.entries.size(), i = 0; i < sz; i++) for (int sz = m_config.num_entries(), i = 0; i < sz; i++)
{ {
switch (m_config.entries[i].on_unlock) switch (m_config.entries[i].on_unlock)
{ {

4
pppc.h
View File

@ -26,9 +26,11 @@ class PPPC
NOTIFYICONDATA m_nid; NOTIFYICONDATA m_nid;
unsigned char m_pins; unsigned char m_pins;
unsigned char m_previous_pins; unsigned char m_previous_pins;
HMENU m_popupMenu;
}; };
/* non class-member functions */ /* non class-member functions */
void addMenuItem(HMENU hMenu, CHAR * itemstr, WORD id); void addMenuItem(HMENU hMenu, const CHAR * itemstr, WORD id);
HMENU addMenuSubMenu(HMENU hMenu, const CHAR * itemstr, WORD id);
#endif #endif