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