From aaf35b9f1f0ce49080f2a0b1e7943336b1ba6057 Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Sat, 4 May 2024 19:14:35 -0700 Subject: protocols: add hyprland_focus_grab_v1 implementation (#5850) * protocols: add hyprland_focus_grab_v1 implementation * protocols/focus_grab: fix keyboard focus staying on unlisted windows When creating a focus grab with layershell surfaces, the last active toplevel kept keyboard focus. * protocols/focus_grab: fix formatting * protocols/focus_grab: try to pick surface for keyboard focus * focus_grab: update keyboard focus to match spec * Revert "protocols/focus_grab: try to pick surface for keyboard focus" This reverts commit 090358d0d19cc65208641eaefa0a905e99145730. * protocols/focus_grab: fix issues and match new spec * kde-server-decoration: move to new impl * protocols/focus_grab: review fixup * Update hyprland-protocols --------- Co-authored-by: Vaxry --- src/protocols/FocusGrab.hpp | 77 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 src/protocols/FocusGrab.hpp (limited to 'src/protocols/FocusGrab.hpp') diff --git a/src/protocols/FocusGrab.hpp b/src/protocols/FocusGrab.hpp new file mode 100644 index 00000000..11c26774 --- /dev/null +++ b/src/protocols/FocusGrab.hpp @@ -0,0 +1,77 @@ +#pragma once + +#include "WaylandProtocol.hpp" +#include "hyprland-focus-grab-v1.hpp" +#include "macros.hpp" +#include +#include +#include + +class CFocusGrab; + +class CFocusGrabSurfaceState { + public: + CFocusGrabSurfaceState(CFocusGrab* grab, wlr_surface* surface); + ~CFocusGrabSurfaceState(); + + enum State { + PendingAddition, + PendingRemoval, + Comitted, + } state = PendingAddition; + + private: + DYNLISTENER(surfaceDestroy); +}; + +class CFocusGrab { + public: + CFocusGrab(SP resource_); + ~CFocusGrab(); + + bool good(); + bool isSurfaceComitted(wlr_surface* surface); + + void start(); + void finish(bool sendCleared); + + private: + void addSurface(wlr_surface* surface); + void removeSurface(wlr_surface* surface); + void eraseSurface(wlr_surface* surface); + void refocusKeyboard(); + void commit(); + + SP resource; + std::unordered_map> m_mSurfaces; + wlr_seat_pointer_grab m_sPointerGrab; + wlr_seat_keyboard_grab m_sKeyboardGrab; + wlr_seat_touch_grab m_sTouchGrab; + bool m_bGrabActive = false; + + DYNLISTENER(pointerGrabStarted); + DYNLISTENER(keyboardGrabStarted); + DYNLISTENER(touchGrabStarted); + friend class CFocusGrabSurfaceState; +}; + +class CFocusGrabProtocol : public IWaylandProtocol { + public: + CFocusGrabProtocol(const wl_interface* iface, const int& var, const std::string& name); + + virtual void bindManager(wl_client* client, void* data, uint32_t ver, uint32_t id); + + private: + void onManagerResourceDestroy(wl_resource* res); + void destroyGrab(CFocusGrab* grab); + void onCreateGrab(CHyprlandFocusGrabManagerV1* pMgr, uint32_t id); + + std::vector> m_vManagers; + std::vector> m_vGrabs; + + friend class CFocusGrab; +}; + +namespace PROTO { + inline UP focusGrab; +} -- cgit v1.2.3