static int
edje_match_callback_exec_check_finals(const Edje_Signals_Sources_Patterns *ssp,
const Edje_Signal_Callback_Match *matches,
+ const void **custom_data,
+ const Eina_Bool *flags,
const Edje_States *signal_states,
const Edje_States *source_states,
const char *sig,
cb = &matches[*e];
if (cb)
{
- if ((prop) && _edje_signal_callback_prop(ed->callbacks->flags, *e)) continue;
+ if ((prop) && _edje_signal_callback_prop(flags, *e)) continue;
eina_array_push(&run, cb);
r = 2;
}
{
int idx = cb - matches;
- if (_edje_signal_callback_run(ed->callbacks->flags, idx)) continue;
-
- cb->func((void*) ed->callbacks->custom_data[idx], ed->obj, sig, source);
+ cb->func((void*) custom_data[idx], ed->obj, sig, source);
if (_edje_block_break(ed))
{
r = 0;
int
edje_match_callback_exec(const Edje_Signals_Sources_Patterns *ssp,
const Edje_Signal_Callback_Match *matches,
+ const void **custom_data,
+ const Eina_Bool *flags,
const char *sig,
const char *source,
Edje *ed,
if (signal_result && source_result)
r = edje_match_callback_exec_check_finals(ssp,
matches,
+ custom_data,
+ flags,
signal_result,
source_result,
sig,
Eina_Bool prop);
int edje_match_callback_exec(const Edje_Signals_Sources_Patterns *ssp,
const Edje_Signal_Callback_Match *matches,
+ const void **custom_data,
+ const Eina_Bool *flags,
const char *sig,
const char *source,
Edje *ed,
const Edje_Signals_Sources_Patterns *_edje_signal_callback_patterns_ref(const Edje_Signal_Callback_Group *gp);
void _edje_signal_callback_patterns_unref(const Edje_Signals_Sources_Patterns *essp);
Eina_Bool _edje_signal_callback_prop(const Eina_Bool *flags, int i);
-Eina_Bool _edje_signal_callback_run(const Eina_Bool *flags, unsigned int i);
-void _edje_signal_callback_reset(Eina_Bool *flags, unsigned int length);
void _edje_signal_callback_free(const Edje_Signal_Callback_Group *gp);
{
const Edje_Signals_Sources_Patterns *ssp;
Edje_Signal_Callback_Matches *m;
+ const void **custom_data;
+ Eina_Bool *flags;
const Eina_Inarray *match;
int r = 1;
_edje_freeze(ed);
_edje_block(ed);
- ed->walking_callbacks++;
-
ssp = _edje_signal_callback_patterns_ref(ed->callbacks);
m = (Edje_Signal_Callback_Matches*) ed->callbacks->matches;
EINA_REFCOUNT_REF(m);
callback_extra_data = (data) ? data->data : NULL;
+ custom_data = alloca(sizeof (void*) * m->matches_count);
+ memcpy(custom_data, ed->callbacks->custom_data, sizeof (void*) * m->matches_count);
+ flags = alloca(sizeof (Eina_Bool) * m->matches_count);
+ memcpy(flags, ed->callbacks->flags, sizeof (Eina_Bool) * (m->matches_count >> 1));
if (eina_inarray_count(&ssp->u.callbacks.globing))
r = edje_match_callback_exec(ssp,
m->matches,
+ custom_data,
+ flags,
sig,
src,
ed,
EINA_INARRAY_FOREACH(match, i)
{
- if (_edje_signal_callback_run(ed->callbacks->flags, *i)) continue;
- if ((prop) && (_edje_signal_callback_prop(ed->callbacks->flags,
- *i))) continue;
-
cb = &m->matches[*i];
- cb->func((void*) ed->callbacks->custom_data[*i], ed->obj, sig, src);
+ if ((prop) && (_edje_signal_callback_prop(flags, *i))) continue;
+
+ cb->func((void*) custom_data[*i], ed->obj, sig, src);
if (_edje_block_break(ed))
break;
}
_edje_signal_callback_patterns_unref(ssp);
- ed->walking_callbacks--;
-
- if (ed->walking_callbacks == 0)
- _edje_signal_callback_reset(ed->callbacks->flags,
- ed->callbacks->matches->matches_count);
-
_edje_unblock(ed);
_edje_thaw(ed);
_edje_unref(ed);
free(ssp);
}
}
-
-Eina_Bool
-_edje_signal_callback_run(const Eina_Bool *flags, unsigned int i)
-{
- Eina_Bool r;
-
- r = flags[i >> 1] & ((_DELETE_ME | _JUST_ADDED) << ((i & 0x1) * 4));
-
- return r;
-}
-
-void
-_edje_signal_callback_reset(Eina_Bool *flags, unsigned int length)
-{
- Eina_Bool mask;
- unsigned int i;
-
- mask = ~((_JUST_ADDED << 4) | _JUST_ADDED);
-
- length >>= 1;
- for (i = 0; i < length; ++i)
- flags[i] &= mask;
-}
-