mirror of
https://github.com/chibicitiberiu/rainmeter-studio.git
synced 2024-02-24 04:33:31 +00:00
- Added config's root menu.
- Fixed a small issue on creating menu cache. - Added workaround that the context menu is shown repeatedly by using menu bangs.
This commit is contained in:
parent
5366da997d
commit
eb536cde54
@ -1948,14 +1948,19 @@ int CRainmeter::ScanForConfigsRecursive(std::wstring& path, std::wstring base, i
|
|||||||
{
|
{
|
||||||
if(hSearchIni == INVALID_HANDLE_VALUE) break; // No more files found
|
if(hSearchIni == INVALID_HANDLE_VALUE) break; // No more files found
|
||||||
|
|
||||||
CONFIGMENU menuItem;
|
// Check whether the extension is ".ini"
|
||||||
menuItem.name = fileDataIni.cFileName;
|
std::wstring ext = fileDataIni.cFileName;
|
||||||
menuItem.index = m_ConfigStrings.size();
|
std::wstring::size_type pos = ext.find_last_of(L'.');
|
||||||
menu.push_back(menuItem);
|
if (pos != std::wstring::npos && wcsicmp(&(ext.c_str()[pos]), L".ini") == 0)
|
||||||
|
{
|
||||||
config.iniFiles.push_back(fileDataIni.cFileName);
|
CONFIGMENU menuItem;
|
||||||
config.commands.push_back(ID_CONFIG_FIRST + index++);
|
menuItem.name = fileDataIni.cFileName;
|
||||||
|
menuItem.index = m_ConfigStrings.size();
|
||||||
|
menu.push_back(menuItem);
|
||||||
|
|
||||||
|
config.iniFiles.push_back(fileDataIni.cFileName);
|
||||||
|
config.commands.push_back(ID_CONFIG_FIRST + index++);
|
||||||
|
}
|
||||||
} while (FindNextFile(hSearchIni, &fileDataIni));
|
} while (FindNextFile(hSearchIni, &fileDataIni));
|
||||||
|
|
||||||
if (!config.iniFiles.empty())
|
if (!config.iniFiles.empty())
|
||||||
@ -1988,6 +1993,12 @@ int CRainmeter::ScanForConfigsRecursive(std::wstring& path, std::wstring base, i
|
|||||||
{
|
{
|
||||||
std::vector<CONFIGMENU>::iterator iter = menu.end() - 1;
|
std::vector<CONFIGMENU>::iterator iter = menu.end() - 1;
|
||||||
index = ScanForConfigsRecursive(path, base + fileData.cFileName, index, (*iter).children, false);
|
index = ScanForConfigsRecursive(path, base + fileData.cFileName, index, (*iter).children, false);
|
||||||
|
|
||||||
|
// Remove menu item if it has no child
|
||||||
|
if ((*iter).children.empty())
|
||||||
|
{
|
||||||
|
menu.erase(iter);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} while(FindNextFile(hSearch, &fileData));
|
} while(FindNextFile(hSearch, &fileData));
|
||||||
@ -2856,111 +2867,122 @@ PLATFORM CRainmeter::IsNT()
|
|||||||
*/
|
*/
|
||||||
void CRainmeter::ShowContextMenu(POINT pos, CMeterWindow* meterWindow)
|
void CRainmeter::ShowContextMenu(POINT pos, CMeterWindow* meterWindow)
|
||||||
{
|
{
|
||||||
// Show context menu, if no actions were executed
|
static bool active = false;
|
||||||
HMENU menu = LoadMenu(m_Instance, MAKEINTRESOURCE(IDR_CONTEXT_MENU));
|
|
||||||
|
|
||||||
if(menu)
|
if (!active)
|
||||||
{
|
{
|
||||||
HMENU subMenu = GetSubMenu(menu, 0);
|
active = true;
|
||||||
if(subMenu)
|
|
||||||
{
|
|
||||||
if (!GetDummyLitestep())
|
|
||||||
{
|
|
||||||
// Disable Quit if ran as a Litestep plugin
|
|
||||||
EnableMenuItem(subMenu, ID_CONTEXT_QUIT, MF_BYCOMMAND | MF_GRAYED);
|
|
||||||
EnableMenuItem(subMenu, ID_CONTEXT_SHOWLOGFILE, MF_BYCOMMAND | MF_GRAYED);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_waccess(m_LogFile.c_str(), 0) == -1)
|
// Show context menu, if no actions were executed
|
||||||
|
HMENU menu = LoadMenu(m_Instance, MAKEINTRESOURCE(IDR_CONTEXT_MENU));
|
||||||
|
|
||||||
|
if(menu)
|
||||||
|
{
|
||||||
|
HMENU subMenu = GetSubMenu(menu, 0);
|
||||||
|
if(subMenu)
|
||||||
{
|
{
|
||||||
EnableMenuItem(subMenu, ID_CONTEXT_SHOWLOGFILE, MF_BYCOMMAND | MF_GRAYED);
|
if (!GetDummyLitestep())
|
||||||
EnableMenuItem(subMenu, ID_CONTEXT_DELETELOGFILE, MF_BYCOMMAND | MF_GRAYED);
|
|
||||||
EnableMenuItem(subMenu, ID_CONTEXT_STOPLOG, MF_BYCOMMAND | MF_GRAYED);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (m_Logging)
|
|
||||||
{
|
{
|
||||||
EnableMenuItem(subMenu, ID_CONTEXT_STARTLOG, MF_BYCOMMAND | MF_GRAYED);
|
// Disable Quit if ran as a Litestep plugin
|
||||||
|
EnableMenuItem(subMenu, ID_CONTEXT_QUIT, MF_BYCOMMAND | MF_GRAYED);
|
||||||
|
EnableMenuItem(subMenu, ID_CONTEXT_SHOWLOGFILE, MF_BYCOMMAND | MF_GRAYED);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_waccess(m_LogFile.c_str(), 0) == -1)
|
||||||
|
{
|
||||||
|
EnableMenuItem(subMenu, ID_CONTEXT_SHOWLOGFILE, MF_BYCOMMAND | MF_GRAYED);
|
||||||
|
EnableMenuItem(subMenu, ID_CONTEXT_DELETELOGFILE, MF_BYCOMMAND | MF_GRAYED);
|
||||||
|
EnableMenuItem(subMenu, ID_CONTEXT_STOPLOG, MF_BYCOMMAND | MF_GRAYED);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
EnableMenuItem(subMenu, ID_CONTEXT_STOPLOG, MF_BYCOMMAND | MF_GRAYED);
|
if (m_Logging)
|
||||||
|
{
|
||||||
|
EnableMenuItem(subMenu, ID_CONTEXT_STARTLOG, MF_BYCOMMAND | MF_GRAYED);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
EnableMenuItem(subMenu, ID_CONTEXT_STOPLOG, MF_BYCOMMAND | MF_GRAYED);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (c_Debug)
|
if (c_Debug)
|
||||||
{
|
|
||||||
CheckMenuItem(subMenu, ID_CONTEXT_DEBUGLOG, MF_BYCOMMAND | MF_CHECKED);
|
|
||||||
}
|
|
||||||
|
|
||||||
HMENU configMenu = CreateConfigMenu(m_ConfigMenu);
|
|
||||||
if (configMenu)
|
|
||||||
{
|
|
||||||
AppendMenu(configMenu, MF_SEPARATOR, 0, NULL);
|
|
||||||
AppendMenu(configMenu, 0, ID_CONTEXT_OPENSKINSFOLDER, L"Open Skins\' Folder");
|
|
||||||
AppendMenu(configMenu, 0, ID_CONTEXT_MANAGESKINS, L"Manage Skins...");
|
|
||||||
|
|
||||||
InsertMenu(subMenu, 3, MF_BYPOSITION | MF_POPUP, (UINT_PTR)configMenu, L"Configs");
|
|
||||||
}
|
|
||||||
|
|
||||||
HMENU themeMenu = CreateThemeMenu();
|
|
||||||
if (themeMenu)
|
|
||||||
{
|
|
||||||
InsertMenu(subMenu, 4, MF_BYPOSITION | MF_POPUP, (UINT_PTR)themeMenu, L"Themes");
|
|
||||||
InsertMenu(subMenu, 5, MF_BYPOSITION | MF_SEPARATOR, 0, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (meterWindow)
|
|
||||||
{
|
|
||||||
HMENU rainmeterMenu = subMenu;
|
|
||||||
subMenu = CreateSkinMenu(meterWindow, 0);
|
|
||||||
InsertMenu(subMenu, 7, MF_BYPOSITION | MF_SEPARATOR, 0, NULL);
|
|
||||||
InsertMenu(subMenu, 8, MF_BYPOSITION | MF_POPUP, (UINT_PTR)rainmeterMenu, L"Rainmeter Menu");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
InsertMenu(subMenu, 11, MF_BYPOSITION | MF_SEPARATOR, 0, NULL);
|
|
||||||
|
|
||||||
// Create a menu for all active configs
|
|
||||||
std::map<std::wstring, CMeterWindow*>::const_iterator iter = Rainmeter->GetAllMeterWindows().begin();
|
|
||||||
|
|
||||||
int index = 0;
|
|
||||||
for (; iter != Rainmeter->GetAllMeterWindows().end(); ++iter)
|
|
||||||
{
|
{
|
||||||
CMeterWindow* mw = ((*iter).second);
|
CheckMenuItem(subMenu, ID_CONTEXT_DEBUGLOG, MF_BYCOMMAND | MF_CHECKED);
|
||||||
HMENU skinMenu = CreateSkinMenu(mw, index);
|
|
||||||
InsertMenu(subMenu, 11, MF_BYPOSITION | MF_POPUP, (UINT_PTR)skinMenu, mw->GetSkinName().c_str());
|
|
||||||
++index;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Put Update notifications in the Tray menu
|
HMENU configMenu = CreateConfigMenu(m_ConfigMenu);
|
||||||
if (m_NewVersion)
|
if (configMenu)
|
||||||
{
|
{
|
||||||
InsertMenu(subMenu, 0, MF_BYPOSITION, ID_CONTEXT_NEW_VERSION, L"New Version Available");
|
AppendMenu(configMenu, MF_SEPARATOR, 0, NULL);
|
||||||
InsertMenu(subMenu, 1, MF_BYPOSITION | MF_SEPARATOR, 0, NULL);
|
AppendMenu(configMenu, 0, ID_CONTEXT_OPENSKINSFOLDER, L"Open Skins\' Folder");
|
||||||
SetMenuDefaultItem(subMenu, ID_CONTEXT_NEW_VERSION, MF_BYCOMMAND);
|
AppendMenu(configMenu, 0, ID_CONTEXT_MANAGESKINS, L"Manage Skins...");
|
||||||
|
|
||||||
|
InsertMenu(subMenu, 3, MF_BYPOSITION | MF_POPUP, (UINT_PTR)configMenu, L"Configs");
|
||||||
|
}
|
||||||
|
|
||||||
|
HMENU themeMenu = CreateThemeMenu();
|
||||||
|
if (themeMenu)
|
||||||
|
{
|
||||||
|
InsertMenu(subMenu, 4, MF_BYPOSITION | MF_POPUP, (UINT_PTR)themeMenu, L"Themes");
|
||||||
|
InsertMenu(subMenu, 5, MF_BYPOSITION | MF_SEPARATOR, 0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (meterWindow)
|
||||||
|
{
|
||||||
|
HMENU rainmeterMenu = subMenu;
|
||||||
|
subMenu = CreateSkinMenu(meterWindow, 0, configMenu);
|
||||||
|
InsertMenu(subMenu, 9, MF_BYPOSITION | MF_SEPARATOR, 0, NULL);
|
||||||
|
InsertMenu(subMenu, 10, MF_BYPOSITION | MF_POPUP, (UINT_PTR)rainmeterMenu, L"Rainmeter Menu");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
InsertMenu(subMenu, 11, MF_BYPOSITION | MF_SEPARATOR, 0, NULL);
|
||||||
|
|
||||||
|
// Create a menu for all active configs
|
||||||
|
std::map<std::wstring, CMeterWindow*>::const_iterator iter = Rainmeter->GetAllMeterWindows().begin();
|
||||||
|
|
||||||
|
int index = 0;
|
||||||
|
for (; iter != Rainmeter->GetAllMeterWindows().end(); ++iter)
|
||||||
|
{
|
||||||
|
CMeterWindow* mw = ((*iter).second);
|
||||||
|
HMENU skinMenu = CreateSkinMenu(mw, index, configMenu);
|
||||||
|
InsertMenu(subMenu, 11, MF_BYPOSITION | MF_POPUP, (UINT_PTR)skinMenu, mw->GetSkinName().c_str());
|
||||||
|
++index;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Put Update notifications in the Tray menu
|
||||||
|
if (m_NewVersion)
|
||||||
|
{
|
||||||
|
InsertMenu(subMenu, 0, MF_BYPOSITION, ID_CONTEXT_NEW_VERSION, L"New Version Available");
|
||||||
|
InsertMenu(subMenu, 1, MF_BYPOSITION | MF_SEPARATOR, 0, NULL);
|
||||||
|
SetMenuDefaultItem(subMenu, ID_CONTEXT_NEW_VERSION, MF_BYCOMMAND);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HWND hwnd = meterWindow ? meterWindow->GetWindow() : m_TrayWindow->GetWindow();
|
||||||
|
SetForegroundWindow(hwnd);
|
||||||
|
TrackPopupMenu(
|
||||||
|
subMenu,
|
||||||
|
TPM_RIGHTBUTTON | TPM_LEFTALIGN,
|
||||||
|
pos.x,
|
||||||
|
pos.y,
|
||||||
|
0,
|
||||||
|
hwnd,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
PostMessage(hwnd, WM_NULL, 0L, 0L);
|
||||||
|
|
||||||
|
if (meterWindow)
|
||||||
|
{
|
||||||
|
DestroyMenu(subMenu);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DestroyMenu(menu);
|
||||||
TrackPopupMenu(
|
|
||||||
subMenu,
|
|
||||||
TPM_RIGHTBUTTON | TPM_LEFTALIGN,
|
|
||||||
pos.x,
|
|
||||||
pos.y,
|
|
||||||
0,
|
|
||||||
meterWindow ? meterWindow->GetWindow() : m_TrayWindow->GetWindow(),
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
if (meterWindow)
|
|
||||||
{
|
|
||||||
DestroyMenu(subMenu);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DestroyMenu(menu);
|
active = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3017,7 +3039,7 @@ HMENU CRainmeter::CreateThemeMenu()
|
|||||||
return themeMenu;
|
return themeMenu;
|
||||||
}
|
}
|
||||||
|
|
||||||
HMENU CRainmeter::CreateSkinMenu(CMeterWindow* meterWindow, int index)
|
HMENU CRainmeter::CreateSkinMenu(CMeterWindow* meterWindow, int index, HMENU configMenu)
|
||||||
{
|
{
|
||||||
HMENU skinMenu = LoadMenu(m_Instance, MAKEINTRESOURCE(IDR_SKIN_MENU));
|
HMENU skinMenu = LoadMenu(m_Instance, MAKEINTRESOURCE(IDR_SKIN_MENU));
|
||||||
|
|
||||||
@ -3175,6 +3197,40 @@ HMENU CRainmeter::CreateSkinMenu(CMeterWindow* meterWindow, int index)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add config's root menu
|
||||||
|
int itemCount = GetMenuItemCount(configMenu) - 3; // Subtract 3 for appended menus
|
||||||
|
if (itemCount > 0)
|
||||||
|
{
|
||||||
|
std::wstring root = meterWindow->GetSkinName();
|
||||||
|
std::wstring::size_type pos = root.find_first_of(L'\\');
|
||||||
|
if (pos != std::wstring::npos)
|
||||||
|
{
|
||||||
|
root.erase(pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < itemCount; ++i)
|
||||||
|
{
|
||||||
|
WCHAR buffer[MAX_PATH+1] = {0};
|
||||||
|
MENUITEMINFO itemInfo = {sizeof(MENUITEMINFO)};
|
||||||
|
itemInfo.fMask = MIIM_STRING;
|
||||||
|
itemInfo.dwTypeData = buffer;
|
||||||
|
itemInfo.cch = MAX_PATH;
|
||||||
|
if (GetMenuItemInfo(configMenu, (UINT)i, TRUE, &itemInfo))
|
||||||
|
{
|
||||||
|
if (wcsicmp(root.c_str(), buffer) == 0)
|
||||||
|
{
|
||||||
|
HMENU configRootMenu = GetSubMenu(configMenu, i);
|
||||||
|
if (configRootMenu)
|
||||||
|
{
|
||||||
|
InsertMenu(skinMenu, 3, MF_BYPOSITION | MF_POPUP, (UINT_PTR)configRootMenu, root.c_str());
|
||||||
|
InsertMenu(skinMenu, 4, MF_BYPOSITION | MF_SEPARATOR, 0, NULL);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return skinMenu;
|
return skinMenu;
|
||||||
|
@ -222,7 +222,7 @@ private:
|
|||||||
int GetLoadOrder(const std::wstring& config);
|
int GetLoadOrder(const std::wstring& config);
|
||||||
bool SetActiveConfig(std::wstring& skinName, std::wstring& skinIni);
|
bool SetActiveConfig(std::wstring& skinName, std::wstring& skinIni);
|
||||||
void UpdateDesktopWorkArea(bool reset);
|
void UpdateDesktopWorkArea(bool reset);
|
||||||
HMENU CreateSkinMenu(CMeterWindow* meterWindow, int index);
|
HMENU CreateSkinMenu(CMeterWindow* meterWindow, int index, HMENU configMenu);
|
||||||
void ChangeSkinIndex(HMENU subMenu, int index);
|
void ChangeSkinIndex(HMENU subMenu, int index);
|
||||||
int ScanForConfigsRecursive(std::wstring& path, std::wstring base, int index, std::vector<CONFIGMENU>& menu, bool DontRecurse);
|
int ScanForConfigsRecursive(std::wstring& path, std::wstring base, int index, std::vector<CONFIGMENU>& menu, bool DontRecurse);
|
||||||
HMENU CreateConfigMenu(std::vector<CONFIGMENU>& configMenuData);
|
HMENU CreateConfigMenu(std::vector<CONFIGMENU>& configMenuData);
|
||||||
|
Loading…
Reference in New Issue
Block a user