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)38static inline wl_registry *rawPointer(WlRegistry *p) { 39 return p ? static_cast<wl_registry *>(*p) : nullptr; 40 } 41 } // namespace fcitx::wayland 42 #endif 43