• 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_X11_SHARED_X_DISPLAY_H_
12 #define MODULES_DESKTOP_CAPTURE_LINUX_X11_SHARED_X_DISPLAY_H_
13 
14 #include <map>
15 #include <vector>
16 
17 #include "absl/strings/string_view.h"
18 #include "api/ref_counted_base.h"
19 #include "api/scoped_refptr.h"
20 #include "rtc_base/synchronization/mutex.h"
21 #include "rtc_base/system/rtc_export.h"
22 #include "rtc_base/thread_annotations.h"
23 
24 // Including Xlib.h will involve evil defines (Bool, Status, True, False), which
25 // easily conflict with other headers.
26 typedef struct _XDisplay Display;
27 typedef union _XEvent XEvent;
28 
29 namespace webrtc {
30 
31 // A ref-counted object to store XDisplay connection.
32 class RTC_EXPORT SharedXDisplay
33     : public rtc::RefCountedNonVirtual<SharedXDisplay> {
34  public:
35   class XEventHandler {
36    public:
~XEventHandler()37     virtual ~XEventHandler() {}
38 
39     // Processes XEvent. Returns true if the event has been handled.
40     virtual bool HandleXEvent(const XEvent& event) = 0;
41   };
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       absl::string_view 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   void IgnoreXServerGrabs();
66 
67   ~SharedXDisplay();
68 
69   SharedXDisplay(const SharedXDisplay&) = delete;
70   SharedXDisplay& operator=(const SharedXDisplay&) = delete;
71 
72  protected:
73   // Takes ownership of `display`.
74   explicit SharedXDisplay(Display* display);
75 
76  private:
77   typedef std::map<int, std::vector<XEventHandler*> > EventHandlersMap;
78 
79   Display* display_;
80 
81   Mutex mutex_;
82 
83   EventHandlersMap event_handlers_ RTC_GUARDED_BY(mutex_);
84 };
85 
86 }  // namespace webrtc
87 
88 #endif  // MODULES_DESKTOP_CAPTURE_LINUX_X11_SHARED_X_DISPLAY_H_
89