Home | History | Annotate | Download | only in desktop_aura
      1 // Copyright (c) 2013 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_VIEWS_WIDGET_DESKTOP_AURA_DESKTOP_SCREEN_X11_H_
      6 #define UI_VIEWS_WIDGET_DESKTOP_AURA_DESKTOP_SCREEN_X11_H_
      7 
      8 #include "base/observer_list.h"
      9 #include "base/timer/timer.h"
     10 #include "ui/events/platform/platform_event_dispatcher.h"
     11 #include "ui/gfx/screen.h"
     12 #include "ui/views/views_export.h"
     13 
     14 namespace gfx {
     15 class Display;
     16 }
     17 
     18 typedef unsigned long XID;
     19 typedef XID Window;
     20 typedef struct _XDisplay Display;
     21 
     22 namespace views {
     23 class DesktopScreenX11Test;
     24 
     25 // Our singleton screen implementation that talks to xrandr.
     26 class VIEWS_EXPORT DesktopScreenX11 : public gfx::Screen,
     27                                       public ui::PlatformEventDispatcher {
     28  public:
     29   DesktopScreenX11();
     30 
     31   virtual ~DesktopScreenX11();
     32 
     33   // Takes a set of displays and dispatches the screen change events to
     34   // listeners. Exposed for testing.
     35   void ProcessDisplayChange(const std::vector<gfx::Display>& displays);
     36 
     37   // Overridden from gfx::Screen:
     38   virtual bool IsDIPEnabled() OVERRIDE;
     39   virtual gfx::Point GetCursorScreenPoint() OVERRIDE;
     40   virtual gfx::NativeWindow GetWindowUnderCursor() OVERRIDE;
     41   virtual gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point)
     42       OVERRIDE;
     43   virtual int GetNumDisplays() const OVERRIDE;
     44   virtual std::vector<gfx::Display> GetAllDisplays() const OVERRIDE;
     45   virtual gfx::Display GetDisplayNearestWindow(
     46       gfx::NativeView window) const OVERRIDE;
     47   virtual gfx::Display GetDisplayNearestPoint(
     48       const gfx::Point& point) const OVERRIDE;
     49   virtual gfx::Display GetDisplayMatching(
     50       const gfx::Rect& match_rect) const OVERRIDE;
     51   virtual gfx::Display GetPrimaryDisplay() const OVERRIDE;
     52   virtual void AddObserver(gfx::DisplayObserver* observer) OVERRIDE;
     53   virtual void RemoveObserver(gfx::DisplayObserver* observer) OVERRIDE;
     54 
     55   // ui::PlatformEventDispatcher:
     56   virtual bool CanDispatchEvent(const ui::PlatformEvent& event) OVERRIDE;
     57   virtual uint32_t DispatchEvent(const ui::PlatformEvent& event) OVERRIDE;
     58 
     59  private:
     60   friend class DesktopScreenX11Test;
     61 
     62   // Constructor used in tests.
     63   DesktopScreenX11(const std::vector<gfx::Display>& test_displays);
     64 
     65   // Builds a list of displays from the current screen information offered by
     66   // the X server.
     67   std::vector<gfx::Display> BuildDisplaysFromXRandRInfo();
     68 
     69   // We delay updating the display so we can coalesce events.
     70   void ConfigureTimerFired();
     71 
     72   Display* xdisplay_;
     73   ::Window x_root_window_;
     74 
     75   // Whether the x server supports the XRandR extension.
     76   bool has_xrandr_;
     77 
     78   // The base of the event numbers used to represent XRandr events used in
     79   // decoding events regarding output add/remove.
     80   int xrandr_event_base_;
     81 
     82   // The display objects we present to chrome.
     83   std::vector<gfx::Display> displays_;
     84 
     85   // The timer to delay configuring outputs. See also the comments in
     86   // Dispatch().
     87   scoped_ptr<base::OneShotTimer<DesktopScreenX11> > configure_timer_;
     88 
     89   ObserverList<gfx::DisplayObserver> observer_list_;
     90 
     91   DISALLOW_COPY_AND_ASSIGN(DesktopScreenX11);
     92 };
     93 
     94 }  // namespace views
     95 
     96 #endif  // UI_VIEWS_WIDGET_DESKTOP_AURA_DESKTOP_SCREEN_X11_H_
     97