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 * David Quintana <gigaherz@gmail.com>
16 #define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
17 #define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
19 WINE_DEFAULT_DEBUG_CHANNEL(stobject
);
21 typedef struct _PWRSCHEMECONTEXT
26 } PWRSCHEMECONTEXT
, *PPWRSCHEMECONTEXT
;
28 //static HICON g_hIconBattery = NULL;
29 static HICON g_hIconAC
= NULL
;
31 static BOOL g_IsRunning
= FALSE
;
34 HRESULT STDMETHODCALLTYPE
Power_Init(_In_ CSysTray
* pSysTray
)
36 WCHAR strTooltip
[128];
38 TRACE("Power_Init\n");
40 // g_hIconBattery = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_BATTERY));
41 g_hIconAC
= LoadIcon(g_hInstance
, MAKEINTRESOURCE(IDI_BATTERY
));
46 // icon = g_hIconBattery;
50 LoadStringW(g_hInstance
, IDS_PWR_AC
, strTooltip
, _countof(strTooltip
));
54 return pSysTray
->NotifyIcon(NIM_ADD
, ID_ICON_POWER
, icon
, strTooltip
);
57 HRESULT STDMETHODCALLTYPE
Power_Update(_In_ CSysTray
* pSysTray
)
61 TRACE("Power_Update\n");
67 if (PrevState
!= g_IsMute
)
69 WCHAR strTooltip
[128];
73 LoadStringW(g_hInstance
, IDS_VOL_MUTED
, strTooltip
, _countof(strTooltip
));
77 LoadStringW(g_hInstance
, IDS_VOL_VOLUME
, strTooltip
, _countof(strTooltip
));
80 return pSysTray
->NotifyIcon(NIM_MODIFY
, ID_ICON_POWER
, icon
, strTooltip
);
90 HRESULT STDMETHODCALLTYPE
Power_Shutdown(_In_ CSysTray
* pSysTray
)
92 TRACE("Power_Shutdown\n");
96 return pSysTray
->NotifyIcon(NIM_DELETE
, ID_ICON_POWER
, NULL
, NULL
);
99 static void _RunPower()
101 ShellExecuteW(NULL
, NULL
, L
"powercfg.cpl", NULL
, NULL
, SW_SHOWNORMAL
);
104 static void _ShowContextMenu(CSysTray
* pSysTray
)
108 LoadStringW(g_hInstance
, IDS_PWR_PROPERTIES
, strOpen
, _countof(strOpen
));
110 HMENU hPopup
= CreatePopupMenu();
111 AppendMenuW(hPopup
, MF_STRING
, IDS_PWR_PROPERTIES
, strOpen
);
113 DWORD flags
= TPM_RETURNCMD
| TPM_NONOTIFY
| TPM_RIGHTALIGN
| TPM_BOTTOMALIGN
;
114 DWORD msgPos
= GetMessagePos();
116 SetForegroundWindow(pSysTray
->GetHWnd());
117 DWORD id
= TrackPopupMenuEx(hPopup
, flags
,
118 GET_X_LPARAM(msgPos
), GET_Y_LPARAM(msgPos
),
119 pSysTray
->GetHWnd(), NULL
);
125 case IDS_PWR_PROPERTIES
:
134 PowerSchemesEnumProc(
143 PPWRSCHEMECONTEXT PowerSchemeContext
= (PPWRSCHEMECONTEXT
)lParam
;
145 if (AppendMenuW(PowerSchemeContext
->hPopup
, MF_STRING
, uiIndex
+ 1, sName
))
147 if (PowerSchemeContext
->uiFirst
== 0)
148 PowerSchemeContext
->uiFirst
= uiIndex
+ 1;
150 PowerSchemeContext
->uiLast
= uiIndex
+ 1;
158 ShowPowerSchemesPopupMenu(
161 PWRSCHEMECONTEXT PowerSchemeContext
= {NULL
, 0, 0};
165 PowerSchemeContext
.hPopup
= CreatePopupMenu();
166 EnumPwrSchemes(PowerSchemesEnumProc
, (LPARAM
)&PowerSchemeContext
);
168 if (GetActivePwrScheme(&uiActiveScheme
))
170 CheckMenuRadioItem(PowerSchemeContext
.hPopup
,
171 PowerSchemeContext
.uiFirst
,
172 PowerSchemeContext
.uiLast
,
177 msgPos
= GetMessagePos();
179 SetForegroundWindow(pSysTray
->GetHWnd());
180 id
= TrackPopupMenuEx(PowerSchemeContext
.hPopup
,
181 TPM_RETURNCMD
| TPM_NONOTIFY
| TPM_RIGHTALIGN
| TPM_BOTTOMALIGN
,
182 GET_X_LPARAM(msgPos
),
183 GET_Y_LPARAM(msgPos
),
187 DestroyMenu(PowerSchemeContext
.hPopup
);
190 SetActivePwrScheme(id
- 1, NULL
, NULL
);
193 HRESULT STDMETHODCALLTYPE
Power_Message(_In_ CSysTray
* pSysTray
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
&lResult
)
195 TRACE("Power_Message uMsg=%d, wParam=%x, lParam=%x\n", uMsg
, wParam
, lParam
);
200 TRACE("Power_Message: WM_USER+220\n");
204 return Power_Init(pSysTray
);
206 return Power_Shutdown(pSysTray
);
211 TRACE("Power_Message: WM_USER+221\n");
214 lResult
= (LRESULT
)g_IsRunning
;
220 Power_Update(pSysTray
);
228 ShowPowerSchemesPopupMenu(pSysTray
);
231 case WM_LBUTTONDBLCLK
:
239 _ShowContextMenu(pSysTray
);
242 case WM_RBUTTONDBLCLK
:
251 TRACE("Power_Message received for unknown ID %d, ignoring.\n");