From f7970be6b5cc66f12dfe8006205208ac4674af6d Mon Sep 17 00:00:00 2001 From: Kimmo Pekkola Date: Sat, 10 Oct 2009 08:20:28 +0000 Subject: [PATCH] The !bangs can be now used from command line even if there are no active configs. Included RainBrowser to the build. --- Application/Application.cpp | 51 +++++++++++++++++++------------------ Library/Rainmeter.cpp | 13 ++++++++++ Library/Rainmeter.h | 1 + Library/TrayWindow.cpp | 6 +++++ Library/resource.h | 1 + 5 files changed, 47 insertions(+), 25 deletions(-) diff --git a/Application/Application.cpp b/Application/Application.cpp index 5a68c5df..f640abe8 100644 --- a/Application/Application.cpp +++ b/Application/Application.cpp @@ -30,7 +30,7 @@ BOOL InitApplication(HINSTANCE hInstance, const WCHAR* WinClass); HWND InitInstance(HINSTANCE hInstance, const WCHAR* WinClass, const WCHAR* WinName); LONG APIENTRY MainWndProc(HWND, UINT, UINT, LONG); -void Bang(HWND hWnd, const WCHAR* command); +void Bang(const WCHAR* command); /* ** Stuff from the DLL @@ -38,7 +38,10 @@ void Bang(HWND hWnd, const WCHAR* command); extern "C" EXPORT_PLUGIN int initModuleEx(HWND ParentWnd, HINSTANCE dllInst, LPCSTR); extern "C" EXPORT_PLUGIN void quitModule(HINSTANCE dllInst); extern "C" EXPORT_PLUGIN void Initialize(bool DummyLS, LPCTSTR CmdLine); -extern "C++" CRainmeter* Rainmeter; +extern "C" EXPORT_PLUGIN void ExecuteBang(LPCTSTR szBang); + +const WCHAR* WinClass = L"DummyRainWClass"; +const WCHAR* WinName = L"Rainmeter control window"; /* ** WinMain @@ -49,13 +52,18 @@ extern "C++" CRainmeter* Rainmeter; int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) { MSG msg; - WCHAR* WinClass = L"DummyRainWClass"; - WCHAR* WinName = L"Rainmeter control window"; HWND hWnd; _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); // _CrtSetBreakAlloc(5055); + if (lpCmdLine && lpCmdLine[0] == L'!') + { + // It's a !bang + Bang(lpCmdLine); + return 0; + } + if(!hPrevInstance) { if (!InitApplication(hInstance, WinClass)) return FALSE; @@ -64,13 +72,6 @@ int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmd hWnd=InitInstance(hInstance, WinClass, WinName); if(!hWnd) return FALSE; - if (lpCmdLine && lpCmdLine[0] == L'!') - { - // It's a !bang - Bang(hWnd, lpCmdLine); - return 0; - } - // Remove quotes from the commandline WCHAR Path[256]; Path[0] = 0; @@ -162,20 +163,10 @@ HWND InitInstance(HINSTANCE hInstance, const WCHAR* WinClass, const WCHAR* WinNa ** Sends bangs to the DLL ** */ -void Bang(HWND hWnd, const WCHAR* command) +void Bang(const WCHAR* command) { // Check if Rainmeter is running - HWND wnd = FindWindow(L"RainmeterMeterWindow", NULL); - if (wnd == NULL) - { - // Check if all windows are "On Desktop" - HWND ProgmanHwnd = FindWindow(L"Progman", L"Program Manager"); - if (ProgmanHwnd) - { - wnd = FindWindowEx(ProgmanHwnd, NULL, L"RainmeterMeterWindow", NULL); - } - } - + HWND wnd = FindWindow(WinClass, WinName); if (wnd != NULL) { COPYDATASTRUCT copyData; @@ -185,13 +176,13 @@ void Bang(HWND hWnd, const WCHAR* command) copyData.lpData = (void*)command; // Send the bang to the Rainmeter window - SendMessage(wnd, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)©Data); + SendMessage(wnd, WM_COPYDATA, (WPARAM)NULL, (LPARAM)©Data); } else { if (wcsicmp(L"!rainmeterquit", command) != 0) { - MessageBox(hWnd, L"Rainmeter is not running.\nUnable to send the !bang to it.", L"Rainmeter", MB_OK); + MessageBox(NULL, L"Rainmeter is not running.\nUnable to send the !bang to it.", L"Rainmeter", MB_OK); } } } @@ -213,6 +204,16 @@ LONG APIENTRY MainWndProc(HWND hWnd, UINT message, UINT wParam, LONG lParam) } break; + case WM_COPYDATA: + { + COPYDATASTRUCT* pCopyDataStruct = (COPYDATASTRUCT*) lParam; + if (pCopyDataStruct && (pCopyDataStruct->dwData == 1) && (pCopyDataStruct->cbData > 0)) + { + ExecuteBang((const WCHAR*)pCopyDataStruct->lpData); + } + } + break; + default: return (LONG)DefWindowProc(hWnd, message, wParam, lParam); } diff --git a/Library/Rainmeter.cpp b/Library/Rainmeter.cpp index 073bc4de..8e48ead1 100644 --- a/Library/Rainmeter.cpp +++ b/Library/Rainmeter.cpp @@ -660,6 +660,18 @@ CRainmeter::~CRainmeter() GdiplusShutdown(m_GDIplusToken); } +/* +** ExecuteBang +** +** Runs a bang command. This is called from the main application +** when a command is given as a command line argument. +** +*/ +void ExecuteBang(LPCTSTR szBang) +{ + if (Rainmeter) Rainmeter->ExecuteCommand(szBang, NULL); +} + /* ** Initialize ** @@ -1958,6 +1970,7 @@ void CRainmeter::ShowContextMenu(POINT pos, CMeterWindow* meterWindow) { AppendMenu(configMenu, MF_SEPARATOR, 0, NULL); AppendMenu(configMenu, 0, ID_CONTEXT_OPENSKINSFOLDER, L"Open Skins\' Folder"); + AppendMenu(configMenu, 0, ID_CONTEXT_MANAGESKINS, L"Manage Skins..."); InsertMenu(subMenu, 3, MF_BYPOSITION | MF_POPUP, (UINT_PTR)configMenu, L"Configs"); } diff --git a/Library/Rainmeter.h b/Library/Rainmeter.h index 3f3ab9b2..a871963b 100644 --- a/Library/Rainmeter.h +++ b/Library/Rainmeter.h @@ -235,6 +235,7 @@ 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 diff --git a/Library/TrayWindow.cpp b/Library/TrayWindow.cpp index a1e300f0..c33a6f88 100644 --- a/Library/TrayWindow.cpp +++ b/Library/TrayWindow.cpp @@ -472,6 +472,12 @@ 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_MANAGESKINS) + { + std::wstring command = L"\"" + Rainmeter->GetPath(); + command += L"\\Addons\\RainBrowser\\RainBrowser.exe\""; + LSExecute(tray->GetWindow(), command.c_str(), SW_SHOWNORMAL); + } else if(wParam == ID_CONTEXT_QUIT) { if (Rainmeter->GetDummyLitestep()) PostQuitMessage(0); diff --git a/Library/resource.h b/Library/resource.h index 860c1212..c81c062f 100644 --- a/Library/resource.h +++ b/Library/resource.h @@ -55,6 +55,7 @@ #define ID_CONTEXT_OPENSKINSFOLDER 4044 #define ID_CONTEXT_SKINMENU_OPENSKINSFOLDER 4045 #define ID_CONTEXT_MANAGETHEMES 4046 +#define ID_CONTEXT_MANAGESKINS 4047 #define ID_CONFIG_EDIT 30000 #define ID_CONFIG_FIRST 30001