Revision: 2717 http://geany.svn.sourceforge.net/geany/?rev=2717&view=rev Author: ntrel Date: 2008-06-20 05:34:13 -0700 (Fri, 20 Jun 2008)
Log Message: ----------- Don't colourise any documents until they need to be drawn. This should make Save All faster for filetypes that support typename highlighting, and makes the document_delay_colourise(), document_colourise_all() functions redundant (they'll be removed in the next commit). Note: I'll move on_editor_expose_event() to editor.c.
Modified Paths: -------------- trunk/ChangeLog trunk/src/document.c trunk/src/documentprivate.h
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2008-06-19 17:42:40 UTC (rev 2716) +++ trunk/ChangeLog 2008-06-20 12:34:13 UTC (rev 2717) @@ -1,3 +1,14 @@ +2008-06-20 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com> + + * src/document.c, src/documentprivate.h: + Don't colourise any documents until they need to be drawn. This + should make Save All faster for filetypes that support typename + highlighting, and makes the document_delay_colourise(), + document_colourise_all() functions redundant (they'll be removed in + the next commit). + Note: I'll move on_editor_expose_event() to editor.c. + + 2008-06-19 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
* src/dialogs.c, src/dialogs.c:
Modified: trunk/src/document.c =================================================================== --- trunk/src/document.c 2008-06-19 17:42:40 UTC (rev 2716) +++ trunk/src/document.c 2008-06-20 12:34:13 UTC (rev 2717) @@ -88,17 +88,10 @@ } undo_action;
-/* 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; - - static void document_undo_clear(GeanyDocument *doc); static void document_redo_add(GeanyDocument *doc, guint type, gpointer data);
-static gboolean update_type_keywords(ScintillaObject *sci, gint lang);
- /* ignore the case of filenames and paths under WIN32, causes errors if not */ #ifdef G_OS_WIN32 #define filenamecmp(a,b) strcasecmp((a), (b)) @@ -409,6 +402,44 @@ }
+static void queue_colourise(GeanyDocument *doc) +{ + /* Colourise the editor before it is next drawn */ + DOCUMENT(doc)->colourise_needed = TRUE; + + /* If the editor doesn't need drawing (e.g. after saving the current + * document), we need to force a redraw, so the expose event is triggered. + * This ensures we don't start colourising before all documents are opened/saved, + * only once the editor is drawn. */ + gtk_widget_queue_draw(GTK_WIDGET(doc->sci)); +} + + +static void editor_colourise(ScintillaObject *sci) +{ + sci_colourise(sci, 0, -1); + + /* now that the current document is colourised, fold points are now accurate, + * so force an update of the current function/tag. */ + utils_get_current_function(NULL, NULL); + ui_update_statusbar(NULL, -1); +} + + +static gboolean on_editor_expose_event(GtkWidget *widget, GdkEventExpose *event, + gpointer user_data) +{ + GeanyDocument *doc = user_data; + + if (DOCUMENT(doc)->colourise_needed) + { + editor_colourise(doc->sci); + DOCUMENT(doc)->colourise_needed = FALSE; + } + return FALSE; /* propagate event */ +} + + /* Create new editor (the scintilla widget) */ static ScintillaObject *create_new_sci(GeanyDocument *doc) { @@ -446,6 +477,8 @@ g_signal_connect(G_OBJECT(sci), "scroll-event", G_CALLBACK(on_editor_scroll_event), doc); g_signal_connect(G_OBJECT(sci), "motion-notify-event", G_CALLBACK(on_motion_event), NULL); + g_signal_connect(G_OBJECT(sci), "expose-event", + G_CALLBACK(on_editor_expose_event), doc);
return sci; } @@ -1113,7 +1146,7 @@
/* "the" SCI signal (connect after initial setup(i.e. adding text)) */ g_signal_connect((GtkWidget*) doc->sci, "sci-notify", - G_CALLBACK(on_editor_notification), doc); + G_CALLBACK(on_editor_notification), doc);
use_ft = (ft != NULL) ? ft : filetypes_detect_from_file(doc); } @@ -1121,9 +1154,9 @@ { /* reloading */ document_undo_clear(doc);
- /* Unset the filetype so the document gets colourised by document_set_filetype(). + /* Ensure the document gets colourised. * (The text could have changed without typenames changing.) */ - doc->file_type = NULL; + queue_colourise(doc); use_ft = ft; } /* update taglist, typedef keywords and build menu if necessary */ @@ -2075,11 +2108,12 @@ * If sci is not NULL, then if sci supports typenames, project typenames are updated * if necessary, and typename keywords are set for sci. * Returns: TRUE if any scintilla type keywords were updated. */ -static gboolean update_type_keywords(ScintillaObject *sci, gint lang) +static gboolean update_type_keywords(GeanyDocument *doc, gint lang) { gboolean ret = FALSE; guint n; const GString *s; + ScintillaObject *sci = doc ? doc->sci : NULL;
if (sci != NULL && editor_lexer_get_type_keyword_idx(sci_get_lexer(sci)) == -1) return FALSE; @@ -2091,10 +2125,7 @@ gint keyword_idx = editor_lexer_get_type_keyword_idx(sci_get_lexer(sci));
sci_set_keywords(sci, keyword_idx, s->str); - if (! delay_colourise) - { - sci_colourise(sci, 0, -1); - } + queue_colourise(doc); } return FALSE; } @@ -2111,10 +2142,7 @@ if (keyword_idx > 0) { sci_set_keywords(wid, keyword_idx, s->str); - if (! delay_colourise) - { - sci_colourise(wid, 0, -1); - } + queue_colourise(documents[n]); ret = TRUE; } } @@ -2128,7 +2156,6 @@ * @param type The filetype. */ void document_set_filetype(GeanyDocument *doc, GeanyFiletype *type) { - gboolean colourise = FALSE; gboolean ft_changed;
if (type == NULL || doc == NULL) @@ -2152,22 +2179,13 @@ } highlighting_set_styles(doc->sci, type->id); build_menu_update(doc); - colourise = TRUE; + queue_colourise(doc); }
document_update_tag_list(doc, TRUE); - if (! delay_colourise) - { - /* Check if project typename keywords have changed. - * If they haven't, we may need to colourise the document. */ - if (! update_type_keywords(doc->sci, type->lang) && colourise) - sci_colourise(doc->sci, 0, -1); - } - if (ft_changed) - { - utils_get_current_function(NULL, NULL); - ui_update_statusbar(doc, -1); - } + + /* Update session typename keywords. */ + update_type_keywords(doc, type->lang); }
@@ -2475,72 +2493,15 @@ #endif
-static GArray *doc_indexes = NULL; - -/* Cache the current document indexes and prevent any colourising until - * document_colourise_new() is called. */ void document_delay_colourise() { - gint n; - - g_return_if_fail(delay_colourise == FALSE); - g_return_if_fail(doc_indexes == NULL); - - /* make an array containing all the current document indexes */ - doc_indexes = g_array_new(FALSE, FALSE, sizeof(gint)); - for (n = 0; n < (gint) documents_array->len; n++) - { - if (documents[n]->is_valid) - g_array_append_val(doc_indexes, n); - } - delay_colourise = TRUE; + /* TODO: remove */ }
-/* Colourise only newly opened documents and existing documents whose project typenames - * keywords have changed. - * document_delay_colourise() should already have been called. */ void document_colourise_new() { - guint n, i; - /* A bitset representing which docs need [re]colourising. - * (use gint8 to save memory because gboolean = gint) */ - gint8 *doc_set = g_newa(gint8, documents_array->len); - gboolean recolour = FALSE; /* whether to recolourise existing typenames */ - - g_return_if_fail(delay_colourise == TRUE); - g_return_if_fail(doc_indexes != NULL); - - /* first assume recolourising all docs */ - memset(doc_set, TRUE, documents_array->len * sizeof(gint8)); - - /* remove existing docs from the set if they don't use typenames or typenames haven't changed */ - recolour = update_type_keywords(NULL, -2); - for (i = 0; i < doc_indexes->len; i++) - { - ScintillaObject *sci; - - n = g_array_index(doc_indexes, gint, i); - sci = documents[n]->sci; - if (! recolour || (sci && editor_lexer_get_type_keyword_idx(sci_get_lexer(sci)) == -1)) - { - doc_set[n] = FALSE; - } - } - /* colourise all in the doc_set */ - for (n = 0; n < documents_array->len; n++) - { - if (doc_set[n] && documents[n]->is_valid) - sci_colourise(documents[n]->sci, 0, -1); - } - delay_colourise = FALSE; - g_array_free(doc_indexes, TRUE); - doc_indexes = NULL; - - /* now that the current document is colourised, fold points are now accurate, - * so force an update of the current function/tag. */ - utils_get_current_function(NULL, NULL); - ui_update_statusbar(NULL, -1); + /* TODO: remove */ }
Modified: trunk/src/documentprivate.h =================================================================== --- trunk/src/documentprivate.h 2008-06-19 17:42:40 UTC (rev 2716) +++ trunk/src/documentprivate.h 2008-06-20 12:34:13 UTC (rev 2717) @@ -67,6 +67,7 @@ GTrashStack *redo_actions; /* Used so Undo/Redo works for encoding changes. */ FileEncoding saved_encoding; + gboolean colourise_needed; } Document;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.