edje: Factor out signal extra data setup code

Reviewers: zmike, cedric

Reviewed By: zmike

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D6111
This commit is contained in:
Derek Foreman 2018-05-08 12:25:51 -05:00
parent 03c20cc758
commit d21ff733df
3 changed files with 43 additions and 28 deletions

View File

@ -426,14 +426,7 @@ _edje_message_free(Edje_Message *em)
emsg = (Edje_Message_Signal *)em->msg;
if (emsg->sig) eina_stringshare_del(emsg->sig);
if (emsg->src) eina_stringshare_del(emsg->src);
if (emsg->data && (--(emsg->data->ref) == 0))
{
if (emsg->data->free_func)
{
emsg->data->free_func(emsg->data->data);
}
free(emsg->data);
}
_edje_signal_data_free(emsg->data);
free(emsg);
}
break;
@ -506,7 +499,7 @@ _edje_message_propagate_send(Edje *ed, Edje_Queue queue, Edje_Message_Type type,
if (emsg2->data)
{
emsg3->data = emsg2->data;
emsg3->data->ref++;
_edje_signal_data_ref(emsg3->data);
}
msg = (unsigned char *)emsg3;
}

View File

@ -2531,6 +2531,9 @@ void _edje_emit_handle(Edje *ed, const char *sig, const char *src, Edje_Message_
void _edje_signals_sources_patterns_clean(Edje_Signals_Sources_Patterns *ssp);
const char * _edje_object_part_state_get(Edje *ed, const char *part, double *val_ret);
void _edje_signal_data_free(Edje_Message_Signal_Data *mdata);
void _edje_signal_data_ref(Edje_Message_Signal_Data *mdata);
void _edje_focused_part_set(Edje *ed, const char *seat_name, Edje_Real_Part *rp);
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);

View File

@ -128,6 +128,42 @@ _edje_emit_child(Edje *ed, Edje_Real_Part *rp, const char *part, const char *sig
return ed->collection->broadcast_signal;
}
static Edje_Message_Signal_Data *
_edje_signal_data_setup(void *data, Ecore_Cb free_func)
{
Edje_Message_Signal_Data *out = NULL;
if (data)
{
out = calloc(1, sizeof(*out));
if (!out) return NULL;
out->ref = 1;
out->data = data;
out->free_func = free_func;
}
return out;
}
void
_edje_signal_data_free(Edje_Message_Signal_Data *mdata)
{
if (!mdata) return;
if (--(mdata->ref)) return;
if (mdata->free_func)
{
mdata->free_func(mdata->data);
}
free(mdata);
}
void
_edje_signal_data_ref(Edje_Message_Signal_Data *mdata)
{
if (mdata) mdata->ref++;
}
static void
_edje_emit_send(Edje *ed, Eina_Bool broadcast, const char *sig, const char *src, void *data, Ecore_Cb free_func)
{
@ -135,17 +171,7 @@ _edje_emit_send(Edje *ed, Eina_Bool broadcast, const char *sig, const char *src,
emsg.sig = sig;
emsg.src = src;
if (data)
{
emsg.data = calloc(1, sizeof(*(emsg.data)));
emsg.data->ref = 1;
emsg.data->data = data;
emsg.data->free_func = free_func;
}
else
{
emsg.data = NULL;
}
emsg.data = _edje_signal_data_setup(data, free_func);
/* new sends code */
if (broadcast)
edje_object_message_send(ed->obj, EDJE_MESSAGE_SIGNAL, 0, &emsg);
@ -163,14 +189,7 @@ _edje_emit_send(Edje *ed, Eina_Bool broadcast, const char *sig, const char *src,
_edje_util_message_send(ed2, EDJE_QUEUE_SCRIPT, EDJE_MESSAGE_SIGNAL, 0, &emsg);
}
*/
if (emsg.data && (--(emsg.data->ref) == 0))
{
if (emsg.data->free_func)
{
emsg.data->free_func(emsg.data->data);
}
free(emsg.data);
}
_edje_signal_data_free(emsg.data);
}
/*============================================================================*