29static const char*
const kDevSender =
"org.freedesktop.systemd1";
30static const char*
const kDevInterface =
"org.freedesktop.systemd1.Manager";
31static const char*
const kDevAddMember =
"UnitNew";
32static const char*
const kDevRemoveMember =
"UnitRemoved";
37static const char*
const kResSender =
"org.freedesktop.login1";
38static const char*
const kResInterface =
"org.freedesktop.login1.Manager";
39static const char*
const kResMember =
"PrepareForSleep";
41static void dev_signal_cb(GDBusConnection* connection,
const gchar* sender,
42 const gchar* object_path,
const gchar* interface,
43 const gchar* signal, GVariant* parameters,
49static void prepare_for_sleep_cb(GDBusConnection* connection,
50 const gchar* sender,
const gchar* object_path,
51 const gchar* interface,
const gchar* signal,
52 GVariant* parameters, gpointer user_data) {
54 g_variant_get(parameters,
"(b)", &suspending);
61LinuxUsbWatchDaemon::~LinuxUsbWatchDaemon() { Stop(); }
63void LinuxUsbWatchDaemon::DoStart() {
64 g_main_context_push_thread_default(m_worker_context);
65 g_main_loop_run(m_main_loop);
66 g_main_context_pop_thread_default(m_worker_context);
69void LinuxUsbWatchDaemon::Start() {
74 if (m_thread.joinable())
return;
75 m_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, 0, &err);
76 g_dbus_connection_signal_subscribe(
77 m_conn, kDevSender, kDevInterface, kDevAddMember, 0, 0,
78 G_DBUS_SIGNAL_FLAGS_NONE, dev_signal_cb,
this, 0);
79 g_dbus_connection_signal_subscribe(
80 m_conn, kDevSender, kDevInterface, kDevRemoveMember, 0, 0,
81 G_DBUS_SIGNAL_FLAGS_NONE, dev_signal_cb,
this, 0);
82 g_dbus_connection_signal_subscribe(m_conn, kResSender, kResInterface,
83 kResMember, 0, 0, G_DBUS_SIGNAL_FLAGS_NONE,
84 prepare_for_sleep_cb,
this, 0);
85 m_worker_context = g_main_context_new();
86 m_main_loop = g_main_loop_new(m_worker_context,
false);
87 m_thread = std::thread([&] { DoStart(); });
90void LinuxUsbWatchDaemon::Stop() {
91 if (!m_thread.joinable())
return;
92 g_main_loop_unref(m_main_loop);
93 g_main_loop_quit(m_main_loop);
void Notify() override
Notify all listeners, no data supplied.
Listen to DBus system bus signals reflecting for example suspend/resume, new USB devicesbeing plugged...
EventVar evt_resume
Notified when resuming from hibernate.
EventVar evt_dev_change
Notified when a new or removed device is detected, usually an USB hotplug event:
Linux specific hardware events DBus interface.