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:
parent
20bc88eb1f
commit
a7a54ad8a7
2 changed files with 33 additions and 30 deletions
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue