gdm r5968 - in trunk: . daemon gui/simple-greeter



Author: halfline
Date: Sun Mar  9 21:27:33 2008
New Revision: 5968
URL: http://svn.gnome.org/viewvc/gdm?rev=5968&view=rev

Log:
2008-03-09  Ray Strode  <rstrode redhat com>

	* daemon/gdm-simple-slave.c:
	(GdmSimpleSlavePrivate),
	(gdm_simple_slave_accredit_when_ready),
	(on_start_session_when_ready),
	(on_start_session_later),
	(setup_server):
	* daemon/gdm-greeter-server.[ch]:
	(handle_start_session_when_ready):
	(greeter_handle_child_message):
	(do_introspect):
	(gdm_greeter_server_class_init):
	* gui/simple-greeter/gdm-greeter-client.[ch]:
	(gdm_greeter_client_call_start_session_when_ready):
	After successfully verifying the user, wait until
	the greeter gives the go ahead before starting the
	user's session


Modified:
   trunk/ChangeLog
   trunk/daemon/gdm-greeter-server.c
   trunk/daemon/gdm-greeter-server.h
   trunk/daemon/gdm-simple-slave.c
   trunk/gui/simple-greeter/gdm-greeter-client.c
   trunk/gui/simple-greeter/gdm-greeter-client.h

Modified: trunk/daemon/gdm-greeter-server.c
==============================================================================
--- trunk/daemon/gdm-greeter-server.c	(original)
+++ trunk/daemon/gdm-greeter-server.c	Sun Mar  9 21:27:33 2008
@@ -80,6 +80,8 @@
         CANCELLED,
         CONNECTED,
         DISCONNECTED,
+        START_SESSION_WHEN_READY,
+        START_SESSION_LATER,
         LAST_SIGNAL
 };
 
@@ -546,6 +548,38 @@
 }
 
 static DBusHandlerResult
+handle_start_session_when_ready (GdmGreeterServer *greeter_server,
+                                 DBusConnection   *connection,
+                                 DBusMessage      *message)
+{
+        DBusMessage *reply;
+        DBusError    error;
+        gboolean     should_start_session;
+
+        dbus_error_init (&error);
+        if (! dbus_message_get_args (message, &error,
+                                     DBUS_TYPE_BOOLEAN, &should_start_session,
+                                     DBUS_TYPE_INVALID)) {
+                g_warning ("ERROR: %s", error.message);
+        }
+
+        g_debug ("GreeterServer: %sStartSessionWhenReady",
+                 should_start_session? "" : "Don't ");
+
+        reply = dbus_message_new_method_return (message);
+        dbus_connection_send (connection, reply, NULL);
+        dbus_message_unref (reply);
+
+        if (should_start_session) {
+                g_signal_emit (greeter_server, signals [START_SESSION_WHEN_READY], 0);
+        } else {
+                g_signal_emit (greeter_server, signals [START_SESSION_LATER] ,0);
+        }
+
+        return DBUS_HANDLER_RESULT_HANDLED;
+}
+
+static DBusHandlerResult
 greeter_handle_child_message (DBusConnection *connection,
                               DBusMessage    *message,
                               void           *user_data)
@@ -574,6 +608,8 @@
                 return handle_disconnect (greeter_server, connection, message);
         } else if (dbus_message_is_method_call (message, GDM_GREETER_SERVER_DBUS_INTERFACE, "GetDisplayId")) {
                 return handle_get_display_id (greeter_server, connection, message);
+        } else if (dbus_message_is_method_call (message, GDM_GREETER_SERVER_DBUS_INTERFACE, "StartSessionWhenReady")) {
+                return handle_start_session_when_ready (greeter_server, connection, message);
         }
 
         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
@@ -630,6 +666,9 @@
                                "    <method name=\"GetDisplayId\">\n"
                                "      <arg name=\"id\" direction=\"out\" type=\"o\"/>\n"
                                "    </method>\n"
+                               "    <method name=\"StartSessionWhenReady\">\n"
+                               "      <arg name=\"should_start_session\" type=\"b\"/>\n"
+                               "    </method>\n"
                                "    <signal name=\"Info\">\n"
                                "      <arg name=\"text\" type=\"s\"/>\n"
                                "    </signal>\n"
@@ -1128,6 +1167,28 @@
                               g_cclosure_marshal_VOID__VOID,
                               G_TYPE_NONE,
                               0);
+
+        signals [START_SESSION_WHEN_READY] =
+                g_signal_new ("start-session-when-ready",
+                              G_OBJECT_CLASS_TYPE (object_class),
+                              G_SIGNAL_RUN_FIRST,
+                              G_STRUCT_OFFSET (GdmGreeterServerClass, start_session_when_ready),
+                              NULL,
+                              NULL,
+                              g_cclosure_marshal_VOID__VOID,
+                              G_TYPE_NONE,
+                              0);
+
+        signals [START_SESSION_LATER] =
+                g_signal_new ("start-session-later",
+                              G_OBJECT_CLASS_TYPE (object_class),
+                              G_SIGNAL_RUN_FIRST,
+                              G_STRUCT_OFFSET (GdmGreeterServerClass, start_session_later),
+                              NULL,
+                              NULL,
+                              g_cclosure_marshal_VOID__VOID,
+                              G_TYPE_NONE,
+                              0);
 }
 
 static void

Modified: trunk/daemon/gdm-greeter-server.h
==============================================================================
--- trunk/daemon/gdm-greeter-server.h	(original)
+++ trunk/daemon/gdm-greeter-server.h	Sun Mar  9 21:27:33 2008
@@ -62,6 +62,8 @@
         void (* cancelled)                  (GdmGreeterServer  *greeter_server);
         void (* connected)                  (GdmGreeterServer  *greeter_server);
         void (* disconnected)               (GdmGreeterServer  *greeter_server);
+        void (* start_session_when_ready)   (GdmGreeterServer  *greeter_server);
+        void (* start_session_later)        (GdmGreeterServer  *greeter_server);
 } GdmGreeterServerClass;
 
 GType               gdm_greeter_server_get_type              (void);

Modified: trunk/daemon/gdm-simple-slave.c
==============================================================================
--- trunk/daemon/gdm-simple-slave.c	(original)
+++ trunk/daemon/gdm-simple-slave.c	Sun Mar  9 21:27:33 2008
@@ -77,6 +77,9 @@
         GdmGreeterServer  *greeter_server;
         GdmGreeterSession *greeter;
         GdmSessionDirect  *session;
+
+        guint              start_session_when_ready : 1;
+        guint              waiting_to_start_session : 1;
 };
 
 enum {
@@ -204,14 +207,21 @@
 }
 
 static void
+gdm_simple_slave_accredit_when_ready (GdmSimpleSlave *slave)
+{
+        if (slave->priv->start_session_when_ready) {
+                gdm_session_accredit (GDM_SESSION (slave->priv->session),
+                                      GDM_SESSION_CRED_ESTABLISH);
+        } else {
+                slave->priv->waiting_to_start_session = TRUE;
+        }
+}
+
+static void
 on_session_authorized (GdmSession     *session,
                        GdmSimpleSlave *slave)
 {
-        int flag;
-
-        flag = GDM_SESSION_CRED_ESTABLISH;
-
-        gdm_session_accredit (session, flag);
+        gdm_simple_slave_accredit_when_ready (slave);
 }
 
 static void
@@ -676,6 +686,28 @@
 }
 
 static void
+on_start_session_when_ready (GdmGreeterServer *session,
+                             GdmSimpleSlave   *slave)
+{
+        g_debug ("GdmSimpleSlave: Will start session when ready");
+        slave->priv->start_session_when_ready = TRUE;
+
+        if (slave->priv->waiting_to_start_session) {
+                gdm_simple_slave_accredit_when_ready (slave);
+        }
+}
+
+static void
+on_start_session_later (GdmGreeterServer *session,
+                        GdmSimpleSlave   *slave)
+{
+        g_debug ("GdmSimpleSlave: Will start session when ready and told");
+        slave->priv->start_session_when_ready = FALSE;
+}
+
+
+
+static void
 setup_server (GdmSimpleSlave *slave)
 {
         /* Set the busy cursor */
@@ -765,6 +797,16 @@
                           "cancelled",
                           G_CALLBACK (on_greeter_cancel),
                           slave);
+        g_signal_connect (slave->priv->greeter_server,
+                          "start-session-when-ready",
+                          G_CALLBACK (on_start_session_when_ready),
+                          slave);
+
+        g_signal_connect (slave->priv->greeter_server,
+                          "start-session-later",
+                          G_CALLBACK (on_start_session_later),
+                          slave);
+
         gdm_greeter_server_start (slave->priv->greeter_server);
 
         address = gdm_greeter_server_get_address (slave->priv->greeter_server);

Modified: trunk/gui/simple-greeter/gdm-greeter-client.c
==============================================================================
--- trunk/gui/simple-greeter/gdm-greeter-client.c	(original)
+++ trunk/gui/simple-greeter/gdm-greeter-client.c	Sun Mar  9 21:27:33 2008
@@ -398,6 +398,15 @@
 }
 
 void
+gdm_greeter_client_call_start_session_when_ready  (GdmGreeterClient *client,
+                                                   gboolean          should_start_session)
+{
+        send_dbus_bool_method (client->priv->connection,
+                               "StartSessionWhenReady",
+                               should_start_session);
+}
+
+void
 gdm_greeter_client_call_select_session (GdmGreeterClient *client,
                                         const char       *text)
 {

Modified: trunk/gui/simple-greeter/gdm-greeter-client.h
==============================================================================
--- trunk/gui/simple-greeter/gdm-greeter-client.h	(original)
+++ trunk/gui/simple-greeter/gdm-greeter-client.h	Sun Mar  9 21:27:33 2008
@@ -102,6 +102,9 @@
 void               gdm_greeter_client_call_answer_query              (GdmGreeterClient *client,
                                                                       const char       *text);
 
+void               gdm_greeter_client_call_start_session_when_ready  (GdmGreeterClient *client,
+                                                                      gboolean          should_start_session);
+
 
 G_END_DECLS
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]