The !bangs can be now used from command line even if there are no active configs.

Included RainBrowser to the build.
This commit is contained in:
Kimmo Pekkola 2009-10-10 08:20:28 +00:00
parent 4a5e76ce7b
commit f7970be6b5
5 changed files with 47 additions and 25 deletions

View File

@ -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)&copyData);
SendMessage(wnd, WM_COPYDATA, (WPARAM)NULL, (LPARAM)&copyData);
}
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);
}

View File

@ -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");
}

View File

@ -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

View File

@ -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);

View File

@ -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