forked from enlightenment/efl
ok ok.. callabcks walking lists.. delete flags... you get the idea. (i've
known about this for a long tiem and planned on fixing ti eventualyl... but it's biting now.) SVN revision: 6597
This commit is contained in:
parent
8027de6bd8
commit
de9b6b3ca0
|
@ -325,8 +325,8 @@ Notes:
|
||||||
gcc 3.0.x on solaris screws up the jpeg code so erroring out doesn't work.
|
gcc 3.0.x on solaris screws up the jpeg code so erroring out doesn't work.
|
||||||
use gcc 3.2 on solaris.
|
use gcc 3.2 on solaris.
|
||||||
freetype 2.1.2 is BAD. RedHat 8.0 uses this as do some streams of debain.
|
freetype 2.1.2 is BAD. RedHat 8.0 uses this as do some streams of debain.
|
||||||
either downgrade to 2.1.1. freetype 2.1.3 is ALSO BAD. It has glyph
|
either downgrade to 2.1.1. freetype 2.1.3 is ALSO BAD, as is 2.0.9. It has
|
||||||
metric rendering bugs and glyph geomery query bugs. do not use it.
|
glyph metric rendering bugs and glyph geomery query bugs. do not use it.
|
||||||
try using 2.0.3. It is known to be stable and work perfectly with Evas.
|
try using 2.0.3. It is known to be stable and work perfectly with Evas.
|
||||||
|
|
||||||
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
||||||
|
|
|
@ -468,6 +468,7 @@ make CFLAGS="-O9 -I/opt/Embedix/tools/arm-linux/include"
|
||||||
@todo (1.0) Document API
|
@todo (1.0) Document API
|
||||||
@todo (1.0) Add button grabbing
|
@todo (1.0) Add button grabbing
|
||||||
@todo (1.0) Add generic object method call system
|
@todo (1.0) Add generic object method call system
|
||||||
|
@todo (1.0) Add callbacks set for smart object parents to be set on all child smart objects too.
|
||||||
@todo (1.0) Define image load errors (and maybe have an error to string func)
|
@todo (1.0) Define image load errors (and maybe have an error to string func)
|
||||||
@todo (1.0) Add text styles (outline etc.)
|
@todo (1.0) Add text styles (outline etc.)
|
||||||
@todo (1.0) Add font load query calls (so we know if a font load failed)
|
@todo (1.0) Add font load query calls (so we know if a font load failed)
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
#include "Evas.h"
|
#include "Evas.h"
|
||||||
|
|
||||||
static void evas_object_event_callback_list_free(Evas_Object_List **list);
|
static void evas_object_event_callback_list_free(Evas_Object_List **list);
|
||||||
|
static void evas_object_event_callback_list_post_free(Evas_Object_List **list);
|
||||||
|
static void evas_object_event_callback_clear(Evas_Object *obj);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
evas_object_event_callback_list_free(Evas_Object_List **list)
|
evas_object_event_callback_list_free(Evas_Object_List **list)
|
||||||
|
@ -18,6 +20,50 @@ evas_object_event_callback_list_free(Evas_Object_List **list)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
evas_object_event_callback_list_post_free(Evas_Object_List **list)
|
||||||
|
{
|
||||||
|
Evas_Object_List *l;
|
||||||
|
|
||||||
|
/* MEM OK */
|
||||||
|
for (l = *list; l;)
|
||||||
|
{
|
||||||
|
Evas_Func_Node *fn;
|
||||||
|
|
||||||
|
fn = (Evas_Func_Node *)l;
|
||||||
|
l = l->next;
|
||||||
|
if (fn->delete_me)
|
||||||
|
{
|
||||||
|
*list = evas_object_list_remove(*list, fn);
|
||||||
|
free(fn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
evas_object_event_callback_clear(Evas_Object *obj)
|
||||||
|
{
|
||||||
|
Evas_Callback_Type t;
|
||||||
|
|
||||||
|
if (!obj->callbacks.deletions_waiting) return;
|
||||||
|
obj->callbacks.deletions_waiting = 0;
|
||||||
|
evas_object_event_callback_list_post_free(&(obj->callbacks.in));
|
||||||
|
evas_object_event_callback_list_post_free(&(obj->callbacks.out));
|
||||||
|
evas_object_event_callback_list_post_free(&(obj->callbacks.down));
|
||||||
|
evas_object_event_callback_list_post_free(&(obj->callbacks.up));
|
||||||
|
evas_object_event_callback_list_post_free(&(obj->callbacks.move));
|
||||||
|
evas_object_event_callback_list_post_free(&(obj->callbacks.free));
|
||||||
|
evas_object_event_callback_list_post_free(&(obj->callbacks.key_down));
|
||||||
|
evas_object_event_callback_list_post_free(&(obj->callbacks.key_up));
|
||||||
|
evas_object_event_callback_list_post_free(&(obj->callbacks.obj_focus_in));
|
||||||
|
evas_object_event_callback_list_post_free(&(obj->callbacks.obj_focus_out));
|
||||||
|
evas_object_event_callback_list_post_free(&(obj->callbacks.obj_show));
|
||||||
|
evas_object_event_callback_list_post_free(&(obj->callbacks.obj_hide));
|
||||||
|
evas_object_event_callback_list_post_free(&(obj->callbacks.obj_move));
|
||||||
|
evas_object_event_callback_list_post_free(&(obj->callbacks.obj_resize));
|
||||||
|
evas_object_event_callback_list_post_free(&(obj->callbacks.obj_restack));
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
evas_object_event_callback_cleanup(Evas_Object *obj)
|
evas_object_event_callback_cleanup(Evas_Object *obj)
|
||||||
{
|
{
|
||||||
|
@ -96,13 +142,19 @@ evas_object_event_callback_call(Evas_Object *obj, Evas_Callback_Type type, void
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
obj->callbacks.walking_list++;
|
||||||
for (l = *l_mod; l; l = l->next)
|
for (l = *l_mod; l; l = l->next)
|
||||||
{
|
{
|
||||||
Evas_Func_Node *fn;
|
Evas_Func_Node *fn;
|
||||||
|
|
||||||
fn = (Evas_Func_Node *)l;
|
fn = (Evas_Func_Node *)l;
|
||||||
fn->func(fn->data, obj->layer->evas, obj, event_info);
|
if (!fn->delete_me)
|
||||||
|
fn->func(fn->data, obj->layer->evas, obj, event_info);
|
||||||
|
if (obj->delete_me) break;
|
||||||
}
|
}
|
||||||
|
obj->callbacks.walking_list--;
|
||||||
|
if (!obj->callbacks.walking_list)
|
||||||
|
evas_object_event_callback_clear(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -427,8 +479,10 @@ evas_object_event_callback_del(Evas_Object *obj, Evas_Callback_Type type, void (
|
||||||
void *data;
|
void *data;
|
||||||
|
|
||||||
data = fn->data;
|
data = fn->data;
|
||||||
*l_mod = evas_object_list_remove(*l_mod, fn);
|
fn->delete_me = 1;
|
||||||
free(fn);
|
obj->callbacks.deletions_waiting = 1;
|
||||||
|
if (!obj->callbacks.walking_list)
|
||||||
|
evas_object_event_callback_clear(obj);
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
static Evas_Key_Grab *evas_key_grab_new (Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, int exclusive);
|
static Evas_Key_Grab *evas_key_grab_new (Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, int exclusive);
|
||||||
static void evas_key_grab_free (Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers);
|
static void evas_key_grab_free (Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers);
|
||||||
static Evas_Key_Grab *evas_key_grab_find (Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers);
|
static Evas_Key_Grab *evas_key_grab_find (Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, int exclusive);
|
||||||
|
|
||||||
static Evas_Key_Grab *
|
static Evas_Key_Grab *
|
||||||
evas_key_grab_new(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, int exclusive)
|
evas_key_grab_new(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, int exclusive)
|
||||||
|
@ -77,7 +77,7 @@ evas_key_grab_free(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask mod
|
||||||
/* MEM OK */
|
/* MEM OK */
|
||||||
Evas_Key_Grab *g;
|
Evas_Key_Grab *g;
|
||||||
|
|
||||||
g = evas_key_grab_find(obj, keyname, modifiers, not_modifiers);
|
g = evas_key_grab_find(obj, keyname, modifiers, not_modifiers, 0);
|
||||||
if (!g) return;
|
if (!g) return;
|
||||||
g->object->grabs = evas_list_remove(g->object->grabs, g);
|
g->object->grabs = evas_list_remove(g->object->grabs, g);
|
||||||
if (g->keyname) free(g->keyname);
|
if (g->keyname) free(g->keyname);
|
||||||
|
@ -85,11 +85,11 @@ evas_key_grab_free(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask mod
|
||||||
}
|
}
|
||||||
|
|
||||||
static Evas_Key_Grab *
|
static Evas_Key_Grab *
|
||||||
evas_key_grab_find(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers)
|
evas_key_grab_find(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, int exclusive)
|
||||||
{
|
{
|
||||||
/* MEM OK */
|
/* MEM OK */
|
||||||
Evas_List *l;
|
Evas_List *l;
|
||||||
|
|
||||||
for (l = obj->layer->evas->grabs; l; l = l->next)
|
for (l = obj->layer->evas->grabs; l; l = l->next)
|
||||||
{
|
{
|
||||||
Evas_Key_Grab *g;
|
Evas_Key_Grab *g;
|
||||||
|
@ -99,7 +99,7 @@ evas_key_grab_find(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask mod
|
||||||
(g->not_modifiers == not_modifiers) &&
|
(g->not_modifiers == not_modifiers) &&
|
||||||
(!strcmp(g->keyname, keyname)))
|
(!strcmp(g->keyname, keyname)))
|
||||||
{
|
{
|
||||||
if ((!obj) || (obj == g->object)) return g;
|
if ((exclusive) || (obj == g->object)) return g;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -135,7 +135,7 @@ evas_object_key_grab(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask m
|
||||||
MAGIC_CHECK_END();
|
MAGIC_CHECK_END();
|
||||||
if (exclusive)
|
if (exclusive)
|
||||||
{
|
{
|
||||||
g = evas_key_grab_find(NULL, keyname, modifiers, not_modifiers);
|
g = evas_key_grab_find(obj, keyname, modifiers, not_modifiers, exclusive);
|
||||||
if (g) return 0;
|
if (g) return 0;
|
||||||
}
|
}
|
||||||
g = evas_key_grab_new(obj, keyname, modifiers, not_modifiers, exclusive);
|
g = evas_key_grab_new(obj, keyname, modifiers, not_modifiers, exclusive);
|
||||||
|
@ -152,7 +152,7 @@ evas_object_key_ungrab(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask
|
||||||
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
|
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
|
||||||
return;
|
return;
|
||||||
MAGIC_CHECK_END();
|
MAGIC_CHECK_END();
|
||||||
g = evas_key_grab_find(obj, keyname, modifiers, not_modifiers);
|
g = evas_key_grab_find(obj, keyname, modifiers, not_modifiers, 0);
|
||||||
if (!g) return;
|
if (!g) return;
|
||||||
evas_key_grab_free(g->object, keyname, modifiers, not_modifiers);
|
evas_key_grab_free(g->object, keyname, modifiers, not_modifiers);
|
||||||
}
|
}
|
||||||
|
|
|
@ -423,7 +423,6 @@ evas_object_del(Evas_Object *obj)
|
||||||
obj->delete_me = 1;
|
obj->delete_me = 1;
|
||||||
if (obj->smart.smart) evas_object_smart_del(obj);
|
if (obj->smart.smart) evas_object_smart_del(obj);
|
||||||
evas_object_smart_cleanup(obj);
|
evas_object_smart_cleanup(obj);
|
||||||
obj->smart.smart = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -257,9 +257,12 @@ evas_object_smart_cleanup(Evas_Object *obj)
|
||||||
|
|
||||||
cb = obj->smart.callbacks->data;
|
cb = obj->smart.callbacks->data;
|
||||||
obj->smart.callbacks = evas_list_remove(obj->smart.callbacks, cb);
|
obj->smart.callbacks = evas_list_remove(obj->smart.callbacks, cb);
|
||||||
if (cb->event) free (cb->event);
|
if (cb->event) free(cb->event);
|
||||||
free(cb);
|
free(cb);
|
||||||
}
|
}
|
||||||
|
obj->smart.parent;
|
||||||
|
obj->smart.data = NULL;
|
||||||
|
obj->smart.smart = NULL;
|
||||||
if (s) evas_object_smart_unuse(s);
|
if (s) evas_object_smart_unuse(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -328,6 +328,8 @@ struct _Evas_Object
|
||||||
Evas_List *grabs;
|
Evas_List *grabs;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
int deletions_waiting : 1;
|
||||||
|
int walking_list : 1;
|
||||||
Evas_Object_List *in;
|
Evas_Object_List *in;
|
||||||
Evas_Object_List *out;
|
Evas_Object_List *out;
|
||||||
Evas_Object_List *down;
|
Evas_Object_List *down;
|
||||||
|
@ -365,8 +367,8 @@ struct _Evas_Object
|
||||||
|
|
||||||
struct _Evas_Func_Node
|
struct _Evas_Func_Node
|
||||||
{
|
{
|
||||||
Evas_Object_List _list_data;
|
Evas_Object_List _list_data;
|
||||||
|
int delete_me : 1;
|
||||||
void (*func) (void *data, Evas *e, Evas_Object *obj, void *event_info);
|
void (*func) (void *data, Evas *e, Evas_Object *obj, void *event_info);
|
||||||
void *data;
|
void *data;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue