0cc11866b07231a8c96d49acf7a4bf2ebfe0e401
[framework/uifw/ecore.git] / src / lib / ecore_fb / ecore_fb_kbd.c
1 static void _ecore_fb_event_free_key_down(void *data, void *ev);
2 static void _ecore_fb_event_free_key_up(void *data, void *ev);
3
4 static const char *_ecore_fb_kbd_syms[128 * 6] =
5 {
6 #include "ecore_fb_keytable.h"
7 };
8
9 static const char *_ecore_fb_btn_syms[128] =
10 {
11    "0x00",
12      "Escape", 
13      "F1", 
14      "F2", 
15      "F3", 
16      "F4", 
17      "Up", 
18      "Right",
19      "Left", 
20      "Down", 
21      "Return", 
22      "0x1b", 
23      "0x1c", 
24      "0x1d", 
25      "0x1e",
26      "0x1f",
27      "0x20", 
28      "0x21", 
29      "0x22", 
30      "0x23", 
31      "0x24", 
32      "0x25", 
33      "0x26", 
34      "0x27",
35      "0x28", 
36      "0x29", 
37      "0x2a",
38      "0x2b",
39      "0x2c",
40      "0x2d",
41      "0x2e", 
42      "0x2f", 
43      "0x30", 
44      "0x31", 
45      "0x32", 
46      "0x33", 
47      "0x34", 
48      "0x35", 
49      "0x36", 
50      "0x37",
51      "0x38", 
52      "0x39", 
53      "0x3a",
54      "0x3b",
55      "0x3c",
56      "0x3d",
57      "0x3e", 
58      "0x3f", 
59      "0x40", 
60      "0x41", 
61      "0x42", 
62      "0x43", 
63      "0x44", 
64      "0x45", 
65      "0x46", 
66      "0x47",
67      "0x48", 
68      "0x49", 
69      "0x4a",
70      "0x4b",
71      "0x4c",
72      "0x4d",
73      "0x4e", 
74      "0x4f", 
75      "0x50", 
76      "0x51", 
77      "0x52", 
78      "0x53", 
79      "0x54", 
80      "0x55", 
81      "0x56", 
82      "0x57",
83      "0x58", 
84      "0x59", 
85      "0x5a",
86      "0x5b",
87      "0x5c",
88      "0x5d",
89      "0x5e", 
90      "0x5f", 
91      "0x60", 
92      "0x61", 
93      "0x62", 
94      "0x63", 
95      "0x64", 
96      "0x65", 
97      "0x66", 
98      "0x67",
99      "0x68", 
100      "0x69", 
101      "0x6a",
102      "0x6b",
103      "0x6c",
104      "0x6d",
105      "0x6e", 
106      "0x6f", 
107      "0x70", 
108      "0x71", 
109      "0x72", 
110      "0x73", 
111      "0x74", 
112      "0x75", 
113      "0x76", 
114      "0x77",
115      "0x78", 
116      "0x79", 
117      "0x7a",
118      "0x7b",
119      "0x7c",
120      "0x7d",
121      "0x7e", 
122      "0x7f"
123 };
124 static int _ecore_fb_kbd_fd = 0;
125 static int _ecore_fb_ctrl = 0;
126 static int _ecore_fb_alt = 0;
127 static int _ecore_fb_shift = 0;
128 static int _ecore_fb_lock = 0;
129
130 static Ecore_Fd_Handler *_ecore_fb_kbd_fd_handler_handle = NULL;
131 static int _ecore_fb_kbd_fd_handler(void *data, Ecore_Fd_Handler *fd_handler);
132
133 static void 
134 _ecore_fb_event_free_key_down(void *data __UNUSED__, void *ev)
135 {
136    Ecore_Fb_Event_Key_Up *e;
137    e = ev;
138    free(e->keyname);
139    if (e->keysymbol) free(e->keysymbol);
140    if (e->key_compose) free(e->key_compose);
141    free(e);
142 }
143
144 static void
145 _ecore_fb_event_free_key_up(void *data __UNUSED__, void *ev)
146 {
147    Ecore_Fb_Event_Key_Up *e;
148    
149    e = ev;
150    free(e->keyname);
151    if (e->keysymbol) free(e->keysymbol);
152    if (e->key_compose) free(e->key_compose);
153    free(e);
154 }
155
156 static int
157 _ecore_fb_kbd_fd_handler(void *data __UNUSED__, Ecore_Fd_Handler *fd_handler __UNUSED__)
158 {
159    int v = 0;
160    
161    do
162      {
163         unsigned char buf;
164         
165         v = read(_ecore_fb_kbd_fd, &buf, 1);
166         if (v < 0) return 1;
167         if (v < 1) return 1;
168         if (!(buf & 0x80))
169           {
170              /* DOWN */
171              int vt_switch = -1;
172              Ecore_Fb_Event_Key_Down *e;
173              
174              e = calloc(1, sizeof(Ecore_Fb_Event_Key_Down));
175              if (!e) goto retry;
176              if (_ecore_fb_kbd_fd == _ecore_fb_tty_fd)
177                {
178                   int add = 0;
179                   
180                   if (_ecore_fb_shift) add = 1;
181                   else if (_ecore_fb_lock) add = 2;
182                   e->keyname = strdup(_ecore_fb_kbd_syms[(buf & 0x7f) * 6]);
183                   e->keysymbol = strdup(_ecore_fb_kbd_syms[((buf & 0x7f) * 6) + add]);
184                   e->key_compose = strdup(_ecore_fb_kbd_syms[((buf & 0x7f) * 6) + 3 + add]);
185                }
186              else
187                e->keyname = strdup(_ecore_fb_btn_syms[buf & 0x7f]);
188              if (!e->keyname)
189                {
190                   free(e);
191                   goto retry;
192                }
193              ecore_event_add(ECORE_FB_EVENT_KEY_DOWN, e, _ecore_fb_event_free_key_down, NULL);
194              if (!strcmp(e->keyname, "Control_L"))
195                _ecore_fb_ctrl++;
196              else if (!strcmp(e->keyname, "Control_R"))
197                _ecore_fb_ctrl++;
198              else if (!strcmp(e->keyname, "Alt_L"))
199                _ecore_fb_alt++;
200              else if (!strcmp(e->keyname, "Alt_R"))
201                _ecore_fb_alt++;
202              else if (!strcmp(e->keyname, "Shift_L"))
203                _ecore_fb_shift++;
204              else if (!strcmp(e->keyname, "Shift_R"))
205                _ecore_fb_shift++;
206              else if (!strcmp(e->keyname, "Caps_Lock"))
207                _ecore_fb_lock++;
208              else if (!strcmp(e->keyname, "F1")) vt_switch = 0;
209              else if (!strcmp(e->keyname, "F2")) vt_switch = 1;
210              else if (!strcmp(e->keyname, "F3")) vt_switch = 2;
211              else if (!strcmp(e->keyname, "F4")) vt_switch = 3;
212              else if (!strcmp(e->keyname, "F5")) vt_switch = 4;
213              else if (!strcmp(e->keyname, "F6")) vt_switch = 5;
214              else if (!strcmp(e->keyname, "F7")) vt_switch = 6;
215              else if (!strcmp(e->keyname, "F8")) vt_switch = 7;
216              else if (!strcmp(e->keyname, "F9")) vt_switch = 8;
217              else if (!strcmp(e->keyname, "F10")) vt_switch = 9;
218              else if (!strcmp(e->keyname, "F11")) vt_switch = 10;
219              else if (!strcmp(e->keyname, "F12")) vt_switch = 11;
220              if (_ecore_fb_ctrl > 2) _ecore_fb_ctrl = 2;
221              if (_ecore_fb_alt > 2) _ecore_fb_alt = 2;
222              if ((vt_switch >= 0) &&
223                  (_ecore_fb_ctrl) &&
224                  (_ecore_fb_alt))
225                _ecore_fb_vt_switch(vt_switch);
226           }
227         else
228           {
229              /* UP */
230              Ecore_Fb_Event_Key_Up *e;
231              
232              e = calloc(1, sizeof(Ecore_Fb_Event_Key_Up));
233              if (!e) goto retry;
234              if (_ecore_fb_kbd_fd == _ecore_fb_tty_fd)
235                {
236                   int add = 0;
237                   
238                   if (_ecore_fb_shift) add = 1;
239                   else if (_ecore_fb_lock) add = 2;
240                   e->keyname = strdup(_ecore_fb_kbd_syms[(buf & 0x7f) * 6]);
241                   e->keysymbol = strdup(_ecore_fb_kbd_syms[((buf & 0x7f) * 6) + add]);
242                   e->key_compose = strdup(_ecore_fb_kbd_syms[((buf & 0x7f) * 6) + 3 + add]);
243                }
244              else
245                e->keyname = strdup(_ecore_fb_btn_syms[buf & 0x7f]);
246              if (!e->keyname)
247                {
248                   free(e);
249                   goto retry;
250                }
251              ecore_event_add(ECORE_FB_EVENT_KEY_UP, e, _ecore_fb_event_free_key_up, NULL);
252              if (!strcmp(e->keyname, "Control_L"))
253                _ecore_fb_ctrl--;
254              else if (!strcmp(e->keyname, "Control_R"))
255                _ecore_fb_ctrl--;
256              else if (!strcmp(e->keyname, "Alt_L"))
257                _ecore_fb_alt--;
258              else if (!strcmp(e->keyname, "Alt_R"))
259                _ecore_fb_alt--;
260              else if (!strcmp(e->keyname, "Shift_L"))
261                _ecore_fb_shift--;
262              else if (!strcmp(e->keyname, "Shift_R"))
263                _ecore_fb_shift--;
264              else if (!strcmp(e->keyname, "Caps_Lock"))
265                _ecore_fb_lock--;
266              if (_ecore_fb_ctrl < 0) _ecore_fb_ctrl = 0;
267              if (_ecore_fb_alt < 0) _ecore_fb_alt = 0;
268              if (_ecore_fb_shift < 0) _ecore_fb_shift = 0;
269              if (_ecore_fb_lock < 0) _ecore_fb_lock = 0;
270           }
271         retry:
272         ;
273      }
274    while (v > 0);
275    return 1;
276 }
277
278 int
279 ecore_fb_kbd_init(void)
280 {
281    int prev_flags;
282    
283    prev_flags = fcntl(_ecore_fb_kbd_fd, F_GETFL);
284    fcntl(_ecore_fb_kbd_fd, F_SETFL, prev_flags | O_NONBLOCK);
285    _ecore_fb_kbd_fd_handler_handle = ecore_main_fd_handler_add(_ecore_fb_kbd_fd,
286                                                                     ECORE_FD_READ,
287                                                                     _ecore_fb_kbd_fd_handler, NULL,
288                                                                     NULL, NULL);
289    if(!_ecore_fb_kbd_fd_handler_handle) return 0;
290    return 1;
291 }
292
293 void
294 ecore_fb_kbd_shutdown(void)
295 {
296    if (_ecore_fb_kbd_fd >= 0) close(_ecore_fb_kbd_fd);
297    if (_ecore_fb_kbd_fd_handler_handle) 
298      ecore_main_fd_handler_del(_ecore_fb_kbd_fd_handler_handle);
299    _ecore_fb_kbd_fd = 0;
300    _ecore_fb_kbd_fd_handler_handle = NULL;
301    _ecore_fb_ctrl = 0;
302    _ecore_fb_lock = 0;
303    _ecore_fb_shift = 0;
304    _ecore_fb_alt = 0;
305 }