summaryrefslogtreecommitdiff
path: root/x11-servers/xorg-server/files/patch-hw_xfree86_os-support_bsd_bsd__init.c
diff options
context:
space:
mode:
Diffstat (limited to 'x11-servers/xorg-server/files/patch-hw_xfree86_os-support_bsd_bsd__init.c')
-rw-r--r--x11-servers/xorg-server/files/patch-hw_xfree86_os-support_bsd_bsd__init.c57
1 files changed, 55 insertions, 2 deletions
diff --git a/x11-servers/xorg-server/files/patch-hw_xfree86_os-support_bsd_bsd__init.c b/x11-servers/xorg-server/files/patch-hw_xfree86_os-support_bsd_bsd__init.c
index 4f4a60ee749a..8e0dd7085224 100644
--- a/x11-servers/xorg-server/files/patch-hw_xfree86_os-support_bsd_bsd__init.c
+++ b/x11-servers/xorg-server/files/patch-hw_xfree86_os-support_bsd_bsd__init.c
@@ -1,6 +1,15 @@
---- hw/xfree86/os-support/bsd/bsd_init.c.orig 2016-07-19 17:07:29 UTC
+--- hw/xfree86/os-support/bsd/bsd_init.c.orig 2017-03-15 18:05:25 UTC
+++ hw/xfree86/os-support/bsd/bsd_init.c
-@@ -230,6 +230,9 @@ xf86OpenConsole()
+@@ -48,6 +48,8 @@ static int devConsoleFd = -1;
+ #if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
+ static int VTnum = -1;
+ static int initialVT = -1;
++static struct termios tty_attr; /* tty state to restore */
++static int tty_mode; /* kbd mode to restore */
+ #endif
+
+ #ifdef PCCONS_SUPPORT
+@@ -230,6 +232,9 @@ xf86OpenConsole()
* Add cases for other *BSD that behave the same.
*/
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
@@ -10,3 +19,47 @@
uname(&uts);
i = atof(uts.release) * 100;
if (i >= 310)
+@@ -253,6 +258,7 @@ xf86OpenConsole()
+ #endif
+ acquire_vt:
+ if (!xf86Info.ShareVTs) {
++ struct termios nTty;
+ /*
+ * now get the VT
+ */
+@@ -287,6 +293,26 @@ xf86OpenConsole()
+ if (ioctl(xf86Info.consoleFd, KDSETMODE, KD_GRAPHICS) < 0) {
+ FatalError("xf86OpenConsole: KDSETMODE KD_GRAPHICS failed");
+ }
++
++ tcgetattr(xf86Info.consoleFd, &tty_attr);
++ ioctl(xf86Info.consoleFd, KDGKBMODE, &tty_mode);
++
++ /* disable special keys */
++ if (ioctl(xf86Info.consoleFd, KDSKBMODE, K_RAW) < 0) {
++ FatalError("xf86OpenConsole: KDSKBMODE K_RAW failed (%s)",
++ strerror(errno));
++ }
++
++ nTty = tty_attr;
++ nTty.c_iflag = IGNPAR | IGNBRK;
++ nTty.c_oflag = 0;
++ nTty.c_cflag = CREAD | CS8;
++ nTty.c_lflag = 0;
++ nTty.c_cc[VTIME] = 0;
++ nTty.c_cc[VMIN] = 1;
++ cfsetispeed(&nTty, 9600);
++ cfsetospeed(&nTty, 9600);
++ tcsetattr(xf86Info.consoleFd, TCSANOW, &nTty);
+ }
+ else { /* xf86Info.ShareVTs */
+ close(xf86Info.consoleFd);
+@@ -594,6 +620,8 @@ xf86CloseConsole()
+ case SYSCONS:
+ case PCVT:
+ ioctl(xf86Info.consoleFd, KDSETMODE, KD_TEXT); /* Back to text mode */
++ ioctl(xf86Info.consoleFd, KDSKBMODE, tty_mode);
++ tcsetattr(xf86Info.consoleFd, TCSANOW, &tty_attr);
+ if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) != -1) {
+ VT.mode = VT_AUTO;
+ ioctl(xf86Info.consoleFd, VT_SETMODE, &VT); /* dflt vt handling */