editor: Use a separate thread to save.
Move elm_code_file_save into a thread. Else we can block the UI.
This commit is contained in:
parent
2e4a141c98
commit
90af33f893
|
@ -178,6 +178,63 @@ _edi_editor_file_change_popup(Evas_Object *parent, Edi_Editor *editor)
|
||||||
evas_object_show(editor->popup);
|
evas_object_show(editor->popup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
Edi_Editor *editor;
|
||||||
|
Elm_Code *code;
|
||||||
|
} Async_Save;
|
||||||
|
|
||||||
|
static void
|
||||||
|
_async_save_thread_end_cb(void *data, Ecore_Thread *thread EINA_UNUSED)
|
||||||
|
{
|
||||||
|
Edi_Editor *editor;
|
||||||
|
Async_Save *async_save = data;
|
||||||
|
|
||||||
|
editor = async_save->editor;
|
||||||
|
|
||||||
|
if (edi_language_provider_has(editor))
|
||||||
|
edi_language_provider_get(editor)->refresh(editor);
|
||||||
|
|
||||||
|
editor->save_thread = NULL;
|
||||||
|
|
||||||
|
free(async_save);
|
||||||
|
|
||||||
|
ecore_event_add(EDI_EVENT_FILE_SAVED, NULL, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_async_save_thread_run_cb(void *data, Ecore_Thread *thread EINA_UNUSED)
|
||||||
|
{
|
||||||
|
Elm_Code *code;
|
||||||
|
Edi_Editor *editor;
|
||||||
|
Async_Save *async_save = data;
|
||||||
|
|
||||||
|
editor = async_save->editor;
|
||||||
|
code = async_save->code;
|
||||||
|
|
||||||
|
elm_code_file_save(code->file);
|
||||||
|
|
||||||
|
editor->save_time = ecore_file_mod_time(elm_code_file_path_get(code->file));
|
||||||
|
editor->modified = EINA_FALSE;
|
||||||
|
|
||||||
|
if (editor->save_timer)
|
||||||
|
{
|
||||||
|
ecore_timer_del(editor->save_timer);
|
||||||
|
editor->save_timer = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_edi_editor_async_save(Edi_Editor *editor, Elm_Code *code)
|
||||||
|
{
|
||||||
|
Async_Save *async_save = calloc(1, sizeof(Async_Save));
|
||||||
|
if (!async_save) return;
|
||||||
|
|
||||||
|
async_save->editor = editor;
|
||||||
|
async_save->code = code;
|
||||||
|
|
||||||
|
editor->save_thread = ecore_thread_run(_async_save_thread_run_cb, _async_save_thread_end_cb, _async_save_thread_end_cb, async_save);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
edi_editor_save(Edi_Editor *editor)
|
edi_editor_save(Edi_Editor *editor)
|
||||||
{
|
{
|
||||||
|
@ -187,8 +244,10 @@ edi_editor_save(Edi_Editor *editor)
|
||||||
if (!editor->modified)
|
if (!editor->modified)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
code = elm_code_widget_code_get(editor->entry);
|
if (editor->save_thread)
|
||||||
|
return;
|
||||||
|
|
||||||
|
code = elm_code_widget_code_get(editor->entry);
|
||||||
filename = elm_code_file_path_get(code->file);
|
filename = elm_code_file_path_get(code->file);
|
||||||
|
|
||||||
// TODO: elm_code_file_save() should handle this.
|
// TODO: elm_code_file_save() should handle this.
|
||||||
|
@ -198,22 +257,7 @@ edi_editor_save(Edi_Editor *editor)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
elm_code_file_save(code->file);
|
_edi_editor_async_save(editor, code);
|
||||||
|
|
||||||
editor->save_time = ecore_file_mod_time(filename);
|
|
||||||
|
|
||||||
editor->modified = EINA_FALSE;
|
|
||||||
|
|
||||||
if (editor->save_timer)
|
|
||||||
{
|
|
||||||
ecore_timer_del(editor->save_timer);
|
|
||||||
editor->save_timer = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (edi_language_provider_has(editor))
|
|
||||||
edi_language_provider_get(editor)->refresh(editor);
|
|
||||||
|
|
||||||
ecore_event_add(EDI_EVENT_FILE_SAVED, NULL, NULL, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
|
|
|
@ -63,6 +63,8 @@ struct _Edi_Editor
|
||||||
|
|
||||||
Ecore_Thread *highlight_thread;
|
Ecore_Thread *highlight_thread;
|
||||||
Eina_Bool highlight_cancel;
|
Eina_Bool highlight_cancel;
|
||||||
|
|
||||||
|
Ecore_Thread *save_thread;
|
||||||
time_t save_time;
|
time_t save_time;
|
||||||
|
|
||||||
const char *mimetype;
|
const char *mimetype;
|
||||||
|
|
Loading…
Reference in New Issue