| OLD | NEW |
| 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 "ash/display/display_change_observer_x11.h" | 5 #include "ash/display/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 "ash/display/display_controller.h" | 14 #include "ash/display/display_controller.h" |
| 15 #include "ash/display/display_info.h" | 15 #include "ash/display/display_info.h" |
| 16 #include "ash/display/display_manager.h" | 16 #include "ash/display/display_manager.h" |
| 17 #include "ash/shell.h" | 17 #include "ash/shell.h" |
| 18 #include "base/message_pump_aurax11.h" | 18 #include "base/message_pump_aurax11.h" |
| 19 #include "chromeos/display/output_util.h" |
| 19 #include "grit/ash_strings.h" | 20 #include "grit/ash_strings.h" |
| 20 #include "ui/base/l10n/l10n_util.h" | 21 #include "ui/base/l10n/l10n_util.h" |
| 21 #include "ui/base/x/x11_util.h" | |
| 22 #include "ui/compositor/dip_util.h" | 22 #include "ui/compositor/dip_util.h" |
| 23 #include "ui/gfx/display.h" | 23 #include "ui/gfx/display.h" |
| 24 | 24 |
| 25 namespace ash { | 25 namespace ash { |
| 26 namespace internal { | 26 namespace internal { |
| 27 | 27 |
| 28 namespace { | 28 namespace { |
| 29 | 29 |
| 30 // The DPI threshold to detect high density screen. | 30 // The DPI threshold to detect high density screen. |
| 31 // Higher DPI than this will use device_scale_factor=2. | 31 // Higher DPI than this will use device_scale_factor=2. |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 const unsigned long* size = kInvalidDisplaySizeList[i]; | 69 const unsigned long* size = kInvalidDisplaySizeList[i]; |
| 70 if (output_info->mm_width == size[0] && output_info->mm_height == size[1]) { | 70 if (output_info->mm_width == size[0] && output_info->mm_height == size[1]) { |
| 71 LOG(WARNING) << "Black listed display size detected:" | 71 LOG(WARNING) << "Black listed display size detected:" |
| 72 << size[0] << "x" << size[1]; | 72 << size[0] << "x" << size[1]; |
| 73 return true; | 73 return true; |
| 74 } | 74 } |
| 75 } | 75 } |
| 76 return false; | 76 return false; |
| 77 } | 77 } |
| 78 | 78 |
| 79 std::string GetDisplayName(XID output_id) { | 79 int64 GetDisplayId(XID output, size_t output_index) { |
| 80 std::string display_name; | 80 int64 display_id; |
| 81 ui::GetOutputDeviceData(output_id, NULL, NULL, &display_name); | 81 if (chromeos::GetDisplayId(output, output_index, &display_id)) |
| 82 return display_name; | 82 return display_id; |
| 83 } | |
| 84 | |
| 85 int64 GetDisplayId(XID output_id, int output_index) { | |
| 86 uint16 manufacturer_id = 0; | |
| 87 uint16 product_code = 0; | |
| 88 if (ui::GetOutputDeviceData( | |
| 89 output_id, &manufacturer_id, &product_code, NULL) && | |
| 90 manufacturer_id != 0) { | |
| 91 // An ID based on display's index will be assigned later if this call | |
| 92 // fails. | |
| 93 return gfx::Display::GetID(manufacturer_id, product_code, output_index); | |
| 94 } | |
| 95 return gfx::Display::kInvalidDisplayID; | 83 return gfx::Display::kInvalidDisplayID; |
| 96 } | 84 } |
| 97 | 85 |
| 98 } // namespace | 86 } // namespace |
| 99 | 87 |
| 100 DisplayChangeObserverX11::DisplayChangeObserverX11() | 88 DisplayChangeObserverX11::DisplayChangeObserverX11() |
| 101 : xdisplay_(base::MessagePumpAuraX11::GetDefaultXDisplay()), | 89 : xdisplay_(base::MessagePumpAuraX11::GetDefaultXDisplay()), |
| 102 x_root_window_(DefaultRootWindow(xdisplay_)), | 90 x_root_window_(DefaultRootWindow(xdisplay_)), |
| 103 xrandr_event_base_(0) { | 91 xrandr_event_base_(0) { |
| 104 int error_base_ignored; | 92 int error_base_ignored; |
| 105 XRRQueryExtension(xdisplay_, &xrandr_event_base_, &error_base_ignored); | 93 XRRQueryExtension(xdisplay_, &xrandr_event_base_, &error_base_ignored); |
| 106 | 94 |
| 107 // Find internal display. | 95 // Find internal display. |
| 108 XRRScreenResources* screen_resources = | 96 XRRScreenResources* screen_resources = |
| 109 XRRGetScreenResources(xdisplay_, x_root_window_); | 97 XRRGetScreenResources(xdisplay_, x_root_window_); |
| 110 for (int output_index = 0; output_index < screen_resources->noutput; | 98 for (int output_index = 0; output_index < screen_resources->noutput; |
| 111 output_index++) { | 99 output_index++) { |
| 112 XID output = screen_resources->outputs[output_index]; | 100 XID output = screen_resources->outputs[output_index]; |
| 113 XRROutputInfo *output_info = | 101 XRROutputInfo *output_info = |
| 114 XRRGetOutputInfo(xdisplay_, screen_resources, output); | 102 XRRGetOutputInfo(xdisplay_, screen_resources, output); |
| 115 bool is_internal = chromeos::OutputConfigurator::IsInternalOutputName( | 103 bool is_internal = chromeos::IsInternalOutputName( |
| 116 std::string(output_info->name)); | 104 std::string(output_info->name)); |
| 117 XRRFreeOutputInfo(output_info); | 105 XRRFreeOutputInfo(output_info); |
| 118 if (is_internal) { | 106 if (is_internal) { |
| 119 int64 id = GetDisplayId(output, output_index); | 107 int64 id = GetDisplayId(output, output_index); |
| 120 // Fallback to output index. crbug.com/180100 | 108 // Fallback to output index. crbug.com/180100 |
| 121 gfx::Display::SetInternalDisplayId( | 109 gfx::Display::SetInternalDisplayId( |
| 122 id == gfx::Display::kInvalidDisplayID ? output_index : id); | 110 id == gfx::Display::kInvalidDisplayID ? output_index : id); |
| 123 break; | 111 break; |
| 124 } | 112 } |
| 125 } | 113 } |
| 126 XRRFreeScreenResources(screen_resources); | 114 XRRFreeScreenResources(screen_resources); |
| 127 Shell::GetInstance()->AddShellObserver(this); | 115 Shell::GetInstance()->AddShellObserver(this); |
| 128 } | 116 } |
| 129 | 117 |
| 130 DisplayChangeObserverX11::~DisplayChangeObserverX11() { | 118 DisplayChangeObserverX11::~DisplayChangeObserverX11() { |
| 131 Shell::GetInstance()->RemoveShellObserver(this); | 119 Shell::GetInstance()->RemoveShellObserver(this); |
| 132 } | 120 } |
| 133 | 121 |
| 134 chromeos::OutputState DisplayChangeObserverX11::GetStateForOutputs( | 122 chromeos::OutputState DisplayChangeObserverX11::GetStateForDisplayIds( |
| 135 const chromeos::OutputSnapshotList& outputs) const { | 123 const std::vector<int64>& display_ids) const { |
| 136 CHECK(outputs.size() == 2); | 124 CHECK_EQ(2U, display_ids.size()); |
| 137 DisplayIdPair pair = std::make_pair( | 125 DisplayIdPair pair = std::make_pair(display_ids[0], display_ids[1]); |
| 138 GetDisplayId(outputs[0].output, outputs[0].index), | |
| 139 GetDisplayId(outputs[1].output, outputs[1].index)); | |
| 140 DisplayLayout layout = Shell::GetInstance()->display_controller()-> | 126 DisplayLayout layout = Shell::GetInstance()->display_controller()-> |
| 141 GetRegisteredDisplayLayout(pair); | 127 GetRegisteredDisplayLayout(pair); |
| 142 return layout.mirrored ? | 128 return layout.mirrored ? |
| 143 chromeos::STATE_DUAL_MIRROR : chromeos::STATE_DUAL_EXTENDED; | 129 chromeos::STATE_DUAL_MIRROR : chromeos::STATE_DUAL_EXTENDED; |
| 144 } | 130 } |
| 145 | 131 |
| 146 void DisplayChangeObserverX11::OnDisplayModeChanged() { | 132 void DisplayChangeObserverX11::OnDisplayModeChanged() { |
| 147 XRRScreenResources* screen_resources = | 133 XRRScreenResources* screen_resources = |
| 148 XRRGetScreenResources(xdisplay_, x_root_window_); | 134 XRRGetScreenResources(xdisplay_, x_root_window_); |
| 149 std::map<XID, XRRCrtcInfo*> crtc_info_map; | 135 std::map<XID, XRRCrtcInfo*> crtc_info_map; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 | 167 |
| 182 float device_scale_factor = 1.0f; | 168 float device_scale_factor = 1.0f; |
| 183 if (!ShouldIgnoreSize(output_info) && | 169 if (!ShouldIgnoreSize(output_info) && |
| 184 (kInchInMm * mode->width / output_info->mm_width) > | 170 (kInchInMm * mode->width / output_info->mm_width) > |
| 185 kHighDensityDPIThreshold) { | 171 kHighDensityDPIThreshold) { |
| 186 device_scale_factor = 2.0f; | 172 device_scale_factor = 2.0f; |
| 187 } | 173 } |
| 188 gfx::Rect display_bounds( | 174 gfx::Rect display_bounds( |
| 189 crtc_info->x, crtc_info->y, mode->width, mode->height); | 175 crtc_info->x, crtc_info->y, mode->width, mode->height); |
| 190 | 176 |
| 191 bool is_internal = chromeos::OutputConfigurator::IsInternalOutputName( | 177 bool is_internal = chromeos::IsInternalOutputName( |
| 192 std::string(output_info->name)); | 178 std::string(output_info->name)); |
| 193 XRRFreeOutputInfo(output_info); | 179 XRRFreeOutputInfo(output_info); |
| 194 | 180 |
| 195 std::string name = is_internal ? | 181 std::string name = is_internal ? |
| 196 l10n_util::GetStringUTF8(IDS_ASH_INTERNAL_DISPLAY_NAME) : | 182 l10n_util::GetStringUTF8(IDS_ASH_INTERNAL_DISPLAY_NAME) : |
| 197 GetDisplayName(output); | 183 chromeos::GetDisplayName(output); |
| 198 if (name.empty()) | 184 if (name.empty()) |
| 199 name = l10n_util::GetStringUTF8(IDS_ASH_STATUS_TRAY_UNKNOWN_DISPLAY_NAME); | 185 name = l10n_util::GetStringUTF8(IDS_ASH_STATUS_TRAY_UNKNOWN_DISPLAY_NAME); |
| 200 | 186 |
| 201 bool has_overscan = false; | 187 bool has_overscan = false; |
| 202 ui::GetOutputOverscanFlag(output, &has_overscan); | 188 chromeos::GetOutputOverscanFlag(output, &has_overscan); |
| 203 | 189 |
| 204 int64 id = GetDisplayId(output, output_index); | 190 int64 id = GetDisplayId(output, output_index); |
| 205 | 191 |
| 206 // If ID is invalid or there is an duplicate, just use output index. | 192 // If ID is invalid or there is an duplicate, just use output index. |
| 207 if (id == gfx::Display::kInvalidDisplayID || ids.find(id) != ids.end()) | 193 if (id == gfx::Display::kInvalidDisplayID || ids.find(id) != ids.end()) |
| 208 id = output_index; | 194 id = output_index; |
| 209 ids.insert(id); | 195 ids.insert(id); |
| 210 | 196 |
| 211 displays.push_back(DisplayInfo(id, name, has_overscan)); | 197 displays.push_back(DisplayInfo(id, name, has_overscan)); |
| 212 displays.back().set_device_scale_factor(device_scale_factor); | 198 displays.back().set_device_scale_factor(device_scale_factor); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 228 void DisplayChangeObserverX11::OnAppTerminating() { | 214 void DisplayChangeObserverX11::OnAppTerminating() { |
| 229 #if defined(USE_ASH) | 215 #if defined(USE_ASH) |
| 230 // Stop handling display configuration events once the shutdown | 216 // Stop handling display configuration events once the shutdown |
| 231 // process starts. crbug.com/177014. | 217 // process starts. crbug.com/177014. |
| 232 Shell::GetInstance()->output_configurator()->Stop(); | 218 Shell::GetInstance()->output_configurator()->Stop(); |
| 233 #endif | 219 #endif |
| 234 } | 220 } |
| 235 | 221 |
| 236 } // namespace internal | 222 } // namespace internal |
| 237 } // namespace ash | 223 } // namespace ash |
| OLD | NEW |