netstar pushed a commit to branch master. http://git.enlightenment.org/tools/edi.git/commit/?id=9cad93b64ff7c4b43aa8b3b501c9d4c4003dc549
commit 9cad93b64ff7c4b43aa8b3b501c9d4c4003dc549 Author: Al Poole <[email protected]> Date: Sat Sep 30 19:51:28 2017 +0100 edi_scm: refactor code and use threads. Refactor and use a thread so we don't lock up the UI. --- src/bin/edi_scm_ui.c | 147 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 97 insertions(+), 50 deletions(-) diff --git a/src/bin/edi_scm_ui.c b/src/bin/edi_scm_ui.c index b78771e..e8f45c0 100644 --- a/src/bin/edi_scm_ui.c +++ b/src/bin/edi_scm_ui.c @@ -15,16 +15,15 @@ typedef struct _Edi_Scm_Ui { Evas_Object *commit_entry; Eio_Monitor *monitor; - Elm_Code *code; - const char *workdir; + Elm_Code *code; + const char *workdir; Eina_Bool results_max; Eina_Bool is_configured; + Eina_Bool in_progress; } Edi_Scm_Ui; -static void _edi_scm_ui_refresh(Edi_Scm_Ui *); - const char * _edi_scm_ui_avatar_cache_path_get(const char *email) { @@ -156,32 +155,6 @@ _edi_scm_ui_screens_commit_cb(void *data, elm_exit(); } -static void -_entry_lines_append(Elm_Code *code, char *text) -{ - char *pos = text; - char *start, *end = NULL; - - if (!*pos) return; - - start = pos; - while (*pos++ != '\0') - { - if (*pos == '\n') - end = pos; - - if (start && end) - { - elm_code_file_line_append(code->file, start, end - start, NULL); - start = end + 1; - end = NULL; - } - } - end = pos; - if (end > start) - elm_code_file_line_append(code->file, start, end - start, NULL); -} - static const char * _icon_status(Edi_Scm_Status_Code code) { @@ -235,7 +208,7 @@ static Evas_Object * _content_get(void *data, Evas_Object *obj, const char *source) { Evas_Object *box, *lbox, *mbox, *rbox, *label, *ic; - const char *text, *icon_name, *icon_status, *mime; + const char *text, *icon_file, *icon_status, *mime; Edi_Scm_Status *status; if (strcmp(source, "elm.swallow.content")) @@ -243,14 +216,12 @@ _content_get(void *data, Evas_Object *obj, const char *source) status = (Edi_Scm_Status *) data; - icon_status = _icon_status(status->change); - mime = efreet_mime_type_get(status->fullpath); if (mime) - icon_name = efreet_mime_type_icon_get(mime, elm_config_icon_theme_get(), 32); + icon_file = efreet_mime_type_icon_get(mime, elm_config_icon_theme_get(), 32); - if (!icon_name) - icon_name = "dialog-information"; + if (!icon_file) + icon_file = "dialog-information"; box = elm_box_add(obj); elm_box_horizontal_set(box, EINA_TRUE); @@ -262,7 +233,7 @@ _content_get(void *data, Evas_Object *obj, const char *source) evas_object_show(lbox); ic = elm_icon_add(lbox); - elm_icon_standard_set(ic, icon_name); + elm_icon_standard_set(ic, icon_file); evas_object_size_hint_min_set(ic, ELM_SCALE_SIZE(16), ELM_SCALE_SIZE(16)); evas_object_show(ic); elm_box_pack_end(lbox, ic); @@ -282,6 +253,7 @@ _content_get(void *data, Evas_Object *obj, const char *source) elm_box_padding_set(rbox, 5, 0); evas_object_show(rbox); + icon_status = _icon_status(status->change); if (icon_status) { ic = elm_icon_add(rbox); @@ -377,9 +349,78 @@ _edi_scm_ui_status_list_fill(Edi_Scm_Ui *edi_scm) } static void -_edi_scm_ui_refresh(Edi_Scm_Ui *edi_scm) +_entry_lines_append(Ecore_Thread *thread, Elm_Code *code, char *text) +{ + char *pos = text; + char *start, *end = NULL; + + if (!*pos) return; + + start = pos; + while (*pos++ != '\0') + { + if (*pos == '\n') + end = pos; + + if (start && end) + { + ecore_thread_main_loop_begin(); + elm_code_file_line_append(code->file, start, end - start, NULL); + ecore_thread_main_loop_end(); + start = end + 1; + end = NULL; + if (ecore_thread_check(thread)) + return; + } + } + + end = pos; + + if (end > start) + { + ecore_thread_main_loop_begin(); + elm_code_file_line_append(code->file, start, end - start, NULL); + ecore_thread_main_loop_end(); + } +} + +static void +_edi_scm_diff_thread_cancel_cb(void *data, Ecore_Thread *thread) +{ + Edi_Scm_Ui *edi_scm = data; + while ((ecore_thread_wait(thread, 0.1)) != EINA_TRUE); + edi_scm->in_progress = EINA_FALSE; + elm_exit(); +} + +static void +_edi_scm_diff_thread_end_cb(void *data, Ecore_Thread *thread EINA_UNUSED) +{ + Edi_Scm_Ui *edi_scm = data; + + edi_scm->in_progress = EINA_FALSE; +} + +static void +_edi_scm_diff_thread_cb(void *data, Ecore_Thread *thread) { char *text; + Edi_Scm_Ui *edi_scm = data; + + if (edi_scm->in_progress) return; + + text = edi_scm_diff(!edi_scm->results_max); + + edi_scm->in_progress = EINA_TRUE; + + _entry_lines_append(thread, edi_scm->code, text); + + free(text); +} + +static void +_edi_scm_ui_refresh(Edi_Scm_Ui *edi_scm) +{ Eina_Bool staged; edi_scm->results_max = elm_check_state_get(edi_scm->check); @@ -402,9 +443,7 @@ _edi_scm_ui_refresh(Edi_Scm_Ui *edi_scm) elm_genlist_realized_items_update(edi_scm->list); - text = edi_scm_diff(!edi_scm->results_max); - _entry_lines_append(edi_scm->code, text); - free(text); + ecore_thread_run(_edi_scm_diff_thread_cb, _edi_scm_diff_thread_end_cb, _edi_scm_diff_thread_cancel_cb, edi_scm); } static void @@ -431,21 +470,21 @@ edi_scm_ui_add(Evas_Object *parent) { Evas_Object *box, *frame, *hbox, *cbox, *label, *avatar, *input, *button; Evas_Object *table, *rect, *list, *pbox, *check, *sep; + Evas_Object *logo; Elm_Code_Widget *entry; Elm_Code *code; Eina_Strbuf *string; Edi_Scm_Engine *engine; Edi_Scm_Ui *edi_scm; const char *remote_name, *remote_email; - char *text; Eina_Bool staged_changes; if (!edi_scm_generic_init()) - exit(1 << 2); + exit(1 << 0); engine = edi_scm_engine_get(); if (!engine) - exit(1 << 3); + exit(1 << 1); edi_scm = calloc(1, sizeof(Edi_Scm_Ui)); edi_scm->workdir = engine->workdir; @@ -478,10 +517,20 @@ edi_scm_ui_add(Evas_Object *parent) evas_object_size_hint_align_set(hbox, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(hbox); + logo = elm_image_add(parent); + string = eina_strbuf_new(); + eina_strbuf_append_printf(string, "%s/images/welcome.png", PACKAGE_DATA_DIR); + elm_image_file_set(logo, eina_strbuf_string_get(string), NULL); + evas_object_size_hint_min_set(logo, 48 * elm_config_scale_get(), 48 * elm_config_scale_get()); + evas_object_size_hint_weight_set(logo, 0.1, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(logo, 1.0, EVAS_HINT_FILL); + evas_object_show(logo); + elm_box_pack_end(hbox, logo); + /* General information*/ label = elm_label_add(hbox); - evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, 1.0); evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(label); elm_box_pack_end(hbox, label); @@ -496,11 +545,11 @@ edi_scm_ui_add(Evas_Object *parent) remote_name = engine->remote_name_get(); remote_email = engine->remote_email_get(); - string = eina_strbuf_new(); + eina_strbuf_reset(string); if (!remote_name[0] && !remote_email[0]) { - eina_strbuf_append(string, _("<hilight>Unable to obtain user information.</hilight>")); + eina_strbuf_append(string, _("Unable to obtain user information.")); } else { @@ -629,9 +678,7 @@ edi_scm_ui_add(Evas_Object *parent) evas_object_show(entry); elm_box_pack_end(cbox, entry); - text = edi_scm_diff(EINA_TRUE); - _entry_lines_append(code, text); - free(text); + ecore_thread_run(_edi_scm_diff_thread_cb, _edi_scm_diff_thread_end_cb, _edi_scm_diff_thread_cancel_cb, edi_scm); sep = elm_separator_add(parent); elm_separator_horizontal_set(sep, EINA_TRUE); --
