From 40e7617ecc84332b632a4adca775d695a537d7c5 Mon Sep 17 00:00:00 2001 From: spx Date: Wed, 3 Oct 2012 14:59:49 -0700 Subject: [PATCH] - Fixed that invalid skin context action is executed when executing action from tray context menu. - Minor tweaks. --- Library/MeterWindow.cpp | 4 +-- Library/Rainmeter.cpp | 53 +++++++++++++++++++--------------- Library/TrayWindow.cpp | 63 ++++++++++++++++++++++------------------- 3 files changed, 66 insertions(+), 54 deletions(-) diff --git a/Library/MeterWindow.cpp b/Library/MeterWindow.cpp index d5a451a9..5a4e89cd 100644 --- a/Library/MeterWindow.cpp +++ b/Library/MeterWindow.cpp @@ -3344,14 +3344,14 @@ LRESULT CMeterWindow::OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam) int position = (int)wParam - IDM_SKIN_CUSTOMCONTEXTMENU_FIRST + 1; if (position == 1) { - action = m_Parser.ReadString(L"Rainmeter", L"ContextAction", L""); + action = m_Parser.ReadString(L"Rainmeter", L"ContextAction", L"", false); } else { WCHAR buffer[128]; _snwprintf_s(buffer, _TRUNCATE, L"ContextAction%i", position); - action = m_Parser.ReadString(L"Rainmeter", buffer, L""); + action = m_Parser.ReadString(L"Rainmeter", buffer, L"", false); } if (!action.empty()) diff --git a/Library/Rainmeter.cpp b/Library/Rainmeter.cpp index 99bf3cea..128655ac 100644 --- a/Library/Rainmeter.cpp +++ b/Library/Rainmeter.cpp @@ -3160,7 +3160,7 @@ HMENU CRainmeter::CreateSkinMenu(CMeterWindow* meterWindow, int index, HMENU men } } - // Add custom actions to the context menu. + // Add custom actions to the context menu if (meterWindow->HasCustomContextMenu()) { // Read context menu titles (also read the actions) @@ -3170,14 +3170,14 @@ HMENU CRainmeter::CreateSkinMenu(CMeterWindow* meterWindow, int index, HMENU men WCHAR buffer[128]; int i = 1; - while(!contextTitle.empty() && - (!contextAction.empty() || _wcsicmp(contextTitle.c_str(), L"SEPARATOR") == 0) && - (IDM_SKIN_CUSTOMCONTEXTMENU_FIRST + i - 1) <= IDM_SKIN_CUSTOMCONTEXTMENU_LAST) // Set maximum context items in resource.h + while (!contextTitle.empty() && + (!contextAction.empty() || _wcsicmp(contextTitle.c_str(), L"SEPARATOR") == 0) && + (IDM_SKIN_CUSTOMCONTEXTMENU_FIRST + i - 1) <= IDM_SKIN_CUSTOMCONTEXTMENU_LAST) // Set maximum context items in resource.h { // Trim long titles if (contextTitle.size() > 30) { - contextTitle = contextTitle.substr(0, 27) + L"..."; + contextTitle.replace(27, contextTitle.size() - 27, L"..."); } cTitles.push_back(contextTitle); @@ -3192,7 +3192,7 @@ HMENU CRainmeter::CreateSkinMenu(CMeterWindow* meterWindow, int index, HMENU men size_t titleSize = cTitles.size(); if (titleSize <= 3) { - for (size_t i = 0; i < titleSize; i++) + for (size_t i = 0; i < titleSize; ++i) { if (_wcsicmp(cTitles[i].c_str(), L"SEPARATOR") == 0) { @@ -3200,7 +3200,7 @@ HMENU CRainmeter::CreateSkinMenu(CMeterWindow* meterWindow, int index, HMENU men } else { - InsertMenu(skinMenu, i + 1, MF_BYPOSITION | MF_STRING, IDM_SKIN_CUSTOMCONTEXTMENU_FIRST + i, cTitles[i].c_str()); + InsertMenu(skinMenu, i + 1, MF_BYPOSITION | MF_STRING, (index << 16) | (IDM_SKIN_CUSTOMCONTEXTMENU_FIRST + i), cTitles[i].c_str()); } } } @@ -3209,7 +3209,7 @@ HMENU CRainmeter::CreateSkinMenu(CMeterWindow* meterWindow, int index, HMENU men HMENU customMenu = CreatePopupMenu(); InsertMenu(skinMenu, 1, MF_BYPOSITION | MF_POPUP, (UINT_PTR)customMenu, L"Skin Actions"); - for (size_t i = 0; i < titleSize; i++) + for (size_t i = 0; i < titleSize; ++i) { if (_wcsicmp(cTitles[i].c_str(), L"SEPARATOR") == 0) { @@ -3217,7 +3217,7 @@ HMENU CRainmeter::CreateSkinMenu(CMeterWindow* meterWindow, int index, HMENU men } else { - AppendMenu(customMenu, MF_BYPOSITION | MF_STRING, IDM_SKIN_CUSTOMCONTEXTMENU_FIRST + i, cTitles[i].c_str()); + AppendMenu(customMenu, MF_BYPOSITION | MF_STRING, (index << 16) | (IDM_SKIN_CUSTOMCONTEXTMENU_FIRST + i), cTitles[i].c_str()); } } } @@ -3289,22 +3289,29 @@ void CRainmeter::CreateMonitorMenu(HMENU monitorMenu, CMeterWindow* meterWindow) void CRainmeter::ChangeSkinIndex(HMENU menu, int index) { - int count = GetMenuItemCount(menu); - - for (int i = 0; i < count; ++i) + if (index > 0) { - HMENU subMenu = GetSubMenu(menu, i); - if (subMenu) + int count = GetMenuItemCount(menu); + + for (int i = 0; i < count; ++i) { - ChangeSkinIndex(subMenu, index); - } - else - { - WCHAR buffer[256]; - GetMenuString(menu, i, buffer, 256, MF_BYPOSITION); - UINT id = GetMenuItemID(menu, i); - UINT flags = GetMenuState(menu, i, MF_BYPOSITION); - ModifyMenu(menu, i, MF_BYPOSITION | flags, id | (index << 16), buffer); + HMENU subMenu = GetSubMenu(menu, i); + if (subMenu) + { + ChangeSkinIndex(subMenu, index); + } + else + { + MENUITEMINFO mii = {sizeof(MENUITEMINFO)}; + mii.fMask = MIIM_FTYPE | MIIM_ID; + GetMenuItemInfo(menu, i, TRUE, &mii); + if ((mii.fType & MFT_SEPARATOR) == 0) + { + mii.wID |= (index << 16); + mii.fMask = MIIM_ID; + SetMenuItemInfo(menu, i, TRUE, &mii); + } + } } } } diff --git a/Library/TrayWindow.cpp b/Library/TrayWindow.cpp index 31b84e06..2fe22869 100644 --- a/Library/TrayWindow.cpp +++ b/Library/TrayWindow.cpp @@ -509,41 +509,46 @@ LRESULT CALLBACK CTrayWindow::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA { Rainmeter->OpenSkinFolder(); } - else if ((wParam & 0x0ffff) >= ID_THEME_FIRST && (wParam & 0x0ffff) <= ID_THEME_LAST) - { - int pos = (wParam & 0x0ffff) - ID_THEME_FIRST; - - const std::vector& layouts = Rainmeter->GetAllLayouts(); - if (pos >= 0 && pos < (int)layouts.size()) - { - Rainmeter->LoadLayout(layouts[pos]); - } - } - else if ((wParam & 0x0ffff) >= ID_CONFIG_FIRST && (wParam & 0x0ffff) <= ID_CONFIG_LAST) - { - std::pair indexes = Rainmeter->GetMeterWindowIndex((UINT)(wParam & 0x0ffff)); - if (indexes.first != -1 && indexes.second != -1) - { - Rainmeter->ToggleSkin(indexes.first, indexes.second); - } - } else { - // Forward the message to correct window - int index = (int)(wParam >> 16); - const std::map& windows = Rainmeter->GetAllMeterWindows(); + UINT mID = wParam & 0x0FFFF; - if (index < (int)windows.size()) + if (mID >= ID_THEME_FIRST && mID <= ID_THEME_LAST) { - std::map::const_iterator iter = windows.begin(); - for ( ; iter != windows.end(); ++iter) + int pos = mID - ID_THEME_FIRST; + + const std::vector& layouts = Rainmeter->GetAllLayouts(); + if (pos >= 0 && pos < (int)layouts.size()) { - --index; - if (index < 0) + Rainmeter->LoadLayout(layouts[pos]); + } + } + else if (mID >= ID_CONFIG_FIRST && mID <= ID_CONFIG_LAST) + { + std::pair indexes = Rainmeter->GetMeterWindowIndex(mID); + if (indexes.first != -1 && indexes.second != -1) + { + Rainmeter->ToggleSkin(indexes.first, indexes.second); + } + } + else + { + // Forward the message to correct window + int index = (int)(wParam >> 16); + const std::map& windows = Rainmeter->GetAllMeterWindows(); + + if (index < (int)windows.size()) + { + std::map::const_iterator iter = windows.begin(); + for ( ; iter != windows.end(); ++iter) { - CMeterWindow* meterWindow = (*iter).second; - SendMessage(meterWindow->GetWindow(), WM_COMMAND, wParam & 0x0FFFF, NULL); - break; + --index; + if (index < 0) + { + CMeterWindow* meterWindow = (*iter).second; + SendMessage(meterWindow->GetWindow(), WM_COMMAND, mID, NULL); + break; + } } } }