diff options
Diffstat (limited to 'ash/display/display_change_observer_x11.cc')
-rw-r--r-- | ash/display/display_change_observer_x11.cc | 65 |
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); } |