This example shows how to setup, change, and delete event handlers. See the explanation here.
#include <Ecore.h>
#include <unistd.h>
struct context   
{
   const char          *str1, *str2;
};
static int _event_type = 0; 
_event_handler1_cb(
void *data, 
int type 
EINA_UNUSED, 
void *event)
{
   int *number = event;
   const char *str = data;
   printf("event_handler1: number=%d, data=\"%s\".\n", *number, str);
   if ((*number % 2) == 0)
}
_event_handler2_cb(
void *data, 
int type 
EINA_UNUSED, 
void *event) 
{
   struct context *ctxt = data;
   int *number = event;
   printf("event_handler2: number=%d.\n", *number);
   if (*number == 5)
     {
        const char *old = NULL;
        printf("changed handler1 data from \"%s\" to \"%s\".\n",
               old, ctxt->str2);
     }
   else if (*number >= 10)
     {
        printf("finish main loop.\n");
     }
}
int
main(void)
{
   struct context ctxt = {0};
   int i;
   ctxt.str1 = "dataone";
   ctxt.str2 = "datatwo";
     {
        printf("ERROR: Cannot init Ecore!\n");
        return -1;
     }
                                           _event_handler1_cb,
                                           ctxt.str1);
                                           _event_handler2_cb,
                                           &ctxt);
   for (i = 0; i <= 15; i++)
     {
        int *event_data = malloc(sizeof(*event_data));
        *event_data = i;
     }
   printf("start the main loop.\n");
   return 0;
}