#pragma once /* Implementations for: - wl_seat - wl_keyboard - wl_pointer - wl_touch */ #include #include #include #include "../WaylandProtocol.hpp" #include #include "wayland.hpp" #include "../../helpers/signal/Signal.hpp" #include "../../helpers/Vector2D.hpp" constexpr const char* HL_SEAT_NAME = "Hyprland"; class IKeyboard; class CWLPointerResource; class CWLKeyboardResource; class CWLTouchResource; class CWLSeatResource; class CWLTouchResource { public: CWLTouchResource(SP resource_, SP owner_); bool good(); void sendDown(wlr_surface* surface, uint32_t timeMs, int32_t id, const Vector2D& local); void sendUp(uint32_t timeMs, int32_t id); void sendMotion(uint32_t timeMs, int32_t id, const Vector2D& local); void sendFrame(); void sendCancel(); void sendShape(int32_t id, const Vector2D& shape); void sendOrientation(int32_t id, double angle); WP owner; private: SP resource; wlr_surface* currentSurface = nullptr; DYNLISTENER(surfaceDestroy); }; class CWLPointerResource { public: CWLPointerResource(SP resource_, SP owner_); bool good(); void sendEnter(wlr_surface* surface, const Vector2D& local); void sendLeave(); void sendMotion(uint32_t timeMs, const Vector2D& local); void sendButton(uint32_t timeMs, uint32_t button, wl_pointer_button_state state); void sendAxis(uint32_t timeMs, wl_pointer_axis axis, double value); void sendFrame(); void sendAxisSource(wl_pointer_axis_source source); void sendAxisStop(uint32_t timeMs, wl_pointer_axis axis); void sendAxisDiscrete(wl_pointer_axis axis, int32_t discrete); void sendAxisValue120(wl_pointer_axis axis, int32_t value120); void sendAxisRelativeDirection(wl_pointer_axis axis, wl_pointer_axis_relative_direction direction); WP owner; private: SP resource; wlr_surface* currentSurface = nullptr; DYNLISTENER(surfaceDestroy); }; class CWLKeyboardResource { public: CWLKeyboardResource(SP resource_, SP owner_); bool good(); void sendKeymap(SP keeb); void sendEnter(wlr_surface* surface); void sendLeave(); void sendKey(uint32_t timeMs, uint32_t key, wl_keyboard_key_state state); void sendMods(uint32_t depressed, uint32_t latched, uint32_t locked, uint32_t group); void repeatInfo(uint32_t rate, uint32_t delayMs); WP owner; private: SP resource; wlr_surface* currentSurface = nullptr; DYNLISTENER(surfaceDestroy); }; class CWLSeatResource { public: CWLSeatResource(SP resource_); ~CWLSeatResource(); void sendCapabilities(uint32_t caps); // uses IHID capabilities bool good(); wl_client* client(); std::vector> pointers; std::vector> keyboards; std::vector> touches; WP self; struct { CSignal destroy; } events; private: SP resource; wl_client* pClient = nullptr; }; class CWLSeatProtocol : public IWaylandProtocol { public: CWLSeatProtocol(const wl_interface* iface, const int& ver, const std::string& name); virtual void bindManager(wl_client* client, void* data, uint32_t ver, uint32_t id); struct { CSignal newSeatResource; // SP } events; private: void updateCapabilities(uint32_t caps); // in IHID caps void updateRepeatInfo(uint32_t rate, uint32_t delayMs); void updateKeymap(); void destroyResource(CWLSeatResource* resource); void destroyResource(CWLKeyboardResource* resource); void destroyResource(CWLTouchResource* resource); void destroyResource(CWLPointerResource* resource); // std::vector> m_vSeatResources; std::vector> m_vKeyboards; std::vector> m_vTouches; std::vector> m_vPointers; SP seatResourceForClient(wl_client* client); // uint32_t currentCaps = 0; friend class CWLSeatResource; friend class CWLKeyboardResource; friend class CWLTouchResource; friend class CWLPointerResource; friend class CSeatManager; }; namespace PROTO { inline UP seat; };