| Index: ui/display/chromeos/x11/native_display_delegate_x11.cc
 | 
| diff --git a/ui/display/chromeos/x11/native_display_delegate_x11.cc b/ui/display/chromeos/x11/native_display_delegate_x11.cc
 | 
| deleted file mode 100644
 | 
| index 3cbfe69eb377ca1d5c58dbe91796162f7ccdb8c8..0000000000000000000000000000000000000000
 | 
| --- a/ui/display/chromeos/x11/native_display_delegate_x11.cc
 | 
| +++ /dev/null
 | 
| @@ -1,664 +0,0 @@
 | 
| -// Copyright 2014 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/display/chromeos/x11/native_display_delegate_x11.h"
 | 
| -
 | 
| -#include <X11/Xatom.h>
 | 
| -#include <X11/Xlib.h>
 | 
| -#include <X11/extensions/dpms.h>
 | 
| -#include <X11/extensions/Xrandr.h>
 | 
| -#include <X11/extensions/XInput2.h>
 | 
| -
 | 
| -#include <utility>
 | 
| -
 | 
| -#include "base/logging.h"
 | 
| -#include "base/macros.h"
 | 
| -#include "base/memory/ptr_util.h"
 | 
| -#include "ui/display/chromeos/x11/display_mode_x11.h"
 | 
| -#include "ui/display/chromeos/x11/display_snapshot_x11.h"
 | 
| -#include "ui/display/chromeos/x11/display_util_x11.h"
 | 
| -#include "ui/display/chromeos/x11/native_display_event_dispatcher_x11.h"
 | 
| -#include "ui/display/types/native_display_observer.h"
 | 
| -#include "ui/display/util/x11/edid_parser_x11.h"
 | 
| -#include "ui/events/platform/platform_event_source.h"
 | 
| -#include "ui/gfx/geometry/rect.h"
 | 
| -#include "ui/gfx/x/x11_error_tracker.h"
 | 
| -#include "ui/gfx/x/x11_types.h"
 | 
| -
 | 
| -namespace ui {
 | 
| -
 | 
| -namespace {
 | 
| -
 | 
| -// DPI measurements.
 | 
| -const float kMmInInch = 25.4;
 | 
| -const float kDpi96 = 96.0;
 | 
| -const float kPixelsToMmScale = kMmInInch / kDpi96;
 | 
| -
 | 
| -const char kContentProtectionAtomName[] = "Content Protection";
 | 
| -const char kProtectionUndesiredAtomName[] = "Undesired";
 | 
| -const char kProtectionDesiredAtomName[] = "Desired";
 | 
| -const char kProtectionEnabledAtomName[] = "Enabled";
 | 
| -
 | 
| -RRMode GetOutputNativeMode(const XRROutputInfo* output_info) {
 | 
| -  return output_info->nmode > 0 ? output_info->modes[0] : None;
 | 
| -}
 | 
| -
 | 
| -XRRCrtcGamma* ResampleGammaRamp(XRRCrtcGamma* gamma_ramp, int gamma_ramp_size) {
 | 
| -  if (gamma_ramp->size == gamma_ramp_size)
 | 
| -    return gamma_ramp;
 | 
| -
 | 
| -#define RESAMPLE(array, i, r) \
 | 
| -  array[i] + (array[i + 1] - array[i]) * r / gamma_ramp_size
 | 
| -
 | 
| -  XRRCrtcGamma* resampled = XRRAllocGamma(gamma_ramp_size);
 | 
| -  for (int i = 0; i < gamma_ramp_size; ++i) {
 | 
| -    int base_index = gamma_ramp->size * i / gamma_ramp_size;
 | 
| -    int remaining = gamma_ramp->size * i % gamma_ramp_size;
 | 
| -    if (base_index < gamma_ramp->size - 1) {
 | 
| -      resampled->red[i] = RESAMPLE(gamma_ramp->red, base_index, remaining);
 | 
| -      resampled->green[i] = RESAMPLE(gamma_ramp->green, base_index, remaining);
 | 
| -      resampled->blue[i] = RESAMPLE(gamma_ramp->blue, base_index, remaining);
 | 
| -    } else {
 | 
| -      resampled->red[i] = gamma_ramp->red[gamma_ramp->size - 1];
 | 
| -      resampled->green[i] = gamma_ramp->green[gamma_ramp->size - 1];
 | 
| -      resampled->blue[i] = gamma_ramp->blue[gamma_ramp->size - 1];
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -#undef RESAMPLE
 | 
| -  XRRFreeGamma(gamma_ramp);
 | 
| -  return resampled;
 | 
| -}
 | 
| -
 | 
| -}  // namespace
 | 
| -
 | 
| -////////////////////////////////////////////////////////////////////////////////
 | 
| -// NativeDisplayDelegateX11::HelperDelegateX11
 | 
| -
 | 
| -class NativeDisplayDelegateX11::HelperDelegateX11
 | 
| -    : public NativeDisplayDelegateX11::HelperDelegate {
 | 
| - public:
 | 
| -  HelperDelegateX11(NativeDisplayDelegateX11* delegate) : delegate_(delegate) {}
 | 
| -  ~HelperDelegateX11() override {}
 | 
| -
 | 
| -  // NativeDisplayDelegateX11::HelperDelegate overrides:
 | 
| -  void UpdateXRandRConfiguration(const base::NativeEvent& event) override {
 | 
| -    XRRUpdateConfiguration(event);
 | 
| -  }
 | 
| -  const std::vector<DisplaySnapshot*>& GetCachedDisplays() const override {
 | 
| -    return delegate_->cached_outputs_.get();
 | 
| -  }
 | 
| -  void NotifyDisplayObservers() override {
 | 
| -    for (NativeDisplayObserver& observer : delegate_->observers_)
 | 
| -      observer.OnConfigurationChanged();
 | 
| -  }
 | 
| -
 | 
| - private:
 | 
| -  NativeDisplayDelegateX11* delegate_;
 | 
| -
 | 
| -  DISALLOW_COPY_AND_ASSIGN(HelperDelegateX11);
 | 
| -};
 | 
| -
 | 
| -////////////////////////////////////////////////////////////////////////////////
 | 
| -// NativeDisplayDelegateX11 implementation:
 | 
| -
 | 
| -NativeDisplayDelegateX11::NativeDisplayDelegateX11()
 | 
| -    : display_(gfx::GetXDisplay()),
 | 
| -      window_(DefaultRootWindow(display_)),
 | 
| -      background_color_argb_(0) {}
 | 
| -
 | 
| -NativeDisplayDelegateX11::~NativeDisplayDelegateX11() {
 | 
| -  if (ui::PlatformEventSource::GetInstance() &&
 | 
| -      platform_event_dispatcher_.get()) {
 | 
| -    ui::PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(
 | 
| -        platform_event_dispatcher_.get());
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void NativeDisplayDelegateX11::Initialize() {
 | 
| -  int error_base_ignored = 0;
 | 
| -  int xrandr_event_base = 0;
 | 
| -  XRRQueryExtension(display_, &xrandr_event_base, &error_base_ignored);
 | 
| -
 | 
| -  helper_delegate_.reset(new HelperDelegateX11(this));
 | 
| -  platform_event_dispatcher_.reset(new NativeDisplayEventDispatcherX11(
 | 
| -      helper_delegate_.get(), xrandr_event_base));
 | 
| -
 | 
| -  if (ui::PlatformEventSource::GetInstance()) {
 | 
| -    ui::PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(
 | 
| -        platform_event_dispatcher_.get());
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void NativeDisplayDelegateX11::GrabServer() {
 | 
| -  CHECK(!screen_) << "Server already grabbed";
 | 
| -  XGrabServer(display_);
 | 
| -  screen_.reset(XRRGetScreenResources(display_, window_));
 | 
| -  CHECK(screen_);
 | 
| -}
 | 
| -
 | 
| -void NativeDisplayDelegateX11::UngrabServer() {
 | 
| -  CHECK(screen_) << "Server not grabbed";
 | 
| -  screen_.reset();
 | 
| -  XUngrabServer(display_);
 | 
| -  // crbug.com/366125
 | 
| -  XFlush(display_);
 | 
| -}
 | 
| -
 | 
| -void NativeDisplayDelegateX11::TakeDisplayControl(
 | 
| -    const DisplayControlCallback& callback) {
 | 
| -  NOTIMPLEMENTED();
 | 
| -}
 | 
| -
 | 
| -void NativeDisplayDelegateX11::RelinquishDisplayControl(
 | 
| -    const DisplayControlCallback& callback) {
 | 
| -  NOTIMPLEMENTED();
 | 
| -}
 | 
| -
 | 
| -void NativeDisplayDelegateX11::SyncWithServer() { XSync(display_, 0); }
 | 
| -
 | 
| -void NativeDisplayDelegateX11::SetBackgroundColor(uint32_t color_argb) {
 | 
| -  background_color_argb_ = color_argb;
 | 
| -}
 | 
| -
 | 
| -void NativeDisplayDelegateX11::ForceDPMSOn() {
 | 
| -  CHECK(DPMSEnable(display_));
 | 
| -  CHECK(DPMSForceLevel(display_, DPMSModeOn));
 | 
| -}
 | 
| -
 | 
| -void NativeDisplayDelegateX11::GetDisplays(
 | 
| -    const GetDisplaysCallback& callback) {
 | 
| -  CHECK(screen_) << "Server not grabbed";
 | 
| -
 | 
| -  cached_outputs_.clear();
 | 
| -  std::set<RRCrtc> last_used_crtcs;
 | 
| -
 | 
| -  InitModes();
 | 
| -  for (int i = 0; i < screen_->noutput; ++i) {
 | 
| -    RROutput output_id = screen_->outputs[i];
 | 
| -    XRROutputInfo* output_info =
 | 
| -        XRRGetOutputInfo(display_, screen_.get(), output_id);
 | 
| -    if (output_info->connection == RR_Connected) {
 | 
| -      DisplaySnapshotX11* output =
 | 
| -          InitDisplaySnapshot(output_id, output_info, &last_used_crtcs, i);
 | 
| -      cached_outputs_.push_back(output);
 | 
| -    }
 | 
| -    XRRFreeOutputInfo(output_info);
 | 
| -  }
 | 
| -
 | 
| -  callback.Run(cached_outputs_.get());
 | 
| -}
 | 
| -
 | 
| -void NativeDisplayDelegateX11::AddMode(const DisplaySnapshot& output,
 | 
| -                                       const DisplayMode* mode) {
 | 
| -  CHECK(screen_) << "Server not grabbed";
 | 
| -  CHECK(mode) << "Must add valid mode";
 | 
| -
 | 
| -  const DisplaySnapshotX11& x11_output =
 | 
| -      static_cast<const DisplaySnapshotX11&>(output);
 | 
| -  RRMode mode_id = static_cast<const DisplayModeX11*>(mode)->mode_id();
 | 
| -
 | 
| -  VLOG(1) << "AddDisplayMode: output=" << x11_output.output()
 | 
| -          << " mode=" << mode_id;
 | 
| -  XRRAddOutputMode(display_, x11_output.output(), mode_id);
 | 
| -}
 | 
| -
 | 
| -void NativeDisplayDelegateX11::Configure(const DisplaySnapshot& output,
 | 
| -                                         const DisplayMode* mode,
 | 
| -                                         const gfx::Point& origin,
 | 
| -                                         const ConfigureCallback& callback) {
 | 
| -  const DisplaySnapshotX11& x11_output =
 | 
| -      static_cast<const DisplaySnapshotX11&>(output);
 | 
| -  RRMode mode_id = None;
 | 
| -  if (mode)
 | 
| -    mode_id = static_cast<const DisplayModeX11*>(mode)->mode_id();
 | 
| -
 | 
| -  callback.Run(ConfigureCrtc(x11_output.crtc(), mode_id, x11_output.output(),
 | 
| -                             origin.x(), origin.y()));
 | 
| -}
 | 
| -
 | 
| -bool NativeDisplayDelegateX11::ConfigureCrtc(RRCrtc crtc,
 | 
| -                                             RRMode mode,
 | 
| -                                             RROutput output,
 | 
| -                                             int x,
 | 
| -                                             int y) {
 | 
| -  CHECK(screen_) << "Server not grabbed";
 | 
| -  VLOG(1) << "ConfigureCrtc: crtc=" << crtc << " mode=" << mode
 | 
| -          << " output=" << output << " x=" << x << " y=" << y;
 | 
| -  // Xrandr.h is full of lies. XRRSetCrtcConfig() is defined as returning a
 | 
| -  // Status, which is typically 0 for failure and 1 for success. In
 | 
| -  // actuality it returns a RRCONFIGSTATUS, which uses 0 for success.
 | 
| -  if (XRRSetCrtcConfig(display_, screen_.get(), crtc, CurrentTime, x, y, mode,
 | 
| -                       RR_Rotate_0, (output && mode) ? &output : NULL,
 | 
| -                       (output && mode) ? 1 : 0) != RRSetConfigSuccess) {
 | 
| -    LOG(WARNING) << "Unable to configure CRTC " << crtc << ":"
 | 
| -                 << " mode=" << mode << " output=" << output << " x=" << x
 | 
| -                 << " y=" << y;
 | 
| -    return false;
 | 
| -  }
 | 
| -
 | 
| -  return true;
 | 
| -}
 | 
| -
 | 
| -void NativeDisplayDelegateX11::CreateFrameBuffer(const gfx::Size& size) {
 | 
| -  CHECK(screen_) << "Server not grabbed";
 | 
| -  gfx::Size current_screen_size(
 | 
| -      DisplayWidth(display_, DefaultScreen(display_)),
 | 
| -      DisplayHeight(display_, DefaultScreen(display_)));
 | 
| -
 | 
| -  VLOG(1) << "CreateFrameBuffer: new=" << size.ToString()
 | 
| -          << " current=" << current_screen_size.ToString();
 | 
| -
 | 
| -  DestroyUnusedCrtcs();
 | 
| -
 | 
| -  if (size == current_screen_size)
 | 
| -    return;
 | 
| -
 | 
| -  gfx::Size min_screen_size(current_screen_size);
 | 
| -  min_screen_size.SetToMin(size);
 | 
| -  UpdateCrtcsForNewFramebuffer(min_screen_size);
 | 
| -
 | 
| -  int mm_width = size.width() * kPixelsToMmScale;
 | 
| -  int mm_height = size.height() * kPixelsToMmScale;
 | 
| -  XRRSetScreenSize(
 | 
| -      display_, window_, size.width(), size.height(), mm_width, mm_height);
 | 
| -  // We don't wait for root window resize, therefore this end up with drawing
 | 
| -  // in the old window size, which we care during the boot.
 | 
| -  DrawBackground();
 | 
| -
 | 
| -  // Don't redraw the background upon framebuffer change again. This should
 | 
| -  // happen only once after boot.
 | 
| -  background_color_argb_ = 0;
 | 
| -}
 | 
| -
 | 
| -void NativeDisplayDelegateX11::AddObserver(NativeDisplayObserver* observer) {
 | 
| -  observers_.AddObserver(observer);
 | 
| -}
 | 
| -
 | 
| -void NativeDisplayDelegateX11::RemoveObserver(NativeDisplayObserver* observer) {
 | 
| -  observers_.RemoveObserver(observer);
 | 
| -}
 | 
| -
 | 
| -display::FakeDisplayController*
 | 
| -NativeDisplayDelegateX11::GetFakeDisplayController() {
 | 
| -  return nullptr;
 | 
| -}
 | 
| -
 | 
| -void NativeDisplayDelegateX11::InitModes() {
 | 
| -  CHECK(screen_) << "Server not grabbed";
 | 
| -
 | 
| -  modes_.clear();
 | 
| -
 | 
| -  for (int i = 0; i < screen_->nmode; ++i) {
 | 
| -    const XRRModeInfo& info = screen_->modes[i];
 | 
| -    float refresh_rate = 0.0f;
 | 
| -    if (info.hTotal && info.vTotal) {
 | 
| -      refresh_rate =
 | 
| -          static_cast<float>(info.dotClock) /
 | 
| -          (static_cast<float>(info.hTotal) * static_cast<float>(info.vTotal));
 | 
| -    }
 | 
| -
 | 
| -    modes_.insert(std::make_pair(
 | 
| -        info.id, base::MakeUnique<DisplayModeX11>(
 | 
| -                     gfx::Size(info.width, info.height),
 | 
| -                     info.modeFlags & RR_Interlace, refresh_rate, info.id)));
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -DisplaySnapshotX11* NativeDisplayDelegateX11::InitDisplaySnapshot(
 | 
| -    RROutput output,
 | 
| -    XRROutputInfo* info,
 | 
| -    std::set<RRCrtc>* last_used_crtcs,
 | 
| -    int index) {
 | 
| -  int64_t display_id = 0;
 | 
| -  display::EDIDParserX11 edid_parser(output);
 | 
| -  if (!edid_parser.GetDisplayId(static_cast<uint8_t>(index), &display_id))
 | 
| -    display_id = index;
 | 
| -
 | 
| -  bool has_overscan = false;
 | 
| -  edid_parser.GetOutputOverscanFlag(&has_overscan);
 | 
| -
 | 
| -  DisplayConnectionType type = GetDisplayConnectionTypeFromName(info->name);
 | 
| -  if (type == DISPLAY_CONNECTION_TYPE_UNKNOWN)
 | 
| -    LOG(ERROR) << "Unknown link type: " << info->name;
 | 
| -
 | 
| -  RRMode native_mode_id = GetOutputNativeMode(info);
 | 
| -  RRMode current_mode_id = None;
 | 
| -  gfx::Point origin;
 | 
| -  if (info->crtc) {
 | 
| -    XRRCrtcInfo* crtc_info =
 | 
| -        XRRGetCrtcInfo(display_, screen_.get(), info->crtc);
 | 
| -    current_mode_id = crtc_info->mode;
 | 
| -    origin.SetPoint(crtc_info->x, crtc_info->y);
 | 
| -    XRRFreeCrtcInfo(crtc_info);
 | 
| -  }
 | 
| -
 | 
| -  RRCrtc crtc = None;
 | 
| -  // Assign a CRTC that isn't already in use.
 | 
| -  for (int i = 0; i < info->ncrtc; ++i) {
 | 
| -    if (last_used_crtcs->find(info->crtcs[i]) == last_used_crtcs->end()) {
 | 
| -      crtc = info->crtcs[i];
 | 
| -      last_used_crtcs->insert(crtc);
 | 
| -      break;
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  const DisplayMode* current_mode = NULL;
 | 
| -  const DisplayMode* native_mode = NULL;
 | 
| -  std::vector<std::unique_ptr<const DisplayMode>> display_modes;
 | 
| -
 | 
| -  for (int i = 0; i < info->nmode; ++i) {
 | 
| -    const RRMode mode = info->modes[i];
 | 
| -    if (modes_.find(mode) != modes_.end()) {
 | 
| -      display_modes.push_back(modes_.at(mode)->Clone());
 | 
| -
 | 
| -      if (mode == current_mode_id)
 | 
| -        current_mode = display_modes.back().get();
 | 
| -      if (mode == native_mode_id)
 | 
| -        native_mode = display_modes.back().get();
 | 
| -    } else {
 | 
| -      LOG(WARNING) << "Unable to find XRRModeInfo for mode " << mode;
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  DisplaySnapshotX11* display_snapshot =
 | 
| -      new DisplaySnapshotX11(display_id,
 | 
| -                             origin,
 | 
| -                             gfx::Size(info->mm_width, info->mm_height),
 | 
| -                             type,
 | 
| -                             IsOutputAspectPreservingScaling(output),
 | 
| -                             has_overscan,
 | 
| -                             edid_parser.GetDisplayName(),
 | 
| -                             std::move(display_modes),
 | 
| -                             edid_parser.edid(),
 | 
| -                             current_mode,
 | 
| -                             native_mode,
 | 
| -                             output,
 | 
| -                             crtc,
 | 
| -                             index);
 | 
| -
 | 
| -  VLOG(1) << "Found display " << cached_outputs_.size() << ":"
 | 
| -          << " output=" << output << " crtc=" << crtc
 | 
| -          << " current_mode=" << current_mode_id;
 | 
| -
 | 
| -  return display_snapshot;
 | 
| -}
 | 
| -
 | 
| -void NativeDisplayDelegateX11::GetHDCPState(
 | 
| -    const DisplaySnapshot& output,
 | 
| -    const GetHDCPStateCallback& callback) {
 | 
| -  HDCPState state = HDCP_STATE_UNDESIRED;
 | 
| -  bool success = GetHDCPState(output, &state);
 | 
| -  callback.Run(success, state);
 | 
| -}
 | 
| -
 | 
| -bool NativeDisplayDelegateX11::GetHDCPState(const DisplaySnapshot& output,
 | 
| -                                            HDCPState* state) {
 | 
| -  unsigned char* values = NULL;
 | 
| -  int actual_format = 0;
 | 
| -  unsigned long nitems = 0;
 | 
| -  unsigned long bytes_after = 0;
 | 
| -  Atom actual_type = None;
 | 
| -  int success = 0;
 | 
| -  RROutput output_id = static_cast<const DisplaySnapshotX11&>(output).output();
 | 
| -  // TODO(kcwu): Use X11AtomCache to save round trip time of XInternAtom.
 | 
| -  Atom prop = XInternAtom(display_, kContentProtectionAtomName, False);
 | 
| -
 | 
| -  // TODO(kcwu): Move this to x11_util (similar method calls in this file and
 | 
| -  // output_util.cc)
 | 
| -  success = XRRGetOutputProperty(display_,
 | 
| -                                 output_id,
 | 
| -                                 prop,
 | 
| -                                 0,
 | 
| -                                 100,
 | 
| -                                 False,
 | 
| -                                 False,
 | 
| -                                 AnyPropertyType,
 | 
| -                                 &actual_type,
 | 
| -                                 &actual_format,
 | 
| -                                 &nitems,
 | 
| -                                 &bytes_after,
 | 
| -                                 &values);
 | 
| -  gfx::XScopedPtr<unsigned char> scoped_values(values);
 | 
| -  if (actual_type == None) {
 | 
| -    LOG(ERROR) << "Property '" << kContentProtectionAtomName
 | 
| -               << "' does not exist";
 | 
| -    return false;
 | 
| -  }
 | 
| -
 | 
| -  if (success == Success && actual_type == XA_ATOM && actual_format == 32 &&
 | 
| -      nitems == 1) {
 | 
| -    Atom value = reinterpret_cast<Atom*>(values)[0];
 | 
| -    if (value == XInternAtom(display_, kProtectionUndesiredAtomName, False)) {
 | 
| -      *state = HDCP_STATE_UNDESIRED;
 | 
| -    } else if (value ==
 | 
| -               XInternAtom(display_, kProtectionDesiredAtomName, False)) {
 | 
| -      *state = HDCP_STATE_DESIRED;
 | 
| -    } else if (value ==
 | 
| -               XInternAtom(display_, kProtectionEnabledAtomName, False)) {
 | 
| -      *state = HDCP_STATE_ENABLED;
 | 
| -    } else {
 | 
| -      LOG(ERROR) << "Unknown " << kContentProtectionAtomName
 | 
| -                 << " value: " << value;
 | 
| -      return false;
 | 
| -    }
 | 
| -  } else {
 | 
| -    LOG(ERROR) << "XRRGetOutputProperty failed";
 | 
| -    return false;
 | 
| -  }
 | 
| -
 | 
| -  VLOG(3) << "HDCP state: success," << *state;
 | 
| -  return true;
 | 
| -}
 | 
| -
 | 
| -void NativeDisplayDelegateX11::SetHDCPState(
 | 
| -    const DisplaySnapshot& output,
 | 
| -    HDCPState state,
 | 
| -    const SetHDCPStateCallback& callback) {
 | 
| -  callback.Run(SetHDCPState(output, state));
 | 
| -}
 | 
| -
 | 
| -bool NativeDisplayDelegateX11::SetHDCPState(const DisplaySnapshot& output,
 | 
| -                                            HDCPState state) {
 | 
| -  Atom name = XInternAtom(display_, kContentProtectionAtomName, False);
 | 
| -  Atom value = None;
 | 
| -  switch (state) {
 | 
| -    case HDCP_STATE_UNDESIRED:
 | 
| -      value = XInternAtom(display_, kProtectionUndesiredAtomName, False);
 | 
| -      break;
 | 
| -    case HDCP_STATE_DESIRED:
 | 
| -      value = XInternAtom(display_, kProtectionDesiredAtomName, False);
 | 
| -      break;
 | 
| -    default:
 | 
| -      NOTREACHED() << "Invalid HDCP state: " << state;
 | 
| -      return false;
 | 
| -  }
 | 
| -  gfx::X11ErrorTracker err_tracker;
 | 
| -  unsigned char* data = reinterpret_cast<unsigned char*>(&value);
 | 
| -  RROutput output_id = static_cast<const DisplaySnapshotX11&>(output).output();
 | 
| -  XRRChangeOutputProperty(
 | 
| -      display_, output_id, name, XA_ATOM, 32, PropModeReplace, data, 1);
 | 
| -  if (err_tracker.FoundNewError()) {
 | 
| -    LOG(ERROR) << "XRRChangeOutputProperty failed";
 | 
| -    return false;
 | 
| -  } else {
 | 
| -    return true;
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void NativeDisplayDelegateX11::DestroyUnusedCrtcs() {
 | 
| -  CHECK(screen_) << "Server not grabbed";
 | 
| -
 | 
| -  for (int i = 0; i < screen_->ncrtc; ++i) {
 | 
| -    bool in_use = false;
 | 
| -    for (ScopedVector<DisplaySnapshot>::const_iterator it =
 | 
| -             cached_outputs_.begin();
 | 
| -         it != cached_outputs_.end();
 | 
| -         ++it) {
 | 
| -      DisplaySnapshotX11* x11_output = static_cast<DisplaySnapshotX11*>(*it);
 | 
| -      if (screen_->crtcs[i] == x11_output->crtc()) {
 | 
| -        in_use = true;
 | 
| -        break;
 | 
| -      }
 | 
| -    }
 | 
| -
 | 
| -    if (!in_use)
 | 
| -      ConfigureCrtc(screen_->crtcs[i], None, None, 0, 0);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void NativeDisplayDelegateX11::UpdateCrtcsForNewFramebuffer(
 | 
| -    const gfx::Size& min_screen_size) {
 | 
| -  CHECK(screen_) << "Server not grabbed";
 | 
| -  // Setting the screen size will fail if any CRTC doesn't fit afterwards.
 | 
| -  // At the same time, turning CRTCs off and back on uses up a lot of time.
 | 
| -  // This function tries to be smart to avoid too many off/on cycles:
 | 
| -  // - We set the new modes on CRTCs, if they fit in both the old and new
 | 
| -  //   FBs, and park them at (0,0)
 | 
| -  // - We disable the CRTCs we will need but don't fit in the old FB. Those
 | 
| -  //   will be reenabled after the resize.
 | 
| -  // We don't worry about the cached state of the outputs here since we are
 | 
| -  // not interested in the state we are setting - we just try to get the CRTCs
 | 
| -  // out of the way so we can rebuild the frame buffer.
 | 
| -  gfx::Rect fb_rect(min_screen_size);
 | 
| -  for (ScopedVector<DisplaySnapshot>::const_iterator it =
 | 
| -           cached_outputs_.begin();
 | 
| -       it != cached_outputs_.end();
 | 
| -       ++it) {
 | 
| -    DisplaySnapshotX11* x11_output = static_cast<DisplaySnapshotX11*>(*it);
 | 
| -    const DisplayMode* mode_info = x11_output->current_mode();
 | 
| -    RROutput output = x11_output->output();
 | 
| -    RRMode mode = None;
 | 
| -
 | 
| -    if (mode_info) {
 | 
| -      mode = static_cast<const DisplayModeX11*>(mode_info)->mode_id();
 | 
| -
 | 
| -      if (!fb_rect.Contains(gfx::Rect(mode_info->size()))) {
 | 
| -        // In case our CRTC doesn't fit in common area of our current and about
 | 
| -        // to be resized framebuffer, disable it.
 | 
| -        // It'll get reenabled after we resize the framebuffer.
 | 
| -        mode = None;
 | 
| -        output = None;
 | 
| -        mode_info = NULL;
 | 
| -      }
 | 
| -    }
 | 
| -
 | 
| -    ConfigureCrtc(x11_output->crtc(), mode, output, 0, 0);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -bool NativeDisplayDelegateX11::IsOutputAspectPreservingScaling(RROutput id) {
 | 
| -  Atom scaling_prop = XInternAtom(display_, "scaling mode", False);
 | 
| -  Atom full_aspect_atom = XInternAtom(display_, "Full aspect", False);
 | 
| -  if (scaling_prop == None || full_aspect_atom == None)
 | 
| -    return false;
 | 
| -
 | 
| -  int nprop = 0;
 | 
| -  gfx::XScopedPtr<Atom[]> props(XRRListOutputProperties(display_, id, &nprop));
 | 
| -  for (int j = 0; j < nprop; j++) {
 | 
| -    Atom prop = props[j];
 | 
| -    if (scaling_prop == prop) {
 | 
| -      unsigned char* values = NULL;
 | 
| -      int actual_format;
 | 
| -      unsigned long nitems;
 | 
| -      unsigned long bytes_after;
 | 
| -      Atom actual_type;
 | 
| -      int success;
 | 
| -
 | 
| -      success = XRRGetOutputProperty(display_,
 | 
| -                                     id,
 | 
| -                                     prop,
 | 
| -                                     0,
 | 
| -                                     100,
 | 
| -                                     False,
 | 
| -                                     False,
 | 
| -                                     AnyPropertyType,
 | 
| -                                     &actual_type,
 | 
| -                                     &actual_format,
 | 
| -                                     &nitems,
 | 
| -                                     &bytes_after,
 | 
| -                                     &values);
 | 
| -      gfx::XScopedPtr<unsigned char> scoped_value(values);
 | 
| -      if (success == Success && actual_type == XA_ATOM && actual_format == 32 &&
 | 
| -          nitems == 1) {
 | 
| -        Atom value = reinterpret_cast<Atom*>(values)[0];
 | 
| -        if (full_aspect_atom == value)
 | 
| -          return true;
 | 
| -      }
 | 
| -    }
 | 
| -  }
 | 
| -  return false;
 | 
| -}
 | 
| -
 | 
| -
 | 
| -std::vector<ColorCalibrationProfile>
 | 
| -NativeDisplayDelegateX11::GetAvailableColorCalibrationProfiles(
 | 
| -    const DisplaySnapshot& output) {
 | 
| -  // TODO(mukai|marcheu): Checks the system data and fills the result.
 | 
| -  // Note that the order would be Dynamic -> Standard -> Movie -> Reading.
 | 
| -  return std::vector<ColorCalibrationProfile>();
 | 
| -}
 | 
| -
 | 
| -bool NativeDisplayDelegateX11::SetColorCalibrationProfile(
 | 
| -    const DisplaySnapshot& output,
 | 
| -    ColorCalibrationProfile new_profile) {
 | 
| -  const DisplaySnapshotX11& x11_output =
 | 
| -      static_cast<const DisplaySnapshotX11&>(output);
 | 
| -
 | 
| -  XRRCrtcGamma* gamma_ramp = CreateGammaRampForProfile(x11_output, new_profile);
 | 
| -
 | 
| -  if (!gamma_ramp)
 | 
| -    return false;
 | 
| -
 | 
| -  int gamma_ramp_size = XRRGetCrtcGammaSize(display_, x11_output.crtc());
 | 
| -  XRRSetCrtcGamma(display_,
 | 
| -                  x11_output.crtc(),
 | 
| -                  ResampleGammaRamp(gamma_ramp, gamma_ramp_size));
 | 
| -  XRRFreeGamma(gamma_ramp);
 | 
| -  return true;
 | 
| -}
 | 
| -
 | 
| -XRRCrtcGamma* NativeDisplayDelegateX11::CreateGammaRampForProfile(
 | 
| -    const DisplaySnapshotX11& x11_output,
 | 
| -    ColorCalibrationProfile new_profile) {
 | 
| -  // TODO(mukai|marcheu): Creates the appropriate gamma ramp data from the
 | 
| -  // profile enum. It would be served by the vendor.
 | 
| -  return NULL;
 | 
| -}
 | 
| -
 | 
| -bool NativeDisplayDelegateX11::SetColorCorrection(
 | 
| -    const ui::DisplaySnapshot& output,
 | 
| -    const std::vector<GammaRampRGBEntry>& degamma_lut,
 | 
| -    const std::vector<GammaRampRGBEntry>& gamma_lut,
 | 
| -    const std::vector<float>& correction_matrix) {
 | 
| -  NOTIMPLEMENTED();
 | 
| -  return false;
 | 
| -}
 | 
| -
 | 
| -void NativeDisplayDelegateX11::DrawBackground() {
 | 
| -  if (!background_color_argb_)
 | 
| -    return;
 | 
| -  // Configuring CRTCs/Framebuffer clears the boot screen image.  Paint the
 | 
| -  // same background color after updating framebuffer to minimize the
 | 
| -  // duration of black screen at boot time.
 | 
| -  XColor color;
 | 
| -  Colormap colormap = DefaultColormap(display_, 0);
 | 
| -  // XColor uses 16 bits per color.
 | 
| -  color.red = (background_color_argb_ & 0x00FF0000) >> 8;
 | 
| -  color.green = (background_color_argb_ & 0x0000FF00);
 | 
| -  color.blue = (background_color_argb_ & 0x000000FF) << 8;
 | 
| -  color.flags = DoRed | DoGreen | DoBlue;
 | 
| -  XAllocColor(display_, colormap, &color);
 | 
| -
 | 
| -  GC gc = XCreateGC(display_, window_, 0, 0);
 | 
| -  XSetForeground(display_, gc, color.pixel);
 | 
| -  XSetFillStyle(display_, gc, FillSolid);
 | 
| -  int width = DisplayWidth(display_, DefaultScreen(display_));
 | 
| -  int height = DisplayHeight(display_, DefaultScreen(display_));
 | 
| -  XFillRectangle(display_, window_, gc, 0, 0, width, height);
 | 
| -  XFreeGC(display_, gc);
 | 
| -  XFreeColors(display_, colormap, &color.pixel, 1, 0);
 | 
| -}
 | 
| -
 | 
| -}  // namespace ui
 | 
| 
 |