ReactOS 0.4.16-dev-1049-g378a335
power.cpp File Reference
#include "precomp.h"
#include <devguid.h>
#include <winioctl.h>
#include <powrprof.h>
#include <windows.h>
#include <batclass.h>
Include dependency graph for power.cpp:

Go to the source code of this file.

Classes

struct  _PWRSCHEMECONTEXT
 

Macros

#define HOUR_IN_SECS   3600
 
#define MIN_IN_SECS   60
 

Typedefs

typedef struct _PWRSCHEMECONTEXT PWRSCHEMECONTEXT
 
typedef struct _PWRSCHEMECONTEXTPPWRSCHEMECONTEXT
 

Functions

static UINT Quantize (BYTE p)
 
static HICON DynamicLoadIcon (HINSTANCE hinst)
 
HRESULT STDMETHODCALLTYPE Power_Init (_In_ CSysTray *pSysTray)
 
HRESULT STDMETHODCALLTYPE Power_Update (_In_ CSysTray *pSysTray)
 
HRESULT STDMETHODCALLTYPE Power_Shutdown (_In_ CSysTray *pSysTray)
 
static void _RunPower ()
 
static void _ShowContextMenu (CSysTray *pSysTray)
 
static BOOLEAN CALLBACK PowerSchemesEnumProc (UINT uiIndex, DWORD dwName, LPWSTR sName, DWORD dwDesc, LPWSTR sDesc, PPOWER_POLICY pp, LPARAM lParam)
 
static VOID ShowPowerSchemesPopupMenu (CSysTray *pSysTray)
 
HRESULT STDMETHODCALLTYPE Power_Message (_In_ CSysTray *pSysTray, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult)
 

Variables

int br_icons [5] = { IDI_BATTCAP0, IDI_BATTCAP1, IDI_BATTCAP2, IDI_BATTCAP3, IDI_BATTCAP4 }
 
int bc_icons [5] = { IDI_BATTCHA0, IDI_BATTCHA1, IDI_BATTCHA2, IDI_BATTCHA3, IDI_BATTCHA4 }
 
CString g_strTooltip
 
static HICON g_hIconBattery = NULL
 

Macro Definition Documentation

◆ HOUR_IN_SECS

#define HOUR_IN_SECS   3600

Definition at line 32 of file power.cpp.

◆ MIN_IN_SECS

#define MIN_IN_SECS   60

Definition at line 33 of file power.cpp.

Typedef Documentation

◆ PPWRSCHEMECONTEXT

◆ PWRSCHEMECONTEXT

Function Documentation

◆ _RunPower()

static void _RunPower ( )
static

Definition at line 172 of file power.cpp.

173{
174 CSysTray::RunDll("powercfg.cpl", "");
175}
static void RunDll(PCSTR Dll, PCSTR Parameters)
Definition: csystray.cpp:413

Referenced by _ShowContextMenu(), and Power_Message().

◆ _ShowContextMenu()

static void _ShowContextMenu ( CSysTray pSysTray)
static

Definition at line 177 of file power.cpp.

178{
180 HMENU hPopup = CreatePopupMenu();
181 AppendMenuW(hPopup, MF_STRING, IDS_PWR_PROPERTIES, strOpen);
183
184 SetForegroundWindow(pSysTray->GetHWnd());
186 POINT pt;
188
189 DWORD id = TrackPopupMenuEx(hPopup, flags,
190 pt.x, pt.y,
191 pSysTray->GetHWnd(), NULL);
192
193 switch (id)
194 {
196 _RunPower();
197 break;
198 }
199 DestroyMenu(hPopup);
200}
HWND GetHWnd()
Definition: csystray.h:54
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
static void _RunPower()
Definition: power.cpp:172
#define IDS_PWR_PROPERTIES
Definition: resource.h:5
#define pt(x, y)
Definition: drawing.c:79
unsigned long DWORD
Definition: ntddk_ex.h:95
GLbitfield flags
Definition: glext.h:7161
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
HMENU WINAPI CreatePopupMenu(void)
Definition: menu.c:838
BOOL WINAPI SetMenuDefaultItem(_In_ HMENU, _In_ UINT, _In_ UINT)
#define TPM_BOTTOMALIGN
Definition: winuser.h:2396
#define MF_STRING
Definition: winuser.h:138
BOOL WINAPI SetForegroundWindow(_In_ HWND)
BOOL WINAPI GetCursorPos(_Out_ LPPOINT)
Definition: cursoricon.c:3032
#define TPM_RIGHTALIGN
Definition: winuser.h:2389
#define TPM_NONOTIFY
Definition: winuser.h:2397
BOOL WINAPI TrackPopupMenuEx(_In_ HMENU, _In_ UINT, _In_ int, _In_ int, _In_ HWND, _In_opt_ LPTPMPARAMS)
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define TPM_RETURNCMD
Definition: winuser.h:2398
BOOL WINAPI AppendMenuW(_In_ HMENU, _In_ UINT, _In_ UINT_PTR, _In_opt_ LPCWSTR)
const char * LPCSTR
Definition: xmlstorage.h:183

Referenced by Power_Message().

◆ DynamicLoadIcon()

static HICON DynamicLoadIcon ( HINSTANCE  hinst)
static

Definition at line 79 of file power.cpp.

80{
81 SYSTEM_POWER_STATUS PowerStatus;
82 HICON hBatIcon;
83 UINT uiHour, uiMin;
84 UINT index = -1;
85
86 if (!GetSystemPowerStatus(&PowerStatus) ||
87 PowerStatus.ACLineStatus == AC_LINE_UNKNOWN ||
88 PowerStatus.BatteryFlag == BATTERY_FLAG_UNKNOWN)
89 {
92 return hBatIcon;
93 }
94
95 if (((PowerStatus.BatteryFlag & BATTERY_FLAG_NO_BATTERY) == 0) &&
97 {
100 }
101 else if (((PowerStatus.BatteryFlag & BATTERY_FLAG_NO_BATTERY) == 0) &&
103 {
104 index = Quantize(PowerStatus.BatteryLifePercent);
107 }
108 else if (PowerStatus.ACLineStatus == AC_LINE_ONLINE &&
109 PowerStatus.BatteryLifePercent == 100)
110 {
111 index = Quantize(PowerStatus.BatteryLifePercent);
114 }
115 else if (((PowerStatus.BatteryFlag & BATTERY_FLAG_NO_BATTERY) == 0) &&
116 ((PowerStatus.BatteryFlag & BATTERY_FLAG_CHARGING) == 0))
117 {
118 index = Quantize(PowerStatus.BatteryLifePercent);
120
121 if (PowerStatus.BatteryLifeTime != BATTERY_UNKNOWN_TIME)
122 {
123 uiHour = PowerStatus.BatteryLifeTime / HOUR_IN_SECS;
124 uiMin = (PowerStatus.BatteryLifeTime % HOUR_IN_SECS) / MIN_IN_SECS;
125
126 if (uiHour != 0)
127 {
129 }
130 else
131 {
133 }
134 }
135 else
136 {
138 }
139 }
140 else
141 {
143 g_strTooltip.LoadStringW(IDS_PWR_AC);
144 }
145
146 return hBatIcon;
147}
#define BATTERY_UNKNOWN_TIME
Definition: batclass.h:68
void __cdecl Format(UINT nFormatID,...)
Definition: cstringt.h:818
static UINT Quantize(BYTE p)
Definition: power.cpp:53
CString g_strTooltip
Definition: power.cpp:29
int br_icons[5]
Definition: power.cpp:19
int bc_icons[5]
Definition: power.cpp:20
#define HOUR_IN_SECS
Definition: power.cpp:32
#define MIN_IN_SECS
Definition: power.cpp:33
#define IDS_PWR_MINUTES_REMAINING
Definition: resource.h:13
#define IDS_PWR_AC
Definition: resource.h:11
#define IDI_POWER_AC
Definition: resource.h:55
#define IDS_PWR_CHARGING
Definition: resource.h:9
#define IDS_PWR_HOURS_REMAINING
Definition: resource.h:12
#define IDS_PWR_PERCENT_REMAINING
Definition: resource.h:8
#define IDS_PWR_FULLY_CHARGED
Definition: resource.h:14
#define IDI_BATTCAP_ERR
Definition: resource.h:54
#define IDS_PWR_UNKNOWN_REMAINING
Definition: resource.h:10
BOOL WINAPI GetSystemPowerStatus(IN LPSYSTEM_POWER_STATUS PowerStatus)
Definition: power.c:27
GLuint index
Definition: glext.h:6031
static HINSTANCE hinst
Definition: edit.c:551
static HICON
Definition: imagelist.c:80
unsigned int UINT
Definition: ndis.h:50
#define MAKEINTRESOURCE(i)
Definition: ntverrsrc.c:25
#define BATTERY_FLAG_CHARGING
Definition: winbase.h:544
#define BATTERY_FLAG_NO_BATTERY
Definition: winbase.h:545
#define AC_LINE_ONLINE
Definition: winbase.h:538
#define BATTERY_FLAG_UNKNOWN
Definition: winbase.h:546
#define BATTERY_PERCENTAGE_UNKNOWN
Definition: winbase.h:547
#define AC_LINE_UNKNOWN
Definition: winbase.h:540
#define LoadIcon
Definition: winuser.h:5833

Referenced by Power_Init(), and Power_Update().

◆ Power_Init()

HRESULT STDMETHODCALLTYPE Power_Init ( _In_ CSysTray pSysTray)

Definition at line 149 of file power.cpp.

150{
151 TRACE("Power_Init\n");
153
154 return pSysTray->NotifyIcon(NIM_ADD, ID_ICON_POWER, g_hIconBattery, g_strTooltip);
155}
HINSTANCE g_hInstance
Definition: MainWindow.cpp:18
static HICON g_hIconBattery
Definition: power.cpp:30
static HICON DynamicLoadIcon(HINSTANCE hinst)
Definition: power.cpp:79
#define ID_ICON_POWER
Definition: precomp.h:35
#define NIM_ADD
Definition: shellapi.h:95
#define TRACE(s)
Definition: solgame.cpp:4

Referenced by Power_Message().

◆ Power_Message()

HRESULT STDMETHODCALLTYPE Power_Message ( _In_ CSysTray pSysTray,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
LRESULT lResult 
)

Definition at line 264 of file power.cpp.

265{
266 TRACE("Power_Message uMsg=%d, wParam=%x, lParam=%x\n", uMsg, wParam, lParam);
267
268 switch (uMsg)
269 {
270 case WM_USER + 220:
271 TRACE("Power_Message: WM_USER+220\n");
273 {
274 if (lParam)
275 {
276 pSysTray->EnableService(POWER_SERVICE_FLAG, TRUE);
277 return Power_Init(pSysTray);
278 }
279 else
280 {
281 pSysTray->EnableService(POWER_SERVICE_FLAG, FALSE);
282 return Power_Shutdown(pSysTray);
283 }
284 }
285 return S_FALSE;
286
287 case WM_USER + 221:
288 TRACE("Power_Message: WM_USER+221\n");
290 {
291 lResult = (LRESULT)pSysTray->IsServiceEnabled(POWER_SERVICE_FLAG);
292 return S_OK;
293 }
294 return S_FALSE;
295
296 case WM_TIMER:
297 if (wParam == POWER_TIMER_ID)
298 {
299 KillTimer(pSysTray->GetHWnd(), POWER_TIMER_ID);
301 }
302 break;
303
304 case ID_ICON_POWER:
305 Power_Update(pSysTray);
306
307 switch (lParam)
308 {
309 case WM_LBUTTONDOWN:
310 SetTimer(pSysTray->GetHWnd(), POWER_TIMER_ID, GetDoubleClickTime(), NULL);
311 break;
312
313 case WM_LBUTTONUP:
314 break;
315
316 case WM_LBUTTONDBLCLK:
317 KillTimer(pSysTray->GetHWnd(), POWER_TIMER_ID);
318 _RunPower();
319 break;
320
321 case WM_RBUTTONDOWN:
322 break;
323
324 case WM_RBUTTONUP:
325 _ShowContextMenu(pSysTray);
326 break;
327
328 case WM_RBUTTONDBLCLK:
329 break;
330
331 case WM_MOUSEMOVE:
332 break;
333 }
334 return S_OK;
335
336 default:
337 TRACE("Power_Message received for unknown ID %d, ignoring.\n");
338 return S_FALSE;
339 }
340
341 return S_FALSE;
342}
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define TRUE
Definition: types.h:120
HRESULT STDMETHODCALLTYPE Power_Init(_In_ CSysTray *pSysTray)
Definition: power.cpp:149
HRESULT STDMETHODCALLTYPE Power_Shutdown(_In_ CSysTray *pSysTray)
Definition: power.cpp:165
HRESULT STDMETHODCALLTYPE Power_Update(_In_ CSysTray *pSysTray)
Definition: power.cpp:157
static void _ShowContextMenu(CSysTray *pSysTray)
Definition: power.cpp:177
static VOID ShowPowerSchemesPopupMenu(CSysTray *pSysTray)
Definition: power.cpp:229
#define POWER_TIMER_ID
Definition: precomp.h:92
#define POWER_SERVICE_FLAG
Definition: precomp.h:38
#define S_OK
Definition: intsafe.h:52
#define LRESULT
Definition: ole.h:14
#define S_FALSE
Definition: winerror.h:2357
#define WM_LBUTTONDBLCLK
Definition: winuser.h:1789
#define WM_RBUTTONUP
Definition: winuser.h:1791
#define WM_RBUTTONDBLCLK
Definition: winuser.h:1792
#define WM_MOUSEMOVE
Definition: winuser.h:1786
#define WM_LBUTTONDOWN
Definition: winuser.h:1787
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:1790
#define WM_TIMER
Definition: winuser.h:1753
#define WM_LBUTTONUP
Definition: winuser.h:1788
#define WM_USER
Definition: winuser.h:1906
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)

◆ Power_Shutdown()

HRESULT STDMETHODCALLTYPE Power_Shutdown ( _In_ CSysTray pSysTray)

Definition at line 165 of file power.cpp.

166{
167 TRACE("Power_Shutdown\n");
168
169 return pSysTray->NotifyIcon(NIM_DELETE, ID_ICON_POWER, NULL, NULL);
170}
#define NIM_DELETE
Definition: shellapi.h:97

Referenced by Power_Message().

◆ Power_Update()

HRESULT STDMETHODCALLTYPE Power_Update ( _In_ CSysTray pSysTray)

Definition at line 157 of file power.cpp.

158{
159 TRACE("Power_Update\n");
161
162 return pSysTray->NotifyIcon(NIM_MODIFY, ID_ICON_POWER, g_hIconBattery, g_strTooltip);
163}
#define NIM_MODIFY
Definition: shellapi.h:96

Referenced by Power_Message().

◆ PowerSchemesEnumProc()

static BOOLEAN CALLBACK PowerSchemesEnumProc ( UINT  uiIndex,
DWORD  dwName,
LPWSTR  sName,
DWORD  dwDesc,
LPWSTR  sDesc,
PPOWER_POLICY  pp,
LPARAM  lParam 
)
static

Definition at line 205 of file power.cpp.

213{
214 PPWRSCHEMECONTEXT PowerSchemeContext = (PPWRSCHEMECONTEXT)lParam;
215
216 if (AppendMenuW(PowerSchemeContext->hPopup, MF_STRING, uiIndex + 1, sName))
217 {
218 if (PowerSchemeContext->uiFirst == 0)
219 PowerSchemeContext->uiFirst = uiIndex + 1;
220
221 PowerSchemeContext->uiLast = uiIndex + 1;
222 }
223
224 return TRUE;
225}
struct _PWRSCHEMECONTEXT * PPWRSCHEMECONTEXT

Referenced by ShowPowerSchemesPopupMenu().

◆ Quantize()

static UINT Quantize ( BYTE  p)
static

Definition at line 53 of file power.cpp.

54{
55 if (p <= 12)
56 return 0;
57 else if (p > 12 && p <= 37)
58 return 1;
59 else if (p > 37 && p <= 62)
60 return 2;
61 else if (p > 62 && p <= 87)
62 return 3;
63 else
64 return 4;
65}
GLfloat GLfloat p
Definition: glext.h:8902

Referenced by DynamicLoadIcon().

◆ ShowPowerSchemesPopupMenu()

static VOID ShowPowerSchemesPopupMenu ( CSysTray pSysTray)
static

Definition at line 229 of file power.cpp.

231{
232 PWRSCHEMECONTEXT PowerSchemeContext = {NULL, 0, 0};
233 UINT uiActiveScheme;
234 DWORD id;
235 POINT pt;
236 PowerSchemeContext.hPopup = CreatePopupMenu();
237 EnumPwrSchemes(PowerSchemesEnumProc, (LPARAM)&PowerSchemeContext);
238
239 if (GetActivePwrScheme(&uiActiveScheme))
240 {
241 CheckMenuRadioItem(PowerSchemeContext.hPopup,
242 PowerSchemeContext.uiFirst,
243 PowerSchemeContext.uiLast,
244 uiActiveScheme + 1,
246 }
247
248 SetForegroundWindow(pSysTray->GetHWnd());
250
251 id = TrackPopupMenuEx(PowerSchemeContext.hPopup,
253 pt.x,
254 pt.y,
255 pSysTray->GetHWnd(),
256 NULL);
257
258 DestroyMenu(PowerSchemeContext.hPopup);
259
260 if (id != 0)
261 SetActivePwrScheme(id - 1, NULL, NULL);
262}
static BOOLEAN CALLBACK PowerSchemesEnumProc(UINT uiIndex, DWORD dwName, LPWSTR sName, DWORD dwDesc, LPWSTR sDesc, PPOWER_POLICY pp, LPARAM lParam)
Definition: power.cpp:205
GLuint id
Definition: glext.h:5910
BOOLEAN WINAPI GetActivePwrScheme(PUINT puiID)
Definition: powrprof.c:285
BOOLEAN WINAPI SetActivePwrScheme(UINT uiID, PGLOBAL_POWER_POLICY lpGlobalPowerPolicy, PPOWER_POLICY lpPowerPolicy)
Definition: powrprof.c:753
BOOLEAN WINAPI EnumPwrSchemes(PWRSCHEMESENUMPROC lpfnPwrSchemesEnumProc, LPARAM lParam)
Definition: powrprof.c:219
LONG_PTR LPARAM
Definition: windef.h:208
#define MF_BYCOMMAND
Definition: winuser.h:202
BOOL WINAPI CheckMenuRadioItem(_In_ HMENU, _In_ UINT, _In_ UINT, _In_ UINT, _In_ UINT)

Referenced by Power_Message().

Variable Documentation

◆ bc_icons

Definition at line 20 of file power.cpp.

Referenced by DynamicLoadIcon().

◆ br_icons

Definition at line 19 of file power.cpp.

Referenced by DynamicLoadIcon().

◆ g_hIconBattery

HICON g_hIconBattery = NULL
static

Definition at line 30 of file power.cpp.

Referenced by Power_Init(), and Power_Update().

◆ g_strTooltip

CString g_strTooltip

Definition at line 29 of file power.cpp.

Referenced by DynamicLoadIcon(), Power_Init(), and Power_Update().