#pragma once #include #include "../helpers/WLListener.hpp" #include "../macros.hpp" #include "../helpers/signal/Signal.hpp" #include "../helpers/Vector2D.hpp" #include constexpr size_t MAX_SERIAL_STORE_LEN = 100; struct wlr_surface; class CWLSeatResource; class IPointer; class IKeyboard; class CSeatManager { public: CSeatManager(); void updateCapabilities(uint32_t capabilities); // in IHID caps void setMouse(SP mouse); void setKeyboard(SP keeb); void setKeyboardFocus(wlr_surface* surf); void sendKeyboardKey(uint32_t timeMs, uint32_t key, wl_keyboard_key_state state); void sendKeyboardMods(uint32_t depressed, uint32_t latched, uint32_t locked, uint32_t group); void setPointerFocus(wlr_surface* surf, const Vector2D& local); void sendPointerMotion(uint32_t timeMs, const Vector2D& local); void sendPointerButton(uint32_t timeMs, uint32_t key, wl_pointer_button_state state); void sendPointerFrame(); void sendPointerAxis(uint32_t timeMs, wl_pointer_axis axis, double value, int32_t discrete, wl_pointer_axis_source source, wl_pointer_axis_relative_direction relative); void sendTouchDown(wlr_surface* surf, uint32_t timeMs, int32_t id, const Vector2D& local); void sendTouchUp(uint32_t timeMs, int32_t id); void sendTouchMotion(uint32_t timeMs, int32_t id, const Vector2D& local); void sendTouchFrame(); void sendTouchCancel(); void sendTouchShape(int32_t id, const Vector2D& shape); void sendTouchOrientation(int32_t id, double angle); uint32_t nextSerial(SP seatResource); // pops the serial if it was valid, meaning it is consumed. bool serialValid(SP seatResource, uint32_t serial); void onSetCursor(SP seatResource, uint32_t serial, wlr_surface* surf, const Vector2D& hotspot); SP seatResourceForClient(wl_client* client); struct { wlr_surface* keyboardFocus = nullptr; WP keyboardFocusResource; wlr_surface* pointerFocus = nullptr; WP pointerFocusResource; wlr_surface* touchFocus = nullptr; WP touchFocusResource; } state; struct SSetCursorEvent { wlr_surface* surf = nullptr; Vector2D hotspot; }; struct { CSignal keyboardFocusChange; CSignal pointerFocusChange; CSignal touchFocusChange; CSignal setCursor; // SSetCursorEvent } events; // do not write to directly, use set... WP mouse; WP keyboard; private: struct SSeatResourceContainer { SSeatResourceContainer(SP); WP resource; std::vector serials; // old -> new struct { CHyprSignalListener destroy; } listeners; }; std::vector> seatResources; void onNewSeatResource(SP resource); SP containerForResource(SP seatResource); struct { CHyprSignalListener newSeatResource; } listeners; DYNLISTENER(keyboardSurfaceDestroy); DYNLISTENER(pointerSurfaceDestroy); DYNLISTENER(touchSurfaceDestroy); friend struct SSeatResourceContainer; }; inline UP g_pSeatManager;