Skip to content

Commit

Permalink
Colourise only the visible area when highlighting typenames
Browse files Browse the repository at this point in the history
Colorizing the whole document is rather expensive and unnecessary as
Scintilla colorizes the visible part of the document when scrolling
happens. Instead, colorize only the visible area when highlighting
typenames.
  • Loading branch information
techee committed Dec 12, 2015
1 parent 27628c0 commit b361b83
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 9 deletions.
12 changes: 8 additions & 4 deletions src/document.c
Expand Up @@ -509,8 +509,12 @@ static gint document_get_new_idx(void)
}


static void queue_colourise(GeanyDocument *doc)
static void queue_colourise(GeanyDocument *doc, gboolean full_colourise)
{
/* make sure we don't override previously set full_colourise=TRUE by FALSE */
if (!doc->priv->colourise_needed || !doc->priv->full_colourise)
doc->priv->full_colourise = full_colourise;

/* Colourise the editor before it is next drawn */
doc->priv->colourise_needed = TRUE;

Expand Down Expand Up @@ -1393,7 +1397,7 @@ GeanyDocument *document_open_file_full(GeanyDocument *doc, const gchar *filename
/* add the text to the ScintillaObject */
sci_set_readonly(doc->editor->sci, FALSE); /* to allow replacing text */
sci_set_text(doc->editor->sci, filedata.data); /* NULL terminated data */
queue_colourise(doc); /* Ensure the document gets colourised. */
queue_colourise(doc, TRUE); /* Ensure the document gets colourised. */

/* detect & set line endings */
editor_mode = utils_get_line_endings(filedata.data, filedata.len);
Expand Down Expand Up @@ -2749,7 +2753,7 @@ void document_highlight_tags(GeanyDocument *doc)
keywords = g_string_free(keywords_str, FALSE);
sci_set_keywords(doc->editor->sci, keyword_idx, keywords);
g_free(keywords);
queue_colourise(doc); /* force re-highlighting the entire document */
queue_colourise(doc, FALSE); /* re-highlight the visible area */
}
}

Expand Down Expand Up @@ -2810,7 +2814,7 @@ static void document_load_config(GeanyDocument *doc, GeanyFiletype *type,
highlighting_set_styles(doc->editor->sci, type);
editor_set_indentation_guides(doc->editor);
build_menu_update(doc);
queue_colourise(doc);
queue_colourise(doc, TRUE);
doc->priv->symbol_list_sort_mode = type->priv->symbol_list_sort_mode;
}

Expand Down
1 change: 1 addition & 0 deletions src/documentprivate.h
Expand Up @@ -90,6 +90,7 @@ typedef struct GeanyDocumentPrivate
/* Used so Undo/Redo works for encoding changes. */
FileEncoding saved_encoding;
gboolean colourise_needed; /* use document.c:queue_colourise() instead */
gboolean full_colourise;
gint line_count; /* Number of lines in the document. */
gint symbol_list_sort_mode;
/* indicates whether a file is on a remote filesystem, works only with GIO/GVfs */
Expand Down
26 changes: 21 additions & 5 deletions src/editor.c
Expand Up @@ -4687,12 +4687,28 @@ static gboolean editor_check_colourise(GeanyEditor *editor)
return FALSE;

doc->priv->colourise_needed = FALSE;
sci_colourise(editor->sci, 0, -1);

/* now that the current document is colourised, fold points are now accurate,
* so force an update of the current function/tag. */
symbols_get_current_function(NULL, NULL);
ui_update_statusbar(NULL, -1);
if (doc->priv->full_colourise)
{
sci_colourise(editor->sci, 0, -1);

/* now that the current document is colourised, fold points are now accurate,
* so force an update of the current function/tag. */
symbols_get_current_function(NULL, NULL);
ui_update_statusbar(NULL, -1);
}
else
{
gint start_line, end_line, start, end;

start_line = SSM(doc->editor->sci, SCI_GETFIRSTVISIBLELINE, 0, 0);
end_line = start_line + SSM(editor->sci, SCI_LINESONSCREEN, 0, 0);
start_line = SSM(editor->sci, SCI_DOCLINEFROMVISIBLE, start_line, 0);
end_line = SSM(editor->sci, SCI_DOCLINEFROMVISIBLE, end_line, 0);
start = sci_get_position_from_line(editor->sci, start_line);
end = sci_get_line_end_position(editor->sci, end_line);
sci_colourise(editor->sci, start, end);
}

return TRUE;
}
Expand Down

0 comments on commit b361b83

Please sign in to comment.