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..80af41ac9a235bd0634c00bdc01d7d2f4dd9da4c 100644 |
--- a/base/system_monitor/system_monitor_win.cc |
+++ b/base/system_monitor/system_monitor_win.cc |
@@ -4,23 +4,78 @@ |
#include "base/system_monitor/system_monitor.h" |
+#include "base/win/wrapped_window_proc.h" |
+ |
namespace base { |
-void SystemMonitor::ProcessWmPowerBroadcastMessage(int event_id) { |
+namespace { |
+ |
+const wchar_t kWindowClassName[] = L"Base_PowerMessageWindow"; |
+ |
+} // namespace |
+ |
+void SystemMonitor::PlatformInit() { |
+ power_message_window_.reset(new PowerMessageWindow(this)); |
+} |
+ |
+void SystemMonitor::PlatformDestroy() { |
+} |
+ |
+// 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(SystemMonitor* monitor) |
+ : monitor_(monitor), instance_(NULL), message_hwnd_(NULL) { |
+ InitMessageHWND(); |
+} |
+ |
+SystemMonitor::PowerMessageWindow::~PowerMessageWindow() { |
+ if (message_hwnd_) |
+ DestroyWindow(message_hwnd_); |
+} |
+ |
+void SystemMonitor::PowerMessageWindow::InitMessageHWND() { |
vandebo (ex-Chrome)
2013/02/20 22:30:40
I think this can all go in the constructor. It is
Hongbo Min
2013/02/21 07:39:08
Make more sense. Done!
|
+ 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_ = CreateWindow(kWindowClassName, |
+ 0, 0, 0, 0, 0, 0, HWND_MESSAGE, 0, instance_, 0); |
vandebo (ex-Chrome)
2013/02/20 22:30:40
Are you sure you want HWND_MESSAGE as the parent?
Hongbo Min
2013/02/21 07:39:08
I just saw MessagePumpForUI in message_pump_win.cc
|
+ SetWindowLongPtr(message_hwnd_, GWLP_USERDATA, |
+ reinterpret_cast<LONG_PTR>(this)); |
+} |
+ |
+void SystemMonitor::PowerMessageWindow::ProcessWmPowerBroadcastMessage( |
+ int event_id) { |
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 +88,32 @@ void SystemMonitor::ProcessWmPowerBroadcastMessage(int event_id) { |
// PBT_APMRESUMECRITICAL - removed in Vista. |
// PBT_POWERSETTINGCHANGE - user changed the power settings. |
} |
- ProcessPowerMessage(power_event); |
+ monitor_->ProcessPowerMessage(power_event); |
vandebo (ex-Chrome)
2013/02/20 22:30:40
Can we just call SystemMonitor::Get() here, that w
Hongbo Min
2013/02/21 07:39:08
Done!
|
} |
-// 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 TRUE; |
vandebo (ex-Chrome)
2013/02/20 22:30:40
Should this also return ::DefWindowProc ?
Hongbo Min
2013/02/21 07:39:08
Good catch! Done!
|
+} |
+ |
+// 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 |