d657218379741a5caa61832e0bbbe8cbd0df7d06
[platform/framework/web/crosswalk.git] / src / xwalk / sysapps / device_capabilities / display_info_provider.cc
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.
5
6 #include "xwalk/sysapps/device_capabilities/display_info_provider.h"
7
8 #include <vector>
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"
13
14 using xwalk::jsapi::device_capabilities::DisplayUnit;
15
16 namespace {
17
18 // We are calculating the DPI the same way Chromium for
19 // ChromiumOS. See display_info_provider_chromeos.cc.
20 const float kDpi96 = 96;
21
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();
25
26   linked_ptr<DisplayUnit> display_unit(new DisplayUnit);
27
28   display_unit->id = base::Int64ToString(display.id());
29   // FIXME(YuZhiqiangX): find which field reflects 'name'.
30   display_unit->name = "unknown";
31
32   display_unit->is_primary = (display.id() == primary_display_id);
33   display_unit->is_internal = display.IsInternal();
34
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);
38
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();
43
44   return display_unit;
45 }
46
47 }  // namespace
48
49 namespace xwalk {
50 namespace sysapps {
51
52 DisplayInfoProvider::DisplayInfoProvider() {}
53
54 DisplayInfoProvider::~DisplayInfoProvider() {}
55
56 // static
57 scoped_ptr<SystemDisplay> DisplayInfoProvider::display_info() {
58   scoped_ptr<SystemDisplay> info(new SystemDisplay);
59
60   gfx::Screen* screen = gfx::Screen::GetNativeScreen();
61   std::vector<gfx::Display> displays = screen->GetAllDisplays();
62
63   for (std::vector<gfx::Display>::const_iterator it = displays.begin();
64       it != displays.end(); ++it) {
65     info->displays.push_back(makeDisplayUnit(*it));
66   }
67
68   return info.Pass();
69 }
70
71 void DisplayInfoProvider::AddObserver(Observer* observer) {
72   bool should_start_monitoring = false;
73   if (!observer_list_.might_have_observers())
74     should_start_monitoring = true;
75
76   observer_list_.AddObserver(observer);
77
78   if (should_start_monitoring)
79     StartDisplayMonitoring();
80 }
81
82 void DisplayInfoProvider::RemoveObserver(Observer* observer) {
83   observer_list_.RemoveObserver(observer);
84
85   if (!observer_list_.might_have_observers())
86     StopDisplayMonitoring();
87 }
88
89 bool DisplayInfoProvider::HasObserver(Observer* observer) const {
90   return observer_list_.HasObserver(observer);
91 }
92
93 void DisplayInfoProvider::StartDisplayMonitoring() {
94   gfx::Screen* screen = gfx::Screen::GetNativeScreen();
95   screen->AddObserver(this);
96 }
97
98 void DisplayInfoProvider::StopDisplayMonitoring() {
99   gfx::Screen* screen = gfx::Screen::GetNativeScreen();
100   screen->RemoveObserver(this);
101 }
102
103 void DisplayInfoProvider::OnDisplayAdded(const gfx::Display& display) {
104   FOR_EACH_OBSERVER(Observer,
105                     observer_list_,
106                     OnDisplayConnected(*makeDisplayUnit(display)));
107 }
108
109 void DisplayInfoProvider::OnDisplayRemoved(const gfx::Display& display) {
110   FOR_EACH_OBSERVER(Observer,
111                     observer_list_,
112                     OnDisplayDisconnected(*makeDisplayUnit(display)));
113 }
114
115 }  // namespace sysapps
116 }  // namespace xwalk