mirror of
https://github.com/chibicitiberiu/rainmeter-studio.git
synced 2024-02-24 04:33:31 +00:00
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:
@ -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)
|
||||
|
Reference in New Issue
Block a user