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
 }
 

Reply via email to