diff options
| author | Aleksey Samoilov <[email protected]> | 2026-09-21 23:29:39 +0400 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-09-21 19:29:39 +0000 |
| commit | 4cf7346b34d2bdafcb682865ba9f43e5d047eee1 (patch) | |
| tree | 15ab840debf815359495c0247cc53fa24b6e51c6 | |
| parent | 360ebe8afc5b17555b28ddbf9cae43e006bb6ebd (diff) | |
| download | mate-power-manager-master.tar.bz2 mate-power-manager-master.tar.xz | |
* wayland: small fixes
* fix double-free removing Wayland idle notify
| -rw-r--r-- | src/egg-idletime.c | 10 | ||||
| -rw-r--r-- | src/gpm-brightness.c | 8 | ||||
| -rw-r--r-- | src/gpm-dpms.c | 51 |
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); } |
