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; 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 ** Open
** **

View File

@ -34,6 +34,7 @@ public:
INT_PTR OnNotify(WPARAM wParam, LPARAM lParam); INT_PTR OnNotify(WPARAM wParam, LPARAM lParam);
INT_PTR OnCommand(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 Open(int tab = 0);
static void ShowAboutLog(); static void ShowAboutLog();

View File

@ -59,6 +59,31 @@ CDialogManage::~CDialogManage()
delete m_TabSettings; 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 ** Open
** **
@ -266,7 +291,7 @@ INT_PTR CDialogManage::OnCommand(WPARAM wParam, LPARAM lParam)
break; break;
case IDC_OPENLOG_BUTTON: case IDC_OPENLOG_BUTTON:
RainmeterAbout(); CDialogAbout::Open();
break; break;
case IDCLOSE: case IDCLOSE:

View File

@ -35,6 +35,7 @@ public:
INT_PTR OnNotify(WPARAM wParam, LPARAM lParam); INT_PTR OnNotify(WPARAM wParam, LPARAM lParam);
INT_PTR OnCommand(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 Open(int tab = 0);
static void OpenSkin(CMeterWindow* meterWindow); static void OpenSkin(CMeterWindow* meterWindow);

View File

@ -35,105 +35,6 @@ using namespace Gdiplus;
CRainmeter* Rainmeter; // The module 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 ** Initialize
** **
@ -354,17 +255,115 @@ LPCTSTR PluginBridge(LPCTSTR _sCommand, LPCTSTR _sData)
return L"error:no rainmeter!"; 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 ** BangWithArgs
** **
** Parses Bang args ** 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 = ParseString(arg);
{
std::vector<std::wstring> subStrings = CRainmeter::ParseString(arg);
size_t subStringsSize = subStrings.size(); size_t subStringsSize = subStrings.size();
std::wstring config; std::wstring config;
std::wstring argument; std::wstring argument;
@ -389,7 +388,7 @@ void BangWithArgs(BANGCOMMAND bang, const WCHAR* arg, size_t numOfArgs)
if ((!config.empty()) && (config != L"*")) if ((!config.empty()) && (config != L"*"))
{ {
// Config defined, so bang only that // Config defined, so bang only that
CMeterWindow* meterWindow = Rainmeter->GetMeterWindow(config); CMeterWindow* meterWindow = GetMeterWindow(config);
if (meterWindow) if (meterWindow)
{ {
@ -403,10 +402,8 @@ void BangWithArgs(BANGCOMMAND bang, const WCHAR* arg, size_t numOfArgs)
else else
{ {
// No config defined -> apply to all. // No config defined -> apply to all.
const std::map<std::wstring, CMeterWindow*>& windows = Rainmeter->GetAllMeterWindows(); std::map<std::wstring, CMeterWindow*>::const_iterator iter = m_Meters.begin();
std::map<std::wstring, CMeterWindow*>::const_iterator iter = windows.begin(); for (; iter != m_Meters.end(); ++iter)
for (; iter != windows.end(); ++iter)
{ {
((*iter).second)->RunBang(bang, argument.c_str()); ((*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"); 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 ** 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 = ParseString(arg);
{
std::vector<std::wstring> subStrings = CRainmeter::ParseString(arg);
if (subStrings.size() > numOfArgs) if (subStrings.size() > numOfArgs)
{ {
std::multimap<int, CMeterWindow*> windows; std::multimap<int, CMeterWindow*> windows;
Rainmeter->GetMeterWindowsByLoadOrder(windows, subStrings[numOfArgs]); GetMeterWindowsByLoadOrder(windows, subStrings[numOfArgs]);
std::multimap<int, CMeterWindow*>::const_iterator iter = windows.begin(); std::multimap<int, CMeterWindow*>::const_iterator iter = windows.begin();
for (; iter != windows.end(); ++iter) 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"); Log(LOG_ERROR, L"BangGroup: Incorrect number of arguments");
} }
}
} }
/* /*
** RainmeterActivateConfig ** 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 = ParseString(arg);
{
std::vector<std::wstring> subStrings = CRainmeter::ParseString(arg);
if (subStrings.size() > 1) 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) if (indexes.first != -1 && indexes.second != -1)
{ {
Rainmeter->ActivateConfig(indexes.first, indexes.second); ActivateConfig(indexes.first, indexes.second);
return; return;
} }
LogWithArgs(LOG_ERROR, L"!ActivateConfig: \"%s\\%s\" not found", subStrings[0].c_str(), subStrings[1].c_str()); 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 // If we got this far, something went wrong
Log(LOG_ERROR, L"!ActivateConfig: Invalid parameters"); Log(LOG_ERROR, L"!ActivateConfig: Invalid parameters");
} }
}
} }
/* /*
** RainmeterDeactivateConfig ** 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 = ParseString(arg);
{
std::vector<std::wstring> subStrings = CRainmeter::ParseString(arg);
if (!subStrings.empty()) if (!subStrings.empty())
{ {
CMeterWindow* mw = Rainmeter->GetMeterWindow(subStrings[0]); CMeterWindow* mw = GetMeterWindow(subStrings[0]);
if (mw) if (mw)
{ {
Rainmeter->DeactivateConfig(mw, -1); DeactivateConfig(mw, -1);
return; return;
} }
LogWithArgs(LOG_WARNING, L"!DeactivateConfig: \"%s\" not active", subStrings[0].c_str()); 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"); Log(LOG_ERROR, L"!DeactivateConfig: Invalid parameters");
} }
}
} }
/* /*
** RainmeterToggleConfig ** 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 = ParseString(arg);
{
std::vector<std::wstring> subStrings = CRainmeter::ParseString(arg);
if (subStrings.size() >= 2) if (subStrings.size() >= 2)
{ {
CMeterWindow* mw = Rainmeter->GetMeterWindow(subStrings[0]); CMeterWindow* mw = GetMeterWindow(subStrings[0]);
if (mw) if (mw)
{ {
Rainmeter->DeactivateConfig(mw, -1); DeactivateConfig(mw, -1);
return; return;
} }
@ -544,132 +529,53 @@ void RainmeterToggleConfig(const WCHAR* arg)
{ {
Log(LOG_ERROR, L"!ToggleConfig: Invalid parameters"); Log(LOG_ERROR, L"!ToggleConfig: Invalid parameters");
} }
}
} }
/* /*
** RainmeterDeactivateConfigGroup ** 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 = ParseString(arg);
{
std::vector<std::wstring> subStrings = CRainmeter::ParseString(arg);
if (!subStrings.empty()) if (!subStrings.empty())
{ {
std::multimap<int, CMeterWindow*> windows; std::multimap<int, CMeterWindow*> windows;
Rainmeter->GetMeterWindowsByLoadOrder(windows, subStrings[0]); GetMeterWindowsByLoadOrder(windows, subStrings[0]);
std::multimap<int, CMeterWindow*>::const_iterator iter = windows.begin(); std::multimap<int, CMeterWindow*>::const_iterator iter = windows.begin();
for (; iter != windows.end(); ++iter) for (; iter != windows.end(); ++iter)
{ {
Rainmeter->DeactivateConfig((*iter).second, -1); DeactivateConfig((*iter).second, -1);
} }
} }
else else
{ {
Log(LOG_ERROR, L"!DeactivateConfigGroup: Invalid parameters"); 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 ** 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 = ParseString(arg);
{
std::vector<std::wstring> subStrings = CRainmeter::ParseString(arg);
if (!subStrings.empty()) if (!subStrings.empty())
{ {
CMeterWindow* mw = Rainmeter->GetMeterWindow(subStrings[0]); CMeterWindow* mw = GetMeterWindow(subStrings[0]);
if (mw) if (mw)
{ {
POINT pos; POINT pos;
GetCursorPos(&pos); GetCursorPos(&pos);
Rainmeter->ShowContextMenu(pos, mw); ShowContextMenu(pos, mw);
return; return;
} }
LogWithArgs(LOG_WARNING, L"!SkinMenu: \"%s\" not active", subStrings[0].c_str()); 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"); Log(LOG_ERROR, L"!SkinMenu: Invalid parameter");
} }
}
} }
/* /*
** RainmeterTrayMenu ** RainmeterTrayMenu
** **
** Callback for the !RainmeterTrayMenu bang ** !RainmeterTrayMenu bang
** **
*/ */
void RainmeterTrayMenu() void CRainmeter::RainmeterTrayMenu()
{ {
if (Rainmeter)
{
POINT pos; POINT pos;
GetCursorPos(&pos); GetCursorPos(&pos);
Rainmeter->ShowContextMenu(pos, NULL); ShowContextMenu(pos, NULL);
}
}
/*
** RainmeterResetStats
**
** Callback for the !RainmeterResetStats bang
**
*/
void RainmeterResetStats()
{
if (Rainmeter)
{
Rainmeter->ResetStats();
}
} }
/* /*
** RainmeterWriteKeyValue ** 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 = ParseString(arg);
{
std::vector<std::wstring> subStrings = CRainmeter::ParseString(arg);
if (subStrings.size() > 3) if (subStrings.size() > 3)
{ {
@ -733,8 +619,8 @@ void RainmeterWriteKeyValue(const WCHAR* arg)
return; return;
} }
const std::wstring& skinPath = Rainmeter->GetSkinPath(); const std::wstring& skinPath = GetSkinPath();
const std::wstring settingsPath = Rainmeter->GetSettingsPath(); const std::wstring settingsPath = GetSettingsPath();
if (_wcsnicmp(iniFile.c_str(), skinPath.c_str(), skinPath.size()) != 0 && if (_wcsnicmp(iniFile.c_str(), skinPath.c_str(), skinPath.size()) != 0 &&
_wcsnicmp(iniFile.c_str(), settingsPath.c_str(), settingsPath.size()) != 0) _wcsnicmp(iniFile.c_str(), settingsPath.c_str(), settingsPath.size()) != 0)
@ -771,11 +657,11 @@ void RainmeterWriteKeyValue(const WCHAR* arg)
if (temporary) 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 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; iniWrite = iniFile;
} }
@ -788,7 +674,7 @@ void RainmeterWriteKeyValue(const WCHAR* arg)
if (subStrings.size() > 4) if (subStrings.size() > 4)
{ {
CMeterWindow* mw = Rainmeter->GetMeterWindow(subStrings[4]); CMeterWindow* mw = GetMeterWindow(subStrings[4]);
if (mw) if (mw)
{ {
double value; double value;
@ -845,22 +731,6 @@ void RainmeterWriteKeyValue(const WCHAR* arg)
{ {
Log(LOG_ERROR, L"!WriteKeyValue: Invalid parameters"); 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) 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 skinIniFile = m_ConfigStrings[configIndex].iniFiles[iniIndex];
const std::wstring skinConfig = m_ConfigStrings[configIndex].config; const std::wstring skinConfig = m_ConfigStrings[configIndex].config;
@ -1355,6 +1226,23 @@ bool CRainmeter::DeactivateConfig(CMeterWindow* meterWindow, int configIndex, bo
return false; 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) void CRainmeter::WriteActive(const std::wstring& config, int iniIndex)
{ {
WCHAR buffer[32]; WCHAR buffer[32];
@ -1523,6 +1411,29 @@ std::pair<int, int> CRainmeter::GetMeterWindowIndex(const std::wstring& config,
return indexes; 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) CMeterWindow* CRainmeter::GetMeterWindow(HWND hwnd)
{ {
std::map<std::wstring, CMeterWindow*>::const_iterator iter = m_Meters.begin(); 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(); menuItem.index = m_ConfigStrings.size();
menu.push_back(menuItem); menu.push_back(menuItem);
if (config.iniFiles.empty())
{
config.commandBase = ID_CONFIG_FIRST + index;
}
config.iniFiles.push_back(fileData.cFileName); config.iniFiles.push_back(fileData.cFileName);
config.commands.push_back(ID_CONFIG_FIRST + index++); ++index;
} }
} }
} while (FindNextFile(hSearch, &fileData)); } 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) 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) 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); 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) else if (_wcsicmp(name, L"About") == 0)
{ {
RainmeterAbout(arg.c_str()); CDialogAbout::Open(arg.c_str());
} }
else if (_wcsicmp(name, L"Manage") == 0) else if (_wcsicmp(name, L"Manage") == 0)
{ {
RainmeterManage(arg.c_str()); CDialogManage::Open(arg.c_str());
} }
else if (_wcsicmp(name, L"SkinMenu") == 0) 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) else if (_wcsicmp(name, L"ResetStats") == 0)
{ {
RainmeterResetStats(); ResetStats();
}
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)
} }
else if (_wcsicmp(name, L"Quit") == 0) 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) 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 else
{ {
std::wstring error = L"Unknown bang: " + bang; std::wstring error = L"Unknown bang: " + bang;
@ -2490,11 +2407,11 @@ void CRainmeter::LoadTheme(const std::wstring& name)
CSystem::CopyFiles(m_IniFile, backup); CSystem::CopyFiles(m_IniFile, backup);
// Replace Rainmeter.ini with theme // Replace Rainmeter.ini with theme
std::wstring theme = Rainmeter->GetSettingsPath() + L"Themes\\"; std::wstring theme = GetSettingsPath() + L"Themes\\";
theme += name; theme += name;
std::wstring wallpaper = theme + L"\\RainThemes.bmp"; std::wstring wallpaper = theme + L"\\RainThemes.bmp";
theme += L"\\Rainmeter.thm"; theme += L"\\Rainmeter.thm";
CSystem::CopyFiles(theme, Rainmeter->GetIniFile()); CSystem::CopyFiles(theme, GetIniFile());
PreserveSetting(backup, L"SkinPath"); PreserveSetting(backup, L"SkinPath");
PreserveSetting(backup, L"ConfigEditor"); PreserveSetting(backup, L"ConfigEditor");
@ -2795,10 +2712,9 @@ void CRainmeter::ShowContextMenu(POINT pos, CMeterWindow* meterWindow)
InsertMenu(subMenu, 12, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); InsertMenu(subMenu, 12, MF_BYPOSITION | MF_SEPARATOR, 0, NULL);
// Create a menu for all active configs // Create a menu for all active configs
std::map<std::wstring, CMeterWindow*>::const_iterator iter = Rainmeter->GetAllMeterWindows().begin();
int index = 0; 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); CMeterWindow* mw = ((*iter).second);
HMENU skinMenu = CreateSkinMenu(mw, index, configMenu); HMENU skinMenu = CreateSkinMenu(mw, index, configMenu);
@ -2810,7 +2726,7 @@ void CRainmeter::ShowContextMenu(POINT pos, CMeterWindow* meterWindow)
if (m_NewVersion) if (m_NewVersion)
{ {
InsertMenu(subMenu, 0, MF_BYPOSITION, ID_CONTEXT_NEW_VERSION, GetString(ID_STR_UPDATEAVAILABLE)); 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); 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()) if (!configMenuData.empty())
{ {
@ -2892,7 +2808,7 @@ HMENU CRainmeter::CreateConfigMenu(HMENU configMenu, std::vector<CONFIGMENU>& co
else else
{ {
CONFIG& config = m_ConfigStrings[configMenuData[i].index]; 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; 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) 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; break;
} }

View File

@ -39,23 +39,6 @@
#define WIDEN(x) WIDEN2(x) #define WIDEN(x) WIDEN2(x)
#define APPDATE WIDEN(__DATE__) #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 struct GlobalConfig
{ {
double netInSpeed; double netInSpeed;
@ -72,7 +55,7 @@ public:
{ {
std::wstring config; std::wstring config;
std::vector<std::wstring> iniFiles; std::vector<std::wstring> iniFiles;
std::vector<UINT> commands; UINT commandBase;
int active; int active;
}; };
@ -104,6 +87,7 @@ public:
CMeterWindow* GetMeterWindowByINI(const std::wstring& ini_searching); 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(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(CMeterWindow* meterWindow) { return GetMeterWindowIndex(meterWindow->GetSkinName(), meterWindow->GetSkinIniFile()); }
std::pair<int, int> GetMeterWindowIndex(UINT menuCommand);
CMeterWindow* GetMeterWindow(HWND hwnd); CMeterWindow* GetMeterWindow(HWND hwnd);
void GetMeterWindowsByLoadOrder(std::multimap<int, CMeterWindow*>& windows, const std::wstring& group = L""); void GetMeterWindowsByLoadOrder(std::multimap<int, CMeterWindow*>& windows, const std::wstring& group = L"");
@ -113,6 +97,7 @@ public:
void ActivateConfig(int configIndex, int iniIndex); void ActivateConfig(int configIndex, int iniIndex);
bool DeactivateConfig(CMeterWindow* meterWindow, int configIndex, bool save = true); 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& GetPath() { return m_Path; }
const std::wstring& GetIniFile() { return m_IniFile; } const std::wstring& GetIniFile() { return m_IniFile; }
@ -191,6 +176,16 @@ public:
friend class CDialogManage; friend class CDialogManage;
private: 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 ActivateActiveConfigs();
void CreateMeterWindow(const std::wstring& path, const std::wstring& config, const std::wstring& iniFile); void CreateMeterWindow(const std::wstring& path, const std::wstring& config, const std::wstring& iniFile);
bool DeleteMeterWindow(CMeterWindow* meterWindow, bool bLater); bool DeleteMeterWindow(CMeterWindow* meterWindow, bool bLater);
@ -204,7 +199,7 @@ private:
HMENU CreateSkinMenu(CMeterWindow* meterWindow, int index, HMENU configMenu); HMENU CreateSkinMenu(CMeterWindow* meterWindow, int index, HMENU configMenu);
void ChangeSkinIndex(HMENU subMenu, int index); void ChangeSkinIndex(HMENU subMenu, int index);
int ScanForConfigsRecursive(const std::wstring& path, std::wstring base, int index, std::vector<CONFIGMENU>& menu, bool DontRecurse); 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 CreateThemeMenu(HMENU themeMenu);
void CreateMonitorMenu(HMENU monitorMenu, CMeterWindow* meterWindow); void CreateMonitorMenu(HMENU monitorMenu, CMeterWindow* meterWindow);
void CreateDefaultConfigFile(const std::wstring& strFile); 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) else if ((wParam & 0x0ffff) >= ID_CONFIG_FIRST && (wParam & 0x0ffff) <= ID_CONFIG_LAST)
{ {
wParam = wParam & 0x0ffff; std::pair<int, int> indexes = Rainmeter->GetMeterWindowIndex((UINT)(wParam & 0x0ffff));
if (indexes.first != -1 && indexes.second != -1)
// Check which config was selected
const std::vector<CRainmeter::CONFIG>& configs = Rainmeter->GetAllConfigs();
for (int i = 0, isize = (int)configs.size(); i < isize; ++i)
{ {
for (int j = 0, jsize = (int)configs[i].commands.size(); j < jsize; ++j) Rainmeter->ToggleConfig(indexes.first, indexes.second);
{
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;
}
}
} }
} }
else else