From 7576e5a311af19ae39d2602acd7761e9330227d5 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Thu, 29 Jan 2009 06:29:36 +0000 Subject: [PATCH] move ilist widget filling to a idler... defers a chunk of work to idle time over a period of time keeping e interactive and usable. SVN revision: 38836 --- data/themes/default.edc | 1 + src/bin/e_ilist.h | 2 + src/bin/e_widget_ilist.c | 268 ++++++++++++++++++ .../conf_display/e_int_config_display.c | 7 + src/modules/illume/e_kbd_int.c | 2 +- 5 files changed, 279 insertions(+), 1 deletion(-) diff --git a/data/themes/default.edc b/data/themes/default.edc index e2fcee103..85214e2c3 100644 --- a/data/themes/default.edc +++ b/data/themes/default.edc @@ -18407,6 +18407,7 @@ group { name: "e/toolbar/default/base"; mouse_events: 0; description { state: "default" 0.0; + fixed: 1 1; // aspect: 6.4 6.4; // aspect_preference: HORIZONTAL; align: 0.0 0.0; diff --git a/src/bin/e_ilist.h b/src/bin/e_ilist.h index d8847d5d6..b9314cc8d 100644 --- a/src/bin/e_ilist.h +++ b/src/bin/e_ilist.h @@ -9,10 +9,12 @@ typedef struct _E_Ilist_Item E_Ilist_Item; struct _E_Ilist_Item { void *sd; + const char *label; Evas_Object *o_base; Evas_Object *o_icon; unsigned char header : 1; unsigned char selected : 1; + unsigned char queued : 1; void (*func) (void *data, void *data2); void (*func_hilight) (void *data, void *data2); diff --git a/src/bin/e_widget_ilist.c b/src/bin/e_widget_ilist.c index 85898f71a..81bbd3285 100644 --- a/src/bin/e_widget_ilist.c +++ b/src/bin/e_widget_ilist.c @@ -3,6 +3,8 @@ */ #include "e.h" +typedef struct _E_Widget_Queue_Item E_Widget_Queue_Item; + typedef struct _E_Widget_Data E_Widget_Data; typedef struct _E_Widget_Callback E_Widget_Callback; struct _E_Widget_Data @@ -10,6 +12,14 @@ struct _E_Widget_Data Evas_Object *o_widget, *o_scrollframe, *o_ilist; Eina_List *callbacks; char **value; + struct { + Eina_List *queue; + Ecore_Timer *timer; + int count; + + int show_nth; + int select_nth; + } queue; }; struct _E_Widget_Callback { @@ -18,6 +28,20 @@ struct _E_Widget_Callback char *value; }; +struct _E_Widget_Queue_Item +{ + int command; + Evas_Object *icon; + const char *label; + int header; + void (*func) (void *data); + void *data; + const char *val; + int relative; + int use_relative; + int item; +}; + static void _e_wid_del_hook(Evas_Object *obj); static void _e_wid_focus_hook(Evas_Object *obj); static void _e_wid_cb_scrollframe_resize(void *data, Evas *e, Evas_Object *obj, void *event_info); @@ -26,6 +50,209 @@ static void _e_wid_cb_item_hilight(void *data, void *data2); static void _e_wid_cb_selected(void *data, Evas_Object *obj, void *event_info); static void _e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info); +static int _queue_timer(void *data); +static void _queue_queue(Evas_Object *obj); +static void _queue_append(Evas_Object *obj, int command, Evas_Object *icon, const char *label, int header, void (*func) (void *data), void *data, const char *val, int relative, int use_relative, int item); +static void _queue_remove(Evas_Object *obj, E_Widget_Queue_Item *qi, int del); + +static int +_queue_timer(void *data) +{ + Evas_Object *obj; + E_Widget_Data *wd; + int num; + + obj = data; + wd = e_widget_data_get(obj); + wd->queue.timer = NULL; + e_widget_ilist_freeze(obj); + num = 0; + while (wd->queue.queue) + { + E_Widget_Queue_Item *qi; + + qi = wd->queue.queue->data; + if (qi->command == 0) + { + E_Widget_Callback *wcb, *rcb; + wcb = E_NEW(E_Widget_Callback, 1); + if (!wcb) break; + wcb->func = qi->func; + wcb->data = qi->data; + if (qi->val) wcb->value = strdup(qi->val); + wd->callbacks = eina_list_append(wd->callbacks, wcb); + if (qi->use_relative == 0) // append + e_ilist_append(wd->o_ilist, qi->icon, qi->label, qi->header, + _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb); + else if (qi->use_relative == 2) // prepend + e_ilist_prepend(wd->o_ilist, qi->icon, qi->label, qi->header, + _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb); + else if (qi->use_relative == 1) // append relative + { + rcb = eina_list_nth(wd->callbacks, qi->relative); + if (rcb) + { + wd->callbacks = eina_list_append_relative(wd->callbacks, wcb, rcb); + e_ilist_append_relative(wd->o_ilist, qi->icon, qi->label, qi->header, + _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb, qi->relative); + } + else + { + wd->callbacks = eina_list_append(wd->callbacks, wcb); + e_ilist_append(wd->o_ilist, qi->icon, qi->label, qi->header, + _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb); + } + } + else if (qi->use_relative == 3) // prepend relative + { + rcb = eina_list_nth(wd->callbacks, qi->relative); + if (rcb) + { + wd->callbacks = eina_list_prepend_relative(wd->callbacks, wcb, rcb); + e_ilist_prepend_relative(wd->o_ilist, qi->icon, qi->label, qi->header, + _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb, qi->relative); + } + else + { + wd->callbacks = eina_list_prepend(wd->callbacks, wcb); + e_ilist_prepend(wd->o_ilist, qi->icon, qi->label, qi->header, + _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb); + } + } + if (qi->icon) evas_object_show(qi->icon); + } + else if (qi->command == 1) + { + e_ilist_nth_label_set(wd->o_ilist, qi->item, qi->label); + } + else if (qi->command == 2) + { + e_ilist_nth_icon_set(wd->o_ilist, qi->item, qi->icon); + } + else if (qi->command == 3) + { + Evas_Coord x, y, w, h; + + e_ilist_nth_geometry_get(wd->o_ilist, qi->item, &x, &y, &w, &h); + if (qi->use_relative) + e_scrollframe_child_pos_set(wd->o_scrollframe, x, y); + else + e_scrollframe_child_region_show(wd->o_scrollframe, x, y, w, h); + } + else if (qi->command == 4) + { + e_ilist_selected_set(wd->o_ilist, qi->item); + } + else if (qi->command == 5) + { + if ((wd->value) && *(wd->value)) + { + free(*(wd->value)); + *(wd->value) = NULL; + } + e_ilist_unselect(wd->o_ilist); + } + else if (qi->command == 6) + { + E_Widget_Callback *wcb; + + e_ilist_remove_num(wd->o_ilist, qi->item); + if ((wcb = eina_list_nth(wd->callbacks, qi->item))) + { + if (wcb->value) free(wcb->value); + free(wcb); + wd->callbacks = eina_list_remove(wd->callbacks, wcb); + } + } + else if (qi->command == 7) + { + e_ilist_multi_select(wd->o_ilist, qi->item); + } + else if (qi->command == 8) + { + e_ilist_range_select(wd->o_ilist, qi->item); + } + _queue_remove(obj, qi, 0); + num++; + if (num >= 10) break; + } + e_widget_ilist_thaw(obj); + e_widget_ilist_go(obj); + _queue_queue(obj); + return 0; +} + +static void +_queue_queue(Evas_Object *obj) +{ + E_Widget_Data *wd; + wd = e_widget_data_get(obj); + if (!wd->queue.queue) return; + if (wd->queue.timer) return; + wd->queue.timer = ecore_timer_add(0.05, _queue_timer, obj); +} + +static void +_queue_append(Evas_Object *obj, + int command, + Evas_Object *icon, + const char *label, + int header, + void (*func) (void *data), + void *data, + const char *val, + int relative, + int use_relative, + int item) +{ + E_Widget_Data *wd; + E_Widget_Queue_Item *qi; + + wd = e_widget_data_get(obj); + qi = E_NEW(E_Widget_Queue_Item, 1); + if (!qi) return; + qi->command = command; + qi->icon = icon; + qi->label = eina_stringshare_add(label); + qi->header = header; + qi->func = func; + qi->data = data; + qi->val = eina_stringshare_add(val); + qi->relative = relative; + qi->use_relative = use_relative; + qi->item = item; + wd->queue.queue = eina_list_append(wd->queue.queue, qi); + _queue_queue(obj); +} + +static void +_queue_remove(Evas_Object *obj, E_Widget_Queue_Item *qi, int del) +{ + E_Widget_Data *wd; + + wd = e_widget_data_get(obj); + wd->queue.queue = eina_list_remove(wd->queue.queue, qi); + if (del) + { + if (qi->icon) evas_object_del(qi->icon); + } + eina_stringshare_del(qi->label); + eina_stringshare_del(qi->val); + free(qi); +} + +static void +_queue_clear(Evas_Object *obj) +{ + E_Widget_Data *wd; + + wd = e_widget_data_get(obj); + while (wd->queue.queue) + _queue_remove(obj, wd->queue.queue->data, 1); + if (wd->queue.timer) ecore_timer_del(wd->queue.timer); + wd->queue.timer = NULL; +} + /* externally accessible functions */ EAPI Evas_Object * e_widget_ilist_add(Evas *evas, int icon_w, int icon_h, char **value) @@ -86,6 +313,8 @@ e_widget_ilist_thaw(Evas_Object *obj) EAPI void e_widget_ilist_append(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data), void *data, const char *val) { + _queue_append(obj, 0, icon, label, 0, func, data, val, 0, 0, 0); +/* E_Widget_Data *wd; E_Widget_Callback *wcb; @@ -99,11 +328,14 @@ e_widget_ilist_append(Evas_Object *obj, Evas_Object *icon, const char *label, vo wd->callbacks = eina_list_append(wd->callbacks, wcb); e_ilist_append(wd->o_ilist, icon, label, 0, _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb); if (icon) evas_object_show(icon); + */ } EAPI void e_widget_ilist_append_relative(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data), void *data, const char *val, int relative) { + _queue_append(obj, 0, icon, label, 0, func, data, val, 1, relative, 0); +/* E_Widget_Data *wd; E_Widget_Callback *wcb, *rcb; @@ -128,11 +360,14 @@ e_widget_ilist_append_relative(Evas_Object *obj, Evas_Object *icon, const char * } if (icon) evas_object_show(icon); + */ } EAPI void e_widget_ilist_prepend(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data), void *data, const char *val) { + _queue_append(obj, 0, icon, label, 0, func, data, val, 2, 0, 0); +/* E_Widget_Data *wd; E_Widget_Callback *wcb; @@ -146,11 +381,14 @@ e_widget_ilist_prepend(Evas_Object *obj, Evas_Object *icon, const char *label, v wd->callbacks = eina_list_prepend(wd->callbacks, wcb); e_ilist_prepend(wd->o_ilist, icon, label, 0, _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb); if (icon) evas_object_show(icon); + */ } EAPI void e_widget_ilist_prepend_relative(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data), void *data, const char *val, int relative) { + _queue_append(obj, 0, icon, label, 0, func, data, val, 3, relative, 0); +/* E_Widget_Data *wd; E_Widget_Callback *wcb, *rcb; @@ -175,11 +413,14 @@ e_widget_ilist_prepend_relative(Evas_Object *obj, Evas_Object *icon, const char } if (icon) evas_object_show(icon); + */ } EAPI void e_widget_ilist_header_append(Evas_Object *obj, Evas_Object *icon, const char *label) { + _queue_append(obj, 0, icon, label, 1, NULL, NULL, NULL, 0, 0, 0); +/* E_Widget_Data *wd; E_Widget_Callback *wcb; @@ -190,6 +431,7 @@ e_widget_ilist_header_append(Evas_Object *obj, Evas_Object *icon, const char *la wd->callbacks = eina_list_append(wd->callbacks, wcb); e_ilist_append(wd->o_ilist, icon, label, 1, NULL, NULL, NULL, NULL); if (icon) evas_object_show(icon); + */ } EAPI void @@ -230,6 +472,7 @@ e_widget_ilist_clear(Evas_Object *obj) E_Widget_Data *wd; wd = e_widget_data_get(obj); + _queue_clear(obj); e_ilist_clear(wd->o_ilist); e_scrollframe_child_pos_set(wd->o_scrollframe, 0, 0); while (wd->callbacks) @@ -273,10 +516,13 @@ e_widget_ilist_nth_is_header(Evas_Object *obj, int n) EAPI void e_widget_ilist_nth_label_set(Evas_Object *obj, int n, const char *label) { + _queue_append(obj, 1, NULL, label, 0, NULL, NULL, NULL, 0, 0, n); +/* E_Widget_Data *wd; wd = e_widget_data_get(obj); e_ilist_nth_label_set(wd->o_ilist, n, label); + */ } EAPI const char * @@ -291,10 +537,13 @@ e_widget_ilist_nth_label_get(Evas_Object *obj, int n) EAPI void e_widget_ilist_nth_icon_set(Evas_Object *obj, int n, Evas_Object *icon) { + _queue_append(obj, 2, icon, NULL, 0, NULL, NULL, NULL, 0, 0, n); +/* E_Widget_Data *wd; wd = e_widget_data_get(obj); e_ilist_nth_icon_set(wd->o_ilist, n, icon); + */ } EAPI Evas_Object * @@ -331,6 +580,8 @@ e_widget_ilist_nth_data_get(Evas_Object *obj, int n) EAPI void e_widget_ilist_nth_show(Evas_Object *obj, int n, int top) { + _queue_append(obj, 3, NULL, NULL, 0, NULL, NULL, NULL, 0, top, n); +/* E_Widget_Data *wd; Evas_Coord x, y, w, h; @@ -340,15 +591,19 @@ e_widget_ilist_nth_show(Evas_Object *obj, int n, int top) e_scrollframe_child_pos_set(wd->o_scrollframe, x, y); else e_scrollframe_child_region_show(wd->o_scrollframe, x, y, w, h); + */ } EAPI void e_widget_ilist_selected_set(Evas_Object *obj, int n) { + _queue_append(obj, 4, NULL, NULL, 0, NULL, NULL, NULL, 0, 0, n); +/* E_Widget_Data *wd; wd = e_widget_data_get(obj); e_ilist_selected_set(wd->o_ilist, n); + */ } EAPI int @@ -390,6 +645,8 @@ e_widget_ilist_selected_count_get(Evas_Object *obj) EAPI void e_widget_ilist_unselect(Evas_Object *obj) { + _queue_append(obj, 5, NULL, NULL, 0, NULL, NULL, NULL, 0, 0, 0); +/* E_Widget_Data *wd; wd = e_widget_data_get(obj); @@ -399,11 +656,14 @@ e_widget_ilist_unselect(Evas_Object *obj) *(wd->value) = NULL; } e_ilist_unselect(wd->o_ilist); + */ } EAPI void e_widget_ilist_remove_num(Evas_Object *obj, int n) { + _queue_append(obj, 6, NULL, NULL, 0, NULL, NULL, NULL, 0, 0, n); +/* E_Widget_Data *wd; E_Widget_Callback *wcb; @@ -413,6 +673,7 @@ e_widget_ilist_remove_num(Evas_Object *obj, int n) if (wcb->value) free(wcb->value); free(wcb); wd->callbacks = eina_list_remove(wd->callbacks, wcb); + */ } EAPI void @@ -436,19 +697,25 @@ e_widget_ilist_multi_select_get(Evas_Object *obj) EAPI void e_widget_ilist_multi_select(Evas_Object *obj, int n) { + _queue_append(obj, 7, NULL, NULL, 0, NULL, NULL, NULL, 0, 0, n); +/* E_Widget_Data *wd; wd = e_widget_data_get(obj); e_ilist_multi_select(wd->o_ilist, n); + */ } EAPI void e_widget_ilist_range_select(Evas_Object *obj, int n) { + _queue_append(obj, 8, NULL, NULL, 0, NULL, NULL, NULL, 0, 0, n); +/* E_Widget_Data *wd; wd = e_widget_data_get(obj); e_ilist_range_select(wd->o_ilist, n); + */ } EAPI void @@ -473,6 +740,7 @@ _e_wid_del_hook(Evas_Object *obj) E_Widget_Data *wd; wd = e_widget_data_get(obj); + _queue_clear(obj); while (wd->callbacks) { E_Widget_Callback *wcb; diff --git a/src/modules/conf_display/e_int_config_display.c b/src/modules/conf_display/e_int_config_display.c index 745fe66f0..34efee3a8 100644 --- a/src/modules/conf_display/e_int_config_display.c +++ b/src/modules/conf_display/e_int_config_display.c @@ -308,10 +308,17 @@ _basic_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfda Ecore_X_Screen_Refresh_Rate *rt; r = e_widget_ilist_selected_get(cfdata->res_list); + if (r < 0) return; + printf("r = %i\n", res, r); res = evas_list_nth(cfdata->resolutions, r); + if (!res) return; r = e_widget_ilist_selected_get(cfdata->rate_list); + if (r < 0) return; rt = evas_list_nth(res->rates, r); + if (!rt) return; + printf("res = %i, r = %i, rt = %i\n", res, r, rt); + return (e_config->display_res_restore != cfdata->restore) || (res->size.width != cfdata->orig_size.width) || (res->size.height != cfdata->orig_size.height) || diff --git a/src/modules/illume/e_kbd_int.c b/src/modules/illume/e_kbd_int.c index 291ddfcf2..f677eca1f 100644 --- a/src/modules/illume/e_kbd_int.c +++ b/src/modules/illume/e_kbd_int.c @@ -1408,7 +1408,7 @@ _e_kbd_int_dictlist_up(E_Kbd_Int *ki) o = e_widget_ilist_add(ki->dictlist.popup->evas, 32 * e_scale, 32 * e_scale, NULL); e_widget_ilist_selector_set(o, 1); - e_ilist_freeze(o); + e_widget_ilist_freeze(o); ki->dictlist.ilist_obj = o; homedir = e_user_homedir_get();