summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Samoilov <[email protected]>2026-09-21 23:29:39 +0400
committerGitHub <[email protected]>2026-09-21 19:29:39 +0000
commit4cf7346b34d2bdafcb682865ba9f43e5d047eee1 (patch)
tree15ab840debf815359495c0247cc53fa24b6e51c6
parent360ebe8afc5b17555b28ddbf9cae43e006bb6ebd (diff)
downloadmate-power-manager-master.tar.bz2
mate-power-manager-master.tar.xz
[Wayland]: Small fixes (#436)HEADmaster
* wayland: small fixes * fix double-free removing Wayland idle notify
-rw-r--r--src/egg-idletime.c10
-rw-r--r--src/gpm-brightness.c8
-rw-r--r--src/gpm-dpms.c51
3 files changed, 51 insertions, 18 deletions
diff --git a/src/egg-idletime.c b/src/egg-idletime.c
index e2edb42..2f5db6f 100644
--- a/src/egg-idletime.c
+++ b/src/egg-idletime.c
@@ -610,8 +610,13 @@ egg_idletime_alarm_set (EggIdletime *idletime, guint id, guint timeout)
g_ptr_array_add (idletime->priv->wayland_notifications, wn);
}
- wn->notification = ext_idle_notifier_v1_get_input_idle_notification (
- idletime->priv->idle_notifier, timeout, idletime->priv->seat);
+ if (ext_idle_notifier_v1_get_version (idletime->priv->idle_notifier) >= 2) {
+ wn->notification = ext_idle_notifier_v1_get_input_idle_notification (
+ idletime->priv->idle_notifier, timeout, idletime->priv->seat);
+ } else {
+ wn->notification = ext_idle_notifier_v1_get_idle_notification (
+ idletime->priv->idle_notifier, timeout, idletime->priv->seat);
+ }
ext_idle_notification_v1_add_listener (wn->notification,
&egg_idletime_wayland_notification_listener, idletime);
@@ -652,7 +657,6 @@ egg_idletime_alarm_remove (EggIdletime *idletime, guint id)
if (wn->notification)
ext_idle_notification_v1_destroy (wn->notification);
g_ptr_array_remove (idletime->priv->wayland_notifications, wn);
- g_free (wn);
return TRUE;
}
#endif
diff --git a/src/gpm-brightness.c b/src/gpm-brightness.c
index 1e47953..66e71cb 100644
--- a/src/gpm-brightness.c
+++ b/src/gpm-brightness.c
@@ -920,9 +920,11 @@ gpm_brightness_finalize (GObject *object)
g_return_if_fail (GPM_IS_BRIGHTNESS (object));
brightness = GPM_BRIGHTNESS (object);
#ifdef HAVE_X11
- g_ptr_array_unref (brightness->priv->resources);
- gdk_window_remove_filter (brightness->priv->root_window,
- gpm_brightness_filter_xevents, brightness);
+ if (brightness->priv->resources != NULL)
+ g_ptr_array_unref (brightness->priv->resources);
+ if (brightness->priv->root_window != NULL)
+ gdk_window_remove_filter (brightness->priv->root_window,
+ gpm_brightness_filter_xevents, brightness);
#endif
G_OBJECT_CLASS (gpm_brightness_parent_class)->finalize (object);
}
diff --git a/src/gpm-dpms.c b/src/gpm-dpms.c
index 2d0e489..7c2f8d3 100644
--- a/src/gpm-dpms.c
+++ b/src/gpm-dpms.c
@@ -286,38 +286,64 @@ gpm_dpms_wayland_output_find (GpmDpms *dpms, uint32_t name)
}
static void
+gpm_dpms_wayland_output_attach (GpmDpms *dpms, struct wl_registry *registry,
+ GpmDpmsWaylandOutput *wo)
+{
+ struct wl_output *output;
+
+ if (wo->power != NULL)
+ return;
+ if (dpms->priv->power_manager == NULL)
+ return;
+
+ output = wl_registry_bind (registry, wo->name,
+ &wl_output_interface, 1);
+ if (output == NULL)
+ return;
+
+ wo->power = zwlr_output_power_manager_v1_get_output_power (
+ dpms->priv->power_manager, output);
+ zwlr_output_power_v1_add_listener (wo->power,
+ &gpm_dpms_wayland_power_listener, wo);
+
+ /* wl_output has no release request at version 1; drop the proxy */
+ wl_proxy_destroy ((struct wl_proxy *) output);
+
+ g_debug ("added zwlr_output_power_v1 for output %u", wo->name);
+}
+
+static void
gpm_dpms_wayland_registry_global_cb (void *data, struct wl_registry *registry,
uint32_t name, const char *interface,
uint32_t version)
{
GpmDpms *dpms = data;
+ guint i;
if (g_strcmp0 (interface, "zwlr_output_power_manager_v1") == 0) {
+ if (dpms->priv->power_manager != NULL)
+ return;
dpms->priv->power_manager = wl_registry_bind (registry, name,
&zwlr_output_power_manager_v1_interface, 1);
g_debug ("bound zwlr_output_power_manager_v1");
+
+ /* attach any outputs announced before the power manager */
+ for (i = 0; i < dpms->priv->wayland_outputs->len; i++)
+ gpm_dpms_wayland_output_attach (dpms, registry,
+ g_ptr_array_index (dpms->priv->wayland_outputs, i));
} else if (g_strcmp0 (interface, "wl_output") == 0) {
- struct wl_output *output;
GpmDpmsWaylandOutput *wo;
wo = gpm_dpms_wayland_output_find (dpms, name);
if (wo != NULL)
return;
- output = wl_registry_bind (registry, name,
- &wl_output_interface, 1);
- if (dpms->priv->power_manager == NULL)
- return;
-
wo = g_new0 (GpmDpmsWaylandOutput, 1);
wo->name = name;
wo->mode = GPM_DPMS_MODE_ON;
- wo->power = zwlr_output_power_manager_v1_get_output_power (
- dpms->priv->power_manager, output);
- zwlr_output_power_v1_add_listener (wo->power,
- &gpm_dpms_wayland_power_listener, wo);
g_ptr_array_add (dpms->priv->wayland_outputs, wo);
- g_debug ("added zwlr_output_power_v1 for output %u", name);
+
+ gpm_dpms_wayland_output_attach (dpms, registry, wo);
}
}
@@ -333,7 +359,6 @@ gpm_dpms_wayland_registry_global_remove_cb (void *data,
if (wo->power)
zwlr_output_power_v1_destroy (wo->power);
g_ptr_array_remove (dpms->priv->wayland_outputs, wo);
- g_free (wo);
g_debug ("removed zwlr_output_power_v1 for output %u", name);
}
@@ -368,6 +393,8 @@ gpm_dpms_wayland_set_mode (GpmDpms *dpms, GpmDpmsMode mode, GError **error)
for (i = 0; i < dpms->priv->wayland_outputs->len; i++) {
GpmDpmsWaylandOutput *wo = g_ptr_array_index (dpms->priv->wayland_outputs, i);
+ if (wo->power == NULL)
+ continue;
zwlr_output_power_v1_set_mode (wo->power, wlr_mode);
}