Make GTK font chooser respect face-ignored-fonts

* src/font.c (font_delete_unmatched): Move Vface_ignored_fonts
matching to...
(font_is_ignored): ..Here.  New function.
* src/gtkutil.c (xg_font_filter): New function, uses font_is_ignored
to filter fonts.
(xg_get_font): Set GTK font chooser filter to xg_font_filter.
* src/gtkutil.h: Add prototype for font_is_ignored.
This commit is contained in:
Robert Pluim 2019-11-13 15:19:04 +01:00
parent 4f45e89852
commit ca44f33be2
3 changed files with 45 additions and 14 deletions

View file

@ -2655,6 +2655,26 @@ 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_is_ignored (const char *name, ptrdiff_t namelen)
{
Lisp_Object tail = Vface_ignored_fonts;
Lisp_Object regexp;
FOR_EACH_TAIL_SAFE (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 +2697,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_is_ignored (name, namelen))
continue;
}
if (NILP (spec))
{

View file

@ -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_is_ignored (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

View file

@ -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_is_ignored (const char *, ptrdiff_t);
#endif
#endif /* USE_GTK */
#endif /* GTKUTIL_H */