ReactOS 0.4.16-dev-125-g798ea90
power.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS system libraries
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/shellext/stobject/power.cpp
5 * PURPOSE: Power notification icon handler
6 * PROGRAMMERS: Eric Kohl <eric.kohl@reactos.org>
7 Shriraj Sawant a.k.a SR13 <sr.official@hotmail.com>
8 * David Quintana <gigaherz@gmail.com>
9 */
10
11#include "precomp.h"
12
13#include <devguid.h>
14#include <winioctl.h>
15#include <powrprof.h>
16#include <windows.h>
17#include <batclass.h>
18
21
22typedef struct _PWRSCHEMECONTEXT
23{
28
31
32
33/*++
34* @name Quantize
35*
36* This function quantizes the mentioned quantity to nearest level.
37*
38* @param p
39* Should be a quantity in percentage.
40*
41* @return Nearest quantized level, can be directly used as array index based on context.
42*
43 @remarks This function uses centred/symmetric logic for quantization.
44 For the case of lvl = 4, You will get following integer levels if given (p) value falls in between the range partitions:
45 0 <= p < 12.5 : returns 0; (corresponding to 0% centre)
46 12.5 <= p < 37.5 : returns 1; (corresponding to 25% centre)
47 37.5 <= p < 62.5 : returns 2; (corresponding to 50% centre)
48 62.5 <= p < 87.5 : returns 3; (corresponding to 75% centre)
49 87.5 <= p <= 100 : returns 4; (corresponding to 100% centre)
50 *--*/
52{
53 if (p <= 12)
54 return 0;
55 else if (p > 12 && p <= 37)
56 return 1;
57 else if (p > 37 && p <= 62)
58 return 2;
59 else if (p > 62 && p <= 87)
60 return 3;
61 else
62 return 4;
63}
64
65/*++
66* @name DynamicLoadIcon
67*
68* Returns the respective icon as per the current battery capacity.
69* It also does the work of setting global parameters of battery capacity and tooltips.
70*
71* @param hinst
72* A handle to a instance of the module.
73*
74* @return The handle to respective battery icon.
75*
76*--*/
78{
79 SYSTEM_POWER_STATUS PowerStatus;
80 HICON hBatIcon;
81 UINT index = -1;
82
83 if (!GetSystemPowerStatus(&PowerStatus) ||
84 PowerStatus.ACLineStatus == AC_LINE_UNKNOWN ||
85 PowerStatus.BatteryFlag == BATTERY_FLAG_UNKNOWN)
86 {
89 return hBatIcon;
90 }
91
92 if (((PowerStatus.BatteryFlag & BATTERY_FLAG_NO_BATTERY) == 0) &&
94 {
97 }
98 else if (((PowerStatus.BatteryFlag & BATTERY_FLAG_NO_BATTERY) == 0) &&
100 {
101 index = Quantize(PowerStatus.BatteryLifePercent);
104 }
105 else if (((PowerStatus.BatteryFlag & BATTERY_FLAG_NO_BATTERY) == 0) &&
106 ((PowerStatus.BatteryFlag & BATTERY_FLAG_CHARGING) == 0))
107 {
108 index = Quantize(PowerStatus.BatteryLifePercent);
111 }
112 else
113 {
115 g_strTooltip.LoadStringW(IDS_PWR_AC);
116 }
117
118 return hBatIcon;
119}
120
122{
123 TRACE("Power_Init\n");
125
126 return pSysTray->NotifyIcon(NIM_ADD, ID_ICON_POWER, g_hIconBattery, g_strTooltip);
127}
128
130{
131 TRACE("Power_Update\n");
133
134 return pSysTray->NotifyIcon(NIM_MODIFY, ID_ICON_POWER, g_hIconBattery, g_strTooltip);
135}
136
138{
139 TRACE("Power_Shutdown\n");
140
141 return pSysTray->NotifyIcon(NIM_DELETE, ID_ICON_POWER, NULL, NULL);
142}
143
144static void _RunPower()
145{
146 ShellExecuteW(NULL, NULL, L"powercfg.cpl", NULL, NULL, SW_SHOWNORMAL);
147}
148
149static void _ShowContextMenu(CSysTray * pSysTray)
150{
152 HMENU hPopup = CreatePopupMenu();
153 AppendMenuW(hPopup, MF_STRING, IDS_PWR_PROPERTIES, strOpen);
155
156 SetForegroundWindow(pSysTray->GetHWnd());
158 POINT pt;
160
161 DWORD id = TrackPopupMenuEx(hPopup, flags,
162 pt.x, pt.y,
163 pSysTray->GetHWnd(), NULL);
164
165 switch (id)
166 {
168 _RunPower();
169 break;
170 }
171 DestroyMenu(hPopup);
172}
173
174static
178 UINT uiIndex,
179 DWORD dwName,
180 LPWSTR sName,
181 DWORD dwDesc,
182 LPWSTR sDesc,
183 PPOWER_POLICY pp,
185{
186 PPWRSCHEMECONTEXT PowerSchemeContext = (PPWRSCHEMECONTEXT)lParam;
187
188 if (AppendMenuW(PowerSchemeContext->hPopup, MF_STRING, uiIndex + 1, sName))
189 {
190 if (PowerSchemeContext->uiFirst == 0)
191 PowerSchemeContext->uiFirst = uiIndex + 1;
192
193 PowerSchemeContext->uiLast = uiIndex + 1;
194 }
195
196 return TRUE;
197}
198
199static
200VOID
202 CSysTray *pSysTray)
203{
204 PWRSCHEMECONTEXT PowerSchemeContext = {NULL, 0, 0};
205 UINT uiActiveScheme;
206 DWORD id;
207 POINT pt;
208 PowerSchemeContext.hPopup = CreatePopupMenu();
209 EnumPwrSchemes(PowerSchemesEnumProc, (LPARAM)&PowerSchemeContext);
210
211 if (GetActivePwrScheme(&uiActiveScheme))
212 {
213 CheckMenuRadioItem(PowerSchemeContext.hPopup,
214 PowerSchemeContext.uiFirst,
215 PowerSchemeContext.uiLast,
216 uiActiveScheme + 1,
218 }
219
220 SetForegroundWindow(pSysTray->GetHWnd());
222
223 id = TrackPopupMenuEx(PowerSchemeContext.hPopup,
225 pt.x,
226 pt.y,
227 pSysTray->GetHWnd(),
228 NULL);
229
230 DestroyMenu(PowerSchemeContext.hPopup);
231
232 if (id != 0)
233 SetActivePwrScheme(id - 1, NULL, NULL);
234}
235
237{
238 TRACE("Power_Message uMsg=%d, wParam=%x, lParam=%x\n", uMsg, wParam, lParam);
239
240 switch (uMsg)
241 {
242 case WM_USER + 220:
243 TRACE("Power_Message: WM_USER+220\n");
245 {
246 if (lParam)
247 {
248 pSysTray->EnableService(POWER_SERVICE_FLAG, TRUE);
249 return Power_Init(pSysTray);
250 }
251 else
252 {
253 pSysTray->EnableService(POWER_SERVICE_FLAG, FALSE);
254 return Power_Shutdown(pSysTray);
255 }
256 }
257 return S_FALSE;
258
259 case WM_USER + 221:
260 TRACE("Power_Message: WM_USER+221\n");
262 {
263 lResult = (LRESULT)pSysTray->IsServiceEnabled(POWER_SERVICE_FLAG);
264 return S_OK;
265 }
266 return S_FALSE;
267
268 case WM_TIMER:
269 if (wParam == POWER_TIMER_ID)
270 {
271 KillTimer(pSysTray->GetHWnd(), POWER_TIMER_ID);
273 }
274 break;
275
276 case ID_ICON_POWER:
277 Power_Update(pSysTray);
278
279 switch (lParam)
280 {
281 case WM_LBUTTONDOWN:
282 SetTimer(pSysTray->GetHWnd(), POWER_TIMER_ID, GetDoubleClickTime(), NULL);
283 break;
284
285 case WM_LBUTTONUP:
286 break;
287
288 case WM_LBUTTONDBLCLK:
289 KillTimer(pSysTray->GetHWnd(), POWER_TIMER_ID);
290 _RunPower();
291 break;
292
293 case WM_RBUTTONDOWN:
294 break;
295
296 case WM_RBUTTONUP:
297 _ShowContextMenu(pSysTray);
298 break;
299
300 case WM_RBUTTONDBLCLK:
301 break;
302
303 case WM_MOUSEMOVE:
304 break;
305 }
306 return S_OK;
307
308 default:
309 TRACE("Power_Message received for unknown ID %d, ignoring.\n");
310 return S_FALSE;
311 }
312
313 return S_FALSE;
314}
HINSTANCE g_hInstance
Definition: MainWindow.cpp:18
unsigned char BOOLEAN
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
void __cdecl Format(UINT nFormatID,...)
Definition: cstringt.h:818
HWND GetHWnd()
Definition: csystray.h:54
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
struct _PWRSCHEMECONTEXT * PPWRSCHEMECONTEXT
HRESULT STDMETHODCALLTYPE Power_Message(_In_ CSysTray *pSysTray, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult)
Definition: power.cpp:236
static UINT Quantize(BYTE p)
Definition: power.cpp:51
static void _RunPower()
Definition: power.cpp:144
struct _PWRSCHEMECONTEXT PWRSCHEMECONTEXT
static HICON g_hIconBattery
Definition: power.cpp:30
HRESULT STDMETHODCALLTYPE Power_Init(_In_ CSysTray *pSysTray)
Definition: power.cpp:121
HRESULT STDMETHODCALLTYPE Power_Shutdown(_In_ CSysTray *pSysTray)
Definition: power.cpp:137
CString g_strTooltip
Definition: power.cpp:29
int br_icons[5]
Definition: power.cpp:19
int bc_icons[5]
Definition: power.cpp:20
HRESULT STDMETHODCALLTYPE Power_Update(_In_ CSysTray *pSysTray)
Definition: power.cpp:129
static HICON DynamicLoadIcon(HINSTANCE hinst)
Definition: power.cpp:77
static void _ShowContextMenu(CSysTray *pSysTray)
Definition: power.cpp:149
static VOID ShowPowerSchemesPopupMenu(CSysTray *pSysTray)
Definition: power.cpp:201
static BOOLEAN CALLBACK PowerSchemesEnumProc(UINT uiIndex, DWORD dwName, LPWSTR sName, DWORD dwDesc, LPWSTR sDesc, PPOWER_POLICY pp, LPARAM lParam)
Definition: power.cpp:177
#define ID_ICON_POWER
Definition: precomp.h:35
#define POWER_TIMER_ID
Definition: precomp.h:83
#define POWER_SERVICE_FLAG
Definition: precomp.h:38
#define IDI_BATTCAP3
Definition: resource.h:45
#define IDS_PWR_AC
Definition: resource.h:11
#define IDI_BATTCAP4
Definition: resource.h:46
#define IDI_BATTCHA3
Definition: resource.h:51
#define IDI_BATTCHA0
Definition: resource.h:48
#define IDI_POWER_AC
Definition: resource.h:54
#define IDS_PWR_CHARGING
Definition: resource.h:9
#define IDS_PWR_PERCENT_REMAINING
Definition: resource.h:8
#define IDI_BATTCAP2
Definition: resource.h:44
#define IDI_BATTCAP0
Definition: resource.h:42
#define IDI_BATTCHA2
Definition: resource.h:50
#define IDI_BATTCHA1
Definition: resource.h:49
#define IDI_BATTCAP1
Definition: resource.h:43
#define IDI_BATTCHA4
Definition: resource.h:52
#define IDI_BATTCAP_ERR
Definition: resource.h:53
#define IDS_PWR_UNKNOWN_REMAINING
Definition: resource.h:10
#define IDS_PWR_PROPERTIES
Definition: resource.h:5
#define CALLBACK
Definition: compat.h:35
BOOL WINAPI GetSystemPowerStatus(IN LPSYSTEM_POWER_STATUS PowerStatus)
Definition: power.c:27
#define pt(x, y)
Definition: drawing.c:79
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint index
Definition: glext.h:6031
GLbitfield flags
Definition: glext.h:7161
GLfloat GLfloat p
Definition: glext.h:8902
GLuint id
Definition: glext.h:5910
#define S_OK
Definition: intsafe.h:52
static HINSTANCE hinst
Definition: edit.c:551
static HICON
Definition: imagelist.c:80
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
#define _In_
Definition: ms_sal.h:308
unsigned int UINT
Definition: ndis.h:50
#define L(x)
Definition: ntvdm.h:50
#define LRESULT
Definition: ole.h:14
BOOLEAN WINAPI GetActivePwrScheme(PUINT puiID)
Definition: powrprof.c:285
BOOLEAN WINAPI SetActivePwrScheme(UINT uiID, PGLOBAL_POWER_POLICY lpGlobalPowerPolicy, PPOWER_POLICY lpPowerPolicy)
Definition: powrprof.c:642
BOOLEAN WINAPI EnumPwrSchemes(PWRSCHEMESENUMPROC lpfnPwrSchemesEnumProc, LPARAM lParam)
Definition: powrprof.c:219
#define NIM_DELETE
Definition: shellapi.h:96
#define NIM_MODIFY
Definition: shellapi.h:95
#define NIM_ADD
Definition: shellapi.h:94
HINSTANCE WINAPI ShellExecuteW(HWND hwnd, LPCWSTR lpVerb, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd)
Definition: shlexec.cpp:2482
#define TRACE(s)
Definition: solgame.cpp:4
#define BATTERY_FLAG_CHARGING
Definition: winbase.h:518
#define BATTERY_FLAG_NO_BATTERY
Definition: winbase.h:519
#define BATTERY_FLAG_UNKNOWN
Definition: winbase.h:520
#define BATTERY_PERCENTAGE_UNKNOWN
Definition: winbase.h:521
#define AC_LINE_UNKNOWN
Definition: winbase.h:514
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
#define S_FALSE
Definition: winerror.h:2357
#define SW_SHOWNORMAL
Definition: winuser.h:773
HMENU WINAPI CreatePopupMenu(void)
Definition: menu.c:838
#define MF_BYCOMMAND
Definition: winuser.h:202
BOOL WINAPI SetMenuDefaultItem(_In_ HMENU, _In_ UINT, _In_ UINT)
#define WM_LBUTTONDBLCLK
Definition: winuser.h:1781
#define TPM_BOTTOMALIGN
Definition: winuser.h:2388
#define MF_STRING
Definition: winuser.h:138
BOOL WINAPI SetForegroundWindow(_In_ HWND)
BOOL WINAPI GetCursorPos(_Out_ LPPOINT)
Definition: cursoricon.c:2722
#define WM_RBUTTONUP
Definition: winuser.h:1783
#define WM_RBUTTONDBLCLK
Definition: winuser.h:1784
#define WM_MOUSEMOVE
Definition: winuser.h:1778
#define TPM_RIGHTALIGN
Definition: winuser.h:2381
#define TPM_NONOTIFY
Definition: winuser.h:2389
#define WM_LBUTTONDOWN
Definition: winuser.h:1779
BOOL WINAPI TrackPopupMenuEx(_In_ HMENU, _In_ UINT, _In_ int, _In_ int, _In_ HWND, _In_opt_ LPTPMPARAMS)
UINT WINAPI GetDoubleClickTime(void)
Definition: ntwrapper.h:314
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
#define WM_RBUTTONDOWN
Definition: winuser.h:1782
#define WM_TIMER
Definition: winuser.h:1745
#define LoadIcon
Definition: winuser.h:5825
#define WM_LBUTTONUP
Definition: winuser.h:1780
BOOL WINAPI CheckMenuRadioItem(_In_ HMENU, _In_ UINT, _In_ UINT, _In_ UINT, _In_ UINT)
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define WM_USER
Definition: winuser.h:1898
#define TPM_RETURNCMD
Definition: winuser.h:2390
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
#define MAKEINTRESOURCE
Definition: winuser.h:591
BOOL WINAPI AppendMenuW(_In_ HMENU, _In_ UINT, _In_ UINT_PTR, _In_opt_ LPCWSTR)
const char * LPCSTR
Definition: xmlstorage.h:183
WCHAR * LPWSTR
Definition: xmlstorage.h:184
unsigned char BYTE
Definition: xxhash.c:193