Patch do kernelu pro zjisteni stavu klaves
Pavel Machek
pavel na elf.ucw.cz
Neděle Leden 25 20:05:27 CET 1998
Ahoj!
Tohle je patch do kernelu ktery umoznuje Xum (a vlastne komukoliv)
zjistit ktere klavesy jsou stisknute.
<BIG FAT WARNING>
Takhle by se problem resit nemel. Xy by se meli naucit medium raw
mode, a kernel by se mel naucit chovat k medium raw modu korektne
(jednoduche). Tohle je sice 'takyreseni', ale je to BAD THING (tm), a
do kernelu se zrejme nikdy nedostane. Ten patch v podstate vzniknul
proto, ze jsem slibil, ze ho udelam. (Timto se take omlouvam ze to
trvalo tak dlouho).
Jo, kod je mirne broken, misto -EFAULT vrati nenulu. Sorry.
</BIG FAT WARNING>
Pavel
Tady je kod ktery to pouziva.
#include <asm/ioctls.h>
#include <stdio.h>
char array[20];
int i;
void
main(void)
{
while (1) {
array[0]= 13;
printf( "\t(%d) ", ioctl( 0, TIOCLINUX, &array ) );
for( i=1; i<20; i++ )
printf( "%d ", array[i] );
printf( "\n" );
usleep(100000);
}
}
--- clean/drivers/char/keyboard.c Sat Jan 24 16:59:54 1998
+++ linux/drivers/char/keyboard.c Sat Jan 24 16:51:57 1998
@@ -81,7 +84,7 @@
static unsigned char k_down[NR_SHIFT] = {0, };
/* keyboard key bitmap */
#define BITS_PER_LONG (8*sizeof(unsigned long))
-static unsigned long key_down[256/BITS_PER_LONG] = { 0, };
+unsigned long key_down[256/BITS_PER_LONG] = { 0, };
static int dead_key_next = 0;
/*
@@ -122,14 +125,16 @@
--- clean/drivers/char/console.c Fri Dec 5 12:00:29 1997
+++ linux/drivers/char/console.c Thu Jan 22 13:19:49 1998
@@ -862,6 +870,9 @@
return report_mouse;
}
+#define BITS_PER_LONG (8*sizeof(unsigned long))
+extern unsigned long key_down[256/BITS_PER_LONG];
+
int tioclinux(struct tty_struct *tty, unsigned long arg)
{
char type, data;
@@ -908,6 +919,17 @@
return 0;
case 12: /* get fg_console */
return fg_console;
+ /*
+ * Make it possible to get key_down array by application.
+ * It is intended for programs that want full raw mode,
+ * so that they can read keyboard state after console
+ * switch. Note that 'right' solution would be to remove
+ * full raw mode, and make medium-raw mode sent right keys
+ * on console switch. FIXME: wrong return value on copy_to_user.
+ */
+ case 13:
+ if (!suser()) return -EPERM;
+ return copy_to_user( (char *)arg+1, key_down, 256/BITS_PER_LONG );
}
return -EINVAL;
}
--
I'm really pavel na atrey.karlin.mff.cuni.cz. Pavel
Look at http://atrey.karlin.mff.cuni.cz/~pavel/ ;-).
Další informace o konferenci Linux