From e06dced5ccd9aba9af257fb3fca68c3ab13157dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrico=20Tr=C3=B6ger?= Date: Sun, 4 Jun 2023 19:58:17 +0200 Subject: [PATCH 1/4] Addons: Delay updating of tasks list until document has been colorised Closes #1254. --- addons/src/ao_tasks.c | 45 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/addons/src/ao_tasks.c b/addons/src/ao_tasks.c index 398e738bd..e775775b6 100644 --- a/addons/src/ao_tasks.c +++ b/addons/src/ao_tasks.c @@ -73,6 +73,15 @@ struct _AoTasksPrivate gboolean ignore_selection_changed; }; + +typedef struct +{ + AoTasks *t; + GeanyDocument *doc; + gboolean clear; +} AoTasksUpdateTasksForDocArguments; + + enum { PROP_0, @@ -556,8 +565,12 @@ static void create_task(AoTasks *t, GeanyDocument *doc, gint line, const gchar * } -static void update_tasks_for_doc(AoTasks *t, GeanyDocument *doc) +static gboolean update_tasks_for_doc_idle_cb(gpointer data) { + AoTasksUpdateTasksForDocArguments *arguments = data; + AoTasks *t = arguments->t; + GeanyDocument *doc = arguments->doc; + gboolean clear = arguments->clear; gint lexer, lines, line, last_pos = 0, style; gchar *line_buf, *display_name, *task_start, *closing_comment = NULL; gchar **token; @@ -565,6 +578,9 @@ static void update_tasks_for_doc(AoTasks *t, GeanyDocument *doc) if (doc->is_valid) { + if (clear) + ao_tasks_remove(t, doc); + display_name = document_get_basename_for_display(doc, -1); lexer = sci_get_lexer(doc->editor->sci); lines = sci_get_line_count(doc->editor->sci); @@ -603,6 +619,28 @@ static void update_tasks_for_doc(AoTasks *t, GeanyDocument *doc) } g_free(display_name); } + return FALSE; +} + + +static void free_update_tasks_for_doc_arguments(gpointer data) +{ + AoTasksUpdateTasksForDocArguments *arguments = data; + g_slice_free1(sizeof *arguments, arguments); +} + + +static void update_tasks_for_doc(AoTasks *t, GeanyDocument *doc, gboolean clear) +{ + AoTasksUpdateTasksForDocArguments *arguments = g_slice_alloc(sizeof *arguments); + arguments->t = t; + arguments->doc = doc; + arguments->clear = clear; + + /* Check for task tokens in an idle callback to wait until Geany applied Scintilla highlighting + * styles as we need them to be set before checking for tasks. */ + g_idle_add_full(G_PRIORITY_LOW, update_tasks_for_doc_idle_cb, arguments, + free_update_tasks_for_doc_arguments); } @@ -688,8 +726,7 @@ void ao_tasks_update(AoTasks *t, GeanyDocument *cur_doc) if (cur_doc != NULL) { /* TODO handle renaming of files, probably we need a new signal for this */ - ao_tasks_remove(t, cur_doc); - update_tasks_for_doc(t, cur_doc); + update_tasks_for_doc(t, cur_doc, TRUE); } else { @@ -699,7 +736,7 @@ void ao_tasks_update(AoTasks *t, GeanyDocument *cur_doc) /* iterate over all docs */ foreach_document(i) { - update_tasks_for_doc(t, documents[i]); + update_tasks_for_doc(t, documents[i], FALSE); } } /* restore selection */ From d6cb2c252b314088dd1ae99bacb1a55794098c79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrico=20Tr=C3=B6ger?= Date: Sat, 10 Jun 2023 09:42:22 +0200 Subject: [PATCH 2/4] Add more sanity checks --- addons/src/ao_tasks.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/addons/src/ao_tasks.c b/addons/src/ao_tasks.c index e775775b6..96046eefd 100644 --- a/addons/src/ao_tasks.c +++ b/addons/src/ao_tasks.c @@ -576,7 +576,7 @@ static gboolean update_tasks_for_doc_idle_cb(gpointer data) gchar **token; AoTasksPrivate *priv = AO_TASKS_GET_PRIVATE(t); - if (doc->is_valid) + if (doc->is_valid && priv->active && priv->enable_tasks) { if (clear) ao_tasks_remove(t, doc); @@ -637,6 +637,9 @@ static void update_tasks_for_doc(AoTasks *t, GeanyDocument *doc, gboolean clear) arguments->doc = doc; arguments->clear = clear; + if (!doc->is_valid) + return; + /* Check for task tokens in an idle callback to wait until Geany applied Scintilla highlighting * styles as we need them to be set before checking for tasks. */ g_idle_add_full(G_PRIORITY_LOW, update_tasks_for_doc_idle_cb, arguments, From d975ce3f6c1a8e03d94ceb73bfc635b84bf2a1cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrico=20Tr=C3=B6ger?= Date: Sat, 10 Jun 2023 09:47:50 +0200 Subject: [PATCH 3/4] Add more sanity checks --- addons/src/ao_tasks.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/addons/src/ao_tasks.c b/addons/src/ao_tasks.c index 96046eefd..b7a0f9ed2 100644 --- a/addons/src/ao_tasks.c +++ b/addons/src/ao_tasks.c @@ -568,18 +568,22 @@ static void create_task(AoTasks *t, GeanyDocument *doc, gint line, const gchar * static gboolean update_tasks_for_doc_idle_cb(gpointer data) { AoTasksUpdateTasksForDocArguments *arguments = data; - AoTasks *t = arguments->t; - GeanyDocument *doc = arguments->doc; - gboolean clear = arguments->clear; + AoTasksPrivate *priv; + GeanyDocument *doc; gint lexer, lines, line, last_pos = 0, style; gchar *line_buf, *display_name, *task_start, *closing_comment = NULL; gchar **token; - AoTasksPrivate *priv = AO_TASKS_GET_PRIVATE(t); + + if (! arguments) + return FALSE; + + priv = AO_TASKS_GET_PRIVATE(arguments->t); + doc = arguments->doc; if (doc->is_valid && priv->active && priv->enable_tasks) { - if (clear) - ao_tasks_remove(t, doc); + if (arguments->clear) + ao_tasks_remove(arguments->t, doc); display_name = document_get_basename_for_display(doc, -1); lexer = sci_get_lexer(doc->editor->sci); @@ -610,7 +614,7 @@ static gboolean update_tasks_for_doc_idle_cb(gpointer data) (closing_comment = strstr(task_start, doc->file_type->comment_close)) != NULL) *closing_comment = '\0'; /* create the task */ - create_task(t, doc, line, *token, line_buf, task_start, display_name); + create_task(arguments->t, doc, line, *token, line_buf, task_start, display_name); /* if we found a token, continue on next line */ break; } From b1ba03c3edc70677df578ee7282456e38f965af5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrico=20Tr=C3=B6ger?= Date: Tue, 1 Aug 2023 23:08:41 +0200 Subject: [PATCH 4/4] Use DOC_VALID macro across the Addons plugin --- addons/src/addons.c | 16 ++++++++-------- addons/src/ao_tasks.c | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/addons/src/addons.c b/addons/src/addons.c index 638fd013a..8dac0bf7e 100644 --- a/addons/src/addons.c +++ b/addons/src/addons.c @@ -137,7 +137,7 @@ static gboolean ao_editor_notify_cb(GObject *object, GeanyEditor *editor, static void ao_update_editor_menu_cb(GObject *obj, const gchar *word, gint pos, GeanyDocument *doc, gpointer data) { - g_return_if_fail(doc != NULL && doc->is_valid); + g_return_if_fail(DOC_VALID(doc)); ao_open_uri_update_menu(ao_info->openuri, doc, pos); } @@ -145,7 +145,7 @@ static void ao_update_editor_menu_cb(GObject *obj, const gchar *word, gint pos, static void ao_document_activate_cb(GObject *obj, GeanyDocument *doc, gpointer data) { - g_return_if_fail(doc != NULL && doc->is_valid); + g_return_if_fail(DOC_VALID(doc)); ao_bookmark_list_update(ao_info->bookmarklist, doc); ao_tasks_update_single(ao_info->tasks, doc); @@ -154,7 +154,7 @@ static void ao_document_activate_cb(GObject *obj, GeanyDocument *doc, gpointer d static void ao_document_new_cb(GObject *obj, GeanyDocument *doc, gpointer data) { - g_return_if_fail(doc != NULL && doc->is_valid); + g_return_if_fail(DOC_VALID(doc)); ao_mark_document_new(ao_info->markword, doc); ao_color_tip_document_new(ao_info->colortip, doc); @@ -163,7 +163,7 @@ static void ao_document_new_cb(GObject *obj, GeanyDocument *doc, gpointer data) static void ao_document_open_cb(GObject *obj, GeanyDocument *doc, gpointer data) { - g_return_if_fail(doc != NULL && doc->is_valid); + g_return_if_fail(DOC_VALID(doc)); ao_tasks_update(ao_info->tasks, doc); ao_mark_document_open(ao_info->markword, doc); @@ -173,7 +173,7 @@ static void ao_document_open_cb(GObject *obj, GeanyDocument *doc, gpointer data) static void ao_document_close_cb(GObject *obj, GeanyDocument *doc, gpointer data) { - g_return_if_fail(doc != NULL && doc->is_valid); + g_return_if_fail(DOC_VALID(doc)); ao_tasks_remove(ao_info->tasks, doc); ao_mark_document_close(ao_info->markword, doc); @@ -183,7 +183,7 @@ static void ao_document_close_cb(GObject *obj, GeanyDocument *doc, gpointer data static void ao_document_save_cb(GObject *obj, GeanyDocument *doc, gpointer data) { - g_return_if_fail(doc != NULL && doc->is_valid); + g_return_if_fail(DOC_VALID(doc)); ao_tasks_update(ao_info->tasks, doc); } @@ -191,7 +191,7 @@ static void ao_document_save_cb(GObject *obj, GeanyDocument *doc, gpointer data) static void ao_document_before_save_cb(GObject *obj, GeanyDocument *doc, gpointer data) { - g_return_if_fail(doc != NULL && doc->is_valid); + g_return_if_fail(DOC_VALID(doc)); ao_blanklines_on_document_before_save(obj, doc, data); } @@ -199,7 +199,7 @@ static void ao_document_before_save_cb(GObject *obj, GeanyDocument *doc, gpointe static void ao_document_reload_cb(GObject *obj, GeanyDocument *doc, gpointer data) { - g_return_if_fail(doc != NULL && doc->is_valid); + g_return_if_fail(DOC_VALID(doc)); ao_tasks_update(ao_info->tasks, doc); } diff --git a/addons/src/ao_tasks.c b/addons/src/ao_tasks.c index b7a0f9ed2..0cee91ec9 100644 --- a/addons/src/ao_tasks.c +++ b/addons/src/ao_tasks.c @@ -580,7 +580,7 @@ static gboolean update_tasks_for_doc_idle_cb(gpointer data) priv = AO_TASKS_GET_PRIVATE(arguments->t); doc = arguments->doc; - if (doc->is_valid && priv->active && priv->enable_tasks) + if (DOC_VALID(doc) && priv->active && priv->enable_tasks) { if (arguments->clear) ao_tasks_remove(arguments->t, doc); @@ -641,7 +641,7 @@ static void update_tasks_for_doc(AoTasks *t, GeanyDocument *doc, gboolean clear) arguments->doc = doc; arguments->clear = clear; - if (!doc->is_valid) + if (!DOC_VALID(doc)) return; /* Check for task tokens in an idle callback to wait until Geany applied Scintilla highlighting