Branch: refs/heads/master Author: Colomban Wendling ban@herbesfolles.org Committer: Colomban Wendling ban@herbesfolles.org Date: Sun, 07 Feb 2021 21:37:55 UTC Commit: e027e240c279040c2f6bc9ea0aaccc2cac2ca94e https://github.com/geany/geany/commit/e027e240c279040c2f6bc9ea0aaccc2cac2ca9...
Log Message: ----------- Merge pull request #2747 from geany/startup-speed
Fix startup speed
Modified Paths: -------------- src/editor.c src/sciwrappers.c
Modified: src/editor.c 18 lines changed, 13 insertions(+), 5 deletions(-) =================================================================== @@ -4597,25 +4597,34 @@ void editor_ensure_final_newline(GeanyEditor *editor) }
-void editor_set_font(GeanyEditor *editor, const gchar *font) +/* Similar to editor_set_font() but *only* sets the font, and doesn't take care + * of updating properties that might depend on the font */ +static void set_font(ScintillaObject *sci, const gchar *font) { gint style; gchar *font_name; PangoFontDescription *pfd; gdouble size;
- g_return_if_fail(editor); + g_return_if_fail(sci);
pfd = pango_font_description_from_string(font); size = pango_font_description_get_size(pfd) / (gdouble) PANGO_SCALE; font_name = g_strdup_printf("!%s", pango_font_description_get_family(pfd)); pango_font_description_free(pfd);
for (style = 0; style <= STYLE_MAX; style++) - sci_set_font_fractional(editor->sci, style, font_name, size); + sci_set_font_fractional(sci, style, font_name, size);
g_free(font_name); +}
+ +void editor_set_font(GeanyEditor *editor, const gchar *font) +{ + g_return_if_fail(editor); + + set_font(editor->sci, font); update_margins(editor->sci); /* zoom to 100% to prevent confusion */ sci_zoom_off(editor->sci); @@ -4926,7 +4935,6 @@ static ScintillaObject *create_new_sci(GeanyEditor *editor)
setup_sci_keys(sci);
- sci_set_symbol_margin(sci, editor_prefs.show_markers_margin); sci_set_lines_wrapped(sci, editor->line_wrapping); sci_set_caret_policy_x(sci, CARET_JUMPS | CARET_EVEN, 0); /* Y policy is set in editor_apply_update_prefs() */ @@ -5000,7 +5008,7 @@ ScintillaObject *editor_create_widget(GeanyEditor *editor) editor->sci = sci;
editor_set_indent(editor, iprefs->type, iprefs->width); - editor_set_font(editor, interface_prefs.editor_font); + set_font(editor->sci, interface_prefs.editor_font); editor_apply_update_prefs(editor);
/* if editor already had a widget, restore it */
Modified: src/sciwrappers.c 39 lines changed, 38 insertions(+), 1 deletions(-) =================================================================== @@ -144,10 +144,47 @@ void sci_set_mark_long_lines(ScintillaObject *sci, gint type, gint column, const }
+/* Calls SCI_TEXTHEIGHT but tries very hard to cache the result as it's a very + * expensive operation */ +static gint sci_text_height_cached(ScintillaObject *sci) +{ + struct height_spec { + gchar *font; + gint size; + gint zoom; + gint extra; + }; + static struct height_spec cache = {0}; + static gint cache_value = 0; + struct height_spec current; + + current.font = sci_get_string(sci, SCI_STYLEGETFONT, 0); + current.size = SSM(sci, SCI_STYLEGETSIZEFRACTIONAL, 0, 0); + current.zoom = SSM(sci, SCI_GETZOOM, 0, 0); + current.extra = SSM(sci, SCI_GETEXTRAASCENT, 0, 0) + SSM(sci, SCI_GETEXTRADESCENT, 0, 0); + + if (g_strcmp0(current.font, cache.font) == 0 && + current.size == cache.size && + current.zoom == cache.zoom && + current.extra == cache.extra) + { + g_free(current.font); + } + else + { + g_free(cache.font); + cache = current; + + cache_value = SSM(sci, SCI_TEXTHEIGHT, 0, 0); + } + + return cache_value; +} + /* compute margin width based on ratio of line height */ static gint margin_width_from_line_height(ScintillaObject *sci, gdouble ratio, gint threshold) { - const gint line_height = SSM(sci, SCI_TEXTHEIGHT, 0, 0); + const gint line_height = sci_text_height_cached(sci); gint width;
width = line_height * ratio;
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).