From: Enlightenment S. <no-...@en...> - 2008-10-18 03:55:51
|
Log: defer recalc for faster init and changes. Author: raster Date: 2008-10-17 20:55:44 -0700 (Fri, 17 Oct 2008) New Revision: 36766 Modified: trunk/TMP/st/elementary/src/lib/Elementary.h trunk/TMP/st/elementary/src/lib/elm_entry.c Modified: trunk/TMP/st/elementary/src/lib/Elementary.h =================================================================== --- trunk/TMP/st/elementary/src/lib/Elementary.h 2008-10-17 23:59:25 UTC (rev 36765) +++ trunk/TMP/st/elementary/src/lib/Elementary.h 2008-10-18 03:55:44 UTC (rev 36766) @@ -188,6 +188,15 @@ EAPI void elm_entry_entry_insert(Evas_Object *obj, const char *entry); EAPI void elm_entry_line_wrap_set(Evas_Object *obj, Evas_Bool wrap); /* smart callbacks called: + * "changed" - the text content changed + * "selection,start" - + * "selection,changed" - + * "selection,cleared" - + * "selection,paste" - + * "selection,copy" - + * "selection,cut" - + * "cursor,changed" - + * "anchor,X,clicked,N" - achor called X was clicked with button N */ // FIXME: fixes to do Modified: trunk/TMP/st/elementary/src/lib/elm_entry.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_entry.c 2008-10-17 23:59:25 UTC (rev 36765) +++ trunk/TMP/st/elementary/src/lib/elm_entry.c 2008-10-18 03:55:44 UTC (rev 36766) @@ -6,7 +6,10 @@ struct _Widget_Data { Evas_Object *ent; + Evas_Coord lastw; + Evas_Bool changed; Evas_Bool linewrap; + Ecore_Job *deferred_recalc_job; }; static void _del_hook(Evas_Object *obj); @@ -26,10 +29,29 @@ _del_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); + if (wd->deferred_recalc_job) ecore_job_del(wd->deferred_recalc_job); free(wd); } static void +_elm_win_recalc_job(void *data) +{ + Widget_Data *wd = elm_widget_data_get(data); + Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1; + Evas_Coord resw, resh, minminw; + + wd->deferred_recalc_job = NULL; + evas_object_geometry_get(wd->ent, NULL, NULL, &resw, &resh); + resh = 0; + minminw = 0; + edje_object_size_min_restricted_calc(wd->ent, &minw, &minh, 0, 0); + minminw = minw; + edje_object_size_min_restricted_calc(wd->ent, &minw, &minh, resw, 0); + evas_object_size_hint_min_set(data, minminw, minh); + evas_object_size_hint_max_set(data, minminw, maxh); +} + +static void _sizing_eval(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); @@ -39,16 +61,15 @@ if (wd->linewrap) { evas_object_geometry_get(wd->ent, NULL, NULL, &resw, &resh); - resh = 0; - minminw = 0; - edje_object_size_min_restricted_calc(wd->ent, &minw, &minh, 0, 0); - minminw = minw; - edje_object_size_min_restricted_calc(wd->ent, &minw, &minh, resw, 0); - evas_object_size_hint_min_set(obj, minminw, minh); - evas_object_size_hint_max_set(obj, minminw, maxh); + if ((resw == wd->lastw) && (!wd->changed)) return; + wd->changed = 0; + wd->lastw = resw; + if (wd->deferred_recalc_job) ecore_job_del(wd->deferred_recalc_job); + wd->deferred_recalc_job = ecore_job_add(_elm_win_recalc_job, obj); } else { + evas_object_geometry_get(wd->ent, NULL, NULL, &resw, &resh); edje_object_size_min_calc(wd->ent, &minw, &minh); evas_object_size_hint_min_set(obj, minw, minh); evas_object_size_hint_max_set(obj, maxw, maxh); @@ -74,6 +95,7 @@ { Widget_Data *wd = elm_widget_data_get(data); evas_object_smart_callback_call(data, "changed", NULL); + wd->changed = 1; _sizing_eval(data); } @@ -105,6 +127,7 @@ _signal_entry_paste_request(void *data, Evas_Object *obj, const char *emission, const char *source) { Widget_Data *wd = elm_widget_data_get(data); + evas_object_smart_callback_call(data, "selection,paste", NULL); // FIXME: x clipboard/copy and paste - request } @@ -112,7 +135,7 @@ _signal_entry_copy_notify(void *data, Evas_Object *obj, const char *emission, const char *source) { Widget_Data *wd = elm_widget_data_get(data); - evas_object_smart_callback_call(data, "changed", NULL); + evas_object_smart_callback_call(data, "selection,copy", NULL); // FIXME: x clipboard/copy & paste - do } @@ -120,7 +143,9 @@ _signal_entry_cut_notify(void *data, Evas_Object *obj, const char *emission, const char *source) { Widget_Data *wd = elm_widget_data_get(data); - evas_object_smart_callback_call(data, "changed", NULL); + evas_object_smart_callback_call(data, "selection,cut", NULL); + wd->changed = 1; + _sizing_eval(data); // FIXME: x clipboard/copy & paste - do } @@ -244,6 +269,7 @@ for (l = an; l; l = l->next) printf("ANCHOR: %s\n", l->data); } + wd->changed = 1; _sizing_eval(obj); } @@ -266,6 +292,7 @@ { Widget_Data *wd = elm_widget_data_get(obj); edje_object_part_text_insert(wd->ent, "elm.text", entry); + wd->changed = 1; _sizing_eval(obj); } |