summaryrefslogtreecommitdiffstats
path: root/ash/display/display_change_observer_x11.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ash/display/display_change_observer_x11.cc')
-rw-r--r--ash/display/display_change_observer_x11.cc65
1 files changed, 23 insertions, 42 deletions
diff --git a/ash/display/display_change_observer_x11.cc b/ash/display/display_change_observer_x11.cc
index d4d7c4e..b7114ce 100644
--- a/ash/display/display_change_observer_x11.cc
+++ b/ash/display/display_change_observer_x11.cc
@@ -11,12 +11,9 @@
#include <X11/extensions/Xrandr.h>
-#include "ash/display/display_info.h"
#include "ash/display/display_manager.h"
#include "ash/shell.h"
#include "base/message_pump_aurax11.h"
-#include "grit/ash_strings.h"
-#include "ui/base/l10n/l10n_util.h"
#include "ui/base/x/x11_util.h"
#include "ui/compositor/dip_util.h"
#include "ui/gfx/display.h"
@@ -48,7 +45,7 @@ XRRModeInfo* FindMode(XRRScreenResources* screen_resources, XID current_mode) {
return NULL;
}
-bool CompareDisplayY(const DisplayInfo& lhs, const DisplayInfo& rhs) {
+bool CompareDisplayY(const gfx::Display& lhs, const gfx::Display& rhs) {
return lhs.bounds_in_pixel().y() < rhs.bounds_in_pixel().y();
}
@@ -79,12 +76,6 @@ bool ShouldIgnoreSize(XRROutputInfo *output_info) {
return false;
}
-std::string GetDisplayName(XID output_id) {
- std::string display_name;
- ui::GetOutputDeviceData(output_id, NULL, NULL, &display_name);
- return display_name;
-}
-
} // namespace
DisplayChangeObserverX11::DisplayChangeObserverX11()
@@ -110,14 +101,15 @@ void DisplayChangeObserverX11::OnDisplayModeChanged() {
crtc_info_map[crtc_id] = crtc_info;
}
- std::vector<DisplayInfo> displays;
+ std::vector<gfx::Display> displays;
std::set<int> y_coords;
std::set<int64> ids;
for (int output_index = 0; output_index < screen_resources->noutput;
output_index++) {
- XID output = screen_resources->outputs[output_index];
XRROutputInfo *output_info =
- XRRGetOutputInfo(xdisplay_, screen_resources, output);
+ XRRGetOutputInfo(xdisplay_,
+ screen_resources,
+ screen_resources->outputs[output_index]);
if (output_info->connection != RR_Connected) {
XRRFreeOutputInfo(output_info);
continue;
@@ -137,6 +129,7 @@ void DisplayChangeObserverX11::OnDisplayModeChanged() {
// Mirrored monitors have the same y coordinates.
if (y_coords.find(crtc_info->y) != y_coords.end())
continue;
+ displays.push_back(gfx::Display());
float device_scale_factor = 1.0f;
if (!ShouldIgnoreSize(output_info) &&
@@ -144,43 +137,24 @@ void DisplayChangeObserverX11::OnDisplayModeChanged() {
kHighDensityDPIThreshold) {
device_scale_factor = 2.0f;
}
- gfx::Rect display_bounds(
- crtc_info->x, crtc_info->y, mode->width, mode->height);
-
- XRRFreeOutputInfo(output_info);
- bool is_internal = chromeos::OutputConfigurator::IsInternalOutputName(
- std::string(output_info->name));
-
- std::string name = is_internal ?
- l10n_util::GetStringUTF8(IDS_ASH_INTERNAL_DISPLAY_NAME) :
- GetDisplayName(output);
- if (name.empty())
- name = l10n_util::GetStringUTF8(IDS_ASH_STATUS_TRAY_UNKNOWN_DISPLAY_NAME);
-
- bool has_overscan;
- ui::GetOutputOverscanFlag(output, &has_overscan);
+ displays.back().SetScaleAndBounds(
+ device_scale_factor,
+ gfx::Rect(crtc_info->x, crtc_info->y, mode->width, mode->height));
uint16 manufacturer_id = 0;
uint16 product_code = 0;
- int64 id = gfx::Display::kInvalidDisplayID;
-
- if (ui::GetOutputDeviceData(
- output, &manufacturer_id, &product_code, NULL) &&
+ if (ui::GetOutputDeviceData(screen_resources->outputs[output_index],
+ &manufacturer_id, &product_code, NULL) &&
manufacturer_id != 0) {
// An ID based on display's index will be assigned later if this call
// fails.
int64 new_id = gfx::Display::GetID(
manufacturer_id, product_code, output_index);
- if (ids.find(new_id) == ids.end())
- id = new_id;
+ if (ids.find(new_id) == ids.end()) {
+ displays.back().set_id(new_id);
+ ids.insert(new_id);
+ }
}
- if (id == gfx::Display::kInvalidDisplayID)
- id = output_index;
- ids.insert(id);
-
- displays.push_back(DisplayInfo(id, name, has_overscan));
- displays.back().set_device_scale_factor(device_scale_factor);
- displays.back().SetBounds(display_bounds);
y_coords.insert(crtc_info->y);
XRRFreeOutputInfo(output_info);
@@ -196,7 +170,14 @@ void DisplayChangeObserverX11::OnDisplayModeChanged() {
// PowerManager lays out the outputs vertically. Sort them by Y
// coordinates.
std::sort(displays.begin(), displays.end(), CompareDisplayY);
-
+ int64 id = 0;
+ for (std::vector<gfx::Display>::iterator iter = displays.begin();
+ iter != displays.end(); ++iter) {
+ if (iter->id() == gfx::Display::kInvalidDisplayID) {
+ iter->set_id(id);
+ ++id;
+ }
+ }
// DisplayManager can be null during the boot.
Shell::GetInstance()->display_manager()->OnNativeDisplaysChanged(displays);
}