edje: fix run on 64bits system.

This commit is contained in:
Cedric Bail 2013-03-17 13:00:20 +09:00
parent d4172f555a
commit d482c5cc59
4 changed files with 43 additions and 21 deletions

View File

@ -509,8 +509,6 @@ edje_match_programs_exec_check_finals(const unsigned int *signal_finals,
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,
@ -541,7 +539,7 @@ edje_match_callback_exec_check_finals(const Edje_Signals_Sources_Patterns *ssp,
cb = &matches[*e];
if (cb)
{
if ((prop) && _edje_signal_callback_prop(flags, *e)) continue;
if ((prop) && _edje_signal_callback_prop(ed->callbacks->flags, *e)) continue;
eina_array_push(&run, cb);
r = 2;
}
@ -553,7 +551,9 @@ edje_match_callback_exec_check_finals(const Edje_Signals_Sources_Patterns *ssp,
{
int idx = cb - matches;
cb->func((void*) custom_data[idx], ed->obj, sig, source);
if (_edje_signal_callback_run(ed->callbacks->flags, idx)) continue;
cb->func((void*) ed->callbacks->custom_data[idx], ed->obj, sig, source);
if (_edje_block_break(ed))
{
r = 0;
@ -684,8 +684,6 @@ edje_match_programs_exec(const Edje_Patterns *ppat_signal,
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,
@ -713,8 +711,6 @@ edje_match_callback_exec(const Edje_Signals_Sources_Patterns *ssp,
if (signal_result && source_result)
r = edje_match_callback_exec_check_finals(ssp,
matches,
custom_data,
flags,
signal_result,
source_result,
sig,

View File

@ -1836,8 +1836,6 @@ Eina_Bool edje_match_programs_exec(const Edje_Patterns *ppat_signal,
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,
@ -1967,6 +1965,8 @@ void _edje_signals_sources_patterns_clean(Edje_Signals_Sources_Patterns *ssp);
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);

View File

@ -1408,8 +1408,6 @@ _edje_emit_cb(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Da
{
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;
@ -1420,22 +1418,18 @@ _edje_emit_cb(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Da
_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,
@ -1453,11 +1447,13 @@ _edje_emit_cb(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Da
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];
if ((prop) && (_edje_signal_callback_prop(flags, *i))) continue;
cb->func((void*) custom_data[*i], ed->obj, sig, src);
cb->func((void*) ed->callbacks->custom_data[*i], ed->obj, sig, src);
if (_edje_block_break(ed))
break;
}
@ -1468,6 +1464,12 @@ _edje_emit_cb(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Da
_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);

View File

@ -475,3 +475,27 @@ _edje_signal_callback_patterns_unref(const Edje_Signals_Sources_Patterns *essp)
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;
}