| Index: ui/aura/display_change_observer_x11.cc
|
| diff --git a/ui/aura/display_change_observer_x11.cc b/ui/aura/display_change_observer_x11.cc
|
| deleted file mode 100644
|
| index 21dab9c9463536907f646c3eaa833558f9beb501..0000000000000000000000000000000000000000
|
| --- a/ui/aura/display_change_observer_x11.cc
|
| +++ /dev/null
|
| @@ -1,193 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "ui/aura/display_change_observer_x11.h"
|
| -
|
| -#include <algorithm>
|
| -#include <map>
|
| -#include <set>
|
| -#include <vector>
|
| -
|
| -#include <X11/extensions/Xrandr.h>
|
| -
|
| -#include "base/message_pump_aurax11.h"
|
| -#include "ui/aura/env.h"
|
| -#include "ui/aura/display_manager.h"
|
| -#include "ui/base/x/x11_util.h"
|
| -#include "ui/compositor/dip_util.h"
|
| -#include "ui/gfx/display.h"
|
| -
|
| -namespace aura {
|
| -namespace internal {
|
| -
|
| -namespace {
|
| -
|
| -// The DPI threshold to detect high density screen.
|
| -// Higher DPI than this will use device_scale_factor=2.
|
| -// Note: This value has to be kept in sync with the mouse/touchpad driver
|
| -// which controls mouse pointer acceleration. If you need to update this value,
|
| -// please update the bug (crosbug.com/31628) first and make sure that the
|
| -// driver will use the same value.
|
| -// This value also has to be kept in sync with the value in
|
| -// chromeos/display/output_configurator.cc. See crbug.com/130188
|
| -const unsigned int kHighDensityDIPThreshold = 160;
|
| -
|
| -// 1 inch in mm.
|
| -const float kInchInMm = 25.4f;
|
| -
|
| -XRRModeInfo* FindMode(XRRScreenResources* screen_resources, XID current_mode) {
|
| - for (int m = 0; m < screen_resources->nmode; m++) {
|
| - XRRModeInfo *mode = &screen_resources->modes[m];
|
| - if (mode->id == current_mode)
|
| - return mode;
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -bool CompareDisplayY(const gfx::Display& lhs, const gfx::Display& rhs) {
|
| - return lhs.bounds_in_pixel().y() < rhs.bounds_in_pixel().y();
|
| -}
|
| -
|
| -// A list of bogus sizes in mm that X detects and should be ignored.
|
| -// See crbug.com/136533.
|
| -const unsigned long kInvalidDisplaySizeList[][2] = {
|
| - {160, 100},
|
| - {160, 90},
|
| - {50, 40},
|
| - {40, 30},
|
| -};
|
| -
|
| -// Returns true if the size nifo in the output_info isn't valid
|
| -// and should be ignored.
|
| -bool ShouldIgnoreSize(XRROutputInfo *output_info) {
|
| - if (output_info->mm_width == 0 || output_info->mm_height == 0) {
|
| - LOG(WARNING) << "No display size available";
|
| - return true;
|
| - }
|
| - for (unsigned long i = 0 ; i < arraysize(kInvalidDisplaySizeList); ++i) {
|
| - const unsigned long* size = kInvalidDisplaySizeList[i];
|
| - if (output_info->mm_width == size[0] && output_info->mm_height == size[1]) {
|
| - LOG(WARNING) << "Black listed display size detected:"
|
| - << size[0] << "x" << size[1];
|
| - return true;
|
| - }
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -DisplayChangeObserverX11::DisplayChangeObserverX11()
|
| - : xdisplay_(base::MessagePumpAuraX11::GetDefaultXDisplay()),
|
| - x_root_window_(DefaultRootWindow(xdisplay_)),
|
| - xrandr_event_base_(0) {
|
| - int error_base_ignored;
|
| - XRRQueryExtension(xdisplay_, &xrandr_event_base_, &error_base_ignored);
|
| - base::MessagePumpAuraX11::Current()->AddDispatcherForRootWindow(this);
|
| -}
|
| -
|
| -DisplayChangeObserverX11::~DisplayChangeObserverX11() {
|
| - base::MessagePumpAuraX11::Current()->RemoveDispatcherForRootWindow(this);
|
| -}
|
| -
|
| -bool DisplayChangeObserverX11::Dispatch(const base::NativeEvent& event) {
|
| - if (event->type - xrandr_event_base_ == RRScreenChangeNotify) {
|
| - NotifyDisplayChange();
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -void DisplayChangeObserverX11::NotifyDisplayChange() {
|
| - if (!DisplayManager::use_fullscreen_host_window())
|
| - return; // Use the default display that display manager determined.
|
| -
|
| - XRRScreenResources* screen_resources =
|
| - XRRGetScreenResources(xdisplay_, x_root_window_);
|
| - std::map<XID, XRRCrtcInfo*> crtc_info_map;
|
| -
|
| - for (int c = 0; c < screen_resources->ncrtc; c++) {
|
| - XID crtc_id = screen_resources->crtcs[c];
|
| - XRRCrtcInfo *crtc_info =
|
| - XRRGetCrtcInfo(xdisplay_, screen_resources, crtc_id);
|
| - crtc_info_map[crtc_id] = crtc_info;
|
| - }
|
| -
|
| - std::vector<gfx::Display> displays;
|
| - std::set<int> y_coords;
|
| - std::set<int64> ids;
|
| - for (int o = 0; o < screen_resources->noutput; o++) {
|
| - XRROutputInfo *output_info =
|
| - XRRGetOutputInfo(xdisplay_,
|
| - screen_resources,
|
| - screen_resources->outputs[o]);
|
| - if (output_info->connection != RR_Connected) {
|
| - XRRFreeOutputInfo(output_info);
|
| - continue;
|
| - }
|
| - XRRCrtcInfo* crtc_info = crtc_info_map[output_info->crtc];
|
| - if (!crtc_info) {
|
| - LOG(WARNING) << "Crtc not found for output: output=" << o;
|
| - continue;
|
| - }
|
| - XRRModeInfo* mode = FindMode(screen_resources, crtc_info->mode);
|
| - if (!mode) {
|
| - LOG(WARNING) << "Could not find a mode for the output: output=" << o;
|
| - continue;
|
| - }
|
| - // 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) &&
|
| - (kInchInMm * mode->width / output_info->mm_width) >
|
| - kHighDensityDIPThreshold) {
|
| - device_scale_factor = 2.0f;
|
| - }
|
| - displays.back().SetScaleAndBounds(
|
| - device_scale_factor,
|
| - gfx::Rect(crtc_info->x, crtc_info->y, mode->width, mode->height));
|
| -
|
| - uint16 manufacturer_id = 0;
|
| - uint32 serial_number = 0;
|
| - if (ui::GetOutputDeviceData(screen_resources->outputs[o], &manufacturer_id,
|
| - &serial_number, 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, serial_number);
|
| - if (ids.find(new_id) == ids.end()) {
|
| - displays.back().set_id(new_id);
|
| - ids.insert(new_id);
|
| - }
|
| - }
|
| -
|
| - y_coords.insert(crtc_info->y);
|
| - XRRFreeOutputInfo(output_info);
|
| - }
|
| -
|
| - // Free all allocated resources.
|
| - for (std::map<XID, XRRCrtcInfo*>::const_iterator iter = crtc_info_map.begin();
|
| - iter != crtc_info_map.end(); ++iter) {
|
| - XRRFreeCrtcInfo(iter->second);
|
| - }
|
| - XRRFreeScreenResources(screen_resources);
|
| -
|
| - // 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;
|
| - }
|
| - }
|
| -
|
| - Env::GetInstance()->display_manager()->OnNativeDisplaysChanged(displays);
|
| -}
|
| -
|
| -} // namespace internal
|
| -} // namespace aura
|
|
|