mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-03-20 05:33:47 -04:00
Merge branch 'master' into releases/1.17
This commit is contained in:
commit
883fc6be27
8 changed files with 110 additions and 25 deletions
|
|
@ -1,11 +1,14 @@
|
||||||
|
# -*- yaml -*-
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: codespell
|
- name: codespell
|
||||||
when:
|
when:
|
||||||
branch:
|
- event: [manual, pull_request]
|
||||||
- master
|
- event: [push, tag]
|
||||||
- releases/*
|
branch: [master, releases/*]
|
||||||
image: alpine:edge
|
image: alpine:edge
|
||||||
commands:
|
commands:
|
||||||
|
- apk add openssl
|
||||||
- apk add python3
|
- apk add python3
|
||||||
- apk add py3-pip
|
- apk add py3-pip
|
||||||
- python3 -m venv codespell-venv
|
- python3 -m venv codespell-venv
|
||||||
|
|
@ -16,9 +19,9 @@ steps:
|
||||||
|
|
||||||
- name: subprojects
|
- name: subprojects
|
||||||
when:
|
when:
|
||||||
branch:
|
- event: [manual, pull_request]
|
||||||
- master
|
- event: [push, tag]
|
||||||
- releases/*
|
branch: [master, releases/*]
|
||||||
image: alpine:edge
|
image: alpine:edge
|
||||||
commands:
|
commands:
|
||||||
- apk add git
|
- apk add git
|
||||||
|
|
@ -29,9 +32,9 @@ steps:
|
||||||
|
|
||||||
- name: x64
|
- name: x64
|
||||||
when:
|
when:
|
||||||
branch:
|
- event: [manual, pull_request]
|
||||||
- master
|
- event: [push, tag]
|
||||||
- releases/*
|
branch: [master, releases/*]
|
||||||
depends_on: [subprojects]
|
depends_on: [subprojects]
|
||||||
image: alpine:edge
|
image: alpine:edge
|
||||||
commands:
|
commands:
|
||||||
|
|
@ -86,9 +89,9 @@ steps:
|
||||||
|
|
||||||
- name: x86
|
- name: x86
|
||||||
when:
|
when:
|
||||||
branch:
|
- event: [manual, pull_request]
|
||||||
- master
|
- event: [push, tag]
|
||||||
- releases/*
|
branch: [master, releases/*]
|
||||||
depends_on: [subprojects]
|
depends_on: [subprojects]
|
||||||
image: i386/alpine:edge
|
image: i386/alpine:edge
|
||||||
commands:
|
commands:
|
||||||
|
|
|
||||||
27
CHANGELOG.md
27
CHANGELOG.md
|
|
@ -1,5 +1,6 @@
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
* [Unreleased](#unreleased)
|
||||||
* [1.17.1](#1-17-1)
|
* [1.17.1](#1-17-1)
|
||||||
* [1.17.0](#1-17-0)
|
* [1.17.0](#1-17-0)
|
||||||
* [1.16.2](#1-16-2)
|
* [1.16.2](#1-16-2)
|
||||||
|
|
@ -50,6 +51,32 @@
|
||||||
* [1.2.0](#1-2-0)
|
* [1.2.0](#1-2-0)
|
||||||
|
|
||||||
|
|
||||||
|
## Unreleased
|
||||||
|
### Added
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
* Notifications with invalid UTF-8 strings are now ignored.
|
||||||
|
|
||||||
|
|
||||||
|
### Deprecated
|
||||||
|
### Removed
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
* Crash when changing aspect ratio of a sixel, in the middle of the
|
||||||
|
sixel data (this is unsupported in foot, but should of course not
|
||||||
|
result in a crash).
|
||||||
|
* Crash when printing double-width (or longer) characters to, or near,
|
||||||
|
the last column, when auto-wrap (private mode 7) has been disabled.
|
||||||
|
* Dynamically sized sixel being trimmed to nothing.
|
||||||
|
* Flickering with `dpi-aware=yes` and window is unmapped/remapped
|
||||||
|
(some compositors do this when window is minimized), in a
|
||||||
|
multi-monitor setup with different monitor DPIs.
|
||||||
|
|
||||||
|
|
||||||
|
### Security
|
||||||
|
### Contributors
|
||||||
|
|
||||||
|
|
||||||
## 1.17.1
|
## 1.17.1
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
|
||||||
13
osc.c
13
osc.c
|
|
@ -524,6 +524,19 @@ osc_notify(struct terminal *term, char *string)
|
||||||
const char *title = strtok_r(string, ";", &ctx);
|
const char *title = strtok_r(string, ";", &ctx);
|
||||||
const char *msg = strtok_r(NULL, "\x00", &ctx);
|
const char *msg = strtok_r(NULL, "\x00", &ctx);
|
||||||
|
|
||||||
|
if (title == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (mbsntoc32(NULL, title, strlen(title), 0) == (char32_t)-1) {
|
||||||
|
LOG_WARN("%s: notification title is not valid UTF-8, ignoring", title);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msg != NULL && mbsntoc32(NULL, msg, strlen(msg), 0) == (char32_t)-1) {
|
||||||
|
LOG_WARN("%s: notification message is not valid UTF-8, ignoring", msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
notify_notify(term, title, msg != NULL ? msg : "");
|
notify_notify(term, title, msg != NULL ? msg : "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
33
sixel.c
33
sixel.c
|
|
@ -1400,7 +1400,7 @@ resize_horizontally(struct terminal *term, int new_width_mutable)
|
||||||
new_width_mutable = term->sixel.max_width;
|
new_width_mutable = term->sixel.max_width;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlikely(term->sixel.image.width == new_width_mutable))
|
if (unlikely(term->sixel.image.width >= new_width_mutable))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const int sixel_row_height = 6 * term->sixel.pan;
|
const int sixel_row_height = 6 * term->sixel.pan;
|
||||||
|
|
@ -1414,6 +1414,7 @@ resize_horizontally(struct terminal *term, int new_width_mutable)
|
||||||
/* Lazy initialize height on first printed sixel */
|
/* Lazy initialize height on first printed sixel */
|
||||||
xassert(old_width == 0);
|
xassert(old_width == 0);
|
||||||
term->sixel.image.height = height = sixel_row_height;
|
term->sixel.image.height = height = sixel_row_height;
|
||||||
|
term->sixel.image.alloc_height = sixel_row_height;
|
||||||
} else
|
} else
|
||||||
height = term->sixel.image.height;
|
height = term->sixel.image.height;
|
||||||
|
|
||||||
|
|
@ -1423,6 +1424,7 @@ resize_horizontally(struct terminal *term, int new_width_mutable)
|
||||||
|
|
||||||
int alloc_height = (height + sixel_row_height - 1) / sixel_row_height * sixel_row_height;
|
int alloc_height = (height + sixel_row_height - 1) / sixel_row_height * sixel_row_height;
|
||||||
|
|
||||||
|
xassert(new_width >= old_width);
|
||||||
xassert(new_width > 0);
|
xassert(new_width > 0);
|
||||||
xassert(alloc_height > 0);
|
xassert(alloc_height > 0);
|
||||||
|
|
||||||
|
|
@ -1474,6 +1476,7 @@ resize_vertically(struct terminal *term, const int new_height)
|
||||||
if (unlikely(width == 0)) {
|
if (unlikely(width == 0)) {
|
||||||
xassert(term->sixel.image.data == NULL);
|
xassert(term->sixel.image.data == NULL);
|
||||||
term->sixel.image.height = new_height;
|
term->sixel.image.height = new_height;
|
||||||
|
term->sixel.image.alloc_height = alloc_height;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1508,7 +1511,7 @@ resize(struct terminal *term, int new_width_mutable, int new_height_mutable)
|
||||||
{
|
{
|
||||||
LOG_DBG("resizing image: %dx%d -> %dx%d",
|
LOG_DBG("resizing image: %dx%d -> %dx%d",
|
||||||
term->sixel.image.width, term->sixel.image.height,
|
term->sixel.image.width, term->sixel.image.height,
|
||||||
new_width, new_height);
|
new_width_mutable, new_height_mutable);
|
||||||
|
|
||||||
if (unlikely(new_width_mutable > term->sixel.max_width)) {
|
if (unlikely(new_width_mutable > term->sixel.max_width)) {
|
||||||
LOG_WARN("maximum image width exceeded, truncating");
|
LOG_WARN("maximum image width exceeded, truncating");
|
||||||
|
|
@ -1849,12 +1852,32 @@ decgra(struct terminal *term, uint8_t c)
|
||||||
pan = pan > 0 ? pan : 1;
|
pan = pan > 0 ? pan : 1;
|
||||||
pad = pad > 0 ? pad : 1;
|
pad = pad > 0 ? pad : 1;
|
||||||
|
|
||||||
|
if (likely(term->sixel.image.width == 0 &&
|
||||||
|
term->sixel.image.height == 0))
|
||||||
|
{
|
||||||
|
term->sixel.pan = pan;
|
||||||
|
term->sixel.pad = pad;
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Unsure what the VT340 does...
|
||||||
|
*
|
||||||
|
* We currently do *not* handle changing pan/pad in the
|
||||||
|
* middle of a sixel, since that means resizing/stretching
|
||||||
|
* the existing image.
|
||||||
|
*
|
||||||
|
* I'm *guessing* the VT340 simply changes the aspect
|
||||||
|
* ratio of all subsequent sixels. But, given the design
|
||||||
|
* of our implementation (the entire sixel is written to a
|
||||||
|
* single pixman image), we can't easily do that.
|
||||||
|
*/
|
||||||
|
LOG_WARN("sixel: unsupported: pan/pad changed after printing sixels");
|
||||||
|
pan = term->sixel.pan;
|
||||||
|
pad = term->sixel.pad;
|
||||||
|
}
|
||||||
|
|
||||||
pv *= pan;
|
pv *= pan;
|
||||||
ph *= pad;
|
ph *= pad;
|
||||||
|
|
||||||
term->sixel.pan = pan;
|
|
||||||
term->sixel.pad = pad;
|
|
||||||
|
|
||||||
LOG_DBG("pan=%u, pad=%u (aspect ratio = %d:%d), size=%ux%u",
|
LOG_DBG("pan=%u, pad=%u (aspect ratio = %d:%d), size=%ux%u",
|
||||||
pan, pad, pan, pad, ph, pv);
|
pan, pad, pan, pad, ph, pv);
|
||||||
|
|
||||||
|
|
|
||||||
31
terminal.c
31
terminal.c
|
|
@ -858,9 +858,25 @@ get_font_dpi(const struct terminal *term)
|
||||||
xassert(tll_length(term->wl->monitors) > 0);
|
xassert(tll_length(term->wl->monitors) > 0);
|
||||||
|
|
||||||
const struct wl_window *win = term->window;
|
const struct wl_window *win = term->window;
|
||||||
const struct monitor *mon = tll_length(win->on_outputs) > 0
|
const struct monitor *mon = NULL;
|
||||||
? tll_back(win->on_outputs)
|
|
||||||
: &tll_front(term->wl->monitors);
|
if (tll_length(win->on_outputs) > 0)
|
||||||
|
mon = tll_back(win->on_outputs);
|
||||||
|
else {
|
||||||
|
if (term->font_dpi_before_unmap > 0.) {
|
||||||
|
/*
|
||||||
|
* Use last known "good" DPI
|
||||||
|
*
|
||||||
|
* This avoids flickering when window is unmapped/mapped
|
||||||
|
* (some compositors do this when a window is minimized),
|
||||||
|
* on a multi-monitor setup with different monitor DPIs.
|
||||||
|
*/
|
||||||
|
return term->font_dpi_before_unmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tll_length(term->wl->monitors) > 0)
|
||||||
|
mon = &tll_front(term->wl->monitors);
|
||||||
|
}
|
||||||
|
|
||||||
if (term_fractional_scaling(term))
|
if (term_fractional_scaling(term))
|
||||||
return mon != NULL ? mon->dpi.physical : 96.;
|
return mon != NULL ? mon->dpi.physical : 96.;
|
||||||
|
|
@ -1182,6 +1198,7 @@ term_init(const struct config *conf, struct fdm *fdm, struct reaper *reaper,
|
||||||
xmalloc(sizeof(term->font_sizes[3][0]) * conf->fonts[3].count),
|
xmalloc(sizeof(term->font_sizes[3][0]) * conf->fonts[3].count),
|
||||||
},
|
},
|
||||||
.font_dpi = 0.,
|
.font_dpi = 0.,
|
||||||
|
.font_dpi_before_unmap = -1.,
|
||||||
.font_subpixel = (conf->colors.alpha == 0xffff /* Can't do subpixel rendering on transparent background */
|
.font_subpixel = (conf->colors.alpha == 0xffff /* Can't do subpixel rendering on transparent background */
|
||||||
? FCFT_SUBPIXEL_DEFAULT
|
? FCFT_SUBPIXEL_DEFAULT
|
||||||
: FCFT_SUBPIXEL_NONE),
|
: FCFT_SUBPIXEL_NONE),
|
||||||
|
|
@ -2181,7 +2198,7 @@ term_fractional_scaling(const struct terminal *term)
|
||||||
bool
|
bool
|
||||||
term_preferred_buffer_scale(const struct terminal *term)
|
term_preferred_buffer_scale(const struct terminal *term)
|
||||||
{
|
{
|
||||||
return term->wl->has_wl_compositor_v6 && term->window->preferred_buffer_scale > 0;
|
return term->window->preferred_buffer_scale > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
@ -2250,6 +2267,7 @@ term_font_dpi_changed(struct terminal *term, float old_scale)
|
||||||
}
|
}
|
||||||
|
|
||||||
term->font_dpi = dpi;
|
term->font_dpi = dpi;
|
||||||
|
term->font_dpi_before_unmap = dpi;
|
||||||
term->font_is_sized_by_dpi = will_scale_using_dpi;
|
term->font_is_sized_by_dpi = will_scale_using_dpi;
|
||||||
|
|
||||||
if (!need_font_reload)
|
if (!need_font_reload)
|
||||||
|
|
@ -3680,11 +3698,13 @@ term_print(struct terminal *term, char32_t wc, int width)
|
||||||
grid_row_uri_range_erase(row, col, col + width - 1);
|
grid_row_uri_range_erase(row, col, col + width - 1);
|
||||||
|
|
||||||
/* Advance cursor the 'additional' columns while dirty:ing the cells */
|
/* Advance cursor the 'additional' columns while dirty:ing the cells */
|
||||||
for (int i = 1; i < width && col < term->cols; i++) {
|
for (int i = 1; i < width && (col + 1) < term->cols; i++) {
|
||||||
col++;
|
col++;
|
||||||
print_spacer(term, col, width - i);
|
print_spacer(term, col, width - i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
xassert(col < term->cols);
|
||||||
|
|
||||||
/* Advance cursor */
|
/* Advance cursor */
|
||||||
if (unlikely(++col >= term->cols)) {
|
if (unlikely(++col >= term->cols)) {
|
||||||
grid->cursor.lcf = true;
|
grid->cursor.lcf = true;
|
||||||
|
|
@ -3726,6 +3746,7 @@ ascii_printer_fast(struct terminal *term, char32_t wc)
|
||||||
|
|
||||||
/* Advance cursor */
|
/* Advance cursor */
|
||||||
if (unlikely(++col >= term->cols)) {
|
if (unlikely(++col >= term->cols)) {
|
||||||
|
xassert(col == term->cols);
|
||||||
grid->cursor.lcf = true;
|
grid->cursor.lcf = true;
|
||||||
col--;
|
col--;
|
||||||
} else
|
} else
|
||||||
|
|
|
||||||
|
|
@ -406,6 +406,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;
|
||||||
|
float font_dpi_before_unmap;
|
||||||
bool font_is_sized_by_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;
|
||||||
|
|
|
||||||
|
|
@ -1096,7 +1096,6 @@ handle_global(void *data, struct wl_registry *registry,
|
||||||
|
|
||||||
#if defined (WL_SURFACE_PREFERRED_BUFFER_SCALE_SINCE_VERSION)
|
#if defined (WL_SURFACE_PREFERRED_BUFFER_SCALE_SINCE_VERSION)
|
||||||
const uint32_t preferred = WL_SURFACE_PREFERRED_BUFFER_SCALE_SINCE_VERSION;
|
const uint32_t preferred = WL_SURFACE_PREFERRED_BUFFER_SCALE_SINCE_VERSION;
|
||||||
wayl->has_wl_compositor_v6 = version >= WL_SURFACE_PREFERRED_BUFFER_SCALE_SINCE_VERSION;
|
|
||||||
#else
|
#else
|
||||||
const uint32_t preferred = required;
|
const uint32_t preferred = required;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -430,8 +430,6 @@ struct wayland {
|
||||||
struct wl_subcompositor *sub_compositor;
|
struct wl_subcompositor *sub_compositor;
|
||||||
struct wl_shm *shm;
|
struct wl_shm *shm;
|
||||||
|
|
||||||
bool has_wl_compositor_v6;
|
|
||||||
|
|
||||||
struct zxdg_output_manager_v1 *xdg_output_manager;
|
struct zxdg_output_manager_v1 *xdg_output_manager;
|
||||||
|
|
||||||
struct xdg_wm_base *shell;
|
struct xdg_wm_base *shell;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue