shared_x_display.h (2762B)
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 : public RefCountedNonVirtual<SharedXDisplay> { 33 public: 34 class XEventHandler { 35 public: 36 virtual ~XEventHandler() {} 37 38 // Processes XEvent. Returns true if the event has been handled. 39 virtual bool HandleXEvent(const XEvent& event) = 0; 40 }; 41 42 // Creates a new X11 Display for the `display_name`. NULL is returned if X11 43 // connection failed. Equivalent to CreateDefault() when `display_name` is 44 // empty. 45 static scoped_refptr<SharedXDisplay> Create(absl::string_view display_name); 46 47 // Creates X11 Display connection for the default display (e.g. specified in 48 // DISPLAY). NULL is returned if X11 connection failed. 49 static scoped_refptr<SharedXDisplay> CreateDefault(); 50 51 Display* display() { return display_; } 52 53 // Adds a new event `handler` for XEvent's of `type`. 54 void AddEventHandler(int type, XEventHandler* handler); 55 56 // Removes event `handler` added using `AddEventHandler`. Doesn't do anything 57 // if `handler` is not registered. 58 void RemoveEventHandler(int type, XEventHandler* handler); 59 60 // Processes pending XEvents, calling corresponding event handlers. 61 void ProcessPendingXEvents(); 62 63 void IgnoreXServerGrabs(); 64 65 ~SharedXDisplay(); 66 67 SharedXDisplay(const SharedXDisplay&) = delete; 68 SharedXDisplay& operator=(const SharedXDisplay&) = delete; 69 70 protected: 71 // Takes ownership of `display`. 72 explicit SharedXDisplay(Display* display); 73 74 private: 75 typedef std::map<int, std::vector<XEventHandler*> > EventHandlersMap; 76 77 Display* display_; 78 79 Mutex mutex_; 80 81 EventHandlersMap event_handlers_ RTC_GUARDED_BY(mutex_); 82 }; 83 84 } // namespace webrtc 85 86 #endif // MODULES_DESKTOP_CAPTURE_LINUX_X11_SHARED_X_DISPLAY_H_