mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-03-17 05:33:52 -04:00
commit
807a304306
4 changed files with 62 additions and 46 deletions
|
|
@ -56,6 +56,11 @@
|
||||||
* Foot now sends `SIGTERM`/`SIGKILL` to the client application’s process group,
|
* Foot now sends `SIGTERM`/`SIGKILL` to the client application’s process group,
|
||||||
instead of just to the client application’s process.
|
instead of just to the client application’s process.
|
||||||
* `kmous` terminfo capability from `\E[M` to `\E[<`.
|
* `kmous` terminfo capability from `\E[M` to `\E[<`.
|
||||||
|
* pt-or-px values (`letter-spacing`, etc) and the line thickness
|
||||||
|
(`tweak.box-drawing-base-thickness`) in box drawing characters are
|
||||||
|
now translated to pixel values using the monitor’s scaling factor
|
||||||
|
when `dpi-aware=no`, or `dpi-aware=auto` and the scaling factor is
|
||||||
|
larger than 1 (https://codeberg.org/dnkl/foot/issues/680).
|
||||||
|
|
||||||
|
|
||||||
### Deprecated
|
### Deprecated
|
||||||
|
|
|
||||||
|
|
@ -25,9 +25,6 @@ struct buf {
|
||||||
int width;
|
int width;
|
||||||
int height;
|
int height;
|
||||||
int stride;
|
int stride;
|
||||||
int dpi;
|
|
||||||
float cell_size;
|
|
||||||
float base_thickness;
|
|
||||||
bool solid_shades;
|
bool solid_shades;
|
||||||
|
|
||||||
int thickness[2];
|
int thickness[2];
|
||||||
|
|
@ -63,17 +60,15 @@ change_buffer_format(struct buf *buf, pixman_format_code_t new_format)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int NOINLINE
|
static int NOINLINE
|
||||||
_thickness(struct buf *buf, enum thickness thick)
|
_thickness(int base_thickness, enum thickness thick)
|
||||||
{
|
{
|
||||||
int multiplier = thick * 2 + 1;
|
int multiplier = thick * 2 + 1;
|
||||||
|
|
||||||
|
xassert(base_thickness >= 1);
|
||||||
xassert((thick == LIGHT && multiplier == 1) ||
|
xassert((thick == LIGHT && multiplier == 1) ||
|
||||||
(thick == HEAVY && multiplier == 3));
|
(thick == HEAVY && multiplier == 3));
|
||||||
|
|
||||||
return
|
return base_thickness * multiplier;
|
||||||
max(
|
|
||||||
(int)(buf->base_thickness * buf->dpi / 72.0 * buf->cell_size), 1)
|
|
||||||
* multiplier;
|
|
||||||
}
|
}
|
||||||
#define thickness(thick) buf->thickness[thick]
|
#define thickness(thick) buf->thickness[thick]
|
||||||
|
|
||||||
|
|
@ -2751,25 +2746,13 @@ box_drawing(const struct terminal *term, wchar_t wc)
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
struct buf buf = {
|
double dpi = term_font_sized_by_dpi(term, term->scale) ? term->font_dpi : 96.;
|
||||||
.data = data,
|
double scale = term_font_sized_by_scale(term, term->scale) ? term->scale : 1.;
|
||||||
.pix = pix,
|
double cell_size = sqrt(pow(term->cell_width, 2) + pow(term->cell_height, 2));
|
||||||
.format = fmt,
|
|
||||||
.width = width,
|
|
||||||
.height = height,
|
|
||||||
.stride = stride,
|
|
||||||
.dpi = term->font_dpi,
|
|
||||||
.cell_size = sqrt(pow(term->cell_width, 2) + pow(term->cell_height, 2)),
|
|
||||||
.base_thickness = term->conf->tweak.box_drawing_base_thickness,
|
|
||||||
.solid_shades = term->conf->tweak.box_drawing_solid_shades,
|
|
||||||
};
|
|
||||||
|
|
||||||
buf.thickness[LIGHT] = _thickness(&buf, LIGHT);
|
int base_thickness =
|
||||||
buf.thickness[HEAVY] = _thickness(&buf, HEAVY);
|
(double)term->conf->tweak.box_drawing_base_thickness * scale * cell_size * dpi / 72.0;
|
||||||
|
base_thickness = max(base_thickness, 1);
|
||||||
/* Overlap when width is odd */
|
|
||||||
buf.x_halfs[0] = round(width / 2.); /* Endpoint first half */
|
|
||||||
buf.x_halfs[1] = width / 2; /* Startpoint second half */
|
|
||||||
|
|
||||||
int y0 = 0, y1 = 0;
|
int y0 = 0, y1 = 0;
|
||||||
switch (height % 3) {
|
switch (height % 3) {
|
||||||
|
|
@ -2789,8 +2772,31 @@ box_drawing(const struct terminal *term, wchar_t wc)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf.y_thirds[0] = y0; /* Endpoint first third, start point second third */
|
struct buf buf = {
|
||||||
buf.y_thirds[1] = y1; /* Endpoint second third, start point last third */
|
.data = data,
|
||||||
|
.pix = pix,
|
||||||
|
.format = fmt,
|
||||||
|
.width = width,
|
||||||
|
.height = height,
|
||||||
|
.stride = stride,
|
||||||
|
.solid_shades = term->conf->tweak.box_drawing_solid_shades,
|
||||||
|
|
||||||
|
.thickness = {
|
||||||
|
[LIGHT] = _thickness(base_thickness, LIGHT),
|
||||||
|
[HEAVY] = _thickness(base_thickness, HEAVY),
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Overlap when width is odd */
|
||||||
|
.x_halfs = {
|
||||||
|
round(width / 2.), /* Endpoint first half */
|
||||||
|
width / 2, /* Startpoint second half */
|
||||||
|
},
|
||||||
|
|
||||||
|
.y_thirds = {
|
||||||
|
y0, /* Endpoint first third, start point second third */
|
||||||
|
y1, /* Endpoint second third, start point last third */
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
LOG_DBG("LIGHT=%d, HEAVY=%d",
|
LOG_DBG("LIGHT=%d, HEAVY=%d",
|
||||||
_thickness(&buf, LIGHT), _thickness(&buf, HEAVY));
|
_thickness(&buf, LIGHT), _thickness(&buf, HEAVY));
|
||||||
|
|
|
||||||
38
terminal.c
38
terminal.c
|
|
@ -627,15 +627,6 @@ err_sem_destroy:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
term_pt_or_px_as_pixels(const struct terminal *term,
|
|
||||||
const struct pt_or_px *pt_or_px)
|
|
||||||
{
|
|
||||||
return pt_or_px->px == 0
|
|
||||||
? round(pt_or_px->pt * term->font_dpi / 72)
|
|
||||||
: pt_or_px->px;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
free_box_drawing(struct fcft_glyph **box_drawing)
|
free_box_drawing(struct fcft_glyph **box_drawing)
|
||||||
{
|
{
|
||||||
|
|
@ -802,19 +793,30 @@ get_font_subpixel(const struct terminal *term)
|
||||||
return FCFT_SUBPIXEL_DEFAULT;
|
return FCFT_SUBPIXEL_DEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
bool
|
||||||
font_sized_by_dpi(const struct terminal *term, int scale)
|
term_font_sized_by_dpi(const struct terminal *term, int scale)
|
||||||
{
|
{
|
||||||
return term->conf->dpi_aware == DPI_AWARE_YES ||
|
return term->conf->dpi_aware == DPI_AWARE_YES ||
|
||||||
(term->conf->dpi_aware == DPI_AWARE_AUTO && scale <= 1);
|
(term->conf->dpi_aware == DPI_AWARE_AUTO && scale <= 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
bool
|
||||||
font_sized_by_scale(const struct terminal *term, int scale)
|
term_font_sized_by_scale(const struct terminal *term, int scale)
|
||||||
{
|
{
|
||||||
return !font_sized_by_dpi(term, scale);
|
return !term_font_sized_by_dpi(term, scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
term_pt_or_px_as_pixels(const struct terminal *term,
|
||||||
|
const struct pt_or_px *pt_or_px)
|
||||||
|
{
|
||||||
|
double scale = term_font_sized_by_scale(term, term->scale) ? term->scale : 1.;
|
||||||
|
double dpi = term_font_sized_by_dpi(term, term->scale) ? term->font_dpi : 96.;
|
||||||
|
|
||||||
|
return pt_or_px->px == 0
|
||||||
|
? round(pt_or_px->pt * scale * dpi / 72)
|
||||||
|
: pt_or_px->px;
|
||||||
|
}
|
||||||
|
|
||||||
struct font_load_data {
|
struct font_load_data {
|
||||||
size_t count;
|
size_t count;
|
||||||
|
|
@ -857,7 +859,7 @@ reload_fonts(struct terminal *term)
|
||||||
char size[64];
|
char size[64];
|
||||||
|
|
||||||
const int scale =
|
const int scale =
|
||||||
font_sized_by_scale(term, term->scale) ? term->scale : 1;
|
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",
|
||||||
|
|
@ -892,7 +894,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 = font_sized_by_dpi(term, term->scale);
|
const bool use_dpi = term_font_sized_by_dpi(term, term->scale);
|
||||||
|
|
||||||
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 */
|
||||||
|
|
@ -1981,8 +1983,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 = font_sized_by_dpi(term, old_scale);
|
bool was_scaled_using_dpi = term_font_sized_by_dpi(term, old_scale);
|
||||||
bool will_scale_using_dpi = font_sized_by_dpi(term, term->scale);
|
bool will_scale_using_dpi = term_font_sized_by_dpi(term, term->scale);
|
||||||
|
|
||||||
bool need_font_reload =
|
bool need_font_reload =
|
||||||
was_scaled_using_dpi != will_scale_using_dpi ||
|
was_scaled_using_dpi != will_scale_using_dpi ||
|
||||||
|
|
|
||||||
|
|
@ -643,6 +643,9 @@ bool term_font_size_decrease(struct terminal *term);
|
||||||
bool term_font_size_reset(struct terminal *term);
|
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);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue