diff -Npur gnome-screensaver-old/src/gs-listener-dbus.c gnome-screensaver-new/src/gs-listener-dbus.c
--- gnome-screensaver-old/src/gs-listener-dbus.c	2010-03-26 15:25:19.000000000 +0800
+++ gnome-screensaver-new/src/gs-listener-dbus.c	2010-03-26 15:26:11.000000000 +0800
@@ -62,6 +62,7 @@ static DBusHandlerResult gs_listener_mes
 #define CK_NAME              "org.freedesktop.ConsoleKit"
 #define CK_MANAGER_PATH      "/org/freedesktop/ConsoleKit/Manager"
 #define CK_MANAGER_INTERFACE "org.freedesktop.ConsoleKit.Manager"
+#define CK_SEAT_INTERFACE    "org.freedesktop.ConsoleKit.Seat"
 #define CK_SESSION_INTERFACE "org.freedesktop.ConsoleKit.Session"
 
 #define SESSION_NAME         "org.gnome.SessionManager"
@@ -86,6 +87,8 @@ struct GSListenerPrivate
         time_t          active_start;
         time_t          session_idle_start;
         char           *session_id;
+	char	       *seat_id;
+	gboolean	can_activate_session;
 
         guint32         ck_throttle_cookie;
 };
@@ -480,6 +483,12 @@ gs_listener_get_activation_enabled (GSLi
 }
 
 gboolean
+gs_listener_can_activate_session (GSListener *listener)
+{
+	return listener->priv->can_activate_session;
+}
+
+gboolean
 gs_listener_is_inhibited (GSListener *listener)
 {
         gboolean inhibited;
@@ -1971,11 +1979,116 @@ query_session_id (GSListener *listener)
         return g_strdup (ssid);
 }
 
+static char *
+query_seat_id (GSListener *listener)
+{
+        DBusError       local_error;
+        DBusMessage    *message;
+        DBusMessage    *reply;
+        DBusMessageIter iter;
+        const char     *value;
+	char	       *seat_id;
+
+        reply = NULL;
+	seat_id = NULL;
+
+        dbus_error_init (&local_error);
+        message = dbus_message_new_method_call (CK_NAME,
+                                                listener->priv->session_id,
+                                                CK_SESSION_INTERFACE,
+                                                "GetSeatId");
+        if (message == NULL) {
+                goto out;
+        }
+
+        dbus_error_init (&local_error);
+        reply = dbus_connection_send_with_reply_and_block (listener->priv->system_connection,
+                                                           message,
+                                                           -1,
+                                                           &local_error);
+        if (reply == NULL) {
+                if (dbus_error_is_set (&local_error)) {
+                        g_warning ("Unable to determine seat: %s", local_error.message);
+                        dbus_error_free (&local_error);
+                        goto out;
+                }
+        }
+
+        dbus_message_iter_init (reply, &iter);
+        dbus_message_iter_get_basic (&iter, &value);
+                
+	seat_id = g_strdup (value);
+
+out:
+        if (message != NULL) {
+                dbus_message_unref (message);
+        }
+        if (reply != NULL) {
+                dbus_message_unref (reply);
+        }
+
+        return seat_id;
+}
+
+static gboolean
+query_can_activate_sessions (GSListener *listener)
+{
+        DBusError       local_error;
+        DBusMessage    *message;
+        DBusMessage    *reply;
+        DBusMessageIter iter;
+        gboolean        can_activate;
+
+
+        can_activate = FALSE;
+        reply = NULL;
+
+        dbus_error_init (&local_error);
+        message = dbus_message_new_method_call (CK_NAME,
+                                                listener->priv->seat_id,
+                                                CK_SEAT_INTERFACE,
+                                                "CanActivateSessions");
+        if (message == NULL) {
+                goto out;
+        }
+
+        dbus_error_init (&local_error);
+        reply = dbus_connection_send_with_reply_and_block (listener->priv->system_connection,
+                                                           message,
+                                                           -1,
+                                                           &local_error);
+        if (reply == NULL) {
+                if (dbus_error_is_set (&local_error)) {
+                        g_warning ("Unable to activate session: %s", local_error.message);
+                        dbus_error_free (&local_error);
+                        goto out;
+                }
+        }
+
+        dbus_message_iter_init (reply, &iter);
+        dbus_message_iter_get_basic (&iter, &can_activate);
+
+ out:
+        if (message != NULL) {
+                dbus_message_unref (message);
+        }
+        if (reply != NULL) {
+                dbus_message_unref (reply);
+        }
+
+        return can_activate;
+}
+
 static void
-init_session_id (GSListener *listener)
+init_session (GSListener *listener)
 {
         g_free (listener->priv->session_id);
+	g_free (listener->priv->seat_id);
+
         listener->priv->session_id = query_session_id (listener);
+	listener->priv->seat_id = query_seat_id (listener);
+	listener->priv->can_activate_session = query_can_activate_sessions (listener);
+
         gs_debug ("Got session-id: %s", listener->priv->session_id);
 }
 
@@ -1986,7 +2099,7 @@ gs_listener_init (GSListener *listener)
 
         gs_listener_dbus_init (listener);
 
-        init_session_id (listener);
+        init_session (listener);
 
         listener->priv->inhibitors = g_hash_table_new_full (g_int_hash,
                                                             g_int_equal,
@@ -2019,6 +2132,7 @@ gs_listener_finalize (GObject *object)
         }
 
         g_free (listener->priv->session_id);
+	g_free (listener->priv->seat_id);
 
         G_OBJECT_CLASS (gs_listener_parent_class)->finalize (object);
 }
diff -Npur gnome-screensaver-old/src/gs-listener-dbus.h gnome-screensaver-new/src/gs-listener-dbus.h
--- gnome-screensaver-old/src/gs-listener-dbus.h	2010-03-26 15:25:22.000000000 +0800
+++ gnome-screensaver-new/src/gs-listener-dbus.h	2010-03-26 15:24:24.000000000 +0800
@@ -80,6 +80,8 @@ void        gs_listener_set_activation_e
 gboolean    gs_listener_get_activation_enabled  (GSListener *listener);
 gboolean    gs_listener_is_inhibited            (GSListener *listener);
 
+gboolean    gs_listener_can_activate_session	(GSListener *listener);
+
 G_END_DECLS
 
 #endif /* __GS_LISTENER_H */
diff -Npur gnome-screensaver-old/src/gs-monitor.c gnome-screensaver-new/src/gs-monitor.c
--- gnome-screensaver-old/src/gs-monitor.c	2010-03-26 15:25:09.000000000 +0800
+++ gnome-screensaver-new/src/gs-monitor.c	2010-03-26 15:24:35.000000000 +0800
@@ -276,9 +276,11 @@ _gs_monitor_update_from_prefs (GSMonitor
         gboolean manager_active;
         gboolean lock_enabled;
         gboolean user_switch_enabled;
+	gboolean can_switch;
 
         lock_enabled = (monitor->priv->prefs->lock_enabled && !monitor->priv->prefs->lock_disabled);
-        user_switch_enabled = (monitor->priv->prefs->user_switch_enabled && !monitor->priv->prefs->user_switch_disabled);
+	can_switch = gs_listener_can_activate_session (monitor->priv->listener);
+        user_switch_enabled = (monitor->priv->prefs->user_switch_enabled && !monitor->priv->prefs->user_switch_disabled && can_switch);
 
         gs_manager_set_lock_enabled (monitor->priv->manager, lock_enabled);
         gs_manager_set_lock_timeout (monitor->priv->manager, monitor->priv->prefs->lock_timeout);
