From 1b5444494d26624804de8f479da3cffb5d480dc6 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Sun, 16 Jun 2024 16:23:35 +0200 Subject: [PATCH] seat/dnd: unfocus pointer from surfaces on dnd start GTK is speshyal and requires this for functioning properly. Ugh. It's technically not required by spec, f you gtk. Ref #6509 --- src/managers/SeatManager.cpp | 5 +++++ src/protocols/core/DataDevice.cpp | 9 +++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/managers/SeatManager.cpp b/src/managers/SeatManager.cpp index a58bca72..fc14f0fc 100644 --- a/src/managers/SeatManager.cpp +++ b/src/managers/SeatManager.cpp @@ -191,6 +191,11 @@ void CSeatManager::setPointerFocus(SP surf, const Vector2D& if (state.pointerFocus == surf) return; + if (PROTO::data->dndActive() && surf) { + Debug::log(LOG, "[seatmgr] Refusing pointer focus during an active dnd"); + return; + } + if (!mouse || !mouse->wlr()) { Debug::log(ERR, "BUG THIS: setPointerFocus without a valid mouse set"); return; diff --git a/src/protocols/core/DataDevice.cpp b/src/protocols/core/DataDevice.cpp index 86b372bf..03c51852 100644 --- a/src/protocols/core/DataDevice.cpp +++ b/src/protocols/core/DataDevice.cpp @@ -542,6 +542,11 @@ void CWLDataDeviceProtocol::initiateDrag(WP currentSource } }); + // unfocus the pointer from the surface, this is part of """standard""" wayland procedure and gtk will freak out if this isn't happening. + // BTW, the spec does NOT require this explicitly... + // Fuck you gtk. + g_pSeatManager->setPointerFocus(nullptr, {}); + // make a new offer, etc updateDrag(); } @@ -638,7 +643,7 @@ void CWLDataDeviceProtocol::completeDrag() { dnd.focusedDevice.reset(); dnd.currentSource.reset(); - g_pSeatManager->resendEnterEvents(); + g_pInputManager->simulateMouseMovement(); } void CWLDataDeviceProtocol::abortDrag() { @@ -657,7 +662,7 @@ void CWLDataDeviceProtocol::abortDrag() { dnd.focusedDevice.reset(); dnd.currentSource.reset(); - g_pSeatManager->resendEnterEvents(); + g_pInputManager->simulateMouseMovement(); } void CWLDataDeviceProtocol::renderDND(CMonitor* pMonitor, timespec* when) {