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

Peter Hutterer peter.hutterer at who-t.net
Sun Nov 18 17:59:38 PST 2012


On Fri, Nov 16, 2012 at 01:46:32PM -0500, Adam Jackson wrote:
> 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>

merged, thanks

Cheers,
   Peter

> ---
>  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