summaryrefslogtreecommitdiff
path: root/src/managers/SeatManager.cpp
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2024-12-14 16:19:56 +0100
committerGitHub <noreply@github.com>2024-12-14 16:19:56 +0100
commit9f7a96b997d90c4c188f3837e02859a25a05611e (patch)
treeea3fde67a04a5c9adbf2011b05c2056892ad2b1e /src/managers/SeatManager.cpp
parent3cba4ba44e7ba3cc8bb67ac71bc61245b5aca347 (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.cpp15
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) {