diff options
-rw-r--r-- | console-tools/kbd_mode.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/console-tools/kbd_mode.c b/console-tools/kbd_mode.c index d81c56e92..da31af28d 100644 --- a/console-tools/kbd_mode.c +++ b/console-tools/kbd_mode.c | |||
@@ -24,7 +24,7 @@ | |||
24 | //usage:#define kbd_mode_full_usage "\n\n" | 24 | //usage:#define kbd_mode_full_usage "\n\n" |
25 | //usage: "Report or set the keyboard mode\n" | 25 | //usage: "Report or set the keyboard mode\n" |
26 | //usage: "\n -a Default (ASCII)" | 26 | //usage: "\n -a Default (ASCII)" |
27 | //usage: "\n -k Medium-raw (keyboard)" | 27 | //usage: "\n -k Medium-raw (keycode)" |
28 | //usage: "\n -s Raw (scancode)" | 28 | //usage: "\n -s Raw (scancode)" |
29 | //usage: "\n -u Unicode (utf-8)" | 29 | //usage: "\n -u Unicode (utf-8)" |
30 | //usage: "\n -C TTY Affect TTY instead of /dev/tty" | 30 | //usage: "\n -C TTY Affect TTY instead of /dev/tty" |
@@ -43,6 +43,10 @@ int kbd_mode_main(int argc UNUSED_PARAM, char **argv) | |||
43 | }; | 43 | }; |
44 | int fd; | 44 | int fd; |
45 | unsigned opt; | 45 | unsigned opt; |
46 | //TODO? kbd-2.0.3 without -C tries in sequence: | ||
47 | //fd#0, /dev/tty, /dev/tty0. | ||
48 | //Also, it checks KDGKBTYPE before doing KDGKBMODE | ||
49 | //maybe we can use get_console_fd_or_die()? | ||
46 | const char *tty_name = CURRENT_TTY; | 50 | const char *tty_name = CURRENT_TTY; |
47 | 51 | ||
48 | opt = getopt32(argv, "sakuC:", &tty_name); | 52 | opt = getopt32(argv, "sakuC:", &tty_name); |
@@ -62,9 +66,19 @@ int kbd_mode_main(int argc UNUSED_PARAM, char **argv) | |||
62 | mode = "mediumraw (keycode)"; | 66 | mode = "mediumraw (keycode)"; |
63 | else if (m == K_UNICODE) | 67 | else if (m == K_UNICODE) |
64 | mode = "Unicode (UTF-8)"; | 68 | mode = "Unicode (UTF-8)"; |
69 | else if (m == 4 /*K_OFF*/) /* kbd-2.0.3 does not show this mode, says "unknown" */ | ||
70 | mode = "off"; | ||
65 | printf("The keyboard is in %s mode\n", mode); | 71 | printf("The keyboard is in %s mode\n", mode); |
66 | } else { | 72 | } else { |
67 | /* here we depend on specific bits assigned to options (*) */ | 73 | /* here we depend on specific bits assigned to options (*) |
74 | * KDSKBMODE constants have these values: | ||
75 | * #define K_RAW 0x00 | ||
76 | * #define K_XLATE 0x01 | ||
77 | * #define K_MEDIUMRAW 0x02 | ||
78 | * #define K_UNICODE 0x03 | ||
79 | * #define K_OFF 0x04 | ||
80 | * (looks like "-ak" together would cause the same effect as -u) | ||
81 | */ | ||
68 | opt = opt & UNICODE ? 3 : opt >> 1; | 82 | opt = opt & UNICODE ? 3 : opt >> 1; |
69 | /* double cast prevents warnings about widening conversion */ | 83 | /* double cast prevents warnings about widening conversion */ |
70 | xioctl(fd, KDSKBMODE, (void*)(ptrdiff_t)opt); | 84 | xioctl(fd, KDSKBMODE, (void*)(ptrdiff_t)opt); |