mirror of
https://github.com/gentoo-mirror/gentoo.git
synced 2026-09-23 16:49:10 -07:00
gnome-extra/cinnamon-session: backport fix for crash in 6.x
Signed-off-by: Eli Schwartz <eschwartz93@gmail.com> Closes: https://github.com/gentoo/gentoo/pull/36989 Signed-off-by: Sam James <sam@gentoo.org>
This commit is contained in:
@@ -66,6 +66,8 @@ PATCHES=(
|
||||
# Fix bad systemd include
|
||||
# https://github.com/linuxmint/cinnamon-session/pull/164
|
||||
"${FILESDIR}/${PN}-6.0.0-fix-optional-systemd.patch"
|
||||
# fix crash on idle
|
||||
"${FILESDIR}"/0001-cs-presence.c-Fix-CsmPresence-idle-handling.patch
|
||||
)
|
||||
|
||||
src_prepare() {
|
||||
|
||||
@@ -0,0 +1,303 @@
|
||||
From 55e9291629cc028793e22b738214ecababe65c4b Mon Sep 17 00:00:00 2001
|
||||
From: Michael Webster <miketwebster@gmail.com>
|
||||
Date: Wed, 24 Jan 2024 09:14:01 -0500
|
||||
Subject: [PATCH] cs-presence.c: Fix CsmPresence idle handling.
|
||||
|
||||
Idle detection was broken since 5.4, as gnome-idle-monitor (in
|
||||
libcinnamon-desktop) was looking for the wrong muffin interface
|
||||
names.
|
||||
|
||||
This file was also adapted incompletely to the new idle-monitor
|
||||
API.
|
||||
|
||||
requires:
|
||||
linuxmint/cinnamon-desktop@d0f8c74a7864786cf04
|
||||
---
|
||||
cinnamon-session/csm-presence.c | 130 +++++++++++++++++++-------------
|
||||
cinnamon-session/csm-presence.h | 6 --
|
||||
2 files changed, 77 insertions(+), 59 deletions(-)
|
||||
|
||||
diff --git a/cinnamon-session/csm-presence.c b/cinnamon-session/csm-presence.c
|
||||
index 1fd3d7c..69da703 100644
|
||||
--- a/cinnamon-session/csm-presence.c
|
||||
+++ b/cinnamon-session/csm-presence.c
|
||||
@@ -64,16 +64,12 @@ struct CsmPresencePrivate
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
- PROP_STATUS,
|
||||
- PROP_STATUS_TEXT,
|
||||
PROP_IDLE_ENABLED,
|
||||
PROP_IDLE_TIMEOUT,
|
||||
};
|
||||
|
||||
-
|
||||
enum {
|
||||
STATUS_CHANGED,
|
||||
- STATUS_TEXT_CHANGED,
|
||||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
@@ -99,6 +95,10 @@ csm_presence_error_quark (void)
|
||||
return quark_volatile;
|
||||
}
|
||||
|
||||
+static void idle_became_active_cb (GnomeIdleMonitor *idle_monitor,
|
||||
+ guint id,
|
||||
+ gpointer user_data);
|
||||
+
|
||||
static gboolean
|
||||
csm_presence_set_status_text (CsmPresence *presence,
|
||||
const char *status_text,
|
||||
@@ -120,6 +120,8 @@ csm_presence_set_status_text (CsmPresence *presence,
|
||||
|
||||
if (status_text != NULL) {
|
||||
presence->priv->status_text = g_strdup (status_text);
|
||||
+ } else {
|
||||
+ presence->priv->status_text = g_strdup ("");
|
||||
}
|
||||
|
||||
csm_exported_presence_set_status_text (presence->priv->skeleton, presence->priv->status_text);
|
||||
@@ -128,11 +130,11 @@ csm_presence_set_status_text (CsmPresence *presence,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
-static gboolean
|
||||
+static void
|
||||
csm_presence_set_status (CsmPresence *presence,
|
||||
guint status)
|
||||
{
|
||||
- g_return_val_if_fail (CSM_IS_PRESENCE (presence), FALSE);
|
||||
+ g_return_if_fail (CSM_IS_PRESENCE (presence));
|
||||
|
||||
if (status != presence->priv->status) {
|
||||
presence->priv->status = status;
|
||||
@@ -140,7 +142,6 @@ csm_presence_set_status (CsmPresence *presence,
|
||||
csm_exported_presence_emit_status_changed (presence->priv->skeleton, presence->priv->status);
|
||||
g_signal_emit (presence, signals[STATUS_CHANGED], 0, presence->priv->status);
|
||||
}
|
||||
- return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -158,6 +159,11 @@ set_session_idle (CsmPresence *presence,
|
||||
/* save current status */
|
||||
presence->priv->saved_status = presence->priv->status;
|
||||
csm_presence_set_status (presence, CSM_PRESENCE_STATUS_IDLE);
|
||||
+
|
||||
+ gnome_idle_monitor_add_user_active_watch (presence->priv->idle_monitor,
|
||||
+ idle_became_active_cb,
|
||||
+ presence,
|
||||
+ NULL);
|
||||
} else {
|
||||
if (presence->priv->status != CSM_PRESENCE_STATUS_IDLE) {
|
||||
g_debug ("CsmPresence: already not idle, ignoring");
|
||||
@@ -171,27 +177,27 @@ set_session_idle (CsmPresence *presence,
|
||||
}
|
||||
}
|
||||
|
||||
-static gboolean
|
||||
-on_idle_timeout (GnomeIdleMonitor *monitor,
|
||||
- guint id,
|
||||
- gboolean condition,
|
||||
- CsmPresence *presence)
|
||||
+static void
|
||||
+idle_became_idle_cb (GnomeIdleMonitor *idle_monitor,
|
||||
+ guint id,
|
||||
+ gpointer user_data)
|
||||
{
|
||||
- gboolean handled;
|
||||
-
|
||||
- handled = TRUE;
|
||||
- set_session_idle (presence, condition);
|
||||
+ CsmPresence *presence = user_data;
|
||||
+ set_session_idle (presence, TRUE);
|
||||
+}
|
||||
|
||||
- return handled;
|
||||
+static void
|
||||
+idle_became_active_cb (GnomeIdleMonitor *idle_monitor,
|
||||
+ guint id,
|
||||
+ gpointer user_data)
|
||||
+{
|
||||
+ CsmPresence *presence = user_data;
|
||||
+ set_session_idle (presence, FALSE);
|
||||
}
|
||||
|
||||
static void
|
||||
reset_idle_watch (CsmPresence *presence)
|
||||
{
|
||||
- if (presence->priv->idle_monitor == NULL) {
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
if (presence->priv->idle_watch_id > 0) {
|
||||
g_debug ("CsmPresence: removing idle watch (%i)", presence->priv->idle_watch_id);
|
||||
gnome_idle_monitor_remove_watch (presence->priv->idle_monitor,
|
||||
@@ -199,12 +205,11 @@ reset_idle_watch (CsmPresence *presence)
|
||||
presence->priv->idle_watch_id = 0;
|
||||
}
|
||||
|
||||
- if (! presence->priv->screensaver_active
|
||||
- && presence->priv->idle_enabled
|
||||
+ if (presence->priv->idle_enabled
|
||||
&& presence->priv->idle_timeout > 0) {
|
||||
presence->priv->idle_watch_id = gnome_idle_monitor_add_idle_watch (presence->priv->idle_monitor,
|
||||
presence->priv->idle_timeout,
|
||||
- (GnomeIdleMonitorWatchFunc) on_idle_timeout,
|
||||
+ idle_became_idle_cb,
|
||||
presence,
|
||||
NULL);
|
||||
g_debug ("CsmPresence: adding idle watch (%i) for %d secs",
|
||||
@@ -229,11 +234,36 @@ on_screensaver_g_signal (GDBusProxy *proxy,
|
||||
g_variant_get (parameters,
|
||||
"(b)", &is_active);
|
||||
|
||||
- g_debug ("screensaver status changed: %d", is_active);
|
||||
+ if (presence->priv->screensaver_active != is_active) {
|
||||
+ presence->priv->screensaver_active = is_active;
|
||||
+ set_session_idle (presence, is_active);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+screensaver_get_active_cb (GDBusProxy *screensaver_proxy,
|
||||
+ GAsyncResult *res,
|
||||
+ CsmPresence *presence)
|
||||
+{
|
||||
+ g_autoptr(GVariant) data = NULL;
|
||||
+ g_autoptr(GError) error = NULL;
|
||||
+ gboolean is_active;
|
||||
|
||||
+ data = g_dbus_proxy_call_finish (screensaver_proxy, res, &error);
|
||||
+ if (!data) {
|
||||
+ if (error) {
|
||||
+ g_warning ("Could not retrieve current screensaver active state: %s",
|
||||
+ error->message);
|
||||
+ } else {
|
||||
+ g_warning ("Could not retrieve current screensaver active state!");
|
||||
+ }
|
||||
+
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ g_variant_get (data, "(b)", &is_active);
|
||||
if (presence->priv->screensaver_active != is_active) {
|
||||
presence->priv->screensaver_active = is_active;
|
||||
- reset_idle_watch (presence);
|
||||
set_session_idle (presence, is_active);
|
||||
}
|
||||
}
|
||||
@@ -248,14 +278,25 @@ on_screensaver_name_owner_changed (GDBusProxy *proxy,
|
||||
|
||||
presence = CSM_PRESENCE (user_data);
|
||||
name_owner = g_dbus_proxy_get_name_owner (proxy);
|
||||
+ if (name_owner == NULL) {
|
||||
+ g_debug ("Detected that screensaver has left the bus");
|
||||
|
||||
- if (name_owner && g_strcmp0 (name_owner, CS_NAME)) {
|
||||
- g_warning ("Detected that screensaver has appeared on the bus");
|
||||
- } else {
|
||||
- g_warning ("Detected that screensaver has left the bus");
|
||||
+ presence->priv->screensaver_active = FALSE;
|
||||
set_session_idle (presence, FALSE);
|
||||
- reset_idle_watch (presence);
|
||||
+ } else {
|
||||
+ g_debug ("Detected that screensaver has aquired the bus");
|
||||
+
|
||||
+ g_dbus_proxy_call (presence->priv->screensaver_proxy,
|
||||
+ "GetActive",
|
||||
+ NULL,
|
||||
+ G_DBUS_CALL_FLAGS_NO_AUTO_START,
|
||||
+ 1000,
|
||||
+ NULL,
|
||||
+ (GAsyncReadyCallback) screensaver_get_active_cb,
|
||||
+ presence);
|
||||
}
|
||||
+
|
||||
+ g_free (name_owner);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@@ -352,7 +393,8 @@ csm_presence_constructor (GType type,
|
||||
}
|
||||
|
||||
presence->priv->screensaver_proxy = g_dbus_proxy_new_sync (presence->priv->connection,
|
||||
- G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
|
||||
+ G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START |
|
||||
+ G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
|
||||
NULL,
|
||||
CS_NAME,
|
||||
CS_PATH,
|
||||
@@ -424,12 +466,6 @@ csm_presence_set_property (GObject *object,
|
||||
self = CSM_PRESENCE (object);
|
||||
|
||||
switch (prop_id) {
|
||||
- case PROP_STATUS:
|
||||
- csm_presence_set_status (self, g_value_get_uint (value));
|
||||
- break;
|
||||
- case PROP_STATUS_TEXT:
|
||||
- csm_presence_set_status_text (self, g_value_get_string (value), NULL);
|
||||
- break;
|
||||
case PROP_IDLE_ENABLED:
|
||||
csm_presence_set_idle_enabled (self, g_value_get_boolean (value));
|
||||
break;
|
||||
@@ -453,12 +489,6 @@ csm_presence_get_property (GObject *object,
|
||||
self = CSM_PRESENCE (object);
|
||||
|
||||
switch (prop_id) {
|
||||
- case PROP_STATUS:
|
||||
- g_value_set_uint (value, self->priv->status);
|
||||
- break;
|
||||
- case PROP_STATUS_TEXT:
|
||||
- g_value_set_string (value, self->priv->status_text ? self->priv->status_text : "");
|
||||
- break;
|
||||
case PROP_IDLE_ENABLED:
|
||||
g_value_set_boolean (value, self->priv->idle_enabled);
|
||||
break;
|
||||
@@ -482,15 +512,9 @@ csm_presence_finalize (GObject *object)
|
||||
presence->priv->idle_watch_id = 0;
|
||||
}
|
||||
|
||||
- if (presence->priv->status_text != NULL) {
|
||||
- g_free (presence->priv->status_text);
|
||||
- presence->priv->status_text = NULL;
|
||||
- }
|
||||
-
|
||||
- if (presence->priv->idle_monitor != NULL) {
|
||||
- g_object_unref (presence->priv->idle_monitor);
|
||||
- presence->priv->idle_monitor = NULL;
|
||||
- }
|
||||
+ g_clear_pointer (&presence->priv->status_text, g_free);
|
||||
+ g_clear_object (&presence->priv->idle_monitor);
|
||||
+ g_clear_object (&presence->priv->screensaver_proxy);
|
||||
|
||||
G_OBJECT_CLASS (csm_presence_parent_class)->finalize (object);
|
||||
}
|
||||
diff --git a/cinnamon-session/csm-presence.h b/cinnamon-session/csm-presence.h
|
||||
index 41de5aa..d2713ab 100644
|
||||
--- a/cinnamon-session/csm-presence.h
|
||||
+++ b/cinnamon-session/csm-presence.h
|
||||
@@ -50,9 +50,6 @@ struct _CsmPresenceClass
|
||||
|
||||
void (* status_changed) (CsmPresence *presence,
|
||||
guint status);
|
||||
- void (* status_text_changed) (CsmPresence *presence,
|
||||
- const char *status_text);
|
||||
-
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
@@ -69,9 +66,6 @@ typedef enum
|
||||
} CsmPresenceError;
|
||||
|
||||
#define CSM_PRESENCE_ERROR csm_presence_error_quark ()
|
||||
-GType csm_presence_error_get_type (void);
|
||||
-#define CSM_PRESENCE_TYPE_ERROR (csm_presence_error_get_type ())
|
||||
-
|
||||
GQuark csm_presence_error_quark (void);
|
||||
|
||||
GType csm_presence_get_type (void) G_GNUC_CONST;
|
||||
--
|
||||
2.44.2
|
||||
|
||||
Reference in New Issue
Block a user