Index: base/system_monitor/system_monitor_win.cc |
diff --git a/base/system_monitor/system_monitor_win.cc b/base/system_monitor/system_monitor_win.cc |
index 69ab85e84f6852c34095a143342a3a0417e230bc..562b69b669020015ca30bb650060ddd5676620de 100644 |
--- a/base/system_monitor/system_monitor_win.cc |
+++ b/base/system_monitor/system_monitor_win.cc |
@@ -4,23 +4,69 @@ |
#include "base/system_monitor/system_monitor.h" |
+#include "base/win/wrapped_window_proc.h" |
+ |
namespace base { |
-void SystemMonitor::ProcessWmPowerBroadcastMessage(int event_id) { |
- PowerEvent power_event; |
+namespace { |
+ |
+const wchar_t kWindowClassName[] = L"Base_PowerMessageWindow"; |
+ |
+} // namespace |
+ |
+// Function to query the system to see if it is currently running on |
+// battery power. Returns true if running on battery. |
+bool SystemMonitor::IsBatteryPower() { |
+ SYSTEM_POWER_STATUS status; |
+ if (!GetSystemPowerStatus(&status)) { |
+ DLOG_GETLASTERROR(ERROR) << "GetSystemPowerStatus failed"; |
+ return false; |
+ } |
+ return (status.ACLineStatus == 0); |
+} |
+ |
+SystemMonitor::PowerMessageWindow::PowerMessageWindow() |
+ : instance_(NULL), message_hwnd_(NULL) { |
+ WNDCLASSEX window_class; |
+ base::win::InitializeWindowClass( |
+ kWindowClassName, |
+ &base::win::WrappedWindowProc< |
+ SystemMonitor::PowerMessageWindow::WndProcThunk>, |
+ 0, 0, 0, NULL, NULL, NULL, NULL, NULL, |
+ &window_class); |
+ instance_ = window_class.hInstance; |
+ ATOM clazz = RegisterClassEx(&window_class); |
+ DCHECK(clazz); |
+ |
+ message_hwnd_ = CreateWindowEx(WS_EX_NOACTIVATE, kWindowClassName, |
+ NULL, WS_POPUP, 0, 0, 0, 0, NULL, NULL, instance_, NULL); |
+ SetWindowLongPtr(message_hwnd_, GWLP_USERDATA, |
+ reinterpret_cast<LONG_PTR>(this)); |
+} |
+ |
+SystemMonitor::PowerMessageWindow::~PowerMessageWindow() { |
+ if (message_hwnd_) { |
+ DestroyWindow(message_hwnd_); |
+ UnregisterClass(kWindowClassName, instance_); |
+ } |
+} |
+ |
+void SystemMonitor::PowerMessageWindow::ProcessWmPowerBroadcastMessage( |
+ int event_id) { |
+ SystemMonitor::PowerEvent power_event; |
switch (event_id) { |
case PBT_APMPOWERSTATUSCHANGE: // The power status changed. |
- power_event = POWER_STATE_EVENT; |
+ power_event = SystemMonitor::POWER_STATE_EVENT; |
break; |
case PBT_APMRESUMEAUTOMATIC: // Resume from suspend. |
//case PBT_APMRESUMESUSPEND: // User-initiated resume from suspend. |
// We don't notify for this latter event |
// because if it occurs it is always sent as a |
// second event after PBT_APMRESUMEAUTOMATIC. |
- power_event = RESUME_EVENT; |
+ power_event = SystemMonitor::RESUME_EVENT; |
break; |
case PBT_APMSUSPEND: // System has been suspended. |
- power_event = SUSPEND_EVENT; |
+ power_event = SystemMonitor::SUSPEND_EVENT; |
break; |
default: |
return; |
@@ -33,18 +79,33 @@ void SystemMonitor::ProcessWmPowerBroadcastMessage(int event_id) { |
// PBT_APMRESUMECRITICAL - removed in Vista. |
// PBT_POWERSETTINGCHANGE - user changed the power settings. |
} |
- ProcessPowerMessage(power_event); |
+ |
+ SystemMonitor::Get()->ProcessPowerMessage(power_event); |
} |
-// Function to query the system to see if it is currently running on |
-// battery power. Returns true if running on battery. |
-bool SystemMonitor::IsBatteryPower() { |
- SYSTEM_POWER_STATUS status; |
- if (!GetSystemPowerStatus(&status)) { |
- DLOG_GETLASTERROR(ERROR) << "GetSystemPowerStatus failed"; |
- return false; |
+LRESULT CALLBACK SystemMonitor::PowerMessageWindow::WndProc( |
+ HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { |
+ switch (message) { |
+ case WM_POWERBROADCAST: { |
+ DWORD power_event = static_cast<DWORD>(message); |
+ ProcessWmPowerBroadcastMessage(power_event); |
+ return TRUE; |
+ } |
+ default: |
+ break; |
} |
- return (status.ACLineStatus == 0); |
+ return ::DefWindowProc(hwnd, message, wparam, lparam); |
+} |
+ |
+// static |
+LRESULT CALLBACK SystemMonitor::PowerMessageWindow::WndProcThunk( |
+ HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { |
+ SystemMonitor::PowerMessageWindow* message_hwnd = |
+ reinterpret_cast<SystemMonitor::PowerMessageWindow*>( |
+ GetWindowLongPtr(hwnd, GWLP_USERDATA)); |
+ if (message_hwnd) |
+ return message_hwnd->WndProc(hwnd, message, wparam, lparam); |
+ return ::DefWindowProc(hwnd, message, wparam, lparam); |
} |
} // namespace base |