diff --git a/Application/Application.cpp b/Application/Application.cpp index e530b9e4..6620df5f 100644 --- a/Application/Application.cpp +++ b/Application/Application.cpp @@ -24,6 +24,16 @@ #include "resource.h" #include "..\Library\Rainmeter.h" +#if defined _M_IX86 +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") +#elif defined _M_IA64 +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"") +#elif defined _M_X64 +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"") +#else +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") +#endif + /* ** Protos */ diff --git a/Library/Group.cpp b/Library/Group.cpp new file mode 100644 index 00000000..3dc1d599 --- /dev/null +++ b/Library/Group.cpp @@ -0,0 +1,105 @@ +/* + Copyright (C) 2010 spx + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "StdAfx.h" +#include "Group.h" +#include "ConfigParser.h" +#include +#include + +/* +** CGroup +** +** The constructor +** +*/ +CGroup::CGroup() +{ +} + +/* +** ~CGroup +** +** The destructor +** +*/ +CGroup::~CGroup() +{ +} + +/* +** InitializeGroup +** +** +*/ +void CGroup::InitializeGroup(const std::wstring& group) +{ + if (group != m_OldGroup) + { + m_OldGroup = group; + m_Group.clear(); + + std::vector vGroup = CConfigParser::Tokenize(group, L"|"); + + std::vector::const_iterator iter = vGroup.begin(); + for ( ; iter != vGroup.end(); ++iter) + { + std::wstring group = CreateGroup(*iter); + if (!group.empty()) + { + m_Group.insert(group); + } + } + } +} + +/* +** BelongsToGroup +** +** +*/ +bool CGroup::BelongsToGroup(const std::wstring& group) +{ + return (m_Group.find(CreateGroup(group)) != m_Group.end()); +} + +std::wstring CGroup::CreateGroup(const std::wstring& str) +{ + std::wstring strTmp = str; + + // Trim whitespace + std::wstring::size_type pos = strTmp.find_last_not_of(L' '); + if (pos != std::wstring::npos) + { + strTmp.erase(pos + 1); + pos = strTmp.find_first_not_of(' '); + if (pos != std::wstring::npos) + { + strTmp.erase(0, pos); + } + + // Convert to lower + std::transform(strTmp.begin(), strTmp.end(), strTmp.begin(), ::towlower); + } + else + { + strTmp.erase(strTmp.begin(), strTmp.end()); + } + + return strTmp; +} \ No newline at end of file diff --git a/Library/Group.h b/Library/Group.h new file mode 100644 index 00000000..3bc653d4 --- /dev/null +++ b/Library/Group.h @@ -0,0 +1,48 @@ +/* + Copyright (C) 2010 spx + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#ifndef __GROUP_H__ +#define __GROUP_H__ + +#pragma warning(disable: 4786) + +#include +#include +#include + +class CGroup +{ +public: + bool BelongsToGroup(const std::wstring& group); + const std::set& GetGroup() { return m_Group; } + +protected: + CGroup(); + virtual ~CGroup(); + + void InitializeGroup(const std::wstring& group); + +private: + std::wstring CreateGroup(const std::wstring& str); + + std::set m_Group; + std::wstring m_OldGroup; + +}; + +#endif diff --git a/Library/Library.rc b/Library/Library.rc index be0612b2..619e6ad0 100644 --- a/Library/Library.rc +++ b/Library/Library.rc @@ -35,7 +35,17 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Edit Settings...", ID_CONTEXT_EDITCONFIG MENUITEM "Refresh All", ID_CONTEXT_REFRESH - MENUITEM "Show Log File", ID_CONTEXT_SHOWLOGFILE + MENUITEM SEPARATOR + POPUP "Logging" + BEGIN + MENUITEM "Show Log File...", ID_CONTEXT_SHOWLOGFILE + MENUITEM SEPARATOR + MENUITEM "Start Logging", ID_CONTEXT_STARTLOG + MENUITEM "Stop Logging", ID_CONTEXT_STOPLOG + MENUITEM SEPARATOR + MENUITEM "Delete Log File...", ID_CONTEXT_DELETELOGFILE + MENUITEM "Debug Mode", ID_CONTEXT_DEBUGLOG + END MENUITEM SEPARATOR MENUITEM "Exit", ID_CONTEXT_QUIT END diff --git a/Library/Library.vcproj b/Library/Library.vcproj index 80cd2a3d..1a58d784 100644 --- a/Library/Library.vcproj +++ b/Library/Library.vcproj @@ -766,6 +766,69 @@ /> + + + + + + + + + + + + + + + + + + + + @@ -2820,6 +2883,10 @@ RelativePath="Export.h" > + + diff --git a/Library/Litestep.cpp b/Library/Litestep.cpp index 2fcec76d..9e68ce98 100644 --- a/Library/Litestep.cpp +++ b/Library/Litestep.cpp @@ -511,11 +511,11 @@ BOOL LSLog(int nLevel, LPCTSTR pszModule, LPCTSTR pszMessage) // Add timestamp static DWORD startTime = 0; + DWORD time = GetTickCount(); if (startTime == 0) { - startTime = GetTickCount(); + startTime = time; } - DWORD time = GetTickCount(); WCHAR buffer[MAX_PATH]; swprintf(buffer, L"(%02i:%02i:%02i.%03i) ", (time - startTime) / (1000 * 60* 60), ((time - startTime) / (1000 * 60)) % 60, ((time - startTime) / 1000) % 60, (time - startTime) % 1000); @@ -536,7 +536,7 @@ BOOL LSLog(int nLevel, LPCTSTR pszModule, LPCTSTR pszMessage) } // The stub implementation - if (Rainmeter) + if (Rainmeter && Rainmeter->GetLogging()) { FILE* logFile; std::wstring logfile = Rainmeter->GetLogFile(); @@ -597,4 +597,4 @@ void DebugLog(const WCHAR* format, ... ) _vsnwprintf( buffer, 4096, format, args ); LSLog(LOG_DEBUG, L"Rainmeter", buffer); va_end(args); -}; +} diff --git a/Library/Measure.cpp b/Library/Measure.cpp index 2b73ae99..0c78fd8f 100644 --- a/Library/Measure.cpp +++ b/Library/Measure.cpp @@ -157,6 +157,9 @@ void CMeasure::ReadConfig(CConfigParser& parser, const WCHAR* section) { DebugLog(L"Incorrect substitute string: %s", subs.c_str()); } + + std::wstring group = parser.ReadString(section, L"Group", L""); + InitializeGroup(group); } /* diff --git a/Library/Measure.h b/Library/Measure.h index 02d0828e..6fb5deff 100644 --- a/Library/Measure.h +++ b/Library/Measure.h @@ -21,10 +21,11 @@ #include "MeterWindow.h" #include "Litestep.h" +#include "Group.h" class CMeter; -class CMeasure +class CMeasure : public CGroup { public: CMeasure(CMeterWindow* meterWindow); diff --git a/Library/Meter.cpp b/Library/Meter.cpp index 9a6e54c3..5d94da33 100644 --- a/Library/Meter.cpp +++ b/Library/Meter.cpp @@ -357,6 +357,9 @@ void CMeter::ReadConfig(const WCHAR* section) DebugLog(L"The transformation matrix has incorrect number of values:", parser.ReadString(section, L"TransformationMatrix", L"").c_str()); } + std::wstring group = parser.ReadString(section, L"Group", L""); + InitializeGroup(group); + /* Are these necessary? if (m_W == 0 || m_H == 0) { diff --git a/Library/Meter.h b/Library/Meter.h index 7173d9e4..bf84f04e 100644 --- a/Library/Meter.h +++ b/Library/Meter.h @@ -24,10 +24,11 @@ #include #include "Litestep.h" #include "MeterWindow.h" +#include "Group.h" class CMeasure; -class CMeter +class CMeter : public CGroup { public: CMeter(CMeterWindow* meterWindow); diff --git a/Library/MeterWindow.cpp b/Library/MeterWindow.cpp index 3ad674f2..66f64cf5 100644 --- a/Library/MeterWindow.cpp +++ b/Library/MeterWindow.cpp @@ -612,6 +612,18 @@ void CMeterWindow::RunBang(BANGCOMMAND bang, const WCHAR* arg) HideMeter(arg); break; + case BANG_TOGGLEMETERGROUP: + ToggleMeter(arg, true); + break; + + case BANG_SHOWMETERGROUP: + ShowMeter(arg, true); + break; + + case BANG_HIDEMETERGROUP: + HideMeter(arg, true); + break; + case BANG_TOGGLEMEASURE: ToggleMeasure(arg); break; @@ -620,6 +632,18 @@ void CMeterWindow::RunBang(BANGCOMMAND bang, const WCHAR* arg) EnableMeasure(arg); break; + case BANG_DISABLEMEASUREGROUP: + DisableMeasure(arg, true); + break; + + case BANG_TOGGLEMEASUREGROUP: + ToggleMeasure(arg, true); + break; + + case BANG_ENABLEMEASUREGROUP: + EnableMeasure(arg, true); + break; + case BANG_DISABLEMEASURE: DisableMeasure(arg); break; @@ -831,22 +855,28 @@ void CMeterWindow::RunBang(BANGCOMMAND bang, const WCHAR* arg) ** Shows the given meter ** */ -void CMeterWindow::ShowMeter(const WCHAR* name) +void CMeterWindow::ShowMeter(const WCHAR* name, bool group) { if (name == NULL || wcslen(name) == 0) return; std::list::const_iterator j = m_Meters.begin(); for( ; j != m_Meters.end(); ++j) { - if (wcsicmp((*j)->GetName(), name) == 0) + if (group) { - (*j)->Show(); - m_ResetRegion = true; // Need to recalculate the window region - return; + if (!(*j)->BelongsToGroup(name)) continue; } + else + { + if (wcsicmp((*j)->GetName(), name) != 0) continue; + } + + (*j)->Show(); + m_ResetRegion = true; // Need to recalculate the window region + if (!group) return; } - DebugLog(L"Unable to show the meter %s (there is no such thing in %s)", name, m_SkinName.c_str()); + if (!group) DebugLog(L"Unable to show the meter %s (there is no such thing in %s)", name, m_SkinName.c_str()); } /* @@ -855,22 +885,28 @@ void CMeterWindow::ShowMeter(const WCHAR* name) ** Hides the given meter ** */ -void CMeterWindow::HideMeter(const WCHAR* name) +void CMeterWindow::HideMeter(const WCHAR* name, bool group) { if (name == NULL || wcslen(name) == 0) return; std::list::const_iterator j = m_Meters.begin(); for( ; j != m_Meters.end(); ++j) { - if (wcsicmp((*j)->GetName(), name) == 0) + if (group) { - (*j)->Hide(); - m_ResetRegion = true; // Need to recalculate the windowregion - return; + if (!(*j)->BelongsToGroup(name)) continue; } + else + { + if (wcsicmp((*j)->GetName(), name) != 0) continue; + } + + (*j)->Hide(); + m_ResetRegion = true; // Need to recalculate the windowregion + if (!group) return; } - DebugLog(L"Unable to hide the meter %s (there is no such thing in %s)", name, m_SkinName.c_str()); + if (!group) DebugLog(L"Unable to hide the meter %s (there is no such thing in %s)", name, m_SkinName.c_str()); } /* @@ -879,29 +915,35 @@ void CMeterWindow::HideMeter(const WCHAR* name) ** Toggles the given meter ** */ -void CMeterWindow::ToggleMeter(const WCHAR* name) +void CMeterWindow::ToggleMeter(const WCHAR* name, bool group) { if (name == NULL || wcslen(name) == 0) return; std::list::const_iterator j = m_Meters.begin(); for( ; j != m_Meters.end(); ++j) { - if (wcsicmp((*j)->GetName(), name) == 0) + if (group) { - if ((*j)->IsHidden()) - { - (*j)->Show(); - } - else - { - (*j)->Hide(); - } - m_ResetRegion = true; // Need to recalculate the window region - return; + if (!(*j)->BelongsToGroup(name)) continue; } + else + { + if (wcsicmp((*j)->GetName(), name) != 0) continue; + } + + if ((*j)->IsHidden()) + { + (*j)->Show(); + } + else + { + (*j)->Hide(); + } + m_ResetRegion = true; // Need to recalculate the window region + if (!group) return; } - DebugLog(L"Unable to toggle the meter %s (there is no such thing in %s)", name, m_SkinName.c_str()); + if (!group) DebugLog(L"Unable to toggle the meter %s (there is no such thing in %s)", name, m_SkinName.c_str()); } /* @@ -928,27 +970,34 @@ void CMeterWindow::MoveMeter(int x, int y, const WCHAR* name) DebugLog(L"Unable to move the meter %s (there is no such thing in %s)", name, m_SkinName.c_str()); } + /* ** EnableMeasure ** ** Enables the given measure ** */ -void CMeterWindow::EnableMeasure(const WCHAR* name) +void CMeterWindow::EnableMeasure(const WCHAR* name, bool group) { if (name == NULL || wcslen(name) == 0) return; std::list::const_iterator i = m_Measures.begin(); for( ; i != m_Measures.end(); ++i) { - if (wcsicmp((*i)->GetName(), name) == 0) + if (group) { - (*i)->Enable(); - return; + if (!(*i)->BelongsToGroup(name)) continue; } + else + { + if (wcsicmp((*i)->GetName(), name) != 0) continue; + } + + (*i)->Enable(); + if (!group) return; } - DebugLog(L"Unable to enable the measure %s (there is no such thing in %s)", name, m_SkinName.c_str()); + if (!group) DebugLog(L"Unable to enable the measure %s (there is no such thing in %s)", name, m_SkinName.c_str()); } @@ -958,21 +1007,27 @@ void CMeterWindow::EnableMeasure(const WCHAR* name) ** Disables the given measure ** */ -void CMeterWindow::DisableMeasure(const WCHAR* name) +void CMeterWindow::DisableMeasure(const WCHAR* name, bool group) { if (name == NULL || wcslen(name) == 0) return; std::list::const_iterator i = m_Measures.begin(); for( ; i != m_Measures.end(); ++i) { - if (wcsicmp((*i)->GetName(), name) == 0) + if (group) { - (*i)->Disable(); - return; + if (!(*i)->BelongsToGroup(name)) continue; } + else + { + if (wcsicmp((*i)->GetName(), name) != 0) continue; + } + + (*i)->Disable(); + if (!group) return; } - DebugLog(L"Unable to disable the measure %s (there is no such thing in %s)", name, m_SkinName.c_str()); + if (!group) DebugLog(L"Unable to disable the measure %s (there is no such thing in %s)", name, m_SkinName.c_str()); } @@ -982,28 +1037,34 @@ void CMeterWindow::DisableMeasure(const WCHAR* name) ** Toggless the given measure ** */ -void CMeterWindow::ToggleMeasure(const WCHAR* name) +void CMeterWindow::ToggleMeasure(const WCHAR* name, bool group) { if (name == NULL || wcslen(name) == 0) return; std::list::const_iterator i = m_Measures.begin(); for( ; i != m_Measures.end(); ++i) { - if (wcsicmp((*i)->GetName(), name) == 0) + if (group) { - if ((*i)->IsDisabled()) - { - (*i)->Enable(); - } - else - { - (*i)->Disable(); - } - return; + if (!(*i)->BelongsToGroup(name)) continue; } + else + { + if (wcsicmp((*i)->GetName(), name) != 0) continue; + } + + if ((*i)->IsDisabled()) + { + (*i)->Enable(); + } + else + { + (*i)->Disable(); + } + if (!group) return; } - DebugLog(L"Unable to toggle the measure %s (there is no such thing in %s)", name, m_SkinName.c_str()); + if (!group) DebugLog(L"Unable to toggle the measure %s (there is no such thing in %s)", name, m_SkinName.c_str()); } /* WindowToScreen diff --git a/Library/MeterWindow.h b/Library/MeterWindow.h index 1efc5b74..df44ccb1 100644 --- a/Library/MeterWindow.h +++ b/Library/MeterWindow.h @@ -95,6 +95,12 @@ enum BANGCOMMAND BANG_TOGGLEMEASURE, BANG_ENABLEMEASURE, BANG_DISABLEMEASURE, + BANG_TOGGLEMETERGROUP, + BANG_SHOWMETERGROUP, + BANG_HIDEMETERGROUP, + BANG_TOGGLEMEASUREGROUP, + BANG_ENABLEMEASUREGROUP, + BANG_DISABLEMEASUREGROUP, BANG_SHOW, BANG_HIDE, BANG_TOGGLE, @@ -126,12 +132,12 @@ public: void RunBang(BANGCOMMAND bang, const WCHAR* arg); void MoveMeter(int x, int y, const WCHAR* name); - void HideMeter(const WCHAR* name); - void ShowMeter(const WCHAR* name); - void ToggleMeter(const WCHAR* name); - void DisableMeasure(const WCHAR* name); - void EnableMeasure(const WCHAR* name); - void ToggleMeasure(const WCHAR* name); + void HideMeter(const WCHAR* name, bool group = false); + void ShowMeter(const WCHAR* name, bool group = false); + void ToggleMeter(const WCHAR* name, bool group = false); + void DisableMeasure(const WCHAR* name, bool group = false); + void EnableMeasure(const WCHAR* name, bool group = false); + void ToggleMeasure(const WCHAR* name, bool group = false); void Refresh(bool init, bool all = false); void Redraw(); diff --git a/Library/Rainmeter.cpp b/Library/Rainmeter.cpp index 0b2828a2..cdc2b06c 100644 --- a/Library/Rainmeter.cpp +++ b/Library/Rainmeter.cpp @@ -361,6 +361,39 @@ void RainmeterToggleMeter(HWND, const char* arg) BangWithArgs(BANG_TOGGLEMETER, ConvertToWide(arg).c_str(), 1); } +/* +** RainmeterHideMeterGroup +** +** Callback for the !RainmeterHideMeterGroup bang +** +*/ +void RainmeterHideMeterGroup(HWND, const char* arg) +{ + BangWithArgs(BANG_HIDEMETERGROUP, ConvertToWide(arg).c_str(), 1); +} + +/* +** RainmeterShowMeterGroup +** +** Callback for the !RainmeterShowMeterGroup bang +** +*/ +void RainmeterShowMeterGroup(HWND, const char* arg) +{ + BangWithArgs(BANG_SHOWMETERGROUP, ConvertToWide(arg).c_str(), 1); +} + +/* +** RainmeterToggleMeterGroup +** +** Callback for the !RainmeterToggleMeterGroup bang +** +*/ +void RainmeterToggleMeterGroup(HWND, const char* arg) +{ + BangWithArgs(BANG_TOGGLEMETERGROUP, ConvertToWide(arg).c_str(), 1); +} + /* ** RainmeterHideMeasure ** @@ -394,6 +427,39 @@ void RainmeterToggleMeasure(HWND, const char* arg) BangWithArgs(BANG_TOGGLEMEASURE, ConvertToWide(arg).c_str(), 1); } +/* +** RainmeterHideMeasureGroup +** +** Callback for the !RainmeterHideMeasureGroup bang +** +*/ +void RainmeterDisableMeasureGroup(HWND, const char* arg) +{ + BangWithArgs(BANG_DISABLEMEASUREGROUP, ConvertToWide(arg).c_str(), 1); +} + +/* +** RainmeterShowMeasureGroup +** +** Callback for the !RainmeterShowMeasureGroup bang +** +*/ +void RainmeterEnableMeasureGroup(HWND, const char* arg) +{ + BangWithArgs(BANG_ENABLEMEASUREGROUP, ConvertToWide(arg).c_str(), 1); +} + +/* +** RainmeterToggleMeasureGroup +** +** Callback for the !RainmeterToggleMeasureGroup bang +** +*/ +void RainmeterToggleMeasureGroup(HWND, const char* arg) +{ + BangWithArgs(BANG_TOGGLEMEASUREGROUP, ConvertToWide(arg).c_str(), 1); +} + /* ** RainmeterRefresh ** @@ -678,6 +744,8 @@ CRainmeter::CRainmeter() c_Debug = false; + m_Logging = false; + m_DesktopWorkAreaChanged = false; m_DesktopWorkArea.left = m_DesktopWorkArea.top = m_DesktopWorkArea.right = m_DesktopWorkArea.bottom = 0; @@ -689,8 +757,6 @@ CRainmeter::CRainmeter() m_TrayWindow = NULL; - m_ConfigEditor = L"Notepad"; - INITCOMMONCONTROLSEX initCtrls; initCtrls.dwSize = sizeof(INITCOMMONCONTROLSEX); initCtrls.dwICC = ICC_TAB_CLASSES; @@ -831,6 +897,22 @@ int CRainmeter::Initialize(HWND Parent, HINSTANCE Instance, LPCSTR szPath) bDefaultIniLocation = true; } + // Set the log file location + m_LogFile = m_IniFile; + size_t posExt = m_LogFile.find(L".ini"); + if (posExt != std::wstring::npos) + { + m_LogFile.replace(posExt, 4, L".log"); + } + else + { + m_LogFile += L".log"; // Append the extension so that we don't accidentally overwrite the ini file + } + + // Read Logging settings beforehand + m_Logging = 0!=GetPrivateProfileInt(L"Rainmeter", L"Logging", 0, m_IniFile.c_str()); + c_Debug = 0!=GetPrivateProfileInt(L"Rainmeter", L"Debug", 0, m_IniFile.c_str()); + m_PluginPath = tmpName; m_PluginPath += L"Plugins\\"; m_SkinPath = m_Path + L"Skins\\"; @@ -883,18 +965,6 @@ int CRainmeter::Initialize(HWND Parent, HINSTANCE Instance, LPCSTR szPath) } WritePrivateProfileString(L"Rainmeter", L"SkinPath", m_SkinPath.c_str(), m_IniFile.c_str()); - // Set the log file location - m_LogFile = m_IniFile; - size_t posExt = m_LogFile.find(L".ini"); - if (posExt != std::wstring::npos) - { - m_LogFile.replace(posExt, 4, L".log"); - } - else - { - m_LogFile += L".log"; // Append the extension so that we don't accidentally overwrite the ini file - } - if (!c_DummyLitestep) { char tmpSz[MAX_LINE_LENGTH]; @@ -935,9 +1005,6 @@ int CRainmeter::Initialize(HWND Parent, HINSTANCE Instance, LPCSTR szPath) CheckSkinVersions(); } - // Read Debug first - c_Debug = 0!=GetPrivateProfileInt(L"Rainmeter", L"Debug", 0, m_IniFile.c_str()); - CSystem::Initialize(Instance); CMeasureNet::InitializeNewApi(); @@ -1007,6 +1074,12 @@ int CRainmeter::Initialize(HWND Parent, HINSTANCE Instance, LPCSTR szPath) AddBangCommand("!RainmeterDisableMeasure", RainmeterDisableMeasure); AddBangCommand("!RainmeterEnableMeasure", RainmeterEnableMeasure); AddBangCommand("!RainmeterToggleMeasure", RainmeterToggleMeasure); + AddBangCommand("!RainmeterHideMeterGroup", RainmeterHideMeterGroup); + AddBangCommand("!RainmeterShowMeterGroup", RainmeterShowMeterGroup); + AddBangCommand("!RainmeterToggleMeterGroup", RainmeterToggleMeterGroup); + AddBangCommand("!RainmeterDisableMeasureGroup", RainmeterDisableMeasureGroup); + AddBangCommand("!RainmeterEnableMeasureGroup", RainmeterEnableMeasureGroup); + AddBangCommand("!RainmeterToggleMeasureGroup", RainmeterToggleMeasureGroup); AddBangCommand("!RainmeterActivateConfig", RainmeterActivateConfig); AddBangCommand("!RainmeterToggleConfig", RainmeterToggleConfig); AddBangCommand("!RainmeterDeactivateConfig", RainmeterDeactivateConfig); @@ -1531,6 +1604,12 @@ void CRainmeter::Quit(HINSTANCE dllInst) RemoveBangCommand("!RainmeterHideMeasure"); RemoveBangCommand("!RainmeterShowMeasure"); RemoveBangCommand("!RainmeterToggleMeasure"); + RemoveBangCommand("!RainmeterHideMeterGroup"); + RemoveBangCommand("!RainmeterShowMeterGroup"); + RemoveBangCommand("!RainmeterToggleMeterGroup"); + RemoveBangCommand("!RainmeterHideMeasureGroup"); + RemoveBangCommand("!RainmeterShowMeasureGroup"); + RemoveBangCommand("!RainmeterToggleMeasureGroup"); RemoveBangCommand("!RainmeterActivateConfig"); RemoveBangCommand("!RainmeterDeactivateConfig"); RemoveBangCommand("!RainmeterToggleConfig"); @@ -1735,6 +1814,30 @@ BOOL CRainmeter::ExecuteBang(const std::wstring& bang, const std::wstring& arg, { BangWithArgs(BANG_TOGGLEMEASURE, arg.c_str(), 1); } + else if (wcsicmp(bang.c_str(), L"!RainmeterHideMeterGroup") == 0) + { + BangWithArgs(BANG_HIDEMETERGROUP, arg.c_str(), 1); + } + else if (wcsicmp(bang.c_str(), L"!RainmeterShowMeterGroup") == 0) + { + BangWithArgs(BANG_SHOWMETERGROUP, arg.c_str(), 1); + } + else if (wcsicmp(bang.c_str(), L"!RainmeterToggleMeterGroup") == 0) + { + BangWithArgs(BANG_TOGGLEMETERGROUP, arg.c_str(), 1); + } + else if (wcsicmp(bang.c_str(), L"!RainmeterDisableMeasureGroup") == 0) + { + BangWithArgs(BANG_DISABLEMEASUREGROUP, arg.c_str(), 1); + } + else if (wcsicmp(bang.c_str(), L"!RainmeterEnableMeasureGroup") == 0) + { + BangWithArgs(BANG_ENABLEMEASUREGROUP, arg.c_str(), 1); + } + else if (wcsicmp(bang.c_str(), L"!RainmeterToggleMeasureGroup") == 0) + { + BangWithArgs(BANG_TOGGLEMEASUREGROUP, arg.c_str(), 1); + } else if (wcsicmp(bang.c_str(), L"!RainmeterActivateConfig") == 0) { RainmeterActivateConfig(NULL, ConvertToAscii(arg.c_str()).c_str()); @@ -1979,6 +2082,10 @@ void CRainmeter::ReadGeneralSettings(std::wstring& iniFile) CConfigParser parser; parser.Initialize(iniFile.c_str(), this); + // Read Logging settings + m_Logging = 0!=parser.ReadInt(L"Rainmeter", L"Logging", 0); + c_Debug = 0!=parser.ReadInt(L"Rainmeter", L"Debug", 0); + if (m_TrayWindow) { m_TrayWindow->ReadConfig(parser); @@ -2009,7 +2116,35 @@ void CRainmeter::ReadGeneralSettings(std::wstring& iniFile) m_ConfigEditor.insert(0, L"\""); m_ConfigEditor.append(L"\""); } - if (c_Debug) DebugLog(L"ConfigEditor: %s", m_ConfigEditor.c_str()); + + m_LogViewer = parser.ReadString(L"Rainmeter", L"LogViewer", L""); + if (m_LogViewer.empty()) + { + // Get the program path associated with .log files + WCHAR buffer[MAX_PATH+1] = {0}; + DWORD cchOut = MAX_PATH; + + HRESULT hr = AssocQueryString(ASSOCF_NOTRUNCATE, ASSOCSTR_EXECUTABLE, L".log", L"open", buffer, &cchOut); + if (SUCCEEDED(hr) && cchOut > 0) + { + m_LogViewer = buffer; + } + else + { + m_LogViewer = L"Notepad"; + } + } + if (!m_LogViewer.empty() && m_LogViewer[0] != L'\"') + { + m_LogViewer.insert(0, L"\""); + m_LogViewer.append(L"\""); + } + + if (c_Debug) + { + DebugLog(L"ConfigEditor: %s", m_ConfigEditor.c_str()); + DebugLog(L"LogViewer: %s", m_LogViewer.c_str()); + } m_TrayExecuteL = parser.ReadString(L"Rainmeter", L"TrayExecuteL", L"", false); m_TrayExecuteR = parser.ReadString(L"Rainmeter", L"TrayExecuteR", L"", false); @@ -2265,6 +2400,26 @@ void CRainmeter::ShowContextMenu(POINT pos, CMeterWindow* meterWindow) EnableMenuItem(subMenu, ID_CONTEXT_SHOWLOGFILE, MF_BYCOMMAND | MF_GRAYED); } + if (_waccess(m_LogFile.c_str(), 0) == -1) + { + EnableMenuItem(subMenu, ID_CONTEXT_SHOWLOGFILE, MF_BYCOMMAND | MF_GRAYED); + EnableMenuItem(subMenu, ID_CONTEXT_DELETELOGFILE, MF_BYCOMMAND | MF_GRAYED); + } + + if (m_Logging) + { + EnableMenuItem(subMenu, ID_CONTEXT_STARTLOG, MF_BYCOMMAND | MF_GRAYED); + } + else + { + EnableMenuItem(subMenu, ID_CONTEXT_STOPLOG, MF_BYCOMMAND | MF_GRAYED); + } + + if (c_Debug) + { + CheckMenuItem(subMenu, ID_CONTEXT_DEBUGLOG, MF_BYCOMMAND | MF_CHECKED); + } + HMENU configMenu = CreateConfigMenu(m_ConfigMenu); if (configMenu) { @@ -2291,7 +2446,7 @@ void CRainmeter::ShowContextMenu(POINT pos, CMeterWindow* meterWindow) } else { - InsertMenu(subMenu, 10, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); + InsertMenu(subMenu, 11, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); // Create a menu for all active configs std::map::const_iterator iter = Rainmeter->GetAllMeterWindows().begin(); @@ -2301,7 +2456,7 @@ void CRainmeter::ShowContextMenu(POINT pos, CMeterWindow* meterWindow) { CMeterWindow* mw = ((*iter).second); HMENU skinMenu = CreateSkinMenu(mw, index); - InsertMenu(subMenu, 10, MF_BYPOSITION | MF_POPUP, (UINT_PTR)skinMenu, mw->GetSkinName().c_str()); + InsertMenu(subMenu, 11, MF_BYPOSITION | MF_POPUP, (UINT_PTR)skinMenu, mw->GetSkinName().c_str()); ++index; } @@ -2633,6 +2788,18 @@ void CRainmeter::ChangeSkinIndex(HMENU menu, int index) } } +void CRainmeter::SetLogging(bool logging) +{ + m_Logging = logging; + WritePrivateProfileString(L"Rainmeter", L"Logging", logging ? L"1" : L"0", m_IniFile.c_str()); +} + +void CRainmeter::SetDebug(bool debug) +{ + c_Debug = debug; + WritePrivateProfileString(L"Rainmeter", L"Debug", debug ? L"1" : L"0", m_IniFile.c_str()); +} + void CRainmeter::TestSettingsFile(bool bDefaultIniLocation) { WritePrivateProfileString(L"Rainmeter", L"WriteTest", L"TRUE", m_IniFile.c_str()); diff --git a/Library/Rainmeter.h b/Library/Rainmeter.h index 2428786b..2eea8c24 100644 --- a/Library/Rainmeter.h +++ b/Library/Rainmeter.h @@ -137,6 +137,7 @@ public: std::wstring GetSettingsPath() { return ExtractPath(m_IniFile); }; const std::wstring& GetConfigEditor() { return m_ConfigEditor; }; + const std::wstring& GetLogViewer() { return m_LogViewer; }; const std::wstring& GetStatsDate() { return m_StatsDate; }; HINSTANCE GetInstance() { return m_Instance; }; @@ -146,6 +147,7 @@ public: static void SetCommandLine(LPCTSTR CmdLine) { c_CmdLine = CmdLine;}; static LPCTSTR GetCommandLine() { return c_CmdLine.c_str(); }; static GlobalConfig& GetGlobalConfig() { return c_GlobalConfig; }; + static bool GetDebug() { return c_Debug; } void ReloadSettings(); @@ -160,7 +162,10 @@ public: BOOL GetNewVersion() { return m_NewVersion; }; void SetDisableVersionCheck(BOOL check) { m_DisableVersionCheck = check; }; void SetNewVersion(BOOL NewVer) { m_NewVersion = NewVer; }; - + + void SetLogging(bool logging); + bool GetLogging() { return m_Logging; } + void SetDebug(bool debug); void ShowContextMenu(POINT pos, CMeterWindow* meterWindow); @@ -233,7 +238,10 @@ private: BOOL m_DesktopWorkAreaChanged; RECT m_DesktopWorkArea; + bool m_Logging; + std::wstring m_ConfigEditor; + std::wstring m_LogViewer; CConfigParser* m_CurrentParser; diff --git a/Library/System.cpp b/Library/System.cpp index fabf96c7..0d84f966 100644 --- a/Library/System.cpp +++ b/Library/System.cpp @@ -730,7 +730,7 @@ void CSystem::ChangeZPosInOrder() */ void CSystem::PrepareHelperWindow(HWND WorkerW) { - bool logging = CRainmeter::GetDebug(); + bool logging = CRainmeter::GetDebug() && DEBUG_VERBOSE; if (c_ShowDesktop && WorkerW) { diff --git a/Library/TrayWindow.cpp b/Library/TrayWindow.cpp index 02419022..26f25bd3 100644 --- a/Library/TrayWindow.cpp +++ b/Library/TrayWindow.cpp @@ -409,6 +409,10 @@ LRESULT CALLBACK CTrayWindow::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA help = L"\"" + help + L"Rainmeter.chm\""; LSExecute(NULL, help.c_str(), SW_SHOWNORMAL); } + else if(wParam == ID_CONTEXT_NEW_VERSION) + { + LSExecute(NULL, L"http://rainmeter.net/RainCMS/", SW_SHOWNORMAL); + } else if(wParam == ID_CONTEXT_REFRESH) { PostMessage(tray->GetWindow(), WM_DELAYED_REFRESH_ALL, (WPARAM)NULL, (LPARAM)NULL); @@ -419,40 +423,65 @@ LRESULT CALLBACK CTrayWindow::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA std::wstring log = Rainmeter->GetLogFile(); if (_waccess(log.c_str(), 0) != -1) { - std::wstring command = Rainmeter->GetConfigEditor(); + std::wstring command = Rainmeter->GetLogViewer(); command += log; LSExecute(tray->GetWindow(), command.c_str(), SW_SHOWNORMAL); } - else + } + else if(wParam == ID_CONTEXT_STARTLOG) + { + // Check if the file exists + std::wstring log = Rainmeter->GetLogFile(); + if (_waccess(log.c_str(), 0) == -1) { - int res = MessageBox(tray->GetWindow(), L"The log file doesn't exist.\nDo you want to create it?", L"Rainmeter", MB_YESNO | MB_ICONQUESTION); - if (res == IDYES) + // Create log file + HANDLE file = CreateFile(log.c_str(), GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); + if (file != INVALID_HANDLE_VALUE) { - HANDLE file = CreateFile(log.c_str(), GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); - if (file != INVALID_HANDLE_VALUE) - { - CloseHandle(file); - ResetLoggingFlag(); // Re-enable logging + CloseHandle(file); + ResetLoggingFlag(); // Re-enable logging + Rainmeter->SetLogging(true); - std::wstring message; - message = L"Created file: "; - message += log; - message += L"\nDelete it to disable Rainmeter's logging"; - MessageBox(tray->GetWindow(), message.c_str(), L"Rainmeter", MB_OK | MB_ICONINFORMATION); - - std::wstring command = Rainmeter->GetConfigEditor(); - command += log; - LSExecute(tray->GetWindow(), command.c_str(), SW_SHOWNORMAL); - } - else - { - std::wstring message; - message = L"Unable to create the file: "; - message += log; - MessageBox(tray->GetWindow(), message.c_str(), L"Rainmeter", MB_OK | MB_ICONERROR); - } + std::wstring message; + message = L"Log file created at: "; + message += log; + MessageBox(tray->GetWindow(), message.c_str(), L"Rainmeter", MB_OK | MB_ICONINFORMATION); + } + else + { + std::wstring message; + message = L"Unable to create log file: "; + message += log; + MessageBox(tray->GetWindow(), message.c_str(), L"Rainmeter", MB_OK | MB_ICONERROR); } } + else + { + Rainmeter->SetLogging(true); + } + } + else if(wParam == ID_CONTEXT_STOPLOG) + { + Rainmeter->SetLogging(false); + } + else if(wParam == ID_CONTEXT_DELETELOGFILE) + { + // Check if the file exists + std::wstring log = Rainmeter->GetLogFile(); + if (_waccess(log.c_str(), 0) != -1) + { + int res = MessageBox(tray->GetWindow(), L"Do you want to delete log file?", L"Rainmeter", MB_YESNO | MB_ICONQUESTION); + if (res == IDYES) + { + Rainmeter->SetLogging(false); + ResetLoggingFlag(); + DeleteFile(log.c_str()); + } + } + } + else if(wParam == ID_CONTEXT_DEBUGLOG) + { + Rainmeter->SetDebug(!CRainmeter::GetDebug()); } else if(wParam == ID_CONTEXT_EDITCONFIG) { @@ -468,10 +497,6 @@ LRESULT CALLBACK CTrayWindow::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA command += L"\\Addons\\RainThemes\\RainThemes.exe\""; LSExecute(tray->GetWindow(), command.c_str(), SW_SHOWNORMAL); } - else if(wParam == ID_CONTEXT_NEW_VERSION) - { - LSExecute(NULL, L"http://rainmeter.net/RainCMS/", SW_SHOWNORMAL); - } else if(wParam == ID_CONTEXT_MANAGESKINS) { std::wstring command = L"\"" + Rainmeter->GetPath(); diff --git a/Library/resource.h b/Library/resource.h index 66099c1d..07b3d6f6 100644 --- a/Library/resource.h +++ b/Library/resource.h @@ -59,6 +59,10 @@ #define ID_CONTEXT_SKINMENU_MONITOR_PRIMARY 4048 #define ID_CONTEXT_SKINMENU_MONITOR_AUTOSELECT 4049 #define ID_CONTEXT_NEW_VERSION 4050 +#define ID_CONTEXT_STARTLOG 4051 +#define ID_CONTEXT_STOPLOG 4052 +#define ID_CONTEXT_DEBUGLOG 4053 +#define ID_CONTEXT_DELETELOGFILE 4054 #define ID_CONFIG_EDIT 30000 #define ID_CONFIG_FIRST 30001