refactor(wayland): factor portal barrier creation

Move repeated InputCapture pointer barrier construction into a helper and add a small side-to-name utility for logging. This keeps the existing barrier geometry and activation handling unchanged while making later barrier metadata changes easier to review.
This commit is contained in:
extra-salad 2026-05-13 01:18:18 +01:00 committed by Nick Bolton
parent babef9c307
commit be3cc0ff7a
2 changed files with 82 additions and 43 deletions

View file

@ -1,6 +1,6 @@
/* /*
* Deskflow -- mouse and keyboard sharing utility * Deskflow -- mouse and keyboard sharing utility
* SPDX-FileCopyrightText: (C) 2025 Deskflow Developers * SPDX-FileCopyrightText: (C) 2025 - 2026 Deskflow Developers
* SPDX-FileCopyrightText: (C) 2024 Symless Ltd. * SPDX-FileCopyrightText: (C) 2024 Symless Ltd.
* SPDX-FileCopyrightText: (C) 2022 Red Hat, Inc. * SPDX-FileCopyrightText: (C) 2022 Red Hat, Inc.
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
@ -21,6 +21,24 @@
namespace deskflow { namespace deskflow {
const char *PortalInputCapture::barrierSideName(BarrierSide side)
{
using enum BarrierSide;
switch (side) {
case Left:
return "left";
case Right:
return "right";
case Top:
return "top";
case Bottom:
return "bottom";
}
return "unknown";
}
PortalInputCapture::PortalInputCapture(EiScreen *screen, IEventQueue *events) PortalInputCapture::PortalInputCapture(EiScreen *screen, IEventQueue *events)
: m_screen{screen}, : m_screen{screen},
m_events{events}, m_events{events},
@ -182,6 +200,49 @@ void PortalInputCapture::handleSetPointerBarriers(const GObject *, GAsyncResult
enable(); enable();
} }
void PortalInputCapture::addBarrier(
guint id, BarrierSide side, gint zoneX, gint zoneY, guint zoneWidth, guint zoneHeight
)
{
gint x1 = 0;
gint x2 = 0;
gint y1 = 0;
gint y2 = 0;
using enum BarrierSide;
switch (side) {
case Left:
x1 = zoneX;
y1 = zoneY;
x2 = zoneX;
y2 = zoneY + static_cast<gint>(zoneHeight) - 1;
break;
case Right:
x1 = zoneX + static_cast<gint>(zoneWidth);
y1 = zoneY;
x2 = x1;
y2 = zoneY + static_cast<gint>(zoneHeight) - 1;
break;
case Top:
x1 = zoneX;
y1 = zoneY;
x2 = zoneX + static_cast<gint>(zoneWidth) - 1;
y2 = zoneY;
break;
case Bottom:
x1 = zoneX;
y1 = zoneY + static_cast<gint>(zoneHeight);
x2 = zoneX + static_cast<gint>(zoneWidth) - 1;
y2 = y1;
break;
}
LOG_DEBUG("barrier (%s) %u at %d,%d-%d,%d", barrierSideName(side), id, x1, y1, x2, y2);
m_barriers.push_back(XDP_INPUT_CAPTURE_POINTER_BARRIER(
g_object_new(XDP_TYPE_INPUT_CAPTURE_POINTER_BARRIER, "id", id, "x1", x1, "y1", y1, "x2", x2, "y2", y2, nullptr)
));
}
gboolean PortalInputCapture::initSession() gboolean PortalInputCapture::initSession()
{ {
LOG_DEBUG("setting up input capture session"); LOG_DEBUG("setting up input capture session");
@ -364,59 +425,22 @@ void PortalInputCapture::handleZonesChanged(XdpInputCaptureSession *session, con
LOG_DEBUG("input capture zone, %dx%d@%d,%d", w, h, x, y); LOG_DEBUG("input capture zone, %dx%d@%d,%d", w, h, x, y);
int x1;
int x2;
int y1;
int y2;
auto id = 0; auto id = 0;
if (activeSides & static_cast<int>(LeftMask)) { if (activeSides & static_cast<int>(LeftMask)) {
id++; addBarrier(++id, BarrierSide::Left, x, y, w, h);
x1 = x;
y1 = y;
x2 = x;
y2 = y + h - 1;
LOG_DEBUG("barrier (left) %zd at %d,%d-%d,%d", id, x1, y1, x2, y2);
m_barriers.push_back(XDP_INPUT_CAPTURE_POINTER_BARRIER(g_object_new(
XDP_TYPE_INPUT_CAPTURE_POINTER_BARRIER, "id", id, "x1", x1, "y1", y1, "x2", x2, "y2", y2, nullptr
)));
} }
if (activeSides & static_cast<int>(RightMask)) { if (activeSides & static_cast<int>(RightMask)) {
id++; addBarrier(++id, BarrierSide::Right, x, y, w, h);
x1 = x + w;
y1 = y;
x2 = x + w;
y2 = y + h - 1;
LOG_DEBUG("barrier (right) %zd at %d,%d-%d,%d", id, x1, y1, x2, y2);
m_barriers.push_back(XDP_INPUT_CAPTURE_POINTER_BARRIER(g_object_new(
XDP_TYPE_INPUT_CAPTURE_POINTER_BARRIER, "id", id, "x1", x1, "y1", y1, "x2", x2, "y2", y2, nullptr
)));
} }
if (activeSides & static_cast<int>(TopMask)) { if (activeSides & static_cast<int>(TopMask)) {
id++; addBarrier(++id, BarrierSide::Top, x, y, w, h);
x1 = x;
y1 = y;
x2 = x + w - 1;
y2 = y;
LOG_DEBUG("barrier (top) %zd at %d,%d-%d,%d", id, x1, y1, x2, y2);
m_barriers.push_back(XDP_INPUT_CAPTURE_POINTER_BARRIER(g_object_new(
XDP_TYPE_INPUT_CAPTURE_POINTER_BARRIER, "id", id, "x1", x1, "y1", y1, "x2", x2, "y2", y2, nullptr
)));
} }
if (activeSides & static_cast<int>(BottomMask)) { if (activeSides & static_cast<int>(BottomMask)) {
id++; addBarrier(++id, BarrierSide::Bottom, x, y, w, h);
x1 = x;
y1 = y + h;
x2 = x + w - 1;
y2 = y + h;
LOG_DEBUG("barrier (bottom) %zd at %d,%d-%d,%d", id, x1, y1, x2, y2);
m_barriers.push_back(XDP_INPUT_CAPTURE_POINTER_BARRIER(g_object_new(
XDP_TYPE_INPUT_CAPTURE_POINTER_BARRIER, "id", id, "x1", x1, "y1", y1, "x2", x2, "y2", y2, nullptr
)));
} }
zones = zones->next; zones = zones->next;
} }

View file

@ -1,6 +1,6 @@
/* /*
* Deskflow -- mouse and keyboard sharing utility * Deskflow -- mouse and keyboard sharing utility
* SPDX-FileCopyrightText: (C) 2025 Deskflow Developers * SPDX-FileCopyrightText: (C) 2025 - 2026 Deskflow Developers
* SPDX-FileCopyrightText: (C) 2024 Symless Ltd. * SPDX-FileCopyrightText: (C) 2024 Symless Ltd.
* SPDX-FileCopyrightText: (C) 2022 Red Hat, Inc. * SPDX-FileCopyrightText: (C) 2022 Red Hat, Inc.
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
@ -15,6 +15,10 @@
#include <libportal/inputcapture.h> #include <libportal/inputcapture.h>
#include <libportal/portal.h> #include <libportal/portal.h>
#include <cstdint>
#include <map>
#include <vector>
namespace deskflow { namespace deskflow {
class PortalInputCapture class PortalInputCapture
@ -83,6 +87,17 @@ private:
ZonesChanged ZonesChanged
}; };
enum class BarrierSide : uint8_t
{
Left,
Right,
Top,
Bottom
};
static const char *barrierSideName(BarrierSide side);
void addBarrier(guint id, BarrierSide side, gint zoneX, gint zoneY, guint zoneWidth, guint zoneHeight);
EiScreen *m_screen = nullptr; EiScreen *m_screen = nullptr;
IEventQueue *m_events = nullptr; IEventQueue *m_events = nullptr;
int m_portalVersion = 0; int m_portalVersion = 0;