Enlightenment CVS committal
Author : raster
Project : e17
Module : libs/edje
Dir : e17/libs/edje/src/lib
Modified Files:
edje_callbacks.c edje_load.c edje_main.c edje_private.h
edje_program.c edje_smart.c
Log Message:
went through some more of the fixme list and fixed 'em
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_callbacks.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -3 -r1.2 -r1.3
--- edje_callbacks.c 25 Jun 2003 21:40:32 -0000 1.2
+++ edje_callbacks.c 26 Jun 2003 14:04:31 -0000 1.3
@@ -128,13 +128,17 @@
double t;
Evas_List *l;
Evas_List *animl = NULL;
+ Edje *ed;
t = ecore_time_get();
for (l = _edje_animators; l; l = l->next)
- animl = evas_list_append(animl, l->data);
+ {
+ ed = l->data;
+ _edje_ref(ed);
+ animl = evas_list_append(animl, l->data);
+ }
while (animl)
{
- Edje *ed;
Evas_List *newl = NULL;
ed = animl->data;
@@ -151,6 +155,7 @@
_edje_program_run_iterate(runp, t);
}
_edje_thaw(ed);
+ _edje_unref(ed);
}
if (_edje_anim_count > 0) return 1;
_edje_timer = NULL;
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_load.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -3 -r1.2 -r1.3
--- edje_load.c 25 Jun 2003 02:29:25 -0000 1.2
+++ edje_load.c 26 Jun 2003 14:04:31 -0000 1.3
@@ -72,6 +72,8 @@
ed);
evas_object_data_set(rp->object, "real_part", rp);
}
+ else
+ evas_object_pass_events_set(rp->object, 1);
evas_object_clip_set(rp->object, ed->clipper);
evas_object_show(rp->object);
rp->part = ep;
@@ -89,7 +91,10 @@
{
rp->clip_to = evas_list_nth(ed->parts, rp->part->clip_to_id);
if (rp->clip_to)
- evas_object_clip_set(rp->object, rp->clip_to->object);
+ {
+ evas_object_pass_events_set(rp->clip_to->object, 1);
+ evas_object_clip_set(rp->object, rp->clip_to->object);
+ }
}
}
ed->dirty = 1;
@@ -110,7 +115,6 @@
Evas_List *l;
int id = -1;
- /* FIXME: look in hash table first */
ed->file = evas_hash_find(_edje_file_hash, ed->path);
if (ed->file)
{
@@ -128,7 +132,7 @@
ed->file->path = strdup(ed->path);
if (!ed->file->collection_dir)
{
- /* FIXME: free up ed->file */
+ _edje_file_free(ed->file);
ed->file = NULL;
goto out;
}
@@ -167,6 +171,13 @@
ed->collection->references = 1;
ed->file->collection_hash = evas_hash_add(ed->file->collection_hash,
ed->part, ed->collection);
}
+ else
+ {
+ ed->file->references--;
+ if (ed->file->references <= 0)
+ _edje_file_free(ed->file);
+ ed->file = NULL;
+ }
}
out:
if (ef) eet_close(ef);
@@ -206,8 +217,16 @@
}
if (ed->actions)
{
-// printf("FIXME: leak!\n");
- ed->actions = NULL;
+ while (ed->actions)
+ {
+ Edje_Running_Program *runp;
+
+ _edje_anim_count--;
+ runp = ed->actions->data;
+ ed->actions = evas_list_remove(ed->actions, runp);
+ free(runp);
+ }
+ _edje_animators = evas_list_remove(_edje_animators, ed);
}
}
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_main.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -3 -r1.19 -r1.20
--- edje_main.c 24 Jun 2003 02:33:04 -0000 1.19
+++ edje_main.c 26 Jun 2003 14:04:31 -0000 1.20
@@ -24,6 +24,9 @@
evas_object_color_set(ed->clipper, 255, 255, 255, 255);
evas_object_move(ed->clipper, 0, 0);
evas_object_resize(ed->clipper, 0, 0);
+ evas_object_pass_events_set(ed->clipper, 1);
+ ed->have_objects = 1;
+ ed->references = 1;
return ed;
}
@@ -31,9 +34,60 @@
_edje_del(Edje *ed)
{
_edje_file_del(ed);
+ _edje_clean_objects(ed);
if (ed->path) free(ed->path);
if (ed->part) free(ed->part);
- evas_object_del(ed->clipper);
- printf("FIXME: leak: ed->callbacks\n");
+ while (ed->callbacks)
+ {
+ Edje_Signal_Callback *escb;
+
+ escb = ed->callbacks->data;
+ ed->callbacks = evas_list_remove(ed->callbacks, escb);
+ free(escb->signal);
+ free(escb->source);
+ free(escb);
+ }
free(ed);
+}
+
+void
+_edje_clean_part_objects(Edje *ed)
+{
+ Evas_List *l;
+
+ for (l = ed->parts; l; l = l->next)
+ {
+ Edje_Real_Part *rp;
+
+ rp = l->data;
+ evas_object_del(rp->object);
+ rp->object = NULL;
+ }
+}
+
+void
+_edje_clean_objects(Edje *ed)
+{
+ Evas_List *l;
+
+ ed->have_objects = 0;
+ _edje_clean_part_objects(ed);
+ evas_object_del(ed->clipper);
+ ed->evas = NULL;
+ ed->obj = NULL;
+ ed->clipper = NULL;
+}
+
+void
+_edje_ref(Edje *ed)
+{
+ ed->references++;
+}
+
+void
+_edje_unref(Edje *ed)
+{
+ ed->references--;
+ if (ed->references <= 0)
+ _edje_del(ed);
}
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_private.h,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -3 -r1.20 -r1.21
--- edje_private.h 25 Jun 2003 23:36:44 -0000 1.20
+++ edje_private.h 26 Jun 2003 14:04:31 -0000 1.21
@@ -12,7 +12,6 @@
/* FIXME:
* add a smooth scale option to fill params
- * reference count programs since the tmp lists can be screwed if a program is ended
by another
* need "random" signals and events for hooking to, and "random" durations
* free stuff - no more leaks
* dragables have to work
@@ -24,19 +23,17 @@
* text and color classes need to work
* reduce linked list walking and list_nth calls
* named parts need to be able to be "replaced" with new evas objects
+ * part replacement with object callbacks should be possible
* real part size and "before min/max limit" sizes need to be stored per part
* need to be able to calculate min & max size of a whole edje
- * add code to list collections in an eet file
+ * need to be able to list collections in an eet file
* externally sourced images need to be supported in edje_cc and edje
- * part replacement with object callbacks should be possible
* part queries for geometry etc.
* need to be able to "pause" edjes from API
* need to be able to force anim times to 0.0 from API to turn off animation
- * need to detect relative loops
- * need to detect clip_to loops
+ * need to detect relative part loops
+ * need to detect clip_to part loops
* need to detect anim time 0.0 loops
- * need to check frametime 0.0 works
- * need to check mouse_events flag works
* edje_cc should be able to force lossy, lossless, min and max quality and
compression of encoded images
* edje_cc needs to prune out unused images
* edje_cc might need an option for limiting number of tween images
@@ -342,6 +339,10 @@
double x, y, w, h;
unsigned char dirty : 1;
unsigned char recalc : 1;
+ unsigned char walking_callbacks : 1;
+ unsigned char delete_callbacks : 1;
+ unsigned char just_added_callbacks : 1;
+ unsigned char have_objects : 1;
Evas *evas; /* the evas this edje belongs to */
Evas_Object *obj; /* the smart object */
Evas_Object *clipper; /* a big rect to clip this edje to */
@@ -351,6 +352,7 @@
Evas_List *actions; /* currently running actions */
Evas_List *callbacks;
int freeze;
+ int references;
};
struct _Edje_Real_Part
@@ -396,6 +398,8 @@
char *source;
void (*func) (void *data, Evas_Object *o, const char *emission, const char
*source);
void *data;
+ int just_added : 1;
+ int delete_me : 1;
};
struct _Edje_Calc_Params
@@ -440,7 +444,11 @@
Edje *_edje_add(Evas_Object *obj);
void _edje_del(Edje *ed);
-
+void _edje_clean_part_objects(Edje *ed);
+void _edje_clean_objects(Edje *ed);
+void _edje_ref(Edje *ed);
+void _edje_unref(Edje *ed);
+
int _edje_program_run_iterate(Edje_Running_Program *runp, double tim);
void _edje_program_end(Edje *ed, Edje_Running_Program *runp);
void _edje_program_run(Edje *ed, Edje_Program *pr);
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_program.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -3 -r1.2 -r1.3
--- edje_program.c 25 Jun 2003 23:36:44 -0000 1.2
+++ edje_program.c 26 Jun 2003 14:04:31 -0000 1.3
@@ -41,6 +41,11 @@
escb->func = func;
escb->data = data;
ed->callbacks = evas_list_append(ed->callbacks, escb);
+ if (ed->walking_callbacks)
+ {
+ escb->just_added = 1;
+ ed->just_added_callbacks = 1;
+ }
}
void *
@@ -64,9 +69,18 @@
void *data;
data = escb->data;
- free(escb->signal);
- free(escb->source);
- free(escb);
+ if (ed->walking_callbacks)
+ {
+ escb->delete_me = 1;
+ ed->delete_callbacks = 1;
+ }
+ else
+ {
+ ed->callbacks = evas_list_remove_list(ed->callbacks, l);
+ free(escb->signal);
+ free(escb->source);
+ free(escb);
+ }
return data;
}
}
@@ -92,6 +106,7 @@
double t, total;
Evas_List *l;
+ _edje_ref(runp->edje);
_edje_freeze(runp->edje);
t = tim - runp->start_time;
total = runp->program->tween.time;
@@ -143,11 +158,13 @@
if (pr) _edje_program_run(runp->edje, pr);
}
_edje_thaw(runp->edje);
+ _edje_unref(runp->edje);
free(runp);
return 0;
}
_edje_recalc(runp->edje);
_edje_thaw(runp->edje);
+ _edje_unref(runp->edje);
return 1;
}
@@ -156,6 +173,7 @@
{
Evas_List *l;
+ _edje_ref(runp->edje);
_edje_freeze(runp->edje);
for (l = runp->program->targets; l; l = l->next)
{
@@ -183,6 +201,7 @@
_edje_animators = evas_list_remove(_edje_animators, runp->edje);
_edje_emit(runp->edje, "program,stop", runp->program->name);
_edje_thaw(runp->edje);
+ _edje_unref(runp->edje);
free(runp);
}
@@ -192,6 +211,7 @@
Evas_List *l;
_edje_freeze(ed);
+ _edje_ref(ed);
_edje_emit(ed, "program,start", pr->name);
if (pr->action == EDJE_ACTION_TYPE_STATE_SET)
{
@@ -280,6 +300,7 @@
{
_edje_emit(ed, pr->state, pr->state2);
}
+ _edje_unref(ed);
_edje_thaw(ed);
}
@@ -290,6 +311,7 @@
static Evas_List *emissions = NULL;
Edje_Emission *ee;
+ _edje_ref(ed);
_edje_freeze(ed);
printf("EMIT \"%s\" \"%s\"\n", sig, src);
ee = calloc(1, sizeof(Edje_Emission));
@@ -300,6 +322,7 @@
{
emissions = evas_list_append(emissions, ee);
_edje_thaw(ed);
+ _edje_unref(ed);
return;
}
else
@@ -319,14 +342,41 @@
(_edje_glob_match(ee->source, pr->source)))
_edje_program_run(ed, pr);
}
+ ed->walking_callbacks = 1;
for (l = ed->callbacks; l; l = l->next)
{
Edje_Signal_Callback *escb;
escb = l->data;
- if ((_edje_glob_match(ee->signal, escb->signal)) &&
+ if ((!escb->just_added) &&
+ (!escb->delete_me) &&
+ (_edje_glob_match(ee->signal, escb->signal)) &&
(_edje_glob_match(ee->source, escb->source)))
- escb->func(escb->data, ed->obj, ee->signal, ee->source);
+ escb->func(escb->data, ed->obj, ee->signal, ee->source);
+ }
+ ed->walking_callbacks = 0;
+ if ((ed->delete_callbacks) || (ed->just_added_callbacks))
+ {
+ ed->delete_callbacks = 0;
+ ed->just_added_callbacks = 0;
+ for (l = ed->callbacks; l;)
+ {
+ Edje_Signal_Callback *escb;
+ Evas_List *next_l;
+
+ escb = l->data;
+ next_l = l->next;
+ if (escb->just_added)
+ escb->just_added = 0;
+ if (escb->delete_me)
+ {
+ ed->callbacks = evas_list_remove_list(ed->callbacks, l);
+ free(escb->signal);
+ free(escb->source);
+ free(escb);
+ }
+ l = next_l;
+ }
}
}
free(ee->signal);
@@ -334,4 +384,5 @@
free(ee);
}
_edje_thaw(ed);
+ _edje_unref(ed);
}
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_smart.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- edje_smart.c 24 Jun 2003 02:33:04 -0000 1.1
+++ edje_smart.c 26 Jun 2003 14:04:31 -0000 1.2
@@ -65,7 +65,8 @@
ed = evas_object_smart_data_get(obj);
if (!ed) return;
- _edje_del(ed);
+ _edje_clean_objects(ed);
+ _edje_unref(ed);
}
static void
-------------------------------------------------------
This SF.Net email is sponsored by: INetU
Attention Web Developers & Consultants: Become An INetU Hosting Partner.
Refer Dedicated Servers. We Manage Them. You Get 10% Monthly Commission!
INetU Dedicated Managed Hosting http://www.inetu.net/partner/index.php
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs