mirror of
https://github.com/rad4day/Waybar.git
synced 2023-12-21 10:22:59 +01:00
Merge pull request #2219 from xytovl/wake_threads_on_resume
Wake all sleeping threads when leaving suspend
This commit is contained in:
49
src/util/prepare_for_sleep.cpp
Normal file
49
src/util/prepare_for_sleep.cpp
Normal file
@ -0,0 +1,49 @@
|
||||
#include "util/prepare_for_sleep.h"
|
||||
|
||||
#include <gio/gio.h>
|
||||
|
||||
namespace {
|
||||
class PrepareForSleep {
|
||||
private:
|
||||
PrepareForSleep() {
|
||||
GError *error = NULL;
|
||||
login1_connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
|
||||
if (!login1_connection) {
|
||||
throw std::runtime_error("Unable to connect to the SYSTEM Bus!...");
|
||||
} else {
|
||||
login1_id = g_dbus_connection_signal_subscribe(
|
||||
login1_connection, "org.freedesktop.login1", "org.freedesktop.login1.Manager",
|
||||
"PrepareForSleep", "/org/freedesktop/login1", NULL, G_DBUS_SIGNAL_FLAGS_NONE,
|
||||
prepareForSleep_cb, this, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
static void prepareForSleep_cb(GDBusConnection *system_bus, const gchar *sender_name,
|
||||
const gchar *object_path, const gchar *interface_name,
|
||||
const gchar *signal_name, GVariant *parameters,
|
||||
gpointer user_data) {
|
||||
if (g_variant_is_of_type(parameters, G_VARIANT_TYPE("(b)"))) {
|
||||
gboolean sleeping;
|
||||
g_variant_get(parameters, "(b)", &sleeping);
|
||||
|
||||
PrepareForSleep *self = static_cast<PrepareForSleep *>(user_data);
|
||||
self->signal.emit(sleeping);
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
static PrepareForSleep &GetInstance() {
|
||||
static PrepareForSleep instance;
|
||||
return instance;
|
||||
}
|
||||
waybar::SafeSignal<bool> signal;
|
||||
|
||||
private:
|
||||
guint login1_id;
|
||||
GDBusConnection *login1_connection;
|
||||
};
|
||||
} // namespace
|
||||
|
||||
waybar::SafeSignal<bool> &waybar::util::prepare_for_sleep() {
|
||||
return PrepareForSleep::GetInstance().signal;
|
||||
}
|
Reference in New Issue
Block a user