Pass the display in screen events

This commit is contained in:
Cheng Zhao 2015-01-16 12:02:32 -08:00
parent 7749484628
commit 50b96ca7ef

View file

@ -5,6 +5,7 @@
#include "atom/browser/api/atom_api_screen.h" #include "atom/browser/api/atom_api_screen.h"
#include <algorithm> #include <algorithm>
#include <string>
#include "atom/browser/browser.h" #include "atom/browser/browser.h"
#include "atom/common/native_mate_converters/gfx_converter.h" #include "atom/common/native_mate_converters/gfx_converter.h"
@ -21,6 +22,7 @@ namespace api {
namespace { namespace {
// Find an item in container according to its ID.
template<class T> template<class T>
typename T::iterator FindById(T* container, int id) { typename T::iterator FindById(T* container, int id) {
auto predicate = [id] (const typename T::value_type& item) -> bool { auto predicate = [id] (const typename T::value_type& item) -> bool {
@ -29,6 +31,20 @@ typename T::iterator FindById(T* container, int id) {
return std::find_if(container->begin(), container->end(), predicate); return std::find_if(container->begin(), container->end(), predicate);
} }
// Convert the changed_metrics bitmask to string array.
std::vector<std::string> MetricsToArray(uint32_t metrics) {
std::vector<std::string> array;
if (metrics & gfx::DisplayObserver::DISPLAY_METRIC_BOUNDS)
array.push_back("bounds");
if (metrics & gfx::DisplayObserver::DISPLAY_METRIC_WORK_AREA)
array.push_back("workArea");
if (metrics & gfx::DisplayObserver::DISPLAY_METRIC_DEVICE_SCALE_FACTOR)
array.push_back("scaleFactor");
if (metrics & gfx::DisplayObserver::DISPLAY_METRIC_ROTATION)
array.push_back("rotaion");
return array;
}
} // namespace } // namespace
Screen::Screen(gfx::Screen* screen) : screen_(screen) { Screen::Screen(gfx::Screen* screen) : screen_(screen) {
@ -48,6 +64,9 @@ gfx::Display Screen::GetPrimaryDisplay() {
} }
std::vector<gfx::Display> Screen::GetAllDisplays() { std::vector<gfx::Display> Screen::GetAllDisplays() {
// The Screen::GetAllDisplays doesn't update when there is display added or
// removed, so we have to manually maintain the displays_ to make it up to
// date.
if (displays_.size() == 0) if (displays_.size() == 0)
displays_ = screen_->GetAllDisplays(); displays_ = screen_->GetAllDisplays();
return displays_; return displays_;
@ -63,17 +82,17 @@ gfx::Display Screen::GetDisplayMatching(const gfx::Rect& match_rect) {
void Screen::OnDisplayAdded(const gfx::Display& new_display) { void Screen::OnDisplayAdded(const gfx::Display& new_display) {
displays_.push_back(new_display); displays_.push_back(new_display);
Emit("display-added"); Emit("display-added", new_display);
} }
void Screen::OnDisplayRemoved(const gfx::Display& old_display) { void Screen::OnDisplayRemoved(const gfx::Display& old_display) {
displays_.erase(FindById(&displays_, old_display.id())); displays_.erase(FindById(&displays_, old_display.id()));
Emit("display-removed"); Emit("display-removed", old_display);
} }
void Screen::OnDisplayMetricsChanged(const gfx::Display& display, void Screen::OnDisplayMetricsChanged(const gfx::Display& display,
uint32_t changed_metrics) { uint32_t changed_metrics) {
Emit("display-metrics-changed"); Emit("display-metrics-changed", display, MetricsToArray(changed_metrics));
} }
mate::ObjectTemplateBuilder Screen::GetObjectTemplateBuilder( mate::ObjectTemplateBuilder Screen::GetObjectTemplateBuilder(