Code cleanup.

This commit is contained in:
spx 2011-10-29 10:36:07 +00:00
parent a336c916f6
commit 1808930c5a
7 changed files with 489 additions and 541 deletions

View File

@ -60,6 +60,35 @@ CDialogAbout::~CDialogAbout()
delete m_TabVersion;
}
/*
** Open
**
** Opens the About dialog by tab name.
**
*/
void CDialogAbout::Open(const WCHAR* name)
{
int tab = 0;
if (name)
{
if (_wcsnicmp(name, L"Measures", 8) == 0)
{
tab = 1;
}
else if (_wcsnicmp(name, L"Plugins", 7) == 0)
{
tab = 2;
}
else if (_wcsnicmp(name, L"Version", 7) == 0)
{
tab = 3;
}
}
Open(tab);
}
/*
** Open
**

View File

@ -34,6 +34,7 @@ public:
INT_PTR OnNotify(WPARAM wParam, LPARAM lParam);
INT_PTR OnCommand(WPARAM wParam, LPARAM lParam);
static void Open(const WCHAR* name);
static void Open(int tab = 0);
static void ShowAboutLog();

View File

@ -59,6 +59,31 @@ CDialogManage::~CDialogManage()
delete m_TabSettings;
}
/*
** Open
**
** Opens the Manage dialog by tab name.
**
*/
void CDialogManage::Open(const WCHAR* name)
{
int tab = 0;
if (name)
{
if (_wcsnicmp(name, L"Themes", 6) == 0)
{
tab = 1;
}
else if (_wcsnicmp(name, L"Settings", 8) == 0)
{
tab = 2;
}
}
Open(tab);
}
/*
** Open
**
@ -266,7 +291,7 @@ INT_PTR CDialogManage::OnCommand(WPARAM wParam, LPARAM lParam)
break;
case IDC_OPENLOG_BUTTON:
RainmeterAbout();
CDialogAbout::Open();
break;
case IDCLOSE:

View File

@ -35,6 +35,7 @@ public:
INT_PTR OnNotify(WPARAM wParam, LPARAM lParam);
INT_PTR OnCommand(WPARAM wParam, LPARAM lParam);
static void Open(const WCHAR* name);
static void Open(int tab = 0);
static void OpenSkin(CMeterWindow* meterWindow);

View File

@ -35,105 +35,6 @@ using namespace Gdiplus;
CRainmeter* Rainmeter; // The module
/*
** ParseString
**
** Splits the given string into substrings
**
*/
std::vector<std::wstring> CRainmeter::ParseString(LPCTSTR str)
{
std::vector<std::wstring> result;
if (str)
{
std::wstring arg = str;
// Split the argument between first space.
// Or if string is in quotes, the after the second quote.
size_t pos;
std::wstring newStr;
while ((pos = arg.find_first_not_of(L' ')) != std::wstring::npos)
{
if (arg[pos] == L'"')
{
if (arg.size() > (pos + 2) &&
arg[pos + 1] == L'"' && arg[pos + 2] == L'"')
{
// Eat found quotes and finding ending """
arg.erase(0, pos + 3);
size_t extra = 4;
if ((pos = arg.find(L"\"\"\" ")) == std::wstring::npos)
{
extra = 3;
pos = arg.find(L"\"\"\"");
}
if (pos != std::wstring::npos)
{
newStr.assign(arg, 0, pos);
arg.erase(0, pos + extra);
result.push_back(newStr);
}
// Skip stripping quotes
continue;
}
else
{
// Eat found quote and find ending quote
arg.erase(0, pos + 1);
pos = arg.find_first_of(L'"');
}
}
else
{
if (pos > 0)
{
// Eat everything until non-space (and non-quote) char
arg.erase(0, pos);
}
// Find the second quote
pos = arg.find_first_of(L' ');
}
if (pos != std::wstring::npos)
{
newStr.assign(arg, 0, pos);
arg.erase(0, pos + 1);
// Strip quotes
while ((pos = newStr.find(L'"')) != std::wstring::npos)
{
newStr.erase(pos, 1);
}
result.push_back(newStr);
}
else // quote or space not found
{
break;
}
}
if (arg.size() > 0)
{
// Strip quotes
while ((pos = arg.find(L'"')) != std::wstring::npos)
{
arg.erase(pos, 1);
}
result.push_back(arg);
}
}
return result;
}
/*
** Initialize
**
@ -354,17 +255,115 @@ LPCTSTR PluginBridge(LPCTSTR _sCommand, LPCTSTR _sData)
return L"error:no rainmeter!";
}
/*
** ParseString
**
** Splits the given string into substrings
**
*/
std::vector<std::wstring> CRainmeter::ParseString(LPCTSTR str)
{
std::vector<std::wstring> result;
if (str)
{
std::wstring arg = str;
// Split the argument between first space.
// Or if string is in quotes, the after the second quote.
size_t pos;
std::wstring newStr;
while ((pos = arg.find_first_not_of(L' ')) != std::wstring::npos)
{
if (arg[pos] == L'"')
{
if (arg.size() > (pos + 2) &&
arg[pos + 1] == L'"' && arg[pos + 2] == L'"')
{
// Eat found quotes and finding ending """
arg.erase(0, pos + 3);
size_t extra = 4;
if ((pos = arg.find(L"\"\"\" ")) == std::wstring::npos)
{
extra = 3;
pos = arg.find(L"\"\"\"");
}
if (pos != std::wstring::npos)
{
newStr.assign(arg, 0, pos);
arg.erase(0, pos + extra);
result.push_back(newStr);
}
// Skip stripping quotes
continue;
}
else
{
// Eat found quote and find ending quote
arg.erase(0, pos + 1);
pos = arg.find_first_of(L'"');
}
}
else
{
if (pos > 0)
{
// Eat everything until non-space (and non-quote) char
arg.erase(0, pos);
}
// Find the second quote
pos = arg.find_first_of(L' ');
}
if (pos != std::wstring::npos)
{
newStr.assign(arg, 0, pos);
arg.erase(0, pos + 1);
// Strip quotes
while ((pos = newStr.find(L'"')) != std::wstring::npos)
{
newStr.erase(pos, 1);
}
result.push_back(newStr);
}
else // quote or space not found
{
break;
}
}
if (arg.size() > 0)
{
// Strip quotes
while ((pos = arg.find(L'"')) != std::wstring::npos)
{
arg.erase(pos, 1);
}
result.push_back(arg);
}
}
return result;
}
/*
** BangWithArgs
**
** Parses Bang args
**
*/
void BangWithArgs(BANGCOMMAND bang, const WCHAR* arg, size_t numOfArgs)
void CRainmeter::BangWithArgs(BANGCOMMAND bang, const WCHAR* arg, size_t numOfArgs)
{
if (Rainmeter)
{
std::vector<std::wstring> subStrings = CRainmeter::ParseString(arg);
std::vector<std::wstring> subStrings = ParseString(arg);
size_t subStringsSize = subStrings.size();
std::wstring config;
std::wstring argument;
@ -389,7 +388,7 @@ void BangWithArgs(BANGCOMMAND bang, const WCHAR* arg, size_t numOfArgs)
if ((!config.empty()) && (config != L"*"))
{
// Config defined, so bang only that
CMeterWindow* meterWindow = Rainmeter->GetMeterWindow(config);
CMeterWindow* meterWindow = GetMeterWindow(config);
if (meterWindow)
{
@ -403,10 +402,8 @@ void BangWithArgs(BANGCOMMAND bang, const WCHAR* arg, size_t numOfArgs)
else
{
// No config defined -> apply to all.
const std::map<std::wstring, CMeterWindow*>& windows = Rainmeter->GetAllMeterWindows();
std::map<std::wstring, CMeterWindow*>::const_iterator iter = windows.begin();
for (; iter != windows.end(); ++iter)
std::map<std::wstring, CMeterWindow*>::const_iterator iter = m_Meters.begin();
for (; iter != m_Meters.end(); ++iter)
{
((*iter).second)->RunBang(bang, argument.c_str());
}
@ -416,7 +413,6 @@ void BangWithArgs(BANGCOMMAND bang, const WCHAR* arg, size_t numOfArgs)
{
Log(LOG_ERROR, L"Bang: Incorrect number of arugments");
}
}
}
/*
@ -425,16 +421,14 @@ void BangWithArgs(BANGCOMMAND bang, const WCHAR* arg, size_t numOfArgs)
** Parses Bang args for Group
**
*/
void BangGroupWithArgs(BANGCOMMAND bang, const WCHAR* arg, size_t numOfArgs)
void CRainmeter::BangGroupWithArgs(BANGCOMMAND bang, const WCHAR* arg, size_t numOfArgs)
{
if (Rainmeter)
{
std::vector<std::wstring> subStrings = CRainmeter::ParseString(arg);
std::vector<std::wstring> subStrings = ParseString(arg);
if (subStrings.size() > numOfArgs)
{
std::multimap<int, CMeterWindow*> windows;
Rainmeter->GetMeterWindowsByLoadOrder(windows, subStrings[numOfArgs]);
GetMeterWindowsByLoadOrder(windows, subStrings[numOfArgs]);
std::multimap<int, CMeterWindow*>::const_iterator iter = windows.begin();
for (; iter != windows.end(); ++iter)
@ -454,27 +448,24 @@ void BangGroupWithArgs(BANGCOMMAND bang, const WCHAR* arg, size_t numOfArgs)
{
Log(LOG_ERROR, L"BangGroup: Incorrect number of arguments");
}
}
}
/*
** RainmeterActivateConfig
**
** Callback for the !RainmeterActivateConfig bang
** !RainmeterActivateConfig bang
**
*/
void RainmeterActivateConfig(const WCHAR* arg)
void CRainmeter::RainmeterActivateConfig(const WCHAR* arg)
{
if (Rainmeter)
{
std::vector<std::wstring> subStrings = CRainmeter::ParseString(arg);
std::vector<std::wstring> subStrings = ParseString(arg);
if (subStrings.size() > 1)
{
std::pair<int, int> indexes = Rainmeter->GetMeterWindowIndex(subStrings[0], subStrings[1]);
std::pair<int, int> indexes = GetMeterWindowIndex(subStrings[0], subStrings[1]);
if (indexes.first != -1 && indexes.second != -1)
{
Rainmeter->ActivateConfig(indexes.first, indexes.second);
ActivateConfig(indexes.first, indexes.second);
return;
}
LogWithArgs(LOG_ERROR, L"!ActivateConfig: \"%s\\%s\" not found", subStrings[0].c_str(), subStrings[1].c_str());
@ -484,27 +475,24 @@ void RainmeterActivateConfig(const WCHAR* arg)
// If we got this far, something went wrong
Log(LOG_ERROR, L"!ActivateConfig: Invalid parameters");
}
}
}
/*
** RainmeterDeactivateConfig
**
** Callback for the !RainmeterDeactivateConfig bang
** !RainmeterDeactivateConfig bang
**
*/
void RainmeterDeactivateConfig(const WCHAR* arg)
void CRainmeter::RainmeterDeactivateConfig(const WCHAR* arg)
{
if (Rainmeter)
{
std::vector<std::wstring> subStrings = CRainmeter::ParseString(arg);
std::vector<std::wstring> subStrings = ParseString(arg);
if (!subStrings.empty())
{
CMeterWindow* mw = Rainmeter->GetMeterWindow(subStrings[0]);
CMeterWindow* mw = GetMeterWindow(subStrings[0]);
if (mw)
{
Rainmeter->DeactivateConfig(mw, -1);
DeactivateConfig(mw, -1);
return;
}
LogWithArgs(LOG_WARNING, L"!DeactivateConfig: \"%s\" not active", subStrings[0].c_str());
@ -513,27 +501,24 @@ void RainmeterDeactivateConfig(const WCHAR* arg)
{
Log(LOG_ERROR, L"!DeactivateConfig: Invalid parameters");
}
}
}
/*
** RainmeterToggleConfig
**
** Callback for the !RainmeterToggleConfig bang
** !RainmeterToggleConfig bang
**
*/
void RainmeterToggleConfig(const WCHAR* arg)
void CRainmeter::RainmeterToggleConfig(const WCHAR* arg)
{
if (Rainmeter)
{
std::vector<std::wstring> subStrings = CRainmeter::ParseString(arg);
std::vector<std::wstring> subStrings = ParseString(arg);
if (subStrings.size() >= 2)
{
CMeterWindow* mw = Rainmeter->GetMeterWindow(subStrings[0]);
CMeterWindow* mw = GetMeterWindow(subStrings[0]);
if (mw)
{
Rainmeter->DeactivateConfig(mw, -1);
DeactivateConfig(mw, -1);
return;
}
@ -544,132 +529,53 @@ void RainmeterToggleConfig(const WCHAR* arg)
{
Log(LOG_ERROR, L"!ToggleConfig: Invalid parameters");
}
}
}
/*
** RainmeterDeactivateConfigGroup
**
** Callback for the !RainmeterDeactivateConfigGroup bang
** !RainmeterDeactivateConfigGroup bang
**
*/
void RainmeterDeactivateConfigGroup(const WCHAR* arg)
void CRainmeter::RainmeterDeactivateConfigGroup(const WCHAR* arg)
{
if (Rainmeter)
{
std::vector<std::wstring> subStrings = CRainmeter::ParseString(arg);
std::vector<std::wstring> subStrings = ParseString(arg);
if (!subStrings.empty())
{
std::multimap<int, CMeterWindow*> windows;
Rainmeter->GetMeterWindowsByLoadOrder(windows, subStrings[0]);
GetMeterWindowsByLoadOrder(windows, subStrings[0]);
std::multimap<int, CMeterWindow*>::const_iterator iter = windows.begin();
for (; iter != windows.end(); ++iter)
{
Rainmeter->DeactivateConfig((*iter).second, -1);
DeactivateConfig((*iter).second, -1);
}
}
else
{
Log(LOG_ERROR, L"!DeactivateConfigGroup: Invalid parameters");
}
}
}
/*
** RainmeterRefreshApp
**
** Callback for the !RainmeterRefreshApp bang
**
*/
void RainmeterRefreshApp()
{
if (Rainmeter)
{
// Refresh needs to be delayed since it crashes if done during Update()
PostMessage(Rainmeter->GetTrayWindow()->GetWindow(), WM_TRAY_DELAYED_REFRESH_ALL, (WPARAM)NULL, (LPARAM)NULL);
}
}
/*
** RainmeterAbout
**
** Callback for the !RainmeterAbout bang
**
*/
void RainmeterAbout(const WCHAR* arg)
{
if (Rainmeter)
{
int tab = 0;
if (arg)
{
if (_wcsnicmp(arg, L"Measures", 8) == 0)
{
tab = 1;
}
else if (_wcsnicmp(arg, L"Plugins", 7) == 0)
{
tab = 2;
}
else if (_wcsnicmp(arg, L"Version", 7) == 0)
{
tab = 3;
}
}
CDialogAbout::Open(tab);
}
}
/*
** RainmeterManage
**
** Callback for the !RainmeterManage bang
**
*/
void RainmeterManage(const WCHAR* arg)
{
if (Rainmeter)
{
int tab = 0;
if (arg)
{
if (_wcsnicmp(arg, L"Themes", 6) == 0)
{
tab = 1;
}
else if (_wcsnicmp(arg, L"Settings", 8) == 0)
{
tab = 2;
}
}
CDialogManage::Open(tab);
}
}
/*
** RainmeterSkinMenu
**
** Callback for the !RainmeterSkinMenu bang
** !RainmeterSkinMenu bang
**
*/
void RainmeterSkinMenu(const WCHAR* arg)
void CRainmeter::RainmeterSkinMenu(const WCHAR* arg)
{
if (Rainmeter)
{
std::vector<std::wstring> subStrings = CRainmeter::ParseString(arg);
std::vector<std::wstring> subStrings = ParseString(arg);
if (!subStrings.empty())
{
CMeterWindow* mw = Rainmeter->GetMeterWindow(subStrings[0]);
CMeterWindow* mw = GetMeterWindow(subStrings[0]);
if (mw)
{
POINT pos;
GetCursorPos(&pos);
Rainmeter->ShowContextMenu(pos, mw);
ShowContextMenu(pos, mw);
return;
}
LogWithArgs(LOG_WARNING, L"!SkinMenu: \"%s\" not active", subStrings[0].c_str());
@ -678,50 +584,30 @@ void RainmeterSkinMenu(const WCHAR* arg)
{
Log(LOG_ERROR, L"!SkinMenu: Invalid parameter");
}
}
}
/*
** RainmeterTrayMenu
**
** Callback for the !RainmeterTrayMenu bang
** !RainmeterTrayMenu bang
**
*/
void RainmeterTrayMenu()
void CRainmeter::RainmeterTrayMenu()
{
if (Rainmeter)
{
POINT pos;
GetCursorPos(&pos);
Rainmeter->ShowContextMenu(pos, NULL);
}
}
/*
** RainmeterResetStats
**
** Callback for the !RainmeterResetStats bang
**
*/
void RainmeterResetStats()
{
if (Rainmeter)
{
Rainmeter->ResetStats();
}
ShowContextMenu(pos, NULL);
}
/*
** RainmeterWriteKeyValue
**
** Callback for the !RainmeterWriteKeyValue bang
** !RainmeterWriteKeyValue bang
**
*/
void RainmeterWriteKeyValue(const WCHAR* arg)
void CRainmeter::RainmeterWriteKeyValue(const WCHAR* arg)
{
if (Rainmeter)
{
std::vector<std::wstring> subStrings = CRainmeter::ParseString(arg);
std::vector<std::wstring> subStrings = ParseString(arg);
if (subStrings.size() > 3)
{
@ -733,8 +619,8 @@ void RainmeterWriteKeyValue(const WCHAR* arg)
return;
}
const std::wstring& skinPath = Rainmeter->GetSkinPath();
const std::wstring settingsPath = Rainmeter->GetSettingsPath();
const std::wstring& skinPath = GetSkinPath();
const std::wstring settingsPath = GetSettingsPath();
if (_wcsnicmp(iniFile.c_str(), skinPath.c_str(), skinPath.size()) != 0 &&
_wcsnicmp(iniFile.c_str(), settingsPath.c_str(), settingsPath.size()) != 0)
@ -771,11 +657,11 @@ void RainmeterWriteKeyValue(const WCHAR* arg)
if (temporary)
{
if (Rainmeter->GetDebug()) LogWithArgs(LOG_DEBUG, L"!WriteKeyValue: Writing to: %s (Temp: %s)", iniFile.c_str(), iniWrite.c_str());
if (GetDebug()) LogWithArgs(LOG_DEBUG, L"!WriteKeyValue: Writing to: %s (Temp: %s)", iniFile.c_str(), iniWrite.c_str());
}
else
{
if (Rainmeter->GetDebug()) LogWithArgs(LOG_DEBUG, L"!WriteKeyValue: Writing to: %s", iniFile.c_str());
if (GetDebug()) LogWithArgs(LOG_DEBUG, L"!WriteKeyValue: Writing to: %s", iniFile.c_str());
iniWrite = iniFile;
}
@ -788,7 +674,7 @@ void RainmeterWriteKeyValue(const WCHAR* arg)
if (subStrings.size() > 4)
{
CMeterWindow* mw = Rainmeter->GetMeterWindow(subStrings[4]);
CMeterWindow* mw = GetMeterWindow(subStrings[4]);
if (mw)
{
double value;
@ -845,22 +731,6 @@ void RainmeterWriteKeyValue(const WCHAR* arg)
{
Log(LOG_ERROR, L"!WriteKeyValue: Invalid parameters");
}
}
}
/*
** RainmeterQuit
**
** Callback for the !RainmeterQuit bang
**
*/
void RainmeterQuit()
{
if (Rainmeter)
{
// Quit needs to be delayed since it crashes if done during Update()
PostMessage(Rainmeter->GetTrayWindow()->GetWindow(), WM_COMMAND, MAKEWPARAM(ID_CONTEXT_QUIT, 0), (LPARAM)NULL);
}
}
@ -1281,7 +1151,8 @@ void CRainmeter::ActivateActiveConfigs()
void CRainmeter::ActivateConfig(int configIndex, int iniIndex)
{
if (configIndex >= 0 && configIndex < (int)m_ConfigStrings.size())
if (configIndex >= 0 && configIndex < (int)m_ConfigStrings.size() &&
iniIndex >= 0 && iniIndex < (int)m_ConfigStrings[configIndex].iniFiles.size())
{
const std::wstring skinIniFile = m_ConfigStrings[configIndex].iniFiles[iniIndex];
const std::wstring skinConfig = m_ConfigStrings[configIndex].config;
@ -1355,6 +1226,23 @@ bool CRainmeter::DeactivateConfig(CMeterWindow* meterWindow, int configIndex, bo
return false;
}
void CRainmeter::ToggleConfig(int configIndex, int iniIndex)
{
if (configIndex >= 0 && configIndex < (int)m_ConfigStrings.size() &&
iniIndex >= 0 && iniIndex < (int)m_ConfigStrings[configIndex].iniFiles.size())
{
if (m_ConfigStrings[configIndex].active == iniIndex + 1)
{
CMeterWindow* meterWindow = Rainmeter->GetMeterWindow(m_ConfigStrings[configIndex].config);
DeactivateConfig(meterWindow, configIndex);
}
else
{
ActivateConfig(configIndex, iniIndex);
}
}
}
void CRainmeter::WriteActive(const std::wstring& config, int iniIndex)
{
WCHAR buffer[32];
@ -1523,6 +1411,29 @@ std::pair<int, int> CRainmeter::GetMeterWindowIndex(const std::wstring& config,
return indexes;
}
std::pair<int, int> CRainmeter::GetMeterWindowIndex(UINT menuCommand)
{
std::pair<int, int> indexes;
if (menuCommand >= ID_CONFIG_FIRST && menuCommand <= ID_CONFIG_LAST)
{
// Check which config was selected
for (size_t i = 0, isize = m_ConfigStrings.size(); i < isize; ++i)
{
if (menuCommand >= m_ConfigStrings[i].commandBase &&
menuCommand < (m_ConfigStrings[i].commandBase + m_ConfigStrings[i].iniFiles.size()))
{
indexes = std::make_pair(i, menuCommand - m_ConfigStrings[i].commandBase);
return indexes;
}
}
}
indexes = std::make_pair(-1, -1); // error
return indexes;
}
CMeterWindow* CRainmeter::GetMeterWindow(HWND hwnd)
{
std::map<std::wstring, CMeterWindow*>::const_iterator iter = m_Meters.begin();
@ -1648,8 +1559,12 @@ int CRainmeter::ScanForConfigsRecursive(const std::wstring& path, std::wstring b
menuItem.index = m_ConfigStrings.size();
menu.push_back(menuItem);
if (config.iniFiles.empty())
{
config.commandBase = ID_CONFIG_FIRST + index;
}
config.iniFiles.push_back(fileData.cFileName);
config.commands.push_back(ID_CONFIG_FIRST + index++);
++index;
}
}
} while (FindNextFile(hSearch, &fileData));
@ -1742,7 +1657,8 @@ BOOL CRainmeter::ExecuteBang(const std::wstring& bang, const std::wstring& arg,
}
else if (_wcsicmp(name, L"RefreshApp") == 0)
{
RainmeterRefreshApp();
// Refresh needs to be delayed since it crashes if done during Update()
PostMessage(GetTrayWindow()->GetWindow(), WM_TRAY_DELAYED_REFRESH_ALL, (WPARAM)NULL, (LPARAM)NULL);
}
else if (_wcsicmp(name, L"Redraw") == 0)
{
@ -1988,13 +1904,21 @@ BOOL CRainmeter::ExecuteBang(const std::wstring& bang, const std::wstring& arg,
{
BangWithArgs(BANG_SETOPTIONGROUP, arg.c_str(), 3);
}
else if (_wcsicmp(name, L"WriteKeyValue") == 0)
{
RainmeterWriteKeyValue(arg.c_str());
}
else if (_wcsicmp(name, L"PluginBang") == 0)
{
BangWithArgs(BANG_PLUGIN, arg.c_str(), 1);
}
else if (_wcsicmp(name, L"About") == 0)
{
RainmeterAbout(arg.c_str());
CDialogAbout::Open(arg.c_str());
}
else if (_wcsicmp(name, L"Manage") == 0)
{
RainmeterManage(arg.c_str());
CDialogManage::Open(arg.c_str());
}
else if (_wcsicmp(name, L"SkinMenu") == 0)
{
@ -2006,23 +1930,12 @@ BOOL CRainmeter::ExecuteBang(const std::wstring& bang, const std::wstring& arg,
}
else if (_wcsicmp(name, L"ResetStats") == 0)
{
RainmeterResetStats();
}
else if (_wcsicmp(name, L"WriteKeyValue") == 0)
{
RainmeterWriteKeyValue(arg.c_str());
}
else if (_wcsicmp(name, L"PluginBang") == 0)
{
BangWithArgs(BANG_PLUGIN, arg.c_str(), 1);
}
else if (_wcsicmp(name, L"LsBoxHook") == 0)
{
// Nothing to do here (this works only with Litestep)
ResetStats();
}
else if (_wcsicmp(name, L"Quit") == 0)
{
RainmeterQuit();
// Quit needs to be delayed since it crashes if done during Update()
PostMessage(GetTrayWindow()->GetWindow(), WM_COMMAND, MAKEWPARAM(ID_CONTEXT_QUIT, 0), (LPARAM)NULL);
}
else if (_wcsicmp(bang.c_str(), L"!Execute") == 0)
{
@ -2068,6 +1981,10 @@ BOOL CRainmeter::ExecuteBang(const std::wstring& bang, const std::wstring& arg,
}
}
}
else if (_wcsicmp(name, L"LsBoxHook") == 0)
{
// Deprecated.
}
else
{
std::wstring error = L"Unknown bang: " + bang;
@ -2490,11 +2407,11 @@ void CRainmeter::LoadTheme(const std::wstring& name)
CSystem::CopyFiles(m_IniFile, backup);
// Replace Rainmeter.ini with theme
std::wstring theme = Rainmeter->GetSettingsPath() + L"Themes\\";
std::wstring theme = GetSettingsPath() + L"Themes\\";
theme += name;
std::wstring wallpaper = theme + L"\\RainThemes.bmp";
theme += L"\\Rainmeter.thm";
CSystem::CopyFiles(theme, Rainmeter->GetIniFile());
CSystem::CopyFiles(theme, GetIniFile());
PreserveSetting(backup, L"SkinPath");
PreserveSetting(backup, L"ConfigEditor");
@ -2795,10 +2712,9 @@ void CRainmeter::ShowContextMenu(POINT pos, CMeterWindow* meterWindow)
InsertMenu(subMenu, 12, 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)
std::map<std::wstring, CMeterWindow*>::const_iterator iter = m_Meters.begin();
for (; iter != m_Meters.end(); ++iter)
{
CMeterWindow* mw = ((*iter).second);
HMENU skinMenu = CreateSkinMenu(mw, index, configMenu);
@ -2810,7 +2726,7 @@ void CRainmeter::ShowContextMenu(POINT pos, CMeterWindow* meterWindow)
if (m_NewVersion)
{
InsertMenu(subMenu, 0, MF_BYPOSITION, ID_CONTEXT_NEW_VERSION, GetString(ID_STR_UPDATEAVAILABLE));
HiliteMenuItem(Rainmeter->GetTrayWindow()->GetWindow(), subMenu, 0, MF_BYPOSITION | MF_HILITE);
HiliteMenuItem(GetTrayWindow()->GetWindow(), subMenu, 0, MF_BYPOSITION | MF_HILITE);
InsertMenu(subMenu, 1, MF_BYPOSITION | MF_SEPARATOR, 0, NULL);
}
}
@ -2862,7 +2778,7 @@ void CRainmeter::ShowContextMenu(POINT pos, CMeterWindow* meterWindow)
}
}
HMENU CRainmeter::CreateConfigMenu(HMENU configMenu, std::vector<CONFIGMENU>& configMenuData)
HMENU CRainmeter::CreateConfigMenu(HMENU configMenu, const std::vector<CONFIGMENU>& configMenuData)
{
if (!configMenuData.empty())
{
@ -2892,7 +2808,7 @@ HMENU CRainmeter::CreateConfigMenu(HMENU configMenu, std::vector<CONFIGMENU>& co
else
{
CONFIG& config = m_ConfigStrings[configMenuData[i].index];
InsertMenu(configMenu, i, MF_BYPOSITION | ((config.active == i + 1) ? MF_CHECKED : MF_UNCHECKED), config.commands[i], configMenuData[i].name.c_str());
InsertMenu(configMenu, i, MF_BYPOSITION | ((config.active == i + 1) ? MF_CHECKED : MF_UNCHECKED), config.commandBase + i, configMenuData[i].name.c_str());
separator = true;
}
}
@ -3070,7 +2986,7 @@ HMENU CRainmeter::CreateSkinMenu(CMeterWindow* meterWindow, int index, HMENU con
{
for (int j = 0, jsize = (int)config.iniFiles.size(); j < jsize; ++j)
{
InsertMenu(variantsMenu, j, MF_BYPOSITION | ((config.active == j + 1) ? MF_CHECKED : MF_UNCHECKED), config.commands[j], config.iniFiles[j].c_str());
InsertMenu(variantsMenu, j, MF_BYPOSITION | ((config.active == j + 1) ? MF_CHECKED : MF_UNCHECKED), config.commandBase + j, config.iniFiles[j].c_str());
}
break;
}

View File

@ -39,23 +39,6 @@
#define WIDEN(x) WIDEN2(x)
#define APPDATE WIDEN(__DATE__)
// Callbacks
void RainmeterActivateConfig(const WCHAR* arg);
void RainmeterDeactivateConfig(const WCHAR* arg);
void RainmeterToggleConfig(const WCHAR* arg);
void RainmeterDeactivateConfigGroup(const WCHAR* arg);
void RainmeterRefreshApp();
void RainmeterAbout(const WCHAR* arg = NULL);
void RainmeterManage(const WCHAR* arg = NULL);
void RainmeterSkinMenu(const WCHAR* arg);
void RainmeterTrayMenu();
void RainmeterResetStats();
void RainmeterWriteKeyValue(const WCHAR* arg);
void RainmeterQuit();
void BangWithArgs(BANGCOMMAND bang, const WCHAR* arg, size_t numOfArgs);
void BangGroupWithArgs(BANGCOMMAND bang, const WCHAR* arg, size_t numOfArgs);
struct GlobalConfig
{
double netInSpeed;
@ -72,7 +55,7 @@ public:
{
std::wstring config;
std::vector<std::wstring> iniFiles;
std::vector<UINT> commands;
UINT commandBase;
int active;
};
@ -104,6 +87,7 @@ public:
CMeterWindow* GetMeterWindowByINI(const std::wstring& ini_searching);
std::pair<int, int> GetMeterWindowIndex(const std::wstring& config, const std::wstring& iniFile);
std::pair<int, int> GetMeterWindowIndex(CMeterWindow* meterWindow) { return GetMeterWindowIndex(meterWindow->GetSkinName(), meterWindow->GetSkinIniFile()); }
std::pair<int, int> GetMeterWindowIndex(UINT menuCommand);
CMeterWindow* GetMeterWindow(HWND hwnd);
void GetMeterWindowsByLoadOrder(std::multimap<int, CMeterWindow*>& windows, const std::wstring& group = L"");
@ -113,6 +97,7 @@ public:
void ActivateConfig(int configIndex, int iniIndex);
bool DeactivateConfig(CMeterWindow* meterWindow, int configIndex, bool save = true);
void ToggleConfig(int configIndex, int iniIndex);
const std::wstring& GetPath() { return m_Path; }
const std::wstring& GetIniFile() { return m_IniFile; }
@ -191,6 +176,16 @@ public:
friend class CDialogManage;
private:
void BangWithArgs(BANGCOMMAND bang, const WCHAR* arg, size_t numOfArgs);
void BangGroupWithArgs(BANGCOMMAND bang, const WCHAR* arg, size_t numOfArgs);
void RainmeterActivateConfig(const WCHAR* arg);
void RainmeterDeactivateConfig(const WCHAR* arg);
void RainmeterToggleConfig(const WCHAR* arg);
void RainmeterDeactivateConfigGroup(const WCHAR* arg);
void RainmeterSkinMenu(const WCHAR* arg);
void RainmeterTrayMenu();
void RainmeterWriteKeyValue(const WCHAR* arg);
void ActivateActiveConfigs();
void CreateMeterWindow(const std::wstring& path, const std::wstring& config, const std::wstring& iniFile);
bool DeleteMeterWindow(CMeterWindow* meterWindow, bool bLater);
@ -204,7 +199,7 @@ private:
HMENU CreateSkinMenu(CMeterWindow* meterWindow, int index, HMENU configMenu);
void ChangeSkinIndex(HMENU subMenu, int index);
int ScanForConfigsRecursive(const std::wstring& path, std::wstring base, int index, std::vector<CONFIGMENU>& menu, bool DontRecurse);
HMENU CreateConfigMenu(HMENU configMenu, std::vector<CONFIGMENU>& configMenuData);
HMENU CreateConfigMenu(HMENU configMenu, const std::vector<CONFIGMENU>& configMenuData);
void CreateThemeMenu(HMENU themeMenu);
void CreateMonitorMenu(HMENU monitorMenu, CMeterWindow* meterWindow);
void CreateDefaultConfigFile(const std::wstring& strFile);

View File

@ -486,29 +486,10 @@ LRESULT CALLBACK CTrayWindow::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
}
else if ((wParam & 0x0ffff) >= ID_CONFIG_FIRST && (wParam & 0x0ffff) <= ID_CONFIG_LAST)
{
wParam = wParam & 0x0ffff;
// Check which config was selected
const std::vector<CRainmeter::CONFIG>& configs = Rainmeter->GetAllConfigs();
for (int i = 0, isize = (int)configs.size(); i < isize; ++i)
std::pair<int, int> indexes = Rainmeter->GetMeterWindowIndex((UINT)(wParam & 0x0ffff));
if (indexes.first != -1 && indexes.second != -1)
{
for (int j = 0, jsize = (int)configs[i].commands.size(); j < jsize; ++j)
{
if (configs[i].commands[j] == wParam)
{
if (configs[i].active == j + 1)
{
CMeterWindow* meterWindow = Rainmeter->GetMeterWindow(configs[i].config);
Rainmeter->DeactivateConfig(meterWindow, i);
}
else
{
Rainmeter->ActivateConfig(i, j);
}
return 0;
}
}
Rainmeter->ToggleConfig(indexes.first, indexes.second);
}
}
else