Linux: Fix match rules used as aliases in Fontconfig configuration not being respected

Fixes #1085
This commit is contained in:
Kovid Goyal 2018-10-23 12:22:18 +05:30
parent d839a31d7f
commit a6949df727
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 19 additions and 2 deletions

View File

@ -27,11 +27,14 @@ Changelog
- macOS: Fix drag and drop of files not working on mojave (:iss:`1058`) - macOS: Fix drag and drop of files not working on mojave (:iss:`1058`)
- macOS: Fix IME input for east asian languages (:iss:`910`) - macOS: Fix IME input for East Asian languages (:iss:`910`)
- macOS: Fix rendering frames-per-second very low when processing - macOS: Fix rendering frames-per-second very low when processing
large amounts of input in small chunks (:pull:`1082`) large amounts of input in small chunks (:pull:`1082`)
- Linux: Fix match rules used as aliases in Fontconfig configuration not being
respected (:iss:`1085`)
- Fix expansion of env vars not working in the :opt:`env` directive - Fix expansion of env vars not working in the :opt:`env` directive
(:iss:`1075`) (:iss:`1075`)

View File

@ -44,8 +44,12 @@ def list_fonts():
yield {'family': f, 'full_name': fn, 'is_monospace': is_mono} yield {'family': f, 'full_name': fn, 'is_monospace': is_mono}
def family_name_to_key(family):
return re.sub(r'\s+', ' ', family.lower())
def find_best_match(family, bold=False, italic=False, monospaced=True): def find_best_match(family, bold=False, italic=False, monospaced=True):
q = re.sub(r'\s+', ' ', family.lower()) q = family_name_to_key(family)
font_map = all_fonts_map(monospaced) font_map = all_fonts_map(monospaced)
def score(candidate): def score(candidate):
@ -61,6 +65,16 @@ def find_best_match(family, bold=False, italic=False, monospaced=True):
candidates.sort(key=score) candidates.sort(key=score)
return candidates[0] return candidates[0]
# Use fc-match to see if we can find a monospaced font that matches family
possibility = fc_match(family, False, False)
for key, map_key in (('postscript_name', 'ps_map'), ('full_name', 'full_map'), ('family', 'family_map')):
val = possibility.get(key)
if val:
candidates = font_map[map_key].get(family_name_to_key(val))
if candidates:
candidates.sort(key=score)
return candidates[0]
# Use fc-match with a generic family # Use fc-match with a generic family
family = 'monospace' if monospaced else 'sans-serif' family = 'monospace' if monospaced else 'sans-serif'
return fc_match(family, bold, italic) return fc_match(family, bold, italic)