diff options
| author | Vaxry <43317083+vaxerski@users.noreply.github.com> | 2024-12-14 16:19:56 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-12-14 16:19:56 +0100 |
| commit | 9f7a96b997d90c4c188f3837e02859a25a05611e (patch) | |
| tree | ea3fde67a04a5c9adbf2011b05c2056892ad2b1e /src/managers/SeatManager.cpp | |
| parent | 3cba4ba44e7ba3cc8bb67ac71bc61245b5aca347 (diff) | |
core/data: Use pointer focus for DnD operations (#8707)
fixes #7737
Diffstat (limited to 'src/managers/SeatManager.cpp')
| -rw-r--r-- | src/managers/SeatManager.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
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<SP<CWLSeatResource>>(res)); }); } -CSeatManager::SSeatResourceContainer::SSeatResourceContainer(SP<CWLSeatResource> res) { - resource = res; +CSeatManager::SSeatResourceContainer::SSeatResourceContainer(SP<CWLSeatResource> 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<CWLSurfaceResource> 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<CWLSurfaceResource> surf, const Vector2D& auto lastPointerFocusResource = state.pointerFocusResource; + state.dndPointerFocus.reset(); state.pointerFocusResource.reset(); state.pointerFocus = surf; @@ -230,6 +234,8 @@ void CSeatManager::setPointerFocus(SP<CWLSurfaceResource> 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<CWLSurfaceResource> 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) { |
