From: <enl...@li...> - 2006-03-03 13:23:17
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: etk_object.c etk_widget.c Log Message: use list and hash implementation for performance and accuracy =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_object.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -3 -r1.15 -r1.16 --- etk_object.c 3 Mar 2006 11:43:38 -0000 1.15 +++ etk_object.c 3 Mar 2006 13:23:11 -0000 1.16 @@ -31,7 +31,8 @@ static Evas_Bool _etk_object_data_free_cb(Evas_Hash *hash, const char *key, void *data, void *fdata); static Evas_Bool _etk_object_hash_foreach(Evas_Hash *hash, const char *key, void *data, void *fdata); -static Evas_Hash *_etk_object_created_objects = NULL; +static Evas_List *_etk_object_created_objects = NULL; +static Evas_Hash *_etk_object_created_objects_hash = NULL; static Etk_Signal *_etk_object_signals[ETK_OBJECT_NUM_SIGNALS]; /************************** @@ -97,7 +98,8 @@ new_object = calloc(1,object_type->type_size); new_object->type = object_type; - _etk_object_created_objects = evas_hash_add(_etk_object_created_objects, (char*)new_object, new_object); + _etk_object_created_objects = evas_list_append(_etk_object_created_objects, new_object); + _etk_object_created_objects_hash = evas_hash_add(_etk_object_created_objects_hash, new_object, new_object); etk_type_object_construct(object_type, new_object); va_copy(args2, args); @@ -118,7 +120,8 @@ etk_signal_emit(_etk_object_signals[ETK_OBJECT_DESTROYED_SIGNAL], object, NULL); etk_type_destructors_call(object->type, object); - _etk_object_created_objects = evas_hash_del(_etk_object_created_objects, (char*)object, object); + _etk_object_created_objects = evas_list_remove(_etk_object_created_objects, object); + _etk_object_created_objects_hash = evas_hash_del(_etk_object_created_objects_hash, object, object); free(object); } @@ -127,14 +130,17 @@ */ void etk_object_destroy_all_objects() { -// while (_etk_object_created_objects) -// etk_object_destroy(ETK_OBJECT(_etk_object_created_objects->data)); - evas_hash_foreach(_etk_object_created_objects, _etk_object_hash_foreach, NULL); + while (_etk_object_created_objects) + etk_object_destroy(ETK_OBJECT(_etk_object_created_objects->data)); } +/* + * @brief Looks up an object so we know if it exists + * @param object the object we want to find + */ void *etk_object_lookup(Etk_Object *object) { - return evas_hash_find(_etk_object_created_objects, (char *)object); + return evas_hash_find(_etk_object_created_objects_hash, object); } /** @@ -621,12 +627,4 @@ return 1; } -/* Used when we want to iterate over the hash to destroy all objects */ -static Evas_Bool _etk_object_hash_foreach(Evas_Hash *hash, const char *key, void *data, void *fdata) -{ - /* destroying using the void *data seems to work better */ - etk_object_destroy(ETK_OBJECT(data)); - return 1; -} - /** @} */ =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_widget.c,v retrieving revision 1.43 retrieving revision 1.44 diff -u -3 -r1.43 -r1.44 --- etk_widget.c 3 Mar 2006 10:04:27 -0000 1.43 +++ etk_widget.c 3 Mar 2006 13:23:12 -0000 1.44 @@ -1938,7 +1938,7 @@ etk_signal_emit(_etk_widget_signals[ETK_WIDGET_MOUSE_IN_SIGNAL], ETK_OBJECT(widget), NULL, &event); - if (_etk_widget_propagate_event && widget->parent) + if (_etk_widget_propagate_event && widget->parent && etk_object_lookup(ETK_OBJECT(widget))) _etk_widget_mouse_in_cb(widget->parent, evas, NULL, event_info); } @@ -1974,7 +1974,7 @@ etk_signal_emit(_etk_widget_signals[ETK_WIDGET_MOUSE_OUT_SIGNAL], ETK_OBJECT(widget), NULL, &event); - if (_etk_widget_propagate_event && widget->parent) + if (_etk_widget_propagate_event && widget->parent && etk_object_lookup(ETK_OBJECT(widget))) _etk_widget_mouse_out_cb(widget->parent, evas, NULL, event_info); } @@ -2014,7 +2014,7 @@ etk_signal_emit(_etk_widget_signals[ETK_WIDGET_MOUSE_MOVE_SIGNAL], ETK_OBJECT(widget), NULL, &event); - if (_etk_widget_propagate_event && widget->parent) + if (_etk_widget_propagate_event && widget->parent && etk_object_lookup(ETK_OBJECT(widget))) _etk_widget_mouse_move_cb(widget->parent, evas, NULL, event_info); } @@ -2082,11 +2082,14 @@ etk_signal_emit(_etk_widget_signals[ETK_WIDGET_MOUSE_UP_SIGNAL], ETK_OBJECT(widget), NULL, &event); + if(!etk_object_lookup(ETK_OBJECT(widget))) + return; + if (evas_event->canvas.x >= widget->geometry.x && evas_event->canvas.x <= widget->geometry.x + widget->geometry.w && evas_event->canvas.y >= widget->geometry.y && evas_event->canvas.y <= widget->geometry.y + widget->geometry.h) etk_signal_emit(_etk_widget_signals[ETK_WIDGET_MOUSE_CLICK_SIGNAL], ETK_OBJECT(widget), NULL, &event); - if (_etk_widget_propagate_event && widget->repeat_events && widget->parent && etk_object_lookup(ETK_OBJECT(widget))) + if (_etk_widget_propagate_event && widget->repeat_events && widget->parent) _etk_widget_mouse_up_cb(widget->parent, evas, NULL, event_info); } @@ -2115,7 +2118,7 @@ etk_signal_emit(_etk_widget_signals[ETK_WIDGET_MOUSE_WHEEL_SIGNAL], ETK_OBJECT(widget), NULL, &event); - if (_etk_widget_propagate_event && widget->parent) + if (_etk_widget_propagate_event && widget->parent && etk_object_lookup(ETK_OBJECT(widget))) _etk_widget_mouse_wheel_cb(widget->parent, evas, NULL, event_info); } @@ -2142,7 +2145,7 @@ etk_signal_emit(_etk_widget_signals[ETK_WIDGET_KEY_DOWN_SIGNAL], ETK_OBJECT(widget), NULL, &event); - if (_etk_widget_propagate_event && widget->parent) + if (_etk_widget_propagate_event && widget->parent && etk_object_lookup(ETK_OBJECT(widget))) _etk_widget_key_down_cb(widget->parent, evas, NULL, event_info); } @@ -2195,7 +2198,7 @@ etk_signal_emit(_etk_widget_signals[ETK_WIDGET_KEY_UP_SIGNAL], ETK_OBJECT(widget), NULL, &event); - if (_etk_widget_propagate_event && widget->parent) + if (_etk_widget_propagate_event && widget->parent && etk_object_lookup(ETK_OBJECT(widget))) _etk_widget_key_up_cb(widget->parent, evas, NULL, event_info); } |