Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: ui/aura/display_change_observer_x11.cc

Issue 10826198: Use persistent ID/names for displays. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: kInvalidID -> kInvalidDisplayID since Mac #define "kInvalidID"... Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ash/display/multi_display_manager.cc ('k') | ui/aura/display_manager.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/aura/display_change_observer_x11.h" 5 #include "ui/aura/display_change_observer_x11.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 #include <set> 9 #include <set>
10 #include <vector> 10 #include <vector>
11 11
12 #include <X11/extensions/Xrandr.h> 12 #include <X11/extensions/Xrandr.h>
13 13
14 #include "base/message_pump_aurax11.h" 14 #include "base/message_pump_aurax11.h"
15 #include "ui/aura/dispatcher_linux.h" 15 #include "ui/aura/dispatcher_linux.h"
16 #include "ui/aura/env.h" 16 #include "ui/aura/env.h"
17 #include "ui/aura/display_manager.h" 17 #include "ui/aura/display_manager.h"
18 #include "ui/base/x/x11_util.h"
18 #include "ui/compositor/dip_util.h" 19 #include "ui/compositor/dip_util.h"
19 #include "ui/gfx/display.h" 20 #include "ui/gfx/display.h"
20 21
21 namespace aura { 22 namespace aura {
22 namespace internal { 23 namespace internal {
23 24
24 namespace { 25 namespace {
25 26
26 // The DPI threshold to detect high density screen. 27 // The DPI threshold to detect high density screen.
27 // Higher DPI than this will use device_scale_factor=2. 28 // Higher DPI than this will use device_scale_factor=2.
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 111
111 for (int c = 0; c < screen_resources->ncrtc; c++) { 112 for (int c = 0; c < screen_resources->ncrtc; c++) {
112 XID crtc_id = screen_resources->crtcs[c]; 113 XID crtc_id = screen_resources->crtcs[c];
113 XRRCrtcInfo *crtc_info = 114 XRRCrtcInfo *crtc_info =
114 XRRGetCrtcInfo(xdisplay_, screen_resources, crtc_id); 115 XRRGetCrtcInfo(xdisplay_, screen_resources, crtc_id);
115 crtc_info_map[crtc_id] = crtc_info; 116 crtc_info_map[crtc_id] = crtc_info;
116 } 117 }
117 118
118 std::vector<gfx::Display> displays; 119 std::vector<gfx::Display> displays;
119 std::set<int> y_coords; 120 std::set<int> y_coords;
121 std::set<int64> ids;
120 for (int o = 0; o < screen_resources->noutput; o++) { 122 for (int o = 0; o < screen_resources->noutput; o++) {
121 XRROutputInfo *output_info = 123 XRROutputInfo *output_info =
122 XRRGetOutputInfo(xdisplay_, 124 XRRGetOutputInfo(xdisplay_,
123 screen_resources, 125 screen_resources,
124 screen_resources->outputs[o]); 126 screen_resources->outputs[o]);
125 if (output_info->connection != RR_Connected) { 127 if (output_info->connection != RR_Connected) {
126 XRRFreeOutputInfo(output_info); 128 XRRFreeOutputInfo(output_info);
127 continue; 129 continue;
128 } 130 }
129 XRRCrtcInfo* crtc_info = crtc_info_map[output_info->crtc]; 131 XRRCrtcInfo* crtc_info = crtc_info_map[output_info->crtc];
(...skipping 13 matching lines...) Expand all
143 displays.push_back(gfx::Display( 145 displays.push_back(gfx::Display(
144 0, 146 0,
145 gfx::Rect(crtc_info->x, crtc_info->y, mode->width, mode->height))); 147 gfx::Rect(crtc_info->x, crtc_info->y, mode->width, mode->height)));
146 148
147 float device_scale_factor = 1.0f; 149 float device_scale_factor = 1.0f;
148 if (!ShouldIgnoreSize(output_info) && 150 if (!ShouldIgnoreSize(output_info) &&
149 (kInchInMm * mode->width / output_info->mm_width) > 151 (kInchInMm * mode->width / output_info->mm_width) >
150 kHighDensityDIPThreshold) { 152 kHighDensityDIPThreshold) {
151 device_scale_factor = 2.0f; 153 device_scale_factor = 2.0f;
152 } 154 }
155
156 uint16 manufacturer_id = 0;
157 uint32 serial_number = 0;
158 if (ui::GetOutputDeviceData(screen_resources->outputs[o], &manufacturer_id,
159 &serial_number, NULL) && manufacturer_id != 0) {
160 // An ID based on display's index will be assigned later if this call
161 // fails.
162 int64 new_id = gfx::Display::GetID(manufacturer_id, serial_number);
163 if (ids.find(new_id) == ids.end()) {
164 displays.back().set_id(new_id);
165 ids.insert(new_id);
166 }
167 }
168
153 displays.back().set_device_scale_factor(device_scale_factor); 169 displays.back().set_device_scale_factor(device_scale_factor);
154 y_coords.insert(crtc_info->y); 170 y_coords.insert(crtc_info->y);
155 XRRFreeOutputInfo(output_info); 171 XRRFreeOutputInfo(output_info);
156 } 172 }
157 173
158 // Free all allocated resources. 174 // Free all allocated resources.
159 for (std::map<XID, XRRCrtcInfo*>::const_iterator iter = crtc_info_map.begin(); 175 for (std::map<XID, XRRCrtcInfo*>::const_iterator iter = crtc_info_map.begin();
160 iter != crtc_info_map.end(); ++iter) { 176 iter != crtc_info_map.end(); ++iter) {
161 XRRFreeCrtcInfo(iter->second); 177 XRRFreeCrtcInfo(iter->second);
162 } 178 }
163 XRRFreeScreenResources(screen_resources); 179 XRRFreeScreenResources(screen_resources);
164 180
165 // PowerManager lays out the outputs vertically. Sort them by Y 181 // PowerManager lays out the outputs vertically. Sort them by Y
166 // coordinates. 182 // coordinates.
167 std::sort(displays.begin(), displays.end(), CompareDisplayY); 183 std::sort(displays.begin(), displays.end(), CompareDisplayY);
168 // TODO(oshima): Assisgn index as ID for now. Use unique ID.
169 int id = 0; 184 int id = 0;
170 for (std::vector<gfx::Display>::iterator iter = displays.begin(); 185 for (std::vector<gfx::Display>::iterator iter = displays.begin();
171 iter != displays.end(); ++iter, ++id) 186 iter != displays.end(); ++iter) {
172 (*iter).set_id(id); 187 if (iter->id() == gfx::Display::kInvalidDisplayID) {
188 iter->set_id(id);
189 ++id;
190 }
191 }
173 192
174 Env::GetInstance()->display_manager()->OnNativeDisplaysChanged(displays); 193 Env::GetInstance()->display_manager()->OnNativeDisplaysChanged(displays);
175 } 194 }
176 195
177 } // namespace internal 196 } // namespace internal
178 } // namespace aura 197 } // namespace aura
OLDNEW
« no previous file with comments | « ash/display/multi_display_manager.cc ('k') | ui/aura/display_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698