Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package foot for openSUSE:Factory checked in 
at 2025-09-12 21:10:47
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/foot (Old)
 and      /work/SRC/openSUSE:Factory/.foot.new.1977 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "foot"

Fri Sep 12 21:10:47 2025 rev:47 rq:1304344 version:1.24.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/foot/foot.changes        2025-07-23 
16:39:01.997198902 +0200
+++ /work/SRC/openSUSE:Factory/.foot.new.1977/foot.changes      2025-09-12 
21:11:57.865386106 +0200
@@ -1,0 +2,19 @@
+Fri Sep 12 15:41:55 UTC 2025 - Arnav Singh <[email protected]>
+
+- Update to v1.24.0:
+  * foot.ini options:
+    * Added new main.uppercase-regex-insert option to control whether or not
+      an uppercase hint character will insert the selected text into the prompt
+      in regex-copy or show-urls-copy mode, ie the wezterm-inspired behavior
+      introduced in v1.23.0. It defaults to true.
+  * Label letters are no longer sorted before being assigned to URLs.
+  * Sending SIGUSR1/SIGUSR2 to a foot --server process now causes
+    newly spawned client instances to use the selected theme,
+    instead of the original one.
+  * SIGUSR1/SIGUSR2 can now be sent to a footclient process to change the theme
+    of that particular instance.
+  * Fixed invalid values in foot.ini overriding other valid ones,
+    which would cause misbehavior or crashes.
+  * See https://codeberg.org/dnkl/foot/releases/tag/1.24.0 for more details.
+
+-------------------------------------------------------------------

Old:
----
  foot-1.23.1.tar.gz
  foot-1.23.1.tar.gz.sig

New:
----
  foot-1.24.0.tar.gz
  foot-1.24.0.tar.gz.sig

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ foot.spec ++++++
--- /var/tmp/diff_new_pack.5KbDDf/_old  2025-09-12 21:11:58.493412588 +0200
+++ /var/tmp/diff_new_pack.5KbDDf/_new  2025-09-12 21:11:58.493412588 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package foot
 #
-# Copyright (c) 2025 SUSE LLC
+# Copyright (c) 2025 SUSE LLC and contributors
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -20,7 +20,7 @@
 %define _distconfdir %{_sysconfdir}
 %endif
 Name:           foot
-Version:        1.23.1
+Version:        1.24.0
 Release:        0
 Summary:        A Wayland terminal emulator
 License:        MIT

++++++ foot-1.23.1.tar.gz -> foot-1.24.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.23.1/CHANGELOG.md new/foot-1.24.0/CHANGELOG.md
--- old/foot-1.23.1/CHANGELOG.md        2025-07-23 08:28:13.000000000 +0200
+++ new/foot-1.24.0/CHANGELOG.md        2025-09-12 10:18:33.000000000 +0200
@@ -1,5 +1,6 @@
 # Changelog
 
+* [1.24.0](#1-24-0)
 * [1.23.1](#1-23-1)
 * [1.23.0](#1-23-0)
 * [1.22.3](#1-22-3)
@@ -64,6 +65,42 @@
 * [1.2.0](#1-2-0)
 
 
+## 1.24.0
+
+### Added
+
+* The `uppercase-regex-insert` option controls whether an uppercase hint
+  character will insert the selected text into the prompt in `regex-copy`
+  or `show-urls-copy` mode. It defaults to `true`. ([#2159][2159]).
+
+[2159]: https://codeberg.org/dnkl/foot/issues/2159
+
+### Changed
+
+* The label letters are no longer sorted before being assigned to URLs
+  ([#2140][2140]).
+* Sending SIGUSR1/SIGUSR2 to a `foot --server` process now causes
+  newly spawned client instances to use the selected theme, instead of
+  the original one.
+* SIGUSR1/SIGUSR2 can now be sent to `footclient` processes, to change
+  the theme of that particular instance ([#2156][2156]).
+
+[2156]: https://codeberg.org/dnkl/foot/issues/2156
+
+
+### Fixed
+
+* Invalid configuration values overriding valid ones in surprising
+  ways.
+* Bug where the libutempter utmp backend did not record logouts
+  correctly.
+
+### Contributors
+
+* Ryan Roden-Corrent
+* Tobias Mock
+
+
 ## 1.23.1
 
 ### Changed
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.23.1/client-protocol.h 
new/foot-1.24.0/client-protocol.h
--- old/foot-1.23.1/client-protocol.h   2025-07-23 08:28:13.000000000 +0200
+++ new/foot-1.24.0/client-protocol.h   2025-09-12 10:18:33.000000000 +0200
@@ -29,3 +29,17 @@
 } __attribute__((packed));
 
 _Static_assert(sizeof(struct client_data) == 10, "protocol struct size error");
+
+enum client_ipc_code {
+    FOOT_IPC_SIGUSR,
+};
+
+struct client_ipc_hdr {
+    enum client_ipc_code ipc_code;
+    uint8_t size;
+} __attribute__((packed));
+
+
+struct client_ipc_sigusr {
+    int signo;
+} __attribute__((packed));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.23.1/client.c new/foot-1.24.0/client.c
--- old/foot-1.23.1/client.c    2025-07-23 08:28:13.000000000 +0200
+++ new/foot-1.24.0/client.c    2025-09-12 10:18:33.000000000 +0200
@@ -33,13 +33,20 @@
 typedef tll(struct string) string_list_t;
 
 static volatile sig_atomic_t aborted = 0;
+static volatile sig_atomic_t sigusr = 0;
 
 static void
-sig_handler(int signo)
+sigint_handler(int signo)
 {
     aborted = 1;
 }
 
+static void
+sigusr_handler(int signo)
+{
+    sigusr = signo;
+}
+
 static ssize_t
 sendall(int sock, const void *_buf, size_t len)
 {
@@ -507,15 +514,63 @@
     if (!send_string_list(fd, &envp))
         goto err;
 
-    struct sigaction sa = {.sa_handler = &sig_handler};
-    sigemptyset(&sa.sa_mask);
-    if (sigaction(SIGINT, &sa, NULL) < 0 || sigaction(SIGTERM, &sa, NULL) < 0) 
{
+    struct sigaction sa_int = {.sa_handler = &sigint_handler};
+    struct sigaction sa_usr = {.sa_handler = &sigusr_handler};
+    sigemptyset(&sa_int.sa_mask);
+    sigemptyset(&sa_usr.sa_mask);
+
+    if (sigaction(SIGINT, &sa_int, NULL) < 0 ||
+        sigaction(SIGTERM, &sa_int, NULL) < 0 ||
+        sigaction(SIGUSR1, &sa_usr, NULL) < 0 ||
+        sigaction(SIGUSR2, &sa_usr, NULL) < 0)
+    {
         LOG_ERRNO("failed to register signal handlers");
         goto err;
     }
 
     int exit_code;
-    ssize_t rcvd = recv(fd, &exit_code, sizeof(exit_code), 0);
+    ssize_t rcvd = -1;
+
+    while (true) {
+        rcvd = recv(fd, &exit_code, sizeof(exit_code), 0);
+
+        const int got_sigusr = sigusr;
+        sigusr = 0;
+
+        if (rcvd < 0 && errno == EINTR) {
+            if (aborted)
+                break;
+            else if (got_sigusr != 0) {
+                LOG_DBG("sending sigusr %d to server", got_sigusr);
+
+                struct {
+                    struct client_ipc_hdr hdr;
+                    struct client_ipc_sigusr sigusr;
+                } ipc = {
+                    .hdr = {
+                        .ipc_code = FOOT_IPC_SIGUSR,
+                        .size = sizeof(struct client_ipc_sigusr),
+                    },
+                    .sigusr = {
+                        .signo = got_sigusr,
+                    },
+                };
+
+                ssize_t count = send(fd, &ipc, sizeof(ipc), 0);
+                if (count < 0) {
+                    LOG_ERRNO("failed to send SIGUSR IPC to server");
+                    goto err;
+                } else if ((size_t)count != sizeof(ipc)) {
+                    LOG_ERR("failed to send SIGUSR IPC to server");
+                    goto err;
+                }
+            }
+
+            continue;
+        }
+
+        break;
+    }
 
     if (rcvd == -1 && errno == EINTR)
         xassert(aborted);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.23.1/config.c new/foot-1.24.0/config.c
--- old/foot-1.23.1/config.c    2025-07-23 08:28:13.000000000 +0200
+++ new/foot-1.24.0/config.c    2025-09-12 10:18:33.000000000 +0200
@@ -474,8 +474,12 @@
     errno = 0;
     char *end = NULL;
 
-    *res = strtoul(s, &end, base);
-    return errno == 0 && *end == '\0';
+    unsigned long v = strtoul(s, &end, base);
+    if (!(errno == 0 && *end == '\0'))
+        return false;
+
+    *res = v;
+    return true;
 }
 
 static bool NOINLINE
@@ -544,12 +548,13 @@
     errno = 0;
     char *end = NULL;
 
-    *res = strtof(s, &end);
+    float v = strtof(s, &end);
     if (!(errno == 0 && *end == '\0')) {
         LOG_CONTEXTUAL_ERR("invalid decimal value");
         return false;
     }
 
+    *res = v;
     return true;
 }
 
@@ -641,7 +646,6 @@
         valid_values[idx - 2] = '\0';
 
     LOG_CONTEXTUAL_ERR("not one of %s", valid_values);
-    *res = -1;
     return false;
 }
 
@@ -690,14 +694,18 @@
         goto out;
     }
 
+    uint32_t a, b;
+
     ctx->value = first_as_str;
-    if (!value_to_color(ctx, first, allow_alpha))
+    if (!value_to_color(ctx, &a, allow_alpha))
         goto out;
 
     ctx->value = second_as_str;
-    if (!value_to_color(ctx, second, allow_alpha))
+    if (!value_to_color(ctx, &b, allow_alpha))
         goto out;
 
+    *first = a;
+    *second = b;
     ret = true;
 
 out:
@@ -1111,6 +1119,9 @@
                              (int *)&conf->initial_color_theme);
     }
 
+    else if (streq(key, "uppercase-regex-insert"))
+        return value_to_bool(ctx, &conf->uppercase_regex_insert);
+
     else {
         LOG_CONTEXTUAL_ERR("not a valid option: %s", key);
         return false;
@@ -3375,6 +3386,7 @@
         .strikeout_thickness = {.pt = 0., .px = -1},
         .dpi_aware = false,
         .gamma_correct = false,
+        .uppercase_regex_insert = true,
         .security = {
             .osc52 = OSC52_ENABLED,
         },
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.23.1/config.h new/foot-1.24.0/config.h
--- old/foot-1.23.1/config.h    2025-07-23 08:28:13.000000000 +0200
+++ new/foot-1.24.0/config.h    2025-09-12 10:18:33.000000000 +0200
@@ -247,6 +247,7 @@
 
     bool dpi_aware;
     bool gamma_correct;
+    bool uppercase_regex_insert;
     struct config_font_list fonts[4];
     struct font_size_adjustment font_size_adjustment;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.23.1/doc/foot.1.scd 
new/foot-1.24.0/doc/foot.1.scd
--- old/foot-1.23.1/doc/foot.1.scd      2025-07-23 08:28:13.000000000 +0200
+++ new/foot-1.24.0/doc/foot.1.scd      2025-09-12 10:18:33.000000000 +0200
@@ -689,6 +689,21 @@
 In addition to the variables listed above, custom environment
 variables to unset may be defined in *foot.ini*(5).
 
+# Signals
+
+The following signals have special meaning in foot:
+
+- SIGUSR1: switch to color theme 1 (i.e. use the *[colors]* section).
+- SIGUSR2: switch to color theme 2 (i.e. use the *[colors2]* section).
+
+Note: you can send SIGUSR1/SIGUSR2 to a *foot --server* process too,
+in which case all client instances will switch theme. Furthermore, all
+future client instances will also use the selected theme.
+
+You can also send SIGUSR1/SIGUSR2 to a footclient instance, see
+*footclient*(1) for details.
+
+
 # BUGS
 
 Please report bugs to https://codeberg.org/dnkl/foot/issues
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.23.1/doc/foot.ini.5.scd 
new/foot-1.24.0/doc/foot.ini.5.scd
--- old/foot-1.23.1/doc/foot.ini.5.scd  2025-07-23 08:28:13.000000000 +0200
+++ new/foot-1.24.0/doc/foot.ini.5.scd  2025-09-12 10:18:33.000000000 +0200
@@ -231,6 +231,13 @@
        
        Default: _no_.
 
+*uppercase-regex-insert*
+       Boolean. When enabled, inputting an uppercase hint character in
+       *show-urls-copy* or *regex-copy* mode will insert the selected
+       text into the prompt in addition to copying it to the clipboard.
+
+       Default: _yes_
+
 *box-drawings-uses-font-glyphs*
        Boolean. When disabled, foot generates box/line drawing characters
        itself. The are several advantages to doing this instead of using
@@ -371,7 +378,8 @@
        
        Use the *color-theme-switch-1*, *color-theme-switch-2* and
        *color-theme-toggle* key bindings to switch between the two themes
-       at runtime.
+       at runtime, or send SIGUSR1/SIGUSR2 to the foot process (see
+       *foot*(1) for details).
        
        Default: _1_
 
@@ -1446,6 +1454,9 @@
        *color-theme-toggle* toggles between the primary and alternative
        color themes.
        
+       Note: you can also send SIGUSR1/SIGUSR2 to the foot process to
+       change the theme (see *foot*(1) for details.)
+       
        Default: _none_
 
 *quit*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.23.1/doc/footclient.1.scd 
new/foot-1.24.0/doc/footclient.1.scd
--- old/foot-1.23.1/doc/footclient.1.scd        2025-07-23 08:28:13.000000000 
+0200
+++ new/foot-1.24.0/doc/footclient.1.scd        2025-09-12 10:18:33.000000000 
+0200
@@ -189,6 +189,21 @@
 In addition to the variables listed above, custom environment
 variables to unset may be defined in *foot.ini*(5).
 
+# Signals
+
+The following signals have special meaning in footclient:
+
+- SIGUSR1: switch to color theme 1 (i.e. use the *[colors]* section).
+- SIGUSR2: switch to color theme 2 (i.e. use the *[colors2]* section).
+
+When sending SIGUSR1/SIGUSR2 to a footclient instance, the theme is
+changed in that instance only. This is different from when you send
+SIGUSR1/SIGUSR2 to the server process, where all instances change the
+theme.
+
+Note: for obvious reasons, this is not supported when footclient is
+started with *--no-wait*.
+
 # SEE ALSO
 
 *foot*(1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.23.1/foot.ini new/foot-1.24.0/foot.ini
--- old/foot-1.23.1/foot.ini    2025-07-23 08:28:13.000000000 +0200
+++ new/foot-1.24.0/foot.ini    2025-09-12 10:18:33.000000000 +0200
@@ -40,6 +40,8 @@
 # utmp-helper=/usr/lib/utempter/utempter  # When utmp backend is ‘libutempter’ 
(Linux)
 # utmp-helper=/usr/libexec/ulog-helper    # When utmp backend is ‘ulog’ 
(FreeBSD)
 
+# uppercase-regex-insert=yes
+
 [environment]
 # name=value
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.23.1/input.c new/foot-1.24.0/input.c
--- old/foot-1.23.1/input.c     2025-07-23 08:28:13.000000000 +0200
+++ new/foot-1.24.0/input.c     2025-09-12 10:18:33.000000000 +0200
@@ -1878,7 +1878,7 @@
 UNITTEST
 {
     int chan[2];
-    pipe2(chan, O_CLOEXEC);
+    xassert(pipe2(chan, O_CLOEXEC) == 0);
 
     xassert(chan[0] >= 0);
     xassert(chan[1] >= 0);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.23.1/main.c new/foot-1.24.0/main.c
--- old/foot-1.23.1/main.c      2025-07-23 08:28:13.000000000 +0200
+++ new/foot-1.24.0/main.c      2025-09-12 10:18:33.000000000 +0200
@@ -45,23 +45,28 @@
     return true;
 }
 
+struct sigusr_context {
+    struct terminal *term;
+    struct server *server;
+};
+
 static bool
 fdm_sigusr(struct fdm *fdm, int signo, void *data)
 {
-    struct wayland *wayl = data;
-
     xassert(signo == SIGUSR1 || signo == SIGUSR2);
 
-    if (signo == SIGUSR1) {
-        tll_foreach(wayl->terms, it) {
-            struct terminal *term = it->item;
-            term_theme_switch_to_1(term);
-         }
+    struct sigusr_context *ctx = data;
+
+    if (ctx->server != NULL) {
+        if (signo == SIGUSR1)
+            server_global_theme_switch_to_1(ctx->server);
+        else
+            server_global_theme_switch_to_2(ctx->server);
     } else {
-        tll_foreach(wayl->terms, it) {
-            struct terminal *term = it->item;
-            term_theme_switch_to_2(term);
-        }
+        if (signo == SIGUSR1)
+            term_theme_switch_to_1(ctx->term);
+        else
+            term_theme_switch_to_2(ctx->term);
     }
 
     return true;
@@ -630,8 +635,13 @@
         goto out;
     }
 
-    if (!fdm_signal_add(fdm, SIGUSR1, &fdm_sigusr, wayl) ||
-        !fdm_signal_add(fdm, SIGUSR2, &fdm_sigusr, wayl))
+    struct sigusr_context sigusr_context = {
+        .term = term,
+        .server = server,
+    };
+
+    if (!fdm_signal_add(fdm, SIGUSR1, &fdm_sigusr, &sigusr_context) ||
+        !fdm_signal_add(fdm, SIGUSR2, &fdm_sigusr, &sigusr_context))
     {
         goto out;
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.23.1/meson.build new/foot-1.24.0/meson.build
--- old/foot-1.23.1/meson.build 2025-07-23 08:28:13.000000000 +0200
+++ new/foot-1.24.0/meson.build 2025-09-12 10:18:33.000000000 +0200
@@ -1,5 +1,5 @@
 project('foot', 'c',
-        version: '1.23.1',
+        version: '1.24.0',
         license: 'MIT',
         meson_version: '>=0.59.0',
         default_options: [
@@ -53,7 +53,7 @@
 elif utmp_backend == 'libutempter'
   utmp_add = 'add'
   utmp_del = 'del'
-  utmp_del_have_argument = true
+  utmp_del_have_argument = false
   if utmp_default_helper_path == 'auto'
     utmp_default_helper_path = join_paths('/usr', get_option('libdir'), 
'utempter', 'utempter')
   endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.23.1/server.c new/foot-1.24.0/server.c
--- old/foot-1.23.1/server.c    2025-07-23 08:28:13.000000000 +0200
+++ new/foot-1.24.0/server.c    2025-09-12 10:18:33.000000000 +0200
@@ -30,7 +30,7 @@
 struct terminal_instance;
 
 struct server {
-    const struct config *conf;
+    struct config *conf;
     struct fdm *fdm;
     struct reaper *reaper;
     struct wayland *wayl;
@@ -156,10 +156,61 @@
     xassert(events & EPOLLIN);
 
     if (client->instance != NULL) {
-        uint8_t dummy[128];
-        ssize_t count = read(fd, dummy, sizeof(dummy));
-        LOG_WARN("client unexpectedly sent %zd bytes", count);
-        return true;  /* TODO: shutdown instead? */
+        struct client_ipc_hdr ipc_hdr;
+        ssize_t count = read(fd, &ipc_hdr, sizeof(ipc_hdr));
+
+        if (count != sizeof(ipc_hdr)) {
+            LOG_WARN("client unexpectedly sent %zd bytes", count);
+            return true;  /* TODO: shutdown instead? */
+        }
+
+        switch (ipc_hdr.ipc_code) {
+        case FOOT_IPC_SIGUSR: {
+            xassert(ipc_hdr.size == sizeof(struct client_ipc_sigusr));
+
+            struct client_ipc_sigusr sigusr;
+            count = read(fd, &sigusr, sizeof(sigusr));
+            if (count < 0) {
+                LOG_ERRNO("failed to read SIGUSR IPC data from client");
+                return true; /* TODO: shutdown instead? */
+            }
+
+            if ((size_t)count != sizeof(sigusr)) {
+                LOG_ERR("failed to read SIGUSR IPC data from client");
+                return true; /* TODO: shutdown instead? */
+            }
+
+            switch (sigusr.signo) {
+            case SIGUSR1:
+                term_theme_switch_to_1(client->instance->terminal);
+                break;
+
+            case SIGUSR2:
+                term_theme_switch_to_2(client->instance->terminal);
+                break;
+
+            default:
+                LOG_ERR(
+                    "client sent bad SIGUSR number: %d "
+                    "(expected SIGUSR1=%d or SIGUSR2=%d)",
+                    sigusr.signo, SIGUSR1, SIGUSR2);
+                break;
+            }
+
+            return true;
+        }
+
+        default:
+            LOG_WARN(
+                "client sent unrecognized IPC (0x%04x), ignoring %hhu bytes",
+                ipc_hdr.ipc_code, ipc_hdr.size);
+
+            /* TODO: slightly broken, since not all data is guaranteed
+               to be readable yet */
+            uint8_t dummy[ipc_hdr.size];
+            (void)!!read(fd, dummy, ipc_hdr.size);
+            return true;
+        }
     }
 
     if (client->buffer.data == NULL) {
@@ -505,7 +556,7 @@
 }
 
 struct server *
-server_init(const struct config *conf, struct fdm *fdm, struct reaper *reaper,
+server_init(struct config *conf, struct fdm *fdm, struct reaper *reaper,
             struct wayland *wayl)
 {
     int fd;
@@ -617,3 +668,23 @@
         unlink(server->sock_path);
     free(server);
 }
+
+void
+server_global_theme_switch_to_1(struct server *server)
+{
+    server->conf->initial_color_theme = COLOR_THEME1;
+    tll_foreach(server->clients, it)
+        term_theme_switch_to_1(it->item->instance->terminal);
+    tll_foreach(server->terminals, it)
+        term_theme_switch_to_1(it->item->terminal);
+}
+
+void
+server_global_theme_switch_to_2(struct server *server)
+{
+    server->conf->initial_color_theme = COLOR_THEME2;
+    tll_foreach(server->clients, it)
+        term_theme_switch_to_2(it->item->instance->terminal);
+    tll_foreach(server->terminals, it)
+        term_theme_switch_to_2(it->item->terminal);
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.23.1/server.h new/foot-1.24.0/server.h
--- old/foot-1.23.1/server.h    2025-07-23 08:28:13.000000000 +0200
+++ new/foot-1.24.0/server.h    2025-09-12 10:18:33.000000000 +0200
@@ -6,6 +6,9 @@
 #include "wayland.h"
 
 struct server;
-struct server *server_init(const struct config *conf, struct fdm *fdm,
+struct server *server_init(struct config *conf, struct fdm *fdm,
                            struct reaper *reaper, struct wayland *wayl);
 void server_destroy(struct server *server);
+
+void server_global_theme_switch_to_1(struct server *server);
+void server_global_theme_switch_to_2(struct server *server);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.23.1/slave.c new/foot-1.24.0/slave.c
--- old/foot-1.23.1/slave.c     2025-07-23 08:28:13.000000000 +0200
+++ new/foot-1.24.0/slave.c     2025-09-12 10:18:33.000000000 +0200
@@ -436,8 +436,54 @@
         add_to_env(&custom_env, "COLORTERM", "truecolor");
         add_to_env(&custom_env, "PWD", cwd);
 
-        del_from_env(&custom_env, "TERM_PROGRAM");
-        del_from_env(&custom_env, "TERM_PROGRAM_VERSION");
+        del_from_env(&custom_env, "TERM_PROGRAM");            /* Wezterm, 
Ghostty */
+        del_from_env(&custom_env, "TERM_PROGRAM_VERSION");    /* Wezterm, 
Ghostty */
+        del_from_env(&custom_env, "TERMINAL_NAME");           /* Contour */
+        del_from_env(&custom_env, "TERMINAL_VERSION_STRING"); /* Contour */
+        del_from_env(&custom_env, "TERMINAL_VERSION_TRIPLE"); /* Contour */
+
+        /* XTerm specific */
+        del_from_env(&custom_env, "XTERM_SHELL");
+        del_from_env(&custom_env, "XTERM_VERSION");
+        del_from_env(&custom_env, "XTERM_LOCALE");
+
+        /* Mlterm specific */
+        del_from_env(&custom_env, "MLTERM");
+
+        /* Zutty specific */
+        del_from_env(&custom_env, "ZUTTY_VERSION");
+
+        /* Ghostty specific */
+        del_from_env(&custom_env, "GHOSTTY_BIN_DIR");
+        del_from_env(&custom_env, "GHOSTTY_SHELL_INTEGRATION_NO_SUDO");
+        del_from_env(&custom_env, "GHOSTTY_RESOURCES_DIR");
+
+        /* Kitty specific */
+        del_from_env(&custom_env, "KITTY_WINDOW_ID");
+        del_from_env(&custom_env, "KITTY_PID");
+        del_from_env(&custom_env, "KITTY_PUBLIC_KEY");
+        del_from_env(&custom_env, "KITTY_INSTALLATION_DIR");
+
+        /* Contour specific */
+        del_from_env(&custom_env, "CONTOUR_PROFILE");
+
+        /* Wezterm specific */
+        del_from_env(&custom_env, "WEZTERM_PANE");
+        del_from_env(&custom_env, "WEZTERM_EXECUTABLE");
+        del_from_env(&custom_env, "WEZTERM_CONFIG_FILE");
+        del_from_env(&custom_env, "WEZTERM_EXECUTABLE_DIR");
+        del_from_env(&custom_env, "WEZTERM_UNIX_SOCKET");
+        del_from_env(&custom_env, "WEZTERM_CONFIG_DIR");
+
+        /* Alacritty specific */
+        del_from_env(&custom_env, "ALACRITTY_LOG");
+        del_from_env(&custom_env, "ALACRITTY_WINDOW_ID");
+        del_from_env(&custom_env, "ALACRITTY_SOCKET");
+
+        /* VTE, gnome-terminal, kgx etc */
+        del_from_env(&custom_env, "VTE_VERSION");
+        del_from_env(&custom_env, "GNOME_TERMINAL_SERVICE");
+        del_from_env(&custom_env, "GNOME_TERMINAL_SCREEN");
 
 #if defined(FOOT_TERMINFO_PATH)
         add_to_env(&custom_env, "TERMINFO", FOOT_TERMINFO_PATH);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.23.1/terminal.c new/foot-1.24.0/terminal.c
--- old/foot-1.23.1/terminal.c  2025-07-23 08:28:13.000000000 +0200
+++ new/foot-1.24.0/terminal.c  2025-09-12 10:18:33.000000000 +0200
@@ -199,7 +199,7 @@
         return true;
 
     char *const argv[] = {conf->utmp_helper_path, UTMP_ADD, 
getenv("WAYLAND_DISPLAY"), NULL};
-    return spawn(reaper, NULL, argv, ptmx, ptmx, -1, NULL, NULL, NULL) >= 0;
+    return spawn(reaper, NULL, argv, ptmx, -1, -1, NULL, NULL, NULL) >= 0;
 #else
     return true;
 #endif
@@ -223,7 +223,7 @@
         ;
 
     char *const argv[] = {conf->utmp_helper_path, UTMP_DEL, del_argument, 
NULL};
-    return spawn(reaper, NULL, argv, ptmx, ptmx, -1, NULL, NULL, NULL) >= 0;
+    return spawn(reaper, NULL, argv, ptmx, -1, -1, NULL, NULL, NULL) >= 0;
 #else
     return true;
 #endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.23.1/tests/test-config.c 
new/foot-1.24.0/tests/test-config.c
--- old/foot-1.23.1/tests/test-config.c 2025-07-23 08:28:13.000000000 +0200
+++ new/foot-1.24.0/tests/test-config.c 2025-09-12 10:18:33.000000000 +0200
@@ -491,6 +491,7 @@
     test_boolean(&ctx, &parse_section_main, "locked-title", 
&conf.locked_title);
     test_boolean(&ctx, &parse_section_main, "dpi-aware", &conf.dpi_aware);
     test_boolean(&ctx, &parse_section_main, "gamma-correct-blending", 
&conf.gamma_correct);
+    test_boolean(&ctx, &parse_section_main, "uppercase-regex-insert", 
&conf.uppercase_regex_insert);
 
     test_pt_or_px(&ctx, &parse_section_main, "font-size-adjustment", 
&conf.font_size_adjustment.pt_or_px);  /* TODO: test ‘N%’ values too */
     test_pt_or_px(&ctx, &parse_section_main, "line-height", &conf.line_height);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.23.1/themes/modus-vivendi-tinted 
new/foot-1.24.0/themes/modus-vivendi-tinted
--- old/foot-1.23.1/themes/modus-vivendi-tinted 1970-01-01 01:00:00.000000000 
+0100
+++ new/foot-1.24.0/themes/modus-vivendi-tinted 2025-09-12 10:18:33.000000000 
+0200
@@ -0,0 +1,25 @@
+# -*- conf -*-
+#
+# modus-vivendi-tinted
+# See: https://protesilaos.com/emacs/modus-themes
+#
+
+[colors]
+background=0d0e1c
+foreground=ffffff
+regular0=000000
+regular1=ff5f59
+regular2=44bc44
+regular3=d0bc00
+regular4=2fafff
+regular5=feacd0
+regular6=00d3d0
+regular7=a6a6a6
+bright0=595959
+bright1=ff6b55
+bright2=ff6b55
+bright3=fec43f
+bright4=fec43f
+bright5=b6a0ff
+bright6=6ae4b9
+bright7=777777
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.23.1/url-mode.c new/foot-1.24.0/url-mode.c
--- old/foot-1.23.1/url-mode.c  2025-07-23 08:28:13.000000000 +0200
+++ new/foot-1.24.0/url-mode.c  2025-09-12 10:18:33.000000000 +0200
@@ -283,7 +283,8 @@
 
     if (match) {
         // If the last hint character was uppercase, copy and paste
-        activate_url(seat, term, match, serial, wc == toc32upper(wc));
+        bool insert = term->conf->uppercase_regex_insert && wc == 
toc32upper(wc);
+        activate_url(seat, term, match, serial, insert);
 
         switch (match->action) {
         case URL_ACTION_COPY:
@@ -557,14 +558,6 @@
     remove_overlapping(urls, term->grid->num_cols);
 }
 
-static int
-c32cmp_qsort_wrapper(const void *_a, const void *_b)
-{
-    const char32_t *a = *(const char32_t **)_a;
-    const char32_t *b = *(const char32_t **)_b;
-    return c32cmp(a, b);
-}
-
 static void
 generate_key_combos(const struct config *conf,
                     size_t count, char32_t *combos[static count])
@@ -607,10 +600,6 @@
     }
     free(hints);
 
-    /* Sorting is a kind of shuffle, since we're sorting on the
-     * *reversed* strings */
-    qsort(combos, count, sizeof(char32_t *), &c32cmp_qsort_wrapper);
-
     /* Reverse all strings */
     for (size_t i = 0; i < count; i++) {
         const size_t len = c32len(combos[i]);

Reply via email to