171 lines
3.0 KiB
C
171 lines
3.0 KiB
C
#include <string.h>
|
|
|
|
#include "debug.h"
|
|
#include "observer.h"
|
|
|
|
static Evas_List * observers;
|
|
|
|
void
|
|
e_observer_init(E_Observer * obs, E_Event_Type event,
|
|
E_Notify_Func notify_func, E_Cleanup_Func cleanup_func)
|
|
{
|
|
D_ENTER;
|
|
|
|
if (!obs)
|
|
D_RETURN;
|
|
|
|
memset(obs, 0, sizeof(E_Observer));
|
|
|
|
obs->watched = NULL;
|
|
obs->event = event;
|
|
obs->notify_func = notify_func;
|
|
|
|
e_object_init(E_OBJECT(obs), cleanup_func);
|
|
|
|
observers = evas_list_append(observers, obs);
|
|
|
|
D_RETURN;
|
|
}
|
|
|
|
void
|
|
e_observer_cleanup(E_Observer * obs)
|
|
{
|
|
E_Observee *o = NULL;
|
|
|
|
D_ENTER;
|
|
|
|
if (!obs)
|
|
D_RETURN;
|
|
|
|
while (obs->watched)
|
|
{
|
|
o = E_OBSERVEE(obs->watched->data);
|
|
e_observer_unregister_observee(obs, o);
|
|
}
|
|
|
|
evas_list_remove(observers, obs);
|
|
/* Call the destructor of the base class */
|
|
e_object_cleanup(E_OBJECT(obs));
|
|
|
|
D_RETURN;
|
|
}
|
|
|
|
void
|
|
e_observer_register_observee(E_Observer * observer, E_Observee * observee)
|
|
{
|
|
D_ENTER;
|
|
|
|
if (!observer || !observee)
|
|
D_RETURN;
|
|
|
|
observee->observers = evas_list_append(observee->observers, observer);
|
|
observer->watched = evas_list_append(observer->watched, observee);
|
|
D_RETURN;
|
|
}
|
|
|
|
void
|
|
e_observer_unregister_observee(E_Observer * observer, E_Observee * observee)
|
|
{
|
|
D_ENTER;
|
|
|
|
if (!observer || !observee)
|
|
D_RETURN;
|
|
|
|
observee->observers = evas_list_remove(observee->observers, observer);
|
|
observer->watched = evas_list_remove(observer->watched, observee);
|
|
|
|
D_RETURN;
|
|
}
|
|
|
|
/* --------------------- Observee code below */
|
|
|
|
void
|
|
e_observee_init(E_Observee * obs, E_Cleanup_Func cleanup_func)
|
|
{
|
|
D_ENTER;
|
|
|
|
if (!obs)
|
|
D_RETURN;
|
|
|
|
memset(obs, 0, sizeof(E_Observee));
|
|
|
|
e_object_init(E_OBJECT(obs), cleanup_func);
|
|
|
|
D_RETURN;
|
|
}
|
|
|
|
void
|
|
e_observee_notify_observers(E_Observee * o, E_Event_Type event, void *data)
|
|
{
|
|
Evas_List * obs_list = NULL;
|
|
E_Observer *obs = NULL;
|
|
|
|
D_ENTER;
|
|
|
|
if (!o)
|
|
D_RETURN;
|
|
|
|
for (obs_list = o->observers; obs_list; obs_list = obs_list->next)
|
|
{
|
|
obs = E_OBSERVER(obs_list->data);
|
|
|
|
/* check bit mask */
|
|
if (obs->event & event)
|
|
{
|
|
obs->notify_func(obs, o, event, data);
|
|
}
|
|
}
|
|
|
|
D_RETURN;
|
|
}
|
|
|
|
void
|
|
e_observee_notify_all_observers(E_Observee * o, E_Event_Type event, void *data)
|
|
{
|
|
Evas_List * obs_list = NULL;
|
|
E_Observer *obs = NULL;
|
|
|
|
D_ENTER;
|
|
|
|
if (!o)
|
|
D_RETURN;
|
|
|
|
for (obs_list = observers; obs_list; obs_list = obs_list->next)
|
|
{
|
|
obs = E_OBSERVER(obs_list->data);
|
|
|
|
/* check bit mask */
|
|
if (obs->event & event)
|
|
{
|
|
obs->notify_func(obs, o, event, data);
|
|
}
|
|
}
|
|
|
|
D_RETURN;
|
|
}
|
|
|
|
void
|
|
e_observee_cleanup(E_Observee * obs)
|
|
{
|
|
E_Observer *observer = NULL;
|
|
|
|
D_ENTER;
|
|
|
|
if (!obs)
|
|
D_RETURN;
|
|
|
|
if (e_object_get_usecount(E_OBJECT(obs)) == 1)
|
|
{
|
|
while (obs->observers)
|
|
{
|
|
observer = E_OBSERVER(obs->observers->data);
|
|
e_observer_unregister_observee(observer, obs);
|
|
}
|
|
}
|
|
|
|
/* Call the destructor of the base class */
|
|
e_object_cleanup(E_OBJECT(obs));
|
|
|
|
D_RETURN;
|
|
}
|