i've been leaning mem usage down... save 30% on all evas_objects now! :)

SVN revision: 6678
This commit is contained in:
Carsten Haitzler 2003-02-09 04:22:45 +00:00
parent 702156de93
commit 9854af242d
8 changed files with 189 additions and 161 deletions

View File

@ -44,45 +44,68 @@ 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));
if (!obj->callbacks) return;
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));
if ((!obj->callbacks->in) &&
(!obj->callbacks->out) &&
(!obj->callbacks->down) &&
(!obj->callbacks->up) &&
(!obj->callbacks->move) &&
(!obj->callbacks->free) &&
(!obj->callbacks->key_down) &&
(!obj->callbacks->key_up) &&
(!obj->callbacks->obj_focus_in) &&
(!obj->callbacks->obj_focus_out) &&
(!obj->callbacks->obj_show) &&
(!obj->callbacks->obj_hide) &&
(!obj->callbacks->obj_move) &&
(!obj->callbacks->obj_resize) &&
(!obj->callbacks->obj_restack))
{
free(obj->callbacks);
obj->callbacks = NULL;
}
}
void
evas_object_event_callback_cleanup(Evas_Object *obj)
{
/* MEM OK */
evas_object_event_callback_list_free(&(obj->callbacks.in));
evas_object_event_callback_list_free(&(obj->callbacks.out));
evas_object_event_callback_list_free(&(obj->callbacks.down));
evas_object_event_callback_list_free(&(obj->callbacks.up));
evas_object_event_callback_list_free(&(obj->callbacks.move));
evas_object_event_callback_list_free(&(obj->callbacks.free));
evas_object_event_callback_list_free(&(obj->callbacks.key_down));
evas_object_event_callback_list_free(&(obj->callbacks.key_up));
evas_object_event_callback_list_free(&(obj->callbacks.obj_focus_in));
evas_object_event_callback_list_free(&(obj->callbacks.obj_focus_out));
evas_object_event_callback_list_free(&(obj->callbacks.obj_show));
evas_object_event_callback_list_free(&(obj->callbacks.obj_hide));
evas_object_event_callback_list_free(&(obj->callbacks.obj_move));
evas_object_event_callback_list_free(&(obj->callbacks.obj_resize));
evas_object_event_callback_list_free(&(obj->callbacks.obj_restack));
if (!obj->callbacks) return;
evas_object_event_callback_list_free(&(obj->callbacks->in));
evas_object_event_callback_list_free(&(obj->callbacks->out));
evas_object_event_callback_list_free(&(obj->callbacks->down));
evas_object_event_callback_list_free(&(obj->callbacks->up));
evas_object_event_callback_list_free(&(obj->callbacks->move));
evas_object_event_callback_list_free(&(obj->callbacks->free));
evas_object_event_callback_list_free(&(obj->callbacks->key_down));
evas_object_event_callback_list_free(&(obj->callbacks->key_up));
evas_object_event_callback_list_free(&(obj->callbacks->obj_focus_in));
evas_object_event_callback_list_free(&(obj->callbacks->obj_focus_out));
evas_object_event_callback_list_free(&(obj->callbacks->obj_show));
evas_object_event_callback_list_free(&(obj->callbacks->obj_hide));
evas_object_event_callback_list_free(&(obj->callbacks->obj_move));
evas_object_event_callback_list_free(&(obj->callbacks->obj_resize));
evas_object_event_callback_list_free(&(obj->callbacks->obj_restack));
free(obj->callbacks);
obj->callbacks = NULL;
}
void
@ -91,58 +114,59 @@ evas_object_event_callback_call(Evas_Object *obj, Evas_Callback_Type type, void
/* MEM OK */
Evas_Object_List **l_mod, *l;
if (!obj->callbacks) return;
switch (type)
{
case EVAS_CALLBACK_MOUSE_IN:
l_mod = &(obj->callbacks.in);
l_mod = &(obj->callbacks->in);
break;
case EVAS_CALLBACK_MOUSE_OUT:
l_mod = &(obj->callbacks.out);
l_mod = &(obj->callbacks->out);
break;
case EVAS_CALLBACK_MOUSE_DOWN:
l_mod = &(obj->callbacks.down);
l_mod = &(obj->callbacks->down);
break;
case EVAS_CALLBACK_MOUSE_UP:
l_mod = &(obj->callbacks.up);
l_mod = &(obj->callbacks->up);
break;
case EVAS_CALLBACK_MOUSE_MOVE:
l_mod = &(obj->callbacks.move);
l_mod = &(obj->callbacks->move);
break;
case EVAS_CALLBACK_FREE:
l_mod = &(obj->callbacks.free);
l_mod = &(obj->callbacks->free);
break;
case EVAS_CALLBACK_KEY_DOWN:
l_mod = &(obj->callbacks.key_down);
l_mod = &(obj->callbacks->key_down);
break;
case EVAS_CALLBACK_KEY_UP:
l_mod = &(obj->callbacks.key_up);
l_mod = &(obj->callbacks->key_up);
break;
case EVAS_CALLBACK_FOCUS_IN:
l_mod = &(obj->callbacks.obj_focus_in);
l_mod = &(obj->callbacks->obj_focus_in);
break;
case EVAS_CALLBACK_FOCUS_OUT:
l_mod = &(obj->callbacks.obj_focus_out);
l_mod = &(obj->callbacks->obj_focus_out);
break;
case EVAS_CALLBACK_SHOW:
l_mod = &(obj->callbacks.obj_show);
l_mod = &(obj->callbacks->obj_show);
break;
case EVAS_CALLBACK_HIDE:
l_mod = &(obj->callbacks.obj_hide);
l_mod = &(obj->callbacks->obj_hide);
break;
case EVAS_CALLBACK_MOVE:
l_mod = &(obj->callbacks.obj_move);
l_mod = &(obj->callbacks->obj_move);
break;
case EVAS_CALLBACK_RESIZE:
l_mod = &(obj->callbacks.obj_resize);
l_mod = &(obj->callbacks->obj_resize);
break;
case EVAS_CALLBACK_RESTACK:
l_mod = &(obj->callbacks.obj_restack);
l_mod = &(obj->callbacks->obj_restack);
break;
default:
return;
break;
}
obj->callbacks.walking_list++;
obj->callbacks->walking_list++;
for (l = *l_mod; l; l = l->next)
{
Evas_Func_Node *fn;
@ -152,8 +176,8 @@ evas_object_event_callback_call(Evas_Object *obj, Evas_Callback_Type type, void
fn->func(fn->data, obj->layer->evas, obj, event_info);
if (obj->delete_me) break;
}
obj->callbacks.walking_list--;
if (!obj->callbacks.walking_list)
obj->callbacks->walking_list--;
if (!obj->callbacks->walking_list)
evas_object_event_callback_clear(obj);
}
@ -328,52 +352,59 @@ evas_object_event_callback_add(Evas_Object *obj, Evas_Callback_Type type, void (
fn->func = func;
fn->data = (void *)data;
if (!obj->callbacks)
obj->callbacks = evas_mem_calloc(sizeof(Evas_Callbacks));
if (!obj->callbacks)
{
free(fn);
return;
}
switch (type)
{
case EVAS_CALLBACK_MOUSE_IN:
l_mod = &(obj->callbacks.in);
l_mod = &(obj->callbacks->in);
break;
case EVAS_CALLBACK_MOUSE_OUT:
l_mod = &(obj->callbacks.out);
l_mod = &(obj->callbacks->out);
break;
case EVAS_CALLBACK_MOUSE_DOWN:
l_mod = &(obj->callbacks.down);
l_mod = &(obj->callbacks->down);
break;
case EVAS_CALLBACK_MOUSE_UP:
l_mod = &(obj->callbacks.up);
l_mod = &(obj->callbacks->up);
break;
case EVAS_CALLBACK_MOUSE_MOVE:
l_mod = &(obj->callbacks.move);
l_mod = &(obj->callbacks->move);
break;
case EVAS_CALLBACK_FREE:
l_mod = &(obj->callbacks.free);
l_mod = &(obj->callbacks->free);
break;
case EVAS_CALLBACK_KEY_DOWN:
l_mod = &(obj->callbacks.key_down);
l_mod = &(obj->callbacks->key_down);
break;
case EVAS_CALLBACK_KEY_UP:
l_mod = &(obj->callbacks.key_up);
l_mod = &(obj->callbacks->key_up);
break;
case EVAS_CALLBACK_FOCUS_IN:
l_mod = &(obj->callbacks.obj_focus_in);
l_mod = &(obj->callbacks->obj_focus_in);
break;
case EVAS_CALLBACK_FOCUS_OUT:
l_mod = &(obj->callbacks.obj_focus_out);
l_mod = &(obj->callbacks->obj_focus_out);
break;
case EVAS_CALLBACK_SHOW:
l_mod = &(obj->callbacks.obj_show);
l_mod = &(obj->callbacks->obj_show);
break;
case EVAS_CALLBACK_HIDE:
l_mod = &(obj->callbacks.obj_hide);
l_mod = &(obj->callbacks->obj_hide);
break;
case EVAS_CALLBACK_MOVE:
l_mod = &(obj->callbacks.obj_move);
l_mod = &(obj->callbacks->obj_move);
break;
case EVAS_CALLBACK_RESIZE:
l_mod = &(obj->callbacks.obj_resize);
l_mod = &(obj->callbacks->obj_resize);
break;
case EVAS_CALLBACK_RESTACK:
l_mod = &(obj->callbacks.obj_restack);
l_mod = &(obj->callbacks->obj_restack);
break;
default:
free(fn);
@ -418,52 +449,54 @@ evas_object_event_callback_del(Evas_Object *obj, Evas_Callback_Type type, void (
if (!func) return NULL;
if (!obj->callbacks) return NULL;
switch (type)
{
case EVAS_CALLBACK_MOUSE_IN:
l_mod = &(obj->callbacks.in);
l_mod = &(obj->callbacks->in);
break;
case EVAS_CALLBACK_MOUSE_OUT:
l_mod = &(obj->callbacks.out);
l_mod = &(obj->callbacks->out);
break;
case EVAS_CALLBACK_MOUSE_DOWN:
l_mod = &(obj->callbacks.down);
l_mod = &(obj->callbacks->down);
break;
case EVAS_CALLBACK_MOUSE_UP:
l_mod = &(obj->callbacks.up);
l_mod = &(obj->callbacks->up);
break;
case EVAS_CALLBACK_MOUSE_MOVE:
l_mod = &(obj->callbacks.move);
l_mod = &(obj->callbacks->move);
break;
case EVAS_CALLBACK_FREE:
l_mod = &(obj->callbacks.free);
l_mod = &(obj->callbacks->free);
break;
case EVAS_CALLBACK_KEY_DOWN:
l_mod = &(obj->callbacks.key_down);
l_mod = &(obj->callbacks->key_down);
break;
case EVAS_CALLBACK_KEY_UP:
l_mod = &(obj->callbacks.key_up);
l_mod = &(obj->callbacks->key_up);
break;
case EVAS_CALLBACK_FOCUS_IN:
l_mod = &(obj->callbacks.obj_focus_in);
l_mod = &(obj->callbacks->obj_focus_in);
break;
case EVAS_CALLBACK_FOCUS_OUT:
l_mod = &(obj->callbacks.obj_focus_out);
l_mod = &(obj->callbacks->obj_focus_out);
break;
case EVAS_CALLBACK_SHOW:
l_mod = &(obj->callbacks.obj_show);
l_mod = &(obj->callbacks->obj_show);
break;
case EVAS_CALLBACK_HIDE:
l_mod = &(obj->callbacks.obj_hide);
l_mod = &(obj->callbacks->obj_hide);
break;
case EVAS_CALLBACK_MOVE:
l_mod = &(obj->callbacks.obj_move);
l_mod = &(obj->callbacks->obj_move);
break;
case EVAS_CALLBACK_RESIZE:
l_mod = &(obj->callbacks.obj_resize);
l_mod = &(obj->callbacks->obj_resize);
break;
case EVAS_CALLBACK_RESTACK:
l_mod = &(obj->callbacks.obj_restack);
l_mod = &(obj->callbacks->obj_restack);
break;
default:
return NULL;
@ -480,8 +513,8 @@ evas_object_event_callback_del(Evas_Object *obj, Evas_Callback_Type type, void (
data = fn->data;
fn->delete_me = 1;
obj->callbacks.deletions_waiting = 1;
if (!obj->callbacks.walking_list)
obj->callbacks->deletions_waiting = 1;
if (!obj->callbacks->walking_list)
evas_object_event_callback_clear(obj);
return data;
}

View File

@ -15,9 +15,9 @@ struct _Evas_Object_Gradient
struct {
double angle;
} cur, prev;
int changed : 1;
int gradient_changed : 1;
int gradient_opaque : 1;
char changed : 1;
char gradient_changed : 1;
char gradient_opaque : 1;
void *engine_data;
};

View File

@ -15,24 +15,22 @@ struct _Evas_Object_Image
struct {
struct {
double x, y, w, h;
} fill;
} fill;
struct {
int w, h;
short w, h;
} image;
struct {
int l, r, t, b;
short l, r, t, b;
} border;
char *file;
char *key;
int smooth_scale : 1;
int has_alpha :1;
char smooth_scale : 1;
char has_alpha :1;
} cur, prev;
int changed : 1;
char changed : 1;
int load_error;
Evas_List *pixel_updates;

View File

@ -20,7 +20,7 @@ struct _Evas_Object_Line
} cache;
double x1, y1, x2, y2;
} cur, prev;
int changed : 1;
char changed : 1;
void *engine_data;
};

View File

@ -12,9 +12,9 @@ typedef struct _Evas_Polygon_Point Evas_Polygon_Point;
struct _Evas_Object_Polygon
{
DATA32 magic;
int changed : 1;
Evas_List *points;
Evas_List *points;
char changed : 1;
void *engine_data;
};

View File

@ -14,7 +14,7 @@ struct _Evas_Object_Smart
struct _Evas_Smart_Callback
{
char *event;
int delete_me : 1;
char delete_me : 1;
void (*func) (void *data, Evas_Object *obj, void *event_info);
void *func_data;
};

View File

@ -17,10 +17,10 @@ struct _Evas_Object_Text
char *font;
double size;
} cur, prev;
int changed : 1;
char changed : 1;
double ascent, descent;
double max_ascent, max_descent;
float ascent, descent;
float max_ascent, max_descent;
void *engine_data;
};

View File

@ -53,6 +53,7 @@ typedef struct _Evas_Intercept_Func_SizePos Evas_Intercept_Func_SizePos;
typedef struct _Evas_Intercept_Func_Obj Evas_Intercept_Func_Obj;
typedef struct _Evas_Intercept_Func_Int Evas_Intercept_Func_Int;
typedef struct _Evas_Key_Grab Evas_Key_Grab;
typedef struct _Evas_Callbacks Evas_Callbacks;
#define MAGIC_EVAS 0x70777770
#define MAGIC_OBJ 0x71777770
@ -128,7 +129,7 @@ struct _Evas_Key_Grab
Evas_Modifier_Mask modifiers;
Evas_Modifier_Mask not_modifiers;
Evas_Object *object;
int exclusive : 1;
char exclusive : 1;
};
struct _Evas_Intercept_Func
@ -152,7 +153,7 @@ struct _Evas_Smart
int usage;
void *data;
int delete_me : 1;
char delete_me : 1;
void (*func_add) (Evas_Object *o);
void (*func_del) (Evas_Object *o);
@ -188,6 +189,27 @@ struct _Evas_Lock
Evas_Modifier_Mask mask; /* we have a max of 64 locks */
};
struct _Evas_Callbacks
{
char deletions_waiting : 1;
int walking_list;
Evas_Object_List *down;
Evas_Object_List *up;
Evas_Object_List *move;
Evas_Object_List *in;
Evas_Object_List *out;
Evas_Object_List *key_down;
Evas_Object_List *key_up;
Evas_Object_List *free;
Evas_Object_List *obj_focus_in;
Evas_Object_List *obj_focus_out;
Evas_Object_List *obj_show;
Evas_Object_List *obj_hide;
Evas_Object_List *obj_move;
Evas_Object_List *obj_resize;
Evas_Object_List *obj_restack;
};
struct _Evas
{
Evas_Object_List _list_data;
@ -195,8 +217,8 @@ struct _Evas
DATA32 magic;
struct {
int inside : 1;
int mouse_grabbed : 1;
char inside : 1;
char mouse_grabbed : 1;
DATA32 button;
int x, y;
@ -210,13 +232,13 @@ struct _Evas
struct {
double x, y, w, h;
int changed : 1;
char changed : 1;
} viewport;
struct {
int w, h;
DATA32 render_method;
int changed : 1;
char changed : 1;
} output;
int output_validity;
@ -228,7 +250,7 @@ struct _Evas
Evas_Hash *name_hash;
int changed : 1;
char changed : 1;
int events_frozen;
@ -260,8 +282,6 @@ struct _Evas_Layer
int layer;
Evas_Object *objects;
int store : 1;
Evas *evas;
void *engine_data;
@ -273,8 +293,7 @@ struct _Evas_Object
DATA32 magic;
const char *type;
const char *type;
Evas_Layer *layer;
struct {
@ -285,39 +304,22 @@ struct _Evas_Object
} geometry;
struct {
int x, y, w, h;
int r, g, b, a;
int visible;
unsigned char r, g, b, a;
char visible : 1;
} clip;
} cache;
struct {
double x, y, w, h;
} geometry;
struct {
int r, g, b, a;
} color;
int visible : 1;
int layer;
Evas_Object *clipper;
unsigned char r, g, b, a;
} color;
char visible : 1;
int layer;
Evas_Object *clipper;
} cur, prev;
char *name;
int store : 1;
int pass_events : 1;
int repeat_events : 1;
int restack : 1;
int changed : 1;
int mouse_in : 1;
int mouse_grabbed : 1;
int pre_render_done : 1;
int intercepted : 1;
int focused : 1;
int delete_me;
char *name;
Evas_Intercept_Func *interceptors;
@ -326,26 +328,8 @@ struct _Evas_Object
} data;
Evas_List *grabs;
struct {
int deletions_waiting : 1;
int walking_list;
Evas_Object_List *in;
Evas_Object_List *out;
Evas_Object_List *down;
Evas_Object_List *up;
Evas_Object_List *move;
Evas_Object_List *free;
Evas_Object_List *key_down;
Evas_Object_List *key_up;
Evas_Object_List *obj_focus_in;
Evas_Object_List *obj_focus_out;
Evas_Object_List *obj_show;
Evas_Object_List *obj_hide;
Evas_Object_List *obj_move;
Evas_Object_List *obj_resize;
Evas_Object_List *obj_restack;
} callbacks;
Evas_Callbacks *callbacks;
struct {
Evas_List *clipees;
@ -353,24 +337,37 @@ struct _Evas_Object
} clip;
Evas_Object_Func *func;
void *object_data;
struct {
int walking_list;
int deletions_waiting : 1;
Evas_Smart *smart;
void *data;
Evas_Object *parent;
Evas_List *contained;
Evas_List *callbacks;
char deletions_waiting : 1;
} smart;
void *object_data;
short store : 1;
short pass_events : 1;
short repeat_events : 1;
short restack : 1;
short changed : 1;
short mouse_in : 1;
short mouse_grabbed : 1;
short pre_render_done : 1;
short intercepted : 1;
short focused : 1;
unsigned char delete_me;
};
struct _Evas_Func_Node
{
Evas_Object_List _list_data;
int delete_me : 1;
char delete_me : 1;
void (*func) (void *data, Evas *e, Evas_Object *obj, void *event_info);
void *data;
};