aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/edje/src/lib/edje_callbacks.c
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/edje/src/lib/edje_callbacks.c')
-rw-r--r--libraries/edje/src/lib/edje_callbacks.c546
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
3static 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
20static 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
34static 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
48static 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
64static 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
80static 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
195static 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
261static 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
347static 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
366Eina_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
441Eina_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
453void
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
487void
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
521void
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
535void
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}