blob: ee46a8061cb85855315df3c559e7beb584bc3309 [file] [log] [blame]
// 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 <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 std::vector<DisplaySnapshot*> GetDisplays() override;
virtual void AddMode(const DisplaySnapshot& output,
const DisplayMode* mode) override;
virtual bool Configure(const DisplaySnapshot& output,
const DisplayMode* mode,
const gfx::Point& origin) 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,
RRCrtc* last_used_crtc,
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_