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
This commit is contained in:
Vaxry 2024-06-16 16:23:35 +02:00
parent 3eaf35f1e2
commit 1b5444494d
2 changed files with 12 additions and 2 deletions

View file

@ -191,6 +191,11 @@ void CSeatManager::setPointerFocus(SP<CWLSurfaceResource> surf, const Vector2D&
if (state.pointerFocus == surf) if (state.pointerFocus == surf)
return; return;
if (PROTO::data->dndActive() && surf) {
Debug::log(LOG, "[seatmgr] Refusing pointer focus during an active dnd");
return;
}
if (!mouse || !mouse->wlr()) { if (!mouse || !mouse->wlr()) {
Debug::log(ERR, "BUG THIS: setPointerFocus without a valid mouse set"); Debug::log(ERR, "BUG THIS: setPointerFocus without a valid mouse set");
return; return;

View file

@ -542,6 +542,11 @@ void CWLDataDeviceProtocol::initiateDrag(WP<CWLDataSourceResource> 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 // make a new offer, etc
updateDrag(); updateDrag();
} }
@ -638,7 +643,7 @@ void CWLDataDeviceProtocol::completeDrag() {
dnd.focusedDevice.reset(); dnd.focusedDevice.reset();
dnd.currentSource.reset(); dnd.currentSource.reset();
g_pSeatManager->resendEnterEvents(); g_pInputManager->simulateMouseMovement();
} }
void CWLDataDeviceProtocol::abortDrag() { void CWLDataDeviceProtocol::abortDrag() {
@ -657,7 +662,7 @@ void CWLDataDeviceProtocol::abortDrag() {
dnd.focusedDevice.reset(); dnd.focusedDevice.reset();
dnd.currentSource.reset(); dnd.currentSource.reset();
g_pSeatManager->resendEnterEvents(); g_pInputManager->simulateMouseMovement();
} }
void CWLDataDeviceProtocol::renderDND(CMonitor* pMonitor, timespec* when) { void CWLDataDeviceProtocol::renderDND(CMonitor* pMonitor, timespec* when) {