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