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.
|
||||
use gcc 3.2 on solaris.
|
||||
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
|
||||
metric rendering bugs and glyph geomery query bugs. do not use it.
|
||||
either downgrade to 2.1.1. freetype 2.1.3 is ALSO BAD, as is 2.0.9. It has
|
||||
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.
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
|
|
|
@ -468,6 +468,7 @@ make CFLAGS="-O9 -I/opt/Embedix/tools/arm-linux/include"
|
|||
@todo (1.0) Document API
|
||||
@todo (1.0) Add button grabbing
|
||||
@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) Add text styles (outline etc.)
|
||||
@todo (1.0) Add font load query calls (so we know if a font load failed)
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
#include "Evas.h"
|
||||
|
||||
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
|
||||
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
|
||||
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;
|
||||
break;
|
||||
}
|
||||
obj->callbacks.walking_list++;
|
||||
for (l = *l_mod; l; l = l->next)
|
||||
{
|
||||
Evas_Func_Node *fn;
|
||||
|
||||
fn = (Evas_Func_Node *)l;
|
||||
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;
|
||||
|
||||
data = fn->data;
|
||||
*l_mod = evas_object_list_remove(*l_mod, fn);
|
||||
free(fn);
|
||||
fn->delete_me = 1;
|
||||
obj->callbacks.deletions_waiting = 1;
|
||||
if (!obj->callbacks.walking_list)
|
||||
evas_object_event_callback_clear(obj);
|
||||
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 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 *
|
||||
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 */
|
||||
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;
|
||||
g->object->grabs = evas_list_remove(g->object->grabs, g);
|
||||
if (g->keyname) free(g->keyname);
|
||||
|
@ -85,7 +85,7 @@ evas_key_grab_free(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask mod
|
|||
}
|
||||
|
||||
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 */
|
||||
Evas_List *l;
|
||||
|
@ -99,7 +99,7 @@ evas_key_grab_find(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask mod
|
|||
(g->not_modifiers == not_modifiers) &&
|
||||
(!strcmp(g->keyname, keyname)))
|
||||
{
|
||||
if ((!obj) || (obj == g->object)) return g;
|
||||
if ((exclusive) || (obj == g->object)) return g;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
|
@ -135,7 +135,7 @@ evas_object_key_grab(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask m
|
|||
MAGIC_CHECK_END();
|
||||
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;
|
||||
}
|
||||
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);
|
||||
return;
|
||||
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;
|
||||
evas_key_grab_free(g->object, keyname, modifiers, not_modifiers);
|
||||
}
|
||||
|
|
|
@ -423,7 +423,6 @@ evas_object_del(Evas_Object *obj)
|
|||
obj->delete_me = 1;
|
||||
if (obj->smart.smart) evas_object_smart_del(obj);
|
||||
evas_object_smart_cleanup(obj);
|
||||
obj->smart.smart = NULL;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -260,6 +260,9 @@ evas_object_smart_cleanup(Evas_Object *obj)
|
|||
if (cb->event) free(cb->event);
|
||||
free(cb);
|
||||
}
|
||||
obj->smart.parent;
|
||||
obj->smart.data = NULL;
|
||||
obj->smart.smart = NULL;
|
||||
if (s) evas_object_smart_unuse(s);
|
||||
}
|
||||
|
||||
|
|
|
@ -328,6 +328,8 @@ struct _Evas_Object
|
|||
Evas_List *grabs;
|
||||
|
||||
struct {
|
||||
int deletions_waiting : 1;
|
||||
int walking_list : 1;
|
||||
Evas_Object_List *in;
|
||||
Evas_Object_List *out;
|
||||
Evas_Object_List *down;
|
||||
|
@ -366,7 +368,7 @@ struct _Evas_Object
|
|||
struct _Evas_Func_Node
|
||||
{
|
||||
Evas_Object_List _list_data;
|
||||
|
||||
int delete_me : 1;
|
||||
void (*func) (void *data, Evas *e, Evas_Object *obj, void *event_info);
|
||||
void *data;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue