Deskflow 1.24.0.365
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) 2025 Deskflow Developers
4 * SPDX-FileCopyrightText: (C) 2024 Symless Ltd.
5 * SPDX-FileCopyrightText: (C) 2022 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 <glib.h>
15#include <libportal/inputcapture.h>
16#include <libportal/portal.h>
17
18namespace deskflow {
19
21{
22public:
23 PortalInputCapture(EiScreen *screen, IEventQueue *events);
25 void enable();
26 void disable();
27 void release();
28 void release(double x, double y);
29 bool isActive() const
30 {
31 return m_isActive;
32 }
33
34private:
35 void glibThread(const void *);
36 gboolean timeoutHandler() const;
37 gboolean initSession();
38 void handleInitSession(GObject *object, GAsyncResult *res);
39 void handleSetPointerBarriers(const GObject *object, GAsyncResult *res);
40 void handleSessionClosed(XdpSession *session);
41 void handleDisabled(const XdpInputCaptureSession *session, const GVariant *option);
42 void handleActivated(const XdpInputCaptureSession *session, const std::uint32_t activationId, GVariant *options);
43 void
44 handleDeactivated(const XdpInputCaptureSession *session, const std::uint32_t activationId, const GVariant *options);
45 void handleZonesChanged(XdpInputCaptureSession *session, const GVariant *options);
46
48 static void sessionClosed(XdpSession *session, const gpointer data)
49 {
50 static_cast<PortalInputCapture *>(data)->handleSessionClosed(session);
51 }
52 static void disabled(const XdpInputCaptureSession *session, const GVariant *options, const gpointer data)
53 {
54 static_cast<PortalInputCapture *>(data)->handleDisabled(session, options);
55 }
56 static void activated(
57 const XdpInputCaptureSession *session, const std::uint32_t activationId, GVariant *options, const gpointer data
58 )
59 {
60 static_cast<PortalInputCapture *>(data)->handleActivated(session, activationId, options);
61 }
62 static void deactivated(
63 const XdpInputCaptureSession *session, const std::uint32_t activationId, const GVariant *options,
64 const gpointer data
65 )
66 {
67 static_cast<PortalInputCapture *>(data)->handleDeactivated(session, activationId, options);
68 }
69 static void zonesChanged(XdpInputCaptureSession *session, const GVariant *options, const gpointer data)
70 {
71 static_cast<PortalInputCapture *>(data)->handleZonesChanged(session, options);
72 }
73
74private:
75 enum class Signal : uint8_t
76 {
77 SessionClosed,
78 Disabled,
79 Activated,
80 Deactivated,
81 ZonesChanged
82 };
83
84 EiScreen *m_screen = nullptr;
85 IEventQueue *m_events = nullptr;
86
87 Thread *m_glibThread;
88 GMainLoop *m_glibMainLoop = nullptr;
89
90 XdpPortal *m_portal = nullptr;
91 XdpInputCaptureSession *m_session = nullptr;
92
93 std::map<Signal, gulong> m_signals = {
94 {Signal::SessionClosed, 0},
95 {Signal::Disabled, 0},
96 {Signal::Activated, 0},
97 {Signal::Deactivated, 0},
98 {Signal::ZonesChanged, 0}
99 };
100
101 bool m_enabled = false;
102 bool m_isActive = false;
103 std::uint32_t m_activationId = 0;
104
105 std::vector<XdpInputCapturePointerBarrier *> m_barriers;
106};
107
108} // namespace deskflow
static int void FAR * data
Definition ArchNetworkWinsock.cpp:35
int y
Definition ServerConfig.cpp:25
int x
Definition ServerConfig.cpp:24
Event queue interface.
Definition IEventQueue.h:29
Implementation of IPlatformScreen for X11.
Definition EiScreen.h:32
Definition PortalInputCapture.h:21
PortalInputCapture(EiScreen *screen, IEventQueue *events)
Definition PortalInputCapture.cpp:20
bool isActive() const
Definition PortalInputCapture.h:29
void enable()
Definition PortalInputCapture.cpp:168
~PortalInputCapture()
Definition PortalInputCapture.cpp:35
void release()
Definition PortalInputCapture.cpp:186
void disable()
Definition PortalInputCapture.cpp:177
Definition EventTypes.h:11