From 122112c320e62e52b3f0acc5d03c445c44bd8c4c Mon Sep 17 00:00:00 2001 From: kotontrion Date: Tue, 24 Sep 2024 10:47:14 +0200 Subject: core: add window inhibit property --- core/src/idle-inhibit.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 core/src/idle-inhibit.c (limited to 'core/src/idle-inhibit.c') diff --git a/core/src/idle-inhibit.c b/core/src/idle-inhibit.c new file mode 100644 index 0000000..b08efd7 --- /dev/null +++ b/core/src/idle-inhibit.c @@ -0,0 +1,124 @@ +#include +#include +#include +#include +#include + +#include "idle-inhibit.h" +#include "gdk/gdk.h" +#include "glib-object.h" +#include "glib.h" +#include "idle-inhibit-unstable-v1-client.h" + + +struct _AstalInhibitManager { + GObject parent_instance; +}; + +typedef struct { + gboolean init; + struct wl_registry* wl_registry; + struct wl_display* display; + struct zwp_idle_inhibit_manager_v1 *idle_inhibit_manager; +} AstalInhibitManagerPrivate; + + +G_DEFINE_TYPE_WITH_PRIVATE(AstalInhibitManager, astal_inhibit_manager, G_TYPE_OBJECT) + +void astal_inhibitor_free(AstalInhibitor* inhibitor) { + g_print("free inhibitor\n"); + g_assert_nonnull(inhibitor); + zwp_idle_inhibitor_v1_destroy(inhibitor); +} + +AstalInhibitor* astal_inhibit_manager_inhibit(AstalInhibitManager *self, GtkWindow *window) { + AstalInhibitManagerPrivate* priv = astal_inhibit_manager_get_instance_private(self); + g_assert_true(priv->init); + GdkWindow *gdk_window = gtk_widget_get_window(GTK_WIDGET(window)); + struct wl_surface *surface = gdk_wayland_window_get_wl_surface(gdk_window); + return zwp_idle_inhibit_manager_v1_create_inhibitor(priv->idle_inhibit_manager, surface); +} + +static void global_registry_handler(void* data, struct wl_registry* registry, uint32_t id, + const char* interface, uint32_t version) { + AstalInhibitManager* self = ASTAL_INHIBIT_MANAGER(data); + AstalInhibitManagerPrivate* priv = astal_inhibit_manager_get_instance_private(self); + + if (strcmp(interface, zwp_idle_inhibit_manager_v1_interface.name) == 0) { + priv->idle_inhibit_manager = + wl_registry_bind(registry, id, &zwp_idle_inhibit_manager_v1_interface, 1); + } + +} + +static void global_registry_remover(void* data, struct wl_registry* registry, uint32_t id) { + //neither inhibit_manager nor inhibitor is going to be removed by the compositor, so we don't need do anything here. +} + +static const struct wl_registry_listener registry_listener = {global_registry_handler, + global_registry_remover}; + + +static gboolean astal_inhibit_manager_wayland_init(AstalInhibitManager *self) { + + AstalInhibitManagerPrivate* priv = astal_inhibit_manager_get_instance_private(self); + + if (priv->init) return TRUE; + + GdkDisplay *gdk_display = gdk_display_get_default(); + priv->display = gdk_wayland_display_get_wl_display(gdk_display); + + priv->wl_registry = wl_display_get_registry(priv->display); + wl_registry_add_listener(priv->wl_registry, ®istry_listener, self); + + wl_display_roundtrip(priv->display); + + if (priv->idle_inhibit_manager == NULL) { + g_critical("Can not connect idle inhibitor protocol"); + return FALSE; + } + + priv->init = TRUE; + return TRUE; +} + +AstalInhibitManager* astal_inhibit_manager_get_default() { + static AstalInhibitManager* self = NULL; + + if (self == NULL) { + self = g_object_new(ASTAL_TYPE_INHIBIT_MANAGER, NULL); + if(!astal_inhibit_manager_wayland_init(self)) { + g_object_unref(self); + self = NULL; + } + } + + return self; +} + +static void astal_inhibit_manager_init(AstalInhibitManager* self) { + AstalInhibitManagerPrivate* priv = astal_inhibit_manager_get_instance_private(self); + priv->init = FALSE; + priv->display = NULL; + priv->wl_registry = NULL; + priv->idle_inhibit_manager = NULL; +} + +static void astal_inhibit_manager_finalize(GObject* object) { + + AstalInhibitManager* self = ASTAL_INHIBIT_MANAGER(object); + AstalInhibitManagerPrivate* priv = astal_inhibit_manager_get_instance_private(self); + + if (priv->display != NULL) wl_display_roundtrip(priv->display); + + if (priv->wl_registry != NULL) wl_registry_destroy(priv->wl_registry); + if (priv->idle_inhibit_manager != NULL) zwp_idle_inhibit_manager_v1_destroy(priv->idle_inhibit_manager); + + G_OBJECT_CLASS(astal_inhibit_manager_parent_class)->finalize(object); +} + +static void astal_inhibit_manager_class_init(AstalInhibitManagerClass* class) { + GObjectClass* object_class = G_OBJECT_CLASS(class); + object_class->finalize = astal_inhibit_manager_finalize; + +} -- cgit v1.2.3 From 0922ff6a5bec16bea77923576e4ab241fcf23de0 Mon Sep 17 00:00:00 2001 From: kotontrion Date: Tue, 24 Sep 2024 11:02:45 +0200 Subject: core: inhibitor remove debug statement --- core/src/idle-inhibit.c | 6 ------ 1 file changed, 6 deletions(-) (limited to 'core/src/idle-inhibit.c') diff --git a/core/src/idle-inhibit.c b/core/src/idle-inhibit.c index b08efd7..95eaa45 100644 --- a/core/src/idle-inhibit.c +++ b/core/src/idle-inhibit.c @@ -25,12 +25,6 @@ typedef struct { G_DEFINE_TYPE_WITH_PRIVATE(AstalInhibitManager, astal_inhibit_manager, G_TYPE_OBJECT) -void astal_inhibitor_free(AstalInhibitor* inhibitor) { - g_print("free inhibitor\n"); - g_assert_nonnull(inhibitor); - zwp_idle_inhibitor_v1_destroy(inhibitor); -} - AstalInhibitor* astal_inhibit_manager_inhibit(AstalInhibitManager *self, GtkWindow *window) { AstalInhibitManagerPrivate* priv = astal_inhibit_manager_get_instance_private(self); g_assert_true(priv->init); -- cgit v1.2.3 From 6916d59373948c8bc23cbb198795fe4608a73ba3 Mon Sep 17 00:00:00 2001 From: kotontrion Date: Fri, 27 Sep 2024 08:47:32 +0200 Subject: core: idle inhibitor fix code style --- core/src/idle-inhibit.c | 56 +++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 30 deletions(-) (limited to 'core/src/idle-inhibit.c') diff --git a/core/src/idle-inhibit.c b/core/src/idle-inhibit.c index 95eaa45..48f2471 100644 --- a/core/src/idle-inhibit.c +++ b/core/src/idle-inhibit.c @@ -1,16 +1,16 @@ +#include "idle-inhibit.h" + +#include +#include #include +#include +#include +#include #include #include -#include -#include -#include "idle-inhibit.h" -#include "gdk/gdk.h" -#include "glib-object.h" -#include "glib.h" #include "idle-inhibit-unstable-v1-client.h" - struct _AstalInhibitManager { GObject parent_instance; }; @@ -19,18 +19,17 @@ typedef struct { gboolean init; struct wl_registry* wl_registry; struct wl_display* display; - struct zwp_idle_inhibit_manager_v1 *idle_inhibit_manager; + struct zwp_idle_inhibit_manager_v1* idle_inhibit_manager; } AstalInhibitManagerPrivate; - G_DEFINE_TYPE_WITH_PRIVATE(AstalInhibitManager, astal_inhibit_manager, G_TYPE_OBJECT) -AstalInhibitor* astal_inhibit_manager_inhibit(AstalInhibitManager *self, GtkWindow *window) { - AstalInhibitManagerPrivate* priv = astal_inhibit_manager_get_instance_private(self); - g_assert_true(priv->init); - GdkWindow *gdk_window = gtk_widget_get_window(GTK_WIDGET(window)); - struct wl_surface *surface = gdk_wayland_window_get_wl_surface(gdk_window); - return zwp_idle_inhibit_manager_v1_create_inhibitor(priv->idle_inhibit_manager, surface); +AstalInhibitor* astal_inhibit_manager_inhibit(AstalInhibitManager* self, GtkWindow* window) { + AstalInhibitManagerPrivate* priv = astal_inhibit_manager_get_instance_private(self); + g_assert_true(priv->init); + GdkWindow* gdk_window = gtk_widget_get_window(GTK_WIDGET(window)); + struct wl_surface* surface = gdk_wayland_window_get_wl_surface(gdk_window); + return zwp_idle_inhibit_manager_v1_create_inhibitor(priv->idle_inhibit_manager, surface); } static void global_registry_handler(void* data, struct wl_registry* registry, uint32_t id, @@ -42,31 +41,29 @@ static void global_registry_handler(void* data, struct wl_registry* registry, ui priv->idle_inhibit_manager = wl_registry_bind(registry, id, &zwp_idle_inhibit_manager_v1_interface, 1); } - } static void global_registry_remover(void* data, struct wl_registry* registry, uint32_t id) { - //neither inhibit_manager nor inhibitor is going to be removed by the compositor, so we don't need do anything here. + // neither inhibit_manager nor inhibitor is going to be removed by the compositor, so we don't + // need do anything here. } static const struct wl_registry_listener registry_listener = {global_registry_handler, global_registry_remover}; - -static gboolean astal_inhibit_manager_wayland_init(AstalInhibitManager *self) { - +static gboolean astal_inhibit_manager_wayland_init(AstalInhibitManager* self) { AstalInhibitManagerPrivate* priv = astal_inhibit_manager_get_instance_private(self); if (priv->init) return TRUE; - GdkDisplay *gdk_display = gdk_display_get_default(); + GdkDisplay* gdk_display = gdk_display_get_default(); priv->display = gdk_wayland_display_get_wl_display(gdk_display); priv->wl_registry = wl_display_get_registry(priv->display); wl_registry_add_listener(priv->wl_registry, ®istry_listener, self); wl_display_roundtrip(priv->display); - + if (priv->idle_inhibit_manager == NULL) { g_critical("Can not connect idle inhibitor protocol"); return FALSE; @@ -80,11 +77,11 @@ AstalInhibitManager* astal_inhibit_manager_get_default() { static AstalInhibitManager* self = NULL; if (self == NULL) { - self = g_object_new(ASTAL_TYPE_INHIBIT_MANAGER, NULL); - if(!astal_inhibit_manager_wayland_init(self)) { - g_object_unref(self); - self = NULL; - } + self = g_object_new(ASTAL_TYPE_INHIBIT_MANAGER, NULL); + if (!astal_inhibit_manager_wayland_init(self)) { + g_object_unref(self); + self = NULL; + } } return self; @@ -99,14 +96,14 @@ static void astal_inhibit_manager_init(AstalInhibitManager* self) { } static void astal_inhibit_manager_finalize(GObject* object) { - AstalInhibitManager* self = ASTAL_INHIBIT_MANAGER(object); AstalInhibitManagerPrivate* priv = astal_inhibit_manager_get_instance_private(self); if (priv->display != NULL) wl_display_roundtrip(priv->display); if (priv->wl_registry != NULL) wl_registry_destroy(priv->wl_registry); - if (priv->idle_inhibit_manager != NULL) zwp_idle_inhibit_manager_v1_destroy(priv->idle_inhibit_manager); + if (priv->idle_inhibit_manager != NULL) + zwp_idle_inhibit_manager_v1_destroy(priv->idle_inhibit_manager); G_OBJECT_CLASS(astal_inhibit_manager_parent_class)->finalize(object); } @@ -114,5 +111,4 @@ static void astal_inhibit_manager_finalize(GObject* object) { static void astal_inhibit_manager_class_init(AstalInhibitManagerClass* class) { GObjectClass* object_class = G_OBJECT_CLASS(class); object_class->finalize = astal_inhibit_manager_finalize; - } -- cgit v1.2.3