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);
4 static const char *_ecore_fb_kbd_syms[128 * 7] =
6 #include "ecore_fb_keytable.h"
9 static const char *_ecore_fb_btn_syms[128] =
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;
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);
134 _ecore_fb_event_free_key_down(void *data __UNUSED__, void *ev)
136 Ecore_Fb_Event_Key_Up *e;
139 if (e->keysymbol) free(e->keysymbol);
140 if (e->key_compose) free(e->key_compose);
145 _ecore_fb_event_free_key_up(void *data __UNUSED__, void *ev)
147 Ecore_Fb_Event_Key_Up *e;
151 if (e->keysymbol) free(e->keysymbol);
152 if (e->key_compose) free(e->key_compose);
157 _ecore_fb_kbd_fd_handler(void *data __UNUSED__, Ecore_Fd_Handler *fd_handler __UNUSED__)
165 v = read(_ecore_fb_kbd_fd, &buf, 1);
166 if (v < 0) return EINA_TRUE;
167 if (v < 1) return EINA_TRUE;
172 Ecore_Fb_Event_Key_Down *e;
174 e = calloc(1, sizeof(Ecore_Fb_Event_Key_Down));
176 if (_ecore_fb_kbd_fd == _ecore_fb_tty_fd)
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]);
187 e->keyname = strdup(_ecore_fb_btn_syms[buf & 0x7f]);
194 e->event_window = e->window;
195 e->root_window = e->window;
197 e->timestamp = ecore_loop_time_get() * 1000.0;
198 if (!strcmp(e->keyname, "Control_L"))
200 else if (!strcmp(e->keyname, "Control_R"))
202 else if (!strcmp(e->keyname, "Alt_L"))
204 else if (!strcmp(e->keyname, "Alt_R"))
206 else if (!strcmp(e->keyname, "Shift_L"))
208 else if (!strcmp(e->keyname, "Shift_R"))
210 else if (!strcmp(e->keyname, "Caps_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) &&
229 const char *ts = _ecore_fb_kbd_syms[(buf & 0x7f) + 3 + 3];
233 if (e->key_compose) free(e->key_compose);
234 e->key_compose = strdup(ts);
237 if ((vt_switch >= 0) &&
240 _ecore_fb_vt_switch(vt_switch);
241 ecore_event_add(ECORE_FB_EVENT_KEY_DOWN, e, _ecore_fb_event_free_key_down, NULL);
246 Ecore_Fb_Event_Key_Up *e;
248 e = calloc(1, sizeof(Ecore_Fb_Event_Key_Up));
250 if (_ecore_fb_kbd_fd == _ecore_fb_tty_fd)
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]);
261 e->keyname = strdup(_ecore_fb_btn_syms[buf & 0x7f]);
268 e->event_window = e->window;
269 e->root_window = e->window;
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"))
275 else if (!strcmp(e->keyname, "Control_R"))
277 else if (!strcmp(e->keyname, "Alt_L"))
279 else if (!strcmp(e->keyname, "Alt_R"))
281 else if (!strcmp(e->keyname, "Shift_L"))
283 else if (!strcmp(e->keyname, "Shift_R"))
285 else if (!strcmp(e->keyname, "Caps_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;
300 ecore_fb_kbd_init(void)
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,
308 _ecore_fb_kbd_fd_handler, NULL,
310 if(!_ecore_fb_kbd_fd_handler_handle) return 0;
315 ecore_fb_kbd_shutdown(void)
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;