mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-03-01 01:40:13 -05:00
Merge branch 'non-dpi-aware-if-any-output-uses-scaling'
This commit is contained in:
commit
ebbac83236
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