Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package foot for openSUSE:Factory checked in at 2026-05-15 23:54:42 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/foot (Old) and /work/SRC/openSUSE:Factory/.foot.new.1966 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "foot" Fri May 15 23:54:42 2026 rev:51 rq:1353306 version:1.27.0 Changes: -------- --- /work/SRC/openSUSE:Factory/foot/foot.changes 2026-03-14 22:24:44.362957127 +0100 +++ /work/SRC/openSUSE:Factory/.foot.new.1966/foot.changes 2026-05-15 23:55:19.365585770 +0200 @@ -1,0 +2,14 @@ +Fri May 15 07:03:48 UTC 2026 - Arnav Singh <[email protected]> + +- Update to v1.27.0: + * foot.ini options: + * Added url.style option to choose how URL underlines are drawn. + Defaults to "dotted". + * Cursor now remains visible if its colors and the default colors of + the current cell are all identical. + * Fixed applications receiving garbage in paste responses if the user + typed while the response was being received. + * Fixed a crash and various other issues. + * See https://codeberg.org/dnkl/foot/releases/tag/1.27.0 for more details. + +------------------------------------------------------------------- Old: ---- foot-1.26.1.tar.gz foot-1.26.1.tar.gz.sig New: ---- foot-1.27.0.tar.gz foot-1.27.0.tar.gz.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ foot.spec ++++++ --- /var/tmp/diff_new_pack.IugGQd/_old 2026-05-15 23:55:20.585635992 +0200 +++ /var/tmp/diff_new_pack.IugGQd/_new 2026-05-15 23:55:20.585635992 +0200 @@ -20,7 +20,7 @@ %define _distconfdir %{_sysconfdir} %endif Name: foot -Version: 1.26.1 +Version: 1.27.0 Release: 0 Summary: A Wayland terminal emulator License: MIT ++++++ foot-1.26.1.tar.gz -> foot-1.27.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/foot-1.26.1/CHANGELOG.md new/foot-1.27.0/CHANGELOG.md --- old/foot-1.26.1/CHANGELOG.md 2026-03-14 08:35:28.000000000 +0100 +++ new/foot-1.27.0/CHANGELOG.md 2026-05-15 08:26:04.000000000 +0200 @@ -1,5 +1,6 @@ # Changelog +* [1.27.0](#1-27-0) * [1.26.1](#1-26-1) * [1.26.0](#1-26-0) * [1.25.0](#1-25-0) @@ -68,6 +69,47 @@ * [1.2.0](#1-2-0) +## 1.27.0 + +### Added + +* `url.style=none|single|double|curly|dotted|dashed` option added, + allowing you to configure how URL underlines are drawn. The default + is `dotted` ([#2302][2302]). + +[2302]: https://codeberg.org/dnkl/foot/issues/2302 + + +### Changed + +* URL underlines are now dotted by default, instead of plain + underlines. This can be changed with the new `url.style` option. +* If the cursor foreground and background colors are identical, use + the current cell's foreground and background colors (inverted), + instead of the default foreground and background colors + ([#2323][2323]). + +[2323]: https://codeberg.org/dnkl/foot/issues/2323 + + +### Fixed + +* Other output (key presses, query replies etc) being mixed with paste + data, both interactive pastes and OSC-52 ([#2307][2307]). +* Scrollback search not working correctly when the terminal + application has enabled the kitty keyboard protocol with release + event reporting ([#2316][2316]). +* Keypad escapes in the legacy keyboard protocol ignoring the shift + modifier ([#2324][2324]). +* Crash when querying the kitty notification protocol (OSC-99, with + `p=?`) ([#2335][2335]). + +[2307]: https://codeberg.org/dnkl/foot/issues/2307 +[2316]: https://codeberg.org/dnkl/foot/issues/2316 +[2324]: https://codeberg.org/dnkl/foot/issues/2324 +[2335]: https://codeberg.org/dnkl/foot/issues/2335 + + ## 1.26.1 ### Fixed diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/foot-1.26.1/config.c new/foot-1.27.0/config.c --- old/foot-1.26.1/config.c 2026-03-14 08:35:28.000000000 +0100 +++ new/foot-1.27.0/config.c 2026-05-15 08:26:04.000000000 +0200 @@ -1304,6 +1304,14 @@ else if (streq(key, "label-letters")) return value_to_wchars(ctx, &conf->url.label_letters); + else if (streq(key, "style")) { + _Static_assert(sizeof(conf->url.style) == sizeof(int), + "enum is not 32-bit"); + return value_to_enum( + ctx, (const char *[]){"none", "single", "double", "curly", "dotted", "dashed", NULL}, + (int *)&conf->url.style); + } + else if (streq(key, "osc8-underline")) { _Static_assert(sizeof(conf->url.osc8_underline) == sizeof(int), "enum is not 32-bit"); @@ -3518,6 +3526,7 @@ .url = { .label_letters = xc32dup(U"sadfjklewcmpgh"), .osc8_underline = OSC8_UNDERLINE_URL_MODE, + .style = UNDERLINE_DOTTED, }, .custom_regexes = tll_init(), .can_shape_grapheme = fcft_caps & FCFT_CAPABILITY_GRAPHEME_SHAPING, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/foot-1.26.1/config.h new/foot-1.27.0/config.h --- old/foot-1.26.1/config.h 2026-03-14 08:35:28.000000000 +0100 +++ new/foot-1.27.0/config.h 2026-05-15 08:26:04.000000000 +0200 @@ -218,6 +218,15 @@ CENTER_ALWAYS, }; +enum underline_style { + UNDERLINE_NONE, + UNDERLINE_SINGLE, /* Legacy underline */ + UNDERLINE_DOUBLE, + UNDERLINE_CURLY, + UNDERLINE_DOTTED, + UNDERLINE_DASHED, +}; + struct config { char *conf_path; char *term; @@ -327,6 +336,7 @@ OSC8_UNDERLINE_URL_MODE, OSC8_UNDERLINE_ALWAYS, } osc8_underline; + enum underline_style style; char *regex; regex_t preg; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/foot-1.26.1/doc/foot.ini.5.scd new/foot-1.27.0/doc/foot.ini.5.scd --- old/foot-1.26.1/doc/foot.ini.5.scd 2026-03-14 08:35:28.000000000 +0100 +++ new/foot-1.27.0/doc/foot.ini.5.scd 2026-05-15 08:26:04.000000000 +0200 @@ -867,6 +867,14 @@ Default: _url-mode_ +*style* + The underline style to use when rendering URL underlines. This + applies to both OSC-8 underlines when *osc8-underline=always*, and + all detected URLs in URL mode. One of *none*, *single*, *double*, + *curly*, *dotted* or *dashed*. + + Default: _dotted_ + *label-letters* String of characters to use when generating key sequences for URL jump labels. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/foot-1.26.1/foot.ini new/foot-1.27.0/foot.ini --- old/foot-1.26.1/foot.ini 2026-03-14 08:35:28.000000000 +0100 +++ new/foot-1.27.0/foot.ini 2026-05-15 08:26:04.000000000 +0200 @@ -72,6 +72,7 @@ [url] # launch=xdg-open ${url} # label-letters=sadfjklewcmpgh +# style=dotted (none|single|double|curly|dotted|dashed) # osc8-underline=url-mode # regex=(((https?://|mailto:|ftp://|file:|ssh:|ssh://|git://|tel:|magnet:|ipfs://|ipns://|gemini://|gopher://|news:)|www\.)([0-9a-zA-Z:/?#@!$&*+,;=.~_%^\-]+|\([]\["0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\-]*\)|\[[\(\)"0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\-]*\]|"[]\[\(\)0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\-]*"|'[]\[\(\)0-9a-zA-Z:/?#@!$&*+,;=.~_%^\-]*')+([0-9a-zA-Z/#@$&*+=~_%^\-]|\([]\["0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\-]*\)|\[[\(\)"0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\-]*\]|"[]\[\(\)0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\-]*"|'[]\[\(\)0-9a-zA-Z:/?#@!$&*+,;=.~_%^\-]*')) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/foot-1.26.1/input.c new/foot-1.27.0/input.c --- old/foot-1.26.1/input.c 2026-03-14 08:35:28.000000000 +0100 +++ new/foot-1.27.0/input.c 2026-05-15 08:26:04.000000000 +0200 @@ -1643,31 +1643,34 @@ seat->wayl->key_binding_manager, term->conf, seat); xassert(bindings != NULL); - if (pressed) { - if (term->unicode_mode.active) { + if (term->unicode_mode.active) { + if (pressed) unicode_mode_input(seat, term, sym); - return; - } + return; + } - else if (term->is_searching) { + else if (term->is_searching) { + if (pressed) { if (should_repeat) start_repeater(seat, key); search_input( seat, term, bindings, key, sym, mods, consumed, raw_syms, raw_count, serial); - return; } + return; + } - else if (urls_mode_is_active(term)) { + else if (urls_mode_is_active(term)) { + if (pressed) { if (should_repeat) start_repeater(seat, key); urls_input( seat, term, bindings, key, sym, mods, consumed, raw_syms, raw_count, serial); - return; } + return; } #if defined(_DEBUG) && defined(LOG_ENABLE_DBG) && LOG_ENABLE_DBG diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/foot-1.26.1/keymap.h new/foot-1.27.0/keymap.h --- old/foot-1.26.1/keymap.h 2026-03-14 08:35:28.000000000 +0100 +++ new/foot-1.27.0/keymap.h 2026-05-15 08:26:04.000000000 +0200 @@ -310,28 +310,6 @@ static const struct key_data key_f34[] = {{MOD_NONE, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033[21;5~"}}; static const struct key_data key_f35[] = {{MOD_NONE, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033[23;5~"}}; -/* Keypad keys don't map shift */ -#undef DEFAULT_MODS_FOR_SINGLE -#undef DEFAULT_MODS_FOR_TILDE - -#define DEFAULT_MODS_FOR_SINGLE(sym) \ - {MOD_ALT, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033[1;3"#sym}, \ - {MOD_CTRL, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033[1;5"#sym}, \ - {MOD_ALT | MOD_CTRL, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033[1;7"#sym}, \ - {MOD_META, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033[1;9"#sym}, \ - {MOD_META | MOD_ALT, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033[1;11"#sym}, \ - {MOD_META | MOD_CTRL, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033[1;13"#sym}, \ - {MOD_META | MOD_ALT | MOD_CTRL, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033[1;15"#sym} - -#define DEFAULT_MODS_FOR_TILDE(sym) \ - {MOD_ALT, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033["#sym";3~"}, \ - {MOD_CTRL, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033["#sym";5~"}, \ - {MOD_ALT | MOD_CTRL, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033["#sym";7~"}, \ - {MOD_META, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033["#sym";9~"}, \ - {MOD_META | MOD_ALT, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033["#sym";11~"}, \ - {MOD_META | MOD_CTRL, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033["#sym";13~"}, \ - {MOD_META | MOD_ALT | MOD_CTRL, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033["#sym";15~"} - static const struct key_data key_kp_up[] = { DEFAULT_MODS_FOR_SINGLE(A), {MOD_ANY, CURSOR_KEYS_NORMAL, KEYPAD_DONTCARE, "\033[A"}, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/foot-1.26.1/meson.build new/foot-1.27.0/meson.build --- old/foot-1.26.1/meson.build 2026-03-14 08:35:28.000000000 +0100 +++ new/foot-1.27.0/meson.build 2026-05-15 08:26:04.000000000 +0200 @@ -1,5 +1,5 @@ project('foot', 'c', - version: '1.26.1', + version: '1.27.0', license: 'MIT', meson_version: '>=0.59.0', default_options: [ @@ -96,7 +96,10 @@ cc.get_supported_arguments( ['-pedantic', '-fstrict-aliasing', - '-Wstrict-aliasing']), + '-Wstrict-aliasing']) + + (get_option('fanalyzer') + ? ['-fanalyzer'] + : []), language: 'c', ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/foot-1.26.1/meson_options.txt new/foot-1.27.0/meson_options.txt --- old/foot-1.26.1/meson_options.txt 2026-03-14 08:35:28.000000000 +0100 +++ new/foot-1.27.0/meson_options.txt 2026-05-15 08:26:04.000000000 +0200 @@ -27,3 +27,5 @@ description: 'Which utmp logging backend to use. This affects how (with what arguments) the utmp helper binary (see \'utmp-default-helper-path\')is called. Default: auto (linux=libutempter, freebsd=ulog, others=none)') option('utmp-default-helper-path', type: 'string', value: 'auto', description: 'Default path to the utmp helper binary. Default: auto-detect') + +option('fanalyzer', type: 'boolean', value: false, description: 'enable GCC static analyzer') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/foot-1.26.1/osc.c new/foot-1.27.0/osc.c --- old/foot-1.26.1/osc.c 2026-03-14 08:35:28.000000000 +0100 +++ new/foot-1.27.0/osc.c 2026-05-15 08:26:04.000000000 +0200 @@ -261,12 +261,12 @@ if (from_clipboard) { text_from_clipboard( - seat, term, &from_clipboard_cb, &from_clipboard_done, ctx); + seat, term, true, &from_clipboard_cb, &from_clipboard_done, ctx); } if (from_primary) { text_from_primary( - seat, term, &from_clipboard_cb, &from_clipboard_done, ctx); + seat, term, true, &from_clipboard_cb, &from_clipboard_done, ctx); } } @@ -761,13 +761,12 @@ const char *terminator = term->vt.osc.bel ? "\a" : "\033\\"; - char reply[128]; + char reply[512]; size_t n = xsnprintf( reply, sizeof(reply), "\033]99;i=%s:p=?;p=%s:a=%s:o=%s:u=%s:c=1:w=1:s=system,silent,error,warn,warning,info,question%s", reply_id, p_caps, a_caps, when_caps, u_caps, terminator); - xassert(n < sizeof(reply)); term_to_slave(term, reply, n); goto out; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/foot-1.26.1/render.c new/foot-1.27.0/render.c --- old/foot-1.26.1/render.c 2026-03-14 08:35:28.000000000 +0100 +++ new/foot-1.27.0/render.c 2026-05-15 08:26:04.000000000 +0200 @@ -614,12 +614,21 @@ *text_color = *bg; } - if (text_color->red == cursor_color->red && - text_color->green == cursor_color->green && - text_color->blue == cursor_color->blue) + if (unlikely(text_color->red == cursor_color->red && + text_color->green == cursor_color->green && + text_color->blue == cursor_color->blue)) { - *text_color = color_hex_to_pixman(term->colors.bg, gamma_correct); - *cursor_color = color_hex_to_pixman(term->colors.fg, gamma_correct); + *text_color = *bg; + *cursor_color = *fg; + + if (text_color->red == cursor_color->red && + text_color->green == cursor_color->green && + text_color->blue == cursor_color->blue) + { + cursor_color->red = ~cursor_color->red; + cursor_color->green = ~cursor_color->green; + cursor_color->blue = ~cursor_color->blue; + } } } @@ -1171,13 +1180,16 @@ if (cell->attrs.strikethrough) draw_strikeout(term, pix, font, &fg, x, y, cell_cols); - if (unlikely(cell->attrs.url)) { + if (unlikely(cell->attrs.url && term->conf->url.style != UNDERLINE_NONE)) { pixman_color_t url_color = color_hex_to_pixman( term->conf->colors_dark.use_custom.url ? term->conf->colors_dark.url : term->colors.table[3], gamma_correct); - draw_underline(term, pix, font, &url_color, x, y, cell_cols); + + draw_styled_underline( + term, pix, font, &url_color, term->conf->url.style, + x, y, cell_cols); } draw_cursor: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/foot-1.26.1/search.c new/foot-1.27.0/search.c --- old/foot-1.26.1/search.c 2026-03-14 08:35:28.000000000 +0100 +++ new/foot-1.27.0/search.c 2026-05-15 08:26:04.000000000 +0200 @@ -1375,13 +1375,13 @@ case BIND_ACTION_SEARCH_CLIPBOARD_PASTE: text_from_clipboard( - seat, term, &from_clipboard_cb, &from_clipboard_done, term); + seat, term, false, &from_clipboard_cb, &from_clipboard_done, term); *update_search_result = *redraw = true; return true; case BIND_ACTION_SEARCH_PRIMARY_PASTE: text_from_primary( - seat, term, &from_clipboard_cb, &from_clipboard_done, term); + seat, term, false, &from_clipboard_cb, &from_clipboard_done, term); *update_search_result = *redraw = true; return true; @@ -1433,6 +1433,7 @@ &update_search_result, &search_direction, &redraw)) { + seat->kbd.last_shortcut_sym = sym; goto update_search; } return; @@ -1451,6 +1452,7 @@ &update_search_result, &search_direction, &redraw)) { + seat->kbd.last_shortcut_sym = sym; goto update_search; } return; @@ -1470,6 +1472,7 @@ &update_search_result, &search_direction, &redraw)) { + seat->kbd.last_shortcut_sym = sym; goto update_search; } return; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/foot-1.26.1/selection.c new/foot-1.27.0/selection.c --- old/foot-1.26.1/selection.c 2026-03-14 08:35:28.000000000 +0100 +++ new/foot-1.27.0/selection.c 2026-05-15 08:26:04.000000000 +0200 @@ -2006,6 +2006,7 @@ int timeout_fd; struct itimerspec timeout; bool bracketed; + bool no_strip; bool quote_paths; void (*decoder)(struct clipboard_receive *ctx, char *data, size_t size); @@ -2153,6 +2154,8 @@ fdm_receive(struct fdm *fdm, int fd, int events, void *data) { struct clipboard_receive *ctx = data; + const bool no_strip = ctx->no_strip; + const bool bracketed = ctx->bracketed; if ((events & EPOLLHUP) && !(events & EPOLLIN)) goto done; @@ -2204,13 +2207,14 @@ break; case '\n': - if (!ctx->bracketed) + if (!no_strip && !bracketed) { p[i] = '\r'; + } break; case '\r': /* Convert \r\n -> \r */ - if (!ctx->bracketed && i + 1 < left && p[i + 1] == '\n') { + if (!no_strip && !bracketed && i + 1 < left && p[i + 1] == '\n') { i++; skip_one(); goto again; @@ -2223,8 +2227,11 @@ case '\x11': case '\x12': case '\x13': case '\x14': case '\x15': case '\x16': case '\x17': case '\x18': case '\x19': case '\x1a': case '\x1b': case '\x1c': case '\x1d': case '\x1e': case '\x1f': - skip_one(); - goto again; + if (!no_strip) { + skip_one(); + goto again; + } + break; /* * In addition to stripping non-formatting C0 controls, @@ -2242,7 +2249,7 @@ * handled above. */ case '\b': case '\x7f': case '\x00': - if (!ctx->bracketed) { + if (!no_strip && !bracketed) { skip_one(); goto again; } @@ -2263,8 +2270,8 @@ } static void -begin_receive_clipboard(struct terminal *term, int read_fd, - enum data_offer_mime_type mime_type, +begin_receive_clipboard(struct terminal *term, bool no_strip, + int read_fd, enum data_offer_mime_type mime_type, void (*cb)(char *data, size_t size, void *user), void (*done)(void *user), void *user) { @@ -2297,6 +2304,7 @@ .timeout_fd = timeout_fd, .timeout = timeout, .bracketed = term->bracketed_paste, + .no_strip = no_strip, .quote_paths = term->grid == &term->normal, .decoder = (mime_type == DATA_OFFER_MIME_URI_LIST ? &fdm_receive_decoder_uri @@ -2326,6 +2334,7 @@ void text_from_clipboard(struct seat *seat, struct terminal *term, + bool no_strip, void (*cb)(char *data, size_t size, void *user), void (*done)(void *user), void *user) { @@ -2358,7 +2367,8 @@ /* Don't keep our copy of the write-end open (or we'll never get EOF) */ close(write_fd); - begin_receive_clipboard(term, read_fd, clipboard->mime_type, cb, done, user); + begin_receive_clipboard( + term, no_strip, read_fd, clipboard->mime_type, cb, done, user); } static void @@ -2401,7 +2411,8 @@ if (term->bracketed_paste) term_paste_data_to_slave(term, "\033[200~", 6); - text_from_clipboard(seat, term, &receive_offer, &receive_offer_done, term); + text_from_clipboard( + seat, term, false, &receive_offer, &receive_offer_done, term); } bool @@ -2470,7 +2481,7 @@ void text_from_primary( - struct seat *seat, struct terminal *term, + struct seat *seat, struct terminal *term, bool no_strip, void (*cb)(char *data, size_t size, void *user), void (*done)(void *user), void *user) { @@ -2508,7 +2519,8 @@ /* Don't keep our copy of the write-end open (or we'll never get EOF) */ close(write_fd); - begin_receive_clipboard(term, read_fd, primary->mime_type, cb, done, user); + begin_receive_clipboard( + term, no_strip, read_fd, primary->mime_type, cb, done, user); } void @@ -2530,7 +2542,8 @@ if (term->bracketed_paste) term_paste_data_to_slave(term, "\033[200~", 6); - text_from_primary(seat, term, &receive_offer, &receive_offer_done, term); + text_from_primary( + seat, term, false, &receive_offer, &receive_offer_done, term); } static void @@ -2819,7 +2832,7 @@ term_paste_data_to_slave(term, "\033[200~", 6); begin_receive_clipboard( - term, read_fd, clipboard->mime_type, + term, false, read_fd, clipboard->mime_type, &receive_dnd, &receive_dnd_done, ctx); /* data offer is now "owned" by the receive context */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/foot-1.26.1/selection.h new/foot-1.27.0/selection.h --- old/foot-1.26.1/selection.h 2026-03-14 08:35:28.000000000 +0100 +++ new/foot-1.27.0/selection.h 2026-05-15 08:26:04.000000000 +0200 @@ -63,12 +63,12 @@ * point). */ void text_from_clipboard( - struct seat *seat, struct terminal *term, + struct seat *seat, struct terminal *term, bool no_strip, void (*cb)(char *data, size_t size, void *user), void (*done)(void *user), void *user); void text_from_primary( - struct seat *seat, struct terminal *term, + struct seat *seat, struct terminal *term, bool no_strip, void (*cb)(char *data, size_t size, void *user), void (*dont)(void *user), void *user); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/foot-1.26.1/terminal.c new/foot-1.27.0/terminal.c --- old/foot-1.26.1/terminal.c 2026-03-14 08:35:28.000000000 +0100 +++ new/foot-1.27.0/terminal.c 2026-05-15 08:26:04.000000000 +0200 @@ -120,7 +120,10 @@ return false; } - if (tll_length(term->ptmx_buffers) > 0 || term->is_sending_paste_data) { + if (unlikely(tll_length(term->ptmx_buffers) > 0 || + term->is_sending_paste_data || + tll_length(term->ptmx_paste_buffers) > 0)) + { /* * Don't even try to send data *now* if there's queued up * data, since that would result in events arriving out of diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/foot-1.26.1/terminal.h new/foot-1.27.0/terminal.h --- old/foot-1.26.1/terminal.h 2026-03-14 08:35:28.000000000 +0100 +++ new/foot-1.27.0/terminal.h 2026-05-15 08:26:04.000000000 +0200 @@ -105,15 +105,6 @@ char *uri; }; -enum underline_style { - UNDERLINE_NONE, - UNDERLINE_SINGLE, /* Legacy underline */ - UNDERLINE_DOUBLE, - UNDERLINE_CURLY, - UNDERLINE_DOTTED, - UNDERLINE_DASHED, -}; - struct underline_range_data { enum underline_style style; enum color_source color_src; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/foot-1.26.1/tests/test-config.c new/foot-1.27.0/tests/test-config.c --- old/foot-1.26.1/tests/test-config.c 2026-03-14 08:35:28.000000000 +0100 +++ new/foot-1.27.0/tests/test-config.c 2026-05-15 08:26:04.000000000 +0200 @@ -632,6 +632,10 @@ (const char *[]){"url-mode", "always"}, (int []){OSC8_UNDERLINE_URL_MODE, OSC8_UNDERLINE_ALWAYS}, (int *)&conf.url.osc8_underline); + test_enum(&ctx, &parse_section_url, "style", + 6, (const char *[]){"none", "single", "double", "curly", "dotted", "dashed"}, + (int []){UNDERLINE_NONE, UNDERLINE_SINGLE, UNDERLINE_DOUBLE, UNDERLINE_CURLY, UNDERLINE_DOTTED, UNDERLINE_DASHED}, + (int *)&conf.url.style); test_c32string(&ctx, &parse_section_url, "label-letters", &conf.url.label_letters); config_free(&conf); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/foot-1.26.1/unicode-mode.c new/foot-1.27.0/unicode-mode.c --- old/foot-1.26.1/unicode-mode.c 2026-03-14 08:35:28.000000000 +0100 +++ new/foot-1.27.0/unicode-mode.c 2026-05-15 08:26:04.000000000 +0200 @@ -63,6 +63,7 @@ term_to_slave(term, utf8, chars); } + seat->kbd.last_shortcut_sym = sym; unicode_mode_deactivate(term); } @@ -72,6 +73,7 @@ sym == XKB_KEY_d || sym == XKB_KEY_g))) { + seat->kbd.last_shortcut_sym = sym; unicode_mode_deactivate(term); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/foot-1.26.1/uri.c new/foot-1.27.0/uri.c --- old/foot-1.26.1/uri.c 2026-03-14 08:35:28.000000000 +0100 +++ new/foot-1.27.0/uri.c 2026-05-15 08:26:04.000000000 +0200 @@ -144,7 +144,7 @@ const char *query_start = memchr(start, '?', left); const char *fragment_start = memchr(start, '#', left); - if (streq(*scheme, "file")) { + if (scheme != NULL && streq(*scheme, "file")) { /* Don't try to parse query/fragment in file URIs, just treat the remaining text as path */ query_start = NULL; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/foot-1.26.1/url-mode.c new/foot-1.27.0/url-mode.c --- old/foot-1.26.1/url-mode.c 2026-03-14 08:35:28.000000000 +0100 +++ new/foot-1.27.0/url-mode.c 2026-05-15 08:26:04.000000000 +0200 @@ -204,6 +204,7 @@ for (size_t i = 0; i < raw_count; i++) { if (bind->k.sym == raw_syms[i]) { execute_binding(seat, term, bind, serial); + seat->kbd.last_shortcut_sym = sym; return; } } @@ -217,6 +218,7 @@ bind->mods == (mods & ~consumed)) { execute_binding(seat, term, bind, serial); + seat->kbd.last_shortcut_sym = sym; return; } @@ -232,6 +234,7 @@ tll_foreach(bind->k.key_codes, code) { if (code->item == key) { execute_binding(seat, term, bind, serial); + seat->kbd.last_shortcut_sym = sym; return; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/foot-1.26.1/wayland.c new/foot-1.27.0/wayland.c --- old/foot-1.26.1/wayland.c 2026-03-14 08:35:28.000000000 +0100 +++ new/foot-1.27.0/wayland.c 2026-05-15 08:26:04.000000000 +0200 @@ -1,5 +1,6 @@ #include "wayland.h" +#include <ctype.h> #include <errno.h> #include <fcntl.h> #include <locale.h> @@ -245,19 +246,34 @@ case WL_SHM_FORMAT_ABGR16161616: wayl->shm_have_abgr161616 = true; break; } -#if defined(_DEBUG) +#if defined(_DEBUG) && LOG_ENABLE_DBG == 1 bool have_description = false; + const char c4 = (format >> 24) & 0xff; + const char c3 = (format >> 16) & 0xff; + const char c2 = (format >> 8) & 0xff; + const char c1 = (format >> 0) & 0xff; for (size_t i = 0; i < ALEN(shm_formats); i++) { if (shm_formats[i].format == format) { - LOG_DBG("shm: 0x%08x: %s", format, shm_formats[i].description); + LOG_DBG("shm: 0x%08x: %c%c%c%c - %s", + format, + isprint(c1) ? c1 : ' ', + isprint(c2) ? c2 : ' ', + isprint(c3) ? c3 : ' ', + isprint(c4) ? c4 : ' ', + shm_formats[i].description); have_description = true; break; } } if (!have_description) - LOG_DBG("shm: 0x%08x: unknown", format); + LOG_DBG("shm: 0x%08x: %c%c%c%c - unknown", + format, + isprint(c1) ? c1 : ' ', + isprint(c2) ? c2 : ' ', + isprint(c3) ? c3 : ' ', + isprint(c4) ? c4 : ' '); #endif }
