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