[PATCH] linux: Prefer ioctl(KDSKBMUTE, 1) over ioctl(KDSKBMODE, K_OFF)

Adam Jackson ajax at redhat.com
Fri Nov 16 10:46:32 PST 2012


K_OFF is a slightly broken interface, since if some other process
(cough, systemd) sets the console state to K_UNICODE then it undoes
K_OFF, and now Alt-F2 will switch terminals instead of summoning the
Gnome "run command" dialog.

KDSKBMUTE separates the "don't enqueue events" logic from the keymap, so
doesn't have this problem.  Try it first, then continue falling back to
older methods.

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=859485
Tested-by: Josh Boyer <jwboyer at redhat.com>
Signed-off-by: Adam Jackson <ajax at redhat.com>
---
 hw/xfree86/os-support/linux/lnx_init.c | 33 +++++++++++++++++++++++----------
 1 file changed, 23 insertions(+), 10 deletions(-)

diff --git a/hw/xfree86/os-support/linux/lnx_init.c b/hw/xfree86/os-support/linux/lnx_init.c
index 68c296b..bcb039f 100644
--- a/hw/xfree86/os-support/linux/lnx_init.c
+++ b/hw/xfree86/os-support/linux/lnx_init.c
@@ -38,6 +38,14 @@
 
 #include <sys/stat.h>
 
+#ifndef K_OFF
+#define K_OFF 0x4
+#endif
+
+#ifndef KDSKBMUTE
+#define KDSKBMUTE 0x4B51
+#endif
+
 static Bool KeepTty = FALSE;
 static int activeVT = -1;
 
@@ -213,19 +221,23 @@ xf86OpenConsole(void)
             tcgetattr(xf86Info.consoleFd, &tty_attr);
             SYSCALL(ioctl(xf86Info.consoleFd, KDGKBMODE, &tty_mode));
 
-#ifdef K_OFF
-            /* disable kernel special keys and buffering */
-            SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSKBMODE, K_OFF));
+            /* disable kernel special keys and buffering, new style */
+            SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSKBMUTE, 1));
             if (ret < 0)
-#endif
             {
-                SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSKBMODE, K_RAW));
+                /* disable kernel special keys and buffering, old style */
+                SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSKBMODE, K_OFF));
                 if (ret < 0)
-                    FatalError("xf86OpenConsole: KDSKBMODE K_RAW failed %s\n",
-                               strerror(errno));
-
-                /* need to keep the buffer clean, else the kernel gets angry */
-                xf86SetConsoleHandler(drain_console, NULL);
+                {
+                    /* fine, just disable special keys */
+                    SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSKBMODE, K_RAW));
+                    if (ret < 0)
+                        FatalError("xf86OpenConsole: KDSKBMODE K_RAW failed %s\n",
+                                   strerror(errno));
+
+                    /* ... and drain events, else the kernel gets angry */
+                    xf86SetConsoleHandler(drain_console, NULL);
+                }
             }
 
             nTty = tty_attr;
@@ -271,6 +283,7 @@ xf86CloseConsole(void)
         xf86Msg(X_WARNING, "xf86CloseConsole: KDSETMODE failed: %s\n",
                 strerror(errno));
 
+    SYSCALL(ioctl(xf86Info.consoleFd, KDSKBMUTE, 0));
     SYSCALL(ioctl(xf86Info.consoleFd, KDSKBMODE, tty_mode));
     tcsetattr(xf86Info.consoleFd, TCSANOW, &tty_attr);
 
-- 
1.7.11.7



More information about the xorg-devel mailing list