#
# Description: Don't save failsafe session in .dmrc.
# "Failsafe" means either failsafe in session name or in session comment
# (case unsensitive)
# Ubuntu: https://launchpad.net/bugs/509182
# Upstream: https://bugzilla.gnome.org/show_bug.cgi?id=607703
#
diff -Nur -x '*.orig' -x '*~' gdm-2.29.5/daemon/gdm-session-direct.c gdm-2.29.5.new/daemon/gdm-session-direct.c
--- gdm-2.29.5/daemon/gdm-session-direct.c 2010-01-21 20:20:02.521354911 +0100
+++ gdm-2.29.5.new/daemon/gdm-session-direct.c 2010-01-21 20:20:21.232354118 +0100
@@ -172,6 +172,32 @@
}
static void
+send_dbus_bool_signal (GdmSessionDirect *session,
+ const char *name,
+ const gboolean value)
+{
+ DBusMessage *message;
+ DBusMessageIter iter;
+
+ g_return_if_fail (session != NULL);
+
+ message = dbus_message_new_signal (GDM_SESSION_DBUS_PATH,
+ GDM_SESSION_DBUS_INTERFACE,
+ name);
+
+ dbus_message_iter_init_append (message, &iter);
+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_BOOLEAN, &value);
+
+ if (! send_dbus_message (session->priv->worker_connection, message)) {
+ g_debug ("GdmSessionDirect: Could not send %s signal",
+ name ? name : "(null)");
+ }
+
+ dbus_message_unref (message);
+}
+
+
+static void
send_dbus_void_signal (GdmSessionDirect *session,
const char *name)
{
@@ -576,6 +602,61 @@
}
static gboolean
+get_session_comment_for_file (const char *file,
+ char **comment)
+{
+ GKeyFile *key_file;
+ GError *error;
+ char *full_path;
+ gboolean ret;
+ gboolean res;
+
+ ret = FALSE;
+ if (comment != NULL) {
+ *comment = NULL;
+ }
+
+ key_file = g_key_file_new ();
+
+ g_debug ("GdmSessionDirect: looking for session file '%s'", file);
+
+ error = NULL;
+ full_path = NULL;
+ res = g_key_file_load_from_dirs (key_file,
+ file,
+ get_system_session_dirs (),
+ &full_path,
+ G_KEY_FILE_NONE,
+ &error);
+ if (! res) {
+ g_debug ("GdmSessionDirect: File '%s' not found: %s", file, error->message);
+ g_error_free (error);
+ if (comment != NULL) {
+ *comment = NULL;
+ }
+ goto out;
+ }
+
+ error = NULL;
+ *comment = g_key_file_get_string (key_file,
+ G_KEY_FILE_DESKTOP_GROUP,
+ "Comment",
+ &error);
+ if (error != NULL) {
+ g_debug ("GdmSessionDirect: %s key not found: %s",
+ "Comment",
+ error->message);
+ g_error_free (error);
+ goto out;
+ }
+
+ ret = TRUE;
+
+out:
+ return ret;
+}
+
+static gboolean
get_session_command_for_name (const char *name,
char **command)
{
@@ -1351,6 +1432,9 @@
" \n"
" \n"
" \n"
+ " \n"
+ " \n"
+ " \n"
" \n"
" \n"
" \n"
@@ -1937,6 +2021,32 @@
return get_default_session_name (session);
}
+static gboolean
+get_is_session_failsafe (GdmSessionDirect *session)
+{
+ gboolean res;
+ char *comment;
+ char *filename;
+ char *p;
+
+ filename = g_strdup_printf ("%s.desktop", get_session_name (session));
+
+ comment = NULL;
+ res = get_session_comment_for_file (filename, &comment);
+ if (! res) {
+ g_warning ("Cannot read specified session file: %s", filename);
+ g_free (filename);
+ return FALSE;
+ }
+ g_free (filename);
+
+ p = strstr(g_ascii_strdown (comment, -1), "failsafe") || strstr(g_ascii_strdown (filename, -1), "failsafe");
+ if (p != NULL)
+ return TRUE;
+
+ return FALSE;
+}
+
static char *
get_session_command (GdmSessionDirect *session)
{
@@ -2190,6 +2300,10 @@
send_dbus_string_signal (impl, "SetSessionName",
get_session_name (impl));
+
+ send_dbus_bool_signal (impl, "SetIsFailsafe",
+ get_is_session_failsafe(impl));
+
}
static void
diff -Nur -x '*.orig' -x '*~' gdm-2.29.5/daemon/gdm-session-settings.c gdm-2.29.5.new/daemon/gdm-session-settings.c
--- gdm-2.29.5/daemon/gdm-session-settings.c 2010-01-12 17:36:37.000000000 +0100
+++ gdm-2.29.5.new/daemon/gdm-session-settings.c 2010-01-21 20:20:03.340363314 +0100
@@ -35,6 +35,7 @@
struct _GdmSessionSettingsPrivate
{
char *session_name;
+ gboolean failsafe;
char *language_name;
char *layout_name;
};
@@ -57,6 +58,7 @@
PROP_SESSION_NAME,
PROP_LANGUAGE_NAME,
PROP_LAYOUT_NAME,
+ PROP_IS_FAILSAFE,
};
G_DEFINE_TYPE (GdmSessionSettings, gdm_session_settings, G_TYPE_OBJECT)
@@ -100,6 +102,11 @@
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
g_object_class_install_property (object_class, PROP_LAYOUT_NAME, param_spec);
+ param_spec = g_param_spec_string ("is-failsafe", "Failsafe Session",
+ "Whether the session is a failsafe one",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
+ g_object_class_install_property (object_class, PROP_IS_FAILSAFE, param_spec);
}
static void
@@ -169,6 +176,18 @@
}
}
+void
+gdm_session_settings_set_is_failsafe (GdmSessionSettings *settings,
+ gboolean failsafe)
+{
+ g_return_if_fail (GDM_IS_SESSION_SETTINGS (settings));
+
+ if (settings->priv->failsafe != failsafe) {
+ settings->priv->failsafe = failsafe;
+ g_object_notify (G_OBJECT (settings), "is-failsafe");
+ }
+}
+
char *
gdm_session_settings_get_language_name (GdmSessionSettings *settings)
{
@@ -190,6 +209,13 @@
return g_strdup (settings->priv->session_name);
}
+gboolean
+gdm_session_settings_get_is_failsafe (GdmSessionSettings *settings)
+{
+ g_return_val_if_fail (GDM_IS_SESSION_SETTINGS (settings), FALSE);
+ return settings->priv->failsafe;
+}
+
static void
gdm_session_settings_set_property (GObject *object,
guint prop_id,
@@ -213,6 +239,10 @@
gdm_session_settings_set_session_name (settings, g_value_get_string (value));
break;
+ case PROP_IS_FAILSAFE:
+ gdm_session_settings_set_is_failsafe (settings, g_value_get_boolean (value));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@@ -241,6 +271,10 @@
g_value_set_string (value, settings->priv->layout_name);
break;
+ case PROP_IS_FAILSAFE:
+ g_value_set_boolean (value, settings->priv->failsafe);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@@ -336,6 +370,8 @@
goto out;
}
+ gdm_session_settings_set_is_failsafe (settings, FALSE);
+
is_loaded = TRUE;
out:
g_key_file_free (key_file);
@@ -362,6 +398,10 @@
filename = g_build_filename (home_directory, ".dmrc", NULL);
is_saved = FALSE;
+
+ if (settings->priv->failsafe)
+ return TRUE;
+
key_file = g_key_file_new ();
file_error = NULL;
diff -Nur -x '*.orig' -x '*~' gdm-2.29.5/daemon/gdm-session-settings.h gdm-2.29.5.new/daemon/gdm-session-settings.h
--- gdm-2.29.5/daemon/gdm-session-settings.h 2010-01-12 17:36:37.000000000 +0100
+++ gdm-2.29.5.new/daemon/gdm-session-settings.h 2010-01-21 20:20:03.340363314 +0100
@@ -63,12 +63,15 @@
char *gdm_session_settings_get_language_name (GdmSessionSettings *settings);
char *gdm_session_settings_get_layout_name (GdmSessionSettings *settings);
char *gdm_session_settings_get_session_name (GdmSessionSettings *settings);
+gboolean gdm_session_settings_get_is_failsafe (GdmSessionSettings *settings);
void gdm_session_settings_set_language_name (GdmSessionSettings *settings,
const char *language_name);
void gdm_session_settings_set_layout_name (GdmSessionSettings *settings,
const char *layout_name);
void gdm_session_settings_set_session_name (GdmSessionSettings *settings,
const char *session_name);
+void gdm_session_settings_set_is_failsafe (GdmSessionSettings *settings,
+ gboolean is_failsafe);
G_END_DECLS
#endif /* GDM_SESSION_SETTINGS_H */
diff -Nur -x '*.orig' -x '*~' gdm-2.29.5/daemon/gdm-session-worker.c gdm-2.29.5.new/daemon/gdm-session-worker.c
--- gdm-2.29.5/daemon/gdm-session-worker.c 2010-01-12 17:44:17.000000000 +0100
+++ gdm-2.29.5.new/daemon/gdm-session-worker.c 2010-01-21 20:20:03.340363314 +0100
@@ -2190,6 +2190,14 @@
}
static void
+gdm_session_worker_set_is_failsafe (GdmSessionWorker *worker,
+ gboolean is_failsafe)
+{
+ gdm_session_settings_set_is_failsafe (worker->priv->user_settings,
+ is_failsafe);
+}
+
+static void
on_set_session_name (GdmSessionWorker *worker,
DBusMessage *message)
{
@@ -2212,6 +2220,28 @@
}
static void
+on_set_is_session_failsafe (GdmSessionWorker *worker,
+ DBusMessage *message)
+{
+ DBusError error;
+ const gboolean is_failsafe;
+ dbus_bool_t res;
+
+ dbus_error_init (&error);
+ res = dbus_message_get_args (message,
+ &error,
+ DBUS_TYPE_BOOLEAN, &is_failsafe,
+ DBUS_TYPE_INVALID);
+ if (res) {
+ g_debug ("GdmSessionWorker: is_failsafe for this session set to %i", is_failsafe);
+ gdm_session_worker_set_is_failsafe (worker, is_failsafe);
+ } else {
+ g_warning ("Unable to get arguments: %s", error.message);
+ dbus_error_free (&error);
+ }
+}
+
+static void
gdm_session_worker_set_language_name (GdmSessionWorker *worker,
const char *language_name)
{
@@ -2818,6 +2848,8 @@
on_set_layout_name (worker, message);
} else if (dbus_message_is_signal (message, GDM_SESSION_DBUS_INTERFACE, "SetSessionName")) {
on_set_session_name (worker, message);
+ } else if (dbus_message_is_signal (message, GDM_SESSION_DBUS_INTERFACE, "SetIsFailsafe")) {
+ on_set_is_session_failsafe (worker, message);
} else {
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}