summaryrefslogtreecommitdiff
path: root/src/examples/ecore/ecore_idler_example.c
blob: 2185210763fdd207de3f5ff24b934bd5783023e5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//Compile with:
// gcc -o ecore_idler_example ecore_idler_example.c `pkg-config --libs --cflags ecore eo`

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif

#include <Ecore.h>
#include <Eo.h>
#include <unistd.h>

struct context   // helper struct to give some context to the callbacks
{
   int                  count;
   Ecore_Idle_Enterer  *enterer;
   Ecore_Idler         *idler;
   Ecore_Idle_Exiter   *exiter;
   Ecore_Event_Handler *handler;
   Ecore_Timer         *timer;
};

static int _event_type = 0; // a new type of event will be defined and stored here

static Eina_Bool
_enterer_cb(void *data EINA_UNUSED) // the idle enterer callback
{
   printf("IDLE ENTERER: Ecore entering in idle state.\n");

   return ECORE_CALLBACK_RENEW; // same as EINA_TRUE
}

static Eina_Bool
_exiter_cb(void *data EINA_UNUSED) // the idle exiter callback
{
   printf("IDLE EXITER: Ecore exiting idle state.\n");

   return ECORE_CALLBACK_RENEW; // same as EINA_TRUE
}

static Eina_Bool
_idler_cb(void *data) // the idler callback - ran while the mainloop is idle
{
   struct context *ctxt = data;
   printf("IDLER: executing idler callback while in idle state.\n");

   ctxt->count++;

   /* each 10 times that the callback gets called, generate an event that
    * will wake up the main loop, triggering idle enterers, exiters, etc. */
   if ((ctxt->count % 10) == 0)
     ecore_event_add(_event_type, NULL, NULL, NULL);

   return ECORE_CALLBACK_RENEW; // same as EINA_TRUE
}

static Eina_Bool
_event_handler_cb(void *data, int type EINA_UNUSED, void *event EINA_UNUSED) // event callback
{
   struct context *ctxt = data;

   printf("EVENT: processing callback for the event received.\n");

   if (ctxt->count > 100)
     {
        ecore_idle_enterer_del(ctxt->enterer);
        ecore_idle_exiter_del(ctxt->exiter);
//        ecore_idler_del(ctxt->idler);

        ctxt->enterer = NULL;
        ctxt->exiter = NULL;
        ctxt->idler = NULL;

        if (ctxt->timer)
          {
             ecore_timer_del(ctxt->timer);
             ctxt->timer = NULL;
          }

        ecore_main_loop_quit();
     }

   return ECORE_CALLBACK_DONE; // same as EINA_FALSE
}

static Eina_Bool
_timer_cb(void *data)
{
   struct context *ctxt = data;
   printf("TIMER: timer callback called.\n");

   if (ctxt->timer)
     ctxt->timer = NULL;

   return ECORE_CALLBACK_CANCEL; // same as EINA_FALSE
}

int
main(void)
{
   struct context ctxt = {0};

   if (!ecore_init())
     {
        printf("ERROR: Cannot init Ecore!\n");
        return -1;
     }

   _event_type = ecore_event_type_new();

   ctxt.enterer = ecore_idle_enterer_add(_enterer_cb, &ctxt);
   ctxt.exiter = ecore_idle_exiter_add(_exiter_cb, &ctxt);
   ctxt.idler = ecore_idler_add(_idler_cb, &ctxt);
//   ctxt.idler = efl_add_ref(ECORE_IDLER_CLASS, NULL, ecore_idler_constructor(efl_added, _idler_cb, &ctxt));
   ctxt.handler = ecore_event_handler_add(_event_type,
                                          _event_handler_cb,
                                          &ctxt);
   ctxt.timer = ecore_timer_add(0.0005, _timer_cb, &ctxt);

   ecore_main_loop_begin();
   ecore_shutdown();

   return 0;
}