/* Copyright (C) 2001 Kimmo Pekkola 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 __RAINMETER_H__ #define __RAINMETER_H__ #include #include #include #include #include #include "Litestep.h" #include "MeterWindow.h" #define MAX_LINE_LENGTH 4096 #define APPNAME L"Rainmeter" #ifdef _WIN64 #define APPBITS L"64-bit" #else #define APPBITS L"32-bit" #endif #define WIDEN2(x) L ## x #define WIDEN(x) WIDEN2(x) #define APPDATE WIDEN(__DATE__) // Callbacks for Litestep void RainmeterRefresh(HWND, const char* arg); void RainmeterRefreshApp(HWND, const char* arg); void RainmeterRedraw(HWND, const char* arg); void RainmeterUpdate(HWND, const char* arg); void RainmeterShow(HWND, const char* arg); void RainmeterHide(HWND, const char* arg); void RainmeterToggle(HWND, const char* arg); void RainmeterShowFade(HWND, const char* arg); void RainmeterHideFade(HWND, const char* arg); void RainmeterToggleFade(HWND, const char* arg); void RainmeterShowBlur(HWND, const char* arg); void RainmeterHideBlur(HWND, const char* arg); void RainmeterToggleBlur(HWND, const char* arg); void RainmeterAddBlur(HWND, const char* arg); void RainmeterRemoveBlur(HWND, const char* arg); void RainmeterShowMeter(HWND, const char* arg); void RainmeterHideMeter(HWND, const char* arg); void RainmeterToggleMeter(HWND, const char* arg); void RainmeterMoveMeter(HWND, const char* arg); void RainmeterUpdateMeter(HWND, const char* arg); void RainmeterEnableMeasure(HWND, const char* arg); void RainmeterDisableMeasure(HWND, const char* arg); void RainmeterToggleMeasure(HWND, const char* arg); void RainmeterUpdateMeasure(HWND, const char* arg); void RainmeterCommandMeasure(HWND, const char* arg); void RainmeterActivateConfig(HWND, const char* arg); void RainmeterDeactivateConfig(HWND, const char* arg); void RainmeterToggleConfig(HWND, const char* arg); void RainmeterMove(HWND, const char* arg); void RainmeterZPos(HWND, const char* arg); void RainmeterClickThrough(HWND, const char* arg); void RainmeterDraggable(HWND, const char* arg); void RainmeterSnapEdges(HWND, const char* arg); void RainmeterKeepOnScreen(HWND, const char* arg); void RainmeterSetTransparency(HWND, const char* arg); void RainmeterSetVariable(HWND, const char* arg); void RainmeterSetOption(HWND, const char* arg); void RainmeterRefreshGroup(HWND, const char* arg); void RainmeterRedrawGroup(HWND, const char* arg); void RainmeterUpdateGroup(HWND, const char* arg); void RainmeterShowGroup(HWND, const char* arg); void RainmeterHideGroup(HWND, const char* arg); void RainmeterToggleGroup(HWND, const char* arg); void RainmeterShowFadeGroup(HWND, const char* arg); void RainmeterHideFadeGroup(HWND, const char* arg); void RainmeterToggleFadeGroup(HWND, const char* arg); void RainmeterShowMeterGroup(HWND, const char* arg); void RainmeterHideMeterGroup(HWND, const char* arg); void RainmeterToggleMeterGroup(HWND, const char* arg); void RainmeterUpdateMeterGroup(HWND, const char* arg); void RainmeterEnableMeasureGroup(HWND, const char* arg); void RainmeterDisableMeasureGroup(HWND, const char* arg); void RainmeterToggleMeasureGroup(HWND, const char* arg); void RainmeterUpdateMeasureGroup(HWND, const char* arg); void RainmeterDeactivateConfigGroup(HWND, const char* arg); void RainmeterZPosGroup(HWND, const char* arg); void RainmeterClickThroughGroup(HWND, const char* arg); void RainmeterDraggableGroup(HWND, const char* arg); void RainmeterSnapEdgesGroup(HWND, const char* arg); void RainmeterKeepOnScreenGroup(HWND, const char* arg); void RainmeterSetTransparencyGroup(HWND, const char* arg); void RainmeterSetVariableGroup(HWND, const char* arg); void RainmeterSetOptionGroup(HWND, const char* arg); void RainmeterLsHook(HWND, const char* arg); void RainmeterAbout(HWND, const char* arg); void RainmeterManage(HWND, const char* arg); void RainmeterSkinMenu(HWND, const char* arg); void RainmeterTrayMenu(HWND, const char* arg); void RainmeterResetStats(HWND, const char* arg); void RainmeterWriteKeyValue(HWND, const char* arg); void RainmeterPluginBang(HWND, const char* arg); void RainmeterQuit(HWND, const char* arg); // Callbacks for Unicode support void RainmeterActivateConfigWide(const WCHAR* arg); void RainmeterDeactivateConfigWide(const WCHAR* arg); void RainmeterToggleConfigWide(const WCHAR* arg); void RainmeterDeactivateConfigGroupWide(const WCHAR* arg); void RainmeterRefreshAppWide(); void RainmeterAboutWide(const WCHAR* arg = NULL); void RainmeterManageWide(const WCHAR* arg = NULL); void RainmeterSkinMenuWide(const WCHAR* arg); void RainmeterTrayMenuWide(); void RainmeterResetStatsWide(); void RainmeterWriteKeyValueWide(const WCHAR* arg); void RainmeterQuitWide(); void BangWithArgs(BANGCOMMAND bang, const WCHAR* arg, size_t numOfArgs); void BangGroupWithArgs(BANGCOMMAND bang, const WCHAR* arg, size_t numOfArgs); struct GlobalConfig { double netInSpeed; double netOutSpeed; }; class CConfigParser; class CTrayWindow; class CRainmeter { public: struct CONFIG { std::wstring config; std::vector iniFiles; std::vector commands; int active; }; struct CONFIGMENU { std::wstring name; size_t index; std::vector children; }; struct LOG_INFO { int level; std::wstring timestamp; std::wstring message; }; CRainmeter(); ~CRainmeter(); int Initialize(HWND Parent, HINSTANCE Instance, LPCSTR szPath); void Quit(HINSTANCE dllInst); CConfigParser* GetCurrentParser() { return m_CurrentParser; } void SetCurrentParser(CConfigParser* parser) { m_CurrentParser = parser; } CTrayWindow* GetTrayWindow() { return m_TrayWindow; } CMeterWindow* GetMeterWindow(const std::wstring& config); CMeterWindow* GetMeterWindowByINI(const std::wstring& ini_searching); CMeterWindow* GetMeterWindow(HWND hwnd); void GetMeterWindowsByLoadOrder(std::multimap& windows, const std::wstring& group = L""); std::map& GetAllMeterWindows() { return m_Meters; } const std::vector& GetAllConfigs() { return m_ConfigStrings; } const std::vector& GetAllThemes() { return m_Themes; } void ActivateConfig(int configIndex, int iniIndex); bool DeactivateConfig(CMeterWindow* meterWindow, int configIndex, bool save = true); const std::wstring& GetPath() { return m_Path; } const std::wstring& GetIniFile() { return m_IniFile; } const std::wstring& GetLogFile() { return m_LogFile; } const std::wstring& GetSkinPath() { return m_SkinPath; } const std::wstring& GetPluginPath() { return m_PluginPath; } const std::wstring& GetAddonPath() { return m_AddonPath; } std::wstring GetSettingsPath() { return ExtractPath(m_IniFile); } const std::wstring& GetDrive() { return m_Drive; } 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; } static void SetDummyLitestep(bool Dummy) { c_DummyLitestep = Dummy; } static bool GetDummyLitestep() { return c_DummyLitestep; } 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(); void UpdateStats(); void ReadStats(); void WriteStats(bool bForce); void ResetStats(); bool GetDisableVersionCheck() { return m_DisableVersionCheck; } void SetDisableVersionCheck(bool check); bool GetNewVersion() { return m_NewVersion; } void SetNewVersion(bool newver) { m_NewVersion = newver; } bool GetLogging() { return m_Logging; } void StartLogging(); void StopLogging(); void DeleteLogFile(); bool GetDisableRDP() { return m_DisableRDP; } bool GetDisableDragging() { return m_DisableDragging; } void SetDisableDragging(bool dragging); void AddAboutLogInfo(int level, LPCWSTR time, LPCWSTR message); const std::list& GetAboutLogData() { return m_LogData; } void SetDebug(bool debug); bool IsMenuActive() { return m_MenuActive; } void ShowContextMenu(POINT pos, CMeterWindow* meterWindow); const std::wstring& GetTrayExecuteL() { return m_TrayExecuteL; } const std::wstring& GetTrayExecuteR() { return m_TrayExecuteR; } const std::wstring& GetTrayExecuteM() { return m_TrayExecuteM; } const std::wstring& GetTrayExecuteDR() { return m_TrayExecuteDR; } const std::wstring& GetTrayExecuteDL() { return m_TrayExecuteDL; } const std::wstring& GetTrayExecuteDM() { return m_TrayExecuteDM; } BOOL ExecuteBang(const std::wstring& bang, const std::wstring& arg, CMeterWindow* meterWindow); std::wstring ParseCommand(const WCHAR* command, CMeterWindow* meterWindow); void ExecuteCommand(const WCHAR* command, CMeterWindow* meterWindow); void RefreshAll(); void LoadTheme(const std::wstring& name); void PreserveSetting(const std::wstring& from, LPCTSTR key, bool replace = true); void ClearDeleteLaterList(); static std::vector ParseString(LPCTSTR str); static std::wstring ExtractPath(const std::wstring& strFilePath); static void ExpandEnvironmentVariables(std::wstring& strPath); friend class CDialogManage; private: void CreateMeterWindow(const std::wstring& path, const std::wstring& config, const std::wstring& iniFile); bool DeleteMeterWindow(CMeterWindow* meterWindow, bool bLater); void WriteActive(const std::wstring& config, int iniIndex); void ScanForConfigs(const std::wstring& path); void ScanForThemes(const std::wstring& path); void ReadGeneralSettings(const std::wstring& iniFile); void SetLoadOrder(int configIndex, int order); int GetLoadOrder(const std::wstring& config); bool SetActiveConfig(const std::wstring& skinName, const std::wstring& skinIni); void UpdateDesktopWorkArea(bool reset); HMENU CreateSkinMenu(CMeterWindow* meterWindow, int index, HMENU configMenu); void ChangeSkinIndex(HMENU subMenu, int index); int ScanForConfigsRecursive(const std::wstring& path, std::wstring base, int index, std::vector& menu, bool DontRecurse); HMENU CreateConfigMenu(HMENU configMenu, std::vector& configMenuData); void CreateThemeMenu(HMENU themeMenu); void CreateMonitorMenu(HMENU monitorMenu, CMeterWindow* meterWindow); void CreateDefaultConfigFile(const std::wstring& strFile); void SetLogging(bool logging); void TestSettingsFile(bool bDefaultIniLocation); CTrayWindow* m_TrayWindow; std::vector m_ConfigStrings; // All configs found in the given folder std::vector m_ConfigMenu; std::multimap m_ConfigOrders; std::map m_Meters; // The meter windows std::vector m_Themes; std::wstring m_Path; // Path to the main folder std::wstring m_IniFile; // The main ini file std::wstring m_StatsFile; // The statistics ini file std::wstring m_LogFile; // The log file std::wstring m_SkinPath; // Path to the folder where the skins are std::wstring m_PluginPath; // Path to the folder where the plugins are std::wstring m_AddonPath; // Path to the folder where the addons are std::wstring m_Drive; std::wstring m_StatsDate; // The date when stats gathering started std::wstring m_TrayExecuteL; std::wstring m_TrayExecuteR; std::wstring m_TrayExecuteM; std::wstring m_TrayExecuteDL; std::wstring m_TrayExecuteDR; std::wstring m_TrayExecuteDM; bool m_DisableVersionCheck; bool m_NewVersion; bool m_DesktopWorkAreaChanged; bool m_DesktopWorkAreaType; // If true, DesktopWorkArea is treated as "margin" std::map m_DesktopWorkAreas; std::vector m_OldDesktopWorkAreas; bool m_MenuActive; bool m_DisableRDP; bool m_DisableDragging; bool m_Logging; std::list m_LogData; std::wstring m_ConfigEditor; std::wstring m_LogViewer; CConfigParser* m_CurrentParser; HINSTANCE m_Instance; ULONG_PTR m_GDIplusToken; std::list m_DelayDeleteList; static bool c_DummyLitestep; // true, if not a Litestep plugin static std::wstring c_CmdLine; // The command line arguments static GlobalConfig c_GlobalConfig; static bool c_Debug; }; #ifdef LIBRARY_EXPORTS #define EXPORT_PLUGIN __declspec(dllexport) #else #define EXPORT_PLUGIN __declspec(dllimport) #endif extern "C" { EXPORT_PLUGIN int initModuleEx(HWND ParentWnd, HINSTANCE dllInst, LPCSTR szPath); EXPORT_PLUGIN void quitModule(HINSTANCE dllInst); EXPORT_PLUGIN void Initialize(bool DummyLS, LPCTSTR CmdLine); EXPORT_PLUGIN void ExecuteBang(LPCTSTR szBang); } #endif