From 49dad39bf4fd2a9d50ab85fc915c1435ed5079fa Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 14 Nov 2015 09:01:41 +0100 Subject: [PATCH] (udev) Reuse linux_common code --- input/drivers/linux_common.c | 47 ++++++++++++++++++++++-------------- input/drivers/linux_common.h | 2 ++ input/drivers/udev_input.c | 39 ++++++------------------------ 3 files changed, 39 insertions(+), 49 deletions(-) diff --git a/input/drivers/linux_common.c b/input/drivers/linux_common.c index 0854d1766f..b571440746 100644 --- a/input/drivers/linux_common.c +++ b/input/drivers/linux_common.c @@ -23,34 +23,45 @@ static struct termios oldTerm, newTerm; static long oldKbmd = 0xffff; static bool linux_stdin_claimed = false; +void linux_terminal_flush(void) +{ + tcsetattr(0, TCSAFLUSH, &oldTerm); +} + void linux_terminal_restore_input(void) { - if (oldKbmd != 0xffff) - { - ioctl(0, KDSKBMODE, oldKbmd); - tcsetattr(0, TCSAFLUSH, &oldTerm); - oldKbmd = 0xffff; - } + if (oldKbmd == 0xffff) + return; + + ioctl(0, KDSKBMODE, oldKbmd); + linux_terminal_flush(); + oldKbmd = 0xffff; linux_stdin_claimed = false; } +/* Disables input */ + bool linux_terminal_init(void) { - if (oldKbmd == 0xffff) - { - tcgetattr(0, &oldTerm); - newTerm = oldTerm; - newTerm.c_lflag &= ~(ECHO | ICANON | ISIG); - newTerm.c_iflag &= ~(ISTRIP | IGNCR | ICRNL | INLCR | IXOFF | IXON); - newTerm.c_cc[VMIN] = 0; - newTerm.c_cc[VTIME] = 0; + if (oldKbmd != 0xffff) + return false; - if (ioctl(0, KDGKBMODE, &oldKbmd) != 0) - return false; - } + if (tcgetattr(0, &oldTerm) < 0) + return false; - tcsetattr(0, TCSAFLUSH, &newTerm); + newTerm = oldTerm; + newTerm.c_lflag &= ~(ECHO | ICANON | ISIG); + newTerm.c_iflag &= ~(ISTRIP | IGNCR | ICRNL | INLCR | IXOFF | IXON); + newTerm.c_cc[VMIN] = 0; + newTerm.c_cc[VTIME] = 0; + + /* Be careful about recovering the terminal. */ + if (ioctl(0, KDGKBMODE, &oldKbmd) < 0) + return false; + + if (tcsetattr(0, TCSAFLUSH, &newTerm) < 0) + return false; return true; } diff --git a/input/drivers/linux_common.h b/input/drivers/linux_common.h index bc5413bfa1..aa68238b88 100644 --- a/input/drivers/linux_common.h +++ b/input/drivers/linux_common.h @@ -18,6 +18,8 @@ #include +void linux_terminal_flush(void); + void linux_terminal_restore_input(void); bool linux_terminal_init(void); diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index 2edda346fd..ceb7d74d78 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -27,12 +27,13 @@ #include #include #include -#include #include #include #include +#include "linux_common.h" + #include "../input_common.h" #include "../input_joypad.h" #include "../input_keymaps.h" @@ -696,22 +697,9 @@ static bool open_devices(udev_input_t *udev, const char *type, device_handle_cb return true; } -static long oldkbmd = 0xffff; -static struct termios oldterm, newterm; - -static void restore_terminal_input(void) -{ - if (oldkbmd == 0xffff) - return; - - ioctl(0, KDSKBMODE, oldkbmd); - tcsetattr(0, TCSAFLUSH, &oldterm); - oldkbmd = 0xffff; -} - static void restore_terminal_signal(int sig) { - restore_terminal_input(); + linux_terminal_restore_input(); kill(getpid(), sig); } @@ -720,26 +708,15 @@ static void disable_terminal_input(void) struct sigaction sa = {{0}}; /* Avoid accidentally typing stuff. */ - if (!isatty(0) || oldkbmd != 0xffff) + if (!isatty(0)) return; - if (tcgetattr(0, &oldterm) < 0) + if (!linux_terminal_init()) return; - newterm = oldterm; - newterm.c_lflag &= ~(ECHO | ICANON | ISIG); - newterm.c_iflag &= ~(ISTRIP | IGNCR | ICRNL | INLCR | IXOFF | IXON); - newterm.c_cc[VMIN] = 0; - newterm.c_cc[VTIME] = 0; - - /* Be careful about recovering the terminal ... */ - if (ioctl(0, KDGKBMODE, &oldkbmd) < 0) - return; - if (tcsetattr(0, TCSAFLUSH, &newterm) < 0) - return; if (ioctl(0, KDSKBMODE, K_MEDIUMRAW) < 0) { - tcsetattr(0, TCSAFLUSH, &oldterm); + linux_terminal_flush(); return; } @@ -755,7 +732,7 @@ static void disable_terminal_input(void) sigaction(SIGQUIT, &sa, NULL); sigaction(SIGSEGV, &sa, NULL); - atexit(restore_terminal_input); + atexit(linux_terminal_restore_input); } static void *udev_input_init(void) @@ -944,7 +921,7 @@ input_driver_t input_udev = { udev_input_get_capabilities, "udev", udev_input_grab_mouse, - NULL, + linux_terminal_grab_stdin, udev_input_set_rumble, udev_input_get_joypad_driver, udev_input_keyboard_mapping_is_blocked,