1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
|
// 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.
#ifndef UI_DISPLAY_CHROMEOS_X11_NATIVE_DISPLAY_DELEGATE_X11_H_
#define UI_DISPLAY_CHROMEOS_X11_NATIVE_DISPLAY_DELEGATE_X11_H_
#include <stdint.h>
#include <map>
#include <set>
#include <vector>
#include "base/compiler_specific.h"
#include "base/event_types.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/scoped_vector.h"
#include "base/observer_list.h"
#include "ui/display/display_export.h"
#include "ui/display/types/native_display_delegate.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/size.h"
// Forward declarations for Xlib and Xrandr.
// This is so unused X definitions don't pollute the namespace.
typedef unsigned long XID;
typedef XID RROutput;
typedef XID RRCrtc;
typedef XID RRMode;
typedef XID Window;
struct _XDisplay;
typedef struct _XDisplay Display;
struct _XRROutputInfo;
typedef _XRROutputInfo XRROutputInfo;
struct _XRRScreenResources;
typedef _XRRScreenResources XRRScreenResources;
struct _XRRCrtcGamma;
typedef _XRRCrtcGamma XRRCrtcGamma;
namespace ui {
class DisplayModeX11;
class DisplaySnapshotX11;
class NativeDisplayEventDispatcherX11;
class DISPLAY_EXPORT NativeDisplayDelegateX11 : public NativeDisplayDelegate {
public:
// Helper class that allows NativeDisplayEventDispatcherX11 and
// NativeDisplayDelegateX11::PlatformEventObserverX11 to interact with this
// class or with mocks in tests.
class HelperDelegate {
public:
virtual ~HelperDelegate() {}
// Tells XRandR to update its configuration in response to |event|, an
// RRScreenChangeNotify event.
virtual void UpdateXRandRConfiguration(const base::NativeEvent& event) = 0;
// Returns the list of current outputs. This is used to discard duplicate
// events.
virtual const std::vector<DisplaySnapshot*>& GetCachedDisplays() const = 0;
// Notify |observers_| that a change in configuration has occurred.
virtual void NotifyDisplayObservers() = 0;
};
NativeDisplayDelegateX11();
virtual ~NativeDisplayDelegateX11();
// NativeDisplayDelegate overrides:
virtual void Initialize() override;
virtual void GrabServer() override;
virtual void UngrabServer() override;
virtual bool TakeDisplayControl() override;
virtual bool RelinquishDisplayControl() override;
virtual void SyncWithServer() override;
virtual void SetBackgroundColor(uint32_t color_argb) override;
virtual void ForceDPMSOn() override;
virtual void GetDisplays(const GetDisplaysCallback& callback) override;
virtual void AddMode(const DisplaySnapshot& output,
const DisplayMode* mode) override;
virtual void Configure(const DisplaySnapshot& output,
const DisplayMode* mode,
const gfx::Point& origin,
const ConfigureCallback& callback) override;
virtual void CreateFrameBuffer(const gfx::Size& size) override;
virtual bool GetHDCPState(const DisplaySnapshot& output,
HDCPState* state) override;
virtual bool SetHDCPState(const DisplaySnapshot& output,
HDCPState state) override;
virtual std::vector<ColorCalibrationProfile>
GetAvailableColorCalibrationProfiles(
const DisplaySnapshot& output) override;
virtual bool SetColorCalibrationProfile(
const DisplaySnapshot& output,
ColorCalibrationProfile new_profile) override;
virtual void AddObserver(NativeDisplayObserver* observer) override;
virtual void RemoveObserver(NativeDisplayObserver* observer) override;
private:
class HelperDelegateX11;
// Parses all the modes made available by |screen_|.
void InitModes();
// Helper method for GetOutputs() that returns an OutputSnapshot struct based
// on the passed-in information.
DisplaySnapshotX11* InitDisplaySnapshot(RROutput id,
XRROutputInfo* info,
std::set<RRCrtc>* last_used_crtcs,
int index);
// Destroys unused CRTCs.
void DestroyUnusedCrtcs();
// Parks used CRTCs in a way which allows a framebuffer resize. This is faster
// than turning them off, resizing, then turning them back on.
// |min_screen_size| represent the smallest size between the current
// framebuffer size and the requested framebuffer size.
void UpdateCrtcsForNewFramebuffer(const gfx::Size& min_screen_size);
bool ConfigureCrtc(RRCrtc crtc, RRMode mode, RROutput output, int x, int y);
// Returns whether |id| is configured to preserve aspect when scaling.
bool IsOutputAspectPreservingScaling(RROutput id);
// Creates the gamma ramp for |new_profile|, or NULL if it doesn't exist.
// The caller should take the ownership.
XRRCrtcGamma* CreateGammaRampForProfile(
const DisplaySnapshotX11& x11_output,
ColorCalibrationProfile new_profile);
void DrawBackground();
Display* display_;
Window window_;
// Initialized when the server is grabbed and freed when it's ungrabbed.
XRRScreenResources* screen_;
std::map<RRMode, DisplayModeX11*> modes_;
// Every time GetOutputs() is called we cache the updated list of outputs in
// |cached_outputs_| so that we can check for duplicate events rather than
// propagate them.
ScopedVector<DisplaySnapshot> cached_outputs_;
scoped_ptr<HelperDelegate> helper_delegate_;
// Processes X11 display events associated with the root window and notifies
// |observers_| when a display change has occurred.
scoped_ptr<NativeDisplayEventDispatcherX11> platform_event_dispatcher_;
// List of observers waiting for display configuration change events.
ObserverList<NativeDisplayObserver> observers_;
// A background color used during boot time + multi displays.
uint32_t background_color_argb_;
DISALLOW_COPY_AND_ASSIGN(NativeDisplayDelegateX11);
};
} // namespace ui
#endif // UI_DISPLAY_CHROMEOS_X11_NATIVE_DISPLAY_DELEGATE_X11_H_
|