]> git.sesse.net Git - pistorm/blob - input/input.c
Fix up mouse forwarding
[pistorm] / input / input.c
1 #include <termios.h>
2 #include <unistd.h>
3 #include <stdint.h>
4 #include <linux/input.h>
5
6 static int lshift = 0, rshift = 0, lctrl = 0, rctrl = 0, lalt = 0, altgr = 0;
7 extern int mouse_fd;
8 extern int keyboard_fd;
9
10 enum keypress_type {
11   KEYPRESS_RELEASE,
12   KEYPRESS_PRESS,
13   KEYPRESS_REPEAT,
14 };
15
16 int handle_modifier(struct input_event *ev) {
17   int *target_modifier = NULL;
18   if (ev->value != KEYPRESS_REPEAT && (ev->code == KEY_LEFTSHIFT || ev->code == KEY_RIGHTSHIFT || ev->code == KEY_LEFTALT || ev->code == KEY_RIGHTALT || ev->code == KEY_LEFTCTRL || ev->code == KEY_RIGHTCTRL)) {
19     switch(ev->code) {
20       case KEY_LEFTSHIFT:
21         target_modifier = &lshift;
22         break;
23       case KEY_RIGHTSHIFT:
24         target_modifier = &rshift;
25         break;
26       case KEY_LEFTALT:
27         target_modifier = &lalt;
28         break;
29       case KEY_RIGHTALT:
30         target_modifier = &altgr;
31         break;
32       case KEY_LEFTCTRL:
33         target_modifier = &lshift;
34         break;
35       case KEY_RIGHTCTRL:
36         target_modifier = &rshift;
37         break;
38     }
39     *target_modifier = (ev->value == KEYPRESS_RELEASE) ? 0 : 1;
40     return 1;
41   }
42   else {
43     return 0;
44   }
45 }
46
47 #define KEYCASE(a, b, c)case a: return (lshift || rshift) ? c : b;
48
49 char char_from_input_event(struct input_event *ev) {
50   switch(ev->code) {
51     KEYCASE(KEY_A, 'a', 'A');
52     KEYCASE(KEY_B, 'b', 'B');
53     KEYCASE(KEY_C, 'c', 'C');
54     KEYCASE(KEY_D, 'd', 'D');
55     KEYCASE(KEY_E, 'e', 'E');
56     KEYCASE(KEY_F, 'f', 'F');
57     KEYCASE(KEY_G, 'g', 'G');
58     KEYCASE(KEY_H, 'h', 'H');
59     KEYCASE(KEY_I, 'i', 'I');
60     KEYCASE(KEY_J, 'j', 'J');
61     KEYCASE(KEY_K, 'k', 'K');
62     KEYCASE(KEY_L, 'l', 'L');
63     KEYCASE(KEY_M, 'm', 'M');
64     KEYCASE(KEY_N, 'n', 'N');
65     KEYCASE(KEY_O, 'o', 'O');
66     KEYCASE(KEY_P, 'p', 'P');
67     KEYCASE(KEY_Q, 'q', 'Q');
68     KEYCASE(KEY_R, 'r', 'R');
69     KEYCASE(KEY_S, 's', 'S');
70     KEYCASE(KEY_T, 't', 'T');
71     KEYCASE(KEY_U, 'u', 'U');
72     KEYCASE(KEY_V, 'c', 'V');
73     KEYCASE(KEY_W, 'w', 'W');
74     KEYCASE(KEY_X, 'x', 'X');
75     KEYCASE(KEY_Y, 'y', 'Y');
76     KEYCASE(KEY_Z, 'z', 'Z');
77     KEYCASE(KEY_1, '1', '!');
78     KEYCASE(KEY_2, '2', '@');
79     KEYCASE(KEY_3, '3', '#');
80     KEYCASE(KEY_4, '4', '$');
81     KEYCASE(KEY_5, '5', '%');
82     KEYCASE(KEY_6, '6', '^');
83     KEYCASE(KEY_7, '7', '&');
84     KEYCASE(KEY_8, '8', '*');
85     KEYCASE(KEY_9, '9', '(');
86     KEYCASE(KEY_0, '0', ')');
87     KEYCASE(KEY_F12, 0x1B, 0x1B);
88     default:
89       return 0;
90   }
91 }
92
93 int get_key_char(char *c)
94 {
95   if (keyboard_fd == -1)
96     return 0;
97
98   struct input_event ie;
99   while(read(keyboard_fd, &ie, sizeof(struct input_event)) != -1) {
100     if (ie.type == EV_KEY) {
101       if (handle_modifier(&ie))
102         continue;
103       char ret = char_from_input_event(&ie);
104       if (ie.value == 1 || ie.value == 2) {
105         if (ret != 0) {
106           *c = ret;
107           return 1;
108         }
109       }
110     }
111   }
112
113   return 0;
114 }
115
116 uint16_t mouse_x = 0, mouse_y = 0, mouse_b = 0;
117
118 int get_mouse_status(char *x, char *y, char *b) {
119   struct input_event ie;
120   if (read(mouse_fd, &ie, sizeof(struct input_event)) != -1) {
121     *b = ((char *)&ie)[0];
122     mouse_x += ((char *)&ie)[1];
123     *x = mouse_x;
124     mouse_y += (-((char *)&ie)[2]);
125     *y = mouse_y; //-((char *)&ie)[2];
126     return 1;
127   }
128
129   return 0;
130 }