diff options
author | Yee Cheng Chin <ychin.git@gmail.com> | 2023-10-05 20:54:21 +0200 |
---|---|---|
committer | Christian Brabandt <cb@256bit.org> | 2023-10-05 20:54:21 +0200 |
commit | 290b887e8cc2c0d3dfc7f315b2052472c7c589cc (patch) | |
tree | 1b5285384cc6ed9e3a0bce9051d1e4b201196161 /src/gui_gtk_x11.c | |
parent | ea746f9e862092aef3d4e95c64d116759b9fabe0 (diff) |
patch 9.0.1991: no cmdline completion for setting the fontv9.0.1991
Problem: no cmdline completion for setting the font
Solution: enable it on Win32 and GTK builds
Add guifont cmdline completion (for Windows and GTK)
For Windows, auto-complete will only suggest monospace fonts as that's
the only types allowed. Will also suggest font options after the colon,
including suggesting the current font size for convenience, and misc
charset and quality options like `cANSI` and `qCLEARTYPE`.
For GTK, auto-complete will suggest only monospace fonts for `guifont`
but will include all fonts for `guifontwide`. The completion code
doesn't currently suggest the current font size, as the GTK guifont
format does not have a clear delimiter (':' for other platforms).
closes: #13264
Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: Yee Cheng Chin <ychin.git@gmail.com>
Diffstat (limited to 'src/gui_gtk_x11.c')
-rw-r--r-- | src/gui_gtk_x11.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c index 3fd6f3a904..4b3f53ef91 100644 --- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -5316,6 +5316,62 @@ gui_mch_free_font(GuiFont font) } /* + * Cmdline expansion for setting 'guifont' / 'guifontwide'. Will enumerate + * through all fonts for completion. When setting 'guifont' it will only show + * monospace fonts as it's unlikely other fonts would be useful. + */ + void +gui_mch_expand_font(optexpand_T *args, void *param, int (*add_match)(char_u *val)) +{ + PangoFontFamily **font_families = NULL; + int n_families = 0; + int wide = *(int *)param; + + if (args->oe_include_orig_val && *args->oe_opt_value == NUL && !wide) + { + // If guifont is empty, and we want to fill in the orig value, suggest + // the default so the user can modify it. + if (add_match((char_u *)DEFAULT_FONT) != OK) + return; + } + + pango_context_list_families( + gui.text_context, + &font_families, + &n_families); + + for (int i = 0; i < n_families; i++) + { + if (!wide && !pango_font_family_is_monospace(font_families[i])) + continue; + + const char* fam_name = pango_font_family_get_name(font_families[i]); + if (input_conv.vc_type != CONV_NONE) + { + char_u *buf = string_convert(&input_conv, (char_u*)fam_name, NULL); + if (buf != NULL) + { + if (add_match(buf) != OK) + { + vim_free(buf); + break; + } + vim_free(buf); + } + else + break; + } + else + { + if (add_match((char_u *)fam_name) != OK) + break; + } + } + + g_free(font_families); +} + +/* * Return the Pixel value (color) for the given color name. * * Return INVALCOLOR for error. |