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