Update syntax highlighting to run in the background.

Hook the highlight runner into ctrl-s so you can get it to re-parse appropriately (this will be slicker with elm_code)
This commit is contained in:
Andy Williams 2014-11-30 16:25:11 +00:00
parent 5d858c938b
commit 6fd2aed6f1
1 changed files with 30 additions and 7 deletions

View File

@ -58,6 +58,9 @@ Evas_Textblock_Cursor *_format_cursor;
static void
_update_lines(Edi_Editor *editor);
static void
_update_highlight(Edi_Editor *editor);
static void
_undo_do(Edi_Editor *editor, Elm_Entry_Change_Info *inf)
{
@ -170,6 +173,7 @@ _smart_cb_key_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
else if (!strcmp(ev->key, "s"))
{
edi_mainview_save();
_update_highlight(editor);
}
else if (!strcmp(ev->key, "f"))
{
@ -287,6 +291,8 @@ _edi_editor_statusbar_add(Evas_Object *panel, Edi_Editor *editor, Edi_Mainview_I
static void
_edi_range_color_set(Edi_Editor *editor EINA_UNUSED, Edi_Range range, Edi_Color color)
{
ecore_thread_main_loop_begin();
evas_textblock_cursor_line_set(_format_cursor, range.start.line - 1);
evas_textblock_cursor_pos_set(_format_cursor, evas_textblock_cursor_pos_get(_format_cursor) + range.start.col - 1);
evas_textblock_cursor_format_prepend(_format_cursor, color);
@ -294,6 +300,8 @@ _edi_range_color_set(Edi_Editor *editor EINA_UNUSED, Edi_Range range, Edi_Color
evas_textblock_cursor_line_set(_format_cursor, range.end.line - 1);
evas_textblock_cursor_pos_set(_format_cursor, evas_textblock_cursor_pos_get(_format_cursor) + range.end.col - 1);
evas_textblock_cursor_format_append(_format_cursor, "</color>");
ecore_thread_main_loop_end();
}
static void
@ -505,12 +513,14 @@ _clang_load_errors(const char *path EINA_UNUSED, Edi_Editor *editor)
}
}
static void
_edi_clang_setup(Edi_Editor *editor)
static void *
_edi_clang_setup(void *data)
{
Edi_Editor *editor;
Evas_Object *textblock;
const char *path;
editor = (Edi_Editor *)data;
elm_entry_file_get(editor->entry, &path, NULL);
/* Clang */
@ -528,6 +538,8 @@ _edi_clang_setup(Edi_Editor *editor)
_clang_load_errors(path, editor);
_clang_load_highlighting(path, editor);
evas_textblock_cursor_free(_format_cursor);
return NULL;
}
/*
@ -540,15 +552,27 @@ _edi_clang_dispose(Edi_Editor *editor)
*/
#endif
static void
_update_highlight(Edi_Editor *editor)
{
#if HAVE_LIBCLANG
pthread_attr_t attr;
pthread_t thread_id;
if (pthread_attr_init(&attr) != 0)
perror("pthread_attr_init");
if (pthread_create(&thread_id, &attr, _edi_clang_setup, editor) != 0)
perror("pthread_create");
#endif
}
static void
_text_set_done(void *data, Evas_Object *obj EINA_UNUSED, void *source EINA_UNUSED)
{
Edi_Editor *editor = (Edi_Editor *) data;
#if HAVE_LIBCLANG
_edi_clang_setup(editor);
#endif
_update_lines(editor);
_update_highlight(editor);
}
EAPI Evas_Object *edi_editor_add(Evas_Object *parent, Edi_Mainview_Item *item)
@ -634,7 +658,6 @@ EAPI Evas_Object *edi_editor_add(Evas_Object *parent, Edi_Mainview_Item *item)
(void)!evas_object_key_grab(txt, "z", ctrl, shift | alt, 1);
evas_object_data_set(vbox, "editor", editor);
_update_lines(editor);
return vbox;
}