summaryrefslogtreecommitdiff
path: root/console-client/pc-kbd.c
diff options
context:
space:
mode:
authorMarco Gerards <marco@gnu.org>2004-02-02 22:08:14 +0000
committerMarco Gerards <marco@gnu.org>2004-02-02 22:08:14 +0000
commit2f9df140cf4bd4abb5a6d846d6a1276a8317ed44 (patch)
tree515ffa92b1855ad335ba0e2d84963e853fb8b795 /console-client/pc-kbd.c
parent95a7a63accc7ea85bb2591901843b3ec3db1a91e (diff)
2004-02-02 Marco Gerards <metgerards@student.han.nl>
* pc-kbd.c (KDSETLEDS): New macro. (update_leds): Add support for setting the keyboard LED state on GNUMach 1.x (> 1.3). (input_loop): Use size_t for `nr' instead of int to silence a gcc warning.
Diffstat (limited to 'console-client/pc-kbd.c')
-rw-r--r--console-client/pc-kbd.c46
1 files changed, 30 insertions, 16 deletions
diff --git a/console-client/pc-kbd.c b/console-client/pc-kbd.c
index b810fffa..f454a833 100644
--- a/console-client/pc-kbd.c
+++ b/console-client/pc-kbd.c
@@ -1,5 +1,5 @@
/* pc-kbd.c - The PC Keyboard input driver.
- Copyright (C) 2002 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004 Free Software Foundation, Inc.
Written by Marcus Brinkmann.
This file is part of the GNU Hurd.
@@ -634,6 +634,9 @@ typedef struct {
#define KDGKBDTYPE _IOR('K', 2, int) /* get keyboard type */
#define KB_VANILLAKB 0
+#define KDSETLEDS _IOW('K', 5, int) /* set keyboard leds */
+
+
/* End of Mach code. */
static enum scancode
@@ -676,22 +679,33 @@ gnumach_v1_input_next ()
static void
update_leds (void)
{
- char leds[2];
error_t err;
-
- /* GNU Mach v1 does not support setting the keyboard LEDs. */
+
if (gnumach_v1_compat)
- return;
-
- leds[0] = '\xed';
- leds[1] = (led_state.scroll_lock ? 1 : 0)
- | (led_state.num_lock ? 2 : 0)
- | (led_state.caps_lock ? 4 : 0);
- mach_msg_type_number_t data_cnt = 2;
- err = device_write_inband (kbd_dev, 0, -1, (void *) leds, 2, &data_cnt);
- if (!err && data_cnt == 1)
- err = device_write_inband (kbd_dev, 0, -1, (void *) &leds[1], 1,
- &data_cnt);
+ {
+ int led = (led_state.scroll_lock ? 1 : 0)
+ | (led_state.num_lock ? 2 : 0)
+ | (led_state.caps_lock ? 4 : 0);
+
+ err = device_set_status (kbd_dev, KDSETLEDS, &led, 1);
+ /* Just ignore the error, GNUMach 1.3 and older cannot set the
+ keyboard LEDs. */
+ }
+ else
+ {
+ char leds[2];
+ mach_msg_type_number_t data_cnt = 2;
+
+ leds[0] = '\xed';
+ leds[1] = (led_state.scroll_lock ? 1 : 0)
+ | (led_state.num_lock ? 2 : 0)
+ | (led_state.caps_lock ? 4 : 0);
+
+ err = device_write_inband (kbd_dev, 0, -1, (void *) leds, 2, &data_cnt);
+ if (!err && data_cnt == 1)
+ err = device_write_inband (kbd_dev, 0, -1, (void *) &leds[1], 1,
+ &data_cnt);
+ }
}
static enum scancode
@@ -1014,7 +1028,7 @@ input_loop (any_t unused)
size_t left = sizeof (buf) - size;
char *inbuf = (char *) &state.direct;
size_t inbufsize = sizeof (wchar_t);
- int nr;
+ size_t nr;
nr = iconv (cd, &inbuf, &inbufsize, &buffer, &left);
if (nr == (size_t) -1)