j = 0;
/* FIXME: Build specialized data type for each case */
-#define EDJE_LOAD_PROGRAMS_ADD(Array, Edc, It, Git, All) \
- for (It = 0; It < Edc->programs.Array##_count; ++It, ++Git) \
- All[Git] = Edc->programs.Array[It];
+#define EDJE_LOAD_PROGRAMS_ADD(Array, Edc, It, Git, All) \
+ for (It = 0; It < Edc->programs.Array##_count; ++It, ++Git) \
+ All[Git] = Edc->programs.Array[It];
EDJE_LOAD_PROGRAMS_ADD(fnmatch, edc, i, j, all);
EDJE_LOAD_PROGRAMS_ADD(strncmp, edc, i, j, all);
{
edc->patterns.table_programs_size = n;
-#define EDJE_LOAD_BUILD_TABLE(Array, Edc, It, Tmp) \
- for (It = 0; It < Edc->programs.Array##_count; ++It) \
- { \
- Tmp = Edc->programs.Array[It]; \
- Edc->patterns.table_programs[Tmp->id] = Tmp; \
- }
+#define EDJE_LOAD_BUILD_TABLE(Array, Edc, It, Tmp) \
+ for (It = 0; It < Edc->programs.Array##_count; ++It) \
+ { \
+ Tmp = Edc->programs.Array[It]; \
+ Edc->patterns.table_programs[Tmp->id] = Tmp; \
+ if (!Edc->need_seat && Tmp->signal && !strncmp(Tmp->signal, "seat,", 5)) \
+ Edc->need_seat = EINA_TRUE; \
+ }
EDJE_LOAD_BUILD_TABLE(fnmatch, edc, i, pr);
EDJE_LOAD_BUILD_TABLE(strcmp, edc, i, pr);
}
}
+ /* Search for the use of allowed seat used by part if we still do not know if seat are needed. */
+ if (!edc->need_seat)
+ {
+ unsigned int i;
+
+ for (i = 0; i < edc->parts_count; i++)
+ {
+ Edje_Part *part = edc->parts[i];
+
+ if (part->allowed_seats)
+ {
+ edc->need_seat = EINA_TRUE;
+ break;
+ }
+ }
+ }
+
_edje_part_collection_fix(edc);
traceTaskEnd();
ed = _edje_fetch(obj);
if (!ed || ed->delete_me) return;
- _edje_object_signal_callback_add(ed, emission, source, func, NULL, NULL, data);
+ _edje_object_signal_callback_add(obj, ed, emission, source, func, NULL, NULL, data);
}
EAPI void *
efl_event_callback_array_del(event->object, edje_device_callbacks(), ed);
}
-static void
+void
_edje_devices_add(Edje *ed, Evas *tev)
{
const Eina_List *devices, *l;
Efl_Input_Device *dev;
+ ed->need_seat = EINA_TRUE;
+
devices = evas_device_list(tev, NULL);
EINA_LIST_FOREACH(devices, l, dev)
{
}
/* handle multiseat stuff */
- _edje_devices_add(ed, tev);
+ if (ed->collection->need_seat || ed->need_seat)
+ _edje_devices_add(ed, tev);
/* colorclass stuff */
_edje_process_colorclass(ed);
unsigned char script_recursion; /* permits unsafe Embryo->EDC->Embryo scripting */
unsigned char use_custom_seat_names;
unsigned char checked : 1;
+ unsigned char need_seat : 1; /* will be one when the collection use seat in any of its part */
};
struct _Edje_Part_Dragable
Eina_Bool has_entries : 1;
Eina_Bool entries_inited : 1;
-#ifdef EDJE_CALC_CACHE
- Eina_Bool text_part_change : 1;
- Eina_Bool all_part_change : 1;
-#endif
Eina_Bool have_mapped_part : 1;
Eina_Bool recalc_call : 1;
Eina_Bool update_hints : 1;
Eina_Bool canvas_animator : 1;
Eina_Bool has_state_clip : 1;
Eina_Bool has_recalc_event_cb : 1;
+
Eina_Bool has_content_change_event_cb : 1;
+ Eina_Bool need_seat : 1; /* Will be true when an event handler that expect seat is registered on the object. */
+#ifdef EDJE_CALC_CACHE
+ Eina_Bool text_part_change : 1;
+ Eina_Bool all_part_change : 1;
+#endif
};
struct _Edje_Calc_Params_Map
const char *source,
const Eina_Rbtree *tree);
void edje_match_signal_source_free(Edje_Signal_Source_Char *key, void *data);
-Eina_Bool _edje_object_signal_callback_add(Edje *ed, const char *emission, const char *source,
+Eina_Bool _edje_object_signal_callback_add(Evas_Object *obj, Edje *ed,
+ const char *emission, const char *source,
Edje_Signal_Cb func_legacy,
Efl_Signal_Cb func_eo, Eina_Free_Cb func_free_cb, void *data);
Edje_Real_Part *_edje_focused_part_get(Edje *ed, const char *seat_name);
void _edje_part_focus_set(Edje *ed, const char *seat_name, Edje_Real_Part *rp);
+void _edje_devices_add(Edje *ed, Evas *tev);
Eina_Stringshare *_edje_seat_name_get(Edje *ed, Efl_Input_Device *device);
Efl_Input_Device *_edje_seat_get(Edje *ed, Eina_Stringshare *name);
Eina_Bool _edje_part_allowed_seat_find(Edje_Real_Part *rp, const char *seat_name);
}
Eina_Bool
-_edje_object_signal_callback_add(Edje *ed, const char *emission, const char *source,
+_edje_object_signal_callback_add(Evas_Object *obj, Edje *ed,
+ const char *emission, const char *source,
Edje_Signal_Cb func_legacy,
Efl_Signal_Cb func_eo, Eina_Free_Cb func_free_cb, void *data)
{
sig = eina_stringshare_add(emission);
src = eina_stringshare_add(source);
+ // Only load seat callbacks and trigger events just before we might need them.
+ if (!ed->need_seat && sig && !strncmp(sig, "seat,", 5))
+ {
+ ed->need_seat = EINA_TRUE;
+ if (ed->collection)
+ _edje_devices_add(ed, evas_object_evas_get(obj));
+ }
+
gp = (Edje_Signal_Callback_Group *) ed->callbacks;
ok = _edje_signal_callback_push(gp, sig, src, func_legacy, func_eo, func_free_cb, data, EINA_TRUE);
ed = _edje_fetch(obj);
if (!ed || ed->delete_me) return;
- _edje_object_signal_callback_add(ed, "*", "*", func, NULL, NULL, data);
+ _edje_object_signal_callback_add(obj, ed, "*", "*", func, NULL, NULL, data);
}
Eina_Bool
_efl_canvas_layout_efl_layout_signal_signal_callback_add(Eo *obj EINA_UNUSED, Edje *ed, const char *emission, const char *source, void *func_data, EflLayoutSignalCb func, Eina_Free_Cb func_free_cb)
{
- return _edje_object_signal_callback_add(ed, emission, source, NULL, func, func_free_cb, func_data);
+ return _edje_object_signal_callback_add(obj, ed, emission, source, NULL, func, func_free_cb, func_data);
}
Eina_Bool