/*
 *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef MODULES_DESKTOP_CAPTURE_LINUX_X11_SHARED_X_DISPLAY_H_
#define MODULES_DESKTOP_CAPTURE_LINUX_X11_SHARED_X_DISPLAY_H_

#include <map>
#include <vector>

#include "absl/strings/string_view.h"
#include "api/ref_counted_base.h"
#include "api/scoped_refptr.h"
#include "rtc_base/synchronization/mutex.h"
#include "rtc_base/system/rtc_export.h"
#include "rtc_base/thread_annotations.h"

// Including Xlib.h will involve evil defines (Bool, Status, True, False), which
// easily conflict with other headers.
typedef struct _XDisplay Display;
typedef union _XEvent XEvent;

namespace webrtc {

// A ref-counted object to store XDisplay connection.
class RTC_EXPORT SharedXDisplay
    : public rtc::RefCountedNonVirtual<SharedXDisplay> {
 public:
  class XEventHandler {
   public:
    virtual ~XEventHandler() {}

    // Processes XEvent. Returns true if the event has been handled.
    virtual bool HandleXEvent(const XEvent& event) = 0;
  };

  // Creates a new X11 Display for the `display_name`. NULL is returned if X11
  // connection failed. Equivalent to CreateDefault() when `display_name` is
  // empty.
  static rtc::scoped_refptr<SharedXDisplay> Create(
      absl::string_view display_name);

  // Creates X11 Display connection for the default display (e.g. specified in
  // DISPLAY). NULL is returned if X11 connection failed.
  static rtc::scoped_refptr<SharedXDisplay> CreateDefault();

  Display* display() { return display_; }

  // Adds a new event `handler` for XEvent's of `type`.
  void AddEventHandler(int type, XEventHandler* handler);

  // Removes event `handler` added using `AddEventHandler`. Doesn't do anything
  // if `handler` is not registered.
  void RemoveEventHandler(int type, XEventHandler* handler);

  // Processes pending XEvents, calling corresponding event handlers.
  void ProcessPendingXEvents();

  void IgnoreXServerGrabs();

  ~SharedXDisplay();

  SharedXDisplay(const SharedXDisplay&) = delete;
  SharedXDisplay& operator=(const SharedXDisplay&) = delete;

 protected:
  // Takes ownership of `display`.
  explicit SharedXDisplay(Display* display);

 private:
  typedef std::map<int, std::vector<XEventHandler*> > EventHandlersMap;

  Display* display_;

  Mutex mutex_;

  EventHandlersMap event_handlers_ RTC_GUARDED_BY(mutex_);
};

}  // namespace webrtc

#endif  // MODULES_DESKTOP_CAPTURE_LINUX_X11_SHARED_X_DISPLAY_H_
