From f2682eaee03db96de21b8e50ed64301360600f5a Mon Sep 17 00:00:00 2001 From: spx Date: Tue, 1 Jun 2010 14:55:52 +0000 Subject: [PATCH] Changed the behavior of DynamicVariables. The fixed value definition of the following settings is handled as the starting value. If the value definition of these settings contains variables or measures, related !bangs are ignored. [Measure] Disabled [Meter] Hidden X Y In case of "Hidden": - Hidden not added or Hidden=0/1 (=fixed value specified) and DynamicVariables=1 The specified value is handled as the starting value. After that the value is not re-read on every update. !RainmeterShowMeter etc. are enabled. - Hidden=#VAR# or Hidden=[Measure] and DynamicVariables=1 The value is re-read on every update. !RainmeterShowMeter etc. are disabled by re-reading value. --- Library/ConfigParser.cpp | 133 +++++++++++++++++++++++--------------- Library/ConfigParser.h | 5 +- Library/Measure.cpp | 29 ++++++++- Library/Measure.h | 2 + Library/Meter.cpp | 136 ++++++++++++++++++++++----------------- Library/MeterWindow.cpp | 24 +++++++ Library/MeterWindow.h | 1 + 7 files changed, 217 insertions(+), 113 deletions(-) diff --git a/Library/ConfigParser.cpp b/Library/ConfigParser.cpp index 6c311b75..33165690 100644 --- a/Library/ConfigParser.cpp +++ b/Library/ConfigParser.cpp @@ -400,8 +400,10 @@ void CConfigParser::SetAutoSelectedMonitorVariables(CMeterWindow* meterWindow) ** ** \param result The string where the variables are returned. The string is modified. */ -void CConfigParser::ReplaceVariables(std::wstring& result) +bool CConfigParser::ReplaceVariables(std::wstring& result) { + bool replaced = false; + CRainmeter::ExpandEnvironmentVariables(result); if (c_MonitorVariables.empty()) @@ -432,6 +434,7 @@ void CConfigParser::ReplaceVariables(std::wstring& result) // Variable found, replace it with the value result.replace(result.begin() + pos, result.begin() + end + 1, (*iter).second); start = pos + (*iter).second.length(); + replaced = true; } else { @@ -441,6 +444,7 @@ void CConfigParser::ReplaceVariables(std::wstring& result) // SCREENAREA/WORKAREA variable found, replace it with the value result.replace(result.begin() + pos, result.begin() + end + 1, (*iter2).second); start = pos + (*iter2).second.length(); + replaced = true; } else { @@ -458,6 +462,73 @@ void CConfigParser::ReplaceVariables(std::wstring& result) loop = false; } } while(loop); + + return replaced; +} + +/** +** Replaces measures in the given string. +** +** \param result The string where the measure values are returned. The string is modified. +*/ +bool CConfigParser::ReplaceMeasures(std::wstring& result) +{ + bool replaced = false; + + // Check for measures ([Measure]) + if (!m_Measures.empty()) + { + size_t start = 0; + size_t end = std::wstring::npos; + size_t pos = std::wstring::npos; + size_t pos2 = std::wstring::npos; + bool loop = true; + do + { + pos = result.find(L'[', start); + if (pos != std::wstring::npos) + { + end = result.find(L']', pos + 1); + if (end != std::wstring::npos) + { + pos2 = result.find(L'[', pos + 1); + if (pos2 == std::wstring::npos || end < pos2) + { + std::wstring var(result.begin() + pos + 1, result.begin() + end); + + std::map::const_iterator iter = m_Measures.find(var); + if (iter != m_Measures.end()) + { + std::wstring value = (*iter).second->GetStringValue(false, 1, 5, false); + + // Measure found, replace it with the value + result.replace(result.begin() + pos, result.begin() + end + 1, value); + start = pos + value.length(); + replaced = true; + } + else + { + start = end; + } + } + else + { + start = pos2; + } + } + else + { + loop = false; + } + } + else + { + loop = false; + } + } while(loop); + } + + return replaced; } /* @@ -465,7 +536,7 @@ void CConfigParser::ReplaceVariables(std::wstring& result) ** ** */ -const std::wstring& CConfigParser::ReadString(LPCTSTR section, LPCTSTR key, LPCTSTR defValue, bool bReplaceMeasures) +const std::wstring& CConfigParser::ReadString(LPCTSTR section, LPCTSTR key, LPCTSTR defValue, bool bReplaceMeasures, bool* bReplaced) { static std::wstring result; @@ -509,58 +580,16 @@ const std::wstring& CConfigParser::ReadString(LPCTSTR section, LPCTSTR key, LPCT } } - ReplaceVariables(result); + bool replaced = ReplaceVariables(result); - // Check for measures ([Measure]) - if (!m_Measures.empty() && bReplaceMeasures) + if (bReplaceMeasures) { - size_t start = 0; - size_t end = std::wstring::npos; - size_t pos = std::wstring::npos; - size_t pos2 = std::wstring::npos; - bool loop = true; - do - { - pos = result.find(L'[', start); - if (pos != std::wstring::npos) - { - end = result.find(L']', pos + 1); - if (end != std::wstring::npos) - { - pos2 = result.find(L'[', pos + 1); - if (pos2 == std::wstring::npos || end < pos2) - { - std::wstring var(result.begin() + pos + 1, result.begin() + end); - - std::map::const_iterator iter = m_Measures.find(var); - if (iter != m_Measures.end()) - { - std::wstring value = (*iter).second->GetStringValue(false, 1, 5, false); - - // Measure found, replace it with the value - result.replace(result.begin() + pos, result.begin() + end + 1, value); - start = pos + value.length(); - } - else - { - start = end; - } - } - else - { - start = pos2; - } - } - else - { - loop = false; - } - } - else - { - loop = false; - } - } while(loop); + replaced |= ReplaceMeasures(result); + } + + if (bReplaced) + { + *bReplaced = replaced; } return result; diff --git a/Library/ConfigParser.h b/Library/ConfigParser.h index 536d445c..91c72550 100644 --- a/Library/ConfigParser.h +++ b/Library/ConfigParser.h @@ -45,7 +45,7 @@ public: void ResetVariables(CRainmeter* pRainmeter, CMeterWindow* meterWindow = NULL); - const std::wstring& ReadString(LPCTSTR section, LPCTSTR key, LPCTSTR defValue, bool bReplaceMeasures = true); + const std::wstring& ReadString(LPCTSTR section, LPCTSTR key, LPCTSTR defValue, bool bReplaceMeasures = true, bool* bReplaced = NULL); double ReadFloat(LPCTSTR section, LPCTSTR key, double defValue); double ReadFormula(LPCTSTR section, LPCTSTR key, double defValue); int ReadInt(LPCTSTR section, LPCTSTR key, int defValue); @@ -68,7 +68,8 @@ public: private: void SetDefaultVariables(CRainmeter* pRainmeter, CMeterWindow* meterWindow); void ReadVariables(); - void ReplaceVariables(std::wstring& result); + bool ReplaceVariables(std::wstring& result); + bool ReplaceMeasures(std::wstring& result); void ReadIniFile(const std::wstring& strFileName, int depth = 0); void SetValue(const std::wstring& strSection, const std::wstring& strKey, const std::wstring& strValue); diff --git a/Library/Measure.cpp b/Library/Measure.cpp index ec3f1265..2b73ae99 100644 --- a/Library/Measure.cpp +++ b/Library/Measure.cpp @@ -68,6 +68,7 @@ CMeasure::CMeasure(CMeterWindow* meterWindow) m_AveragePos = 0; m_AverageSize = 0; m_DynamicVariables = false; + m_Initialized = false; m_MeterWindow = meterWindow; } @@ -82,6 +83,17 @@ CMeasure::~CMeasure() { } +/* +** Initialize +** +** Initializes the measure. +** +*/ +void CMeasure::Initialize() +{ + m_Initialized = true; +} + /* ** ReadConfig ** @@ -91,6 +103,8 @@ CMeasure::~CMeasure() */ void CMeasure::ReadConfig(CConfigParser& parser, const WCHAR* section) { + bool replaced; + // Clear substitutes to prevent from being added more than once. if (!m_Substitute.empty()) { @@ -98,7 +112,20 @@ void CMeasure::ReadConfig(CConfigParser& parser, const WCHAR* section) } m_Invert = 0!=parser.ReadInt(section, L"InvertMeasure", 0); - m_Disabled = 0!=parser.ReadInt(section, L"Disabled", m_Disabled); + + if (!m_Initialized) + { + m_Disabled = 0!=parser.ReadInt(section, L"Disabled", 0); + } + else + { + replaced = false; + const std::wstring& result = parser.ReadString(section, L"Disabled", L"0", true, &replaced); + if (replaced) + { + m_Disabled = 0!=(int)parser.ParseDouble(result, 0.0, true); + } + } UINT updateDivider = parser.ReadInt(section, L"UpdateDivider", 1); if (updateDivider != m_UpdateDivider) diff --git a/Library/Measure.h b/Library/Measure.h index 4e99a0e9..02d0828e 100644 --- a/Library/Measure.h +++ b/Library/Measure.h @@ -31,6 +31,7 @@ public: virtual ~CMeasure(); virtual void ReadConfig(CConfigParser& parser, const WCHAR* section); + virtual void Initialize(); virtual bool Update() = 0; virtual const WCHAR* GetStats(); @@ -97,6 +98,7 @@ protected: bool m_Disabled; // Status of the measure UINT m_UpdateDivider; // Divider for the update UINT m_UpdateCounter; // Current update counter + bool m_Initialized; CMeterWindow* m_MeterWindow; }; diff --git a/Library/Meter.cpp b/Library/Meter.cpp index d6bcf7b6..9a6e54c3 100644 --- a/Library/Meter.cpp +++ b/Library/Meter.cpp @@ -209,7 +209,8 @@ bool CMeter::HitTest(int x, int y) */ void CMeter::ReadConfig(const WCHAR* section) { - WCHAR buffer[256]; + bool replaced; + CConfigParser& parser = m_MeterWindow->GetParser(); // The MeterStyle defines a template where the values are read if the meter doesn't have it itself @@ -219,82 +220,101 @@ void CMeter::ReadConfig(const WCHAR* section) parser.SetStyleTemplate(style); } - wsprintf(buffer, L"%i%c", m_X, (m_RelativeX == POSITION_RELATIVE_TL) ? L'r' : (m_RelativeX == POSITION_RELATIVE_BR) ? L'R' : L''); - std::wstring coord = parser.ReadString(section, L"X", buffer); - if (!coord.empty()) + replaced = false; + std::wstring coord = parser.ReadString(section, L"X", L"0", true, &replaced); + if (!m_Initialized || replaced) { - size_t len = coord.size(); - if (coord[len - 1] == L'r') + if (!coord.empty()) { - m_RelativeX = POSITION_RELATIVE_TL; - coord.erase(--len); - } - else if (coord[len - 1] == L'R') - { - m_RelativeX = POSITION_RELATIVE_BR; - coord.erase(--len); + size_t len = coord.size(); + if (coord[len - 1] == L'r') + { + m_RelativeX = POSITION_RELATIVE_TL; + coord.erase(--len); + } + else if (coord[len - 1] == L'R') + { + m_RelativeX = POSITION_RELATIVE_BR; + coord.erase(--len); + } + else + { + m_RelativeX = POSITION_ABSOLUTE; + } + + double val; + if (len >= 2 && coord[0] == L'(' && coord[len - 1] == L')' && -1 != parser.ReadFormula(coord, &val)) + { + m_X = (int)val; + } + else + { + m_X = (int)parser.ParseDouble(coord, 0.0); + } } else { + m_X = 0; m_RelativeX = POSITION_ABSOLUTE; } + } - double val; - if (len >= 2 && coord[0] == L'(' && coord[len - 1] == L')' && -1 != parser.ReadFormula(coord, &val)) + replaced = false; + coord = parser.ReadString(section, L"Y", L"0", true, &replaced); + if (!m_Initialized || replaced) + { + if (!coord.empty()) { - m_X = (int)val; - } - else - { - m_X = (int)parser.ParseDouble(coord, 0.0); - } - } - else - { - m_X = 0; - m_RelativeX = POSITION_ABSOLUTE; - } - - wsprintf(buffer, L"%i%c", m_Y, (m_RelativeY == POSITION_RELATIVE_TL) ? L'r' : (m_RelativeY == POSITION_RELATIVE_BR) ? L'R' : L''); - coord = parser.ReadString(section, L"Y", buffer); - if (!coord.empty()) - { - size_t len = coord.size(); - if (coord[len - 1] == L'r') - { - m_RelativeY = POSITION_RELATIVE_TL; - coord.erase(--len); - } - else if (coord[len - 1] == L'R') - { - m_RelativeY = POSITION_RELATIVE_BR; - coord.erase(--len); + size_t len = coord.size(); + if (coord[len - 1] == L'r') + { + m_RelativeY = POSITION_RELATIVE_TL; + coord.erase(--len); + } + else if (coord[len - 1] == L'R') + { + m_RelativeY = POSITION_RELATIVE_BR; + coord.erase(--len); + } + else + { + m_RelativeY = POSITION_ABSOLUTE; + } + + double val; + if (len >= 2 && coord[0] == L'(' && coord[len - 1] == L')' && -1 != parser.ReadFormula(coord, &val)) + { + m_Y = (int)val; + } + else + { + m_Y = (int)parser.ParseDouble(coord, 0.0); + } } else { + m_Y = 0; m_RelativeY = POSITION_ABSOLUTE; } - - double val; - if (len >= 2 && coord[0] == L'(' && coord[len - 1] == L')' && -1 != parser.ReadFormula(coord, &val)) - { - m_Y = (int)val; - } - else - { - m_Y = (int)parser.ParseDouble(coord, 0.0); - } - } - else - { - m_Y = 0; - m_RelativeY = POSITION_ABSOLUTE; } m_W = (int)parser.ReadFormula(section, L"W", 1.0); m_H = (int)parser.ReadFormula(section, L"H", 1.0); - m_Hidden = 0!=parser.ReadInt(section, L"Hidden", m_Hidden); + if (!m_Initialized) + { + m_Hidden = 0!=parser.ReadInt(section, L"Hidden", 0); + } + else + { + replaced = false; + const std::wstring& result = parser.ReadString(section, L"Hidden", L"0", true, &replaced); + if (replaced) + { + m_Hidden = 0!=(int)parser.ParseDouble(result, 0.0, true); + } + } + m_SolidBevel = (BEVELTYPE)parser.ReadInt(section, L"BevelType", BEVELTYPE_NONE); m_SolidColor = parser.ReadColor(section, L"SolidColor", Color(0, 0, 0, 0)); diff --git a/Library/MeterWindow.cpp b/Library/MeterWindow.cpp index d90564fe..3ad674f2 100644 --- a/Library/MeterWindow.cpp +++ b/Library/MeterWindow.cpp @@ -354,6 +354,7 @@ void CMeterWindow::Refresh(bool init, bool all) ReadConfig(); // Read the general settings ReadSkin(); + InitializeMeasures(); InitializeMeters(); // Remove transparent flag @@ -1820,6 +1821,29 @@ void CMeterWindow::ReadSkin() } } +/* +** InitializeMeasures +** +** Initializes all the measures +** +*/ +void CMeterWindow::InitializeMeasures() +{ + // Initalize all measures + std::list::const_iterator i = m_Measures.begin(); + for( ; i != m_Measures.end(); ++i) + { + try + { + (*i)->Initialize(); + } + catch (CError& error) + { + MessageBox(m_Window, error.GetString().c_str(), APPNAME, MB_OK | MB_TOPMOST | MB_ICONEXCLAMATION); + } + } +} + /* ** InitializeMeters ** diff --git a/Library/MeterWindow.h b/Library/MeterWindow.h index 6a54da3e..1efc5b74 100644 --- a/Library/MeterWindow.h +++ b/Library/MeterWindow.h @@ -227,6 +227,7 @@ private: void ReadConfig(); void WriteConfig(); void ReadSkin(); + void InitializeMeasures(); void InitializeMeters(); void ShowWindowIfAppropriate(); bool DoAction(int x, int y, MOUSE mouse, bool test);