Skip to content

Commit

Permalink
seat: send events to all bound seats for a client
Browse files Browse the repository at this point in the history
some apps are legitimately braindead and bind wl_seat a bazillion times and expect the events to be sent to all of them

ref #6159
  • Loading branch information
vaxerski committed Jun 7, 2024
1 parent 40ce17b commit 41e0d9d
Showing 1 changed file with 96 additions and 47 deletions.
143 changes: 96 additions & 47 deletions src/managers/SeatManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,12 +110,6 @@ void CSeatManager::setKeyboardFocus(wlr_surface* surf) {
hyprListener_keyboardSurfaceDestroy.removeCallback();

if (state.keyboardFocusResource) {
// we will iterate over all bound wl_seat
// resources here, because some idiotic apps (e.g. those based on smithay)
// tend to bind wl_seat twice.
// I can't be arsed to actually pass all events to all seat resources, so we will
// only pass enter and leave.
// If you have an issue with that, fix your app.
auto client = state.keyboardFocusResource->client();
for (auto& s : seatResources) {
if (s->resource->client() != client)
Expand Down Expand Up @@ -163,23 +157,33 @@ void CSeatManager::sendKeyboardKey(uint32_t timeMs, uint32_t key, wl_keyboard_ke
if (!state.keyboardFocusResource)
return;

for (auto& k : state.keyboardFocusResource->keyboards) {
if (!k)
for (auto& s : seatResources) {
if (s->resource->client() != state.keyboardFocusResource->client())
continue;

k->sendKey(timeMs, key, state_);
for (auto& k : s->resource->keyboards) {
if (!k)
continue;

k->sendKey(timeMs, key, state_);
}
}
}

void CSeatManager::sendKeyboardMods(uint32_t depressed, uint32_t latched, uint32_t locked, uint32_t group) {
if (!state.keyboardFocusResource)
return;

for (auto& k : state.keyboardFocusResource->keyboards) {
if (!k)
for (auto& s : seatResources) {
if (s->resource->client() != state.keyboardFocusResource->client())
continue;

k->sendMods(depressed, latched, locked, group);
for (auto& k : s->resource->keyboards) {
if (!k)
continue;

k->sendMods(depressed, latched, locked, group);
}
}
}

Expand Down Expand Up @@ -249,11 +253,16 @@ void CSeatManager::sendPointerMotion(uint32_t timeMs, const Vector2D& local) {
if (!state.pointerFocusResource)
return;

for (auto& p : state.pointerFocusResource->pointers) {
if (!p)
for (auto& s : seatResources) {
if (s->resource->client() != state.pointerFocusResource->client())
continue;

p->sendMotion(timeMs, local);
for (auto& p : s->resource->pointers) {
if (!p)
continue;

p->sendMotion(timeMs, local);
}
}

lastLocalCoords = local;
Expand All @@ -263,11 +272,16 @@ void CSeatManager::sendPointerButton(uint32_t timeMs, uint32_t key, wl_pointer_b
if (!state.pointerFocusResource)
return;

for (auto& p : state.pointerFocusResource->pointers) {
if (!p)
for (auto& s : seatResources) {
if (s->resource->client() != state.pointerFocusResource->client())
continue;

p->sendButton(timeMs, key, state_);
for (auto& p : s->resource->pointers) {
if (!p)
continue;

p->sendButton(timeMs, key, state_);
}
}
}

Expand All @@ -282,11 +296,16 @@ void CSeatManager::sendPointerFrame(WP<CWLSeatResource> pResource) {
if (!pResource)
return;

for (auto& p : pResource->pointers) {
if (!p)
for (auto& s : seatResources) {
if (s->resource->client() != state.pointerFocusResource->client())
continue;

p->sendFrame();
for (auto& p : s->resource->pointers) {
if (!p)
continue;

p->sendFrame();
}
}
}

Expand All @@ -295,21 +314,26 @@ void CSeatManager::sendPointerAxis(uint32_t timeMs, wl_pointer_axis axis, double
if (!state.pointerFocusResource)
return;

for (auto& p : state.pointerFocusResource->pointers) {
if (!p)
for (auto& s : seatResources) {
if (s->resource->client() != state.pointerFocusResource->client())
continue;

p->sendAxis(timeMs, axis, value);
p->sendAxisSource(source);
p->sendAxisRelativeDirection(axis, relative);
for (auto& p : s->resource->pointers) {
if (!p)
continue;

if (source == 0) {
p->sendAxisValue120(axis, value120);
p->sendAxisDiscrete(axis, discrete);
}
p->sendAxis(timeMs, axis, value);
p->sendAxisSource(source);
p->sendAxisRelativeDirection(axis, relative);

if (value == 0)
p->sendAxisStop(timeMs, axis);
if (source == 0) {
p->sendAxisValue120(axis, value120);
p->sendAxisDiscrete(axis, discrete);
}

if (value == 0)
p->sendAxisStop(timeMs, axis);
}
}
}

Expand Down Expand Up @@ -370,59 +394,84 @@ void CSeatManager::sendTouchMotion(uint32_t timeMs, int32_t id, const Vector2D&
if (!state.touchFocusResource)
return;

for (auto& t : state.touchFocusResource->touches) {
if (!t)
for (auto& s : seatResources) {
if (s->resource->client() != state.touchFocusResource->client())
continue;

t->sendMotion(timeMs, id, local);
for (auto& t : s->resource->touches) {
if (!t)
continue;

t->sendMotion(timeMs, id, local);
}
}
}

void CSeatManager::sendTouchFrame() {
if (!state.touchFocusResource)
return;

for (auto& t : state.touchFocusResource->touches) {
if (!t)
for (auto& s : seatResources) {
if (s->resource->client() != state.touchFocusResource->client())
continue;

t->sendFrame();
for (auto& t : s->resource->touches) {
if (!t)
continue;

t->sendFrame();
}
}
}

void CSeatManager::sendTouchCancel() {
if (!state.touchFocusResource)
return;

for (auto& t : state.touchFocusResource->touches) {
if (!t)
for (auto& s : seatResources) {
if (s->resource->client() != state.touchFocusResource->client())
continue;

t->sendCancel();
for (auto& t : s->resource->touches) {
if (!t)
continue;

t->sendCancel();
}
}
}

void CSeatManager::sendTouchShape(int32_t id, const Vector2D& shape) {
if (!state.touchFocusResource)
return;

for (auto& t : state.touchFocusResource->touches) {
if (!t)
for (auto& s : seatResources) {
if (s->resource->client() != state.touchFocusResource->client())
continue;

t->sendShape(id, shape);
for (auto& t : s->resource->touches) {
if (!t)
continue;

t->sendShape(id, shape);
}
}
}

void CSeatManager::sendTouchOrientation(int32_t id, double angle) {
if (!state.touchFocusResource)
return;

for (auto& t : state.touchFocusResource->touches) {
if (!t)
for (auto& s : seatResources) {
if (s->resource->client() != state.touchFocusResource->client())
continue;

t->sendOrientation(id, angle);
for (auto& t : s->resource->touches) {
if (!t)
continue;

t->sendOrientation(id, angle);
}
}
}

Expand Down

0 comments on commit 41e0d9d

Please sign in to comment.