On Thu, Mar 08, 2012 at 04:50:28PM +0100, walter harms wrote: > > > Am 08.03.2012 05:21, schrieb Peter Hutterer: > > Alt+SysReq+R sets the console to raw mode. Re-enable raw mode when > > VT-switching back to the server. > > > > X.Org Bug 41146 <http://bugs.freedesktop.org/show_bug.cgi?id=41146> > > > > Signed-off-by: Peter Hutterer <[email protected]> > > --- > > hw/xfree86/os-support/linux/Makefile.am | 2 +- > > hw/xfree86/os-support/linux/lnx_init.c | 36 > > +++++++++++++++++----------- > > hw/xfree86/os-support/linux/xf86linux_vt.h | 33 +++++++++++++++++++++++++ > > hw/xfree86/os-support/shared/VTsw_usl.c | 10 ++++++- > > 4 files changed, 64 insertions(+), 17 deletions(-) > > create mode 100644 hw/xfree86/os-support/linux/xf86linux_vt.h > > > > diff --git a/hw/xfree86/os-support/linux/Makefile.am > > b/hw/xfree86/os-support/linux/Makefile.am > > index 36748df..16f54c8 100644 > > --- a/hw/xfree86/os-support/linux/Makefile.am > > +++ b/hw/xfree86/os-support/linux/Makefile.am > > @@ -21,7 +21,7 @@ APM_SRCS = lnx_apm.c > > XORG_CFLAGS += -DHAVE_APM > > endif > > > > -liblinux_la_SOURCES = lnx_init.c lnx_video.c \ > > +liblinux_la_SOURCES = lnx_init.c lnx_video.c xf86linux_vt.h\ > > lnx_agp.c lnx_kmod.c lnx_bell.c \ > > $(srcdir)/../shared/bios_mmap.c \ > > $(srcdir)/../shared/VTsw_usl.c \ > > diff --git a/hw/xfree86/os-support/linux/lnx_init.c > > b/hw/xfree86/os-support/linux/lnx_init.c > > index b981476..ddd78f2 100644 > > --- a/hw/xfree86/os-support/linux/lnx_init.c > > +++ b/hw/xfree86/os-support/linux/lnx_init.c > > @@ -35,6 +35,7 @@ > > #include "xf86.h" > > #include "xf86Priv.h" > > #include "xf86_OSlib.h" > > +#include "xf86linux_vt.h" > > > > #include <sys/stat.h> > > > > @@ -68,6 +69,26 @@ switch_to(int vt, const char *from) > > FatalError("%s: VT_WAITACTIVE failed: %s\n", from, strerror(errno)); > > } > > > > +void switch_console_to_raw(void) > > +{ > > + int ret; > > + > > +#ifdef K_OFF > > + /* disable kernel special keys and buffering */ > > + SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSKBMODE, K_OFF)); > > + if (ret < 0) > > +#endif > > hi Peter, > > do you really want the error check here ? > if it really fails nobody would notice because no error is printed > and the console it NOT set to raw.
note that this code was just copied, not modified. and the logic is still: - try K_OFF - if it fails, try K_RAW - if that fails too, FatalError - else continue to live happily ever after > may i suggested to ignore any error and leave it to the next ioctl() > to inform the user ? K_OFF is instead of K_RAW, not in addition. http://patchwork.freedesktop.org/patch/8623/ Cheers, Peter > (i have no clue if failure of K_OFF is a problem and how it may affect K_RAW, > failing for K_RAW certainly is.) > > just my 2 cents, > re, > wh > > > > > + { > > + 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); > > + } > > +} > > + > > void > > xf86OpenConsole(void) > > { > > @@ -212,20 +233,7 @@ 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)); > > - if (ret < 0) > > -#endif > > - { > > - 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); > > - } > > + switch_console_to_raw(); > > > > nTty = tty_attr; > > nTty.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP); > > diff --git a/hw/xfree86/os-support/linux/xf86linux_vt.h > > b/hw/xfree86/os-support/linux/xf86linux_vt.h > > new file mode 100644 > > index 0000000..e6d7868 > > --- /dev/null > > +++ b/hw/xfree86/os-support/linux/xf86linux_vt.h > > @@ -0,0 +1,33 @@ > > +/* > > + * Copyright 2011 Red Hat, Inc > > + * > > + * Permission to use, copy, modify, distribute, and sell this software and > > its > > + * documentation for any purpose is hereby granted without fee, provided > > that > > + * the above copyright notice appear in all copies and that both that > > + * copyright notice and this permission notice appear in supporting > > + * documentation, and that the name of David Wexelblat not be used in > > + * advertising or publicity pertaining to distribution of the software > > without > > + * specific, written prior permission. David Wexelblat makes no > > representations > > + * about the suitability of this software for any purpose. It is provided > > + * "as is" without express or implied warranty. > > + * > > + * DAVID WEXELBLAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, > > + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO > > + * EVENT SHALL DAVID WEXELBLAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR > > + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF > > USE, > > + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER > > + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR > > + * PERFORMANCE OF THIS SOFTWARE. > > + * > > + */ > > + > > +#ifdef HAVE_XORG_CONFIG_H > > +#include <xorg-config.h> > > +#endif > > + > > +#ifndef __VT_H__ > > +#define __VT_H__ > > + > > +void switch_console_to_raw(void); > > + > > +#endif /* __VT_H__ */ > > diff --git a/hw/xfree86/os-support/shared/VTsw_usl.c > > b/hw/xfree86/os-support/shared/VTsw_usl.c > > index 818de17..b5d6074 100644 > > --- a/hw/xfree86/os-support/shared/VTsw_usl.c > > +++ b/hw/xfree86/os-support/shared/VTsw_usl.c > > @@ -31,6 +31,9 @@ > > #include "xf86Priv.h" > > #include "xf86_OSlib.h" > > > > +#ifdef linux > > +#include "xf86linux_vt.h" > > +#endif > > /* > > * Handle the VT-switching interface for OSs that use USL-style ioctl()s > > * (the sysv, sco, and linux subdirs). > > @@ -70,8 +73,11 @@ xf86VTSwitchTo(void) > > xf86Info.vtRequestsPending = FALSE; > > if (ioctl(xf86Info.consoleFd, VT_RELDISP, VT_ACKACQ) < 0) > > return FALSE; > > - else > > - return TRUE; > > + > > +#ifdef linux > > + switch_console_to_raw(); > > +#endif > > + return TRUE; > > } > > > > Bool _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
