1 // Copyright (c) 2013 Intel Corporation. All rights reserved.
2 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
6 #include "xwalk/sysapps/device_capabilities/display_info_provider.h"
9 #include "base/strings/string_number_conversions.h"
10 #include "base/sys_info.h"
11 #include "ui/gfx/display.h"
12 #include "ui/gfx/screen.h"
14 using xwalk::jsapi::device_capabilities::DisplayUnit;
18 // We are calculating the DPI the same way Chromium for
19 // ChromiumOS. See display_info_provider_chromeos.cc.
20 const float kDpi96 = 96;
22 linked_ptr<DisplayUnit> makeDisplayUnit(const gfx::Display& display) {
23 gfx::Screen* screen = gfx::Screen::GetNativeScreen();
24 const int64 primary_display_id = screen->GetPrimaryDisplay().id();
26 linked_ptr<DisplayUnit> display_unit(new DisplayUnit);
28 display_unit->id = base::Int64ToString(display.id());
29 // FIXME(YuZhiqiangX): find which field reflects 'name'.
30 display_unit->name = "unknown";
32 display_unit->is_primary = (display.id() == primary_display_id);
33 display_unit->is_internal = display.IsInternal();
35 const float dpi = display.device_scale_factor() * kDpi96;
36 display_unit->dpi_x = static_cast<unsigned int>(dpi);
37 display_unit->dpi_y = static_cast<unsigned int>(dpi);
39 display_unit->width = display.bounds().width();
40 display_unit->height = display.bounds().height();
41 display_unit->avail_width = display.work_area_size().width();
42 display_unit->avail_height = display.work_area_size().height();
52 DisplayInfoProvider::DisplayInfoProvider() {}
54 DisplayInfoProvider::~DisplayInfoProvider() {}
57 scoped_ptr<SystemDisplay> DisplayInfoProvider::display_info() {
58 scoped_ptr<SystemDisplay> info(new SystemDisplay);
60 gfx::Screen* screen = gfx::Screen::GetNativeScreen();
61 std::vector<gfx::Display> displays = screen->GetAllDisplays();
63 for (std::vector<gfx::Display>::const_iterator it = displays.begin();
64 it != displays.end(); ++it) {
65 info->displays.push_back(makeDisplayUnit(*it));
71 void DisplayInfoProvider::AddObserver(Observer* observer) {
72 bool should_start_monitoring = false;
73 if (!observer_list_.might_have_observers())
74 should_start_monitoring = true;
76 observer_list_.AddObserver(observer);
78 if (should_start_monitoring)
79 StartDisplayMonitoring();
82 void DisplayInfoProvider::RemoveObserver(Observer* observer) {
83 observer_list_.RemoveObserver(observer);
85 if (!observer_list_.might_have_observers())
86 StopDisplayMonitoring();
89 bool DisplayInfoProvider::HasObserver(Observer* observer) const {
90 return observer_list_.HasObserver(observer);
93 void DisplayInfoProvider::StartDisplayMonitoring() {
94 gfx::Screen* screen = gfx::Screen::GetNativeScreen();
95 screen->AddObserver(this);
98 void DisplayInfoProvider::StopDisplayMonitoring() {
99 gfx::Screen* screen = gfx::Screen::GetNativeScreen();
100 screen->RemoveObserver(this);
103 void DisplayInfoProvider::OnDisplayAdded(const gfx::Display& display) {
104 FOR_EACH_OBSERVER(Observer,
106 OnDisplayConnected(*makeDisplayUnit(display)));
109 void DisplayInfoProvider::OnDisplayRemoved(const gfx::Display& display) {
110 FOR_EACH_OBSERVER(Observer,
112 OnDisplayDisconnected(*makeDisplayUnit(display)));
115 } // namespace sysapps