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:
parent
0ff1c77b17
commit
6f145084d5
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user