gkrellm/server/win32-gui.c

117 lines
3.4 KiB
C
Raw Normal View History

2008-02-01 21:36:15 +03:00
/* GKrellM
| Copyright (C) 1999-2007 Bill Wilson
|
| Author: Bill Wilson billw@gkrellm.net
| Latest versions might be found at: http://gkrellm.net
|
|
| GKrellM 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 3 of the License, or
| (at your option) any later version.
|
| GKrellM 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, see http://www.gnu.org/licenses/
*/
#include "win32-gui.h"
#include "resource.h"
#include <shellapi.h>
static UINT s_gkrellmCallback;
static ATOM s_wndAtom = 0;
static HINSTANCE s_hInst;
static HWND s_hWnd = NULL;
LRESULT CALLBACK serverWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == s_gkrellmCallback && lParam == WM_RBUTTONUP)
{
PostQuitMessage(0);
done = 1;
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
int createServerWindow(HINSTANCE hInstance)
{
NOTIFYICONDATA nid;
WNDCLASSEX wndClass;
const char * wndClassName = "GKrellMServer";
done = 0;
s_hInst = hInstance;
wndClass.cbSize = sizeof(WNDCLASSEX);
wndClass.style = 0;// CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc = serverWndProc;
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
wndClass.hInstance = s_hInst;
wndClass.hIcon = NULL;
wndClass.hCursor = NULL;
wndClass.hbrBackground = 0;
wndClass.lpszMenuName = NULL;
wndClass.lpszClassName = wndClassName;
wndClass.hIconSm = NULL;
// Register window class for server window
s_wndAtom = RegisterClassEx(&wndClass);
if (s_wndAtom == 0)
return 0;
// Create invisible server window (needed to have a parent for the trayicon)
s_hWnd = CreateWindow(MAKEINTATOM(s_wndAtom), "GKrellMServer", SW_HIDE, 0, 0, 0, 0,
NULL, NULL, s_hInst, NULL);
if (s_hWnd == NULL)
return 0;
s_gkrellmCallback = RegisterWindowMessage(TEXT("GKrellMCallback"));
// Create system tray icon
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = s_hWnd;
nid.uID = 1;
nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
nid.uCallbackMessage = s_gkrellmCallback;
strcpy(nid.szTip,"GKrellM Server for Windows"); // TODO: i18n
nid.hIcon = LoadIcon(GetModuleHandle(NULL),
MAKEINTRESOURCE(IDI_ICON3));
Shell_NotifyIcon(NIM_ADD, &nid);
return 1;
}
void deleteServerWindow()
{
if (s_hWnd != NULL)
{
NOTIFYICONDATA nid;
// Remove system tray icon
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = s_hWnd;
nid.uID = 1;
Shell_NotifyIcon(NIM_DELETE, &nid);
// Remove invisible server window
DestroyWindow(s_hWnd);
}
if (s_wndAtom != 0)
{
// Unregister window class of server window
UnregisterClass(MAKEINTRESOURCE(s_wndAtom), s_hInst);
}
}