mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-05 04:06:08 -05:00
term: only scale using DPI if *all* monitors have a scaling factor or one
With dpi-aware=auto (the default), scale fonts using DPI *only* if *all* available monitors have a scaling factor of one. The idea is this: if a user, with multiple monitors, have enabled scaling on *at least* one monitor, he/she has most likely done so to match the size of his/hers other monitors. For example, if the user has one monitor with a scaling factor of one, and another one with a scaling factor of two, he/she expects things to be twice as large on the second monitor. If we (foot) scale using DPI on the first monitor, and using the scaling factor on the second monitor, foot will *not* look twice as big on the second monitor (this was the old behavior of dpi-aware=auto). Part of #714
This commit is contained in:
parent
2934a4e96c
commit
fb77637eb9
7 changed files with 59 additions and 27 deletions
|
|
@ -56,6 +56,9 @@
|
||||||
still exported, like before.
|
still exported, like before.
|
||||||
* The default install location for the terminfo definitions have been
|
* The default install location for the terminfo definitions have been
|
||||||
changed back to `${datadir}/terminfo`.
|
changed back to `${datadir}/terminfo`.
|
||||||
|
* `dpi-aware=auto`: fonts are now scaled using the monitor’s DPI only
|
||||||
|
when **all** monitors have a scaling factor of one
|
||||||
|
(https://codeberg.org/dnkl/foot/issues/714).
|
||||||
|
|
||||||
|
|
||||||
### Deprecated
|
### Deprecated
|
||||||
|
|
|
||||||
|
|
@ -347,9 +347,9 @@ This is not how it is meant to be. Fonts are measured in _point sizes_
|
||||||
all mediums, be it printers or monitors, regardless of their DPI.
|
all mediums, be it printers or monitors, regardless of their DPI.
|
||||||
|
|
||||||
Foot’s default behavior is to use the monitor’s DPI to size fonts when
|
Foot’s default behavior is to use the monitor’s DPI to size fonts when
|
||||||
output scaling has been disabled. On monitors where output scaling has
|
output scaling has been disabled on **all** monitors. If at least one
|
||||||
been enabled, fonts will instead be sized using the scaling
|
monitor has output scaling enabled, fonts will instead by sized using
|
||||||
factor.
|
the scaling factor.
|
||||||
|
|
||||||
This can be changed to either **always** use the monitor’s DPI
|
This can be changed to either **always** use the monitor’s DPI
|
||||||
(regardless of scaling factor), or to **never** use it, with the
|
(regardless of scaling factor), or to **never** use it, with the
|
||||||
|
|
|
||||||
|
|
@ -2837,8 +2837,8 @@ box_drawing(const struct terminal *term, wchar_t wc)
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
double dpi = term_font_sized_by_dpi(term, term->scale) ? term->font_dpi : 96.;
|
double dpi = term->font_is_sized_by_dpi ? term->font_dpi : 96.;
|
||||||
double scale = term_font_sized_by_scale(term, term->scale) ? term->scale : 1.;
|
double scale = term->font_is_sized_by_dpi ? 1. : term->scale;
|
||||||
double cell_size = sqrt(pow(term->cell_width, 2) + pow(term->cell_height, 2));
|
double cell_size = sqrt(pow(term->cell_width, 2) + pow(term->cell_height, 2));
|
||||||
|
|
||||||
int base_thickness =
|
int base_thickness =
|
||||||
|
|
|
||||||
|
|
@ -161,8 +161,10 @@ in this order:
|
||||||
scaling factor *does* double the font size.
|
scaling factor *does* double the font size.
|
||||||
|
|
||||||
Finally, if set to *auto*, fonts will be sized using the monitor's
|
Finally, if set to *auto*, fonts will be sized using the monitor's
|
||||||
DPI on monitors with a scaling factor of 1, but otherwise using
|
DPI if _all_ monitors have a scaling factor of 1. If at least one
|
||||||
the scaling factor.
|
monitor as a scaling factor larger than 1 (regardless of whether
|
||||||
|
the foot window is mapped on that monitor or not), fonts will be
|
||||||
|
scaled using the scaling factor.
|
||||||
|
|
||||||
Note that this option typically does not work with bitmap fonts,
|
Note that this option typically does not work with bitmap fonts,
|
||||||
which only contains a pre-defined set of sizes, and cannot be
|
which only contains a pre-defined set of sizes, and cannot be
|
||||||
|
|
|
||||||
59
terminal.c
59
terminal.c
|
|
@ -813,25 +813,48 @@ get_font_subpixel(const struct terminal *term)
|
||||||
return FCFT_SUBPIXEL_DEFAULT;
|
return FCFT_SUBPIXEL_DEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
static bool
|
||||||
term_font_sized_by_dpi(const struct terminal *term, int scale)
|
term_font_size_by_dpi(const struct terminal *term)
|
||||||
{
|
{
|
||||||
return term->conf->dpi_aware == DPI_AWARE_YES ||
|
switch (term->conf->dpi_aware) {
|
||||||
(term->conf->dpi_aware == DPI_AWARE_AUTO && scale <= 1);
|
case DPI_AWARE_YES: return true;
|
||||||
}
|
case DPI_AWARE_NO: return false;
|
||||||
|
|
||||||
bool
|
case DPI_AWARE_AUTO:
|
||||||
term_font_sized_by_scale(const struct terminal *term, int scale)
|
/*
|
||||||
{
|
* Scale using DPI if all monitors have a scaling factor or 1.
|
||||||
return !term_font_sized_by_dpi(term, scale);
|
*
|
||||||
|
* The idea is this: if a user, with multiple monitors, have
|
||||||
|
* enabled scaling on at least one monitor, then he/she has
|
||||||
|
* most likely done so to match the size of his/hers other
|
||||||
|
* monitors.
|
||||||
|
*
|
||||||
|
* I.e. if the user has one monitor with a scaling factor of
|
||||||
|
* one, and another with a scaling factor of two, he/she
|
||||||
|
* expects things to be twice as large on the second
|
||||||
|
* monitor.
|
||||||
|
*
|
||||||
|
* If we (foot) scale using DPI on the first monitor, and
|
||||||
|
* using the scaling factor on the second monitor, foot will
|
||||||
|
* *not* look twice as big on the second monitor.
|
||||||
|
*/
|
||||||
|
tll_foreach(term->wl->monitors, it) {
|
||||||
|
const struct monitor *mon = &it->item;
|
||||||
|
if (mon->scale > 1)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
BUG("unhandled DPI awareness value");
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
term_pt_or_px_as_pixels(const struct terminal *term,
|
term_pt_or_px_as_pixels(const struct terminal *term,
|
||||||
const struct pt_or_px *pt_or_px)
|
const struct pt_or_px *pt_or_px)
|
||||||
{
|
{
|
||||||
double scale = term_font_sized_by_scale(term, term->scale) ? term->scale : 1.;
|
double scale = !term->font_is_sized_by_dpi ? term->scale : 1.;
|
||||||
double dpi = term_font_sized_by_dpi(term, term->scale) ? term->font_dpi : 96.;
|
double dpi = term->font_is_sized_by_dpi ? term->font_dpi : 96.;
|
||||||
|
|
||||||
return pt_or_px->px == 0
|
return pt_or_px->px == 0
|
||||||
? round(pt_or_px->pt * scale * dpi / 72)
|
? round(pt_or_px->pt * scale * dpi / 72)
|
||||||
|
|
@ -878,8 +901,7 @@ reload_fonts(struct terminal *term)
|
||||||
bool use_px_size = term->font_sizes[i][j].px_size > 0;
|
bool use_px_size = term->font_sizes[i][j].px_size > 0;
|
||||||
char size[64];
|
char size[64];
|
||||||
|
|
||||||
const int scale =
|
const int scale = term->font_is_sized_by_dpi ? 1 : term->scale;
|
||||||
term_font_sized_by_scale(term, term->scale) ? term->scale : 1;
|
|
||||||
|
|
||||||
if (use_px_size)
|
if (use_px_size)
|
||||||
snprintf(size, sizeof(size), ":pixelsize=%d",
|
snprintf(size, sizeof(size), ":pixelsize=%d",
|
||||||
|
|
@ -914,7 +936,7 @@ reload_fonts(struct terminal *term)
|
||||||
const size_t count_bold_italic = custom_bold_italic ? counts[3] : counts[0];
|
const size_t count_bold_italic = custom_bold_italic ? counts[3] : counts[0];
|
||||||
const char **names_bold_italic = (const char **)(custom_bold_italic ? names[3] : names[0]);
|
const char **names_bold_italic = (const char **)(custom_bold_italic ? names[3] : names[0]);
|
||||||
|
|
||||||
const bool use_dpi = term_font_sized_by_dpi(term, term->scale);
|
const bool use_dpi = term->font_is_sized_by_dpi;
|
||||||
|
|
||||||
char *attrs[4] = {NULL};
|
char *attrs[4] = {NULL};
|
||||||
int attr_len[4] = {-1, -1, -1, -1}; /* -1, so that +1 (below) results in 0 */
|
int attr_len[4] = {-1, -1, -1, -1}; /* -1, so that +1 (below) results in 0 */
|
||||||
|
|
@ -2008,8 +2030,8 @@ term_font_dpi_changed(struct terminal *term, int old_scale)
|
||||||
float dpi = get_font_dpi(term);
|
float dpi = get_font_dpi(term);
|
||||||
xassert(term->scale > 0);
|
xassert(term->scale > 0);
|
||||||
|
|
||||||
bool was_scaled_using_dpi = term_font_sized_by_dpi(term, old_scale);
|
bool was_scaled_using_dpi = term->font_is_sized_by_dpi;
|
||||||
bool will_scale_using_dpi = term_font_sized_by_dpi(term, term->scale);
|
bool will_scale_using_dpi = term_font_size_by_dpi(term);
|
||||||
|
|
||||||
bool need_font_reload =
|
bool need_font_reload =
|
||||||
was_scaled_using_dpi != will_scale_using_dpi ||
|
was_scaled_using_dpi != will_scale_using_dpi ||
|
||||||
|
|
@ -2019,15 +2041,16 @@ term_font_dpi_changed(struct terminal *term, int old_scale)
|
||||||
|
|
||||||
if (need_font_reload) {
|
if (need_font_reload) {
|
||||||
LOG_DBG("DPI/scale change: DPI-awareness=%s, "
|
LOG_DBG("DPI/scale change: DPI-awareness=%s, "
|
||||||
"DPI: %.2f -> %.2f, scale: %d, "
|
"DPI: %.2f -> %.2f, scale: %d -> %d, "
|
||||||
"sizing font based on monitor's %s",
|
"sizing font based on monitor's %s",
|
||||||
term->conf->dpi_aware == DPI_AWARE_AUTO ? "auto" :
|
term->conf->dpi_aware == DPI_AWARE_AUTO ? "auto" :
|
||||||
term->conf->dpi_aware == DPI_AWARE_YES ? "yes" : "no",
|
term->conf->dpi_aware == DPI_AWARE_YES ? "yes" : "no",
|
||||||
term->font_dpi, dpi, term->scale,
|
term->font_dpi, dpi, old_scale, term->scale,
|
||||||
will_scale_using_dpi ? "DPI" : "scaling factor");
|
will_scale_using_dpi ? "DPI" : "scaling factor");
|
||||||
}
|
}
|
||||||
|
|
||||||
term->font_dpi = dpi;
|
term->font_dpi = dpi;
|
||||||
|
term->font_is_sized_by_dpi = will_scale_using_dpi;
|
||||||
|
|
||||||
if (!need_font_reload)
|
if (!need_font_reload)
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -329,6 +329,7 @@ struct terminal {
|
||||||
struct config_font *font_sizes[4];
|
struct config_font *font_sizes[4];
|
||||||
struct pt_or_px font_line_height;
|
struct pt_or_px font_line_height;
|
||||||
float font_dpi;
|
float font_dpi;
|
||||||
|
bool font_is_sized_by_dpi;
|
||||||
int16_t font_x_ofs;
|
int16_t font_x_ofs;
|
||||||
int16_t font_y_ofs;
|
int16_t font_y_ofs;
|
||||||
enum fcft_subpixel font_subpixel;
|
enum fcft_subpixel font_subpixel;
|
||||||
|
|
@ -660,8 +661,6 @@ bool term_font_size_reset(struct terminal *term);
|
||||||
bool term_font_dpi_changed(struct terminal *term, int old_scale);
|
bool term_font_dpi_changed(struct terminal *term, int old_scale);
|
||||||
void term_font_subpixel_changed(struct terminal *term);
|
void term_font_subpixel_changed(struct terminal *term);
|
||||||
|
|
||||||
bool term_font_sized_by_dpi(const struct terminal *term, int scale);
|
|
||||||
bool term_font_sized_by_scale(const struct terminal *term, int scale);
|
|
||||||
int term_pt_or_px_as_pixels(
|
int term_pt_or_px_as_pixels(
|
||||||
const struct terminal *term, const struct pt_or_px *pt_or_px);
|
const struct terminal *term, const struct pt_or_px *pt_or_px);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -340,6 +340,11 @@ update_terms_on_monitor(struct monitor *mon)
|
||||||
tll_foreach(wayl->terms, it) {
|
tll_foreach(wayl->terms, it) {
|
||||||
struct terminal *term = it->item;
|
struct terminal *term = it->item;
|
||||||
|
|
||||||
|
if (term->conf->dpi_aware == DPI_AWARE_AUTO) {
|
||||||
|
update_term_for_output_change(term);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
tll_foreach(term->window->on_outputs, it2) {
|
tll_foreach(term->window->on_outputs, it2) {
|
||||||
if (it2->item == mon) {
|
if (it2->item == mon) {
|
||||||
update_term_for_output_change(term);
|
update_term_for_output_change(term);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue