Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package cinnamon-session for openSUSE:Factory checked in at 2025-01-13 17:50:00 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/cinnamon-session (Old) and /work/SRC/openSUSE:Factory/.cinnamon-session.new.1881 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "cinnamon-session" Mon Jan 13 17:50:00 2025 rev:31 rq:1237110 version:6.4.0 Changes: -------- --- /work/SRC/openSUSE:Factory/cinnamon-session/cinnamon-session.changes 2024-11-12 19:24:18.970732554 +0100 +++ /work/SRC/openSUSE:Factory/.cinnamon-session.new.1881/cinnamon-session.changes 2025-01-13 17:50:14.718913916 +0100 @@ -1,0 +2,8 @@ +Sun Jan 12 04:23:09 UTC 2025 - Marguerite Su <i...@marguerite.su> + +- update to 6.4.0 + * Refactor/simplify end-session dialog handling to use a native- + Cinnamon dialog if available + * autostart: Blacklist nm-applet + +------------------------------------------------------------------- Old: ---- cinnamon-session-6.2.1.tar.gz New: ---- cinnamon-session-6.4.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ cinnamon-session.spec ++++++ --- /var/tmp/diff_new_pack.O1MSbv/_old 2025-01-13 17:50:15.170932592 +0100 +++ /var/tmp/diff_new_pack.O1MSbv/_new 2025-01-13 17:50:15.170932592 +0100 @@ -1,7 +1,7 @@ # # spec file for package cinnamon-session # -# Copyright (c) 2024 SUSE LLC +# Copyright (c) 2025 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,7 +17,7 @@ Name: cinnamon-session -Version: 6.2.1 +Version: 6.4.0 Release: 0 Summary: The session manager for the Cinnamon Desktop License: GPL-2.0-or-later AND LGPL-2.1-or-later ++++++ cinnamon-session-6.2.1.tar.gz -> cinnamon-session-6.4.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cinnamon-session-6.2.1/.gitignore new/cinnamon-session-6.4.0/.gitignore --- old/cinnamon-session-6.2.1/.gitignore 2024-07-19 15:51:40.000000000 +0200 +++ new/cinnamon-session-6.4.0/.gitignore 2024-11-27 10:23:46.000000000 +0100 @@ -45,6 +45,7 @@ debian/*.debhelper.log debian/*.substvars debian/.debhelper/ +debian/*.debhelper debian/cinnamon-session-common/ debian/cinnamon-session/ debian/debhelper-build-stamp diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cinnamon-session-6.2.1/cinnamon-session/csm-manager.c new/cinnamon-session-6.4.0/cinnamon-session/csm-manager.c --- old/cinnamon-session-6.2.1/cinnamon-session/csm-manager.c 2024-07-19 15:51:40.000000000 +0200 +++ new/cinnamon-session-6.4.0/cinnamon-session/csm-manager.c 2024-11-27 10:23:46.000000000 +0100 @@ -40,6 +40,7 @@ #include "csm-manager.h" #include "csm-exported-manager.h" +#include "csm-exported-dialog.h" #include "csm-store.h" #include "csm-inhibitor.h" @@ -85,7 +86,7 @@ #define CSM_MANAGER_SCHEMA "org.cinnamon.SessionManager" #define KEY_AUTOSAVE "auto-save-session" #define KEY_LOGOUT_PROMPT "logout-prompt" -#define KEY_SHOW_FALLBACK_WARNING "show-fallback-warning" +#define KEY_FORCE_GTK_END_SESSION "force-gtk-end-session-dialog" #define KEY_BLACKLIST "autostart-blacklist" #define KEY_PREFER_HYBRID_SLEEP "prefer-hybrid-sleep" #define KEY_SUSPEND_HIBERNATE "suspend-then-hibernate" @@ -122,12 +123,6 @@ CsmPresence *presence; CsmXsmpServer *xsmp_server; - GDBusConnection *dialog_connection; - GDBusServer *dialog_server; - guint dialog_reg_id; - CsmLogoutAction dialog_action; - gchar *dialog_bus_address; - char *session_name; gboolean is_fallback_session : 1; @@ -160,6 +155,10 @@ GDBusProxy *bus_proxy; GDBusConnection *connection; CsmExportedManager *skeleton; + CsmExportedDialog *dialog_skeleton; + GDBusProxy *cinnamon_proxy; + + CsmLogoutAction dialog_action; gboolean dbus_disconnected : 1; guint name_owner_id; @@ -182,11 +181,17 @@ LAST_SIGNAL }; +typedef enum { + DIALOG_MODE_REBOOT, + DIALOG_MODE_SHUTDOWN, + DIALOG_MODE_LOGOUT +} DialogMode; + static guint signals [LAST_SIGNAL] = { 0 }; static void show_shutdown_dialog (CsmManager *manager, gboolean is_reboot); -static void terminate_dialog (void); +static void close_end_session_dialog (CsmManager *manager); static void show_logout_dialog (CsmManager *manager); static void user_logout (CsmManager *manager, @@ -267,14 +272,6 @@ on_required_app_failure (CsmManager *manager, CsmApp *app) { - gboolean allow_logout; - - if (csm_system_is_login_session (manager->priv->system)) { - allow_logout = FALSE; - } else { - allow_logout = !_log_out_is_locked_down (manager); - } - csm_util_init_error (FALSE, "A program required by the session failed to start. App ID: '%s'. Startup ID: '%s'.", csm_app_peek_app_id (app), csm_app_peek_startup_id (app)); @@ -519,7 +516,7 @@ { gboolean start_next_phase = TRUE; - g_debug ("CsmManager: ending phase %s\n", + g_debug ("CsmManager: ending phase %s", phase_num_to_name (manager->priv->phase)); g_slist_free (manager->priv->pending_apps); @@ -862,7 +859,7 @@ data.manager = manager; data.flags = 0; - terminate_dialog (); + close_end_session_dialog (manager); if (manager->priv->logout_mode == CSM_MANAGER_LOGOUT_MODE_FORCE) { data.flags |= CSM_CLIENT_END_SESSION_FLAG_FORCEFUL; @@ -1077,7 +1074,7 @@ /* remove the dialog before we remove the inhibitors, else the dialog * will activate itself automatically when the last inhibitor will be * removed */ - terminate_dialog (); + close_end_session_dialog (manager); /* clear all JIT inhibitors */ csm_store_foreach_remove (manager->priv->inhibitors, @@ -1166,7 +1163,7 @@ static void manager_switch_user (CsmManager *manager) { - terminate_dialog (); + close_end_session_dialog (manager); /* We have to do this here and in request_switch_user() because this * function can be called at a later time, not just directly after @@ -1237,7 +1234,7 @@ * (if preferences dictate it) */ manager_perhaps_lock (manager); - terminate_dialog (); + close_end_session_dialog (manager); if (csm_system_can_hibernate (manager->priv->system)) { csm_system_hibernate (manager->priv->system); @@ -1251,7 +1248,7 @@ * (if preferences dictate it) */ manager_perhaps_lock (manager); - terminate_dialog (); + close_end_session_dialog (manager); if (g_settings_get_boolean (manager->priv->settings, KEY_PREFER_HYBRID_SLEEP) && csm_system_can_hybrid_sleep (manager->priv->system)) { @@ -1294,30 +1291,14 @@ if (action == CSM_LOGOUT_ACTION_UNDEFINED) { return; } - + g_debug ("Sending inhibitor info to end-session dialog"); manager->priv->dialog_action = action; GVariant *dialog_inhibit_info = build_inhibitor_list_for_dialog (manager->priv->inhibitors, manager->priv->clients, action); - if (manager->priv->dialog_connection != NULL) { - GError *error = NULL; - - if (!g_dbus_connection_emit_signal (manager->priv->dialog_connection, - NULL, - "/org/gnome/SessionManager", - "org.cinnamon.SessionManager.DialogPrivate", - "InhibitorsChanged", - dialog_inhibit_info, - &error)) { - if (error) { - g_critical ("Could not send inhibit list to dialog: %s", error->message); - g_clear_error (&error); - - } - } - } + csm_exported_dialog_emit_inhibitors_changed (manager->priv->dialog_skeleton, dialog_inhibit_info); } static void @@ -1494,7 +1475,7 @@ start_phase (CsmManager *manager) { - g_debug ("CsmManager: starting phase %s\n", + g_debug ("CsmManager: starting phase %s", phase_num_to_name (manager->priv->phase)); /* reset state */ @@ -2625,14 +2606,21 @@ &new_owner); if (strlen (new_owner) == 0 && strlen (old_owner) > 0) { - /* service removed */ - remove_inhibitors_for_connection (manager, old_owner); - remove_clients_for_connection (manager, old_owner); + /* service removed */ + remove_inhibitors_for_connection (manager, old_owner); + remove_clients_for_connection (manager, old_owner); + + if (g_strcmp0 (name, "org.Cinnamon") == 0) { + g_debug ("org.Cinnamon has lost its owner (Cinnamon is not running)"); + } } else if (strlen (old_owner) == 0 && strlen (new_owner) > 0) { - /* service added */ + /* service added */ + if (g_strcmp0 (name, "org.Cinnamon") == 0) { + g_debug ("org.Cinnamon has an owner (Cinnamon is running)"); + } - /* use this if we support automatically registering - * well known bus names */ + /* use this if we support automatically registering + * well known bus names */ } g_free (name); @@ -2659,42 +2647,44 @@ static gboolean csm_manager_is_switch_user_inhibited (CsmManager *manager); static gboolean csm_manager_is_suspend_inhibited (CsmManager *manager); -static void -handle_dialog_method_call (GDBusConnection *connection, - const gchar *sender, - const gchar *object_path, - const gchar *interface_name, - const gchar *method_name, - GVariant *parameters, +static gboolean +handle_dialog_method_call (CsmExportedDialog *dialog_skeleton, GDBusMethodInvocation *invocation, gpointer user_data) { CsmManager *manager = CSM_MANAGER (user_data); + const gchar *method_name = g_dbus_method_invocation_get_method_name (invocation); - g_debug("Dialog method received: %s\n", method_name); + g_debug("Dialog method received: %s", method_name); if (g_strcmp0 (method_name, "Suspend") == 0) { request_suspend (manager); + csm_exported_dialog_complete_suspend (dialog_skeleton, invocation); } else if (g_strcmp0 (method_name, "Hibernate") == 0) { request_hibernate (manager); + csm_exported_dialog_complete_hibernate (dialog_skeleton, invocation); } else if (g_strcmp0 (method_name, "Restart") == 0) { request_reboot (manager); + csm_exported_dialog_complete_restart (dialog_skeleton, invocation); } else if (g_strcmp0 (method_name, "Shutdown") == 0) { request_shutdown (manager); + csm_exported_dialog_complete_shutdown (dialog_skeleton, invocation); } else if (g_strcmp0 (method_name, "SwitchUser") == 0) { request_switch_user (manager); + csm_exported_dialog_complete_switch_user (dialog_skeleton, invocation); } else if (g_strcmp0 (method_name, "Logout") == 0) { request_logout (manager, CSM_MANAGER_LOGOUT_MODE_NO_CONFIRMATION); + csm_exported_dialog_complete_logout (dialog_skeleton, invocation); } else if (g_strcmp0 (method_name, "Cancel") == 0) { @@ -2707,12 +2697,14 @@ g_debug ("session-manager dialog was cancelled"); } - terminate_dialog (); + close_end_session_dialog (manager); + csm_exported_dialog_complete_logout (dialog_skeleton, invocation); } else if (g_strcmp0 (method_name, "IgnoreInhibitors") == 0) { - terminate_dialog (); + close_end_session_dialog (manager); do_inhibit_dialog_action (manager); + csm_exported_dialog_complete_ignore_inhibitors (dialog_skeleton, invocation); } else if (g_strcmp0 (method_name, "GetCapabilities") == 0) { @@ -2720,7 +2712,7 @@ gboolean can_hybrid_sleep = g_settings_get_boolean (manager->priv->settings, KEY_PREFER_HYBRID_SLEEP) && csm_system_can_hybrid_sleep (manager->priv->system); - ret = g_variant_new ("((bbbbbbb))", + ret = g_variant_new ("(bbbbbbb)", !(_switch_user_is_locked_down (manager) || csm_manager_is_switch_user_inhibited (manager)), (!_log_out_is_locked_down (manager)) && csm_system_can_stop (manager->priv->system), (!_log_out_is_locked_down (manager)) && csm_system_can_restart (manager->priv->system), @@ -2729,94 +2721,17 @@ (!csm_manager_is_suspend_inhibited (manager)) && csm_system_can_hibernate (manager->priv->system), (!csm_manager_is_logout_inhibited (manager))); - g_dbus_method_invocation_return_value (invocation, ret); - return; + csm_exported_dialog_complete_get_capabilities (dialog_skeleton, invocation, ret); } else { - g_warning ("Unknown method name %s\n", method_name); + g_warning ("Unknown method name %s", method_name); g_dbus_method_invocation_return_error (invocation, CSM_MANAGER_ERROR, CSM_MANAGER_ERROR_INVALID_METHOD, "Unknown method name %s", method_name); - return; } - g_dbus_method_invocation_return_value (invocation, NULL); -} - -static GDBusNodeInfo *introspection_data = NULL; - -/* Introspection data for the service we are exporting */ -static const gchar introspection_xml[] = - "<node>" - " <interface name='org.cinnamon.SessionManager.DialogPrivate'>" - " <method name='Suspend'/>" - " <method name='Hibernate'/>" - " <method name='Restart'/>" - " <method name='Shutdown'/>" - " <method name='SwitchUser'/>" - " <method name='Logout'/>" - " <method name='Cancel'/>" - " <method name='IgnoreInhibitors'/>" - " <method name='GetCapabilities'>" - " <arg type='(bbbbbbb)' name='capabilities' direction='out'/>" - " </method>" - " <method name='GetInhibitorInfo'>" - " </method>" - " <signal name='InhibitorsChanged'>" - " <arg type='a(ssss)' name='capabilities'/>" - " </signal>" - " </interface>" - "</node>"; - -static const GDBusInterfaceVTable interface_vtable = -{ - handle_dialog_method_call, - NULL, - NULL, - { 0 } -}; - -static void -on_dialog_connection_closed (GDBusConnection *connection, - gboolean vanished, - GError *error, - gpointer user_data) -{ - CsmManager *manager = CSM_MANAGER (user_data); - g_debug ("Dialog disconnected\n"); - - g_dbus_connection_unregister_object (connection, manager->priv->dialog_reg_id); - manager->priv->dialog_reg_id = 0; - - g_clear_object (&manager->priv->dialog_connection); -} - -static gboolean -on_new_dialog_connection (GDBusServer *server, - GDBusConnection *connection, - gpointer user_data) -{ - CsmManager *manager = CSM_MANAGER (user_data); - - if (manager->priv->dialog_reg_id > 0) { - g_message ("Already have a dialog connection, ignoring new one"); - return FALSE; - } - - g_debug ("Dialog connected.\n"); - - manager->priv->dialog_connection = g_object_ref (connection); - g_signal_connect (connection, "closed", G_CALLBACK (on_dialog_connection_closed), manager); - manager->priv->dialog_reg_id = g_dbus_connection_register_object (connection, - "/org/gnome/SessionManager", - introspection_data->interfaces[0], - &interface_vtable, - manager, /* user_data */ - NULL, /* user_data_free_func */ - NULL); /* GError** */ - return TRUE; } @@ -2847,10 +2762,23 @@ { "handle-request-reboot", csm_manager_request_reboot } }; +static SkeletonSignal dialog_skeleton_signals[] = { + // signal name callback + { "handle-suspend", handle_dialog_method_call }, + { "handle-hibernate", handle_dialog_method_call }, + { "handle-restart", handle_dialog_method_call }, + { "handle-shutdown", handle_dialog_method_call }, + { "handle-switch-user", handle_dialog_method_call }, + { "handle-logout", handle_dialog_method_call }, + { "handle-cancel", handle_dialog_method_call }, + { "handle-ignore-inhibitors", handle_dialog_method_call }, + { "handle-get-capabilities", handle_dialog_method_call }, +}; + static gboolean register_manager (CsmManager *manager) { - CsmExportedManager *skeleton; + GDBusInterfaceSkeleton *skeleton; GError *error = NULL; gint i; @@ -2885,10 +2813,19 @@ G_CALLBACK (on_dbus_proxy_signal), manager); - skeleton = csm_exported_manager_skeleton_new (); - manager->priv->skeleton = skeleton; + manager->priv->cinnamon_proxy = g_dbus_proxy_new_sync (manager->priv->connection, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "org.Cinnamon", + "/org/Cinnamon", + "org.Cinnamon", + NULL, + &error); + + skeleton = G_DBUS_INTERFACE_SKELETON (csm_exported_manager_skeleton_new ()); + manager->priv->skeleton = CSM_EXPORTED_MANAGER (skeleton); - g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (skeleton), + g_dbus_interface_skeleton_export (skeleton, manager->priv->connection, CSM_MANAGER_DBUS_PATH, &error); @@ -2909,43 +2846,22 @@ manager); } - // Set up private controller interface for dialog - gchar *guid = g_dbus_generate_guid (); - gchar *address; - - // Detect guest sessions. - if (g_str_has_prefix (g_get_home_dir (), "/tmp")) { - address = g_strdup ("unix:tmpdir=/tmp"); - } - else { - address = g_strdup_printf ("%s-%s", DBUS_ADDRESS, guid); - } - - GDBusServer *server = g_dbus_server_new_sync (address, - G_DBUS_SERVER_FLAGS_AUTHENTICATION_REQUIRE_SAME_USER, - guid, - NULL, NULL, &error); - g_dbus_server_start (server); - - // In normal sessions, this address will be the same as what we provided for g_dbus_server_new_sync. - // In guest sessions, an abstract address will be generated, so use what the server returns, not - // what we gave it as an address. - manager->priv->dialog_bus_address = g_strdup (g_dbus_server_get_client_address (server)); - g_debug ("Dialog server address: %s", manager->priv->dialog_bus_address); - - g_free (guid); - g_free (address); - - if (server == NULL) { - g_critical ("Error creating private dialog server. Logout, shutdown, restart will " - "need to be performed from a terminal: %s", error->message); - g_clear_error (&error); - return TRUE; - } - - introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL); - manager->priv->dialog_server = server; - g_signal_connect (server, "new-connection", G_CALLBACK (on_new_dialog_connection), manager); + skeleton = G_DBUS_INTERFACE_SKELETON (csm_exported_dialog_skeleton_new ()); + manager->priv->dialog_skeleton = CSM_EXPORTED_DIALOG (skeleton); + + g_dbus_interface_skeleton_export (skeleton, + manager->priv->connection, + CSM_MANAGER_DBUS_PATH, + &error); + + for (i = 0; i < G_N_ELEMENTS (dialog_skeleton_signals); i++) { + SkeletonSignal sig = dialog_skeleton_signals[i]; + + g_signal_connect (skeleton, + sig.signal_name, + G_CALLBACK (sig.callback), + manager); + } return TRUE; } @@ -3537,22 +3453,12 @@ g_debug ("CsmManager: disposing manager"); - terminate_dialog (); + close_end_session_dialog (manager); g_clear_object (&manager->priv->xsmp_server); g_clear_object (&manager->priv->bus_proxy); - - if (manager->priv->dialog_reg_id > 0) { - g_dbus_connection_unregister_object (manager->priv->dialog_connection, - manager->priv->dialog_reg_id); - manager->priv->dialog_reg_id = 0; - g_dbus_node_info_unref (introspection_data); - g_dbus_server_stop (manager->priv->dialog_server); - g_object_unref (manager->priv->dialog_server); - g_object_unref (manager->priv->dialog_connection); - g_free (manager->priv->dialog_bus_address); - } + g_clear_object (&manager->priv->cinnamon_proxy); if (manager->priv->clients != NULL) { g_signal_handlers_disconnect_by_func (manager->priv->clients, @@ -3970,22 +3876,42 @@ } static void -terminate_dialog (void) +close_end_session_dialog (CsmManager *manager) { - if (dialog_process == NULL) { + g_debug ("Closing end session dialog"); + + if (dialog_process != NULL) { + g_subprocess_send_signal (dialog_process, SIGTERM); return; } - g_debug ("Terminating cinnamon-session-quit dialog"); + GError *error = NULL; + GVariant *ret = NULL; + + ret = g_dbus_proxy_call_sync (manager->priv->cinnamon_proxy, + "CloseEndSessionDialog", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_debug ("ret is: %p", ret); - g_subprocess_send_signal(dialog_process, SIGTERM); + g_variant_unref (ret); + + if (error != NULL) { + g_critical ("Unable to close Cinnamon's end session dialog: %s", error->message); + g_error_free (error); + } } static void -launch_dialog (CsmManager *manager, const gchar *flag) +launch_gtk_dialog (CsmManager *manager, + DialogMode mode) { GError *error; - g_debug ("Trying to launch session-manager dialog - 'cinnamon-session-quit --sm-owned --sm-bus-id %s'", manager->priv->dialog_bus_address); + const gchar *flag; + g_debug ("Trying to launch fallback (Gtk) end-session dialog"); if (dialog_process != NULL) { g_debug ("There's already a session-manager dialog"); @@ -4000,10 +3926,25 @@ cancel_end_session (manager); } + switch (mode) { + case DIALOG_MODE_LOGOUT: + flag = "--logout"; + break; + case DIALOG_MODE_REBOOT: + flag = "--reboot"; + break; + case DIALOG_MODE_SHUTDOWN: + flag = "--power-off"; + + break; + default: + g_warning ("Unknown dialog mode: %d", mode); + return; + } + const gchar *argv[] = { "cinnamon-session-quit", "--sm-owned", - "--sm-bus-id", manager->priv->dialog_bus_address, flag, NULL }; @@ -4012,7 +3953,7 @@ GSubprocessFlags flags = G_SUBPROCESS_FLAGS_NONE; if (debugging) { - flags = G_SUBPROCESS_FLAGS_STDERR_MERGE | G_SUBPROCESS_FLAGS_STDOUT_PIPE; + flags = G_SUBPROCESS_FLAGS_STDERR_PIPE; } error = NULL; @@ -4027,7 +3968,7 @@ } if (debugging) { - GInputStream *stdout = g_subprocess_get_stdout_pipe (dialog_process); + GInputStream *stdout = g_subprocess_get_stderr_pipe (dialog_process); guint8 *buffer = g_malloc (1024); g_input_stream_read_async (G_INPUT_STREAM (stdout), buffer, @@ -4046,9 +3987,60 @@ manager); } +static gboolean +launch_cinnamon_dialog (CsmManager *manager, + DialogMode mode, + GError **error) +{ + GVariant *ret = NULL; + + g_debug ("Requesting Cinnamon display its end-session dialog"); + + ret = g_dbus_proxy_call_sync (manager->priv->cinnamon_proxy, + "ShowEndSessionDialog", + g_variant_new ("(i)", mode), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + error); + + if (*error != NULL) { + return FALSE; + } + g_debug ("launch ret is: %p", ret); + + g_variant_unref (ret); + + return TRUE; +} + +static void +show_end_session_dialog (CsmManager *manager, + DialogMode mode) +{ + GError *error = NULL; + + if (g_settings_get_boolean (manager->priv->settings, KEY_FORCE_GTK_END_SESSION)) { + g_debug ("Using Gtk end-session dialog based on settings."); + launch_gtk_dialog (manager, mode); + return; + } + + if (!launch_cinnamon_dialog (manager, mode, &error)) { + if (error->code == G_DBUS_ERROR_NAME_HAS_NO_OWNER) { + g_debug ("Cinnamon is not running, falling back to Gtk end-session dialog"); + } else { + g_critical ("Failed to launch Cinnamon's end session dialog, falling back to Gtk end-session dialog: %s", error->message); + } + + g_error_free (error); + launch_gtk_dialog (manager, mode); + } +} + static void show_shutdown_dialog (CsmManager *manager, - gboolean is_reboot) + gboolean is_reboot) { if (manager->priv->phase > CSM_MANAGER_PHASE_QUERY_END_SESSION) { /* Already shutting down, nothing more to do */ @@ -4057,7 +4049,7 @@ manager->priv->logout_mode = CSM_MANAGER_LOGOUT_MODE_NORMAL; - launch_dialog (manager, is_reboot ? "--reboot" : "--power-off"); + show_end_session_dialog (manager, is_reboot ? DIALOG_MODE_REBOOT : DIALOG_MODE_SHUTDOWN); } static void @@ -4070,7 +4062,7 @@ manager->priv->logout_mode = CSM_MANAGER_LOGOUT_MODE_NORMAL; - launch_dialog (manager, "--logout"); + show_end_session_dialog (manager, DIALOG_MODE_LOGOUT); } static void diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cinnamon-session-6.2.1/cinnamon-session/inhibit-dialog-info.c new/cinnamon-session-6.4.0/cinnamon-session/inhibit-dialog-info.c --- old/cinnamon-session-6.2.1/cinnamon-session/inhibit-dialog-info.c 2024-07-19 15:51:40.000000000 +0200 +++ new/cinnamon-session-6.4.0/cinnamon-session/inhibit-dialog-info.c 2024-11-27 10:23:46.000000000 +0100 @@ -138,16 +138,13 @@ gicon_string = g_icon_to_string (gicon); } - // g_variant_builder_open (info->builder, G_VARIANT_TYPE_ARRAY); + g_debug ("Adding %s to dialog inhibitor list", name); + g_variant_builder_add (info->builder, "(ssss)", + name ? name : "none", + gicon_string ? gicon_string : "none", + csm_inhibitor_peek_reason (inhibitor) ? csm_inhibitor_peek_reason (inhibitor) : "none", + csm_inhibitor_peek_id (inhibitor) ? csm_inhibitor_peek_id (inhibitor) : "none"); - GVariant *item = g_variant_new ("(ssss)", - name ? name : "none", - gicon_string ? gicon_string : "none", - csm_inhibitor_peek_reason (inhibitor) ? csm_inhibitor_peek_reason (inhibitor) : "none", - csm_inhibitor_peek_id (inhibitor) ? csm_inhibitor_peek_id (inhibitor) : "none"); - - g_variant_builder_add_value (info->builder, item); - // g_variant_builder_close (info->builder); info->count++; g_free (gicon_string); @@ -161,7 +158,31 @@ CsmInhibitor *inhibitor, InhibitDialogInfo *info) { - add_inhibitor (info, inhibitor); + CsmInhibitorFlag flags = csm_inhibitor_peek_flags (inhibitor); + + switch (info->action) { + case CSM_LOGOUT_ACTION_LOGOUT: + case CSM_LOGOUT_ACTION_SHUTDOWN: + case CSM_LOGOUT_ACTION_REBOOT: + if (flags & CSM_INHIBITOR_FLAG_LOGOUT) { + add_inhibitor (info, inhibitor); + } + break; + case CSM_LOGOUT_ACTION_SWITCH_USER: + if (flags & CSM_INHIBITOR_FLAG_SWITCH_USER) { + add_inhibitor (info, inhibitor); + } + break; + case CSM_LOGOUT_ACTION_HIBERNATE: + case CSM_LOGOUT_ACTION_SLEEP: + if (flags & CSM_INHIBITOR_FLAG_SUSPEND) { + add_inhibitor (info, inhibitor); + } + break; + default: + break; + } + return FALSE; } @@ -178,30 +199,24 @@ CsmStore *clients, int action) { - GVariantBuilder builder; - - g_variant_builder_init (&builder, G_VARIANT_TYPE_TUPLE); - g_variant_builder_open (&builder, G_VARIANT_TYPE ("a(ssss)")); + g_autoptr(GVariantBuilder) builder = g_variant_builder_new (G_VARIANT_TYPE ("a(ssss)")); - InhibitDialogInfo *info = g_new0 (InhibitDialogInfo, 1); - info->action = action; - info->builder = &builder; + InhibitDialogInfo info; + info.action = action; + info.builder = builder; if (clients != NULL) { - info->clients = g_object_ref (clients); + info.clients = g_object_ref (clients); } if (inhibitors != NULL) { - info->inhibitors = g_object_ref (inhibitors); + info.inhibitors = g_object_ref (inhibitors); } - populate_builder (info); - - g_variant_builder_close (&builder); + populate_builder (&info); - g_object_unref (info->clients); - g_object_unref (info->inhibitors); + g_object_unref (info.clients); + g_object_unref (info.inhibitors); - g_free (info); - return g_variant_builder_end (&builder); + return g_variant_builder_end (builder); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cinnamon-session-6.2.1/cinnamon-session/meson.build new/cinnamon-session-6.4.0/cinnamon-session/meson.build --- old/cinnamon-session-6.2.1/cinnamon-session/meson.build 2024-07-19 15:51:40.000000000 +0200 +++ new/cinnamon-session-6.4.0/cinnamon-session/meson.build 2024-11-27 10:23:46.000000000 +0100 @@ -11,7 +11,8 @@ ['exported-client-private', 'org.gnome.SessionManager.ClientPrivate', 'ExportedClientPrivate'], ['exported-app', 'org.gnome.SessionManager.App', 'ExportedApp'], ['exported-inhibitor', 'org.gnome.SessionManager.Inhibitor', 'ExportedInhibitor'], - ['exported-presence', 'org.gnome.SessionManager.Presence', 'ExportedPresence'] + ['exported-presence', 'org.gnome.SessionManager.Presence', 'ExportedPresence'], + ['exported-dialog', 'org.cinnamon.SessionManager.EndSessionDialog', 'ExportedDialog'] ] gdbus_sources = [] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cinnamon-session-6.2.1/cinnamon-session/org.cinnamon.SessionManager.EndSessionDialog.xml new/cinnamon-session-6.4.0/cinnamon-session/org.cinnamon.SessionManager.EndSessionDialog.xml --- old/cinnamon-session-6.2.1/cinnamon-session/org.cinnamon.SessionManager.EndSessionDialog.xml 1970-01-01 01:00:00.000000000 +0100 +++ new/cinnamon-session-6.4.0/cinnamon-session/org.cinnamon.SessionManager.EndSessionDialog.xml 2024-11-27 10:23:46.000000000 +0100 @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> +<node xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd"> + <interface name='org.cinnamon.SessionManager.EndSessionDialog'> + <method name='Suspend'/> + <method name='Hibernate'/> + <method name='Restart'/> + <method name='Shutdown'/> + <method name='SwitchUser'/> + <method name='Logout'/> + <method name='Cancel'/> + <method name='IgnoreInhibitors'/> + <method name='GetCapabilities'> + <arg type='(bbbbbbb)' name='capabilities' direction='out'/> + </method> + <signal name='InhibitorsChanged'> + <arg type='a(ssss)' name='capabilities'/> + </signal> + </interface> +</node> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cinnamon-session-6.2.1/cinnamon-session-quit/cinnamon-session-quit.py new/cinnamon-session-6.4.0/cinnamon-session-quit/cinnamon-session-quit.py --- old/cinnamon-session-6.2.1/cinnamon-session-quit/cinnamon-session-quit.py 2024-07-19 15:51:40.000000000 +0200 +++ new/cinnamon-session-6.4.0/cinnamon-session-quit/cinnamon-session-quit.py 2024-11-27 10:23:46.000000000 +0100 @@ -64,7 +64,10 @@ parser.add_argument("--no-prompt", dest="no_prompt", action='store_true', help=_("Don't prompt for user confirmation")) parser.add_argument("--sm-owned", action="store_true", help=argparse.SUPPRESS) - parser.add_argument("--sm-bus-id", dest="bus_id", action="store", help=argparse.SUPPRESS, default=config.DBUS_ADDRESS) + + # unused in 6.4+, kept only for upgrade session (running c-s process is previous version, dialog is new) + parser.add_argument("--sm-bus-id", dest="bus_id", action="store", help=argparse.SUPPRESS, default=None) + args = parser.parse_args() self.dialog_response = ResponseCode.NONE @@ -76,11 +79,7 @@ self.force = args.force self.no_prompt = args.no_prompt self.sm_owned = args.sm_owned - - if self.sm_owned: - self.bus_id = args.bus_id - else: - self.bus_id = None + self.bus_id = args.bus_id self.proxy = None self.signal_handler_id = 0 @@ -118,7 +117,7 @@ proxy.call_finish(res) # self.quit() except GLib.Error as e: - print("An error occurred forwarding to the session manager: %s" % e.message) + print("An error occurred forwarding to the session manager: %s" % e.message, file=sys.stderr, end=None) if self.mode == Action.LOGOUT: arg = LogoutParams.NORMAL @@ -156,7 +155,7 @@ ) except GLib.Error as e: if sm_proxy is None: - print("Could not forward to org.cinnamon.SessionManager.Manager: %s" % e.message) + print("Could not forward to org.cinnamon.SessionManager.Manager: %s" % e.message, file=sys.stderr, end=None) sys.exit(1) sys.exit(0) @@ -169,40 +168,52 @@ connection = None try: - connection = Gio.DBusConnection.new_for_address_sync( - self.bus_id, - Gio.DBusConnectionFlags.AUTHENTICATION_CLIENT, - None, None - ) + # 6.4 and later this will always be None, obsolete connection + if self.bus_id is not None: + connection = Gio.DBusConnection.new_for_address_sync( + self.bus_id, + Gio.DBusConnectionFlags.AUTHENTICATION_CLIENT, + None, None + ) - self.proxy = Gio.DBusProxy.new_sync( - connection, - Gio.DBusProxyFlags.DO_NOT_AUTO_START, - None, - None, - "/org/gnome/SessionManager", - "org.cinnamon.SessionManager.DialogPrivate", - None - ) + self.proxy = Gio.DBusProxy.new_sync( + connection, + Gio.DBusProxyFlags.DO_NOT_AUTO_START, + None, + None, + "/org/gnome/SessionManager", + "org.cinnamon.SessionManager.DialogPrivate", + None + ) + else: + self.proxy = Gio.DBusProxy.new_for_bus_sync( + Gio.BusType.SESSION, + Gio.DBusProxyFlags.DO_NOT_AUTO_START, + None, + "org.gnome.SessionManager", + "/org/gnome/SessionManager", + "org.cinnamon.SessionManager.EndSessionDialog", + None + ) self.proxy.connect("g-signal", self.inhibitor_info_received) except GLib.Error as e: if connection is None: - print("Could not connect to session dialog server: %s" % e.message) + print("Could not connect to session dialog server: %s" % e.message, file=sys.stderr, end=None) sys.exit(1) if self.proxy is None: - print("Could not create proxy to session dialog interface: %s" % e.message) + print("Could not create proxy to session dialog interface: %s" % e.message, file=sys.stderr, end=None) sys.exit(1) def inhibitor_info_received(self, proxy, sender, signal, params): inhibitors = params[0] if self.dialog_response == ResponseCode.NONE: - print("Ignoring inhibitor info, still waiting on initial response from user") + print("Ignoring inhibitor info, still waiting on initial response from user", file=sys.stderr, end=None) return - print("Inhibitor info received (%d inhibitors)" % len(inhibitors)) + print("Inhibitor info received (%d inhibitors): %s" % (len(inhibitors), params), file=sys.stderr, end=None) if inhibitors: self.inhibited = True @@ -243,8 +254,10 @@ self.view_stack = self.builder.get_object("view_stack") self.inhibitor_treeview = self.builder.get_object("inhibitor_treeview") - can_switch_user, can_stop, can_restart, can_hybrid_sleep, can_suspend, can_hibernate, can_logout = self.get_session_capabilities() - + try: + can_switch_user, can_stop, can_restart, can_hybrid_sleep, can_suspend, can_hibernate, can_logout = self.get_session_capabilities() + except Exception as e: + print(e, file=sys.stderr, end=None) default_button = None if self.mode == Action.LOGOUT: @@ -265,7 +278,7 @@ self.window.set_icon_name("system-shutdown") elif self.mode == Action.RESTART: if not can_restart: - print("Restart not available") + print("Restart not available", file=sys.stderr, end=None) Gtk.main_quit() return self.dialog_label.set_text(_("Restart this system now?")) @@ -304,7 +317,7 @@ ) return caps[0] except GLib.Error as e: - print("Could not retrieve session capabilities: %s" % e.message) + print("Could not retrieve session capabilities: %s" % e.message, file=sys.stderr, end=None) def start_timer(self): if self.timer_id > 0: @@ -315,6 +328,11 @@ self.update_timer() GLib.timeout_add(1000, self.update_timer) + def stop_timer(self): + if self.timer_id > 0: + GLib.source_remove(self.timer_id) + self.timer_id = 0 + def update_timer(self): if self.current_time == 0: self.handle_response(self.window, self.default_response) @@ -347,15 +365,17 @@ return GLib.SOURCE_CONTINUE def handle_response(self, dialog, code): + self.stop_timer() + self.view_stack.set_visible_child_name("busy") if self.inhibited: if code == ResponseCode.CONTINUE: - print("Sending ignore inhibitors") + print("Sending ignore inhibitors", file=sys.stderr, end=None) self.send_command("IgnoreInhibitors") self.finish_up() elif code in (ResponseCode.CANCEL, Gtk.ResponseType.NONE, Gtk.ResponseType.DELETE_EVENT): - print("Canceling action during inhibit phase") + print("Canceling action during inhibit phase", file=sys.stderr, end=None) self.send_command("Cancel") self.quit() return @@ -378,7 +398,7 @@ self.send_command("Cancel") self.quit(0) else: - print("Invalid response code: %d" % code) + print("Invalid response code: %d" % code, file=sys.stderr, end=None) def send_command(self, command): try: @@ -391,7 +411,7 @@ None ) except GLib.Error as e: - print("Could not send command '%s' to session manager: %s" % (str(command), e.message)) + print("Could not send command '%s' to session manager: %s" % (str(command), e.message), file=sys.stderr, end=None) self.command_sent = True # wait for inhibit info @@ -409,7 +429,7 @@ self.view_stack.set_visible_child_name("inhibit") def on_terminate(self, data=None): - print("Received SIGTERM from cinnamon-session, exiting") + print("Received SIGTERM from cinnamon-session, exiting", file=sys.stderr, end=None) self.quit(0) def finish_up(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cinnamon-session-6.2.1/cinnamon-session-quit/config.py.in new/cinnamon-session-6.4.0/cinnamon-session-quit/config.py.in --- old/cinnamon-session-6.2.1/cinnamon-session-quit/config.py.in 2024-07-19 15:51:40.000000000 +0200 +++ new/cinnamon-session-6.4.0/cinnamon-session-quit/config.py.in 2024-11-27 10:23:46.000000000 +0100 @@ -3,5 +3,4 @@ LOCALE_DIR=@LOCALE_DIR@ PACKAGE=@PACKAGE@ VERSION=@VERSION@ -DBUS_ADDRESS=@DBUS_ADDRESS@ PKG_DATADIR=@PKG_DATADIR@ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cinnamon-session-6.2.1/cinnamon-session-quit/meson.build new/cinnamon-session-6.4.0/cinnamon-session-quit/meson.build --- old/cinnamon-session-6.2.1/cinnamon-session-quit/meson.build 2024-07-19 15:51:40.000000000 +0200 +++ new/cinnamon-session-6.4.0/cinnamon-session-quit/meson.build 2024-11-27 10:23:46.000000000 +0100 @@ -4,7 +4,6 @@ csq_conf.set_quoted('PACKAGE', meson.project_name()) csq_conf.set_quoted('VERSION', meson.project_version()) csq_conf.set_quoted('PKG_DATADIR', pkg_datadir) -csq_conf.set_quoted('DBUS_ADDRESS', dialog_dbus_address) config_py = configure_file( output: 'config.py', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cinnamon-session-6.2.1/data/org.cinnamon.SessionManager.gschema.xml new/cinnamon-session-6.4.0/data/org.cinnamon.SessionManager.gschema.xml --- old/cinnamon-session-6.2.1/data/org.cinnamon.SessionManager.gschema.xml 2024-07-19 15:51:40.000000000 +0200 +++ new/cinnamon-session-6.4.0/data/org.cinnamon.SessionManager.gschema.xml 2024-11-27 10:23:46.000000000 +0100 @@ -20,13 +20,13 @@ <summary>Logout prompt</summary> <description>If enabled, cinnamon-session will prompt the user before ending a session.</description> </key> - <key name="show-fallback-warning" type="b"> - <default>true</default> - <summary>Show the fallback warning</summary> - <description>If enabled, cinnamon-session will display a warning dialog after login if the session was automatically fallen back.</description> + <key name="force-gtk-end-session-dialog" type="b"> + <default>false</default> + <summary>Always use the session manager's end-session-dialog</summary> + <description>If enabled, cinnamon-session will not try to use Cinnamon's end-session dialog, instead preferring Gtk fallback.</description> </key> <key name="autostart-blacklist" type="as"> - <default>['gnome-settings-daemon', 'org.gnome.SettingsDaemon', 'gnome-fallback-mount-helper', 'gnome-screensaver', 'mate-screensaver', 'mate-keyring-daemon', 'indicator-session', 'gnome-initial-setup-copy-worker', 'gnome-initial-setup-first-login', 'gnome-welcome-tour', 'xscreensaver-autostart', 'nautilus-autostart', 'caja', 'xfce4-power-manager', 'touchegg']</default> + <default>['gnome-settings-daemon', 'org.gnome.SettingsDaemon', 'gnome-fallback-mount-helper', 'gnome-screensaver', 'mate-screensaver', 'mate-keyring-daemon', 'indicator-session', 'gnome-initial-setup-copy-worker', 'gnome-initial-setup-first-login', 'gnome-welcome-tour', 'xscreensaver-autostart', 'nautilus-autostart', 'nm-applet', 'caja', 'xfce4-power-manager', 'touchegg']</default> <summary>Applications to block from autostarting or appearing in the app system</summary> <description> A list of applications or desktop names (without the .desktop extension) to prevent from diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cinnamon-session-6.2.1/debian/changelog new/cinnamon-session-6.4.0/debian/changelog --- old/cinnamon-session-6.2.1/debian/changelog 2024-07-19 15:51:40.000000000 +0200 +++ new/cinnamon-session-6.4.0/debian/changelog 2024-11-27 10:23:46.000000000 +0100 @@ -1,3 +1,13 @@ +cinnamon-session (6.4.0) xia; urgency=medium + + [ Clement Lefebvre ] + * autostart: Blacklist nm-applet + + [ Michael Webster ] + * Refactor/simplify end-session dialog handling to use a native- (#177) + + -- Clement Lefebvre <r...@linuxmint.com> Wed, 27 Nov 2024 09:23:18 +0000 + cinnamon-session (6.2.1) wilma; urgency=medium [ Leigh Scott ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cinnamon-session-6.2.1/meson.build new/cinnamon-session-6.4.0/meson.build --- old/cinnamon-session-6.2.1/meson.build 2024-07-19 15:51:40.000000000 +0200 +++ new/cinnamon-session-6.4.0/meson.build 2024-11-27 10:23:46.000000000 +0100 @@ -2,7 +2,7 @@ project( 'cinnamon-session', ['c'], -version : '6.2.1', +version : '6.4.0', meson_version : '>=0.56.0' ) @@ -123,7 +123,6 @@ rootInclude = include_directories('.') -dialog_dbus_address = 'unix:abstract=cinnamon-session-quit-dialog' pkg_datadir = join_paths(get_option('prefix'), get_option('datadir'), meson.project_name()) conf.set_quoted('PKGDATADIR', pkg_datadir) @@ -133,7 +132,6 @@ conf.set_quoted('PACKAGE', meson.project_name()) conf.set_quoted('VERSION', meson.project_version()) conf.set_quoted('GETTEXT_PACKAGE', meson.project_name()) -conf.set_quoted('DBUS_ADDRESS', dialog_dbus_address) configure_file(