• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef MODULES_DESKTOP_CAPTURE_LINUX_SHARED_X_DISPLAY_H_
12 #define MODULES_DESKTOP_CAPTURE_LINUX_SHARED_X_DISPLAY_H_
13 
14 #include <map>
15 #include <string>
16 #include <vector>
17 
18 #include "api/ref_counted_base.h"
19 #include "api/scoped_refptr.h"
20 #include "rtc_base/constructor_magic.h"
21 
22 // Including Xlib.h will involve evil defines (Bool, Status, True, False), which
23 // easily conflict with other headers.
24 typedef struct _XDisplay Display;
25 typedef union _XEvent XEvent;
26 
27 namespace webrtc {
28 
29 // A ref-counted object to store XDisplay connection.
30 class SharedXDisplay : public rtc::RefCountedBase {
31  public:
32   class XEventHandler {
33    public:
~XEventHandler()34     virtual ~XEventHandler() {}
35 
36     // Processes XEvent. Returns true if the event has been handled.
37     virtual bool HandleXEvent(const XEvent& event) = 0;
38   };
39 
40   // Takes ownership of |display|.
41   explicit SharedXDisplay(Display* display);
42 
43   // Creates a new X11 Display for the |display_name|. NULL is returned if X11
44   // connection failed. Equivalent to CreateDefault() when |display_name| is
45   // empty.
46   static rtc::scoped_refptr<SharedXDisplay> Create(
47       const std::string& display_name);
48 
49   // Creates X11 Display connection for the default display (e.g. specified in
50   // DISPLAY). NULL is returned if X11 connection failed.
51   static rtc::scoped_refptr<SharedXDisplay> CreateDefault();
52 
display()53   Display* display() { return display_; }
54 
55   // Adds a new event |handler| for XEvent's of |type|.
56   void AddEventHandler(int type, XEventHandler* handler);
57 
58   // Removes event |handler| added using |AddEventHandler|. Doesn't do anything
59   // if |handler| is not registered.
60   void RemoveEventHandler(int type, XEventHandler* handler);
61 
62   // Processes pending XEvents, calling corresponding event handlers.
63   void ProcessPendingXEvents();
64 
65  protected:
66   ~SharedXDisplay() override;
67 
68  private:
69   typedef std::map<int, std::vector<XEventHandler*> > EventHandlersMap;
70 
71   Display* display_;
72 
73   EventHandlersMap event_handlers_;
74 
75   RTC_DISALLOW_COPY_AND_ASSIGN(SharedXDisplay);
76 };
77 
78 }  // namespace webrtc
79 
80 #endif  // MODULES_DESKTOP_CAPTURE_LINUX_SHARED_X_DISPLAY_H_
81