2011-07-28 Brian Cameron <[email protected]> gnome-2-30
authoryippi
Fri, 29 Jul 2011 11:51:02 +0000
branchgnome-2-30
changeset 22042 d88ef0594f24
parent 22040 adfb029f70a9
child 22043 e9af515fdf49
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.
ChangeLog
patches/ConsoleKit-01-ck-dynamic.diff
patches/ConsoleKit-13-vt-switch.diff
patches/gdm-01-dynamic-display.diff
--- 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;
          }