From: Christian K. <kre...@in...> - 2001-10-14 19:42:56
|
Graham MacDonald wrote: > > Hi, I've got a question about the action code in e17. Why, in > e_cb_border_mouse_down(), and other similar functions, is e_action_stop() > called before e_action_start()? It just seems wrong to me, but maybe there's > a perfectly valid reason? Okay Raster, this is an opportunity to ask more questions, bear with me or comment your code :) I'd like to add the question if in e_action_start() and friends the "again" label gotos are only necessary because evas_list_remove() returns the head of the list? Since the list struct is declared in Evas.h, could we simply do: for (l = current_actions; l; ) { E_Action *a; a = l->data; if (!a->started) { if (a->action_impl->func_stop) a->started = 1; if (a->action_impl->func_start) { E_Object *obj; if (a->object) { obj = a->object; if (a->started) OBJ_REF(obj); } a->action_impl->func_start(a->object, a, data, x, y, rx, ry); } } if (!a->started) { // Will match immediately and just remove the first item: l = evas_list_remove(l, a); // l is now the next item, so no need to go l->next } else l = l->next; } Also, why is e_action_find() called in every e_action_start()? Why doesn't it return anything -- should that be e_action_init() or something? "find" implies that it returns something ... Oh and Raster, it'd be cool if you could comment or explain this specific inner part if (a->action_impl->func_stop) a->started = 1; if (a->action_impl->func_start) { E_Object *obj; if (a->object) { obj = a->object; if (a->started) OBJ_REF(obj); } a->action_impl->func_start(a->object, a, data, x, y, rx, ry); } Does it make sense to have a stop function without a start function? Should this be: if (a->action_impl->func_start) { E_Object *obj; if (a->action_impl->func_stop) a->started = 1; if (a->object) { obj = a->object; if (a->started) OBJ_REF(obj); } a->action_impl->func_start(a->object, a, data, x, y, rx, ry); } I also don't understand the way use counts are currently used. The use count is supposed to increase when an object gets an additional reference (i.e. pointer assignment). Why is the reference count increased here? It should be freed immediately when the use count drops to zero. So there should be no constructs like this: OBJ_UNREF(b); OBJ_IF_FREE(b) { e_window_reparent(b->win.client, 0, 0, 0); e_icccm_release(b->win.client); OBJ_FREE(b); } The two inner function calls are the same in every occurence, so they should go into b's destructor? This should just be OBJ_FREE(b); where OBJ_FREE(b) does obj->references--; if (obj->references == 0) { // clean that thing up. } Please correct me when I'm wrong, but this is definitely hairy :) Cheers and thanks for the answers, -- Christian. ________________________________________________________________________ http://www.whoop.org |