taskmgr: Use default font for proc listview.
[wine] / programs / taskmgr / trayicon.c
1 /*
2  *  ReactOS Task Manager
3  *
4  *  trayicon.c
5  *
6  *  Copyright (C) 1999 - 2001  Brian Palmer  <brianp@reactos.org>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21  */
22     
23 #define WIN32_LEAN_AND_MEAN    /* Exclude rarely-used stuff from Windows headers */
24 #include <windows.h>
25 #include <commctrl.h>
26 #include <stdlib.h>
27 #include <malloc.h>
28 #include <memory.h>
29 #include <tchar.h>
30 #include <stdio.h>
31 #include <winnt.h>
32     
33 #include "taskmgr.h"
34 #include "perfdata.h"
35 #include "shellapi.h"
36
37 HICON TrayIcon_GetProcessorUsageIcon(void)
38 {
39     HICON        hTrayIcon = NULL;
40     HDC            hScreenDC = NULL;
41     HDC            hDC = NULL;
42     HBITMAP        hBitmap = NULL;
43     HBITMAP        hOldBitmap;
44     HBITMAP        hBitmapMask = NULL;
45     ICONINFO    iconInfo;
46     ULONG        ProcessorUsage;
47     int            nLinesToDraw;
48     HBRUSH        hBitmapBrush = NULL;
49     RECT        rc;
50
51     /*
52      * Get a handle to the screen DC
53      */
54     hScreenDC = GetDC(NULL);
55     if (!hScreenDC)
56         goto done;
57     
58     /*
59      * Create our own DC from it
60      */
61     hDC = CreateCompatibleDC(hScreenDC);
62     if (!hDC)
63         goto done;
64
65     /*
66      * Load the bitmaps
67      */
68     hBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_TRAYICON));
69     hBitmapMask = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_TRAYMASK));
70     if (!hBitmap || !hBitmapMask)
71         goto done;
72
73     hBitmapBrush = CreateSolidBrush(RGB(0, 255, 0));
74     if (!hBitmapBrush)
75         goto done;
76     
77     /*
78      * Select the bitmap into our device context
79      * so we can draw on it.
80      */
81     hOldBitmap = (HBITMAP) SelectObject(hDC, hBitmap);
82
83     /*
84      * Get the cpu usage
85      */
86     ProcessorUsage = PerfDataGetProcessorUsage();
87
88     /*
89      * Calculate how many lines to draw
90      * since we have 11 rows of space
91      * to draw the cpu usage instead of
92      * just having 10.
93      */
94     nLinesToDraw = (ProcessorUsage + (ProcessorUsage / 10)) / 11;
95     rc.left = 3;
96     rc.top = 12 - nLinesToDraw;
97     rc.right = 13;
98     rc.bottom = 13;
99
100     /*
101      * Now draw the cpu usage
102      */
103     if (nLinesToDraw)
104         FillRect(hDC, &rc, hBitmapBrush);
105
106     /*
107      * Now that we are done drawing put the
108      * old bitmap back.
109      */
110     SelectObject(hDC, hOldBitmap);
111
112     iconInfo.fIcon = TRUE;
113     iconInfo.xHotspot = 0;
114     iconInfo.yHotspot = 0;
115     iconInfo.hbmMask = hBitmapMask;
116     iconInfo.hbmColor = hBitmap;
117
118     hTrayIcon = CreateIconIndirect(&iconInfo);
119
120 done:
121     /*
122      * Cleanup
123      */
124     if (hScreenDC)
125         ReleaseDC(NULL, hScreenDC);
126     if (hDC)
127         DeleteDC(hDC);
128     if (hBitmapBrush)
129         DeleteObject(hBitmapBrush);
130     if (hBitmap)
131         DeleteObject(hBitmap);
132     if (hBitmapMask)
133         DeleteObject(hBitmapMask);
134     
135     /*
136      * Return the newly created tray icon (if successful)
137      */
138     return hTrayIcon;
139 }
140
141 BOOL TrayIcon_ShellAddTrayIcon(void)
142 {
143     NOTIFYICONDATA    nid;
144     HICON            hIcon = NULL;
145     BOOL            bRetVal;
146
147     memset(&nid, 0, sizeof(NOTIFYICONDATA));
148
149     hIcon = TrayIcon_GetProcessorUsageIcon();
150
151     nid.cbSize = sizeof(NOTIFYICONDATA);
152     nid.hWnd = hMainWnd;
153     nid.uID = 0;
154     nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
155     nid.uCallbackMessage = WM_ONTRAYICON;
156     nid.hIcon = hIcon;
157     wsprintf(nid.szTip, _T("CPU Usage: %d%%"), PerfDataGetProcessorUsage());
158
159     bRetVal = Shell_NotifyIcon(NIM_ADD, &nid);
160
161     if (hIcon)
162         DestroyIcon(hIcon);
163
164     return bRetVal;
165 }
166
167 BOOL TrayIcon_ShellRemoveTrayIcon(void)
168 {
169     NOTIFYICONDATA    nid;
170     BOOL            bRetVal;
171     
172     memset(&nid, 0, sizeof(NOTIFYICONDATA));
173     
174     nid.cbSize = sizeof(NOTIFYICONDATA);
175     nid.hWnd = hMainWnd;
176     nid.uID = 0;
177     nid.uFlags = 0;
178     nid.uCallbackMessage = WM_ONTRAYICON;
179     
180     bRetVal = Shell_NotifyIcon(NIM_DELETE, &nid);
181     
182     return bRetVal;
183 }
184
185 BOOL TrayIcon_ShellUpdateTrayIcon(void)
186 {
187     NOTIFYICONDATA    nid;
188     HICON            hIcon = NULL;
189     BOOL            bRetVal;
190     
191     memset(&nid, 0, sizeof(NOTIFYICONDATA));
192     
193     hIcon = TrayIcon_GetProcessorUsageIcon();
194     
195     nid.cbSize = sizeof(NOTIFYICONDATA);
196     nid.hWnd = hMainWnd;
197     nid.uID = 0;
198     nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
199     nid.uCallbackMessage = WM_ONTRAYICON;
200     nid.hIcon = hIcon;
201     wsprintf(nid.szTip, _T("CPU Usage: %d%%"), PerfDataGetProcessorUsage());
202     
203     bRetVal = Shell_NotifyIcon(NIM_MODIFY, &nid);
204     
205     if (hIcon)
206         DestroyIcon(hIcon);
207     
208     return bRetVal;
209 }