]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Maintain own list of available VTs
authorRobert Ancell <robert.ancell@canonical.com>
Mon, 4 Jul 2011 04:01:52 +0000 (14:01 +1000)
committerRobert Ancell <robert.ancell@canonical.com>
Mon, 4 Jul 2011 04:01:52 +0000 (14:01 +1000)
data/lightdm.conf
src/vt.c
src/vt.h

index bb30de7ee6cbbb7bdb411c1e7acd0fc71b426cf4..6680e267c232713f04400294a13ab24845a20573 100644 (file)
@@ -12,6 +12,7 @@
 # xsessions-directory = Directory to find X sessions
 # default-xsession Default X session to use
 # session-wrapper = Program to run sessions through
+# minimum-vt = First VT to run displays on
 # seats = list of seats to start displays on
 #
 [LightDM]
@@ -26,6 +27,7 @@
 #xsessions-directory=/usr/share/xsessions
 #default-xsession=
 #session-wrapper=/etc/X11/Xsession
+#minimum-vt=7
 seats=seat-0
 
 #
index fb570d10bc2d89985374c0cea48b64121ca06446..494cacc2975caecffeab2a500ca3f5043ce33574 100644 (file)
--- a/src/vt.c
+++ b/src/vt.c
@@ -21,6 +21,9 @@
 #endif
 
 #include "vt.h"
+#include "configuration.h"
+
+static GList *used_vts = NULL;
 
 gint
 vt_get_active (void)
@@ -47,32 +50,50 @@ vt_get_active (void)
 #endif    
 }
 
-gint
-vt_get_unused (void)
+static gboolean
+vt_is_used (gint number)
 {
-#ifdef __linux__
-    gint console_fd;
-    int number;
+    GList *link;
 
-    console_fd = g_open ("/dev/console", O_RDONLY | O_NOCTTY);
-    if (console_fd < 0)
+    for (link = used_vts; link; link = link->next)
     {
-        g_warning ("Error opening /dev/console: %s", strerror (errno));
-        return -1;
+        int n = GPOINTER_TO_INT (link->data);
+        if (n == number)
+            return TRUE;
     }
 
-    if (ioctl (console_fd, VT_OPENQRY, &number) < 0)
-        g_warning ("Error using VT_OPENQRY on /dev/console: %s", strerror (errno));
+    return FALSE;
+}
 
-    close (console_fd);
-  
+gint
+vt_get_unused (void)
+{
+    gint number;
+
+    number = config_get_integer (config_get_instance (), "LightDM", "minimum-vt");
+    if (number < 1)
+        number = 1;
+
+    while (vt_is_used (number))
+        number++;
+
+    used_vts = g_list_append (used_vts, GINT_TO_POINTER (number));
     return number;
-#else
-    return -1;
-#endif    
 }
 
 void
 vt_release (gint number)
 {
+    GList *link;
+
+    for (link = used_vts; link; link = link->next)
+    {
+        int n = GPOINTER_TO_INT (link->data);
+        if (n == number)
+            break;
+    }
+
+    if (link)
+        used_vts = g_list_remove_link (used_vts, link);
 }
index e61591770d62b9e586ee5fcec65f456136d6a547..9300c7161ed737bb03b5c9863b268af0f3ff005d 100644 (file)
--- a/src/vt.h
+++ b/src/vt.h
@@ -12,7 +12,7 @@
 #ifndef _VT_H_
 #define _VT_H_
 
-#include <glib.h>
+#include <glib-object.h>
 
 gint vt_get_active (void);