8 #include "Ecore_Input.h"
10 #include "Ecore_Input_Evas.h"
11 #include "ecore_input_evas_private.h"
13 int _ecore_input_evas_log_dom = -1;
15 typedef struct _Ecore_Input_Window Ecore_Input_Window;
16 struct _Ecore_Input_Window
20 Ecore_Event_Mouse_Move_Cb move_mouse;
21 Ecore_Event_Multi_Move_Cb move_multi;
22 Ecore_Event_Multi_Down_Cb down_multi;
23 Ecore_Event_Multi_Up_Cb up_multi;
27 static int _ecore_event_evas_init_count = 0;
28 static Ecore_Event_Handler *ecore_event_evas_handlers[8];
29 static Eina_Hash *_window_hash = NULL;
32 ecore_event_evas_modifier_lock_update(Evas *e, unsigned int modifiers)
34 if (modifiers & ECORE_EVENT_MODIFIER_SHIFT)
35 evas_key_modifier_on(e, "Shift");
36 else evas_key_modifier_off(e, "Shift");
38 if (modifiers & ECORE_EVENT_MODIFIER_CTRL)
39 evas_key_modifier_on(e, "Control");
40 else evas_key_modifier_off(e, "Control");
42 if (modifiers & ECORE_EVENT_MODIFIER_ALT)
43 evas_key_modifier_on(e, "Alt");
44 else evas_key_modifier_off(e, "Alt");
46 if (modifiers & ECORE_EVENT_MODIFIER_WIN)
48 evas_key_modifier_on(e, "Super");
49 evas_key_modifier_on(e, "Hyper");
53 evas_key_modifier_off(e, "Super");
54 evas_key_modifier_off(e, "Hyper");
57 if (modifiers & ECORE_EVENT_LOCK_SCROLL)
58 evas_key_lock_on(e, "Scroll_Lock");
59 else evas_key_lock_off(e, "Scroll_Lock");
61 if (modifiers & ECORE_EVENT_LOCK_NUM)
62 evas_key_lock_on(e, "Num_Lock");
63 else evas_key_lock_off(e, "Num_Lock");
65 if (modifiers & ECORE_EVENT_LOCK_CAPS)
66 evas_key_lock_on(e, "Caps_Lock");
67 else evas_key_lock_off(e, "Caps_Lock");
71 ecore_event_window_register(Ecore_Window id, void *window, Evas *evas,
72 Ecore_Event_Mouse_Move_Cb move_mouse,
73 Ecore_Event_Multi_Move_Cb move_multi,
74 Ecore_Event_Multi_Down_Cb down_multi,
75 Ecore_Event_Multi_Up_Cb up_multi)
77 Ecore_Input_Window *w;
79 w = calloc(1, sizeof(Ecore_Input_Window));
84 w->move_mouse = move_mouse;
85 w->move_multi = move_multi;
86 w->down_multi = down_multi;
87 w->up_multi = up_multi;
90 eina_hash_add(_window_hash, &id, w);
92 evas_key_modifier_add(evas, "Shift");
93 evas_key_modifier_add(evas, "Control");
94 evas_key_modifier_add(evas, "Alt");
95 evas_key_modifier_add(evas, "Meta");
96 evas_key_modifier_add(evas, "Hyper");
97 evas_key_modifier_add(evas, "Super");
98 evas_key_lock_add(evas, "Caps_Lock");
99 evas_key_lock_add(evas, "Num_Lock");
100 evas_key_lock_add(evas, "Scroll_Lock");
104 ecore_event_window_unregister(Ecore_Window id)
106 eina_hash_del(_window_hash, &id, NULL);
110 ecore_event_window_match(Ecore_Window id)
112 Ecore_Input_Window *lookup;
114 lookup = eina_hash_find(_window_hash, &id);
115 if (lookup) return lookup->window;
120 ecore_event_window_ignore_events(Ecore_Window id, int ignore_event)
122 Ecore_Input_Window *lookup;
124 lookup = eina_hash_find(_window_hash, &id);
126 lookup->ignore_event = ignore_event;
129 static Ecore_Input_Window*
130 _ecore_event_window_match(Ecore_Window id)
132 Ecore_Input_Window *lookup;
134 lookup = eina_hash_find(_window_hash, &id);
135 if (!lookup) return NULL;
136 if (lookup->ignore_event) return NULL; /* Pass on event. */
141 _ecore_event_evas_key(Ecore_Event_Key *e, Ecore_Event_Press press)
143 Ecore_Input_Window *lookup;
145 lookup = _ecore_event_window_match(e->event_window);
146 if (!lookup) return ECORE_CALLBACK_RENEW;
147 ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
148 if (press == ECORE_DOWN)
149 evas_event_feed_key_down(lookup->evas, e->keyname, e->key, e->string, e->compose, e->timestamp, NULL);
151 evas_event_feed_key_up(lookup->evas, e->keyname, e->key, e->string, e->compose, e->timestamp, NULL);
152 return ECORE_CALLBACK_RENEW;
156 _ecore_event_evas_mouse_button(Ecore_Event_Mouse_Button *e, Ecore_Event_Press press)
158 Ecore_Input_Window *lookup;
159 Evas_Button_Flags flags = EVAS_BUTTON_NONE;
161 lookup = _ecore_event_window_match(e->event_window);
162 if (!lookup) return ECORE_CALLBACK_RENEW;
163 if (e->double_click) flags |= EVAS_BUTTON_DOUBLE_CLICK;
164 if (e->triple_click) flags |= EVAS_BUTTON_TRIPLE_CLICK;
165 if (e->multi.device == 0)
167 ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
168 if (press == ECORE_DOWN)
169 evas_event_feed_mouse_down(lookup->evas, e->buttons, flags,
172 evas_event_feed_mouse_up(lookup->evas, e->buttons, flags,
177 if (press == ECORE_DOWN)
179 if (lookup->down_multi)
180 lookup->down_multi(lookup->window, e->multi.device,
181 e->x, e->y, e->multi.radius,
182 e->multi.radius_x, e->multi.radius_y,
183 e->multi.pressure, e->multi.angle,
184 e->multi.x, e->multi.y, flags,
187 evas_event_feed_multi_down(lookup->evas, e->multi.device,
188 e->x, e->y, e->multi.radius,
189 e->multi.radius_x, e->multi.radius_y,
190 e->multi.pressure, e->multi.angle,
191 e->multi.x, e->multi.y, flags,
196 if (lookup->up_multi)
197 lookup->up_multi(lookup->window, 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,
204 evas_event_feed_multi_up(lookup->evas, e->multi.device,
205 e->x, e->y, e->multi.radius,
206 e->multi.radius_x, e->multi.radius_y,
207 e->multi.pressure, e->multi.angle,
208 e->multi.x, e->multi.y, flags,
212 return ECORE_CALLBACK_RENEW;
216 ecore_event_evas_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event)
218 Ecore_Event_Mouse_Move *e;
219 Ecore_Input_Window *lookup;
222 lookup = _ecore_event_window_match(e->event_window);
223 if (!lookup) return ECORE_CALLBACK_RENEW;
224 if (e->multi.device == 0)
226 ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
227 if (lookup->move_mouse)
228 lookup->move_mouse(lookup->window, e->x, e->y, e->timestamp);
230 evas_event_feed_mouse_move(lookup->evas, e->x, e->y, e->timestamp,
235 if (lookup->move_multi)
236 lookup->move_multi(lookup->window, e->multi.device,
237 e->x, e->y, e->multi.radius,
238 e->multi.radius_x, e->multi.radius_y,
239 e->multi.pressure, e->multi.angle,
240 e->multi.x, e->multi.y, e->timestamp);
242 evas_event_feed_multi_move(lookup->evas, e->multi.device,
243 e->x, e->y, e->multi.radius,
244 e->multi.radius_x, e->multi.radius_y,
245 e->multi.pressure, e->multi.angle,
246 e->multi.x, e->multi.y, e->timestamp,
249 return ECORE_CALLBACK_RENEW;
253 ecore_event_evas_mouse_button_down(void *data __UNUSED__, int type __UNUSED__, void *event)
255 return _ecore_event_evas_mouse_button((Ecore_Event_Mouse_Button *)event, ECORE_DOWN);
259 ecore_event_evas_mouse_button_up(void *data __UNUSED__, int type __UNUSED__, void *event)
261 return _ecore_event_evas_mouse_button((Ecore_Event_Mouse_Button *)event, ECORE_UP);
265 _ecore_event_evas_mouse_io(Ecore_Event_Mouse_IO *e, Ecore_Event_IO io)
267 Ecore_Input_Window *lookup;
269 lookup = _ecore_event_window_match(e->event_window);
270 if (!lookup) return ECORE_CALLBACK_RENEW;
271 ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
275 evas_event_feed_mouse_in(lookup->evas, e->timestamp, NULL);
278 evas_event_feed_mouse_out(lookup->evas, e->timestamp, NULL);
284 lookup->move_mouse(lookup->window, e->x, e->y, e->timestamp);
285 return ECORE_CALLBACK_RENEW;
289 ecore_event_evas_key_down(void *data __UNUSED__, int type __UNUSED__, void *event)
291 return _ecore_event_evas_key((Ecore_Event_Key *)event, ECORE_DOWN);
295 ecore_event_evas_key_up(void *data __UNUSED__, int type __UNUSED__, void *event)
297 return _ecore_event_evas_key((Ecore_Event_Key *)event, ECORE_UP);
301 ecore_event_evas_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *event)
303 Ecore_Event_Mouse_Wheel *e;
304 Ecore_Input_Window *lookup;
307 lookup = _ecore_event_window_match(e->event_window);
308 if (!lookup) return ECORE_CALLBACK_RENEW;
309 ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
310 evas_event_feed_mouse_wheel(lookup->evas, e->direction, e->z, e->timestamp, NULL);
311 return ECORE_CALLBACK_RENEW;
315 ecore_event_evas_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
317 return _ecore_event_evas_mouse_io((Ecore_Event_Mouse_IO *)event, ECORE_IN);
321 ecore_event_evas_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
323 return _ecore_event_evas_mouse_io((Ecore_Event_Mouse_IO *)event, ECORE_OUT);
327 ecore_event_evas_init(void)
329 if (++_ecore_event_evas_init_count != 1)
330 return _ecore_event_evas_init_count;
332 _ecore_input_evas_log_dom = eina_log_domain_register
333 ("ecore_input_evas", ECORE_INPUT_EVAS_DEFAULT_LOG_COLOR);
334 if (_ecore_input_evas_log_dom < 0)
336 EINA_LOG_ERR("Impossible to create a log domain for the ecore input evas_module.");
337 return --_ecore_event_evas_init_count;
342 return --_ecore_event_evas_init_count;
345 if (!ecore_event_init())
350 ecore_event_evas_handlers[0] = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
351 ecore_event_evas_key_down,
353 ecore_event_evas_handlers[1] = ecore_event_handler_add(ECORE_EVENT_KEY_UP,
354 ecore_event_evas_key_up,
356 ecore_event_evas_handlers[2] = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN,
357 ecore_event_evas_mouse_button_down,
359 ecore_event_evas_handlers[3] = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP,
360 ecore_event_evas_mouse_button_up,
362 ecore_event_evas_handlers[4] = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE,
363 ecore_event_evas_mouse_move,
365 ecore_event_evas_handlers[5] = ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL,
366 ecore_event_evas_mouse_wheel,
368 ecore_event_evas_handlers[6] = ecore_event_handler_add(ECORE_EVENT_MOUSE_IN,
369 ecore_event_evas_mouse_in,
371 ecore_event_evas_handlers[7] = ecore_event_handler_add(ECORE_EVENT_MOUSE_OUT,
372 ecore_event_evas_mouse_out,
375 _window_hash = eina_hash_pointer_new(free);
377 return _ecore_event_evas_init_count;
382 return --_ecore_event_evas_init_count;
386 ecore_event_evas_shutdown(void)
390 if (--_ecore_event_evas_init_count != 0)
391 return _ecore_event_evas_init_count;
393 eina_hash_free(_window_hash);
395 for (i = 0; i < sizeof(ecore_event_evas_handlers) / sizeof(Ecore_Event_Handler *); i++)
397 ecore_event_handler_del(ecore_event_evas_handlers[i]);
398 ecore_event_evas_handlers[i] = NULL;
401 ecore_event_shutdown();
404 eina_log_domain_unregister(_ecore_input_evas_log_dom);
405 _ecore_input_evas_log_dom = -1;
407 return _ecore_event_evas_init_count;