Make Rainmeter a singleton class

This change is part of making the Libray project more testable. The old g_Rainmeter global pointer has been replaced with a GetRainmeter() function to guarantee that the object exists in some state.
This commit is contained in:
Birunthan Mohanathas
2013-06-13 17:20:27 +03:00
parent a80c905be9
commit 04090b232a
26 changed files with 272 additions and 314 deletions

View File

@ -29,8 +29,6 @@
#include "TrayWindow.h"
#include "resource.h"
extern Rainmeter* g_Rainmeter;
namespace {
typedef void (* BangHandlerFunc)(std::vector<std::wstring>& args, MeterWindow* skin);
@ -160,7 +158,7 @@ void DoBang(const BangInfo& bangInfo, std::vector<std::wstring>& args, MeterWind
const std::wstring& folderPath = args[bangInfo.argCount];
if (!folderPath.empty() && (folderPath.length() != 1 || folderPath[0] != L'*'))
{
MeterWindow* skin = g_Rainmeter->GetMeterWindow(folderPath);
MeterWindow* skin = GetRainmeter().GetMeterWindow(folderPath);
if (skin)
{
skin->DoBang(bangInfo.bang, args);
@ -174,7 +172,7 @@ void DoBang(const BangInfo& bangInfo, std::vector<std::wstring>& args, MeterWind
}
// No skin defined -> apply to all.
for (const auto& ip : g_Rainmeter->GetAllMeterWindows())
for (const auto& ip : GetRainmeter().GetAllMeterWindows())
{
ip.second->DoBang(bangInfo.bang, args);
}
@ -208,7 +206,7 @@ void DoGroupBang(const BangInfo& bangInfo, std::vector<std::wstring>& args, Mete
if (args.size() > bangInfo.argCount)
{
std::multimap<int, MeterWindow*> windows;
g_Rainmeter->GetMeterWindowsByLoadOrder(windows, args[bangInfo.argCount]);
GetRainmeter().GetMeterWindowsByLoadOrder(windows, args[bangInfo.argCount]);
// Remove extra parameters (including group).
args.resize(bangInfo.argCount);
@ -579,24 +577,24 @@ void CommandHandler::DoActivateSkinBang(std::vector<std::wstring>& args, MeterWi
{
if (args.size() == 1)
{
int index = g_Rainmeter->FindSkinFolderIndex(args[0]);
int index = GetRainmeter().FindSkinFolderIndex(args[0]);
if (index != -1)
{
const Rainmeter::SkinFolder& skinFolder = g_Rainmeter->m_SkinFolders[index];
const Rainmeter::SkinFolder& skinFolder = GetRainmeter().m_SkinFolders[index];
if (!(skinFolder.active == 1 && skinFolder.files.size() == 1))
{
// Activate the next index.
g_Rainmeter->ActivateSkin(index, (skinFolder.active < skinFolder.files.size()) ? skinFolder.active : 0);
GetRainmeter().ActivateSkin(index, (skinFolder.active < skinFolder.files.size()) ? skinFolder.active : 0);
}
return;
}
}
else if (args.size() > 1)
{
std::pair<int, int> indexes = g_Rainmeter->GetMeterWindowIndex(args[0], args[1]);
std::pair<int, int> indexes = GetRainmeter().GetMeterWindowIndex(args[0], args[1]);
if (indexes.first != -1 && indexes.second != -1)
{
g_Rainmeter->ActivateSkin(indexes.first, indexes.second);
GetRainmeter().ActivateSkin(indexes.first, indexes.second);
return;
}
}
@ -608,7 +606,7 @@ void CommandHandler::DoDeactivateSkinBang(std::vector<std::wstring>& args, Meter
{
if (!args.empty())
{
skin = g_Rainmeter->GetMeterWindow(args[0]);
skin = GetRainmeter().GetMeterWindow(args[0]);
if (!skin)
{
LogWarningF(L"!DeactivateConfig: \"%s\" not active", args[0].c_str());
@ -618,7 +616,7 @@ void CommandHandler::DoDeactivateSkinBang(std::vector<std::wstring>& args, Meter
if (skin)
{
g_Rainmeter->DeactivateSkin(skin, -1);
GetRainmeter().DeactivateSkin(skin, -1);
}
else
{
@ -630,10 +628,10 @@ void CommandHandler::DoToggleSkinBang(std::vector<std::wstring>& args, MeterWind
{
if (args.size() >= 2)
{
MeterWindow* skin = g_Rainmeter->GetMeterWindow(args[0]);
MeterWindow* skin = GetRainmeter().GetMeterWindow(args[0]);
if (skin)
{
g_Rainmeter->DeactivateSkin(skin, -1);
GetRainmeter().DeactivateSkin(skin, -1);
return;
}
@ -651,10 +649,10 @@ void CommandHandler::DoDeactivateSkinGroupBang(std::vector<std::wstring>& args,
if (!args.empty())
{
std::multimap<int, MeterWindow*> windows;
g_Rainmeter->GetMeterWindowsByLoadOrder(windows, args[0]);
GetRainmeter().GetMeterWindowsByLoadOrder(windows, args[0]);
for (const auto& ip : windows)
{
g_Rainmeter->DeactivateSkin(ip.second, -1);
GetRainmeter().DeactivateSkin(ip.second, -1);
}
}
else
@ -673,12 +671,12 @@ void CommandHandler::DoLoadLayoutBang(std::vector<std::wstring>& args, MeterWind
std::wstring command = L"!LoadLayout \"";
command += args[0];
command += L'"';
g_Rainmeter->DelayedExecuteCommand(command.c_str());
GetRainmeter().DelayedExecuteCommand(command.c_str());
}
else
{
// Not called from a skin (or called with delay).
g_Rainmeter->LoadLayout(args[0]);
GetRainmeter().LoadLayout(args[0]);
}
}
}
@ -730,7 +728,7 @@ void CommandHandler::DoSkinMenuBang(std::vector<std::wstring>& args, MeterWindow
{
if (!args.empty())
{
skin = g_Rainmeter->GetMeterWindow(args[0]);
skin = GetRainmeter().GetMeterWindow(args[0]);
if (!skin)
{
LogWarningF(L"!SkinMenu: \"%s\" not active", args[0].c_str());
@ -741,7 +739,7 @@ void CommandHandler::DoSkinMenuBang(std::vector<std::wstring>& args, MeterWindow
if (skin)
{
POINT pos = System::GetCursorPosition();
g_Rainmeter->ShowContextMenu(pos, skin);
GetRainmeter().ShowContextMenu(pos, skin);
}
else
{
@ -752,12 +750,12 @@ void CommandHandler::DoSkinMenuBang(std::vector<std::wstring>& args, MeterWindow
void CommandHandler::DoTrayMenuBang(std::vector<std::wstring>& args, MeterWindow* skin)
{
POINT pos = System::GetCursorPosition();
g_Rainmeter->ShowContextMenu(pos, nullptr);
GetRainmeter().ShowContextMenu(pos, nullptr);
}
void CommandHandler::DoResetStatsBang(std::vector<std::wstring>& args, MeterWindow* meterWindow)
{
g_Rainmeter->ResetStats();
GetRainmeter().ResetStats();
}
void CommandHandler::DoWriteKeyValueBang(std::vector<std::wstring>& args, MeterWindow* skin)
@ -787,8 +785,8 @@ void CommandHandler::DoWriteKeyValueBang(std::vector<std::wstring>& args, MeterW
return;
}
if (_wcsnicmp(iniFile, g_Rainmeter->m_SkinPath.c_str(), g_Rainmeter->m_SkinPath.size()) != 0 &&
_wcsnicmp(iniFile, g_Rainmeter->m_SettingsPath.c_str(), g_Rainmeter->m_SettingsPath.size()) != 0)
if (_wcsnicmp(iniFile, GetRainmeter().m_SkinPath.c_str(), GetRainmeter().m_SkinPath.size()) != 0 &&
_wcsnicmp(iniFile, GetRainmeter().m_SettingsPath.c_str(), GetRainmeter().m_SettingsPath.size()) != 0)
{
LogErrorF(L"!WriteKeyValue: Illegal path: %s", iniFile);
return;
@ -821,14 +819,14 @@ void CommandHandler::DoWriteKeyValueBang(std::vector<std::wstring>& args, MeterW
if (temporary)
{
if (g_Rainmeter->GetDebug())
if (GetRainmeter().GetDebug())
{
LogDebugF(L"!WriteKeyValue: Writing to: %s (Temp: %s)", iniFile, strIniWrite.c_str());
}
}
else
{
if (g_Rainmeter->GetDebug())
if (GetRainmeter().GetDebug())
{
LogDebugF(L"!WriteKeyValue: Writing to: %s", iniFile);
}
@ -925,13 +923,13 @@ void CommandHandler::DoLogBang(std::vector<std::wstring>& args, MeterWindow* ski
void CommandHandler::DoRefreshApp(std::vector<std::wstring>& args, MeterWindow* meterWindow)
{
// Refresh needs to be delayed since it crashes if done during Update().
PostMessage(g_Rainmeter->m_Window, WM_RAINMETER_DELAYED_REFRESH_ALL, 0, 0);
PostMessage(GetRainmeter().m_Window, WM_RAINMETER_DELAYED_REFRESH_ALL, 0, 0);
}
void CommandHandler::DoQuitBang(std::vector<std::wstring>& args, MeterWindow* meterWindow)
{
// Quit needs to be delayed since it crashes if done during Update().
PostMessage(g_Rainmeter->GetTrayWindow()->GetWindow(), WM_COMMAND, MAKEWPARAM(IDM_QUIT, 0), 0);
PostMessage(GetRainmeter().GetTrayWindow()->GetWindow(), WM_COMMAND, MAKEWPARAM(IDM_QUIT, 0), 0);
}
void CommandHandler::DoLsBoxHookBang(std::vector<std::wstring>& args, MeterWindow* meterWindow)