Tizen 2.1 base
[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 * 7] =
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 = -1;
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 Eina_Bool _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 Eina_Bool
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 EINA_TRUE;
167         if (v < 1) return EINA_TRUE;
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) * 7]);
183                   e->keysymbol = strdup(_ecore_fb_kbd_syms[((buf & 0x7f) * 7) + add]);
184                   e->key_compose = strdup(_ecore_fb_kbd_syms[((buf & 0x7f) * 7) + 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              e->window = 1;
194              e->event_window = e->window;
195              e->root_window = e->window; 
196              e->same_screen = 1;
197              e->timestamp = ecore_loop_time_get() * 1000.0;
198              if (!strcmp(e->keyname, "Control_L"))
199                 _ecore_fb_ctrl++;
200              else if (!strcmp(e->keyname, "Control_R"))
201                 _ecore_fb_ctrl++;
202              else if (!strcmp(e->keyname, "Alt_L"))
203                 _ecore_fb_alt++;
204              else if (!strcmp(e->keyname, "Alt_R"))
205                 _ecore_fb_alt++;
206              else if (!strcmp(e->keyname, "Shift_L"))
207                 _ecore_fb_shift++;
208              else if (!strcmp(e->keyname, "Shift_R"))
209                 _ecore_fb_shift++;
210              else if (!strcmp(e->keyname, "Caps_Lock"))
211                 _ecore_fb_lock++;
212              else if (!strcmp(e->keyname, "F1")) vt_switch = 0;
213              else if (!strcmp(e->keyname, "F2")) vt_switch = 1;
214              else if (!strcmp(e->keyname, "F3")) vt_switch = 2;
215              else if (!strcmp(e->keyname, "F4")) vt_switch = 3;
216              else if (!strcmp(e->keyname, "F5")) vt_switch = 4;
217              else if (!strcmp(e->keyname, "F6")) vt_switch = 5;
218              else if (!strcmp(e->keyname, "F7")) vt_switch = 6;
219              else if (!strcmp(e->keyname, "F8")) vt_switch = 7;
220              else if (!strcmp(e->keyname, "F9")) vt_switch = 8;
221              else if (!strcmp(e->keyname, "F10")) vt_switch = 9;
222              else if (!strcmp(e->keyname, "F11")) vt_switch = 10;
223              else if (!strcmp(e->keyname, "F12")) vt_switch = 11;
224              if (_ecore_fb_ctrl > 2) _ecore_fb_ctrl = 2;
225              if (_ecore_fb_alt > 2) _ecore_fb_alt = 2;
226              if ((_ecore_fb_kbd_fd == _ecore_fb_tty_fd) &&
227                  (_ecore_fb_ctrl))
228                {
229                   const char *ts = _ecore_fb_kbd_syms[(buf & 0x7f) + 3 + 3];
230                   
231                   if (ts)
232                     {
233                        if (e->key_compose) free(e->key_compose);
234                        e->key_compose = strdup(ts);
235                     }
236                }
237              if ((vt_switch >= 0) &&
238                  (_ecore_fb_ctrl) &&
239                  (_ecore_fb_alt))
240                 _ecore_fb_vt_switch(vt_switch);
241              ecore_event_add(ECORE_FB_EVENT_KEY_DOWN, e, _ecore_fb_event_free_key_down, NULL);
242           }
243         else
244           {
245              /* UP */
246              Ecore_Fb_Event_Key_Up *e;
247
248              e = calloc(1, sizeof(Ecore_Fb_Event_Key_Up));
249              if (!e) goto retry;
250              if (_ecore_fb_kbd_fd == _ecore_fb_tty_fd)
251                {
252                   int add = 0;
253
254                   if (_ecore_fb_shift) add = 1;
255                   else if (_ecore_fb_lock) add = 2;
256                   e->keyname = strdup(_ecore_fb_kbd_syms[(buf & 0x7f) * 7]);
257                   e->keysymbol = strdup(_ecore_fb_kbd_syms[((buf & 0x7f) * 7) + add]);
258                   e->key_compose = strdup(_ecore_fb_kbd_syms[((buf & 0x7f) * 7) + 3 + add]);
259                }
260              else
261                 e->keyname = strdup(_ecore_fb_btn_syms[buf & 0x7f]);
262              if (!e->keyname)
263                {
264                   free(e);
265                   goto retry;
266                }
267              e->window = 1;
268              e->event_window = e->window;
269              e->root_window = e->window; 
270              e->same_screen = 1;
271              e->timestamp = ecore_loop_time_get() * 1000.0;
272              ecore_event_add(ECORE_FB_EVENT_KEY_UP, e, _ecore_fb_event_free_key_up, NULL);
273              if (!strcmp(e->keyname, "Control_L"))
274                 _ecore_fb_ctrl--;
275              else if (!strcmp(e->keyname, "Control_R"))
276                 _ecore_fb_ctrl--;
277              else if (!strcmp(e->keyname, "Alt_L"))
278                 _ecore_fb_alt--;
279              else if (!strcmp(e->keyname, "Alt_R"))
280                 _ecore_fb_alt--;
281              else if (!strcmp(e->keyname, "Shift_L"))
282                 _ecore_fb_shift--;
283              else if (!strcmp(e->keyname, "Shift_R"))
284                 _ecore_fb_shift--;
285              else if (!strcmp(e->keyname, "Caps_Lock"))
286                 _ecore_fb_lock--;
287              if (_ecore_fb_ctrl < 0) _ecore_fb_ctrl = 0;
288              if (_ecore_fb_alt < 0) _ecore_fb_alt = 0;
289              if (_ecore_fb_shift < 0) _ecore_fb_shift = 0;
290              if (_ecore_fb_lock < 0) _ecore_fb_lock = 0;
291           }
292 retry:
293         ;
294      }
295    while (v > 0);
296    return EINA_TRUE;
297 }
298
299 int
300 ecore_fb_kbd_init(void)
301 {
302    int prev_flags;
303
304    prev_flags = fcntl(_ecore_fb_kbd_fd, F_GETFL);
305    fcntl(_ecore_fb_kbd_fd, F_SETFL, prev_flags | O_NONBLOCK);
306    _ecore_fb_kbd_fd_handler_handle = ecore_main_fd_handler_add(_ecore_fb_kbd_fd,
307                                                                ECORE_FD_READ,
308                                                                _ecore_fb_kbd_fd_handler, NULL,
309                                                                NULL, NULL);
310    if(!_ecore_fb_kbd_fd_handler_handle) return 0;
311    return 1;
312 }
313
314 void
315 ecore_fb_kbd_shutdown(void)
316 {
317    if (_ecore_fb_kbd_fd_handler_handle)
318       ecore_main_fd_handler_del(_ecore_fb_kbd_fd_handler_handle);
319    if (_ecore_fb_kbd_fd >= 0) close(_ecore_fb_kbd_fd);
320    _ecore_fb_kbd_fd = -1;
321    _ecore_fb_kbd_fd_handler_handle = NULL;
322    _ecore_fb_ctrl = 0;
323    _ecore_fb_lock = 0;
324    _ecore_fb_shift = 0;
325    _ecore_fb_alt = 0;
326 }