From bc38e74a504d0413f7a9c4a2395917601b260035 Mon Sep 17 00:00:00 2001 From: Robert Pluim Date: Fri, 8 Nov 2019 21:07:10 +0100 Subject: [PATCH] Make GTK font chooser respect face-ignored-fonts To: emacs-devel@gnu.org * src/font.c (font_matches_ignored_fonts): New function, abstracts out check for matching Vface_ignored_fonts. (font_delete_unmatched): Use it. * src/gtkutil.h: Add prototype for font_matches_ignored_fonts. * src/gtkutil.c (xg_font_filter): New function, filters out fonts from the GTK font chooser. Uses font_matches_ignored_fonts. (xg_get_font): Set the GTK chooser font filter to xg_font_filter. --- src/font.c | 34 ++++++++++++++++++++-------------- src/gtkutil.c | 18 ++++++++++++++++++ src/gtkutil.h | 5 +++++ 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/src/font.c b/src/font.c index 8dfbfa0fac..9f92260d0c 100644 --- a/src/font.c +++ b/src/font.c @@ -2655,6 +2655,24 @@ font_clear_cache (struct frame *f, Lisp_Object cache, } +/* Check whether NAME should be ignored based on Vface_ignored_fonts. + This is reused by xg_font_filter to apply the same checks to the + GTK font chooser. */ + +bool +font_matches_ignored_fonts (const char *name, ptrdiff_t namelen) +{ + Lisp_Object tail, regexp; + for (tail = Vface_ignored_fonts; CONSP (tail); tail = XCDR (tail)) + { + regexp = XCAR (tail); + if (STRINGP (regexp) + && fast_c_string_match_ignore_case (regexp, name, + namelen) >= 0) + return true; + } + return false; +} static Lisp_Object scratch_font_spec, scratch_font_prefer; /* Check each font-entity in VEC, and return a list of font-entities @@ -2677,22 +2695,10 @@ font_delete_unmatched (Lisp_Object vec, Lisp_Object spec, int size) { char name[256]; ptrdiff_t namelen; - Lisp_Object tail, regexp; - namelen = font_unparse_xlfd (entity, 0, name, 256); if (namelen >= 0) - { - for (tail = Vface_ignored_fonts; CONSP (tail); tail = XCDR (tail)) - { - regexp = XCAR (tail); - if (STRINGP (regexp) - && fast_c_string_match_ignore_case (regexp, name, - namelen) >= 0) - break; - } - if (CONSP (tail)) - continue; - } + if (font_matches_ignored_fonts (name, namelen)) + continue; } if (NILP (spec)) { diff --git a/src/gtkutil.c b/src/gtkutil.c index 16d765533a..0cda21cdd1 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c @@ -2228,6 +2228,21 @@ xg_get_file_name (struct frame *f, static char *x_last_font_name; +#if GTK_CHECK_VERSION (3, 2, 0) +static gboolean +xg_font_filter (const PangoFontFamily *family, + const PangoFontFace *face, + gpointer data) +{ + const char *name = pango_font_family_get_name ((PangoFontFamily *)family); + ptrdiff_t namelen = strlen (name); + + if (font_matches_ignored_fonts (name, namelen)) + return FALSE; + return TRUE; +} +#endif + /* Pop up a GTK font selector and return the name of the font the user selects, as a C string. The returned font name follows GTK's own format: @@ -2247,6 +2262,9 @@ xg_get_font (struct frame *f, const char *default_name) w = gtk_font_chooser_dialog_new ("Pick a font", GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f))); +#if GTK_CHECK_VERSION (3, 2, 0) + gtk_font_chooser_set_filter_func (GTK_FONT_CHOOSER (w), xg_font_filter, NULL, NULL); +#endif if (default_name) { /* Convert fontconfig names to Gtk names, i.e. remove - before diff --git a/src/gtkutil.h b/src/gtkutil.h index 229aa08f81..fea3271637 100644 --- a/src/gtkutil.h +++ b/src/gtkutil.h @@ -203,5 +203,10 @@ extern void xg_initialize (void); extern bool xg_ignore_gtk_scrollbar; extern bool xg_gtk_initialized; + +#if GTK_CHECK_VERSION (3, 2, 0) +extern bool font_matches_ignored_fonts (const char *, ptrdiff_t); +#endif + #endif /* USE_GTK */ #endif /* GTKUTIL_H */ -- 2.23.0