mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-04-15 08:21:03 -04:00
config: apply fontconfig rules if user didn’t set an explicit font size
If the user didn’t explicitly set the font size (e.g. font=monospace,
instead of font=monospace:size=12), our initial attempt to read the
FC_SIZE and FC_PIXEL_SIZE attributes will fail, and we used to
fallback to setting the size to 8pt.
Change this slightly, so that when we fail to read the FC_*_SIZE
attributes, apply the fontconfig rules, but *without expanding*
them (i.e. without calling FcDefaultSubstitute()).
Then try reading FC_*_SIZE again.
If that too fails, _then_ set size to 8pt. This allows us to pick up
rules that set a default {pixel}size:
<fontconfig>
<match>
<edit name="pixelsize" mode="append"><double>14</double></edit>
</fontconfig>
Closes #1287
This commit is contained in:
parent
9da1b1cec3
commit
9f3ce9236f
2 changed files with 38 additions and 6 deletions
|
|
@ -81,10 +81,14 @@
|
||||||
* DPI is now forced to 96 when found to be unreasonably high.
|
* DPI is now forced to 96 when found to be unreasonably high.
|
||||||
* Set default log level to warning ([#1215][1215]).
|
* Set default log level to warning ([#1215][1215]).
|
||||||
* Default `grapheme-width-method` from `wcswidth` to `double-width`.
|
* Default `grapheme-width-method` from `wcswidth` to `double-width`.
|
||||||
|
* When determining initial font size, do FontConfig config
|
||||||
|
substitution if the user-provided font pattern has no {pixel}size
|
||||||
|
option ([#1287][1287]).
|
||||||
|
|
||||||
[1166]: https://codeberg.org/dnkl/foot/issues/1166
|
[1166]: https://codeberg.org/dnkl/foot/issues/1166
|
||||||
[1179]: https://codeberg.org/dnkl/foot/issues/1179
|
[1179]: https://codeberg.org/dnkl/foot/issues/1179
|
||||||
[1215]: https://codeberg.org/dnkl/foot/pulls/1215
|
[1215]: https://codeberg.org/dnkl/foot/pulls/1215
|
||||||
|
[1287]: https://codeberg.org/dnkl/foot/issues/1287
|
||||||
|
|
||||||
|
|
||||||
### Deprecated
|
### Deprecated
|
||||||
|
|
|
||||||
40
config.c
40
config.c
|
|
@ -3390,20 +3390,48 @@ config_font_parse(const char *pattern, struct config_font *font)
|
||||||
if (pat == NULL)
|
if (pat == NULL)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* First look for user specified {pixel}size option
|
||||||
|
* e.g. “font-name:size=12”
|
||||||
|
*/
|
||||||
|
|
||||||
double pt_size = -1.0;
|
double pt_size = -1.0;
|
||||||
FcPatternGetDouble(pat, FC_SIZE, 0, &pt_size);
|
FcResult have_pt_size = FcPatternGetDouble(pat, FC_SIZE, 0, &pt_size);
|
||||||
FcPatternRemove(pat, FC_SIZE, 0);
|
|
||||||
|
|
||||||
int px_size = -1;
|
int px_size = -1;
|
||||||
FcPatternGetInteger(pat, FC_PIXEL_SIZE, 0, &px_size);
|
FcResult have_px_size = FcPatternGetInteger(pat, FC_PIXEL_SIZE, 0, &px_size);
|
||||||
FcPatternRemove(pat, FC_PIXEL_SIZE, 0);
|
|
||||||
|
|
||||||
if (pt_size == -1. && px_size == -1)
|
if (have_pt_size != FcResultMatch && have_px_size != FcResultMatch) {
|
||||||
pt_size = 8.0;
|
/*
|
||||||
|
* Apply fontconfig config. Can’t do that until we’ve first
|
||||||
|
* checked for a user provided size, since we may end up with
|
||||||
|
* both “size” and “pixelsize” being set, and we don’t know
|
||||||
|
* which one takes priority.
|
||||||
|
*/
|
||||||
|
FcPattern *pat_copy = FcPatternDuplicate(pat);
|
||||||
|
if (pat_copy == NULL ||
|
||||||
|
!FcConfigSubstitute(NULL, pat_copy, FcMatchPattern))
|
||||||
|
{
|
||||||
|
LOG_WARN("%s: failed to do config substitution", pattern);
|
||||||
|
} else {
|
||||||
|
have_pt_size = FcPatternGetDouble(pat_copy, FC_SIZE, 0, &pt_size);
|
||||||
|
have_px_size = FcPatternGetInteger(pat_copy, FC_PIXEL_SIZE, 0, &px_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
FcPatternDestroy(pat_copy);
|
||||||
|
|
||||||
|
if (have_pt_size != FcResultMatch && have_px_size != FcResultMatch)
|
||||||
|
pt_size = 8.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
FcPatternRemove(pat, FC_SIZE, 0);
|
||||||
|
FcPatternRemove(pat, FC_PIXEL_SIZE, 0);
|
||||||
|
|
||||||
char *stripped_pattern = (char *)FcNameUnparse(pat);
|
char *stripped_pattern = (char *)FcNameUnparse(pat);
|
||||||
FcPatternDestroy(pat);
|
FcPatternDestroy(pat);
|
||||||
|
|
||||||
|
LOG_DBG("%s: pt-size=%.2f, px-size=%d", stripped_pattern, pt_size, px_size);
|
||||||
|
|
||||||
*font = (struct config_font){
|
*font = (struct config_font){
|
||||||
.pattern = stripped_pattern,
|
.pattern = stripped_pattern,
|
||||||
.pt_size = pt_size,
|
.pt_size = pt_size,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue