--- a/ChangeLog Fri Jul 29 10:10:43 2011 +0000
+++ b/ChangeLog Fri Jul 29 11:51:02 2011 +0000
@@ -1,3 +1,13 @@
+2011-07-28 Brian Cameron <[email protected]>
+
+ * patches/ConsoleKit-01-ck-dynamic.diff: Now ck-seat-tool -d
+ signals the ConsoleKit daemon when it is going to shut down a
+ display and passes this signal to GDM.
+ * patches/ConsoleKit-13-vt-switch.diff: Now VT switching works
+ better when a user logs out there are no login GUI's available.
+ * patches/gdm-01-dynamic-display.diff: Accepts a new signal
+ so GDM knows when ck-seat-tool is shutting down a display.
+
2011-07-29 Erwann Chenede - <[email protected]>
* specs/SUNWgnome-time-slider.spec: bumped version to 0.2.99
--- a/patches/ConsoleKit-01-ck-dynamic.diff Fri Jul 29 10:10:43 2011 +0000
+++ b/patches/ConsoleKit-01-ck-dynamic.diff Fri Jul 29 11:51:02 2011 +0000
@@ -1166,10 +1166,10 @@
+ } else {
+ sid = generate_seat_id (manager);
+ }
-+
-+ g_debug ("CkManager: Add new seat '%s'.", sid);
- seat = ck_seat_new (sid, kind);
++ g_debug ("CkManager: Add new seat '%s'.", sid);
++
+ seat = ck_seat_new (sid, kind, type);
/* First we connect our own signals to the seat, followed by
@@ -1242,11 +1242,11 @@
- is_static_text = TRUE;
- }
+ char *sid = NULL;
-+
-+ ck_session_get_seat_id (session, &sid, NULL);
- if (is_static_x11 || is_static_text) {
- char *sid;
++ ck_session_get_seat_id (session, &sid, NULL);
++
+ if (! IS_STR_SET (sid)) {
sid = g_strdup_printf ("%s/Seat%u", CK_DBUS_PATH, 1);
- seat = g_hash_table_lookup (manager->priv->seats, sid);
@@ -1940,8 +1940,7 @@
sid = generate_seat_id (manager);
+ orig_sid = g_strdup (sid);
+ seat = ck_seat_new_from_file (&sid, filename);
-
-- seat = ck_seat_new_from_file (sid, filename);
++
+ if (seat == NULL) {
+ /* returns null if connection to bus fails */
+ g_free (sid);
@@ -1949,7 +1948,8 @@
+ manager->priv->seat_serial--;
+ return;
+ }
-+
+
+- seat = ck_seat_new_from_file (sid, filename);
+ if (!g_str_equal (orig_sid, sid)) {
+ manager->priv->seat_serial--;
+ }
@@ -2018,7 +2018,7 @@
}
static void
-@@ -2563,6 +3010,8 @@ ck_manager_new (void)
+@@ -2563,7 +3010,48 @@ ck_manager_new (void)
g_object_unref (manager_object);
return NULL;
}
@@ -2027,6 +2027,46 @@
}
return CK_MANAGER (manager_object);
+ }
++
++gboolean
++ck_manager_will_not_respawn (CkManager *manager,
++ const char *ssid,
++ DBusGMethodInvocation *context)
++{
++ GError *error;
++ CkSeat *seat;
++ CkSession *session;
++ char *sid;
++
++ g_debug ("CkManager: Will not respawn: '%s'.", ssid);
++ session = g_hash_table_lookup (manager->priv->sessions, ssid);
++
++ if (session == NULL) {
++ GError *error;
++
++ error = g_error_new (CK_SEAT_ERROR,
++ CK_SEAT_ERROR_GENERAL,
++ _("Session '%s' doesn't exist"),
++ ssid);
++
++ dbus_g_method_return_error (context, error);
++ g_error_free (error);
++
++ return FALSE;
++ }
++
++ session_set_remove_on_close (session, FALSE, NULL);
++ ck_session_get_seat_id (session, &sid, NULL);
++ seat = g_hash_table_lookup (manager->priv->seats, sid);
++ g_free (sid);
++
++ ck_seat_no_respawn (seat, session, &error);
++
++ dbus_g_method_return (context);
++ return TRUE;
++}
++
diff --git a/src/ck-manager.h b/src/ck-manager.h
index 4bd56e8..4304e71 100644
--- a/src/ck-manager.h
@@ -2041,7 +2081,7 @@
void (* seat_removed) (CkManager *manager,
const char *sid);
void (* system_idle_hint_changed) (CkManager *manager,
-@@ -96,6 +97,9 @@ gboolean ck_manager_get_sessions (CkManager
+@@ -96,6 +97,9 @@ gboolean ck_manager_get_sessi
gboolean ck_manager_get_seats (CkManager *manager,
GPtrArray **seats,
GError **error);
@@ -2051,7 +2091,7 @@
gboolean ck_manager_close_session (CkManager *manager,
const char *cookie,
DBusGMethodInvocation *context);
-@@ -128,6 +132,28 @@ gboolean ck_manager_open_session_with_parameters (CkManager
+@@ -128,6 +132,31 @@ gboolean ck_manager_open_sess
const GPtrArray *parameters,
DBusGMethodInvocation *context);
@@ -2076,6 +2116,9 @@
+gboolean ck_manager_remove_session (CkManager *manager,
+ const char *ssid,
+ DBusGMethodInvocation *context);
++gboolean ck_manager_will_not_respawn (CkManager *manager,
++ const char *cookie,
++ DBusGMethodInvocation *context);
+
G_END_DECLS
@@ -2591,7 +2634,7 @@
g_signal_emit (seat, signals [ACTIVE_SESSION_CHANGED], 0, ssid);
if (old_session != NULL) {
-@@ -526,18 +935,59 @@ change_active_session (CkSeat *seat,
+@@ -526,6 +935,42 @@ change_active_session (CkSeat *seat,
}
static void
@@ -2634,11 +2677,7 @@
update_active_vt (CkSeat *seat,
guint num)
{
- CkSession *session;
- char *device;
-
- device = ck_get_console_device_for_num (num);
-
+@@ -537,7 +982,12 @@ update_active_vt (CkSeat *seat,
g_debug ("Active device: %s", device);
session = find_session_for_display_device (seat, device);
@@ -2652,7 +2691,7 @@
g_free (device);
}
-@@ -547,12 +998,20 @@ maybe_update_active_session (CkSeat *sea
+@@ -547,12 +997,20 @@ maybe_update_active_session (CkSeat *sea
{
guint num;
@@ -2678,7 +2717,7 @@
}
}
-@@ -561,6 +1020,7 @@ session_activate (CkSession
+@@ -561,6 +1019,7 @@ session_activate (CkSession
DBusGMethodInvocation *context,
CkSeat *seat)
{
@@ -2686,7 +2725,7 @@
_seat_activate_session (seat, session, context);
/* always return TRUE to indicate that the signal was handled */
-@@ -584,6 +1044,8 @@ ck_seat_remove_session (CkSeat *
+@@ -584,6 +1043,8 @@ ck_seat_remove_session (CkSeat *
ssid = NULL;
ck_session_get_id (session, &ssid, NULL);
@@ -2695,7 +2734,7 @@
/* Need to get the original key/value */
res = g_hash_table_lookup_extended (seat->priv->sessions,
ssid,
-@@ -628,18 +1090,81 @@ ck_seat_remove_session (CkSeat *
+@@ -628,18 +1089,118 @@ ck_seat_remove_session (CkSeat *
return ret;
}
@@ -2746,6 +2785,43 @@
+ return FALSE;
+}
+
++gboolean
++ck_seat_no_respawn (CkSeat *seat,
++ CkSession *session,
++ GError **error)
++{
++ DBusMessage *message;
++ DBusConnection *connection;
++ DBusMessageIter iter;
++ char *ssid;
++
++ g_return_val_if_fail (CK_IS_SEAT (seat), FALSE);
++ g_return_val_if_fail (CK_IS_SESSION (session), FALSE);
++ g_return_val_if_fail (ck_seat_is_managed (seat), FALSE);
++
++ g_debug ("CkSeat: No Respawn.");
++ ck_session_get_id (session, &ssid, NULL);
++
++ message = dbus_message_new_signal (seat->priv->id,
++ "org.freedesktop.ConsoleKit.Seat",
++ "NoRespawn");
++
++ dbus_message_set_destination (message,
++ dbus_g_proxy_get_bus_name (seat->priv->manager_proxy));
++
++ dbus_message_iter_init_append (message, &iter);
++ dbus_message_iter_append_basic (&iter, DBUS_TYPE_OBJECT_PATH, &ssid);
++
++ connection = dbus_bus_get (DBUS_BUS_SYSTEM, NULL);
++ dbus_connection_send (connection, message, NULL);
++ dbus_connection_unref (connection);
++ dbus_message_unref (message);
++
++ g_free (ssid);
++
++ return FALSE;
++}
++
gboolean
ck_seat_add_session (CkSeat *seat,
CkSession *session,
@@ -2778,7 +2854,7 @@
ck_session_set_seat_id (session, seat->priv->id, NULL);
-@@ -656,6 +1181,10 @@ ck_seat_add_session (CkSeat *sea
+@@ -656,6 +1217,10 @@ ck_seat_add_session (CkSeat *sea
maybe_update_active_session (seat);
@@ -2789,7 +2865,7 @@
g_free (ssid);
return TRUE;
-@@ -742,6 +1271,20 @@ ck_seat_get_kind (CkSeat *seat,
+@@ -742,6 +1307,20 @@ ck_seat_get_kind (CkSeat *seat,
}
gboolean
@@ -2810,7 +2886,7 @@
ck_seat_get_id (CkSeat *seat,
char **id,
GError **error)
-@@ -771,6 +1314,7 @@ ck_seat_register (CkSeat *seat)
+@@ -771,6 +1350,7 @@ ck_seat_register (CkSeat *seat)
GError *error = NULL;
error = NULL;
@@ -2818,7 +2894,7 @@
seat->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
if (seat->priv->connection == NULL) {
if (error != NULL) {
-@@ -858,6 +1402,14 @@ _ck_seat_set_kind (CkSeat *seat,
+@@ -858,6 +1438,14 @@ _ck_seat_set_kind (CkSeat *seat,
}
static void
@@ -2833,7 +2909,7 @@
ck_seat_set_property (GObject *object,
guint prop_id,
const GValue *value,
-@@ -874,6 +1426,9 @@ ck_seat_set_property (GObject
+@@ -874,6 +1462,9 @@ ck_seat_set_property (GObject
case PROP_KIND:
_ck_seat_set_kind (self, g_value_get_enum (value));
break;
@@ -2843,7 +2919,7 @@
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
-@@ -895,7 +1450,10 @@ ck_seat_get_property (GObject *object
+@@ -895,7 +1486,10 @@ ck_seat_get_property (GObject *object
g_value_set_string (value, self->priv->id);
break;
case PROP_KIND:
@@ -2855,7 +2931,7 @@
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-@@ -1008,6 +1566,43 @@ ck_seat_class_init (CkSeatClass *klass)
+@@ -1008,6 +1602,43 @@ ck_seat_class_init (CkSeatClass *klass)
G_TYPE_NONE,
1, CK_TYPE_DEVICE);
@@ -2899,7 +2975,7 @@
g_object_class_install_property (object_class,
PROP_ID,
g_param_spec_string ("id",
-@@ -1024,6 +1619,13 @@ ck_seat_class_init (CkSeatClass *klass)
+@@ -1024,6 +1655,13 @@ ck_seat_class_init (CkSeatClass *klass)
CK_SEAT_KIND_DYNAMIC,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
@@ -2913,7 +2989,7 @@
g_type_class_add_private (klass, sizeof (CkSeatPrivate));
dbus_g_object_type_install_info (CK_TYPE_SEAT, &dbus_glib_ck_seat_object_info);
-@@ -1039,6 +1641,7 @@ ck_seat_init (CkSeat *seat)
+@@ -1039,6 +1677,7 @@ ck_seat_init (CkSeat *seat)
g_free,
(GDestroyNotify) g_object_unref);
seat->priv->devices = g_ptr_array_new ();
@@ -2921,7 +2997,7 @@
}
static void
-@@ -1064,28 +1667,32 @@ ck_seat_finalize (GObject *object)
+@@ -1064,28 +1703,32 @@ ck_seat_finalize (GObject *object)
g_ptr_array_free (seat->priv->devices, TRUE);
g_hash_table_destroy (seat->priv->sessions);
g_free (seat->priv->id);
@@ -2958,7 +3034,7 @@
{
GObject *object;
int i;
-@@ -1100,27 +1707,62 @@ ck_seat_new_with_devices (const char *si
+@@ -1100,27 +1743,62 @@ ck_seat_new_with_devices (const char *si
ck_seat_add_device (CK_SEAT (object), g_ptr_array_index (devices, i), NULL);
}
}
@@ -3032,7 +3108,7 @@
key_file = g_key_file_new ();
error = NULL;
res = g_key_file_load_from_file (key_file,
-@@ -1145,9 +1787,52 @@ ck_seat_new_from_file (const char *sid,
+@@ -1145,9 +1823,52 @@ ck_seat_new_from_file (const char *sid,
goto out;
}
@@ -3086,7 +3162,7 @@
devices = g_ptr_array_sized_new (ndevices);
-@@ -1176,11 +1861,12 @@ ck_seat_new_from_file (const char *sid,
+@@ -1176,11 +1897,12 @@ ck_seat_new_from_file (const char *sid,
g_strfreev (split);
}
g_strfreev (device_list);
@@ -3101,7 +3177,7 @@
out:
g_key_file_free (key_file);
-@@ -1348,10 +2034,15 @@ ck_seat_dump (CkSeat *seat,
+@@ -1348,10 +2070,15 @@ ck_seat_dump (CkSeat *seat,
error = NULL;
if (! ck_session_get_id (seat->priv->active_session, &session_id, &error)) {
@@ -3121,7 +3197,7 @@
} else {
g_key_file_set_string (key_file,
group_name,
-@@ -1363,3 +2054,24 @@ ck_seat_dump (CkSeat *seat,
+@@ -1363,3 +2090,24 @@ ck_seat_dump (CkSeat *seat,
g_free (group_name);
}
@@ -3190,7 +3266,7 @@
gboolean ck_seat_register (CkSeat *seat);
-@@ -104,18 +112,31 @@ void ck_seat_dump (CkSeat *seat,
+@@ -104,18 +112,31 @@ void ck_seat_dump
gboolean ck_seat_get_kind (CkSeat *seat,
CkSeatKind *kind,
GError **error);
@@ -3222,7 +3298,7 @@
/* exported methods */
gboolean ck_seat_get_id (CkSeat *seat,
-@@ -137,6 +158,10 @@ gboolean ck_seat_can_activate_sessions (CkSeat *seat,
+@@ -137,6 +158,14 @@ gboolean ck_seat_can_activate
gboolean ck_seat_activate_session (CkSeat *seat,
const char *ssid,
DBusGMethodInvocation *context);
@@ -3230,6 +3306,10 @@
+ DBusGMethodInvocation *context);
+gboolean ck_seat_unmanage (CkSeat *seat,
+ DBusGMethodInvocation *context);
++
++gboolean ck_seat_no_respawn (CkSeat *seat,
++ CkSession *session,
++ GError **error);
G_END_DECLS
@@ -4232,9 +4312,9 @@
goto out;
}
diff --git a/src/org.freedesktop.ConsoleKit.Manager.xml b/src/org.freedesktop.ConsoleKit.Manager.xml
-index f903b55..34a6d04 100644
--- a/src/org.freedesktop.ConsoleKit.Manager.xml
+++ b/src/org.freedesktop.ConsoleKit.Manager.xml
+index f903b55..34a6d04 100644
@@ -160,6 +160,23 @@
</doc:doc>
</method>
@@ -4259,7 +4339,30 @@
<method name="GetSessions">
<arg name="sessions" direction="out" type="ao">
<doc:doc>
-@@ -310,12 +327,115 @@
+@@ -196,6 +213,22 @@
+ </doc:description>
+ </doc:doc>
+ </method>
++
++ <method name="WillNotRespawn">
++ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
++ <arg name="ssid" type="o" direction="in">
++ <doc:doc>
++ <doc:summary>The session id of the session</doc:summary>
++ </doc:doc>
++ </arg>
++ <doc:doc>
++ <doc:description>
++ <doc:para>This may be used to set Remove On Close for a Session.
++ </doc:para>
++ </doc:description>
++ </doc:doc>
++ </method>
++
+ <method name="GetSessionForUnixProcess">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <arg name="pid" direction="in" type="u">
+@@ -310,12 +343,115 @@
</doc:doc>
</method>
@@ -4404,7 +4507,7 @@
<signal name="ActiveSessionChanged">
<arg name="ssid" type="o">
<doc:doc>
-@@ -160,5 +178,61 @@ seat at a time.</doc:para>
+@@ -160,5 +178,73 @@ seat at a time.</doc:para>
</doc:description>
</doc:doc>
</signal>
@@ -4457,6 +4560,18 @@
+ </doc:description>
+ </doc:doc>
+ </signal>
++ <signal name="NoRespawn">
++ <arg name="ssid" type="o">
++ <doc:doc>
++ <doc:summary>The session id of the session to not respawn</doc:summary>
++ </doc:doc>
++ </arg>
++ <doc:doc>
++ <doc:description>
++ <doc:para>Emitted when ck-seat-tool indicates a session is to be removed.</doc:para>
++ </doc:description>
++ </doc:doc>
++ </signal>
+ <signal name="RemoveRequest">
+ <doc:doc>
+ <doc:description>
@@ -4818,7 +4933,7 @@
index 0000000..0879d0d
--- /dev/null
+++ b/tools/ck-seat-tool.c
-@@ -0,0 +1,443 @@
+@@ -0,0 +1,449 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2009 Sun Microsystems, Inc.
@@ -5175,6 +5290,12 @@
+ sid = find_seat_id_from_session_id (connection, proxy, ssid, &is_last_session);
+
+ dbus_g_proxy_call_no_reply (proxy,
++ "WillNotRespawn",
++ DBUS_TYPE_G_OBJECT_PATH, ssid,
++ G_TYPE_INVALID,
++ G_TYPE_INVALID);
++
++ dbus_g_proxy_call_no_reply (proxy,
+ "RemoveSession",
+ DBUS_TYPE_G_OBJECT_PATH, ssid,
+ G_TYPE_INVALID,
--- a/patches/ConsoleKit-13-vt-switch.diff Fri Jul 29 10:10:43 2011 +0000
+++ b/patches/ConsoleKit-13-vt-switch.diff Fri Jul 29 11:51:02 2011 +0000
@@ -1,17 +1,53 @@
---- ConsoleKit-0.4.1/src/ck-seat.c-orig 2011-07-20 05:16:51.376808748 -0500
-+++ ConsoleKit-0.4.1/src/ck-seat.c 2011-07-20 08:37:34.776746117 -0500
-@@ -1036,6 +1036,10 @@ ck_seat_remove_session (CkSeat *
+--- ConsoleKit-0.4.1/src/ck-seat.c-orig 2011-07-28 01:25:03.688403859 -0500
++++ ConsoleKit-0.4.1/src/ck-seat.c 2011-07-28 01:27:24.076536756 -0500
+@@ -950,9 +950,32 @@ find_possible_session_to_activate (CkSea
+ ck_session_is_open (value, &is_open, NULL);
+
+ if (is_open) {
++ GError *vt_error = NULL;
++ char *device;
++ guint num;
++ gboolean ret;
++
+ login_session = NULL;
+- change_active_session (seat, value);
+- break;
++
++ g_debug ("Found open session.");
++
++ switch (seat->priv->kind) {
++ case CK_SEAT_KIND_STATIC:
++ device = NULL;
++ ck_session_get_x11_display_device (value, &device, NULL);
++
++ if (device != NULL) {
++ ret = ck_get_console_num_from_device (device, &num);
++ if (ret) {
++ g_debug ("Activating VT %d", num);
++ ck_vt_monitor_set_active (seat->priv->vt_monitor, num, &vt_error);
++ }
++ }
++ break;
++ case CK_SEAT_KIND_DYNAMIC:
++ change_active_session (seat, value);
++ break;
++ }
+ }
+
+ ck_session_get_session_type (value, &session_type, NULL);
+@@ -1036,6 +1059,11 @@ ck_seat_remove_session (CkSeat *
CkSession *orig_session;
gboolean res;
gboolean ret;
+ GHashTableIter iter;
+ gpointer key, value;
+ gboolean found_login = FALSE;
++ gboolean is_open;
+ char *session_type = NULL;
g_return_val_if_fail (CK_IS_SEAT (seat), FALSE);
-@@ -1075,7 +1079,38 @@ ck_seat_remove_session (CkSeat *
+@@ -1075,7 +1103,46 @@ ck_seat_remove_session (CkSeat *
g_signal_emit (seat, signals [SESSION_REMOVED], 0, ssid);
/* try to change the active session */
@@ -22,26 +58,34 @@
+ if (seat->priv->kind == CK_SEAT_KIND_STATIC) {
+ while (seat->priv->kind == CK_SEAT_KIND_STATIC && g_hash_table_iter_next (&iter, &key, &value)) {
+ CkSession *login_session = value;
++ ck_session_get_session_type (login_session, &session_type, NULL);
++ ck_session_is_open (login_session, &is_open, NULL);
+
-+ ck_session_get_session_type (login_session, &session_type, NULL);
-+ if (IS_STR_SET (session_type) &&
++ if (is_open && IS_STR_SET (session_type) &&
+ g_str_equal (session_type, "LoginWindow")) {
+ GError *vt_error = NULL;
+ char *device;
-+ guint num;
++ guint num;
+
-+ g_debug ("Changing active session to LoginWindow");
-+ found_login = TRUE;
++ g_debug ("Found a LoginWindow");
+ device = NULL;
+ ck_session_get_x11_display_device (login_session, &device, NULL);
-+ g_debug ("Changing active session to LoginWindow for device %s", device);
-+ ret = ck_get_console_num_from_device (device, &num);
-+ if (ret) {
-+ g_debug ("setting active to %d", num);
-+ ck_vt_monitor_set_active (seat->priv->vt_monitor, num, &vt_error);
++
++ if (device != NULL) {
++ ret = ck_get_console_num_from_device (device, &num);
++ if (ret) {
++ g_debug ("Setting active to %d", num);
++ found_login = TRUE;
++ ck_vt_monitor_set_active (seat->priv->vt_monitor, num, &vt_error);
++ } else {
++ g_debug ("The LoginWindow device has no console number, not using.");
++ }
++ } else {
++ g_debug ("The LoginWindow display has no x11 display device, not using.");
+ }
++ }
++ if (session_type != NULL)
+ g_free (session_type);
-+ }
+ }
+ }
+
--- a/patches/gdm-01-dynamic-display.diff Fri Jul 29 10:10:43 2011 +0000
+++ b/patches/gdm-01-dynamic-display.diff Fri Jul 29 11:51:02 2011 +0000
@@ -571,20 +571,22 @@
static gboolean
finish_idle (GdmDisplay *display)
{
-@@ -513,6 +538,12 @@ slave_exited (GdmSlaveProxy *proxy
+@@ -513,6 +538,14 @@ slave_exited (GdmSlaveProxy *proxy
{
g_debug ("GdmDisplay: Slave exited: %d", code);
-+ if (code != 0) {
-+ gdm_dynamic_display_respawn (TRUE);
-+ } else {
-+ gdm_dynamic_display_respawn (FALSE);
++ if (GDM_IS_DYNAMIC_DISPLAY (display)) {
++ if (code != 0) {
++ gdm_dynamic_display_respawn (GDM_DYNAMIC_DISPLAY (display), TRUE);
++ } else {
++ gdm_dynamic_display_respawn (GDM_DYNAMIC_DISPLAY (display), FALSE);
++ }
+ }
+
queue_finish (display);
}
-@@ -550,10 +581,12 @@ gdm_display_real_prepare (GdmDisplay *di
+@@ -550,10 +583,12 @@ gdm_display_real_prepare (GdmDisplay *di
g_assert (display->priv->slave_proxy == NULL);
@@ -601,7 +603,7 @@
}
_gdm_display_set_status (display, GDM_DISPLAY_PREPARED);
-@@ -742,6 +775,20 @@ gdm_display_get_id (GdmDisplay *
+@@ -742,6 +777,20 @@ gdm_display_get_id (GdmDisplay *
}
gboolean
@@ -622,7 +624,7 @@
gdm_display_get_x11_display_name (GdmDisplay *display,
char **x11_display,
GError **error)
-@@ -756,6 +803,20 @@ gdm_display_get_x11_display_name (GdmDis
+@@ -756,6 +805,20 @@ gdm_display_get_x11_display_name (GdmDis
}
gboolean
@@ -643,7 +645,7 @@
gdm_display_is_local (GdmDisplay *display,
gboolean *local,
GError **error)
-@@ -769,6 +830,20 @@ gdm_display_is_local (GdmDisplay *displa
+@@ -769,6 +832,20 @@ gdm_display_is_local (GdmDisplay *displa
return TRUE;
}
@@ -664,7 +666,7 @@
static void
_gdm_display_set_id (GdmDisplay *display,
const char *id)
-@@ -778,6 +853,14 @@ _gdm_display_set_id (GdmDisplay *dis
+@@ -778,6 +855,14 @@ _gdm_display_set_id (GdmDisplay *dis
}
static void
@@ -679,7 +681,7 @@
_gdm_display_set_seat_id (GdmDisplay *display,
const char *seat_id)
{
-@@ -786,6 +869,24 @@ _gdm_display_set_seat_id (GdmDisplay
+@@ -786,6 +871,24 @@ _gdm_display_set_seat_id (GdmDisplay
}
static void
@@ -704,7 +706,7 @@
_gdm_display_set_remote_hostname (GdmDisplay *display,
const char *hostname)
{
-@@ -809,6 +910,14 @@ _gdm_display_set_x11_display_name (GdmDi
+@@ -809,6 +912,14 @@ _gdm_display_set_x11_display_name (GdmDi
}
static void
@@ -719,7 +721,7 @@
_gdm_display_set_x11_cookie (GdmDisplay *display,
const char *x11_cookie)
{
-@@ -824,6 +933,13 @@ _gdm_display_set_is_local (GdmDisplay
+@@ -824,6 +935,13 @@ _gdm_display_set_is_local (GdmDisplay
}
static void
@@ -733,7 +735,7 @@
_gdm_display_set_slave_command (GdmDisplay *display,
const char *command)
{
-@@ -832,6 +948,13 @@ _gdm_display_set_slave_command (GdmDispl
+@@ -832,6 +950,13 @@ _gdm_display_set_slave_command (GdmDispl
}
static void
@@ -747,7 +749,7 @@
gdm_display_set_property (GObject *object,
guint prop_id,
const GValue *value,
-@@ -845,12 +968,18 @@ gdm_display_set_property (GObject
+@@ -845,12 +970,18 @@ gdm_display_set_property (GObject
case PROP_ID:
_gdm_display_set_id (self, g_value_get_string (value));
break;
@@ -766,7 +768,7 @@
case PROP_REMOTE_HOSTNAME:
_gdm_display_set_remote_hostname (self, g_value_get_string (value));
break;
-@@ -860,15 +989,24 @@ gdm_display_set_property (GObject
+@@ -860,15 +991,24 @@ gdm_display_set_property (GObject
case PROP_X11_DISPLAY_NAME:
_gdm_display_set_x11_display_name (self, g_value_get_string (value));
break;
@@ -791,7 +793,7 @@
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
-@@ -889,12 +1027,18 @@ gdm_display_get_property (GObject
+@@ -889,12 +1029,18 @@ gdm_display_get_property (GObject
case PROP_ID:
g_value_set_string (value, self->priv->id);
break;
@@ -810,7 +812,7 @@
case PROP_REMOTE_HOSTNAME:
g_value_set_string (value, self->priv->remote_hostname);
break;
-@@ -904,6 +1048,9 @@ gdm_display_get_property (GObject
+@@ -904,6 +1050,9 @@ gdm_display_get_property (GObject
case PROP_X11_DISPLAY_NAME:
g_value_set_string (value, self->priv->x11_display_name);
break;
@@ -820,7 +822,7 @@
case PROP_X11_COOKIE:
g_value_set_string (value, self->priv->x11_cookie);
break;
-@@ -914,9 +1061,15 @@ gdm_display_get_property (GObject
+@@ -914,9 +1063,15 @@ gdm_display_get_property (GObject
case PROP_IS_LOCAL:
g_value_set_boolean (value, self->priv->is_local);
break;
@@ -836,7 +838,7 @@
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
-@@ -1033,6 +1186,13 @@ gdm_display_class_init (GdmDisplayClass
+@@ -1033,6 +1188,13 @@ gdm_display_class_init (GdmDisplayClass
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class,
@@ -850,7 +852,7 @@
PROP_REMOTE_HOSTNAME,
g_param_spec_string ("remote-hostname",
"remote-hostname",
-@@ -1056,6 +1216,13 @@ gdm_display_class_init (GdmDisplayClass
+@@ -1056,6 +1218,13 @@ gdm_display_class_init (GdmDisplayClass
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class,
@@ -864,7 +866,7 @@
PROP_SEAT_ID,
g_param_spec_string ("seat-id",
"seat id",
-@@ -1063,6 +1230,13 @@ gdm_display_class_init (GdmDisplayClass
+@@ -1063,6 +1232,13 @@ gdm_display_class_init (GdmDisplayClass
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
g_object_class_install_property (object_class,
@@ -878,7 +880,7 @@
PROP_X11_COOKIE,
g_param_spec_string ("x11-cookie",
"cookie",
-@@ -1076,7 +1250,6 @@ gdm_display_class_init (GdmDisplayClass
+@@ -1076,7 +1252,6 @@ gdm_display_class_init (GdmDisplayClass
"authority file",
NULL,
G_PARAM_READABLE));
@@ -886,7 +888,7 @@
g_object_class_install_property (object_class,
PROP_IS_LOCAL,
g_param_spec_boolean ("is-local",
-@@ -1084,7 +1257,13 @@ gdm_display_class_init (GdmDisplayClass
+@@ -1084,7 +1259,13 @@ gdm_display_class_init (GdmDisplayClass
NULL,
TRUE,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
@@ -901,7 +903,7 @@
g_object_class_install_property (object_class,
PROP_SLAVE_COMMAND,
g_param_spec_string ("slave-command",
-@@ -1093,6 +1272,13 @@ gdm_display_class_init (GdmDisplayClass
+@@ -1093,6 +1274,13 @@ gdm_display_class_init (GdmDisplayClass
DEFAULT_SLAVE_COMMAND,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
g_object_class_install_property (object_class,
@@ -915,7 +917,7 @@
PROP_STATUS,
g_param_spec_int ("status",
"status",
-@@ -1131,9 +1317,12 @@ gdm_display_finalize (GObject *object)
+@@ -1131,9 +1319,12 @@ gdm_display_finalize (GObject *object)
g_debug ("GdmDisplay: Finalizing display: %s", display->priv->id);
g_free (display->priv->id);
@@ -928,7 +930,7 @@
g_free (display->priv->x11_cookie);
g_free (display->priv->slave_command);
-@@ -1151,3 +1340,25 @@ gdm_display_finalize (GObject *object)
+@@ -1151,3 +1342,25 @@ gdm_display_finalize (GObject *object)
G_OBJECT_CLASS (gdm_display_parent_class)->finalize (object);
}
@@ -1076,7 +1078,7 @@
index 0000000..c0beced
--- /dev/null
+++ b/daemon/gdm-dynamic-display.c
-@@ -0,0 +1,234 @@
+@@ -0,0 +1,246 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Authors: [email protected]
@@ -1124,7 +1126,8 @@
+
+struct _GdmDynamicDisplayPrivate
+{
-+ gpointer dummy;
++ gboolean removed;
++ gboolean do_respawn;
+};
+
+enum {
@@ -1137,17 +1140,22 @@
+
+G_DEFINE_TYPE (GdmDynamicDisplay, gdm_dynamic_display, GDM_TYPE_DISPLAY)
+
-+static gboolean do_respawn = FALSE;
-+
-+void gdm_dynamic_display_respawn (gboolean respawn)
++void
++gdm_dynamic_display_respawn (GdmDynamicDisplay *display, gboolean respawn)
+{
-+ do_respawn = respawn;
-+ if (do_respawn == TRUE)
++ display->priv->do_respawn = respawn;
++ if (display->priv->do_respawn == TRUE)
+ g_debug ("GdmDynamicDisplay: Set respawn to TRUE.");
+ else
+ g_debug ("GdmDynamicDisplay: Set respawn to FALSE.");
+}
+
++void
++gdm_dynamic_display_removed (GdmDynamicDisplay *display)
++{
++ display->priv->removed = TRUE;
++}
++
+static gboolean
+gdm_dynamic_display_create_authority (GdmDisplay *display)
+{
@@ -1182,8 +1190,6 @@
+
+ g_debug ("GdmDynamicDisplay: Manage dynamic display");
+
-+ do_respawn = FALSE;
-+
+ GDM_DISPLAY_CLASS (gdm_dynamic_display_parent_class)->manage (display);
+
+ return TRUE;
@@ -1205,10 +1211,18 @@
+ gdm_display_unmanage (display);
+
+ status = gdm_display_get_status (display);
-+ if (do_respawn == TRUE) {
-+ g_debug ("Respawning...");
-+ gdm_display_manage (display);
++ if (GDM_DYNAMIC_DISPLAY (display)->priv->do_respawn == TRUE &&
++ GDM_DYNAMIC_DISPLAY(display)->priv->removed == FALSE) {
++ if (status != GDM_DISPLAY_FAILED) {
++ g_debug ("Respawning...");
++ gdm_display_manage (display);
++ } else {
++ g_debug ("Display failed, not respawning...");
++ }
++ } else {
++ g_debug ("Not respawning...");
+ }
++ GDM_DYNAMIC_DISPLAY (display)->priv->do_respawn = FALSE;
+
+ return TRUE;
+}
@@ -1269,14 +1283,14 @@
+ display_class->unmanage = gdm_dynamic_display_unmanage;
+
+ g_type_class_add_private (klass, sizeof (GdmDynamicDisplayPrivate));
-+
+}
+
+static void
+gdm_dynamic_display_init (GdmDynamicDisplay *display)
+{
-+
+ display->priv = GDM_DYNAMIC_DISPLAY_GET_PRIVATE (display);
++ display->priv->removed = FALSE;
++ display->priv->do_respawn = FALSE;
+}
+
+static void
@@ -1316,7 +1330,7 @@
index 0000000..9595a40
--- /dev/null
+++ b/daemon/gdm-dynamic-display.h
-@@ -0,0 +1,59 @@
+@@ -0,0 +1,60 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Authors: [email protected]
@@ -1371,7 +1385,8 @@
+
+GType gdm_dynamic_display_get_type (void);
+GdmDisplay * gdm_dynamic_display_new (int display_number);
-+void gdm_dynamic_display_respawn (gboolean respawn);
++void gdm_dynamic_display_respawn (GdmDynamicDisplay *display, gboolean respawn);
++void gdm_dynamic_display_removed (GdmDynamicDisplay *display);
+
+G_END_DECLS
+
@@ -1677,10 +1692,7 @@
+ "gdm-local-display-factory-console-session-requests") != NULL;
+}
+
- static void
--on_static_display_status_changed (GdmDisplay *display,
-- GParamSpec *arg1,
-- GdmLocalDisplayFactory *factory)
++static void
+manage_next_pending_session_on_display (GdmLocalDisplayFactory *factory,
+ GdmDisplay *display)
+{
@@ -1768,7 +1780,10 @@
+ }
+}
+
-+static void
+ static void
+-on_static_display_status_changed (GdmDisplay *display,
+- GParamSpec *arg1,
+- GdmLocalDisplayFactory *factory)
+on_display_status_changed (GdmDisplay *display,
+ GParamSpec *arg1,
+ GdmLocalDisplayFactory *factory)
@@ -1822,7 +1837,7 @@
break;
case GDM_DISPLAY_PREPARED:
break;
-@@ -329,42 +550,500 @@ on_static_display_status_changed (GdmDis
+@@ -329,42 +550,534 @@ on_static_display_status_changed (GdmDis
}
}
@@ -2038,7 +2053,7 @@
+ g_free (display_ssid);
+ discard_pending_session_on_display (factory, display, ssid);
+ return;
- }
++ }
+ g_free (display_ssid);
+
+ if (! gdm_display_unmanage (display)) {
@@ -2050,6 +2065,32 @@
+ store_remove_display (factory, display_number, display);
+}
+
++static void
++seat_session_no_respawn (DBusGProxy *seat_proxy,
++ const char *ssid,
++ GdmLocalDisplayFactory *factory)
++{
++ GdmDisplay *display;
++ int display_number;
++ char *display_ssid;
++
++ g_debug ("GdmLocalDisplayFactory: No Respawn");
++
++ g_return_if_fail (GDM_IS_LOCAL_DISPLAY_FACTORY (factory));
++
++ display = factory_find_display (factory, lookup_by_session, (gpointer)ssid);
++
++ if (display == NULL) {
++ g_debug ("GdmLocalDisplayFactory: display for session '%s' doesn't exists", ssid);
++ return;
+ }
+
+- return display;
++ if (GDM_IS_DYNAMIC_DISPLAY (display)) {
++ gdm_dynamic_display_removed (GDM_DYNAMIC_DISPLAY (display));
++ }
++}
++
+static gboolean
+get_session_x11_display (GdmLocalDisplayFactory *factory,
+ const char *ssid,
@@ -2239,6 +2280,10 @@
+ DBUS_TYPE_G_OBJECT_PATH,
+ G_TYPE_INVALID);
+ dbus_g_proxy_add_signal (proxy,
++ "NoRespawn",
++ DBUS_TYPE_G_OBJECT_PATH,
++ G_TYPE_INVALID);
++ dbus_g_proxy_add_signal (proxy,
+ "SessionAdded",
+ DBUS_TYPE_G_OBJECT_PATH,
+ G_TYPE_INVALID);
@@ -2260,6 +2305,11 @@
+ factory,
+ NULL);
+ dbus_g_proxy_connect_signal (proxy,
++ "NoRespawn",
++ G_CALLBACK (seat_session_no_respawn),
++ factory,
++ NULL);
++ dbus_g_proxy_connect_signal (proxy,
+ "SessionAdded",
+ G_CALLBACK (seat_session_added),
+ factory,
@@ -2341,12 +2391,11 @@
+ }
+
+ return TRUE;
-
-- return display;
++
}
static gboolean
-@@ -379,7 +1058,7 @@ gdm_local_display_factory_start (GdmDisp
+@@ -379,7 +1092,7 @@ gdm_local_display_factory_start (GdmDisp
ret = TRUE;
/* FIXME: use seat configuration */
@@ -2355,7 +2404,7 @@
if (display == NULL) {
ret = FALSE;
}
-@@ -443,6 +1122,67 @@ register_factory (GdmLocalDisplayFactory
+@@ -443,6 +1156,67 @@ register_factory (GdmLocalDisplayFactory
return TRUE;
}
@@ -2423,7 +2472,7 @@
static GObject *
gdm_local_display_factory_constructor (GType type,
guint n_construct_properties,
-@@ -460,6 +1200,8 @@ gdm_local_display_factory_constructor (G
+@@ -460,6 +1234,8 @@ gdm_local_display_factory_constructor (G
g_warning ("Unable to register local display factory with system bus");
}
@@ -2432,7 +2481,7 @@
return G_OBJECT (factory);
}
-@@ -488,6 +1230,11 @@ gdm_local_display_factory_init (GdmLocal
+@@ -488,6 +1264,11 @@ gdm_local_display_factory_init (GdmLocal
factory->priv = GDM_LOCAL_DISPLAY_FACTORY_GET_PRIVATE (factory);
factory->priv->displays = g_hash_table_new (NULL, NULL);
@@ -2444,7 +2493,7 @@
}
static void
-@@ -503,6 +1250,9 @@ gdm_local_display_factory_finalize (GObj
+@@ -503,6 +1284,9 @@ gdm_local_display_factory_finalize (GObj
g_return_if_fail (factory->priv != NULL);
g_hash_table_destroy (factory->priv->displays);
@@ -4251,16 +4300,11 @@
static void
--- gdm-2.30.6/daemon/gdm-slave-proxy.c-orig 2011-07-27 09:59:59.771080840 -0500
+++ gdm-2.30.6/daemon/gdm-slave-proxy.c 2011-07-27 10:04:27.246033622 -0500
-@@ -245,6 +245,12 @@ kill_slave (GdmSlaveProxy *slave)
+@@ -245,6 +245,7 @@ kill_slave (GdmSlaveProxy *slave)
g_warning ("Unable to kill slave process");
} else {
exit_status = gdm_wait_on_pid (slave->priv->pid);
+ g_debug ("GdmSlaveProxy: Slave exit status %d", exit_status);
-+ if (exit_status != 0) {
-+ gdm_dynamic_display_respawn (TRUE);
-+ } else {
-+ gdm_dynamic_display_respawn (FALSE);
-+ }
g_spawn_close_pid (slave->priv->pid);
slave->priv->pid = 0;
}