From 55034be10492786f91d12d1c10b70ab1324bc2ae Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sat, 3 Aug 2013 15:58:59 +0800 Subject: [PATCH] Add power-monitor module, fixes #45. --- atom.gyp | 3 ++ browser/api/atom_api_power_monitor.cc | 66 +++++++++++++++++++++++++++ browser/api/atom_api_power_monitor.h | 41 +++++++++++++++++ browser/api/lib/power-monitor.coffee | 7 +++ browser/atom_browser_main_parts.cc | 5 ++ common/api/atom_extensions.h | 1 + 6 files changed, 123 insertions(+) create mode 100644 browser/api/atom_api_power_monitor.cc create mode 100644 browser/api/atom_api_power_monitor.h create mode 100644 browser/api/lib/power-monitor.coffee diff --git a/atom.gyp b/atom.gyp index 87076eda48..e6d1c381fa 100644 --- a/atom.gyp +++ b/atom.gyp @@ -18,6 +18,7 @@ 'browser/api/lib/ipc.coffee', 'browser/api/lib/menu.coffee', 'browser/api/lib/menu-item.coffee', + 'browser/api/lib/power-monitor.coffee', 'browser/atom/atom.coffee', 'browser/atom/objects-registry.coffee', 'browser/atom/rpc-server.coffee', @@ -55,6 +56,8 @@ 'browser/api/atom_api_menu_mac.mm', 'browser/api/atom_api_menu_win.cc', 'browser/api/atom_api_menu_win.h', + 'browser/api/atom_api_power_monitor.cc', + 'browser/api/atom_api_power_monitor.h', 'browser/api/atom_api_window.cc', 'browser/api/atom_api_window.h', 'browser/api/atom_browser_bindings.cc', diff --git a/browser/api/atom_api_power_monitor.cc b/browser/api/atom_api_power_monitor.cc new file mode 100644 index 0000000000..21b8c606ed --- /dev/null +++ b/browser/api/atom_api_power_monitor.cc @@ -0,0 +1,66 @@ +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "browser/api/atom_api_power_monitor.h" + +#include "base/power_monitor/power_monitor.h" + +namespace atom { + +namespace api { + +PowerMonitor::PowerMonitor(v8::Handle wrapper) + : EventEmitter(wrapper) { + base::PowerMonitor::Get()->AddObserver(this); +} + +PowerMonitor::~PowerMonitor() { + base::PowerMonitor::Get()->RemoveObserver(this); +} + +void PowerMonitor::OnPowerStateChange(bool on_battery_power) { + if (on_battery_power) + Emit("on-battery"); + else + Emit("on-ac"); +} + +void PowerMonitor::OnSuspend() { + Emit("suspend"); +} + +void PowerMonitor::OnResume() { + Emit("resume"); +} + +// static +v8::Handle PowerMonitor::New(const v8::Arguments& args) { + v8::HandleScope scope; + + if (!args.IsConstructCall()) + return node::ThrowError("Require constructor call"); + + new PowerMonitor(args.This()); + + return args.This(); +} + +// static +void PowerMonitor::Initialize(v8::Handle target) { + v8::HandleScope scope; + + v8::Local t = v8::FunctionTemplate::New( + PowerMonitor::New); + t->InstanceTemplate()->SetInternalFieldCount(1); + t->SetClassName(v8::String::NewSymbol("PowerMonitor")); + + target->Set(v8::String::NewSymbol("PowerMonitor"), t->GetFunction()); +} + + +} // namespace api + +} // namespace atom + +NODE_MODULE(atom_browser_power_monitor, atom::api::PowerMonitor::Initialize) diff --git a/browser/api/atom_api_power_monitor.h b/browser/api/atom_api_power_monitor.h new file mode 100644 index 0000000000..997d1d6441 --- /dev/null +++ b/browser/api/atom_api_power_monitor.h @@ -0,0 +1,41 @@ +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ATOM_BROWSER_API_ATOM_API_POWER_MONITOR_H_ +#define ATOM_BROWSER_API_ATOM_API_POWER_MONITOR_H_ + +#include "browser/api/atom_api_event_emitter.h" + +#include "base/compiler_specific.h" +#include "base/power_monitor/power_observer.h" + +namespace atom { + +namespace api { + +class PowerMonitor : public EventEmitter, + public base::PowerObserver { + public: + virtual ~PowerMonitor(); + + static void Initialize(v8::Handle target); + + protected: + explicit PowerMonitor(v8::Handle wrapper); + + virtual void OnPowerStateChange(bool on_battery_power) OVERRIDE; + virtual void OnSuspend() OVERRIDE; + virtual void OnResume() OVERRIDE; + + private: + static v8::Handle New(const v8::Arguments &args); + + DISALLOW_COPY_AND_ASSIGN(PowerMonitor); +}; + +} // namespace api + +} // namespace atom + +#endif // ATOM_BROWSER_API_ATOM_API_POWER_MONITOR_H_ diff --git a/browser/api/lib/power-monitor.coffee b/browser/api/lib/power-monitor.coffee new file mode 100644 index 0000000000..72af5c9e93 --- /dev/null +++ b/browser/api/lib/power-monitor.coffee @@ -0,0 +1,7 @@ +bindings = process.atomBinding 'power_monitor' +EventEmitter = require('events').EventEmitter + +PowerMonitor = bindings.PowerMonitor +PowerMonitor::__proto__ = EventEmitter.prototype + +module.exports = new PowerMonitor diff --git a/browser/atom_browser_main_parts.cc b/browser/atom_browser_main_parts.cc index 31fe68f34d..2ee9c08e4e 100644 --- a/browser/atom_browser_main_parts.cc +++ b/browser/atom_browser_main_parts.cc @@ -4,6 +4,7 @@ #include "browser/atom_browser_main_parts.h" +#include "base/power_monitor/power_monitor.h" #include "browser/api/atom_browser_bindings.h" #include "browser/atom_browser_client.h" #include "browser/atom_browser_context.h" @@ -41,6 +42,10 @@ brightray::BrowserContext* AtomBrowserMainParts::CreateBrowserContext() { void AtomBrowserMainParts::PostEarlyInitialization() { brightray::BrowserMainParts::PostEarlyInitialization(); +#if defined(OS_MACOSX) + base::PowerMonitor::AllocateSystemIOPorts(); +#endif + node_bindings_->Initialize(); // Wrap whole process in one global context. diff --git a/common/api/atom_extensions.h b/common/api/atom_extensions.h index 70194150e7..b53cb13e22 100644 --- a/common/api/atom_extensions.h +++ b/common/api/atom_extensions.h @@ -15,6 +15,7 @@ NODE_EXT_LIST_ITEM(atom_browser_crash_reporter) NODE_EXT_LIST_ITEM(atom_browser_dialog) NODE_EXT_LIST_ITEM(atom_browser_ipc) NODE_EXT_LIST_ITEM(atom_browser_menu) +NODE_EXT_LIST_ITEM(atom_browser_power_monitor) NODE_EXT_LIST_ITEM(atom_browser_window) // Module names start with `atom_renderer_` can only be used by renderer