diff options
Diffstat (limited to 'console-client/pc-kbd.c')
-rw-r--r-- | console-client/pc-kbd.c | 153 |
1 files changed, 71 insertions, 82 deletions
diff --git a/console-client/pc-kbd.c b/console-client/pc-kbd.c index 485eace1..35e25617 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, 2004 Free Software Foundation, Inc. + Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc. Written by Marcus Brinkmann. This file is part of the GNU Hurd. @@ -23,6 +23,7 @@ #include <string.h> #include <iconv.h> #include <sys/mman.h> +#include <argp.h> #include <device/device.h> #include <cthreads.h> @@ -31,8 +32,12 @@ #include <hurd/cons.h> #include "driver.h" +#include "mach-inputdev.h" +/* The default name of the node of the repeater. */ +#define DEFAULT_REPEATER_NODE "kbd" + /* The keyboard device in the kernel. */ static device_t kbd_dev; @@ -52,6 +57,11 @@ int gnumach_v1_compat; /* Forward declaration. */ static struct input_ops pc_kbd_ops; +/* The name of the repeater node. */ +static char *repeater_node; + +/* The repeater node. */ +static consnode_t cnode; /* A list of scan codes generated by the keyboard, in the set 2 encoding. */ enum scancode @@ -558,87 +568,6 @@ enum scancode sc_set1_to_set2_x1[] = SC_X1_DEL }; - -/* This gross stuff is cut & pasted from Mach sources, as Mach doesn't - export the interface we are using here. */ - -/* - * Mach Operating System - * Copyright (c) 1991,1990,1989 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ - -typedef u_short kev_type; /* kd event type */ - -/* (used for event records) */ -struct mouse_motion { - short mm_deltaX; /* units? */ - short mm_deltaY; -}; -typedef u_char Scancode; - -typedef struct { - kev_type type; /* see below */ - struct timeval time; /* timestamp */ - union { /* value associated with event */ - boolean_t up; /* MOUSE_LEFT .. MOUSE_RIGHT */ - Scancode sc; /* KEYBD_EVENT */ - struct mouse_motion mmotion; /* MOUSE_MOTION */ - } value; -} kd_event; -#define m_deltaX mmotion.mm_deltaX -#define m_deltaY mmotion.mm_deltaY - -/* - * kd_event ID's. - */ -#define MOUSE_LEFT 1 /* mouse left button up/down */ -#define MOUSE_MIDDLE 2 -#define MOUSE_RIGHT 3 -#define MOUSE_MOTION 4 /* mouse motion */ -#define KEYBD_EVENT 5 /* key up/down */ - - -#define IOCPARM_MASK 0x1fff /* parameter length, at most 13 bits */ -#define IOC_OUT 0x40000000 /* copy out parameters */ -#define IOC_IN 0x80000000U /* copy in parameters */ -#define _IOC(inout,group,num,len) \ - (inout | ((len & IOCPARM_MASK) << 16) | ((group) << 8) | (num)) -#define _IOR(g,n,t) _IOC(IOC_OUT, (g), (n), sizeof(t)) -#define _IOW(g,n,t) _IOC(IOC_IN, (g), (n), sizeof(t)) - -#define KDSKBDMODE _IOW('K', 1, int) /* set keyboard mode */ -#define KB_EVENT 1 -#define KB_ASCII 2 - -#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 gnumach_v1_input_next () { @@ -658,6 +587,13 @@ gnumach_v1_input_next () terminate. */ if (err) return 0; + + if (kbd_repeater_opened && data_buf.type == KEYBD_EVENT) + { + kbd_repeat_key (&data_buf); + data_buf.type = 0; + continue; + } } while (data_buf.type != KEYBD_EVENT); @@ -1090,10 +1026,56 @@ input_loop (any_t unused) + +static const char doc[] = "PC Keyboard Driver"; + +static const struct argp_option options[] = + { + {"repeat", 'r', "NODE", OPTION_ARG_OPTIONAL, + "Set a repeater translator on NODE (default: " DEFAULT_REPEATER_NODE ")"}, + { 0 } + }; + +static error_t +parse_opt (int key, char *arg, struct argp_state *state) +{ + int *pos = (int *) state->input; + + switch (key) + { + case 'r': + repeater_node = arg ? arg: DEFAULT_REPEATER_NODE; + break; + + case ARGP_KEY_END: + break; + + default: + return ARGP_ERR_UNKNOWN; + } + + *pos = state->next; + return 0; +} + +static struct argp argp = {options, parse_opt, 0, doc}; + /* Initialize the PC keyboard driver. */ static error_t pc_kbd_init (void **handle, int no_exit, int argc, char *argv[], int *next) { + error_t err; + int pos = 1; + + /* Parse the arguments. */ + err = argp_parse (&argp, argc, argv, ARGP_IN_ORDER | ARGP_NO_EXIT + | ARGP_SILENT, 0 , &pos); + *next += pos - 1; + + if (err && err != EINVAL) + return err; + + return 0; } @@ -1158,6 +1140,10 @@ pc_kbd_start (void *handle) iconv_close (cd); return err; } + + if (repeater_node) + kbd_setrepeater (repeater_node, &cnode); + cthread_detach (cthread_fork (input_loop, NULL)); return 0; @@ -1177,6 +1163,9 @@ pc_kbd_fini (void *handle, int force) mach_port_deallocate (mach_task_self (), kbd_dev); iconv_close (cd); + console_unregister_consnode (cnode); + console_destroy_consnode (cnode); + return 0; } |