/* 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 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); } }