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:
Carsten Haitzler 2003-01-20 03:54:00 +00:00
parent 8027de6bd8
commit de9b6b3ca0
7 changed files with 75 additions and 16 deletions

View File

@ -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.
--------------------------------------------------------------------------

View File

@ -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)

View File

@ -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;
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;
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;
}
}

View File

@ -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,11 +85,11 @@ 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;
for (l = obj->layer->evas->grabs; l; l = l->next)
{
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) &&
(!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);
}

View File

@ -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

View File

@ -257,9 +257,12 @@ evas_object_smart_cleanup(Evas_Object *obj)
cb = obj->smart.callbacks->data;
obj->smart.callbacks = evas_list_remove(obj->smart.callbacks, cb);
if (cb->event) free (cb->event);
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);
}

View File

@ -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;
@ -365,8 +367,8 @@ struct _Evas_Object
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 *data;
};