- Removed unneeded NULL checks.
- Other code tweaks and cleanups.
This commit is contained in:
spx 2011-11-08 10:32:57 +00:00
parent 10f7504b86
commit a209bf15d0
17 changed files with 242 additions and 258 deletions

View File

@ -64,13 +64,11 @@ void CConfigParser::Initialize(LPCTSTR filename, CRainmeter* pRainmeter, CMeterW
{ {
m_Filename = filename; m_Filename = filename;
m_Measures.clear();
m_Sections.clear();
m_Values.clear();
m_BuiltInVariables.clear(); m_BuiltInVariables.clear();
m_Variables.clear(); m_Variables.clear();
m_Measures.clear();
m_Values.clear();
m_Sections.clear();
m_FoundSections.clear();
m_ListVariables.clear();
m_StyleTemplate.clear(); m_StyleTemplate.clear();
m_LastUsedStyle.clear(); m_LastUsedStyle.clear();
@ -89,6 +87,7 @@ void CConfigParser::Initialize(LPCTSTR filename, CRainmeter* pRainmeter, CMeterW
ReadVariables(); ReadVariables();
// Clear and minimize // Clear and minimize
std::unordered_set<std::wstring>().swap(m_FoundSections);
std::vector<std::wstring>().swap(m_ListVariables); std::vector<std::wstring>().swap(m_ListVariables);
} }
@ -126,9 +125,10 @@ void CConfigParser::SetBuiltInVariables(CRainmeter* pRainmeter, CMeterWindow* me
*/ */
void CConfigParser::ReadVariables() void CConfigParser::ReadVariables()
{ {
for (size_t i = 0, isize = m_ListVariables.size(); i < isize; ++i) std::vector<std::wstring>::const_iterator iter = m_ListVariables.begin();
for ( ; iter != m_ListVariables.end(); ++iter)
{ {
SetVariable(m_ListVariables[i], ReadString(L"Variables", m_ListVariables[i].c_str(), L"", false)); SetVariable((*iter), ReadString(L"Variables", (*iter).c_str(), L"", false));
} }
} }
@ -495,7 +495,8 @@ bool CConfigParser::ReplaceVariables(std::wstring& result)
{ {
loop = false; loop = false;
} }
} while (loop); }
while (loop);
return replaced; return replaced;
} }
@ -568,7 +569,8 @@ bool CConfigParser::ReplaceMeasures(std::wstring& result)
{ {
loop = false; loop = false;
} }
} while (loop); }
while (loop);
} }
return replaced; return replaced;
@ -703,9 +705,10 @@ std::vector<Gdiplus::REAL> CConfigParser::ReadFloats(LPCTSTR section, LPCTSTR ke
// Tokenize and parse the floats // Tokenize and parse the floats
std::vector<std::wstring> tokens = Tokenize(tmp, L";"); std::vector<std::wstring> tokens = Tokenize(tmp, L";");
for (size_t i = 0, isize = tokens.size(); i < isize; ++i) std::vector<std::wstring>::const_iterator iter = tokens.begin();
for ( ; iter != tokens.end(); ++iter)
{ {
result.push_back((Gdiplus::REAL)ParseDouble(tokens[i], 0)); result.push_back((Gdiplus::REAL)ParseDouble((*iter), 0));
} }
} }
return result; return result;
@ -1078,7 +1081,7 @@ void CConfigParser::ReadIniFile(const std::vector<std::wstring>& iniFileMappings
if (config == NULL) if (config == NULL)
{ {
// Get all the sections // Get all the sections
while (true) do
{ {
items[0] = 0; items[0] = 0;
DWORD res = GetPrivateProfileSectionNames(items, itemsSize, iniRead.c_str()); DWORD res = GetPrivateProfileSectionNames(items, itemsSize, iniRead.c_str());
@ -1098,6 +1101,7 @@ void CConfigParser::ReadIniFile(const std::vector<std::wstring>& iniFileMappings
itemsSize *= 2; itemsSize *= 2;
items = new WCHAR[itemsSize]; items = new WCHAR[itemsSize];
} }
while (true);
// Read the sections // Read the sections
pos = items; pos = items;
@ -1143,7 +1147,7 @@ void CConfigParser::ReadIniFile(const std::vector<std::wstring>& iniFileMappings
bool isMetadata = (config == NULL && _wcsicmp((*iter).c_str(), L"Metadata") == 0); bool isMetadata = (config == NULL && _wcsicmp((*iter).c_str(), L"Metadata") == 0);
// Read all "key=value" from the section // Read all "key=value" from the section
while (true) do
{ {
items[0] = 0; items[0] = 0;
DWORD res = GetPrivateProfileSection((*iter).c_str(), items, itemsSize, iniRead.c_str()); DWORD res = GetPrivateProfileSection((*iter).c_str(), items, itemsSize, iniRead.c_str());
@ -1157,6 +1161,7 @@ void CConfigParser::ReadIniFile(const std::vector<std::wstring>& iniFileMappings
itemsSize *= 2; itemsSize *= 2;
items = new WCHAR[itemsSize]; items = new WCHAR[itemsSize];
} }
while (true);
pos = items; pos = items;
while (pos < epos) while (pos < epos)
@ -1170,8 +1175,7 @@ void CConfigParser::ReadIniFile(const std::vector<std::wstring>& iniFileMappings
std::wstring value = key.substr(sep + 1, len - sep); std::wstring value = key.substr(sep + 1, len - sep);
key.erase(sep); key.erase(sep);
std::wstring lowerKey = StrToLower(key); if (foundKeys.insert(StrToLowerC(key)).second)
if (foundKeys.insert(lowerKey).second)
{ {
// Trim surrounded quotes from value // Trim surrounded quotes from value
std::wstring::size_type valueLen = value.length(); std::wstring::size_type valueLen = value.length();
@ -1183,7 +1187,7 @@ void CConfigParser::ReadIniFile(const std::vector<std::wstring>& iniFileMappings
value.assign(value, 1, valueLen); value.assign(value, 1, valueLen);
} }
if (wcsncmp(lowerKey.c_str(), L"@include", 8) == 0) if (wcsncmp(key.c_str(), L"@include", 8) == 0)
{ {
ReadVariables(); ReadVariables();
ReplaceVariables(value); ReplaceVariables(value);
@ -1203,7 +1207,7 @@ void CConfigParser::ReadIniFile(const std::vector<std::wstring>& iniFileMappings
if (isVariables) if (isVariables)
{ {
m_ListVariables.push_back(lowerKey); m_ListVariables.push_back(key);
} }
} }
} }
@ -1235,7 +1239,7 @@ void CConfigParser::SetValue(const std::wstring& strSection, const std::wstring&
std::wstring strTmp = strSection + L"::"; std::wstring strTmp = strSection + L"::";
strTmp += strKey; strTmp += strKey;
m_Values[StrToLower(strTmp)] = strValue; m_Values[StrToLowerC(strTmp)] = strValue;
} }
//============================================================================== //==============================================================================
@ -1251,7 +1255,7 @@ void CConfigParser::DeleteValue(const std::wstring& strSection, const std::wstri
std::wstring strTmp = strSection + L"::"; std::wstring strTmp = strSection + L"::";
strTmp += strKey; strTmp += strKey;
std::unordered_map<std::wstring, std::wstring>::iterator iter = m_Values.find(StrToLower(strTmp)); std::unordered_map<std::wstring, std::wstring>::iterator iter = m_Values.find(StrToLowerC(strTmp));
if (iter != m_Values.end()) if (iter != m_Values.end())
{ {
m_Values.erase(iter); m_Values.erase(iter);
@ -1272,7 +1276,7 @@ const std::wstring& CConfigParser::GetValue(const std::wstring& strSection, cons
std::wstring strTmp = strSection + L"::"; std::wstring strTmp = strSection + L"::";
strTmp += strKey; strTmp += strKey;
std::unordered_map<std::wstring, std::wstring>::const_iterator iter = m_Values.find(StrToLower(strTmp)); std::unordered_map<std::wstring, std::wstring>::const_iterator iter = m_Values.find(StrToLowerC(strTmp));
if (iter != m_Values.end()) if (iter != m_Values.end())
{ {
return (*iter).second; return (*iter).second;

View File

@ -109,8 +109,9 @@ private:
static void SetMultiMonitorVariables(bool reset); static void SetMultiMonitorVariables(bool reset);
static void SetMonitorVariable(const std::wstring& strVariable, const std::wstring& strValue) { SetVariable(c_MonitorVariables, strVariable, strValue); } static void SetMonitorVariable(const std::wstring& strVariable, const std::wstring& strValue) { SetVariable(c_MonitorVariables, strVariable, strValue); }
static std::wstring StrToLower(const std::wstring& str) { std::wstring strTmp(str); std::transform(strTmp.begin(), strTmp.end(), strTmp.begin(), ::towlower); return strTmp; } static std::wstring StrToLower(const std::wstring& str) { std::wstring strTmp(str); return StrToLowerC(strTmp); }
static std::wstring StrToLower(const WCHAR* str) { std::wstring strTmp(str); std::transform(strTmp.begin(), strTmp.end(), strTmp.begin(), ::towlower); return strTmp; } static std::wstring StrToLower(const WCHAR* str) { std::wstring strTmp(str); return StrToLowerC(strTmp); }
static std::wstring& StrToLowerC(std::wstring& str) { std::transform(str.begin(), str.end(), str.begin(), ::towlower); return str; }
std::wstring m_Filename; std::wstring m_Filename;
@ -125,9 +126,10 @@ private:
bool m_LastValueDefined; bool m_LastValueDefined;
std::vector<std::wstring> m_Sections; // The sections must be an ordered array std::vector<std::wstring> m_Sections; // The sections must be an ordered array
std::unordered_map<std::wstring, std::wstring> m_Values;
std::unordered_set<std::wstring> m_FoundSections; std::unordered_set<std::wstring> m_FoundSections;
std::vector<std::wstring> m_ListVariables; std::vector<std::wstring> m_ListVariables;
std::unordered_map<std::wstring, std::wstring> m_Values;
std::unordered_map<std::wstring, std::wstring> m_BuiltInVariables; // Built-in variables std::unordered_map<std::wstring, std::wstring> m_BuiltInVariables; // Built-in variables
std::unordered_map<std::wstring, std::wstring> m_Variables; // User-defined variables std::unordered_map<std::wstring, std::wstring> m_Variables; // User-defined variables

View File

@ -207,7 +207,8 @@ bool CMeasure::MakePlainSubstitute(std::wstring& str, size_t index)
str.replace(pos, m_Substitute[index].first.length(), m_Substitute[index].second); str.replace(pos, m_Substitute[index].first.length(), m_Substitute[index].second);
start = pos + m_Substitute[index].second.length(); start = pos + m_Substitute[index].second.length();
} }
} while (pos != std::wstring::npos); }
while (pos != std::wstring::npos);
return true; return true;
} }
@ -313,7 +314,8 @@ const WCHAR* CMeasure::CheckSubstitute(const WCHAR* buffer)
utf8str.replace(start, length, result); utf8str.replace(start, length, result);
offset = start + result.length(); offset = start + result.length();
} }
} while (true); }
while (true);
// Release memory used for the compiled pattern // Release memory used for the compiled pattern
pcre_free(re); pcre_free(re);
@ -343,7 +345,7 @@ bool CMeasure::ParseSubstitute(std::wstring buffer)
{ {
if (buffer.empty()) return true; if (buffer.empty()) return true;
while (!buffer.empty()) do
{ {
std::wstring word1 = ExtractWord(buffer); std::wstring word1 = ExtractWord(buffer);
std::wstring sep = ExtractWord(buffer); std::wstring sep = ExtractWord(buffer);
@ -358,6 +360,7 @@ bool CMeasure::ParseSubstitute(std::wstring buffer)
sep = ExtractWord(buffer); sep = ExtractWord(buffer);
if (!sep.empty() && sep != L",") return false; if (!sep.empty() && sep != L",") return false;
} }
while (!buffer.empty());
return true; return true;
} }
@ -772,11 +775,7 @@ CMeasure* CMeasure::Create(const WCHAR* measure, CMeterWindow* meterWindow, cons
{ {
// Comparison is caseinsensitive // Comparison is caseinsensitive
if (*measure == L'\0') if (_wcsicmp(L"CPU", measure) == 0)
{
return NULL;
}
else if (_wcsicmp(L"CPU", measure) == 0)
{ {
return new CMeasureCPU(meterWindow, name); return new CMeasureCPU(meterWindow, name);
} }

View File

@ -185,7 +185,8 @@ bool CMeasureCPU::Update()
buf = new BYTE[bufSize]; buf = new BYTE[bufSize];
} }
++loop; ++loop;
} while (loop < 5); }
while (loop < 5);
if (status != STATUS_SUCCESS) // failed if (status != STATUS_SUCCESS) // failed
{ {

View File

@ -54,11 +54,8 @@ CMeasureScript::~CMeasureScript()
void CMeasureScript::DeleteLuaScript() void CMeasureScript::DeleteLuaScript()
{ {
if (m_LuaScript) delete m_LuaScript;
{ m_LuaScript = NULL;
delete m_LuaScript;
m_LuaScript = NULL;
}
m_HasInitializeFunction = false; m_HasInitializeFunction = false;
m_HasUpdateFunction = false; m_HasUpdateFunction = false;

View File

@ -54,10 +54,10 @@ CMeter::CMeter(CMeterWindow* meterWindow, const WCHAR* name) : m_MeterWindow(met
m_ToolTipWidth(), m_ToolTipWidth(),
m_ToolTipDelay(), m_ToolTipDelay(),
m_ToolTipType(false), m_ToolTipType(false),
m_ToolTipHidden(meterWindow ? meterWindow->GetMeterToolTipHidden() : false), m_ToolTipHidden(meterWindow->GetMeterToolTipHidden()),
m_ToolTipHandle(), m_ToolTipHandle(),
m_HasMouseAction(false), m_HasMouseAction(false),
m_MouseActionCursor(meterWindow ? meterWindow->GetMeterMouseActionCursor() : true), m_MouseActionCursor(meterWindow->GetMeterMouseActionCursor()),
m_MouseOver(false), m_MouseOver(false),
m_RelativeX(POSITION_ABSOLUTE), m_RelativeX(POSITION_ABSOLUTE),
m_RelativeY(POSITION_ABSOLUTE), m_RelativeY(POSITION_ABSOLUTE),
@ -107,7 +107,7 @@ void CMeter::Initialize()
*/ */
int CMeter::GetX(bool abs) int CMeter::GetX(bool abs)
{ {
if (m_RelativeX != POSITION_ABSOLUTE && m_MeterWindow) if (m_RelativeX != POSITION_ABSOLUTE)
{ {
if (m_RelativeMeter == NULL) if (m_RelativeMeter == NULL)
{ {
@ -155,7 +155,7 @@ int CMeter::GetX(bool abs)
*/ */
int CMeter::GetY(bool abs) int CMeter::GetY(bool abs)
{ {
if (m_RelativeY != POSITION_ABSOLUTE && m_MeterWindow) if (m_RelativeY != POSITION_ABSOLUTE)
{ {
if (m_RelativeMeter == NULL) if (m_RelativeMeter == NULL)
{ {
@ -402,7 +402,7 @@ void CMeter::ReadConfig(CConfigParser& parser, const WCHAR* section)
m_MouseOverAction = parser.ReadString(section, L"MouseOverAction", L"", false); m_MouseOverAction = parser.ReadString(section, L"MouseOverAction", L"", false);
m_MouseLeaveAction = parser.ReadString(section, L"MouseLeaveAction", L"", false); m_MouseLeaveAction = parser.ReadString(section, L"MouseLeaveAction", L"", false);
m_MouseActionCursor = 0!=parser.ReadInt(section, L"MouseActionCursor", m_MeterWindow ? m_MeterWindow->GetMeterMouseActionCursor() : true); m_MouseActionCursor = 0!=parser.ReadInt(section, L"MouseActionCursor", m_MeterWindow->GetMeterMouseActionCursor());
m_HasMouseAction = m_HasMouseAction =
( !m_LeftMouseUpAction.empty() || !m_LeftMouseDownAction.empty() || !m_LeftMouseDoubleClickAction.empty() ( !m_LeftMouseUpAction.empty() || !m_LeftMouseDownAction.empty() || !m_LeftMouseDoubleClickAction.empty()
@ -414,7 +414,7 @@ void CMeter::ReadConfig(CConfigParser& parser, const WCHAR* section)
m_ToolTipIcon = parser.ReadString(section, L"ToolTipIcon", L""); m_ToolTipIcon = parser.ReadString(section, L"ToolTipIcon", L"");
m_ToolTipWidth = (int)parser.ReadFormula(section, L"ToolTipWidth", 1000); m_ToolTipWidth = (int)parser.ReadFormula(section, L"ToolTipWidth", 1000);
m_ToolTipType = 0!=parser.ReadInt(section, L"ToolTipType", 0); m_ToolTipType = 0!=parser.ReadInt(section, L"ToolTipType", 0);
m_ToolTipHidden = 0!=parser.ReadInt(section, L"ToolTipHidden", m_MeterWindow ? m_MeterWindow->GetMeterToolTipHidden() : false); m_ToolTipHidden = 0!=parser.ReadInt(section, L"ToolTipHidden", m_MeterWindow->GetMeterToolTipHidden());
int updateDivider = parser.ReadInt(section, L"UpdateDivider", 1); int updateDivider = parser.ReadInt(section, L"UpdateDivider", 1);
if (updateDivider != m_UpdateDivider) if (updateDivider != m_UpdateDivider)
@ -439,11 +439,9 @@ void CMeter::ReadConfig(CConfigParser& parser, const WCHAR* section)
} }
else if (!matrix.empty()) else if (!matrix.empty())
{ {
if (m_Transformation) delete m_Transformation;
{ m_Transformation = NULL;
delete m_Transformation;
m_Transformation = NULL;
}
LogWithArgs(LOG_ERROR, L"Meter: Incorrect number of values in TransformationMatrix=%s", parser.ReadString(section, L"TransformationMatrix", L"").c_str()); LogWithArgs(LOG_ERROR, L"Meter: Incorrect number of values in TransformationMatrix=%s", parser.ReadString(section, L"TransformationMatrix", L"").c_str());
} }
@ -496,14 +494,18 @@ void CMeter::BindMeasure(const std::list<CMeasure*>& measures)
*/ */
CMeter* CMeter::Create(const WCHAR* meter, CMeterWindow* meterWindow, const WCHAR* name) CMeter* CMeter::Create(const WCHAR* meter, CMeterWindow* meterWindow, const WCHAR* name)
{ {
if (_wcsicmp(L"HISTOGRAM", meter) == 0) if (_wcsicmp(L"STRING", meter) == 0)
{
return new CMeterHistogram(meterWindow, name);
}
else if (_wcsicmp(L"STRING", meter) == 0)
{ {
return new CMeterString(meterWindow, name); return new CMeterString(meterWindow, name);
} }
else if (_wcsicmp(L"IMAGE", meter) == 0)
{
return new CMeterImage(meterWindow, name);
}
else if (_wcsicmp(L"HISTOGRAM", meter) == 0)
{
return new CMeterHistogram(meterWindow, name);
}
else if (_wcsicmp(L"BAR", meter) == 0) else if (_wcsicmp(L"BAR", meter) == 0)
{ {
return new CMeterBar(meterWindow, name); return new CMeterBar(meterWindow, name);
@ -512,10 +514,6 @@ CMeter* CMeter::Create(const WCHAR* meter, CMeterWindow* meterWindow, const WCHA
{ {
return new CMeterBitmap(meterWindow, name); return new CMeterBitmap(meterWindow, name);
} }
else if (_wcsicmp(L"IMAGE", meter) == 0)
{
return new CMeterImage(meterWindow, name);
}
else if (_wcsicmp(L"LINE", meter) == 0) else if (_wcsicmp(L"LINE", meter) == 0)
{ {
return new CMeterLine(meterWindow, name); return new CMeterLine(meterWindow, name);
@ -613,7 +611,8 @@ void CMeter::ReadMeasureNames(CConfigParser& parser, const WCHAR* section, std::
loop = false; loop = false;
} }
++i; ++i;
} while(loop); }
while(loop);
} }
/* /*
@ -646,7 +645,8 @@ bool CMeter::ReplaceMeasures(const std::vector<std::wstring>& stringValues, std:
start = pos + stringValues[i - 1].length(); start = pos + stringValues[i - 1].length();
replaced = true; replaced = true;
} }
} while (pos != std::wstring::npos); }
while (pos != std::wstring::npos);
} }
} }
@ -665,9 +665,10 @@ void CMeter::ReplaceToolTipMeasures(std::wstring& str)
if (!m_AllMeasures.empty()) if (!m_AllMeasures.empty())
{ {
// Get the values for the measures // Get the values for the measures
for (size_t i = 0, isize = m_AllMeasures.size(); i < isize; ++i) std::vector<CMeasure*>::const_iterator iter = m_AllMeasures.begin();
for ( ; iter != m_AllMeasures.end(); ++iter)
{ {
stringValues.push_back(m_AllMeasures[i]->GetStringValue(AUTOSCALE_ON, 1, 0, false)); stringValues.push_back((*iter)->GetStringValue(AUTOSCALE_ON, 1, 0, false));
} }
} }
else if (m_Measure != NULL) else if (m_Measure != NULL)
@ -692,6 +693,8 @@ void CMeter::ReplaceToolTipMeasures(std::wstring& str)
*/ */
void CMeter::CreateToolTip(CMeterWindow* meterWindow) void CMeter::CreateToolTip(CMeterWindow* meterWindow)
{ {
HWND hMeterWindow = m_MeterWindow->GetWindow();
HINSTANCE hInstance = m_MeterWindow->GetMainObject()->GetInstance();
DWORD style = WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP; DWORD style = WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP;
if (m_ToolTipType) if (m_ToolTipType)
@ -707,21 +710,16 @@ void CMeter::CreateToolTip(CMeterWindow* meterWindow)
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
m_MeterWindow->GetWindow(), hMeterWindow,
NULL, NULL,
m_MeterWindow->GetMainObject()->GetInstance(), hInstance,
NULL); NULL);
if (hwndTT) if (hwndTT)
{ {
SetWindowPos(hwndTT, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); SetWindowPos(hwndTT, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
TOOLINFO ti = {sizeof(TOOLINFO)}; TOOLINFO ti = {sizeof(TOOLINFO), TTF_SUBCLASS, hMeterWindow, 0, GetMeterRect(), hInstance};
ti.uFlags = TTF_SUBCLASS;
ti.hwnd = m_MeterWindow->GetWindow();
ti.hinst = m_MeterWindow->GetMainObject()->GetInstance();
ti.rect = GetMeterRect();
SendMessage(hwndTT, TTM_ADDTOOL, NULL, (LPARAM) (LPTOOLINFO) &ti); SendMessage(hwndTT, TTM_ADDTOOL, NULL, (LPARAM) (LPTOOLINFO) &ti);
@ -759,23 +757,23 @@ void CMeter::UpdateToolTip()
if (!m_ToolTipIcon.empty()) if (!m_ToolTipIcon.empty())
{ {
if (!_wcsicmp(m_ToolTipIcon.c_str(), L"INFO")) if (_wcsicmp(m_ToolTipIcon.c_str(), L"INFO") == 0)
{ {
hIcon = (HICON) TTI_INFO; hIcon = (HICON) TTI_INFO;
} }
else if (!_wcsicmp(m_ToolTipIcon.c_str(), L"WARNING")) else if (_wcsicmp(m_ToolTipIcon.c_str(), L"WARNING") == 0)
{ {
hIcon = (HICON) TTI_WARNING; hIcon = (HICON) TTI_WARNING;
} }
else if (!_wcsicmp(m_ToolTipIcon.c_str(), L"ERROR")) else if (_wcsicmp(m_ToolTipIcon.c_str(), L"ERROR") == 0)
{ {
hIcon = (HICON) TTI_ERROR; hIcon = (HICON) TTI_ERROR;
} }
else if (!_wcsicmp(m_ToolTipIcon.c_str(), L"QUESTION")) else if (_wcsicmp(m_ToolTipIcon.c_str(), L"QUESTION") == 0)
{ {
hIcon = LoadIcon(NULL, IDI_QUESTION); hIcon = LoadIcon(NULL, IDI_QUESTION);
} }
else if (!_wcsicmp(m_ToolTipIcon.c_str(), L"SHIELD")) else if (_wcsicmp(m_ToolTipIcon.c_str(), L"SHIELD") == 0)
{ {
hIcon = LoadIcon(NULL, IDI_SHIELD); hIcon = LoadIcon(NULL, IDI_SHIELD);
} }

View File

@ -131,7 +131,8 @@ bool CMeterBitmap::HitTest(int x, int y)
{ {
tmpValue /= realFrames; tmpValue /= realFrames;
} }
} while (tmpValue > 0); }
while (tmpValue > 0);
} }
Rect rect(GetX(), GetY(), m_W * numOfNums + (numOfNums - 1) * m_Separation, m_H); Rect rect(GetX(), GetY(), m_W * numOfNums + (numOfNums - 1) * m_Separation, m_H);
@ -332,7 +333,8 @@ bool CMeterBitmap::Draw(Graphics& graphics)
{ {
tmpValue /= m_FrameCount; tmpValue /= m_FrameCount;
} }
} while (tmpValue > 0); }
while (tmpValue > 0);
} }
// Blit the images // Blit the images
@ -407,7 +409,8 @@ bool CMeterBitmap::Draw(Graphics& graphics)
transitionValue /= realFrames; transitionValue /= realFrames;
} }
--numOfNums; --numOfNums;
} while (numOfNums > 0); }
while (numOfNums > 0);
} }
else else
{ {

View File

@ -45,7 +45,7 @@ CMeterButton::CMeterButton(CMeterWindow* meterWindow, const WCHAR* name) : CMete
m_Bitmaps(), m_Bitmaps(),
m_State(BUTTON_STATE_NORMAL), m_State(BUTTON_STATE_NORMAL),
m_Clicked(false), m_Clicked(false),
m_Executable(false) m_Focus(false)
{ {
} }
@ -75,11 +75,8 @@ void CMeterButton::Initialize()
for (int i = 0; i < BUTTON_FRAMES; ++i) for (int i = 0; i < BUTTON_FRAMES; ++i)
{ {
if (m_Bitmaps[i]) delete m_Bitmaps[i];
{ m_Bitmaps[i] = NULL;
delete m_Bitmaps[i];
m_Bitmaps[i] = NULL;
}
} }
// Load the bitmaps if defined // Load the bitmaps if defined
@ -91,16 +88,19 @@ void CMeterButton::Initialize()
{ {
Bitmap* bitmap = m_Image.GetImage(); Bitmap* bitmap = m_Image.GetImage();
m_W = bitmap->GetWidth(); int bitmapW = bitmap->GetWidth();
m_H = bitmap->GetHeight(); int bitmapH = bitmap->GetHeight();
m_W = bitmapW;
m_H = bitmapH;
if (m_H > m_W) if (m_H > m_W)
{ {
m_H = m_H / BUTTON_FRAMES; m_H /= BUTTON_FRAMES;
} }
else else
{ {
m_W = m_W / BUTTON_FRAMES; m_W /= BUTTON_FRAMES;
} }
// Separate the frames // Separate the frames
@ -110,7 +110,7 @@ void CMeterButton::Initialize()
Graphics graphics(&bitmapPart); Graphics graphics(&bitmapPart);
Rect r(0, 0, m_W, m_H); Rect r(0, 0, m_W, m_H);
if (m_H > m_W) if (bitmapH > bitmapW)
{ {
graphics.DrawImage(bitmap, r, 0, m_H * i, m_W, m_H, UnitPixel); graphics.DrawImage(bitmap, r, 0, m_H * i, m_W, m_H, UnitPixel);
} }
@ -269,13 +269,13 @@ bool CMeterButton::HitTest2(int px, int py, bool checkAlpha)
return false; return false;
} }
bool CMeterButton::MouseUp(POINT pos, CMeterWindow* window) bool CMeterButton::MouseUp(POINT pos, bool execute)
{ {
if (m_State == BUTTON_STATE_DOWN) if (m_State == BUTTON_STATE_DOWN)
{ {
if (window && m_Clicked && m_Executable && HitTest2(pos.x, pos.y, true)) if (execute && m_Clicked && m_Focus && HitTest2(pos.x, pos.y, true))
{ {
Rainmeter->ExecuteCommand(m_Command.c_str(), window); Rainmeter->ExecuteCommand(m_Command.c_str(), m_MeterWindow);
} }
m_State = BUTTON_STATE_NORMAL; m_State = BUTTON_STATE_NORMAL;
m_Clicked = false; m_Clicked = false;
@ -288,7 +288,7 @@ bool CMeterButton::MouseUp(POINT pos, CMeterWindow* window)
bool CMeterButton::MouseDown(POINT pos) bool CMeterButton::MouseDown(POINT pos)
{ {
if (m_Executable && HitTest2(pos.x, pos.y, true)) if (m_Focus && HitTest2(pos.x, pos.y, true))
{ {
m_State = BUTTON_STATE_DOWN; m_State = BUTTON_STATE_DOWN;
m_Clicked = true; m_Clicked = true;
@ -299,7 +299,7 @@ bool CMeterButton::MouseDown(POINT pos)
bool CMeterButton::MouseMove(POINT pos) bool CMeterButton::MouseMove(POINT pos)
{ {
if (m_Clicked == true) if (m_Clicked)
{ {
if (HitTest2(pos.x, pos.y, true)) if (HitTest2(pos.x, pos.y, true))
{ {

View File

@ -37,11 +37,10 @@ public:
virtual void BindMeasure(const std::list<CMeasure*>& measures); virtual void BindMeasure(const std::list<CMeasure*>& measures);
bool MouseMove(POINT pos); bool MouseMove(POINT pos);
bool MouseUp(POINT pos, CMeterWindow* window); bool MouseUp(POINT pos, bool execute);
bool MouseDown(POINT pos); bool MouseDown(POINT pos);
void SetExecutable(bool exec) { m_Executable = exec; } void SetFocus(bool f) { m_Focus = f; }
bool IsExecutable() { return m_Executable; }
private: private:
bool HitTest2(int px, int py, bool checkAlpha); bool HitTest2(int px, int py, bool checkAlpha);
@ -54,7 +53,7 @@ private:
std::wstring m_Command; // Command to be executed std::wstring m_Command; // Command to be executed
int m_State; int m_State;
bool m_Clicked; bool m_Clicked;
bool m_Executable; bool m_Focus;
}; };
#endif #endif

View File

@ -83,16 +83,11 @@ void CMeterHistogram::DisposeBuffer()
m_MeterPos = 0; m_MeterPos = 0;
// Delete buffers // Delete buffers
if (m_PrimaryValues) delete [] m_PrimaryValues;
{ m_PrimaryValues = NULL;
delete [] m_PrimaryValues;
m_PrimaryValues = NULL; delete [] m_SecondaryValues;
} m_SecondaryValues = NULL;
if (m_SecondaryValues)
{
delete [] m_SecondaryValues;
m_SecondaryValues = NULL;
}
} }
/* /*

View File

@ -185,9 +185,10 @@ bool CMeterImage::Update()
stringValues.push_back(val); stringValues.push_back(val);
// Get the values for the other measures // Get the values for the other measures
for (size_t i = 0, isize = m_Measures.size(); i < isize; ++i) std::vector<CMeasure*>::const_iterator iter = m_Measures.begin();
for ( ; iter != m_Measures.end(); ++iter)
{ {
stringValues.push_back(m_Measures[i]->GetStringValue(AUTOSCALE_OFF, 1, 0, false)); stringValues.push_back((*iter)->GetStringValue(AUTOSCALE_OFF, 1, 0, false));
} }
m_ImageNameResult = m_ImageName; m_ImageNameResult = m_ImageName;

View File

@ -484,9 +484,10 @@ bool CMeterString::Update()
if (m_Measure) stringValues.push_back(m_Measure->GetStringValue(m_AutoScale, m_Scale, decimals, m_Percentual)); if (m_Measure) stringValues.push_back(m_Measure->GetStringValue(m_AutoScale, m_Scale, decimals, m_Percentual));
// Get the values for the other measures // Get the values for the other measures
for (size_t i = 0, isize = m_Measures.size(); i < isize; ++i) std::vector<CMeasure*>::const_iterator iter = m_Measures.begin();
for ( ; iter != m_Measures.end(); ++iter)
{ {
stringValues.push_back(m_Measures[i]->GetStringValue(m_AutoScale, m_Scale, decimals, m_Percentual)); stringValues.push_back((*iter)->GetStringValue(m_AutoScale, m_Scale, decimals, m_Percentual));
} }
// Create the text // Create the text

View File

@ -189,8 +189,8 @@ CMeterWindow::~CMeterWindow()
delete (*i); delete (*i);
} }
if (m_Background) delete m_Background; delete m_Background;
if (m_DoubleBuffer) delete m_DoubleBuffer; delete m_DoubleBuffer;
if (m_DIBSectionBuffer) DeleteObject(m_DIBSectionBuffer); if (m_DIBSectionBuffer) DeleteObject(m_DIBSectionBuffer);
if (m_BlurRegion) DeleteObject(m_BlurRegion); if (m_BlurRegion) DeleteObject(m_BlurRegion);
@ -215,7 +215,8 @@ CMeterWindow::~CMeterWindow()
Result = UnregisterClass(METERWINDOW_CLASS_NAME, m_Rainmeter->GetInstance()); Result = UnregisterClass(METERWINDOW_CLASS_NAME, m_Rainmeter->GetInstance());
Sleep(100); Sleep(100);
++counter; ++counter;
} while(!Result && counter < 10); }
while(!Result && counter < 10);
if (c_DwmInstance) if (c_DwmInstance)
{ {
@ -367,7 +368,7 @@ void CMeterWindow::Refresh(bool init, bool all)
} }
m_Meters.clear(); m_Meters.clear();
if (m_Background) delete m_Background; delete m_Background;
m_Background = NULL; m_Background = NULL;
m_BackgroundSize.cx = m_BackgroundSize.cy = 0; m_BackgroundSize.cx = m_BackgroundSize.cy = 0;
@ -933,8 +934,8 @@ void CMeterWindow::RunBang(BANGCOMMAND bang, const WCHAR* arg)
{ {
args.erase(pos3, 1); args.erase(pos3, 1);
} }
}
} while(pos3 != std::wstring::npos); while(pos3 != std::wstring::npos);
pos3 = args.find(L' '); pos3 = args.find(L' ');
if (pos3 != std::wstring::npos) if (pos3 != std::wstring::npos)
@ -2149,8 +2150,8 @@ bool CMeterWindow::ReadSkin()
WCHAR tmpName[64]; WCHAR tmpName[64];
_snwprintf_s(tmpName, _TRUNCATE, L"BlurRegion%i", ++i); _snwprintf_s(tmpName, _TRUNCATE, L"BlurRegion%i", ++i);
blurRegion = m_Parser.ReadString(L"Rainmeter", tmpName, L""); blurRegion = m_Parser.ReadString(L"Rainmeter", tmpName, L"");
}
} while (!blurRegion.empty()); while (!blurRegion.empty());
} }
else else
{ {
@ -2208,8 +2209,8 @@ bool CMeterWindow::ReadSkin()
WCHAR tmpName[64]; WCHAR tmpName[64];
_snwprintf_s(tmpName, _TRUNCATE, L"LocalFont%i", ++i); _snwprintf_s(tmpName, _TRUNCATE, L"LocalFont%i", ++i);
localFont = m_Parser.ReadString(L"Rainmeter", tmpName, L""); localFont = m_Parser.ReadString(L"Rainmeter", tmpName, L"");
}
} while (!localFont.empty()); while (!localFont.empty());
} }
// Create the meters and measures // Create the meters and measures
@ -2218,18 +2219,17 @@ bool CMeterWindow::ReadSkin()
m_HasButtons = false; m_HasButtons = false;
// Get all the sections (i.e. different meters, measures and the other stuff) // Get all the sections (i.e. different meters, measures and the other stuff)
std::vector<std::wstring> arraySections = m_Parser.GetSections(); std::vector<std::wstring>::const_iterator iter = m_Parser.GetSections().begin();
for ( ; iter != m_Parser.GetSections().end(); ++iter)
for (size_t i = 0, isize = arraySections.size(); i < isize; ++i)
{ {
const WCHAR* section = arraySections[i].c_str(); const WCHAR* section = (*iter).c_str();
if (_wcsicmp(L"Rainmeter", section) != 0 && if (_wcsicmp(L"Rainmeter", section) != 0 &&
_wcsicmp(L"Variables", section) != 0 && _wcsicmp(L"Variables", section) != 0 &&
_wcsicmp(L"Metadata", section) != 0) _wcsicmp(L"Metadata", section) != 0)
{ {
// Check if the item is a meter or a measure (or perhaps something else) // Check if the item is a meter or a measure (or perhaps something else)
const std::wstring& measureName = m_Parser.ReadString(section, L"Measure", L""); const std::wstring& measureName = m_Parser.ReadString(section, L"Measure", L"", false);
if (!measureName.empty()) if (!measureName.empty())
{ {
// It's a measure // It's a measure
@ -2261,7 +2261,7 @@ bool CMeterWindow::ReadSkin()
continue; continue;
} }
const std::wstring& meterName = m_Parser.ReadString(section, L"Meter", L""); const std::wstring& meterName = m_Parser.ReadString(section, L"Meter", L"", false);
if (!meterName.empty()) if (!meterName.empty())
{ {
// It's a meter // It's a meter
@ -2410,11 +2410,8 @@ bool CMeterWindow::ResizeWindow(bool reset)
// Reset size (this is calculated below) // Reset size (this is calculated below)
if (m_Background) delete m_Background;
{ m_Background = NULL;
delete m_Background;
m_Background = NULL;
}
if ((m_BackgroundMode == BGMODE_IMAGE || m_BackgroundMode == BGMODE_SCALED_IMAGE || m_BackgroundMode == BGMODE_TILED_IMAGE) && !m_BackgroundName.empty()) if ((m_BackgroundMode == BGMODE_IMAGE || m_BackgroundMode == BGMODE_SCALED_IMAGE || m_BackgroundMode == BGMODE_TILED_IMAGE) && !m_BackgroundName.empty())
{ {
@ -2644,6 +2641,8 @@ void CMeterWindow::CreateRegion(bool clear)
} }
else else
{ {
HRGN region = NULL;
// Set window region if needed // Set window region if needed
if (!m_BackgroundName.empty()) if (!m_BackgroundName.empty())
{ {
@ -2653,20 +2652,13 @@ void CMeterWindow::CreateRegion(bool clear)
m_DoubleBuffer->GetHBITMAP(Color(255,0,255), &background); m_DoubleBuffer->GetHBITMAP(Color(255,0,255), &background);
if (background) if (background)
{ {
HRGN region = BitmapToRegion(background, RGB(255,0,255), 0x101010); region = BitmapToRegion(background, RGB(255,0,255), 0x101010);
SetWindowRgn(m_Window, region, TRUE);
DeleteObject(background); DeleteObject(background);
} }
else
{
SetWindowRgn(m_Window, NULL, TRUE);
}
}
else
{
SetWindowRgn(m_Window, NULL, TRUE);
} }
} }
SetWindowRgn(m_Window, region, !m_NativeTransparency);
} }
} }
@ -2697,7 +2689,7 @@ void CMeterWindow::Redraw()
if (cx != m_DIBSectionBufferW || cy != m_DIBSectionBufferH || m_DIBSectionBufferPixels == NULL) if (cx != m_DIBSectionBufferW || cy != m_DIBSectionBufferH || m_DIBSectionBufferPixels == NULL)
{ {
if (m_DoubleBuffer) delete m_DoubleBuffer; delete m_DoubleBuffer;
if (m_DIBSectionBuffer) DeleteObject(m_DIBSectionBuffer); if (m_DIBSectionBuffer) DeleteObject(m_DIBSectionBuffer);
m_DIBSectionBufferPixels = NULL; m_DIBSectionBufferPixels = NULL;
@ -2760,7 +2752,7 @@ void CMeterWindow::Redraw()
for ( ; j != m_Meters.end(); ++j) for ( ; j != m_Meters.end(); ++j)
{ {
const Matrix* matrix = (*j)->GetTransformationMatrix(); const Matrix* matrix = (*j)->GetTransformationMatrix();
if (matrix && matrix->IsIdentity()) if (matrix && !matrix->IsIdentity())
{ {
// Change the world matrix // Change the world matrix
graphics.SetTransform(matrix); graphics.SetTransform(matrix);
@ -2962,7 +2954,7 @@ void CMeterWindow::Update(bool nodraw)
// If our option is to disable when in an RDP session, then check if in an RDP session. // If our option is to disable when in an RDP session, then check if in an RDP session.
// Only redraw if we are not in a remote session // Only redraw if we are not in a remote session
if (!Rainmeter->GetDisableRDP() || !GetSystemMetrics(SM_REMOTESESSION)) if (!m_Rainmeter->GetDisableRDP() || !GetSystemMetrics(SM_REMOTESESSION))
{ {
Redraw(); Redraw();
} }
@ -3334,10 +3326,9 @@ bool CMeterWindow::HitTest(int x, int y)
** HandleButtons ** HandleButtons
** **
** Handles all buttons and cursor. ** Handles all buttons and cursor.
** Note that meterWindow parameter is used if proc is BUTTONPROC_UP.
** **
*/ */
void CMeterWindow::HandleButtons(POINT pos, BUTTONPROC proc, CMeterWindow* meterWindow) void CMeterWindow::HandleButtons(POINT pos, BUTTONPROC proc, bool execute)
{ {
bool redraw = false; bool redraw = false;
bool drawCursor = false; bool drawCursor = false;
@ -3361,7 +3352,7 @@ void CMeterWindow::HandleButtons(POINT pos, BUTTONPROC proc, CMeterWindow* meter
break; break;
case BUTTONPROC_UP: case BUTTONPROC_UP:
redraw |= button->MouseUp(pos, meterWindow); redraw |= button->MouseUp(pos, execute);
break; break;
case BUTTONPROC_MOVE: case BUTTONPROC_MOVE:
@ -3483,7 +3474,7 @@ LRESULT CMeterWindow::OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam)
while (DoMoveAction(pos.x, pos.y, MOUSE_OVER)) ; while (DoMoveAction(pos.x, pos.y, MOUSE_OVER)) ;
// Handle buttons // Handle buttons
HandleButtons(pos, BUTTONPROC_MOVE, NULL); HandleButtons(pos, BUTTONPROC_MOVE);
} }
return 0; return 0;
@ -3508,7 +3499,7 @@ LRESULT CMeterWindow::OnMouseLeave(UINT uMsg, WPARAM wParam, LPARAM lParam)
while (DoMoveAction(pos.x, pos.y, MOUSE_LEAVE)) ; // Leave all forcibly while (DoMoveAction(pos.x, pos.y, MOUSE_LEAVE)) ; // Leave all forcibly
// Handle buttons // Handle buttons
HandleButtons(pos, BUTTONPROC_MOVE, NULL); HandleButtons(pos, BUTTONPROC_MOVE);
} }
return 0; return 0;
@ -3873,7 +3864,7 @@ LRESULT CMeterWindow::OnSysCommand(UINT uMsg, WPARAM wParam, LPARAM lParam)
MapWindowPoints(NULL, m_Window, &pos, 1); MapWindowPoints(NULL, m_Window, &pos, 1);
// Handle buttons // Handle buttons
HandleButtons(pos, BUTTONPROC_UP, NULL); // redraw only HandleButtons(pos, BUTTONPROC_UP, false); // redraw only
// Workaround for the system that the window size is changed incorrectly when the window is dragged over the upper side of the virtual screen // Workaround for the system that the window size is changed incorrectly when the window is dragged over the upper side of the virtual screen
UpdateTransparency(m_TransparencyValue, false); UpdateTransparency(m_TransparencyValue, false);
@ -3932,7 +3923,7 @@ LRESULT CMeterWindow::OnExitSizeMove(UINT uMsg, WPARAM wParam, LPARAM lParam)
*/ */
LRESULT CMeterWindow::OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam) LRESULT CMeterWindow::OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam)
{ {
if (m_WindowDraggable && !Rainmeter->GetDisableDragging()) if (m_WindowDraggable && !m_Rainmeter->GetDisableDragging())
{ {
POINT pos; POINT pos;
pos.x = (SHORT)LOWORD(lParam); pos.x = (SHORT)LOWORD(lParam);
@ -4007,7 +3998,7 @@ LRESULT CMeterWindow::OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lPara
} }
// Snap to other windows // Snap to other windows
const std::map<std::wstring, CMeterWindow*>& windows = Rainmeter->GetAllMeterWindows(); const std::map<std::wstring, CMeterWindow*>& windows = m_Rainmeter->GetAllMeterWindows();
std::map<std::wstring, CMeterWindow*>::const_iterator iter = windows.begin(); std::map<std::wstring, CMeterWindow*>::const_iterator iter = windows.begin();
for ( ; iter != windows.end(); ++iter) for ( ; iter != windows.end(); ++iter)
{ {
@ -4190,7 +4181,7 @@ LRESULT CMeterWindow::OnLeftButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam)
} }
// Handle buttons // Handle buttons
HandleButtons(pos, BUTTONPROC_DOWN, NULL); HandleButtons(pos, BUTTONPROC_DOWN);
if (GetKeyState(VK_CONTROL) < 0 || // Ctrl is pressed, so only run default action if (GetKeyState(VK_CONTROL) < 0 || // Ctrl is pressed, so only run default action
(!DoAction(pos.x, pos.y, MOUSE_LMB_DOWN, false) && m_WindowDraggable)) (!DoAction(pos.x, pos.y, MOUSE_LMB_DOWN, false) && m_WindowDraggable))
@ -4224,7 +4215,7 @@ LRESULT CMeterWindow::OnLeftButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam)
} }
// Handle buttons // Handle buttons
HandleButtons(pos, BUTTONPROC_UP, this); HandleButtons(pos, BUTTONPROC_UP);
DoAction(pos.x, pos.y, MOUSE_LMB_UP, false); DoAction(pos.x, pos.y, MOUSE_LMB_UP, false);
@ -4250,7 +4241,7 @@ LRESULT CMeterWindow::OnLeftButtonDoubleClick(UINT uMsg, WPARAM wParam, LPARAM l
} }
// Handle buttons // Handle buttons
HandleButtons(pos, BUTTONPROC_DOWN, NULL); HandleButtons(pos, BUTTONPROC_DOWN);
if (!DoAction(pos.x, pos.y, MOUSE_LMB_DBLCLK, false)) if (!DoAction(pos.x, pos.y, MOUSE_LMB_DBLCLK, false))
{ {
@ -4279,7 +4270,7 @@ LRESULT CMeterWindow::OnRightButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam)
} }
// Handle buttons // Handle buttons
HandleButtons(pos, BUTTONPROC_MOVE, NULL); HandleButtons(pos, BUTTONPROC_MOVE);
DoAction(pos.x, pos.y, MOUSE_RMB_DOWN, false); DoAction(pos.x, pos.y, MOUSE_RMB_DOWN, false);
@ -4299,7 +4290,7 @@ LRESULT CMeterWindow::OnRightButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam)
pos.y = (SHORT)HIWORD(lParam); pos.y = (SHORT)HIWORD(lParam);
// Handle buttons // Handle buttons
HandleButtons(pos, BUTTONPROC_MOVE, NULL); HandleButtons(pos, BUTTONPROC_MOVE);
if (GetKeyState(VK_CONTROL) < 0 || // Ctrl is pressed, so only run default action if (GetKeyState(VK_CONTROL) < 0 || // Ctrl is pressed, so only run default action
!DoAction(pos.x, pos.y, MOUSE_RMB_UP, false)) !DoAction(pos.x, pos.y, MOUSE_RMB_UP, false))
@ -4330,7 +4321,7 @@ LRESULT CMeterWindow::OnRightButtonDoubleClick(UINT uMsg, WPARAM wParam, LPARAM
} }
// Handle buttons // Handle buttons
HandleButtons(pos, BUTTONPROC_MOVE, NULL); HandleButtons(pos, BUTTONPROC_MOVE);
if (!DoAction(pos.x, pos.y, MOUSE_RMB_DBLCLK, false)) if (!DoAction(pos.x, pos.y, MOUSE_RMB_DBLCLK, false))
{ {
@ -4359,7 +4350,7 @@ LRESULT CMeterWindow::OnMiddleButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam
} }
// Handle buttons // Handle buttons
HandleButtons(pos, BUTTONPROC_MOVE, NULL); HandleButtons(pos, BUTTONPROC_MOVE);
DoAction(pos.x, pos.y, MOUSE_MMB_DOWN, false); DoAction(pos.x, pos.y, MOUSE_MMB_DOWN, false);
@ -4385,7 +4376,7 @@ LRESULT CMeterWindow::OnMiddleButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam)
} }
// Handle buttons // Handle buttons
HandleButtons(pos, BUTTONPROC_MOVE, NULL); HandleButtons(pos, BUTTONPROC_MOVE);
DoAction(pos.x, pos.y, MOUSE_MMB_UP, false); DoAction(pos.x, pos.y, MOUSE_MMB_UP, false);
@ -4411,7 +4402,7 @@ LRESULT CMeterWindow::OnMiddleButtonDoubleClick(UINT uMsg, WPARAM wParam, LPARAM
} }
// Handle buttons // Handle buttons
HandleButtons(pos, BUTTONPROC_MOVE, NULL); HandleButtons(pos, BUTTONPROC_MOVE);
if (!DoAction(pos.x, pos.y, MOUSE_MMB_DBLCLK, false)) if (!DoAction(pos.x, pos.y, MOUSE_MMB_DBLCLK, false))
{ {
@ -4448,7 +4439,7 @@ LRESULT CMeterWindow::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam)
POINT posc = {pos.x - rect.left, pos.y - rect.top}; POINT posc = {pos.x - rect.left, pos.y - rect.top};
// Handle buttons // Handle buttons
HandleButtons(posc, BUTTONPROC_MOVE, NULL); HandleButtons(posc, BUTTONPROC_MOVE);
// If RMB up or RMB down or double-click cause actions, do not show the menu! // If RMB up or RMB down or double-click cause actions, do not show the menu!
if (!(GetKeyState(VK_CONTROL) < 0) && // Ctrl is pressed, so ignore any actions if (!(GetKeyState(VK_CONTROL) < 0) && // Ctrl is pressed, so ignore any actions
@ -4682,18 +4673,12 @@ bool CMeterWindow::DoMoveAction(int x, int y, MOUSE mouse)
{ {
if (!buttonFound) if (!buttonFound)
{ {
if (!button->IsExecutable()) button->SetFocus(true);
{
button->SetExecutable(true);
}
buttonFound = true; buttonFound = true;
} }
else else
{ {
if (button->IsExecutable()) button->SetFocus(false);
{
button->SetExecutable(false);
}
} }
} }
} }
@ -4729,10 +4714,7 @@ bool CMeterWindow::DoMoveAction(int x, int y, MOUSE mouse)
CMeterButton* button = dynamic_cast<CMeterButton*>(*j); CMeterButton* button = dynamic_cast<CMeterButton*>(*j);
if (button) if (button)
{ {
if (button->IsExecutable()) button->SetFocus(false);
{
button->SetExecutable(false);
}
} }
} }
@ -4977,7 +4959,7 @@ LRESULT CMeterWindow::OnCopyData(UINT uMsg, WPARAM wParam, LPARAM lParam)
{ {
// Check that we're still alive // Check that we're still alive
bool found = false; bool found = false;
const std::map<std::wstring, CMeterWindow*>& meters = Rainmeter->GetAllMeterWindows(); const std::map<std::wstring, CMeterWindow*>& meters = m_Rainmeter->GetAllMeterWindows();
std::map<std::wstring, CMeterWindow*>::const_iterator iter = meters.begin(); std::map<std::wstring, CMeterWindow*>::const_iterator iter = meters.begin();
for ( ; iter != meters.end(); ++iter) for ( ; iter != meters.end(); ++iter)
@ -5001,7 +4983,7 @@ LRESULT CMeterWindow::OnCopyData(UINT uMsg, WPARAM wParam, LPARAM lParam)
_wcsnicmp(L"PLAYSTOP", str.c_str(), 8) == 0) _wcsnicmp(L"PLAYSTOP", str.c_str(), 8) == 0)
{ {
// Audio commands are special cases. // Audio commands are special cases.
Rainmeter->ExecuteCommand(str.c_str(), this); m_Rainmeter->ExecuteCommand(str.c_str(), this);
return TRUE; return TRUE;
} }
@ -5044,7 +5026,7 @@ LRESULT CMeterWindow::OnCopyData(UINT uMsg, WPARAM wParam, LPARAM lParam)
arg += m_SkinName; arg += m_SkinName;
arg += L"\""; arg += L"\"";
return Rainmeter->ExecuteBang(bang, arg, this); return m_Rainmeter->ExecuteBang(bang, arg, this);
} }
else else
{ {

View File

@ -326,7 +326,7 @@ private:
void InitializeMeters(); void InitializeMeters();
void ShowWindowIfAppropriate(); void ShowWindowIfAppropriate();
HWND GetWindowFromPoint(POINT pos); HWND GetWindowFromPoint(POINT pos);
void HandleButtons(POINT pos, BUTTONPROC proc, CMeterWindow* meterWindow); void HandleButtons(POINT pos, BUTTONPROC proc, bool execute = true);
void SetClickThrough(bool b); void SetClickThrough(bool b);
void SetKeepOnScreen(bool b); void SetKeepOnScreen(bool b);
void SetWindowDraggable(bool b); void SetWindowDraggable(bool b);

View File

@ -56,6 +56,8 @@ int Initialize(HWND hWnd, HINSTANCE hInstance, LPCWSTR lpCmdLine)
} }
catch (CError& error) catch (CError& error)
{ {
delete Rainmeter;
Rainmeter = NULL;
MessageBox(hWnd, error.GetString().c_str(), APPNAME, MB_OK | MB_TOPMOST | MB_ICONERROR); MessageBox(hWnd, error.GetString().c_str(), APPNAME, MB_OK | MB_TOPMOST | MB_ICONERROR);
} }
@ -70,11 +72,8 @@ int Initialize(HWND hWnd, HINSTANCE hInstance, LPCWSTR lpCmdLine)
*/ */
void Quit() void Quit()
{ {
if (Rainmeter) delete Rainmeter;
{ Rainmeter = NULL;
delete Rainmeter;
Rainmeter = NULL;
}
} }
/* /*
@ -787,7 +786,7 @@ CRainmeter::~CRainmeter()
{ {
DeleteMeterWindow(NULL, false); // This removes the window from the vector DeleteMeterWindow(NULL, false); // This removes the window from the vector
if (m_TrayWindow) delete m_TrayWindow; delete m_TrayWindow;
CSystem::Finalize(); CSystem::Finalize();
@ -1578,7 +1577,8 @@ int CRainmeter::ScanForConfigsRecursive(const std::wstring& path, std::wstring b
++index; ++index;
} }
} }
} while (FindNextFile(hSearch, &fileData)); }
while (FindNextFile(hSearch, &fileData));
FindClose(hSearch); FindClose(hSearch);
@ -1650,7 +1650,8 @@ void CRainmeter::ScanForThemes(const std::wstring& path)
{ {
m_Themes.push_back(fileData.cFileName); m_Themes.push_back(fileData.cFileName);
} }
} while (FindNextFile(hSearch, &fileData)); }
while (FindNextFile(hSearch, &fileData));
FindClose(hSearch); FindClose(hSearch);
} }
@ -3275,15 +3276,25 @@ void CRainmeter::ExpandEnvironmentVariables(std::wstring& strPath)
if (strPath.find(L'%') != std::wstring::npos) if (strPath.find(L'%') != std::wstring::npos)
{ {
// Expand the environment variables // Expand the environment variables
DWORD ret = ExpandEnvironmentStrings(strPath.c_str(), buffer, bufSize); do
if (ret != 0 && ret < bufSize)
{ {
strPath = buffer; DWORD ret = ExpandEnvironmentStrings(strPath.c_str(), buffer, bufSize);
} if (ret == 0) // Error
else {
{ LogWithArgs(LOG_WARNING, L"Unable to expand environment strings in: %s", strPath.c_str());
LogWithArgs(LOG_WARNING, L"Unable to expand environment strings in: %s", strPath.c_str()); break;
}
if (ret <= bufSize) // Fits in the buffer
{
strPath = buffer;
break;
}
delete [] buffer;
bufSize = ret;
buffer = new WCHAR[bufSize];
} }
while (true);
} }
delete [] buffer; delete [] buffer;

View File

@ -414,7 +414,8 @@ void CSystem::SetMultiMonitorInfo()
} }
} }
++dwDevice; ++dwDevice;
} while (EnumDisplayDevices(NULL, dwDevice, &dd, 0)); }
while (EnumDisplayDevices(NULL, dwDevice, &dd, 0));
} }
if (monitors.empty()) // Failed to enumerate the non-mirroring monitors if (monitors.empty()) // Failed to enumerate the non-mirroring monitors
@ -653,7 +654,7 @@ BOOL CALLBACK MyEnumWindowsProc(HWND hwnd, LPARAM lParam)
if (GetClassName(hwnd, className, 64) > 0 && if (GetClassName(hwnd, className, 64) > 0 &&
wcscmp(className, METERWINDOW_CLASS_NAME) == 0 && wcscmp(className, METERWINDOW_CLASS_NAME) == 0 &&
Rainmeter && (Window = Rainmeter->GetMeterWindow(hwnd))) (Window = Rainmeter->GetMeterWindow(hwnd)))
{ {
ZPOSITION zPos = Window->GetWindowZPosition(); ZPOSITION zPos = Window->GetWindowZPosition();
if (zPos == ZPOSITION_ONDESKTOP || zPos == ZPOSITION_ONBOTTOM) if (zPos == ZPOSITION_ONDESKTOP || zPos == ZPOSITION_ONBOTTOM)
@ -696,47 +697,44 @@ BOOL CALLBACK MyEnumWindowsProc(HWND hwnd, LPARAM lParam)
*/ */
void CSystem::ChangeZPosInOrder() void CSystem::ChangeZPosInOrder()
{ {
if (Rainmeter) bool logging = Rainmeter->GetDebug() && DEBUG_VERBOSE;
std::vector<CMeterWindow*> windowsInZOrder;
if (logging) Log(LOG_DEBUG, L"1: ----- BEFORE -----");
// Retrieve the Rainmeter's meter windows in Z-order
EnumWindows(MyEnumWindowsProc, (LPARAM)(&windowsInZOrder));
if (!c_ShowDesktop)
{ {
bool logging = Rainmeter->GetDebug() && DEBUG_VERBOSE; // Reset ZPos in Z-order (Bottom)
std::vector<CMeterWindow*> windowsInZOrder;
if (logging) Log(LOG_DEBUG, L"1: ----- BEFORE -----");
// Retrieve the Rainmeter's meter windows in Z-order
EnumWindows(MyEnumWindowsProc, (LPARAM)(&windowsInZOrder));
if (!c_ShowDesktop)
{
// Reset ZPos in Z-order (Bottom)
std::vector<CMeterWindow*>::const_iterator iter = windowsInZOrder.begin(), iterEnd = windowsInZOrder.end();
for ( ; iter != iterEnd; ++iter)
{
if ((*iter)->GetWindowZPosition() == ZPOSITION_ONBOTTOM)
{
(*iter)->ChangeZPos(ZPOSITION_ONBOTTOM); // reset
}
}
}
// Reset ZPos in Z-order (On Desktop)
std::vector<CMeterWindow*>::const_iterator iter = windowsInZOrder.begin(), iterEnd = windowsInZOrder.end(); std::vector<CMeterWindow*>::const_iterator iter = windowsInZOrder.begin(), iterEnd = windowsInZOrder.end();
for ( ; iter != iterEnd; ++iter) for ( ; iter != iterEnd; ++iter)
{ {
if ((*iter)->GetWindowZPosition() == ZPOSITION_ONDESKTOP) if ((*iter)->GetWindowZPosition() == ZPOSITION_ONBOTTOM)
{ {
(*iter)->ChangeZPos(ZPOSITION_ONDESKTOP); // reset (*iter)->ChangeZPos(ZPOSITION_ONBOTTOM); // reset
} }
} }
}
if (logging) // Reset ZPos in Z-order (On Desktop)
std::vector<CMeterWindow*>::const_iterator iter = windowsInZOrder.begin(), iterEnd = windowsInZOrder.end();
for ( ; iter != iterEnd; ++iter)
{
if ((*iter)->GetWindowZPosition() == ZPOSITION_ONDESKTOP)
{ {
Log(LOG_DEBUG, L"2: ----- AFTER -----"); (*iter)->ChangeZPos(ZPOSITION_ONDESKTOP); // reset
// Log all windows in Z-order
EnumWindows(MyEnumWindowsProc, (LPARAM)NULL);
} }
} }
if (logging)
{
Log(LOG_DEBUG, L"2: ----- AFTER -----");
// Log all windows in Z-order
EnumWindows(MyEnumWindowsProc, (LPARAM)NULL);
}
} }
/* /*
@ -919,12 +917,12 @@ LRESULT CALLBACK CSystem::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lP
case TIMER_NETSTATS: case TIMER_NETSTATS:
CMeasureNet::UpdateIFTable(); CMeasureNet::UpdateIFTable();
CMeasureNet::UpdateStats(); CMeasureNet::UpdateStats();
if (Rainmeter) Rainmeter->WriteStats(false); Rainmeter->WriteStats(false);
return 0; return 0;
case TIMER_DELETELATER: case TIMER_DELETELATER:
if (Rainmeter) Rainmeter->ClearDeleteLaterList(); Rainmeter->ClearDeleteLaterList();
return 0; return 0;
} }
break; break;
@ -943,15 +941,12 @@ LRESULT CALLBACK CSystem::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lP
CConfigParser::UpdateWorkareaVariables(); CConfigParser::UpdateWorkareaVariables();
} }
if (Rainmeter) // Deliver WM_DISPLAYCHANGE / WM_SETTINGCHANGE message to all meter windows
const std::map<std::wstring, CMeterWindow*>& windows = Rainmeter->GetAllMeterWindows();
std::map<std::wstring, CMeterWindow*>::const_iterator iter = windows.begin();
for ( ; iter != windows.end(); ++iter)
{ {
// Deliver WM_DISPLAYCHANGE / WM_SETTINGCHANGE message to all meter windows PostMessage((*iter).second->GetWindow(), WM_DELAYED_MOVE, (WPARAM)uMsg, (LPARAM)0);
const std::map<std::wstring, CMeterWindow*>& windows = Rainmeter->GetAllMeterWindows();
std::map<std::wstring, CMeterWindow*>::const_iterator iter = windows.begin();
for ( ; iter != windows.end(); ++iter)
{
PostMessage((*iter).second->GetWindow(), WM_DELAYED_MOVE, (WPARAM)uMsg, (LPARAM)0);
}
} }
} }
return 0; return 0;
@ -1218,11 +1213,8 @@ void CSystem::GetIniFileMappingList(std::vector<std::wstring>& iniFileMappings)
WCHAR buffer[MAX_PATH]; WCHAR buffer[MAX_PATH];
DWORD index = 0, cch = MAX_PATH; DWORD index = 0, cch = MAX_PATH;
while (true) while ((ret = RegEnumKeyEx(hKey, index++, buffer, &cch, NULL, NULL, NULL, NULL)) != ERROR_NO_MORE_ITEMS)
{ {
ret = RegEnumKeyEx(hKey, index++, buffer, &cch, NULL, NULL, NULL, NULL);
if (ret == ERROR_NO_MORE_ITEMS) break;
if (ret == ERROR_SUCCESS) if (ret == ERROR_SUCCESS)
{ {
iniFileMappings.push_back(buffer); iniFileMappings.push_back(buffer);
@ -1247,7 +1239,7 @@ std::wstring CSystem::GetTemporaryFile(const std::vector<std::wstring>& iniFileM
if (!iniFileMappings.empty()) if (!iniFileMappings.empty())
{ {
std::wstring::size_type pos = iniFile.find_last_of(L'\\'); std::wstring::size_type pos = iniFile.find_last_of(L"\\/");
std::wstring filename; std::wstring filename;
if (pos != std::wstring::npos) if (pos != std::wstring::npos)
@ -1259,9 +1251,10 @@ std::wstring CSystem::GetTemporaryFile(const std::vector<std::wstring>& iniFileM
filename = iniFile; filename = iniFile;
} }
for (size_t i = 0, isize = iniFileMappings.size(); i < isize; ++i) std::vector<std::wstring>::const_iterator iter = iniFileMappings.begin();
for ( ; iter != iniFileMappings.end(); ++iter)
{ {
if (_wcsicmp(iniFileMappings[i].c_str(), filename.c_str()) == 0) if (_wcsicmp((*iter).c_str(), filename.c_str()) == 0)
{ {
WCHAR buffer[MAX_PATH]; WCHAR buffer[MAX_PATH];
@ -1276,10 +1269,11 @@ std::wstring CSystem::GetTemporaryFile(const std::vector<std::wstring>& iniFileM
{ {
return temporary; return temporary;
} }
else // alternate is reserved or failed else // temporary is reserved or failed
{ {
RemoveFile(temporary); RemoveFile(temporary);
return tmp.empty() ? L"<>" : tmp; if (tmp.empty()) tmp = L"<>";
return tmp;
} }
} }
else // failed else // failed

View File

@ -278,9 +278,10 @@ void CTrayWindow::ReadConfig(CConfigParser& parser)
delete m_Bitmap; delete m_Bitmap;
m_Bitmap = NULL; m_Bitmap = NULL;
for (size_t i = 0, isize = m_TrayIcons.size(); i < isize; ++i) std::vector<HICON>::const_iterator iter = m_TrayIcons.begin();
for ( ; iter != m_TrayIcons.end(); ++iter)
{ {
DestroyIcon(m_TrayIcons[i]); DestroyIcon((*iter));
} }
m_TrayIcons.clear(); m_TrayIcons.clear();
@ -353,7 +354,8 @@ void CTrayWindow::ReadConfig(CConfigParser& parser)
hIcon = (HICON)LoadImage(NULL, buffer, IMAGE_ICON, TRAYICON_SIZE, TRAYICON_SIZE, LR_LOADFROMFILE); hIcon = (HICON)LoadImage(NULL, buffer, IMAGE_ICON, TRAYICON_SIZE, TRAYICON_SIZE, LR_LOADFROMFILE);
if (hIcon) m_TrayIcons.push_back(hIcon); if (hIcon) m_TrayIcons.push_back(hIcon);
if (imageName == buffer) break; if (imageName == buffer) break;
} while(hIcon != NULL); }
while(hIcon != NULL);
} }
} }
@ -365,9 +367,9 @@ void CTrayWindow::ReadConfig(CConfigParser& parser)
Status status = m_Bitmap->GetLastStatus(); Status status = m_Bitmap->GetLastStatus();
if (Ok != status) if (Ok != status)
{ {
LogWithArgs(LOG_WARNING, L"Bitmap image not found: %s", imageName.c_str());
delete m_Bitmap; delete m_Bitmap;
m_Bitmap = NULL; m_Bitmap = NULL;
LogWithArgs(LOG_WARNING, L"Bitmap image not found: %s", imageName.c_str());
} }
} }
} }
@ -411,7 +413,7 @@ LRESULT CALLBACK CTrayWindow::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
switch (uMsg) switch (uMsg)
{ {
case WM_COMMAND: case WM_COMMAND:
if (Rainmeter && tray) if (tray)
{ {
if (wParam == ID_CONTEXT_MANAGE) if (wParam == ID_CONTEXT_MANAGE)
{ {
@ -574,7 +576,7 @@ LRESULT CALLBACK CTrayWindow::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
break; break;
case WM_QUERY_RAINMETER: case WM_QUERY_RAINMETER:
if (Rainmeter && IsWindow((HWND)lParam)) if (IsWindow((HWND)lParam))
{ {
COPYDATASTRUCT cds; COPYDATASTRUCT cds;
@ -760,7 +762,6 @@ LRESULT CALLBACK CTrayWindow::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
return 1; return 1;
case WM_COPYDATA: case WM_COPYDATA:
if (Rainmeter)
{ {
COPYDATASTRUCT *cds = (COPYDATASTRUCT*) lParam; COPYDATASTRUCT *cds = (COPYDATASTRUCT*) lParam;
if (cds->dwData == RAINMETER_QUERY_ID_SKIN_WINDOWHANDLE) if (cds->dwData == RAINMETER_QUERY_ID_SKIN_WINDOWHANDLE)
@ -786,15 +787,11 @@ LRESULT CALLBACK CTrayWindow::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
break; break;
case WM_TRAY_DELAYED_REFRESH_ALL: case WM_TRAY_DELAYED_REFRESH_ALL:
if (Rainmeter) Rainmeter->RefreshAll();
{
// Refresh all
Rainmeter->RefreshAll();
}
return 0; return 0;
case WM_TRAY_DELAYED_EXECUTE: case WM_TRAY_DELAYED_EXECUTE:
if (Rainmeter && lParam) if (lParam)
{ {
// Execute bang // Execute bang
WCHAR* bang = (WCHAR*)lParam; WCHAR* bang = (WCHAR*)lParam;