Deskflow 1.26.0.314
Keyboard and mouse sharing utility
Loading...
Searching...
No Matches
PortalInputCapture.h
Go to the documentation of this file.
1/*
2 * Deskflow -- mouse and keyboard sharing utility
3 * SPDX-FileCopyrightText: (C) 2024 - 2026 Deskflow Developers
4 * SPDX-FileCopyrightText: (C) 2024, 2026 Synergy App Ltd
5 * SPDX-FileCopyrightText: (C) 2022, 2026 Red Hat, Inc.
6 * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
7 */
8
9#pragma once
10
11#include "mt/Thread.h"
12#include "platform/EiScreen.h"
13
14#include <QByteArray>
15
16#include <glib.h>
17#include <libportal/inputcapture.h>
18#include <libportal/portal.h>
19
20#include <cstdint>
21#include <map>
22#include <utility>
23#include <vector>
24
25namespace deskflow {
26
27class EiClipboard;
28
30{
31public:
32 PortalInputCapture(EiScreen *screen, IEventQueue *events);
34
35 // Get the clipboard for the specified ID
37 void enable();
38 void disable();
39 void release();
40 void release(double x, double y);
41 bool isActive() const
42 {
43 return m_isActive;
44 }
45
46private:
47 void glibThread(const void *);
48 gboolean timeoutHandler() const;
49 gboolean initSession();
50 void setupSession(XdpInputCaptureSession *session);
51 void handleStart(GObject *object, GAsyncResult *res);
52 void handleInitSession(GObject *object, GAsyncResult *res);
53 void handleSetPointerBarriers(const GObject *object, GAsyncResult *res);
54 void handleSessionClosed(XdpSession *session);
55 void handleDisabled(const XdpInputCaptureSession *session, const GVariant *option);
56 void handleActivated(const XdpInputCaptureSession *session, const std::uint32_t activationId, GVariant *options);
57 void
58 handleDeactivated(const XdpInputCaptureSession *session, const std::uint32_t activationId, const GVariant *options);
59 void handleZonesChanged(XdpInputCaptureSession *session, const GVariant *options);
60
61 void handleSelectionTransfer(XdpSession *session, const char *mimeType, uint32_t serial) const;
62 void readClipboardSelection(XdpSession *session) const;
63 void claimClipboardOwnership(XdpSession *session) const;
64
66 static void sessionClosed(XdpSession *session, const gpointer data)
67 {
68 static_cast<PortalInputCapture *>(data)->handleSessionClosed(session);
69 }
70 static void disabled(const XdpInputCaptureSession *session, const GVariant *options, const gpointer data)
71 {
72 static_cast<PortalInputCapture *>(data)->handleDisabled(session, options);
73 }
74 static void activated(
75 const XdpInputCaptureSession *session, const std::uint32_t activationId, GVariant *options, const gpointer data
76 )
77 {
78 static_cast<PortalInputCapture *>(data)->handleActivated(session, activationId, options);
79 }
80 static void deactivated(
81 const XdpInputCaptureSession *session, const std::uint32_t activationId, const GVariant *options,
82 const gpointer data
83 )
84 {
85 static_cast<PortalInputCapture *>(data)->handleDeactivated(session, activationId, options);
86 }
87 static void zonesChanged(XdpInputCaptureSession *session, const GVariant *options, const gpointer data)
88 {
89 static_cast<PortalInputCapture *>(data)->handleZonesChanged(session, options);
90 }
91 static void selectionTransfer(XdpSession *session, const char *mimeType, uint32_t serial, const gpointer data)
92 {
93 static_cast<PortalInputCapture *>(data)->handleSelectionTransfer(session, mimeType, serial);
94 }
95
96 enum class Signal : uint8_t
97 {
98 SessionClosed,
99 Disabled,
100 Activated,
101 Deactivated,
102 ZonesChanged,
103
104 // Clipboard signals
105 SelectionTransfer,
106 };
107
108 enum class BarrierSide : uint8_t
109 {
110 Left,
111 Right,
112 Top,
113 Bottom
114 };
115
116 struct BarrierInfo
117 {
118 guint id = 0;
119 BarrierSide side = BarrierSide::Left;
120 gint x = 0;
121 gint y = 0;
122 guint width = 0;
123 guint height = 0;
124 gint x1 = 0;
125 gint y1 = 0;
126 gint x2 = 0;
127 gint y2 = 0;
128 };
129
130 struct Bounds
131 {
132 gint left = 0;
133 gint top = 0;
134 gint right = 0;
135 gint bottom = 0;
136 };
137
138 static const char *barrierSideName(BarrierSide side);
139 static int
140 scaleCoordinateBetweenRanges(double value, int sourceMin, int sourceMax, int destinationMin, int destinationMax);
141 bool getPortalBounds(Bounds &bounds) const;
142 bool getClosestReleaseBarrier(
143 double x, double y, int screenLeft, int screenTop, int screenRight, int screenBottom, const Bounds &portalBounds,
144 BarrierInfo &barrier
145 ) const;
146 std::pair<int, int> mapPortalActivationToScreenPosition(guint barrierId, double rawX, double rawY) const;
147 std::pair<double, double> mapPortalReleasePosition(double x, double y) const;
148 void addBarrier(guint id, BarrierSide side, gint zoneX, gint zoneY, guint zoneWidth, guint zoneHeight);
149
150 EiScreen *m_screen = nullptr;
151 IEventQueue *m_events = nullptr;
152 int m_portalVersion = 0;
153
154 Thread *m_glibThread;
155 GMainLoop *m_glibMainLoop = nullptr;
156
157 XdpPortal *m_portal = nullptr;
158 XdpInputCaptureSession *m_session = nullptr;
159
160 std::map<Signal, gulong> m_signals = {
161 {Signal::SessionClosed, 0}, {Signal::Disabled, 0}, {Signal::Activated, 0},
162 {Signal::Deactivated, 0}, {Signal::ZonesChanged, 0},
163
164 {Signal::SelectionTransfer, 0},
165 };
166
167 bool m_enabled = false;
168 bool m_isActive = false;
169 std::uint32_t m_activationId = 0;
170
171 std::vector<XdpInputCapturePointerBarrier *> m_barriers;
172 std::vector<BarrierInfo> m_barrierInfo;
173
174 EiClipboard *m_clipboard = nullptr;
175};
176
177} // namespace deskflow
static int void FAR * data
Definition ArchNetworkWinsock.cpp:35
uint8_t ClipboardID
Clipboard ID.
Definition ClipboardTypes.h:16
int y
Definition ServerConfig.cpp:24
int x
Definition ServerConfig.cpp:23
Event queue interface.
Definition IEventQueue.h:29
EI/Portal clipboard implementation.
Definition EiClipboard.h:21
Implementation of IPlatformScreen for X11.
Definition EiScreen.h:36
Definition PortalInputCapture.h:30
EiClipboard * getClipboard(ClipboardID id) const
Definition PortalInputCapture.cpp:229
PortalInputCapture(EiScreen *screen, IEventQueue *events)
Definition PortalInputCapture.cpp:172
bool isActive() const
Definition PortalInputCapture.h:41
void enable()
Definition PortalInputCapture.cpp:638
~PortalInputCapture()
Definition PortalInputCapture.cpp:191
void release()
Definition PortalInputCapture.cpp:656
void disable()
Definition PortalInputCapture.cpp:647
Definition DaemonApp.h:18