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

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@redhat.com>
Signed-off-by: Adam Jackson <ajax@redhat.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Adam Jackson 2012-11-16 13:46:32 -05:00 committed by Peter Hutterer
parent 0ff1c77b17
commit 6f145084d5

View File

@ -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));
{
/* 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));
/* need to keep the buffer clean, else the kernel gets angry */
xf86SetConsoleHandler(drain_console, NULL);
/* ... 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);