1 #ifndef WL_REGISTRY
2 #define WL_REGISTRY
3 #include <memory>
4 #include <wayland-client.h>
5 #include "fcitx-utils/signals.h"
6 namespace fcitx::wayland {
7 class WlRegistry final {
8 public:
9     static constexpr const char *interface = "wl_registry";
10     static constexpr const wl_interface *const wlInterface =
11         &wl_registry_interface;
12     static constexpr const uint32_t version = 1;
13     typedef wl_registry wlType;
14     operator wl_registry *() { return data_.get(); }
15     WlRegistry(wlType *data);
16     WlRegistry(WlRegistry &&other) noexcept = delete;
17     WlRegistry &operator=(WlRegistry &&other) noexcept = delete;
actualVersion()18     auto actualVersion() const { return version_; }
userData()19     void *userData() const { return userData_; }
setUserData(void * userData)20     void setUserData(void *userData) { userData_ = userData; }
21     template <typename T>
bind(uint32_t name,uint32_t requested_version)22     T *bind(uint32_t name, uint32_t requested_version) {
23         return new T(static_cast<typename T::wlType *>(
24             wl_registry_bind(*this, name, T::wlInterface, requested_version)));
25     }
global()26     auto &global() { return globalSignal_; }
globalRemove()27     auto &globalRemove() { return globalRemoveSignal_; }
28 
29 private:
30     static void destructor(wl_registry *);
31     static const struct wl_registry_listener listener;
32     fcitx::Signal<void(uint32_t, const char *, uint32_t)> globalSignal_;
33     fcitx::Signal<void(uint32_t)> globalRemoveSignal_;
34     uint32_t version_;
35     void *userData_ = nullptr;
36     UniqueCPtr<wl_registry, &destructor> data_;
37 };
rawPointer(WlRegistry * p)38 static inline wl_registry *rawPointer(WlRegistry *p) {
39     return p ? static_cast<wl_registry *>(*p) : nullptr;
40 }
41 } // namespace fcitx::wayland
42 #endif
43