From 9f7a96b997d90c4c188f3837e02859a25a05611e Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Sat, 14 Dec 2024 16:19:56 +0100 Subject: core/data: Use pointer focus for DnD operations (#8707) fixes #7737 --- src/managers/SeatManager.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'src/managers/SeatManager.cpp') diff --git a/src/managers/SeatManager.cpp b/src/managers/SeatManager.cpp index 08923dd7..b169faeb 100644 --- a/src/managers/SeatManager.cpp +++ b/src/managers/SeatManager.cpp @@ -14,8 +14,7 @@ CSeatManager::CSeatManager() { listeners.newSeatResource = PROTO::seat->events.newSeatResource.registerListener([this](std::any res) { onNewSeatResource(std::any_cast>(res)); }); } -CSeatManager::SSeatResourceContainer::SSeatResourceContainer(SP res) { - resource = res; +CSeatManager::SSeatResourceContainer::SSeatResourceContainer(SP res) : resource(res) { listeners.destroy = res->events.destroy.registerListener( [this](std::any data) { std::erase_if(g_pSeatManager->seatResources, [this](const auto& e) { return e->resource.expired() || e->resource == resource; }); }); } @@ -192,8 +191,12 @@ 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"); + if (PROTO::data->dndActive()) { + if (state.dndPointerFocus == surf) + return; + Debug::log(LOG, "[seatmgr] Refusing pointer focus during an active dnd, but setting dndPointerFocus"); + state.dndPointerFocus = surf; + events.dndPointerFocusChange.emit(); return; } @@ -221,6 +224,7 @@ void CSeatManager::setPointerFocus(SP surf, const Vector2D& auto lastPointerFocusResource = state.pointerFocusResource; + state.dndPointerFocus.reset(); state.pointerFocusResource.reset(); state.pointerFocus = surf; @@ -230,6 +234,8 @@ void CSeatManager::setPointerFocus(SP surf, const Vector2D& return; } + state.dndPointerFocus = surf; + auto client = surf->client(); for (auto const& r : seatResources | std::views::reverse) { if (r->resource->client() != client) @@ -252,6 +258,7 @@ void CSeatManager::setPointerFocus(SP surf, const Vector2D& listeners.pointerSurfaceDestroy = surf->events.destroy.registerListener([this](std::any d) { setPointerFocus(nullptr, {}); }); events.pointerFocusChange.emit(); + events.dndPointerFocusChange.emit(); } void CSeatManager::sendPointerMotion(uint32_t timeMs, const Vector2D& local) { -- cgit v1.2.3