summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCedric Bail <cedric.bail@free.fr>2013-03-17 13:00:20 +0900
committerCedric Bail <cedric.bail@free.fr>2013-03-17 13:00:20 +0900
commitd482c5cc59f9b572ec37c8e68434a12e50479c00 (patch)
treed9c4aaa4f2958ec9b495ad5eda22a1ab53a636e0
parentd4172f555ad12e9ffd57558f5bb8116f46e30f4c (diff)
downloadefl-d482c5cc59f9b572ec37c8e68434a12e50479c00.tar.gz
edje: fix run on 64bits system.
-rw-r--r--src/lib/edje/edje_match.c12
-rw-r--r--src/lib/edje/edje_private.h4
-rw-r--r--src/lib/edje/edje_program.c24
-rw-r--r--src/lib/edje/edje_signal.c24
4 files changed, 43 insertions, 21 deletions
diff --git a/src/lib/edje/edje_match.c b/src/lib/edje/edje_match.c
index 5d66b618ac..5db023c761 100644
--- a/src/lib/edje/edje_match.c
+++ b/src/lib/edje/edje_match.c
@@ -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,
diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h
index c6bd236019..376cb1b709 100644
--- a/src/lib/edje/edje_private.h
+++ b/src/lib/edje/edje_private.h
@@ -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);
diff --git a/src/lib/edje/edje_program.c b/src/lib/edje/edje_program.c
index 2eb36306d0..b916d7613e 100644
--- a/src/lib/edje/edje_program.c
+++ b/src/lib/edje/edje_program.c
@@ -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)
{
- cb = &m->matches[*i];
+ if (_edje_signal_callback_run(ed->callbacks->flags, *i)) continue;
+ if ((prop) && (_edje_signal_callback_prop(ed->callbacks->flags,
+ *i))) continue;
- if ((prop) && (_edje_signal_callback_prop(flags, *i))) continue;
+ cb = &m->matches[*i];
- 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);
diff --git a/src/lib/edje/edje_signal.c b/src/lib/edje/edje_signal.c
index 3dfdae1230..8bf5645cf0 100644
--- a/src/lib/edje/edje_signal.c
+++ b/src/lib/edje/edje_signal.c
@@ -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;
+}
+