9 #include "Ecore_Input.h"
11 #include "Ecore_Input_Evas.h"
12 #include "ecore_input_evas_private.h"
14 int _ecore_input_evas_log_dom = -1;
16 typedef struct _Ecore_Input_Window Ecore_Input_Window;
17 struct _Ecore_Input_Window
21 Ecore_Event_Mouse_Move_Cb move_mouse;
22 Ecore_Event_Multi_Move_Cb move_multi;
23 Ecore_Event_Multi_Down_Cb down_multi;
24 Ecore_Event_Multi_Up_Cb up_multi;
28 static int _ecore_event_evas_init_count = 0;
29 static Ecore_Event_Handler *ecore_event_evas_handlers[8];
30 static Eina_Hash *_window_hash = NULL;
33 ecore_event_evas_modifier_lock_update(Evas *e, unsigned int modifiers)
35 if (modifiers & ECORE_EVENT_MODIFIER_SHIFT)
36 evas_key_modifier_on(e, "Shift");
37 else evas_key_modifier_off(e, "Shift");
39 if (modifiers & ECORE_EVENT_MODIFIER_CTRL)
40 evas_key_modifier_on(e, "Control");
41 else evas_key_modifier_off(e, "Control");
43 if (modifiers & ECORE_EVENT_MODIFIER_ALT)
44 evas_key_modifier_on(e, "Alt");
45 else evas_key_modifier_off(e, "Alt");
47 if (modifiers & ECORE_EVENT_MODIFIER_WIN)
49 evas_key_modifier_on(e, "Super");
50 evas_key_modifier_on(e, "Hyper");
54 evas_key_modifier_off(e, "Super");
55 evas_key_modifier_off(e, "Hyper");
58 if (modifiers & ECORE_EVENT_MODIFIER_ALTGR)
59 evas_key_modifier_on(e, "AltGr");
60 else evas_key_modifier_off(e, "AltGr");
62 if (modifiers & ECORE_EVENT_LOCK_SCROLL)
63 evas_key_lock_on(e, "Scroll_Lock");
64 else evas_key_lock_off(e, "Scroll_Lock");
66 if (modifiers & ECORE_EVENT_LOCK_NUM)
67 evas_key_lock_on(e, "Num_Lock");
68 else evas_key_lock_off(e, "Num_Lock");
70 if (modifiers & ECORE_EVENT_LOCK_CAPS)
71 evas_key_lock_on(e, "Caps_Lock");
72 else evas_key_lock_off(e, "Caps_Lock");
74 if (modifiers & ECORE_EVENT_LOCK_SHIFT)
75 evas_key_lock_on(e, "Shift_Lock");
76 else evas_key_lock_off(e, "Shift_Lock");
80 ecore_event_window_register(Ecore_Window id, void *window, Evas *evas,
81 Ecore_Event_Mouse_Move_Cb move_mouse,
82 Ecore_Event_Multi_Move_Cb move_multi,
83 Ecore_Event_Multi_Down_Cb down_multi,
84 Ecore_Event_Multi_Up_Cb up_multi)
86 Ecore_Input_Window *w;
88 w = calloc(1, sizeof(Ecore_Input_Window));
93 w->move_mouse = move_mouse;
94 w->move_multi = move_multi;
95 w->down_multi = down_multi;
96 w->up_multi = up_multi;
99 eina_hash_add(_window_hash, &id, w);
101 evas_key_modifier_add(evas, "Shift");
102 evas_key_modifier_add(evas, "Control");
103 evas_key_modifier_add(evas, "Alt");
104 evas_key_modifier_add(evas, "Meta");
105 evas_key_modifier_add(evas, "Hyper");
106 evas_key_modifier_add(evas, "Super");
107 evas_key_modifier_add(evas, "AltGr");
108 evas_key_lock_add(evas, "Caps_Lock");
109 evas_key_lock_add(evas, "Num_Lock");
110 evas_key_lock_add(evas, "Scroll_Lock");
114 ecore_event_window_unregister(Ecore_Window id)
116 eina_hash_del(_window_hash, &id, NULL);
120 ecore_event_window_match(Ecore_Window id)
122 Ecore_Input_Window *lookup;
124 lookup = eina_hash_find(_window_hash, &id);
125 if (lookup) return lookup->window;
130 ecore_event_window_ignore_events(Ecore_Window id, int ignore_event)
132 Ecore_Input_Window *lookup;
134 lookup = eina_hash_find(_window_hash, &id);
136 lookup->ignore_event = ignore_event;
139 static Ecore_Input_Window*
140 _ecore_event_window_match(Ecore_Window id)
142 Ecore_Input_Window *lookup;
144 lookup = eina_hash_find(_window_hash, &id);
145 if (!lookup) return NULL;
146 if (lookup->ignore_event) return NULL; /* Pass on event. */
151 _ecore_event_evas_key(Ecore_Event_Key *e, Ecore_Event_Press press)
153 Ecore_Input_Window *lookup;
155 lookup = _ecore_event_window_match(e->event_window);
156 if (!lookup) return ECORE_CALLBACK_RENEW;
157 ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
158 if (press == ECORE_DOWN)
159 evas_event_feed_key_down(lookup->evas, e->keyname, e->key, e->string, e->compose, e->timestamp, NULL);
161 evas_event_feed_key_up(lookup->evas, e->keyname, e->key, e->string, e->compose, e->timestamp, NULL);
162 return ECORE_CALLBACK_RENEW;
166 _ecore_event_evas_mouse_button(Ecore_Event_Mouse_Button *e, Ecore_Event_Press press)
168 Ecore_Input_Window *lookup;
169 Evas_Button_Flags flags = EVAS_BUTTON_NONE;
171 lookup = _ecore_event_window_match(e->event_window);
172 if (!lookup) return ECORE_CALLBACK_RENEW;
173 if (e->double_click) flags |= EVAS_BUTTON_DOUBLE_CLICK;
174 if (e->triple_click) flags |= EVAS_BUTTON_TRIPLE_CLICK;
175 if (e->multi.device == 0)
177 ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
178 if (press == ECORE_DOWN)
179 evas_event_feed_mouse_down(lookup->evas, e->buttons, flags,
182 evas_event_feed_mouse_up(lookup->evas, e->buttons, flags,
187 if (press == ECORE_DOWN)
189 if (lookup->down_multi)
190 lookup->down_multi(lookup->window, e->multi.device,
191 e->x, e->y, e->multi.radius,
192 e->multi.radius_x, e->multi.radius_y,
193 e->multi.pressure, e->multi.angle,
194 e->multi.x, e->multi.y, flags,
197 evas_event_feed_multi_down(lookup->evas, e->multi.device,
198 e->x, e->y, e->multi.radius,
199 e->multi.radius_x, e->multi.radius_y,
200 e->multi.pressure, e->multi.angle,
201 e->multi.x, e->multi.y, flags,
206 if (lookup->up_multi)
207 lookup->up_multi(lookup->window, e->multi.device,
208 e->x, e->y, e->multi.radius,
209 e->multi.radius_x, e->multi.radius_y,
210 e->multi.pressure, e->multi.angle,
211 e->multi.x, e->multi.y, flags,
214 evas_event_feed_multi_up(lookup->evas, e->multi.device,
215 e->x, e->y, e->multi.radius,
216 e->multi.radius_x, e->multi.radius_y,
217 e->multi.pressure, e->multi.angle,
218 e->multi.x, e->multi.y, flags,
222 return ECORE_CALLBACK_RENEW;
226 ecore_event_evas_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event)
228 Ecore_Event_Mouse_Move *e;
229 Ecore_Input_Window *lookup;
232 lookup = _ecore_event_window_match(e->event_window);
233 if (!lookup) return ECORE_CALLBACK_RENEW;
234 if (e->multi.device == 0)
236 ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
237 if (lookup->move_mouse)
238 lookup->move_mouse(lookup->window, e->x, e->y, e->timestamp);
240 evas_event_feed_mouse_move(lookup->evas, e->x, e->y, e->timestamp,
245 if (lookup->move_multi)
246 lookup->move_multi(lookup->window, e->multi.device,
247 e->x, e->y, e->multi.radius,
248 e->multi.radius_x, e->multi.radius_y,
249 e->multi.pressure, e->multi.angle,
250 e->multi.x, e->multi.y, e->timestamp);
252 evas_event_feed_multi_move(lookup->evas, e->multi.device,
253 e->x, e->y, e->multi.radius,
254 e->multi.radius_x, e->multi.radius_y,
255 e->multi.pressure, e->multi.angle,
256 e->multi.x, e->multi.y, e->timestamp,
259 return ECORE_CALLBACK_RENEW;
263 ecore_event_evas_mouse_button_down(void *data __UNUSED__, int type __UNUSED__, void *event)
265 return _ecore_event_evas_mouse_button((Ecore_Event_Mouse_Button *)event, ECORE_DOWN);
269 ecore_event_evas_mouse_button_up(void *data __UNUSED__, int type __UNUSED__, void *event)
271 return _ecore_event_evas_mouse_button((Ecore_Event_Mouse_Button *)event, ECORE_UP);
275 _ecore_event_evas_mouse_io(Ecore_Event_Mouse_IO *e, Ecore_Event_IO io)
277 Ecore_Input_Window *lookup;
279 lookup = _ecore_event_window_match(e->event_window);
280 if (!lookup) return ECORE_CALLBACK_RENEW;
281 ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
285 evas_event_feed_mouse_in(lookup->evas, e->timestamp, NULL);
288 evas_event_feed_mouse_out(lookup->evas, e->timestamp, NULL);
294 lookup->move_mouse(lookup->window, e->x, e->y, e->timestamp);
295 return ECORE_CALLBACK_RENEW;
299 ecore_event_evas_key_down(void *data __UNUSED__, int type __UNUSED__, void *event)
301 return _ecore_event_evas_key((Ecore_Event_Key *)event, ECORE_DOWN);
305 ecore_event_evas_key_up(void *data __UNUSED__, int type __UNUSED__, void *event)
307 return _ecore_event_evas_key((Ecore_Event_Key *)event, ECORE_UP);
311 ecore_event_evas_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *event)
313 Ecore_Event_Mouse_Wheel *e;
314 Ecore_Input_Window *lookup;
317 lookup = _ecore_event_window_match(e->event_window);
318 if (!lookup) return ECORE_CALLBACK_RENEW;
319 ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
320 evas_event_feed_mouse_wheel(lookup->evas, e->direction, e->z, e->timestamp, NULL);
321 return ECORE_CALLBACK_RENEW;
325 ecore_event_evas_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
327 return _ecore_event_evas_mouse_io((Ecore_Event_Mouse_IO *)event, ECORE_IN);
331 ecore_event_evas_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
333 return _ecore_event_evas_mouse_io((Ecore_Event_Mouse_IO *)event, ECORE_OUT);
337 ecore_event_evas_init(void)
339 if (++_ecore_event_evas_init_count != 1)
340 return _ecore_event_evas_init_count;
342 _ecore_input_evas_log_dom = eina_log_domain_register
343 ("ecore_input_evas", ECORE_INPUT_EVAS_DEFAULT_LOG_COLOR);
344 if (_ecore_input_evas_log_dom < 0)
346 EINA_LOG_ERR("Impossible to create a log domain for the ecore input evas_module.");
347 return --_ecore_event_evas_init_count;
352 return --_ecore_event_evas_init_count;
355 if (!ecore_event_init())
360 ecore_event_evas_handlers[0] = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
361 ecore_event_evas_key_down,
363 ecore_event_evas_handlers[1] = ecore_event_handler_add(ECORE_EVENT_KEY_UP,
364 ecore_event_evas_key_up,
366 ecore_event_evas_handlers[2] = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN,
367 ecore_event_evas_mouse_button_down,
369 ecore_event_evas_handlers[3] = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP,
370 ecore_event_evas_mouse_button_up,
372 ecore_event_evas_handlers[4] = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE,
373 ecore_event_evas_mouse_move,
375 ecore_event_evas_handlers[5] = ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL,
376 ecore_event_evas_mouse_wheel,
378 ecore_event_evas_handlers[6] = ecore_event_handler_add(ECORE_EVENT_MOUSE_IN,
379 ecore_event_evas_mouse_in,
381 ecore_event_evas_handlers[7] = ecore_event_handler_add(ECORE_EVENT_MOUSE_OUT,
382 ecore_event_evas_mouse_out,
385 _window_hash = eina_hash_pointer_new(free);
387 return _ecore_event_evas_init_count;
392 return --_ecore_event_evas_init_count;
396 ecore_event_evas_shutdown(void)
400 if (--_ecore_event_evas_init_count != 0)
401 return _ecore_event_evas_init_count;
403 eina_hash_free(_window_hash);
405 for (i = 0; i < sizeof(ecore_event_evas_handlers) / sizeof(Ecore_Event_Handler *); i++)
407 ecore_event_handler_del(ecore_event_evas_handlers[i]);
408 ecore_event_evas_handlers[i] = NULL;
411 ecore_event_shutdown();
414 eina_log_domain_unregister(_ecore_input_evas_log_dom);
415 _ecore_input_evas_log_dom = -1;
417 return _ecore_event_evas_init_count;