1
#include "edje_private.h"
4
_edje_hold_signal_cb(void *data, const Efl_Event *event)
12
rp = evas_object_data_get(event->object, "real_part");
14
if (efl_input_hold_get(ev))
15
_edje_seat_emit(ed, efl_input_device_get(ev),
16
"hold,on", rp->part->name);
18
_edje_seat_emit(ed, efl_input_device_get(ev),
19
"hold,off", rp->part->name);
23
_edje_focus_in_signal_cb(void *data, const Efl_Event *event)
31
rp = evas_object_data_get(event->object, "real_part");
35
_edje_seat_emit(ed, efl_input_device_get(ev),
36
"focus,part,in", rp->part->name);
40
_edje_focus_out_signal_cb(void *data, const Efl_Event *event)
48
rp = evas_object_data_get(event->object, "real_part");
52
_edje_seat_emit(ed, efl_input_device_get(ev),
53
"focus,part,out", rp->part->name);
57
_edje_mouse_in_signal_cb(void *data, const Efl_Event *event)
59
Efl_Input_Pointer_Data *ev;
63
ev = efl_data_scope_get(event->info, EFL_INPUT_POINTER_CLASS);
65
rp = evas_object_data_get(event->object, "real_part");
68
if (!(ev->event_flags) || !(rp->ignore_flags & ev->event_flags))
69
_edje_seat_emit(ed, ev->device, "mouse,in", rp->part->name);
71
ev->event_flags |= rp->mask_flags;
76
_edje_mouse_out_signal_cb(void *data, const Efl_Event *event)
78
Efl_Input_Pointer_Data *ev;
82
ev = efl_data_scope_get(event->info, EFL_INPUT_POINTER_CLASS);
84
rp = evas_object_data_get(event->object, "real_part");
87
if (!(ev->event_flags) || !(rp->ignore_flags & ev->event_flags))
88
_edje_seat_emit(ed, ev->device, "mouse,out", rp->part->name);
90
ev->event_flags |= rp->mask_flags;
95
_edje_mouse_down_signal_cb(void *data, const Efl_Event *event)
97
Efl_Input_Pointer_Data *ev;
103
ev = efl_data_scope_get(event->info, EFL_INPUT_POINTER_CLASS);
105
rp = evas_object_data_get(event->object, "real_part");
108
ignored = rp->ignore_flags & ev->event_flags;
111
_edje_util_freeze(ed);
113
if ((!ev->event_flags) || (!ignored))
115
if (ev->button_flags & EVAS_BUTTON_TRIPLE_CLICK)
116
snprintf(buf, sizeof(buf), "mouse,down,%i,triple", ev->button);
117
else if (ev->button_flags & EVAS_BUTTON_DOUBLE_CLICK)
118
snprintf(buf, sizeof(buf), "mouse,down,%i,double", ev->button);
120
snprintf(buf, sizeof(buf), "mouse,down,%i", ev->button);
121
_edje_seat_emit(ed, ev->device, buf, rp->part->name);
124
if (rp->part->dragable.event_id >= 0)
126
rp = ed->table_parts[rp->part->dragable.event_id % ed->table_parts_size];
129
snprintf(buf, sizeof(buf), "mouse,down,%i", ev->button);
130
_edje_seat_emit(ed, ev->device, buf, rp->part->name);
136
if (rp->drag->down.count == 0)
138
if (rp->part->dragable.x)
139
rp->drag->down.x = ev->cur.x;
140
if (rp->part->dragable.y)
141
rp->drag->down.y = ev->cur.y;
142
rp->drag->threshold_x = EINA_FALSE;
143
rp->drag->threshold_y = EINA_FALSE;
144
rp->drag->threshold_started_x = EINA_TRUE;
145
rp->drag->threshold_started_y = EINA_TRUE;
147
rp->drag->down.count++;
150
if (rp->clicked_button == 0)
152
rp->clicked_button = ev->button;
153
if (!(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD))
154
rp->still_in = EINA_TRUE;
156
// _edje_recalc_do(ed);
160
ev->event_flags |= rp->mask_flags;
164
_edje_mouse_up_signal_cb(void *data, const Efl_Event *event)
166
Efl_Input_Pointer_Data *ev;
172
ev = efl_data_scope_get(event->info, EFL_INPUT_POINTER_CLASS);
174
rp = evas_object_data_get(event->object, "real_part");
177
ignored = rp->ignore_flags & ev->event_flags;
180
_edje_util_freeze(ed);
182
if ((!ev->event_flags) || (!ignored))
184
snprintf(buf, sizeof(buf), "mouse,up,%i", ev->button);
185
_edje_seat_emit(ed, ev->device, buf, rp->part->name);
188
if (rp->part->dragable.event_id >= 0)
190
rp = ed->table_parts[rp->part->dragable.event_id % ed->table_parts_size];
193
snprintf(buf, sizeof(buf), "mouse,up,%i", ev->button);
194
_edje_seat_emit(ed, ev->device, buf, rp->part->name);
200
if (rp->drag->down.count > 0)
202
rp->drag->down.count--;
203
if (rp->drag->down.count == 0)
205
rp->drag->threshold_started_x = EINA_FALSE;
206
rp->drag->threshold_started_y = EINA_FALSE;
207
rp->drag->need_reset = 1;
208
ed->recalc_call = EINA_TRUE;
209
ed->dirty = EINA_TRUE;
210
#ifdef EDJE_CALC_CACHE
211
rp->invalidate = EINA_TRUE;
213
if (!ignored && rp->drag->started)
214
_edje_seat_emit(ed, ev->device, "drag,stop",
216
rp->drag->started = EINA_FALSE;
222
if ((rp->still_in) && (rp->clicked_button == ev->button) && (!ev->event_flags))
224
snprintf(buf, sizeof(buf), "mouse,clicked,%i", ev->button);
225
_edje_seat_emit(ed, ev->device, buf, rp->part->name);
227
rp->clicked_button = 0;
228
rp->still_in = EINA_FALSE;
230
// _edje_recalc_do(ed);
234
ev->event_flags |= rp->mask_flags;
238
_edje_mouse_move_signal_cb(void *data, const Efl_Event *event)
240
Efl_Input_Pointer_Data *ev;
245
ev = efl_data_scope_get(event->info, EFL_INPUT_POINTER_CLASS);
247
rp = evas_object_data_get(event->object, "real_part");
249
if (rp->part->dragable.event_id >= 0)
251
rp = ed->table_parts[rp->part->dragable.event_id % ed->table_parts_size];
254
ignored = rp->ignore_flags & ev->event_flags;
257
if ((!ev->event_flags) || (!ignored))
258
_edje_seat_emit(ed, ev->device, "mouse,move", rp->part->name);
262
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
263
rp->still_in = EINA_FALSE;
266
Evas_Coord x, y, w, h;
268
evas_object_geometry_get(event->object, &x, &y, &w, &h);
269
if ((ev->cur.x < x) || (ev->cur.y < y) ||
270
(ev->cur.x >= (x + w)) || (ev->cur.y >= (y + h)))
272
if ((ev->pressed_buttons) && ((!ev->event_flags) || (!ignored)))
273
_edje_seat_emit(ed, ev->device, "mouse,pressed,out",
276
rp->still_in = EINA_FALSE;
282
if (!(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD))
284
Evas_Coord x, y, w, h;
286
evas_object_geometry_get(event->object, &x, &y, &w, &h);
287
if ((ev->cur.x >= x) && (ev->cur.y >= y) &&
288
(ev->cur.x < (x + w)) && (ev->cur.y < (y + h)))
290
if ((ev->pressed_buttons) && ((!ev->event_flags) || (!ignored)))
291
_edje_seat_emit(ed, ev->device, "mouse,pressed,in",
294
rp->still_in = EINA_TRUE;
298
_edje_util_freeze(ed);
301
if (rp->drag->down.count > 0)
303
if (rp->part->dragable.x)
304
rp->drag->tmp.x = ev->cur.x - rp->drag->down.x;
305
if (rp->part->dragable.y)
306
rp->drag->tmp.y = ev->cur.y - rp->drag->down.y;
307
ed->recalc_call = EINA_TRUE;
308
ed->dirty = EINA_TRUE;
309
#ifdef EDJE_CALC_CACHE
310
rp->invalidate = EINA_TRUE;
315
if (rp->drag->down.count > 0)
319
_edje_part_dragable_calc(ed, rp, &dx, &dy);
320
if ((NEQ(dx, rp->drag->val.x)) || (NEQ(dy, rp->drag->val.y)))
322
rp->drag->val.x = dx;
323
rp->drag->val.y = dy;
326
if (!rp->drag->started)
327
_edje_seat_emit(ed, ev->device, "drag,start",
329
_edje_seat_emit(ed, ev->device, "drag", rp->part->name);
330
rp->drag->started = EINA_TRUE;
332
ed->recalc_call = EINA_TRUE;
333
ed->dirty = EINA_TRUE;
334
#ifdef EDJE_CALC_CACHE
335
rp->invalidate = EINA_TRUE;
344
ev->event_flags |= rp->mask_flags;
348
_edje_mouse_wheel_signal_cb(void *data, const Efl_Event *event)
350
Efl_Input_Pointer_Data *ev;
355
ev = efl_data_scope_get(event->info, EFL_INPUT_POINTER_CLASS);
357
rp = evas_object_data_get(event->object, "real_part");
360
if (!(ev->event_flags) || !(rp->ignore_flags & ev->event_flags))
362
snprintf(buf, sizeof(buf), "mouse,wheel,%i,%i",
363
ev->wheel.horizontal,
364
(ev->wheel.z < 0) ? (-1) : (1));
365
_edje_seat_emit(ed, ev->device, buf, rp->part->name);
368
ev->event_flags |= rp->mask_flags;
373
_edje_timer_cb(void *data, const Efl_Event *event EINA_UNUSED)
377
Eina_List *newl = NULL;
380
t = ecore_loop_time_get();
384
_edje_util_freeze(ed);
385
if ((!ed->paused) && (!ed->delete_me))
387
Edje_Running_Program *tmp;
389
ed->walking_actions = EINA_TRUE;
390
EINA_LIST_FOREACH(ed->actions, l, tmp)
393
newl = eina_list_append(newl, tmp);
397
Edje_Running_Program *runp;
399
runp = eina_list_data_get(newl);
400
newl = eina_list_remove(newl, eina_list_data_get(newl));
402
if (!runp->delete_me)
403
_edje_program_run_iterate(runp, t);
404
if (_edje_block_break(ed))
406
EINA_LIST_FREE(newl, tmp)
409
if ((tmp->delete_me) && (tmp->ref == 0))
411
_edje_program_run_cleanup(ed, tmp);
419
EINA_LIST_FOREACH(ed->actions, l, tmp)
422
newl = eina_list_append(newl, tmp);
426
Edje_Running_Program *runp;
428
runp = eina_list_data_get(newl);
429
newl = eina_list_remove(newl, eina_list_data_get(newl));
431
if ((runp->delete_me) && (runp->ref == 0))
433
_edje_program_run_cleanup(ed, runp);
437
ed->walking_actions = EINA_FALSE;
446
_edje_pending_timer_cb(void *data)
448
Edje_Pending_Program *pp;
451
pp->edje->pending_actions = eina_list_remove(pp->edje->pending_actions, pp);
452
_edje_program_run(pp->edje, pp->program, 1, "", "", NULL);
455
return ECORE_CALLBACK_CANCEL;
458
EFL_CALLBACKS_ARRAY_DEFINE(edje_callbacks,
459
{ EFL_EVENT_HOLD, _edje_hold_signal_cb },
460
{ EFL_EVENT_POINTER_IN, _edje_mouse_in_signal_cb },
461
{ EFL_EVENT_POINTER_OUT, _edje_mouse_out_signal_cb },
462
{ EFL_EVENT_POINTER_DOWN, _edje_mouse_down_signal_cb },
463
{ EFL_EVENT_POINTER_UP, _edje_mouse_up_signal_cb },
464
{ EFL_EVENT_POINTER_MOVE, _edje_mouse_move_signal_cb },
465
{ EFL_EVENT_POINTER_WHEEL, _edje_mouse_wheel_signal_cb });
467
EFL_CALLBACKS_ARRAY_DEFINE(edje_focus_callbacks,
468
{ EFL_EVENT_FOCUS_IN, _edje_focus_in_signal_cb },
469
{ EFL_EVENT_FOCUS_OUT, _edje_focus_out_signal_cb });
472
_edje_callbacks_add(Evas_Object *obj, Edje *ed, Edje_Real_Part *rp)
474
efl_event_callback_array_add(obj, edje_callbacks(), ed);
475
evas_object_data_set(obj, "real_part", rp);
479
_edje_callbacks_del(Evas_Object *obj, Edje *ed)
481
efl_event_callback_array_del(obj, edje_callbacks(), ed);
482
evas_object_data_del(obj, "real_part");
486
_edje_callbacks_focus_add(Evas_Object *obj, Edje *ed, Edje_Real_Part *rp)
488
efl_event_callback_array_add(obj, edje_focus_callbacks(), ed);
489
evas_object_data_set(obj, "real_part", rp);
493
_edje_callbacks_focus_del(Evas_Object *obj, Edje *ed)
495
efl_event_callback_array_del(obj, edje_focus_callbacks(), ed);
496
evas_object_data_del(obj, "real_part");