refactor: PortalInputCapture use std::map to hold signals and enum class as the key

fixes: InputCapturePortal crash in debug builds
This commit is contained in:
sithlord48 2025-06-20 11:16:55 -04:00 committed by Nick Bolton
parent 20bc88eb1f
commit a7a54ad8a7
2 changed files with 33 additions and 30 deletions

View file

@ -16,21 +16,10 @@
namespace deskflow { namespace deskflow {
enum signals
{
SESSION_CLOSED,
DISABLED,
ACTIVATED,
DEACTIVATED,
ZONES_CHANGED,
_N_SIGNALS,
};
PortalInputCapture::PortalInputCapture(EiScreen *screen, IEventQueue *events) PortalInputCapture::PortalInputCapture(EiScreen *screen, IEventQueue *events)
: m_screen{screen}, : m_screen{screen},
m_events{events}, m_events{events},
m_portal{xdp_portal_new()}, m_portal{xdp_portal_new()}
m_signals{_N_SIGNALS}
{ {
m_glibMainLoop = g_main_loop_new(nullptr, true); m_glibMainLoop = g_main_loop_new(nullptr, true);
m_glibThread = new Thread(new TMethodJob<PortalInputCapture>(this, &PortalInputCapture::glibThread)); m_glibThread = new Thread(new TMethodJob<PortalInputCapture>(this, &PortalInputCapture::glibThread));
@ -55,12 +44,13 @@ PortalInputCapture::~PortalInputCapture()
} }
if (m_session) { if (m_session) {
XdpSession *parent_session = xdp_input_capture_session_get_session(m_session); using enum Signal;
g_signal_handler_disconnect(G_OBJECT(parent_session), m_signals[SESSION_CLOSED]); XdpSession *parentSession = xdp_input_capture_session_get_session(m_session);
g_signal_handler_disconnect(m_session, m_signals[DISABLED]); g_signal_handler_disconnect(G_OBJECT(parentSession), m_signals.at(SessionClosed));
g_signal_handler_disconnect(m_session, m_signals[ACTIVATED]); g_signal_handler_disconnect(m_session, m_signals.at(Disabled));
g_signal_handler_disconnect(m_session, m_signals[DEACTIVATED]); g_signal_handler_disconnect(m_session, m_signals.at(Activated));
g_signal_handler_disconnect(m_session, m_signals[ZONES_CHANGED]); g_signal_handler_disconnect(m_session, m_signals.at(Deactivated));
g_signal_handler_disconnect(m_session, m_signals.at(ZonesChanged));
g_object_unref(m_session); g_object_unref(m_session);
} }
@ -109,8 +99,8 @@ void PortalInputCapture::handleSessionClosed(XdpSession *session)
g_main_loop_quit(m_glibMainLoop); g_main_loop_quit(m_glibMainLoop);
m_events->addEvent(EventTypes::Quit); m_events->addEvent(EventTypes::Quit);
g_signal_handler_disconnect(session, m_signals[SESSION_CLOSED]); g_signal_handler_disconnect(session, m_signals.at(Signal::SessionClosed));
m_signals[SESSION_CLOSED] = 0; m_signals.at(Signal::SessionClosed) = 0;
} }
void PortalInputCapture::handleInitSession(GObject *object, GAsyncResult *res) void PortalInputCapture::handleInitSession(GObject *object, GAsyncResult *res)
@ -145,15 +135,13 @@ void PortalInputCapture::handleInitSession(GObject *object, GAsyncResult *res)
// Socket ownership is transferred to the EiScreen // Socket ownership is transferred to the EiScreen
m_events->addEvent(Event(EventTypes::EIConnected, m_screen->getEventTarget(), EiScreen::EiConnectInfo::alloc(fd))); m_events->addEvent(Event(EventTypes::EIConnected, m_screen->getEventTarget(), EiScreen::EiConnectInfo::alloc(fd)));
// FIXME: the lambda trick doesn't work here for unknown reasons, we need using enum Signal;
// the static function XdpSession *parentSession = xdp_input_capture_session_get_session(session);
m_signals[DISABLED] = g_signal_connect(G_OBJECT(session), "disabled", G_CALLBACK(disabled), this); m_signals.at(Disabled) = g_signal_connect(G_OBJECT(session), "disabled", G_CALLBACK(disabled), this);
m_signals[ACTIVATED] = g_signal_connect(G_OBJECT(m_session), "activated", G_CALLBACK(activated), this); m_signals.at(Activated) = g_signal_connect(G_OBJECT(m_session), "activated", G_CALLBACK(activated), this);
m_signals[DEACTIVATED] = g_signal_connect(G_OBJECT(m_session), "deactivated", G_CALLBACK(deactivated), this); m_signals.at(Deactivated) = g_signal_connect(G_OBJECT(m_session), "deactivated", G_CALLBACK(deactivated), this);
m_signals[ZONES_CHANGED] = g_signal_connect(G_OBJECT(m_session), "zones-changed", G_CALLBACK(zonesChanged), this); m_signals.at(ZonesChanged) = g_signal_connect(G_OBJECT(m_session), "zones-changed", G_CALLBACK(zonesChanged), this);
XdpSession *parent_session = xdp_input_capture_session_get_session(session); m_signals.at(SessionClosed) = g_signal_connect(G_OBJECT(parentSession), "closed", G_CALLBACK(sessionClosed), this);
m_signals[SESSION_CLOSED] = g_signal_connect(G_OBJECT(parent_session), "closed", G_CALLBACK(sessionClosed), this);
handleZonesChanged(m_session, nullptr); handleZonesChanged(m_session, nullptr);
} }

View file

@ -71,6 +71,15 @@ private:
int fakeEisFd() const; int fakeEisFd() const;
private: private:
enum class Signal : uint8_t
{
SessionClosed,
Disabled,
Activated,
Deactivated,
ZonesChanged
};
EiScreen *m_screen = nullptr; EiScreen *m_screen = nullptr;
IEventQueue *m_events = nullptr; IEventQueue *m_events = nullptr;
@ -80,7 +89,13 @@ private:
XdpPortal *m_portal = nullptr; XdpPortal *m_portal = nullptr;
XdpInputCaptureSession *m_session = nullptr; XdpInputCaptureSession *m_session = nullptr;
std::vector<guint> m_signals; std::map<Signal, guint> m_signals = {
{Signal::SessionClosed, 0},
{Signal::Disabled, 0},
{Signal::Activated, 0},
{Signal::Deactivated, 0},
{Signal::ZonesChanged, 0}
};
bool m_enabled = false; bool m_enabled = false;
bool m_isActive = false; bool m_isActive = false;