home *** CD-ROM | disk | FTP | other *** search
- /* Functions for creating, setting and destroying the workspace tray icon
- *
- * Written and copyright 1999 Adam Lock <locka@iol.ie>
- *
- * Distributed under the GNU General Public License; see the README file.
- * This code comes with NO WARRANTY.
- */
- #include "stdio.h"
-
- #include "windows.h"
-
- #include "w32taskbar.h"
- #include "w32res.h"
- #include "w32log.h"
-
- #define WM_TRAYMSG WM_USER+1
-
- static HMENU g_hmenuTray;
- static HWND g_hwndTrayX;
-
- static LRESULT CALLBACK TrayProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
-
- /*
- * Creates and returns the invisible window responsible for processing tray messages
- */
- HWND CreateTrayWindow(HINSTANCE hInstance)
- {
- WNDCLASS wc;
- static const char *szWndName = "JunkbusterTrayWindow";
-
- wc.style = 0;
- wc.lpfnWndProc = TrayProc;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- wc.hInstance = hInstance;
- wc.hIcon = 0;
- wc.hCursor = 0;
- wc.hbrBackground = 0;
- wc.lpszMenuName = 0;
- wc.lpszClassName = szWndName;
-
- RegisterClass(&wc);
-
- g_hwndTrayX = CreateWindow(szWndName, szWndName,
- WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
- CW_USEDEFAULT, NULL, NULL, hInstance, NULL );
-
- ShowWindow(g_hwndTrayX, SW_HIDE);
- UpdateWindow(g_hwndTrayX);
-
- g_hmenuTray = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_TRAYMENU));
-
- return g_hwndTrayX;
- }
-
-
- /*
- * Sets the tray icon to the specified shape
- */
- BOOL TraySetIcon(HWND hwnd, UINT uID, HICON hicon)
- {
- BOOL bSuccess;
- NOTIFYICONDATA nid;
-
- memset(&nid, 0, sizeof(nid));
-
- nid.cbSize = sizeof(nid);
- nid.hWnd = hwnd;
- nid.uID = uID;
- nid.uFlags = NIF_ICON;
- nid.uCallbackMessage = 0;
- nid.hIcon = hicon;
-
- bSuccess = Shell_NotifyIcon(NIM_MODIFY, &nid);
-
- return bSuccess;
- }
-
-
- /*
- * Adds a tray icon
- */
- BOOL TrayAddIcon(HWND hwnd, UINT uID, HICON hicon, const char *pszToolTip)
- {
- BOOL bSuccess;
- NOTIFYICONDATA nid;
-
- memset(&nid, 0, sizeof(nid));
-
- nid.cbSize = sizeof(nid);
- nid.hWnd = hwnd;
- nid.uID = uID;
- nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
- nid.uCallbackMessage = WM_TRAYMSG;
- nid.hIcon = hicon;
-
- if (pszToolTip)
- {
- strcpy(nid.szTip, pszToolTip);
- }
-
- bSuccess = Shell_NotifyIcon(NIM_ADD, &nid);
-
- return bSuccess;
- }
-
-
- /*
- * Deletes a tray icon
- */
- BOOL TrayDeleteIcon(HWND hwnd, UINT uID)
- {
- BOOL bSuccess;
- NOTIFYICONDATA nid;
-
- memset(&nid, 0, sizeof(nid));
-
- nid.cbSize = sizeof(nid);
- nid.hWnd = hwnd;
- nid.uID = uID;
-
- bSuccess = Shell_NotifyIcon(NIM_DELETE, &nid);
-
- return bSuccess;
- }
-
-
- /*
- * Call back procedure processes tray messages
- */
- LRESULT CALLBACK TrayProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
- {
- switch(msg)
- {
- case WM_CREATE:
- return 0;
-
- case WM_CLOSE:
- PostQuitMessage(0);
- return 0;
-
- case WM_TRAYMSG:
- {
- UINT uID = (UINT) wParam;
- UINT uMouseMsg = (UINT) lParam;
-
- if (uMouseMsg == WM_RBUTTONDOWN)
- {
- POINT pt;
- HMENU hmenu = GetSubMenu(g_hmenuTray,0);
- GetCursorPos(&pt);
- SetForegroundWindow(g_hwndLogFrame);
- TrackPopupMenu(hmenu, TPM_LEFTALIGN | TPM_TOPALIGN, pt.x, pt.y, 0, g_hwndLogFrame, NULL);
- PostMessage(g_hwndLogFrame, WM_NULL, 0, 0 ) ;
- }
- else if (uMouseMsg == WM_LBUTTONDBLCLK)
- {
- ShowLogWindow(TRUE);
- }
- }
- return 0;
-
- default:
- /* DO NOTHING */
- break;
- }
-
- return DefWindowProc(hwnd, msg, wParam, lParam);
- }
-