diff options
Diffstat (limited to 'libraries/edje/src/lib/edje_callbacks.c')
-rw-r--r-- | libraries/edje/src/lib/edje_callbacks.c | 546 |
1 files changed, 546 insertions, 0 deletions
diff --git a/libraries/edje/src/lib/edje_callbacks.c b/libraries/edje/src/lib/edje_callbacks.c new file mode 100644 index 0000000..e0b0eae --- /dev/null +++ b/libraries/edje/src/lib/edje_callbacks.c | |||
@@ -0,0 +1,546 @@ | |||
1 | #include "edje_private.h" | ||
2 | |||
3 | static void | ||
4 | _edje_hold_signal_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info) | ||
5 | { | ||
6 | Evas_Event_Hold *ev; | ||
7 | Edje *ed; | ||
8 | Edje_Real_Part *rp; | ||
9 | |||
10 | ev = event_info; | ||
11 | ed = data; | ||
12 | rp = evas_object_data_get(obj, "real_part"); | ||
13 | if (!rp) return; | ||
14 | if (ev->hold) | ||
15 | _edje_emit(ed, "hold,on", rp->part->name); | ||
16 | else | ||
17 | _edje_emit(ed, "hold,off", rp->part->name); | ||
18 | } | ||
19 | |||
20 | static void | ||
21 | _edje_focus_in_signal_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) | ||
22 | { | ||
23 | Edje *ed; | ||
24 | Edje_Real_Part *rp; | ||
25 | |||
26 | ed = data; | ||
27 | rp = evas_object_data_get(obj, "real_part"); | ||
28 | if ((!rp) || (!ed)) | ||
29 | return; | ||
30 | |||
31 | _edje_emit(ed, "focus,part,in", rp->part->name); | ||
32 | } | ||
33 | |||
34 | static void | ||
35 | _edje_focus_out_signal_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) | ||
36 | { | ||
37 | Edje *ed; | ||
38 | Edje_Real_Part *rp; | ||
39 | |||
40 | ed = data; | ||
41 | rp = evas_object_data_get(obj, "real_part"); | ||
42 | if ((!rp) || (!ed)) | ||
43 | return; | ||
44 | |||
45 | _edje_emit(ed, "focus,part,out", rp->part->name); | ||
46 | } | ||
47 | |||
48 | static void | ||
49 | _edje_mouse_in_signal_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info) | ||
50 | { | ||
51 | Evas_Event_Mouse_In *ev; | ||
52 | Edje *ed; | ||
53 | Edje_Real_Part *rp; | ||
54 | |||
55 | ev = event_info; | ||
56 | ed = data; | ||
57 | rp = evas_object_data_get(obj, "real_part"); | ||
58 | if ((!rp) || | ||
59 | ((ev->event_flags) && | ||
60 | (rp->part->ignore_flags & ev->event_flags))) return; | ||
61 | _edje_emit(ed, "mouse,in", rp->part->name); | ||
62 | } | ||
63 | |||
64 | static void | ||
65 | _edje_mouse_out_signal_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info) | ||
66 | { | ||
67 | Evas_Event_Mouse_Out *ev; | ||
68 | Edje *ed; | ||
69 | Edje_Real_Part *rp; | ||
70 | |||
71 | ev = event_info; | ||
72 | ed = data; | ||
73 | rp = evas_object_data_get(obj, "real_part"); | ||
74 | if ((!rp) || | ||
75 | ((ev->event_flags) && | ||
76 | (rp->part->ignore_flags & ev->event_flags))) return; | ||
77 | _edje_emit(ed, "mouse,out", rp->part->name); | ||
78 | } | ||
79 | |||
80 | static void | ||
81 | _edje_mouse_down_signal_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info) | ||
82 | { | ||
83 | Evas_Event_Mouse_Down *ev; | ||
84 | Edje *ed; | ||
85 | Edje_Real_Part *rp; | ||
86 | char buf[256]; | ||
87 | int ignored; | ||
88 | |||
89 | ev = event_info; | ||
90 | ed = data; | ||
91 | rp = evas_object_data_get(obj, "real_part"); | ||
92 | if (!rp) return; | ||
93 | |||
94 | ignored = rp->part->ignore_flags & ev->event_flags; | ||
95 | |||
96 | _edje_ref(ed); | ||
97 | _edje_freeze(ed); | ||
98 | |||
99 | if ((!ev->event_flags) || (!ignored)) | ||
100 | { | ||
101 | if (ev->flags & EVAS_BUTTON_TRIPLE_CLICK) | ||
102 | snprintf(buf, sizeof(buf), "mouse,down,%i,triple", ev->button); | ||
103 | else if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK) | ||
104 | snprintf(buf, sizeof(buf), "mouse,down,%i,double", ev->button); | ||
105 | else | ||
106 | snprintf(buf, sizeof(buf), "mouse,down,%i", ev->button); | ||
107 | _edje_emit(ed, buf, rp->part->name); | ||
108 | } | ||
109 | |||
110 | if (rp->events_to) | ||
111 | { | ||
112 | int x = 0, y = 0; | ||
113 | Edje_Real_Part *events; | ||
114 | |||
115 | events = rp->events_to; | ||
116 | evas_object_geometry_get(rp->object, &x, &y, NULL, NULL); | ||
117 | |||
118 | if ((events->part->dragable.x) || (events->part->dragable.y)) | ||
119 | { | ||
120 | if (events->part->dragable.x) | ||
121 | { | ||
122 | events->drag->down.x = ev->canvas.x; | ||
123 | events->drag->tmp.x = 0; | ||
124 | } | ||
125 | if (events->part->dragable.y) | ||
126 | { | ||
127 | events->drag->down.y = ev->canvas.y; | ||
128 | events->drag->tmp.y = 0; | ||
129 | } | ||
130 | |||
131 | if (!ignored) | ||
132 | { | ||
133 | snprintf(buf, sizeof(buf), "mouse,down,%i", ev->button); | ||
134 | _edje_emit(ed, buf, events->part->name); | ||
135 | } | ||
136 | ed->dirty = 1; | ||
137 | #ifdef EDJE_CALC_CACHE | ||
138 | rp->invalidate = 1; | ||
139 | #endif | ||
140 | } | ||
141 | _edje_recalc_do(ed); | ||
142 | /* | ||
143 | _edje_thaw(ed); | ||
144 | _edje_unref(ed); | ||
145 | _edje_ref(ed); | ||
146 | _edje_freeze(ed); | ||
147 | */ | ||
148 | rp = events; | ||
149 | { | ||
150 | FLOAT_T dx = ZERO, dy = ZERO; | ||
151 | |||
152 | _edje_part_dragable_calc(ed, rp, &dx, &dy); | ||
153 | |||
154 | if ((dx != rp->drag->val.x) || (dy != rp->drag->val.y)) | ||
155 | { | ||
156 | rp->drag->val.x = dx; | ||
157 | rp->drag->val.y = dy; | ||
158 | if (!ignored) | ||
159 | _edje_emit(ed, "drag", rp->part->name); | ||
160 | ed->dirty = 1; | ||
161 | #ifdef EDJE_CALC_CACHE | ||
162 | rp->invalidate = 1; | ||
163 | #endif | ||
164 | rp->drag->need_reset = 1; | ||
165 | _edje_recalc_do(ed); | ||
166 | } | ||
167 | } | ||
168 | } | ||
169 | |||
170 | if (rp->drag) | ||
171 | { | ||
172 | if (rp->drag->down.count == 0) | ||
173 | { | ||
174 | if (rp->part->dragable.x) | ||
175 | rp->drag->down.x = ev->canvas.x; | ||
176 | if (rp->part->dragable.y) | ||
177 | rp->drag->down.y = ev->canvas.y; | ||
178 | if (!ignored) | ||
179 | _edje_emit(ed, "drag,start", rp->part->name); | ||
180 | } | ||
181 | rp->drag->down.count++; | ||
182 | } | ||
183 | |||
184 | if (rp->clicked_button == 0) | ||
185 | { | ||
186 | rp->clicked_button = ev->button; | ||
187 | if (!(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)) | ||
188 | rp->still_in = 1; | ||
189 | } | ||
190 | // _edje_recalc_do(ed); | ||
191 | _edje_thaw(ed); | ||
192 | _edje_unref(ed); | ||
193 | } | ||
194 | |||
195 | static void | ||
196 | _edje_mouse_up_signal_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info) | ||
197 | { | ||
198 | Evas_Event_Mouse_Up *ev; | ||
199 | Edje *ed; | ||
200 | Edje_Real_Part *rp; | ||
201 | char buf[256]; | ||
202 | int ignored; | ||
203 | |||
204 | ev = event_info; | ||
205 | ed = data; | ||
206 | rp = evas_object_data_get(obj, "real_part"); | ||
207 | if (!rp) return; | ||
208 | |||
209 | ignored = rp->part->ignore_flags & ev->event_flags; | ||
210 | |||
211 | _edje_ref(ed); | ||
212 | _edje_freeze(ed); | ||
213 | |||
214 | if ((!ev->event_flags) || (!ignored)) | ||
215 | { | ||
216 | snprintf(buf, sizeof(buf), "mouse,up,%i", ev->button); | ||
217 | _edje_emit(ed, buf, rp->part->name); | ||
218 | } | ||
219 | |||
220 | if (rp->events_to) | ||
221 | { | ||
222 | rp = rp->events_to; | ||
223 | if (!ignored) | ||
224 | { | ||
225 | snprintf(buf, sizeof(buf), "mouse,up,%i", ev->button); | ||
226 | _edje_emit(ed, buf, rp->part->name); | ||
227 | } | ||
228 | } | ||
229 | |||
230 | if (rp->drag) | ||
231 | { | ||
232 | if (rp->drag->down.count > 0) | ||
233 | { | ||
234 | rp->drag->down.count--; | ||
235 | if (rp->drag->down.count == 0) | ||
236 | { | ||
237 | rp->drag->need_reset = 1; | ||
238 | ed->dirty = 1; | ||
239 | #ifdef EDJE_CALC_CACHE | ||
240 | rp->invalidate = 1; | ||
241 | #endif | ||
242 | if (!ignored) | ||
243 | _edje_emit(ed, "drag,stop", rp->part->name); | ||
244 | } | ||
245 | } | ||
246 | } | ||
247 | |||
248 | if ((rp->still_in) && (rp->clicked_button == ev->button) && (!ignored)) | ||
249 | { | ||
250 | snprintf(buf, sizeof(buf), "mouse,clicked,%i", ev->button); | ||
251 | _edje_emit(ed, buf, rp->part->name); | ||
252 | } | ||
253 | rp->clicked_button = 0; | ||
254 | rp->still_in = 0; | ||
255 | |||
256 | // _edje_recalc_do(ed); | ||
257 | _edje_thaw(ed); | ||
258 | _edje_unref(ed); | ||
259 | } | ||
260 | |||
261 | static void | ||
262 | _edje_mouse_move_signal_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info) | ||
263 | { | ||
264 | Evas_Event_Mouse_Move *ev; | ||
265 | Edje *ed; | ||
266 | Edje_Real_Part *rp; | ||
267 | int ignored; | ||
268 | |||
269 | ev = event_info; | ||
270 | ed = data; | ||
271 | rp = evas_object_data_get(obj, "real_part"); | ||
272 | if (!rp) return; | ||
273 | if (rp->events_to) rp = rp->events_to; | ||
274 | |||
275 | ignored = rp->part->ignore_flags & ev->event_flags; | ||
276 | |||
277 | _edje_ref(ed); | ||
278 | if ((!ev->event_flags) || (!ignored)) | ||
279 | _edje_emit(ed, "mouse,move", rp->part->name); | ||
280 | |||
281 | if (rp->still_in) | ||
282 | { | ||
283 | |||
284 | if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) | ||
285 | rp->still_in = 0; | ||
286 | else | ||
287 | { | ||
288 | Evas_Coord x, y, w, h; | ||
289 | |||
290 | evas_object_geometry_get(obj, &x, &y, &w, &h); | ||
291 | if ((ev->cur.canvas.x < x) || (ev->cur.canvas.y < y) || | ||
292 | (ev->cur.canvas.x >= (x + w)) || (ev->cur.canvas.y >= (y + h))) | ||
293 | rp->still_in = 0; | ||
294 | } | ||
295 | } | ||
296 | else | ||
297 | { | ||
298 | if (!(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)) | ||
299 | { | ||
300 | Evas_Coord x, y, w, h; | ||
301 | |||
302 | evas_object_geometry_get(obj, &x, &y, &w, &h); | ||
303 | if ((ev->cur.canvas.x >= x) && (ev->cur.canvas.y >= y) && | ||
304 | (ev->cur.canvas.x < (x + w)) && (ev->cur.canvas.y < (y + h))) | ||
305 | rp->still_in = 1; | ||
306 | } | ||
307 | } | ||
308 | _edje_freeze(ed); | ||
309 | if (rp->drag) | ||
310 | { | ||
311 | if (rp->drag->down.count > 0) | ||
312 | { | ||
313 | if (rp->part->dragable.x) | ||
314 | rp->drag->tmp.x = ev->cur.canvas.x - rp->drag->down.x; | ||
315 | if (rp->part->dragable.y) | ||
316 | rp->drag->tmp.y = ev->cur.canvas.y - rp->drag->down.y; | ||
317 | ed->dirty = 1; | ||
318 | #ifdef EDJE_CALC_CACHE | ||
319 | rp->invalidate = 1; | ||
320 | #endif | ||
321 | } | ||
322 | _edje_recalc_do(ed); | ||
323 | |||
324 | if (rp->drag->down.count > 0) | ||
325 | { | ||
326 | FLOAT_T dx, dy; | ||
327 | |||
328 | _edje_part_dragable_calc(ed, rp, &dx, &dy); | ||
329 | if ((dx != rp->drag->val.x) || (dy != rp->drag->val.y)) | ||
330 | { | ||
331 | rp->drag->val.x = dx; | ||
332 | rp->drag->val.y = dy; | ||
333 | if (!ignored) | ||
334 | _edje_emit(ed, "drag", rp->part->name); | ||
335 | ed->dirty = 1; | ||
336 | #ifdef EDJE_CALC_CACHE | ||
337 | rp->invalidate = 1; | ||
338 | #endif | ||
339 | _edje_recalc_do(ed); | ||
340 | } | ||
341 | } | ||
342 | } | ||
343 | _edje_unref(ed); | ||
344 | _edje_thaw(ed); | ||
345 | } | ||
346 | |||
347 | static void | ||
348 | _edje_mouse_wheel_signal_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info) | ||
349 | { | ||
350 | Evas_Event_Mouse_Wheel *ev; | ||
351 | Edje *ed; | ||
352 | Edje_Real_Part *rp; | ||
353 | char buf[256]; | ||
354 | |||
355 | ev = event_info; | ||
356 | ed = data; | ||
357 | rp = evas_object_data_get(obj, "real_part"); | ||
358 | if ((!rp) || | ||
359 | ((ev->event_flags) && | ||
360 | (!(rp->part->ignore_flags & ev->event_flags)))) return; | ||
361 | |||
362 | snprintf(buf, sizeof(buf), "mouse,wheel,%i,%i", ev->direction, (ev->z < 0) ? (-1) : (1)); | ||
363 | _edje_emit(ed, buf, rp->part->name); | ||
364 | } | ||
365 | |||
366 | Eina_Bool | ||
367 | _edje_timer_cb(void *data __UNUSED__) | ||
368 | { | ||
369 | double t; | ||
370 | Eina_List *l; | ||
371 | Eina_List *animl = NULL; | ||
372 | Edje *ed; | ||
373 | |||
374 | t = ecore_loop_time_get(); | ||
375 | EINA_LIST_FOREACH(_edje_animators, l, ed) | ||
376 | { | ||
377 | _edje_ref(ed); | ||
378 | animl = eina_list_append(animl, ed); | ||
379 | } | ||
380 | while (animl) | ||
381 | { | ||
382 | Eina_List *newl = NULL; | ||
383 | |||
384 | ed = eina_list_data_get(animl); | ||
385 | _edje_block(ed); | ||
386 | _edje_freeze(ed); | ||
387 | animl = eina_list_remove(animl, eina_list_data_get(animl)); | ||
388 | if ((!ed->paused) && (!ed->delete_me)) | ||
389 | { | ||
390 | const void *tmp; | ||
391 | |||
392 | ed->walking_actions = 1; | ||
393 | EINA_LIST_FOREACH(ed->actions, l, tmp) | ||
394 | newl = eina_list_append(newl, tmp); | ||
395 | while (newl) | ||
396 | { | ||
397 | Edje_Running_Program *runp; | ||
398 | |||
399 | runp = eina_list_data_get(newl); | ||
400 | newl = eina_list_remove(newl, eina_list_data_get(newl)); | ||
401 | if (!runp->delete_me) | ||
402 | _edje_program_run_iterate(runp, t); | ||
403 | if (_edje_block_break(ed)) | ||
404 | { | ||
405 | eina_list_free(newl); | ||
406 | newl = NULL; | ||
407 | goto break_prog; | ||
408 | } | ||
409 | } | ||
410 | EINA_LIST_FOREACH(ed->actions, l, tmp) | ||
411 | newl = eina_list_append(newl, tmp); | ||
412 | while (newl) | ||
413 | { | ||
414 | Edje_Running_Program *runp; | ||
415 | |||
416 | runp = eina_list_data_get(newl); | ||
417 | newl = eina_list_remove(newl, eina_list_data_get(newl)); | ||
418 | if (runp->delete_me) | ||
419 | { | ||
420 | _edje_anim_count--; | ||
421 | runp->edje->actions = | ||
422 | eina_list_remove(runp->edje->actions, runp); | ||
423 | if (!runp->edje->actions) | ||
424 | _edje_animators = | ||
425 | eina_list_remove(_edje_animators, runp->edje); | ||
426 | free(runp); | ||
427 | } | ||
428 | } | ||
429 | ed->walking_actions = 0; | ||
430 | } | ||
431 | break_prog: | ||
432 | _edje_unblock(ed); | ||
433 | _edje_thaw(ed); | ||
434 | _edje_unref(ed); | ||
435 | } | ||
436 | if (_edje_anim_count > 0) return ECORE_CALLBACK_RENEW; | ||
437 | _edje_timer = NULL; | ||
438 | return ECORE_CALLBACK_CANCEL; | ||
439 | } | ||
440 | |||
441 | Eina_Bool | ||
442 | _edje_pending_timer_cb(void *data) | ||
443 | { | ||
444 | Edje_Pending_Program *pp; | ||
445 | |||
446 | pp = data; | ||
447 | pp->edje->pending_actions = eina_list_remove(pp->edje->pending_actions, pp); | ||
448 | _edje_program_run(pp->edje, pp->program, 1, "", ""); | ||
449 | free(pp); | ||
450 | return ECORE_CALLBACK_CANCEL; | ||
451 | } | ||
452 | |||
453 | void | ||
454 | _edje_callbacks_add(Evas_Object *obj, Edje *ed, Edje_Real_Part *rp) | ||
455 | { | ||
456 | evas_object_event_callback_add(obj, | ||
457 | EVAS_CALLBACK_HOLD, | ||
458 | _edje_hold_signal_cb, | ||
459 | ed); | ||
460 | evas_object_event_callback_add(obj, | ||
461 | EVAS_CALLBACK_MOUSE_IN, | ||
462 | _edje_mouse_in_signal_cb, | ||
463 | ed); | ||
464 | evas_object_event_callback_add(obj, | ||
465 | EVAS_CALLBACK_MOUSE_OUT, | ||
466 | _edje_mouse_out_signal_cb, | ||
467 | ed); | ||
468 | evas_object_event_callback_add(obj, | ||
469 | EVAS_CALLBACK_MOUSE_DOWN, | ||
470 | _edje_mouse_down_signal_cb, | ||
471 | ed); | ||
472 | evas_object_event_callback_add(obj, | ||
473 | EVAS_CALLBACK_MOUSE_UP, | ||
474 | _edje_mouse_up_signal_cb, | ||
475 | ed); | ||
476 | evas_object_event_callback_add(obj, | ||
477 | EVAS_CALLBACK_MOUSE_MOVE, | ||
478 | _edje_mouse_move_signal_cb, | ||
479 | ed); | ||
480 | evas_object_event_callback_add(obj, | ||
481 | EVAS_CALLBACK_MOUSE_WHEEL, | ||
482 | _edje_mouse_wheel_signal_cb, | ||
483 | ed); | ||
484 | evas_object_data_set(obj, "real_part", rp); | ||
485 | } | ||
486 | |||
487 | void | ||
488 | _edje_callbacks_del(Evas_Object *obj, Edje *ed) | ||
489 | { | ||
490 | evas_object_event_callback_del_full(obj, | ||
491 | EVAS_CALLBACK_HOLD, | ||
492 | _edje_hold_signal_cb, | ||
493 | ed); | ||
494 | evas_object_event_callback_del_full(obj, | ||
495 | EVAS_CALLBACK_MOUSE_IN, | ||
496 | _edje_mouse_in_signal_cb, | ||
497 | ed); | ||
498 | evas_object_event_callback_del_full(obj, | ||
499 | EVAS_CALLBACK_MOUSE_OUT, | ||
500 | _edje_mouse_out_signal_cb, | ||
501 | ed); | ||
502 | evas_object_event_callback_del_full(obj, | ||
503 | EVAS_CALLBACK_MOUSE_DOWN, | ||
504 | _edje_mouse_down_signal_cb, | ||
505 | ed); | ||
506 | evas_object_event_callback_del_full(obj, | ||
507 | EVAS_CALLBACK_MOUSE_UP, | ||
508 | _edje_mouse_up_signal_cb, | ||
509 | ed); | ||
510 | evas_object_event_callback_del_full(obj, | ||
511 | EVAS_CALLBACK_MOUSE_MOVE, | ||
512 | _edje_mouse_move_signal_cb, | ||
513 | ed); | ||
514 | evas_object_event_callback_del_full(obj, | ||
515 | EVAS_CALLBACK_MOUSE_WHEEL, | ||
516 | _edje_mouse_wheel_signal_cb, | ||
517 | ed); | ||
518 | evas_object_data_del(obj, "real_part"); | ||
519 | } | ||
520 | |||
521 | void | ||
522 | _edje_callbacks_focus_add(Evas_Object *obj, Edje *ed, Edje_Real_Part *rp) | ||
523 | { | ||
524 | evas_object_event_callback_add(obj, | ||
525 | EVAS_CALLBACK_FOCUS_IN, | ||
526 | _edje_focus_in_signal_cb, | ||
527 | ed); | ||
528 | evas_object_event_callback_add(obj, | ||
529 | EVAS_CALLBACK_FOCUS_OUT, | ||
530 | _edje_focus_out_signal_cb, | ||
531 | ed); | ||
532 | evas_object_data_set(obj, "real_part", rp); | ||
533 | } | ||
534 | |||
535 | void | ||
536 | _edje_callbacks_focus_del(Evas_Object *obj, Edje *ed) | ||
537 | { | ||
538 | evas_object_event_callback_del_full(obj, | ||
539 | EVAS_CALLBACK_FOCUS_IN, | ||
540 | _edje_focus_in_signal_cb, | ||
541 | ed); | ||
542 | evas_object_event_callback_del_full(obj, | ||
543 | EVAS_CALLBACK_FOCUS_OUT, | ||
544 | _edje_focus_out_signal_cb, | ||
545 | ed); | ||
546 | } | ||