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/timer/timer.h"
      9 #include "ui/events/platform/platform_event_dispatcher.h"
     10 #include "ui/gfx/display_change_notifier.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   // Overridden from gfx::Screen:
     34   virtual bool IsDIPEnabled() OVERRIDE;
     35   virtual gfx::Point GetCursorScreenPoint() OVERRIDE;
     36   virtual gfx::NativeWindow GetWindowUnderCursor() OVERRIDE;
     37   virtual gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point)
     38       OVERRIDE;
     39   virtual int GetNumDisplays() const OVERRIDE;
     40   virtual std::vector<gfx::Display> GetAllDisplays() const OVERRIDE;
     41   virtual gfx::Display GetDisplayNearestWindow(
     42       gfx::NativeView window) const OVERRIDE;
     43   virtual gfx::Display GetDisplayNearestPoint(
     44       const gfx::Point& point) const OVERRIDE;
     45   virtual gfx::Display GetDisplayMatching(
     46       const gfx::Rect& match_rect) const OVERRIDE;
     47   virtual gfx::Display GetPrimaryDisplay() const OVERRIDE;
     48   virtual void AddObserver(gfx::DisplayObserver* observer) OVERRIDE;
     49   virtual void RemoveObserver(gfx::DisplayObserver* observer) OVERRIDE;
     50 
     51   // ui::PlatformEventDispatcher:
     52   virtual bool CanDispatchEvent(const ui::PlatformEvent& event) OVERRIDE;
     53   virtual uint32_t DispatchEvent(const ui::PlatformEvent& event) OVERRIDE;
     54 
     55  private:
     56   friend class DesktopScreenX11Test;
     57 
     58   // Constructor used in tests.
     59   DesktopScreenX11(const std::vector<gfx::Display>& test_displays);
     60 
     61   // Builds a list of displays from the current screen information offered by
     62   // the X server.
     63   std::vector<gfx::Display> BuildDisplaysFromXRandRInfo();
     64 
     65   // We delay updating the display so we can coalesce events.
     66   void ConfigureTimerFired();
     67 
     68   Display* xdisplay_;
     69   ::Window x_root_window_;
     70 
     71   // Whether the x server supports the XRandR extension.
     72   bool has_xrandr_;
     73 
     74   // The base of the event numbers used to represent XRandr events used in
     75   // decoding events regarding output add/remove.
     76   int xrandr_event_base_;
     77 
     78   // The display objects we present to chrome.
     79   std::vector<gfx::Display> displays_;
     80 
     81   // The timer to delay configuring outputs. See also the comments in
     82   // Dispatch().
     83   scoped_ptr<base::OneShotTimer<DesktopScreenX11> > configure_timer_;
     84 
     85   gfx::DisplayChangeNotifier change_notifier_;
     86 
     87   DISALLOW_COPY_AND_ASSIGN(DesktopScreenX11);
     88 };
     89 
     90 }  // namespace views
     91 
     92 #endif  // UI_VIEWS_WIDGET_DESKTOP_AURA_DESKTOP_SCREEN_X11_H_
     93