Revision: 1323 http://svn.sourceforge.net/geany/?rev=1323&view=rev Author: ntrel Date: 2007-02-23 05:26:06 -0800 (Fri, 23 Feb 2007)
Log Message: ----------- Speed up loading multiple C-like files when restoring session or loading command-line files at startup by ensuring documents are only colourised once. Also prevent re-colourising C-like documents after saving a file unless the list of typenames has changed. Add document_delay_colourise(), document_colourise_all().
Modified Paths: -------------- trunk/ChangeLog trunk/src/document.c trunk/src/document.h trunk/src/keyfile.c trunk/src/main.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2007-02-23 12:49:27 UTC (rev 1322) +++ trunk/ChangeLog 2007-02-23 13:26:06 UTC (rev 1323) @@ -1,3 +1,14 @@ +2007-02-23 Nick Treleaven nick.treleaven@btinternet.com + + * src/keyfile.c, src/document.c, src/document.h, src/main.c: + Speed up loading multiple C-like files when restoring session or + loading command-line files at startup by ensuring documents are + only colourised once. + Also prevent re-colourising C-like documents after saving a file + unless the list of typenames has changed. + Add document_delay_colourise(), document_colourise_all(). + + 2007-02-20 Enrico Troeger enrico.troeger@uvena.de
* src/sci_cb.c, src/sci_cb.c:
Modified: trunk/src/document.c =================================================================== --- trunk/src/document.c 2007-02-23 12:49:27 UTC (rev 1322) +++ trunk/src/document.c 2007-02-23 13:26:06 UTC (rev 1323) @@ -64,7 +64,11 @@ /* dynamic array of document elements to hold all information of the notebook tabs */ GArray *doc_array;
+/* Whether to colourise the document straight after styling settings are changed. + * (e.g. when filetype is set or typenames are updated) */ +static gboolean delay_colourise = FALSE;
+ /* Returns -1 if no text found or the new range endpoint after replacing. */ static gint document_replace_range(gint idx, const gchar *find_text, const gchar *replace_text, @@ -73,6 +77,7 @@ static void document_undo_clear(gint idx); static void document_redo_add(gint idx, guint type, gpointer data);
+static gboolean update_type_keywords(ScintillaObject *sci);
/* returns the index of the notebook page which has the given filename @@ -1400,16 +1405,28 @@ }
-/* Returns: whether sci_colourise has been called for sci */ +/* Returns: TRUE if any scintilla type keywords were updated. + * sci can be NULL to update if necessary (non-NULL can save time if only one + * document was changed) */ static gboolean update_type_keywords(ScintillaObject *sci) { gboolean ret = FALSE;
- if (sci_cb_lexer_get_type_keyword_idx(sci_get_lexer(sci)) != -1) + if (sci == NULL || sci_cb_lexer_get_type_keyword_idx(sci_get_lexer(sci)) != -1) { guint n; + static GString *last_typenames = NULL; GString *s = get_project_typenames();
+ if (s && last_typenames && g_string_equal(s, last_typenames)) + { + g_string_free(s, TRUE); + return FALSE; // avoid unnecessary recolourising + } + // keep typename list for next time + if (last_typenames) + g_string_free(last_typenames, TRUE); + last_typenames = s; if (s == NULL) return FALSE;
for (n = 0; n < doc_array->len; n++) @@ -1423,13 +1440,14 @@ if (keyword_idx > 0) { sci_set_keywords(wid, keyword_idx, s->str); - sci_colourise(wid, 0, -1); - if (sci == wid) - ret = TRUE; + if (! delay_colourise) + { + sci_colourise(wid, 0, -1); + } + ret = TRUE; } } } - g_string_free(s, TRUE); } return ret; } @@ -1461,9 +1479,11 @@ }
document_update_tag_list(idx, TRUE); - colourise &= ! update_type_keywords(doc_list[idx].sci); - if (colourise) - sci_colourise(doc_list[idx].sci, 0, -1); + if (! delay_colourise) + { + if (colourise && ! update_type_keywords(doc_list[idx].sci)) + sci_colourise(doc_list[idx].sci, 0, -1); + } }
@@ -1965,3 +1985,33 @@ return DOC_IDX_VALID(idx) ? &doc_list[idx] : NULL; } #endif + + +void document_delay_colourise() +{ + g_return_if_fail(delay_colourise == FALSE); + + delay_colourise = TRUE; +} + + +void document_colourise_all() +{ + guint n; + + g_return_if_fail(delay_colourise == TRUE); + + // update typenames if necessary + update_type_keywords(NULL); + + for (n = 0; n < doc_array->len; n++) + { + ScintillaObject *sci = doc_list[n].sci; + + if (sci) + sci_colourise(sci, 0, -1); + } + delay_colourise = FALSE; +} + +
Modified: trunk/src/document.h =================================================================== --- trunk/src/document.h 2007-02-23 12:49:27 UTC (rev 1322) +++ trunk/src/document.h 2007-02-23 13:26:06 UTC (rev 1323) @@ -230,4 +230,9 @@
GdkColor *document_get_status(gint idx);
+ +void document_delay_colourise(); + +void document_colourise_all(); + #endif
Modified: trunk/src/keyfile.c =================================================================== --- trunk/src/keyfile.c 2007-02-23 12:49:27 UTC (rev 1322) +++ trunk/src/keyfile.c 2007-02-23 13:26:06 UTC (rev 1323) @@ -501,6 +501,8 @@ guint x, pos, y, len; gboolean ret = FALSE, failure = FALSE;
+ document_delay_colourise(); + i = app->tab_order_ltr ? 0 : (session_files->len - 1); while (TRUE) { @@ -561,6 +563,7 @@ if (i < 0) break; } } + document_colourise_all();
g_ptr_array_free(session_files, TRUE); if (failure)
Modified: trunk/src/main.c =================================================================== --- trunk/src/main.c 2007-02-23 12:49:27 UTC (rev 1322) +++ trunk/src/main.c 2007-02-23 13:26:06 UTC (rev 1323) @@ -490,6 +490,8 @@
if (argc <= 1) return FALSE;
+ document_delay_colourise(); + for(i = 1; i < argc; i++) { gchar *filename = get_argv_filename(argv[i]); @@ -522,6 +524,7 @@ } g_free(filename); } + document_colourise_all(); return TRUE; }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.