summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2011-05-18 22:37:26 -0400
committerRay Strode <rstrode@redhat.com>2011-06-15 09:58:59 -0400
commitadc116c0f3a06ccb020273d694dc3dc00ee535ff (patch)
treea5c7847f5f93919b6ec7cdea6b2ee920d7da8a1f
parent074db4c11bf4dac95e585c4bfcf98416d88aefea (diff)
downloadgdm-adc116c0f3a06ccb020273d694dc3dc00ee535ff.tar.gz
daemon: add switch-on-finish property to display
When a display exits, sometimes it's desirable to jump to a login screen. This depends if the display is transient or not, and also whether the display is hosting an already logged in session or not. This commit adds a property to the display object that says whether a switch should happen or not. Note the code to actually perform the switch will get added in a follow up commit. Based on work by Josselin Mouette <joss@debian.org> https://bugzilla.gnome.org/show_bug.cgi?id=618047
-rw-r--r--daemon/gdm-display.c48
-rw-r--r--daemon/gdm-display.h4
-rw-r--r--daemon/gdm-display.xml3
-rw-r--r--daemon/gdm-slave.c30
-rw-r--r--daemon/gdm-transient-display.c1
5 files changed, 86 insertions, 0 deletions
diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c
index abedc0b8..84b49255 100644
--- a/daemon/gdm-display.c
+++ b/daemon/gdm-display.c
@@ -66,6 +66,7 @@ struct GdmDisplayPrivate
GdmDisplayAccessFile *access_file;
gboolean is_local;
+ gboolean switch_on_finish;
guint finish_idle_id;
GdmSlaveProxy *slave_proxy;
@@ -84,6 +85,7 @@ enum {
PROP_X11_COOKIE,
PROP_X11_AUTHORITY_FILE,
PROP_IS_LOCAL,
+ PROP_SWITCH_ON_FINISH,
PROP_SLAVE_COMMAND,
};
@@ -134,6 +136,14 @@ gdm_display_get_status (GdmDisplay *display)
return display->priv->status;
}
+gboolean
+gdm_display_get_switch_on_finish (GdmDisplay *display)
+{
+ g_return_val_if_fail (GDM_IS_DISPLAY (display), 0);
+
+ return display->priv->switch_on_finish;
+}
+
static GdmDisplayAccessFile *
_create_access_file_for_user (GdmDisplay *display,
const char *username,
@@ -824,6 +834,30 @@ _gdm_display_set_is_local (GdmDisplay *display,
}
static void
+_gdm_display_set_switch_on_finish (GdmDisplay *display,
+ gboolean switch_on_finish)
+{
+ display->priv->switch_on_finish = switch_on_finish;
+}
+
+gboolean
+gdm_display_set_switch_on_finish (GdmDisplay *display,
+ gboolean switch_display,
+ GError **error)
+{
+ gboolean ret = TRUE;
+
+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
+
+ g_debug ("GdmDisplay: Setting display to %sswitch to login screen on finish",
+ switch_display? "" : "not ");
+
+ _gdm_display_set_switch_on_finish (display, switch_display);
+
+ return ret;
+}
+
+static void
_gdm_display_set_slave_command (GdmDisplay *display,
const char *command)
{
@@ -866,6 +900,9 @@ gdm_display_set_property (GObject *object,
case PROP_IS_LOCAL:
_gdm_display_set_is_local (self, g_value_get_boolean (value));
break;
+ case PROP_SWITCH_ON_FINISH:
+ _gdm_display_set_switch_on_finish (self, g_value_get_boolean (value));
+ break;
case PROP_SLAVE_COMMAND:
_gdm_display_set_slave_command (self, g_value_get_string (value));
break;
@@ -914,6 +951,9 @@ gdm_display_get_property (GObject *object,
case PROP_IS_LOCAL:
g_value_set_boolean (value, self->priv->is_local);
break;
+ case PROP_SWITCH_ON_FINISH:
+ g_value_set_boolean (value, self->priv->switch_on_finish);
+ break;
case PROP_SLAVE_COMMAND:
g_value_set_string (value, self->priv->slave_command);
break;
@@ -1086,6 +1126,14 @@ gdm_display_class_init (GdmDisplayClass *klass)
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
g_object_class_install_property (object_class,
+ PROP_SWITCH_ON_FINISH,
+ g_param_spec_boolean ("switch-on-finish",
+ NULL,
+ NULL,
+ TRUE,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
+ g_object_class_install_property (object_class,
PROP_SLAVE_COMMAND,
g_param_spec_string ("slave-command",
"slave command",
diff --git a/daemon/gdm-display.h b/daemon/gdm-display.h
index 607ea1d4..e3aa8605 100644
--- a/daemon/gdm-display.h
+++ b/daemon/gdm-display.h
@@ -88,6 +88,7 @@ GQuark gdm_display_error_quark (void);
GType gdm_display_get_type (void);
int gdm_display_get_status (GdmDisplay *display);
+gboolean gdm_display_get_switch_on_finish (GdmDisplay *display);
time_t gdm_display_get_creation_time (GdmDisplay *display);
char * gdm_display_get_user_auth (GdmDisplay *display);
@@ -140,6 +141,9 @@ gboolean gdm_display_remove_user_authorization (GdmDisplay *disp
gboolean gdm_display_set_slave_bus_name (GdmDisplay *display,
const char *name,
GError **error);
+gboolean gdm_display_set_switch_on_finish (GdmDisplay *display,
+ gboolean switch_display,
+ GError **error);
G_END_DECLS
diff --git a/daemon/gdm-display.xml b/daemon/gdm-display.xml
index a92e37fc..d3ce4a4c 100644
--- a/daemon/gdm-display.xml
+++ b/daemon/gdm-display.xml
@@ -35,6 +35,9 @@
<method name="SetSlaveBusName">
<arg name="name" direction="in" type="s"/>
</method>
+ <method name="SetSwitchOnFinish">
+ <arg name="switch_display" direction="in" type="b"/>
+ </method>
<method name="GetTimedLoginDetails">
<arg name="enabled" direction="out" type="b"/>
<arg name="username" direction="out" type="s"/>
diff --git a/daemon/gdm-slave.c b/daemon/gdm-slave.c
index 2dc0323f..9fd65794 100644
--- a/daemon/gdm-slave.c
+++ b/daemon/gdm-slave.c
@@ -1438,6 +1438,31 @@ session_unlock (GdmSlave *slave,
return TRUE;
}
+static void
+set_switch_display_on_finish (GdmSlave *slave,
+ gboolean switch_display)
+{
+ gboolean res;
+ GError *error;
+
+ error = NULL;
+ res = dbus_g_proxy_call (slave->priv->display_proxy,
+ "SetSwitchOnFinish",
+ &error,
+ G_TYPE_BOOLEAN, switch_display,
+ G_TYPE_INVALID,
+ G_TYPE_INVALID);
+
+ if (! res) {
+ if (error != NULL) {
+ g_warning ("Failed to set respawn on parent display: %s", error->message);
+ g_error_free (error);
+ } else {
+ g_warning ("Failed to set respawn on parent display");
+ }
+ }
+}
+
gboolean
gdm_slave_switch_to_user_session (GdmSlave *slave,
const char *username)
@@ -1468,6 +1493,11 @@ gdm_slave_switch_to_user_session (GdmSlave *slave,
g_debug ("GdmSlave: unable to unlock session: %s", ssid_to_activate);
}
+ /* Since we're switching to a new display, make sure we don't switch again when
+ * this display finishes.
+ */
+ set_switch_display_on_finish (slave, FALSE);
+
ret = TRUE;
out:
diff --git a/daemon/gdm-transient-display.c b/daemon/gdm-transient-display.c
index dd33547c..01813f70 100644
--- a/daemon/gdm-transient-display.c
+++ b/daemon/gdm-transient-display.c
@@ -210,6 +210,7 @@ gdm_transient_display_new (int display_number)
object = g_object_new (GDM_TYPE_TRANSIENT_DISPLAY,
"x11-display-number", display_number,
"x11-display-name", x11_display,
+ "switch-on-finish", TRUE,
NULL);
g_free (x11_display);