#
# Upstream: https://bugs.freedesktop.org/show_bug.cgi?id=11786
#
diff -Nur -x '*.orig' -x '*~' consolekit-0.2.3/data/ConsoleKit.conf consolekit-0.2.3.new/data/ConsoleKit.conf
--- consolekit-0.2.3/data/ConsoleKit.conf 2007-08-29 21:55:34.000000000 +0200
+++ consolekit-0.2.3.new/data/ConsoleKit.conf 2007-12-12 17:05:31.000000000 +0100
@@ -12,6 +12,8 @@
+
@@ -28,6 +30,8 @@
+
diff -Nur -x '*.orig' -x '*~' consolekit-0.2.3/src/ck-manager.c consolekit-0.2.3.new/src/ck-manager.c
--- consolekit-0.2.3/src/ck-manager.c 2007-08-28 19:16:03.000000000 +0200
+++ consolekit-0.2.3.new/src/ck-manager.c 2007-12-12 17:05:31.000000000 +0100
@@ -28,6 +28,13 @@
#include
#include
#include
+#ifdef HAVE_PATHS_H
+#include
+#endif /* HAVE_PATHS_H */
+
+#ifndef _PATH_TTY
+#define _PATH_TTY "/dev/tty"
+#endif
#include
#include
@@ -1339,6 +1346,41 @@
CkManager *manager;
} RemoveLeaderData;
+gboolean
+ck_manager_set_x11_parking_place (CkManager *manager,
+ const char *x11display,
+ const char *x11displaydevice,
+ DBusGMethodInvocation *context)
+{
+ CkSeat *seat;
+ guint num;
+ gboolean res = FALSE;
+
+ g_debug ("x11display=%s device=%s", x11display, x11displaydevice);
+
+ seat = g_hash_table_lookup (manager->priv->seats,
+ CK_DBUS_PATH "/Seat1");
+ /* FIXME: this is rather unpleasantly hardcoded, but it
+ * mirrors the code in find_seat_for_session - iwj */
+ if (seat == NULL) {
+ g_debug ("no seat");
+ goto xit;
+ }
+
+ if (sscanf (x11displaydevice, _PATH_TTY "%u", &num) != 1) {
+ g_debug ("bad device");
+ goto xit;
+ }
+
+ ck_seat_set_park_vt (seat, num);
+ res = TRUE;
+
+xit:
+ dbus_g_method_return (context, res);
+
+ return TRUE;
+}
+
static gboolean
remove_leader_for_connection (const char *cookie,
LeaderInfo *info,
diff -Nur -x '*.orig' -x '*~' consolekit-0.2.3/src/ck-manager.h consolekit-0.2.3.new/src/ck-manager.h
--- consolekit-0.2.3/src/ck-manager.h 2007-07-10 16:15:45.000000000 +0200
+++ consolekit-0.2.3.new/src/ck-manager.h 2007-12-12 17:05:31.000000000 +0100
@@ -79,6 +79,10 @@
gboolean ck_manager_close_session (CkManager *manager,
const char *cookie,
DBusGMethodInvocation *context);
+gboolean ck_manager_set_x11_parking_place (CkManager *manager,
+ const char *x11display,
+ const char *x11displaydevice,
+ DBusGMethodInvocation *context);
gboolean ck_manager_get_current_session (CkManager *manager,
DBusGMethodInvocation *context);
gboolean ck_manager_get_session_for_cookie (CkManager *manager,
diff -Nur -x '*.orig' -x '*~' consolekit-0.2.3/src/ck-manager.xml consolekit-0.2.3.new/src/ck-manager.xml
--- consolekit-0.2.3/src/ck-manager.xml 2007-08-17 17:52:52.000000000 +0200
+++ consolekit-0.2.3.new/src/ck-manager.xml 2007-12-12 17:05:31.000000000 +0100
@@ -15,6 +15,11 @@
+
+
+
+
+
diff -Nur -x '*.orig' -x '*~' consolekit-0.2.3/src/ck-seat.c consolekit-0.2.3.new/src/ck-seat.c
--- consolekit-0.2.3/src/ck-seat.c 2007-08-21 17:48:38.000000000 +0200
+++ consolekit-0.2.3.new/src/ck-seat.c 2007-12-12 17:07:37.000000000 +0100
@@ -59,6 +59,8 @@
CkSession *active_session;
CkVtMonitor *vt_monitor;
+ guint vt_park_num;
+ gboolean vt_park_enable;
DBusGConnection *connection;
};
@@ -471,9 +473,17 @@
g_object_ref (session);
ck_session_get_id (session, &ssid, NULL);
ck_session_set_active (session, TRUE, NULL);
+ g_debug ("Active session changed: %s", ssid);
+ } else if (seat->priv->vt_park_enable) {
+ ck_seat_park (seat);
+ g_debug ("Active session: none - parking");
+ } else {
+ g_debug ("Active session: none and no parking");
}
- g_debug ("Active session changed: %s", ssid);
+ /* We park only once: enable is set when a session exits
+ * and cleared here when we choose a new session. */
+ seat->priv->vt_park_enable = FALSE;
g_signal_emit (seat, signals [ACTIVE_SESSION_CHANGED], 0, ssid);
@@ -522,6 +532,33 @@
return TRUE;
}
+void
+ck_seat_park (CkSeat *seat)
+{
+ GError *vt_error;
+ guint num;
+ gboolean ret;
+
+ num = seat->priv->vt_park_num;
+ g_debug ("Parking on VT %u", num);
+ if (num < 0) return;
+
+ vt_error = NULL;
+ ret = ck_vt_monitor_set_active (seat->priv->vt_monitor, num, &vt_error);
+ if (! ret) {
+ g_debug ("Unable to park: %s", vt_error->message);
+ g_error_free (vt_error);
+ }
+}
+
+void
+ck_seat_set_park_vt (CkSeat *seat, guint num)
+{
+ g_debug ("Parking place is VT %u", num);
+
+ seat->priv->vt_park_num = num;
+}
+
gboolean
ck_seat_remove_session (CkSeat *seat,
CkSession *session,
@@ -554,6 +591,7 @@
g_hash_table_remove (seat->priv->sessions, ssid);
/* try to change the active session */
+ seat->priv->vt_park_enable = TRUE;
maybe_update_active_session (seat);
ret = TRUE;
@@ -945,6 +983,8 @@
g_str_equal,
g_free,
(GDestroyNotify) g_object_unref);
+ seat->priv->vt_park_num = -1;
+ seat->priv->vt_park_enable = FALSE;
seat->priv->devices = g_ptr_array_new ();
}
diff -Nur -x '*.orig' -x '*~' consolekit-0.2.3/src/ck-seat.h consolekit-0.2.3.new/src/ck-seat.h
--- consolekit-0.2.3/src/ck-seat.h 2007-07-20 17:02:07.000000000 +0200
+++ consolekit-0.2.3.new/src/ck-seat.h 2007-12-12 17:05:31.000000000 +0100
@@ -129,6 +129,9 @@
gboolean ck_seat_activate_session (CkSeat *seat,
const char *ssid,
DBusGMethodInvocation *context);
+void ck_seat_park (CkSeat *seat);
+void ck_seat_set_park_vt (CkSeat *seat,
+ guint num);
G_END_DECLS