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-01-01 23:08:44
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/foot (Old)
 and      /work/SRC/openSUSE:Factory/.foot.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "foot"

Wed Jan  1 23:08:44 2025 rev:37 rq:1234272 version:1.20.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/foot/foot.changes        2024-10-24 
15:43:57.871136286 +0200
+++ /work/SRC/openSUSE:Factory/.foot.new.1881/foot.changes      2025-01-01 
23:09:09.351535137 +0100
@@ -1,0 +2,15 @@
+Wed Jan  1 09:04:11 UTC 2025 - Arnav Singh <[email protected]>
+
+- Update to v1.20.0:
+  * foot.ini options:
+    * Added security.osc52 to partially or fully disable clipboard access
+      via the OSC-52 escape sequence. Defaults to enabling clipboard access.
+    * Various keybindings for search mode that were implemented previously but
+      not documented have now been documented in the manpages.
+  * Runtime changes to the window title and app ID now require the value
+    to only contain printable characters.
+  * Added new themes: rose-pine-dawn, rose-pine-moon.
+  * Fixed various crashes.
+  * See https://codeberg.org/dnkl/foot/releases/tag/1.20.0 for more details.
+
+-------------------------------------------------------------------

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

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

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

Other differences:
------------------
++++++ foot.spec ++++++
--- /var/tmp/diff_new_pack.uzsQzP/_old  2025-01-01 23:09:09.995561584 +0100
+++ /var/tmp/diff_new_pack.uzsQzP/_new  2025-01-01 23:09:09.995561584 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package foot
 #
-# Copyright (c) 2024 SUSE LLC
+# Copyright (c) 2025 SUSE LLC
 #
 # 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.19.0
+Version:        1.20.0
 Release:        0
 Summary:        A Wayland terminal emulator
 License:        MIT

++++++ foot-1.19.0.tar.gz -> foot-1.20.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/CHANGELOG.md new/foot-1.20.0/CHANGELOG.md
--- old/foot-1.19.0/CHANGELOG.md        2024-10-23 13:51:15.000000000 +0200
+++ new/foot-1.20.0/CHANGELOG.md        2025-01-01 09:21:51.000000000 +0100
@@ -1,5 +1,6 @@
 # Changelog
 
+* [1.20.0](#1-20-0)
 * [1.19.0](#1-19-0)
 * [1.18.1](#1-18-1)
 * [1.18.0](#1-18-0)
@@ -54,6 +55,57 @@
 * [1.2.0](#1-2-0)
 
 
+## 1.20.0
+
+### Added
+
+* Unicode data files updated to Unicode 16. Foot uses these to
+  determine which VS-15 and VS-16 sequences are valid, and which are
+  not.
+* Box drawing characters U+1CD00...U+1CDE5 (the _"octants"_ from the
+  _"Symbols for Legacy Computing Supplement"_ codepoint range, added
+  in Unicode 16.0).
+* `security.osc52` option, allowing you to partially or fully disable
+  host clipboard access via the OSC-52 escape sequence
+  ([#1867][1867]).
+
+
+### Changed
+
+* OSC-9: sequences beginning with `<number>;` are now ignored. These
+  sequences are ConEmu/Windows Terminal sequences, and not intended to
+  be notifications.
+* Use `utf8proc_charwidth()` instead of `wcwidth()`+`wcswidth()` when
+  calculating character width, when foot has been built with utf8proc
+  support ([#1865][1865]).
+* Run-time changes to the window title, and the app ID now require the
+  new value to consist of printable characters only.
+* Kitty keyboard protocol: Enter, Tab and Backspace no longer report
+  _release_ events unless _"Report all keys as escape codes"_ is
+  enabled ([#1892][1892]).
+
+[1865]: https://codeberg.org/dnkl/foot/issues/1865
+[1892]: https://codeberg.org/dnkl/foot/issues/1892
+
+
+### Fixed
+
+* Crash when receiving an OSC-9 or OSC-777 with an empty notification
+  body ([#1866][1866]).
+* Crash when tripple-clicking on region containing `NUL` characters.
+
+[1866]: https://codeberg.org/dnkl/foot/issues/1866
+
+
+### Contributors
+
+* cy
+* Denis Zharikov
+* heather7283
+* Jack Wilsdon
+* Mark Stosberg
+
+
 ## 1.19.0
 
 ### Added
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/box-drawing.c 
new/foot-1.20.0/box-drawing.c
--- old/foot-1.19.0/box-drawing.c       2024-10-23 13:51:15.000000000 +0200
+++ new/foot-1.20.0/box-drawing.c       2025-01-01 09:21:51.000000000 +0100
@@ -33,9 +33,12 @@
 
     int thickness[2];
 
-    /* For sextants and wedges */
+    /* For octants, sextants and wedges */
     int x_halfs[2];
     int y_thirds[2];
+
+    /* For octants */
+    int y_quads[3];
 };
 
 static const pixman_color_t white = {0xffff, 0xffff, 0xffff, 0xffff};
@@ -2213,6 +2216,7 @@
         LOWER_RIGHT = 1 << 5,
     };
 
+    /* TODO: move this to a separate file? */
     static const uint8_t matrix[60] = {
         /* U+1fb00 - U+1fb0f */
         UPPER_LEFT,
@@ -2308,6 +2312,398 @@
         sextant_lower_right(buf);
 }
 
+static void
+octant_upper_left(struct buf *buf)
+{
+    rect(0, 0, buf->x_halfs[0], buf->y_quads[0]);
+}
+
+static void
+octant_middle_up_left(struct buf *buf)
+{
+    rect(0, buf->y_quads[0], buf->x_halfs[0], buf->y_quads[1]);
+}
+
+static void
+octant_middle_down_left(struct buf *buf)
+{
+    rect(0, buf->y_quads[1], buf->x_halfs[0], buf->y_quads[2]);
+}
+
+static void
+octant_lower_left(struct buf *buf)
+{
+    rect(0, buf->y_quads[2], buf->x_halfs[0], buf->height);
+}
+
+static void
+octant_upper_right(struct buf *buf)
+{
+    rect(buf->x_halfs[1], 0, buf->width, buf->y_quads[0]);
+}
+
+static void
+octant_middle_up_right(struct buf *buf)
+{
+    rect(buf->x_halfs[1], buf->y_quads[0], buf->width, buf->y_quads[1]);
+}
+
+static void
+octant_middle_down_right(struct buf *buf)
+{
+    rect(buf->x_halfs[1], buf->y_quads[1], buf->width, buf->y_quads[2]);
+}
+
+static void
+octant_lower_right(struct buf *buf)
+{
+    rect(buf->x_halfs[1], buf->y_quads[2], buf->width, buf->height);
+}
+
+static void NOINLINE
+draw_octant(struct buf *buf, char32_t wc)
+{
+    /*
+     * Each byte encodes one octant:
+     *
+     * Bit      octant part
+     *   0      upper left
+     *   1      middle, upper left
+     *   2      middle, lower left
+     *   3      lower, left
+     *   4      upper right
+     *   5      middle, upper right
+     *   6      middle, lower right
+     *   7      lower right
+     */
+    enum {
+        UPPER_LEFT = 1 << 0,
+        MIDDLE_UP_LEFT = 1 << 1,
+        MIDDLE_DOWN_LEFT = 1 << 2,
+        LOWER_LEFT = 1 << 3,
+        UPPER_RIGHT = 1 << 4,
+        MIDDLE_UP_RIGHT = 1 << 5,
+        MIDDLE_DOWN_RIGHT = 1 << 6,
+        LOWER_RIGHT = 1 << 7,
+    };
+
+    /* TODO: move this to a separate file */
+    static const uint8_t matrix[230] = {
+        /* U+1CD00 - U+1CD0F */
+        MIDDLE_UP_LEFT,
+        MIDDLE_UP_LEFT | UPPER_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | UPPER_RIGHT,
+        MIDDLE_UP_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_RIGHT,
+        MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT,
+        MIDDLE_DOWN_LEFT,
+        UPPER_LEFT | MIDDLE_DOWN_LEFT,
+        UPPER_RIGHT | MIDDLE_DOWN_LEFT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_DOWN_LEFT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT,
+
+        /* U+1CD10 - U+1CD1F */
+        MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT,
+        UPPER_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT,
+        UPPER_RIGHT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT,
+        MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | 
MIDDLE_DOWN_LEFT,
+        MIDDLE_DOWN_RIGHT,
+        UPPER_LEFT | MIDDLE_DOWN_RIGHT,
+        UPPER_RIGHT | MIDDLE_DOWN_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_DOWN_RIGHT,
+        MIDDLE_UP_LEFT | MIDDLE_DOWN_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_DOWN_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_RIGHT,
+
+        /* U+1CD20 - U+1CD2F */
+        UPPER_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT,
+        MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | 
MIDDLE_DOWN_RIGHT,
+        MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT,
+        UPPER_LEFT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT,
+        UPPER_RIGHT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT,
+        MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | 
MIDDLE_DOWN_RIGHT,
+        MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT,
+
+        /* U+1CD30 - U+1CD3F */
+        UPPER_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
MIDDLE_DOWN_RIGHT,
+        MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
MIDDLE_DOWN_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
MIDDLE_DOWN_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
MIDDLE_DOWN_RIGHT,
+        UPPER_LEFT | LOWER_LEFT,
+        UPPER_RIGHT | LOWER_LEFT,
+        UPPER_LEFT | UPPER_RIGHT | LOWER_LEFT,
+        MIDDLE_UP_LEFT | LOWER_LEFT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | LOWER_LEFT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | LOWER_LEFT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | LOWER_LEFT,
+        MIDDLE_UP_RIGHT | LOWER_LEFT,
+        UPPER_LEFT | MIDDLE_UP_RIGHT | LOWER_LEFT,
+        UPPER_RIGHT | MIDDLE_UP_RIGHT | LOWER_LEFT,
+
+        /* U+1CD40 - U+1CD4F */
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_RIGHT | LOWER_LEFT,
+        MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | LOWER_LEFT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | LOWER_LEFT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | LOWER_LEFT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | 
LOWER_LEFT,
+        UPPER_LEFT | MIDDLE_DOWN_LEFT | LOWER_LEFT,
+        UPPER_RIGHT | MIDDLE_DOWN_LEFT | LOWER_LEFT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_DOWN_LEFT | LOWER_LEFT,
+        MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | LOWER_LEFT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | LOWER_LEFT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | 
LOWER_LEFT,
+        MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | LOWER_LEFT,
+        UPPER_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | LOWER_LEFT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
LOWER_LEFT,
+        MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | LOWER_LEFT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
LOWER_LEFT,
+
+        /* U+1CD50 - U+1CD5F */
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
LOWER_LEFT,
+        MIDDLE_DOWN_RIGHT | LOWER_LEFT,
+        UPPER_LEFT | MIDDLE_DOWN_RIGHT | LOWER_LEFT,
+        UPPER_RIGHT | MIDDLE_DOWN_RIGHT | LOWER_LEFT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_DOWN_RIGHT | LOWER_LEFT,
+        MIDDLE_UP_LEFT | MIDDLE_DOWN_RIGHT | LOWER_LEFT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_DOWN_RIGHT | LOWER_LEFT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_RIGHT | LOWER_LEFT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_RIGHT | 
LOWER_LEFT,
+        MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT | LOWER_LEFT,
+        UPPER_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT | LOWER_LEFT,
+        UPPER_RIGHT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT | LOWER_LEFT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT | 
LOWER_LEFT,
+        MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT | LOWER_LEFT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT | 
LOWER_LEFT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT | 
LOWER_LEFT,
+
+        /* U+1CD60 - U+1CD6F */
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | 
MIDDLE_DOWN_RIGHT | LOWER_LEFT,
+        MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | LOWER_LEFT,
+        UPPER_LEFT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | LOWER_LEFT,
+        UPPER_RIGHT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | LOWER_LEFT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | 
LOWER_LEFT,
+        MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | LOWER_LEFT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | 
LOWER_LEFT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | 
LOWER_LEFT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | 
MIDDLE_DOWN_RIGHT | LOWER_LEFT,
+        MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | LOWER_LEFT,
+        UPPER_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | 
LOWER_LEFT,
+        UPPER_RIGHT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | 
LOWER_LEFT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
MIDDLE_DOWN_RIGHT | LOWER_LEFT,
+        MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
MIDDLE_DOWN_RIGHT | LOWER_LEFT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
MIDDLE_DOWN_RIGHT | LOWER_LEFT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
MIDDLE_DOWN_RIGHT | LOWER_LEFT,
+
+        /* U+1CD70 - U+1CD7F */
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | 
MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | LOWER_LEFT,
+        UPPER_LEFT | LOWER_RIGHT,
+        UPPER_RIGHT | LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | LOWER_RIGHT,
+        MIDDLE_UP_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | LOWER_RIGHT,
+        MIDDLE_UP_RIGHT | LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_RIGHT | LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_RIGHT | LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_RIGHT | LOWER_RIGHT,
+        MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | 
LOWER_RIGHT,
+
+        /* U+1CD80 - U+1CD8F */
+        MIDDLE_DOWN_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_DOWN_LEFT | LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_DOWN_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_DOWN_LEFT | LOWER_RIGHT,
+        MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | 
LOWER_RIGHT,
+        MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
LOWER_RIGHT,
+        MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | 
MIDDLE_DOWN_LEFT | LOWER_RIGHT,
+
+        /* U+1CD90 - U+1CD9F */
+        UPPER_LEFT | MIDDLE_DOWN_RIGHT | LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_DOWN_RIGHT | LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_DOWN_RIGHT | LOWER_RIGHT,
+        MIDDLE_UP_LEFT | MIDDLE_DOWN_RIGHT | LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_RIGHT | LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_RIGHT | 
LOWER_RIGHT,
+        MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT | LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT | LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT | 
LOWER_RIGHT,
+        MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT | LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT | 
LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT | 
LOWER_RIGHT,
+        MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | 
LOWER_RIGHT,
+
+        /* U+1CDA0 - U+1CDAF */
+        MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | 
LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | 
LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | 
MIDDLE_DOWN_RIGHT | LOWER_RIGHT,
+        MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | 
LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | 
LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
MIDDLE_DOWN_RIGHT | LOWER_RIGHT,
+        MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
MIDDLE_DOWN_RIGHT | LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
MIDDLE_DOWN_RIGHT | LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
MIDDLE_DOWN_RIGHT | LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | 
MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | LOWER_RIGHT,
+        UPPER_LEFT | LOWER_LEFT | LOWER_RIGHT,
+        UPPER_RIGHT | LOWER_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | LOWER_LEFT | LOWER_RIGHT,
+        MIDDLE_UP_LEFT | LOWER_LEFT | LOWER_RIGHT,
+
+        /* U+1CDB0 - U+1CDBF */
+        UPPER_LEFT | MIDDLE_UP_LEFT | LOWER_LEFT | LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | LOWER_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | LOWER_LEFT | LOWER_RIGHT,
+        MIDDLE_UP_RIGHT | LOWER_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_RIGHT | LOWER_LEFT | LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_RIGHT | LOWER_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_RIGHT | LOWER_LEFT | LOWER_RIGHT,
+        MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | LOWER_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | LOWER_LEFT | 
LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | LOWER_LEFT | 
LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | 
LOWER_LEFT | LOWER_RIGHT,
+        MIDDLE_DOWN_LEFT | LOWER_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_DOWN_LEFT | LOWER_LEFT | LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_DOWN_LEFT | LOWER_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_DOWN_LEFT | LOWER_LEFT | LOWER_RIGHT,
+        MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | LOWER_LEFT | LOWER_RIGHT,
+
+        /* U+1CDC0 - U+1CDCF */
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | LOWER_LEFT | 
LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | LOWER_LEFT | 
LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | 
LOWER_LEFT | LOWER_RIGHT,
+        MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | LOWER_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | LOWER_LEFT | 
LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | LOWER_LEFT | 
LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
LOWER_LEFT | LOWER_RIGHT,
+        MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | LOWER_LEFT | 
LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
LOWER_LEFT | LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
LOWER_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | 
MIDDLE_DOWN_LEFT | LOWER_LEFT | LOWER_RIGHT,
+        MIDDLE_DOWN_RIGHT | LOWER_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_DOWN_RIGHT | LOWER_LEFT | LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_DOWN_RIGHT | LOWER_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_DOWN_RIGHT | LOWER_LEFT | 
LOWER_RIGHT,
+        MIDDLE_UP_LEFT | MIDDLE_DOWN_RIGHT | LOWER_LEFT | LOWER_RIGHT,
+
+        /* U+1CDD0 - U+1CDDF */
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_DOWN_RIGHT | LOWER_LEFT | 
LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_RIGHT | LOWER_LEFT | 
LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_RIGHT | 
LOWER_LEFT | LOWER_RIGHT,
+        MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT | LOWER_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT | LOWER_LEFT | 
LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT | LOWER_LEFT | 
LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT | 
LOWER_LEFT | LOWER_RIGHT,
+        MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT | LOWER_LEFT | 
LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT | 
LOWER_LEFT | LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_RIGHT | 
LOWER_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | 
MIDDLE_DOWN_RIGHT | LOWER_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | LOWER_LEFT | 
LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | LOWER_LEFT | 
LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | 
LOWER_LEFT | LOWER_RIGHT,
+        MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | LOWER_LEFT | 
LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | 
LOWER_LEFT | LOWER_RIGHT,
+
+        /* U+1CDE0 - U+1CDE5 */
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_DOWN_LEFT | 
MIDDLE_DOWN_RIGHT | LOWER_LEFT | LOWER_RIGHT,
+        MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | LOWER_LEFT | 
LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | MIDDLE_DOWN_RIGHT | 
LOWER_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | UPPER_RIGHT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
MIDDLE_DOWN_RIGHT | LOWER_LEFT | LOWER_RIGHT,
+        UPPER_LEFT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
MIDDLE_DOWN_RIGHT | LOWER_LEFT | LOWER_RIGHT,
+        UPPER_RIGHT | MIDDLE_UP_LEFT | MIDDLE_UP_RIGHT | MIDDLE_DOWN_LEFT | 
MIDDLE_DOWN_RIGHT | LOWER_LEFT | LOWER_RIGHT,
+    };
+
+    _Static_assert(ALEN(matrix) == 230, "incorrect number of codepoints");
+
+#if defined(_DEBUG)
+    const size_t last_implemented = 0x1cde5;
+    for (size_t i = 0; i < sizeof(matrix) / sizeof(matrix[0]); i++) {
+        if (i + 0x1cd00 > last_implemented)
+            break;
+
+        for (size_t j = 0; j < sizeof(matrix) / sizeof(matrix[0]); j++) {
+            if (j + 0x1cd00 > last_implemented)
+                break;
+
+            if (i == j)
+                continue;
+
+            if (matrix[i] == matrix[j]) {
+                BUG("octant U+%05x (idx=%zu) is the same as U+%05x (idx=%zu)",
+                    matrix[i], i, matrix[j], j);
+            }
+        }
+    }
+#endif
+
+    xassert(wc >= 0x1cd00 && wc <= 0x1cde5);
+    const size_t idx = wc - 0x1cd00;
+
+    xassert(idx < ALEN(matrix));
+    uint8_t encoded = matrix[idx];
+
+    if (encoded & UPPER_LEFT)
+        octant_upper_left(buf);
+
+    if (encoded & MIDDLE_UP_LEFT)
+        octant_middle_up_left(buf);
+
+    if (encoded & MIDDLE_DOWN_LEFT)
+        octant_middle_down_left(buf);
+
+    if (encoded & LOWER_LEFT)
+        octant_lower_left(buf);
+
+    if (encoded & UPPER_RIGHT)
+        octant_upper_right(buf);
+
+    if (encoded & MIDDLE_UP_RIGHT)
+        octant_middle_up_right(buf);
+
+    if (encoded & MIDDLE_DOWN_RIGHT)
+        octant_middle_down_right(buf);
+
+    if (encoded & LOWER_RIGHT)
+        octant_lower_right(buf);
+}
+
 static void NOINLINE
 draw_wedge_triangle(struct buf *buf, char32_t wc)
 {
@@ -2856,6 +3252,7 @@
 
     case 0x2800 ... 0x28ff: draw_braille(buf, wc); break;
 
+    case 0x1cd00 ... 0x1cde5: draw_octant(buf, wc); break;
     case 0x1fb00 ... 0x1fb3b: draw_sextant(buf, wc); break;
 
     case 0x1fb3c ... 0x1fb40:
@@ -2957,24 +3354,51 @@
         (double)term->conf->tweak.box_drawing_base_thickness * scale * 
cell_size * dpi / 72.0;
     base_thickness = max(base_thickness, 1);
 
-    int y0 = 0, y1 = 0;
+    int y_third_0 = 0, y_third_1 = 0;
     switch (height % 3) {
     case 0:
-        y0 = height / 3;
-        y1 = 2 * height / 3;
+        y_third_0 = height / 3;
+        y_third_1 = 2 * height / 3;
         break;
 
     case 1:
-        y0 = height / 3;
-        y1 = 2 * height / 3 + 1;
+        y_third_0 = height / 3;
+        y_third_1 = 2 * height / 3 + 1;
         break;
 
     case 2:
-        y0 = height / 3 + 1;
-        y1 = y0 + height / 3;
+        y_third_0 = height / 3 + 1;
+        y_third_1 = y_third_0 + height / 3;
         break;
     }
 
+    /* TODO */
+    int y_quad_0 = 0, y_quad_1 = 0, y_quad_2 = 0;
+    switch (height % 4) {
+    case 0:
+        y_quad_0 = height / 4;
+        y_quad_1 = height / 2;
+        y_quad_2 = 3 * height / 4;
+        break;
+
+    case 1:
+        y_quad_0 = height / 4;
+        y_quad_1 = height / 2;
+        y_quad_2 = 3 * height / 4;
+        break;
+    case 2:
+        y_quad_0 = height / 4;
+        y_quad_1 = height / 2;
+        y_quad_2 = 3 * height / 4;
+        break;
+
+    case 3:
+        y_quad_0 = height / 4;
+        y_quad_1 = height / 2;
+        y_quad_2 = 3 * height / 4;
+        break;
+        }
+
     struct buf buf = {
         .data = data,
         .pix = pix,
@@ -2996,8 +3420,14 @@
         },
 
         .y_thirds = {
-            y0,  /* Endpoint first third, start point second third */
-            y1,  /* Endpoint second third, start point last third */
+            y_third_0,  /* Endpoint first third, start point second third */
+            y_third_1,  /* Endpoint second third, start point last third */
+        },
+
+        .y_quads = {
+            y_quad_0,
+            y_quad_1,
+            y_quad_2,
         },
     };
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/char32.h new/foot-1.20.0/char32.h
--- old/foot-1.19.0/char32.h    2024-10-23 13:51:15.000000000 +0200
+++ new/foot-1.20.0/char32.h    2025-01-01 09:21:51.000000000 +0100
@@ -8,6 +8,10 @@
 #include <wchar.h>
 #include <wctype.h>
 
+#if defined(FOOT_GRAPHEME_CLUSTERING)
+ #include <utf8proc.h>
+#endif
+
 static inline size_t c32len(const char32_t *s) {
     return wcslen((const wchar_t *)s);
 }
@@ -69,11 +73,22 @@
 }
 
 static inline int c32width(char32_t c) {
+#if defined(FOOT_GRAPHEME_CLUSTERING)
+    return utf8proc_charwidth((utf8proc_int32_t)c);
+#else
     return wcwidth((wchar_t)c);
+#endif
 }
 
 static inline int c32swidth(const char32_t *s, size_t n) {
+#if defined(FOOT_GRAPHEME_CLUSTERING)
+    int width = 0;
+    for (size_t i = 0; i < n; i++)
+        width += utf8proc_charwidth((utf8proc_int32_t)s[i]);
+    return width;
+#else
     return wcswidth((const wchar_t *)s, n);
+#endif
 }
 
 size_t mbsntoc32(char32_t *dst, const char *src, size_t nms, size_t len);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/config.c new/foot-1.20.0/config.c
--- old/foot-1.19.0/config.c    2024-10-23 13:51:15.000000000 +0200
+++ new/foot-1.20.0/config.c    2025-01-01 09:21:51.000000000 +0100
@@ -1111,6 +1111,25 @@
 }
 
 static bool
+parse_section_security(struct context *ctx)
+{
+    struct config *conf = ctx->conf;
+    const char *key = ctx->key;
+
+    if (streq(key, "osc52")) {
+        _Static_assert(sizeof(conf->security.osc52) == sizeof(int),
+                       "enum is not 32-bit");
+        return value_to_enum(
+            ctx,
+            (const char *[]){"disabled", "copy-enabled", "paste-enabled", 
"enabled", NULL},
+            (int *)&conf->security.osc52);
+    } else {
+        LOG_CONTEXTUAL_ERR("not a valid option: %s", key);
+        return false;
+    }
+}
+
+static bool
 parse_section_bell(struct context *ctx)
 {
     struct config *conf = ctx->conf;
@@ -2742,6 +2761,7 @@
 
 enum section {
     SECTION_MAIN,
+    SECTION_SECURITY,
     SECTION_BELL,
     SECTION_DESKTOP_NOTIFICATIONS,
     SECTION_SCROLLBACK,
@@ -2769,6 +2789,7 @@
     const char *name;
 } section_info[] = {
     [SECTION_MAIN] =            {&parse_section_main, "main"},
+    [SECTION_SECURITY] =        {&parse_section_security, "security"},
     [SECTION_BELL] =            {&parse_section_bell, "bell"},
     [SECTION_DESKTOP_NOTIFICATIONS] = {&parse_section_desktop_notifications, 
"desktop-notifications"},
     [SECTION_SCROLLBACK] =      {&parse_section_scrollback, "scrollback"},
@@ -3154,6 +3175,9 @@
         .underline_thickness = {.pt = 0., .px = -1},
         .strikeout_thickness = {.pt = 0., .px = -1},
         .dpi_aware = false,
+        .security = {
+            .osc52 = OSC52_ENABLED,
+        },
         .bell = {
             .urgent = false,
             .notify = false,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/config.h new/foot-1.20.0/config.h
--- old/foot-1.19.0/config.h    2024-10-23 13:51:15.000000000 +0200
+++ new/foot-1.20.0/config.h    2025-01-01 09:21:51.000000000 +0100
@@ -174,6 +174,15 @@
     bool can_shape_grapheme;
 
     struct {
+        enum {
+            OSC52_DISABLED,
+            OSC52_COPY_ENABLED,
+            OSC52_PASTE_ENABLED,
+            OSC52_ENABLED,
+        } osc52;
+    } security;
+
+    struct {
         bool urgent;
         bool notify;
         bool flash;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/doc/foot.1.scd 
new/foot-1.20.0/doc/foot.1.scd
--- old/foot-1.19.0/doc/foot.1.scd      2024-10-23 13:51:15.000000000 +0200
+++ new/foot-1.20.0/doc/foot.1.scd      2025-01-01 09:21:51.000000000 +0100
@@ -224,6 +224,8 @@
 
 ## SCROLLBACK SEARCH
 
+These keyboard shortcuts affect the search selection:
+
 *ctrl*+*r*
        Search _backward_ for the next match. If the search string is
        empty, the last searched-for string is used.
@@ -232,7 +234,13 @@
        Search _forward_ for the next match. If the search string is
        empty, the last searched-for string is used.
 
-*ctrl*+*w*
+*shift*+*right*
+       Extend current selection to the right by one character.
+
+*shift*+*left*
+       Extend current selection to the left by one character.
+
+*ctrl*+*w*, *ctrl*+*shift*+*right*
        Extend current selection (and thus the search criteria) to the end
        of the word, or the next word if currently at a word separating
        character.
@@ -241,6 +249,18 @@
        Same as *ctrl*+*w*, except that the only word separating
        characters are whitespace characters.
 
+*ctrl*+*shift*+*left*
+       Extend current selection to the left to the last word boundary.
+
+*ctrl*+*shift*+*w*
+       Extend the current selection to the right to the last whitespace.
+
+*shift*+*down*
+       Extend current selection down one line
+
+*shift*+*up*
+       Extend current selection up one line.
+
 *ctrl*+*v*, *ctrl*+*shift*+*v*, *ctrl*+*y*, *XF86Paste*
        Paste from clipboard into the search buffer.
 
@@ -255,6 +275,40 @@
        selection. The terminal selection is kept, allowing you to press
        *ctrl*+*shift*+*c* to copy it to the clipboard.
 
+These shortcuts affect the search box in scrollback-search mode:
+
+*ctrl*+*b*
+       Moves the cursor in the search box one **character** to the left.
+
+*ctrl*+*left*, *alt*+*b*
+       Moves the cursor in the search box one **word** to the left. 
+
+*ctrl*+*f*
+       Moves the cursor in the search box one **character** to the right.
+
+*ctrl*+*right*, *alt*+*f*
+       Moves the cursor in the search box one **word** to the right.
+
+*Home*, *ctrl*+*a*
+       Moves the cursor in the search box to the beginning of the input.
+
+*End*, *ctrl*+*e*
+       Moves the cursor in the search box to the end of the input. 
+
+*alt*+*backspace*, *ctrl*+*backspace*
+       Deletes the **word before** the cursor. 
+
+*alt*+*delete*, *ctrl*+*delete*
+       Deletes the **word after** the cursor.
+
+These shortcuts affect scrolling in scrollback-search mode:
+
+*shift*+*page-up*
+       Scrolls up/back one page in history.
+
+*shift*+*page-down*
+       Scroll down/forward one page in history.
+
 ## URL MODE
 
 *t*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/doc/foot.ini.5.scd 
new/foot-1.20.0/doc/foot.ini.5.scd
--- old/foot-1.19.0/doc/foot.ini.5.scd  2024-10-23 13:51:15.000000000 +0200
+++ new/foot-1.20.0/doc/foot.ini.5.scd  2025-01-01 09:21:51.000000000 +0100
@@ -416,6 +416,33 @@
 Note: do not set *TERM* here; use the *term* option in the main
 (default) section instead.
 
+# SECTION: security
+
+*osc52*
+
+       Whether OSC-52 (clipboard access) is enabled or disabled. One of
+       *disabled*, *copy-enabled*, *paste-enabled* or *enabled*.
+       
+       OSC-52 gives terminal application access to the host clipboard
+       (i.e. the Wayland clipboard). This is normally not a security
+       issue, since all applications can access the clipboard directly
+       over the Wayland socket.
+       
+       However, when SSH:ing into a remote system, or accessing a
+       container etc, the terminal applications may be untrusted, and you
+       might consider disabling the host clipboard access.
+       
+       - *disabled*: disables all clipboard access
+       - *copy-enabled*: applications can write to the clipboard, but not
+         read from it.
+       - *paste-enabled*: applications can read from the clipboard, but
+         not write to it.
+       - *enabled*: all applications have full access to the host
+         clipboard. This is the default.
+       
+       Default: _enabled_
+
+
 # SECTION: bell
 
 *urgent*
@@ -1305,7 +1332,7 @@
 
 *clipboard-paste*
        Paste from the _clipboard_ into the search buffer. Default:
-       _Control+v Control+y_.
+       _Control+v Control+y Control+Shift+v XF86Paste_.
 
 *primary-paste*
        Paste from the _primary selection_ into the search
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/foot.ini new/foot-1.20.0/foot.ini
--- old/foot-1.19.0/foot.ini    2024-10-23 13:51:15.000000000 +0200
+++ new/foot-1.20.0/foot.ini    2025-01-01 09:21:51.000000000 +0100
@@ -41,6 +41,9 @@
 [environment]
 # name=value
 
+[security]
+# osc52=enabled  # disabled|copy-enabled|paste-enabled|enabled
+
 [bell]
 # urgent=no
 # notify=no
@@ -193,6 +196,7 @@
 # prompt-next=Control+Shift+x
 # unicode-input=Control+Shift+u
 # noop=none
+# quit=none
 
 [search-bindings]
 # cancel=Control+g Control+c Escape
@@ -220,7 +224,6 @@
 # clipboard-paste=Control+v Control+Shift+v Control+y XF86Paste
 # primary-paste=Shift+Insert
 # unicode-input=none
-# quit=none
 # scrollback-up-page=Shift+Page_Up
 # scrollback-up-half-page=none
 # scrollback-up-line=none
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/input.c new/foot-1.20.0/input.c
--- old/foot-1.19.0/input.c     2024-10-23 13:51:15.000000000 +0200
+++ new/foot-1.20.0/input.c     2025-01-01 09:21:51.000000000 +0100
@@ -1236,9 +1236,20 @@
 
     if ((mods & ~locked & ~consumed) == 0) {
         switch (sym) {
-        case XKB_KEY_Return:    term_to_slave(term, "\r", 1); return  true;
-        case XKB_KEY_BackSpace: term_to_slave(term, "\x7f", 1); return true;
-        case XKB_KEY_Tab:       term_to_slave(term, "\t", 1); return true;
+        case XKB_KEY_Return:
+            if (!released)
+                term_to_slave(term, "\r", 1);
+            return  true;
+
+        case XKB_KEY_BackSpace:
+            if (!released)
+                term_to_slave(term, "\x7f", 1);
+            return true;
+
+        case XKB_KEY_Tab:
+            if (!released)
+                term_to_slave(term, "\t", 1);
+            return true;
         }
     }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/meson.build new/foot-1.20.0/meson.build
--- old/foot-1.19.0/meson.build 2024-10-23 13:51:15.000000000 +0200
+++ new/foot-1.20.0/meson.build 2025-01-01 09:21:51.000000000 +0100
@@ -1,5 +1,5 @@
 project('foot', 'c',
-        version: '1.19.0',
+        version: '1.20.0',
         license: 'MIT',
         meson_version: '>=0.59.0',
         default_options: [
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/misc.c new/foot-1.20.0/misc.c
--- old/foot-1.19.0/misc.c      2024-10-23 13:51:15.000000000 +0200
+++ new/foot-1.20.0/misc.c      2025-01-01 09:21:51.000000000 +0100
@@ -1,5 +1,6 @@
 #include "misc.h"
 #include "char32.h"
+#include <stdlib.h>
 
 bool
 isword(char32_t wc, bool spaces_only, const char32_t *delimiters)
@@ -44,8 +45,19 @@
 }
 
 bool
-is_valid_utf8(const char *value)
+is_valid_utf8_and_printable(const char *value)
 {
-    return value != NULL &&
-           mbsntoc32(NULL, value, strlen(value), 0) != (size_t)-1;
+    char32_t *wide = ambstoc32(value);
+    if (wide == NULL)
+        return false;
+
+    for (const char32_t *c = wide; *c != U'\0'; c++) {
+        if (!isc32print(*c)) {
+            free(wide);
+            return false;
+        }
+    }
+
+    free(wide);
+    return true;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/misc.h new/foot-1.20.0/misc.h
--- old/foot-1.19.0/misc.h      2024-10-23 13:51:15.000000000 +0200
+++ new/foot-1.20.0/misc.h      2025-01-01 09:21:51.000000000 +0100
@@ -9,4 +9,4 @@
 void timespec_add(const struct timespec *a, const struct timespec *b, struct 
timespec *res);
 void timespec_sub(const struct timespec *a, const struct timespec *b, struct 
timespec *res);
 
-bool is_valid_utf8(const char *value);
+bool is_valid_utf8_and_printable(const char *value);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/notify.c new/foot-1.20.0/notify.c
--- old/foot-1.19.0/notify.c    2024-10-23 13:51:15.000000000 +0200
+++ new/foot-1.20.0/notify.c    2025-01-01 09:21:51.000000000 +0100
@@ -473,7 +473,8 @@
             "urgency", "muted", "sound-name", "expire-time", "replace-id",
             "action-argument"},
         (const char *[]){
-            app_id, term->window_title, icon_name_or_path, title, body,
+            app_id, term->window_title, icon_name_or_path, title,
+            body != NULL ? body : "",
             notif->category != NULL ? notif->category : "", urgency_str,
             notif->muted ? "true" : "false",
             notif->sound_name != NULL ? notif->sound_name : "",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/osc.c new/foot-1.20.0/osc.c
--- old/foot-1.19.0/osc.c       2024-10-23 13:51:15.000000000 +0200
+++ new/foot-1.20.0/osc.c       2025-01-01 09:21:51.000000000 +0100
@@ -8,7 +8,7 @@
 #include <sys/epoll.h>
 
 #define LOG_MODULE "osc"
-#define LOG_ENABLE_DBG 0
+#define LOG_ENABLE_DBG 1
 #include "log.h"
 #include "base64.h"
 #include "config.h"
@@ -64,6 +64,14 @@
         return;
     }
 
+    const bool copy_allowed = term->conf->security.osc52 == OSC52_ENABLED
+                              || term->conf->security.osc52 == 
OSC52_COPY_ENABLED;
+
+    if (!copy_allowed) {
+        LOG_DBG("ignoring copy request: disabled in configuration");
+        return;
+    }
+
     char *decoded = base64_decode(base64_data, NULL);
     if (decoded == NULL) {
         if (errno == EINVAL)
@@ -190,6 +198,13 @@
         return;
     }
 
+    const bool paste_allowed = term->conf->security.osc52 == OSC52_ENABLED
+                               || term->conf->security.osc52 == 
OSC52_PASTE_ENABLED;
+    if (!paste_allowed) {
+        LOG_DBG("ignoring paste request: disabled in configuration");
+        return;
+    }
+
     /* Use clipboard if no source has been specified */
     char src = source[0] == '\0' ? 'c' : 0;
     bool from_clipboard = src == 'c';
@@ -557,9 +572,13 @@
         return;
     }
 
+    char *msgdup = NULL;
+    if (msg != NULL)
+        msgdup = xstrdup(msg);
+
     notify_notify(term, &(struct notification){
         .title = xstrdup(title),
-        .body = xstrdup(msg),
+        .body = msgdup,
         .expire_time = -1,
         .focus = true,
     });
@@ -1227,10 +1246,22 @@
         osc_uri(term, string);
         break;
 
-    case 9:
+    case 9: {
         /* iTerm2 Growl notifications */
+        const char *sep = strchr(string, ';');
+        if (sep != NULL) {
+            errno = 0;
+            char *end = NULL;
+            strtoul(string, &end, 10);
+            if (end == sep && errno == 0) {
+                /* Ignore ConEmu/Windows Terminal escape */
+                break;
+            }
+        }
+
         osc_notify(term, string);
         break;
+    }
 
     case 10:    /* fg */
     case 11:    /* bg */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/pgo/full-headless-sway.sh 
new/foot-1.20.0/pgo/full-headless-sway.sh
--- old/foot-1.19.0/pgo/full-headless-sway.sh   2024-10-23 13:51:15.000000000 
+0200
+++ new/foot-1.20.0/pgo/full-headless-sway.sh   2025-01-01 09:21:51.000000000 
+0100
@@ -18,7 +18,7 @@
 > "${sway_conf}" echo "exec '${srcdir}'/pgo/full-headless-sway-inner.sh 
 > '${srcdir}' '${blddir}'"
 
 # Run Sway. full-headless-sway-inner.sh ends with a 'swaymsg exit'
-XDG_RUNTIME_DIR="${runtime_dir}" WLR_RENDERER=pixman WLR_BACKENDS=headless 
sway -c "${sway_conf}"
+XDG_RUNTIME_DIR="${runtime_dir}" WLR_RENDERER=pixman WLR_BACKENDS=headless 
sway -c "${sway_conf}" --unsupported-gpu
 
 # Sway's exit code doesn't reflect our script's exit code
 [ -f "${blddir}"/pgo-ok ] || exit 1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/pgo/pgo.sh new/foot-1.20.0/pgo/pgo.sh
--- old/foot-1.19.0/pgo/pgo.sh  2024-10-23 13:51:15.000000000 +0200
+++ new/foot-1.20.0/pgo/pgo.sh  2025-01-01 09:21:51.000000000 +0100
@@ -54,13 +54,10 @@
         ;;
 
     auto)
-        # TODO: once Sway 1.6.2 has been released, prefer
-        # full-headless-sway
-
         if [ -n "${WAYLAND_DISPLAY+x}" ]; then
             mode=full-current-session
-        # elif command -v sway > /dev/null; then  # Requires 1.6.2
-        #     mode=full-headless-sway
+        elif command -v sway > /dev/null; then
+            mode=full-headless-sway
         elif command -v cage > /dev/null; then
             mode=full-headless-cage
         else
@@ -103,6 +100,7 @@
     ninja -C "${blddir}" test
 
     # Run mode-dependent script to generate profiling data
+    export LLVM_PROFILE_FILE="${blddir}/default_%m.profraw"
     "${srcdir}"/pgo/${mode}.sh "${srcdir}" "${blddir}"
 
     if [ ${compiler} = clang ]; then
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/render.c new/foot-1.20.0/render.c
--- old/foot-1.19.0/render.c    2024-10-23 13:51:15.000000000 +0200
+++ new/foot-1.20.0/render.c    2025-01-01 09:21:51.000000000 +0100
@@ -801,7 +801,15 @@
                  * Note, the full range is U+1FB00 - U+1FBF9
                  */
                 (base >= GLYPH_LEGACY_FIRST &&
-                 base <= GLYPH_LEGACY_LAST)) &&
+                 base <= GLYPH_LEGACY_LAST) ||
+
+                /*
+                 * Unicode 16 "Symbols for Legacy Computing Supplement"
+                 *
+                 * Note, the full range is U+1CC00 - U+1CEAF
+                 */
+                (base >= GLYPH_OCTANTS_FIRST &&
+                 base <= GLYPH_OCTANTS_LAST)) &&
 
             likely(!term->conf->box_drawings_uses_font_glyphs))
         {
@@ -809,7 +817,11 @@
             size_t count;
             size_t idx;
 
-            if (base >= GLYPH_LEGACY_FIRST) {
+            if (base >= GLYPH_OCTANTS_FIRST) {
+                arr = &term->custom_glyphs.octants;
+                count = GLYPH_OCTANTS_COUNT;
+                idx = base - GLYPH_OCTANTS_FIRST;
+            } else if (base >= GLYPH_LEGACY_FIRST) {
                 arr = &term->custom_glyphs.legacy;
                 count = GLYPH_LEGACY_COUNT;
                 idx = base - GLYPH_LEGACY_FIRST;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/selection.c new/foot-1.20.0/selection.c
--- old/foot-1.19.0/selection.c 2024-10-23 13:51:15.000000000 +0200
+++ new/foot-1.20.0/selection.c 2025-01-01 09:21:51.000000000 +0100
@@ -533,8 +533,8 @@
     const struct row *row = grid_row_in_view(term->grid, pos->row);
     char32_t wc = row->cells[pos->col].wc;
 
-    if ((*quote_char == '\0' && (wc == '"' || wc == '\'')) ||
-        wc == *quote_char)
+    if (*quote_char == '\0' ? (wc == '"' || wc == '\'')
+                            : wc == *quote_char)
     {
         return false;
     }
@@ -555,8 +555,8 @@
 
         wc = row->cells[next_col].wc;
 
-        if ((*quote_char == '\0' && (wc == '"' || wc == '\'')) ||
-            wc == *quote_char)
+        if (*quote_char == '\0' ? (wc == '"' || wc == '\'')
+                                : wc == *quote_char)
         {
             pos->row = next_row;
             pos->col = next_col + 1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/terminal.c new/foot-1.20.0/terminal.c
--- old/foot-1.19.0/terminal.c  2024-10-23 13:51:15.000000000 +0200
+++ new/foot-1.20.0/terminal.c  2025-01-01 09:21:51.000000000 +0100
@@ -808,6 +808,8 @@
         &term->custom_glyphs.braille, GLYPH_BRAILLE_COUNT);
     free_custom_glyphs(
         &term->custom_glyphs.legacy, GLYPH_LEGACY_COUNT);
+    free_custom_glyphs(
+        &term->custom_glyphs.octants, GLYPH_OCTANTS_COUNT);
 
     const struct config *conf = term->conf;
 
@@ -884,8 +886,6 @@
      * scaling factor (no downscaling done by the compositor).
      */
 
-    xassert(tll_length(term->wl->monitors) > 0);
-
     const struct wl_window *win = term->window;
     const struct monitor *mon = NULL;
 
@@ -1829,6 +1829,8 @@
         &term->custom_glyphs.braille, GLYPH_BRAILLE_COUNT);
     free_custom_glyphs(
         &term->custom_glyphs.legacy, GLYPH_LEGACY_COUNT);
+    free_custom_glyphs(
+        &term->custom_glyphs.octants, GLYPH_OCTANTS_COUNT);
 
     free(term->search.buf);
     free(term->search.last.buf);
@@ -3568,7 +3570,7 @@
     if (term->window_title != NULL && streq(term->window_title, title))
         return;
 
-    if (!is_valid_utf8(title)) {
+    if (!is_valid_utf8_and_printable(title)) {
         /* It's an xdg_toplevel::set_title() protocol violation to set
            a title with an invalid UTF-8 sequence */
         LOG_WARN("%s: title is not valid UTF-8, ignoring", title);
@@ -3591,7 +3593,7 @@
     if (term->app_id != NULL && app_id != NULL && streq(term->app_id, app_id))
         return;
 
-    if (app_id != NULL && !is_valid_utf8(app_id)) {
+    if (app_id != NULL && !is_valid_utf8_and_printable(app_id)) {
         LOG_WARN("%s: app-id is not valid UTF-8, ignoring", app_id);
         return;
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/terminal.h new/foot-1.20.0/terminal.h
--- old/foot-1.19.0/terminal.h  2024-10-23 13:51:15.000000000 +0200
+++ new/foot-1.20.0/terminal.h  2025-01-01 09:21:51.000000000 +0100
@@ -483,6 +483,7 @@
         struct fcft_glyph **box_drawing;
         struct fcft_glyph **braille;
         struct fcft_glyph **legacy;
+        struct fcft_glyph **octants;
 
         #define GLYPH_BOX_DRAWING_FIRST 0x2500
         #define GLYPH_BOX_DRAWING_LAST  0x259F
@@ -498,6 +499,11 @@
         #define GLYPH_LEGACY_LAST  0x1FB9B
         #define GLYPH_LEGACY_COUNT \
             (GLYPH_LEGACY_LAST - GLYPH_LEGACY_FIRST + 1)
+
+        #define GLYPH_OCTANTS_FIRST 0x1CD00
+        #define GLYPH_OCTANTS_LAST  0x1CDE5
+        #define GLYPH_OCTANTS_COUNT \
+            (GLYPH_OCTANTS_LAST - GLYPH_OCTANTS_FIRST + 1)
     } custom_glyphs;
 
     bool is_sending_paste_data;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/tests/test-config.c 
new/foot-1.20.0/tests/test-config.c
--- old/foot-1.19.0/tests/test-config.c 2024-10-23 13:51:15.000000000 +0200
+++ new/foot-1.20.0/tests/test-config.c 2025-01-01 09:21:51.000000000 +0100
@@ -554,6 +554,22 @@
 }
 
 static void
+test_section_security(void)
+{
+    struct config conf = {0};
+    struct context ctx = {.conf = &conf, .section = "security", .path = 
"unittest"};
+
+    test_invalid_key(&ctx, &parse_section_security, "invalid-key");
+    test_enum(
+        &ctx, &parse_section_security, "osc52", 4,
+        (const char*[]){"disabled", "copy-enabled", "paste-enabled", 
"enabled"},
+        (int []){OSC52_DISABLED, OSC52_COPY_ENABLED, OSC52_PASTE_ENABLED, 
OSC52_ENABLED},
+        (int *)&conf.security.osc52);
+
+    config_free(&conf);
+}
+
+static void
 test_section_bell(void)
 {
     struct config conf = {0};
@@ -1407,6 +1423,7 @@
     FcInit();
     log_init(LOG_COLORIZE_AUTO, false, 0, LOG_CLASS_ERROR);
     test_section_main();
+    test_section_security();
     test_section_bell();
     test_section_desktop_notifications();
     test_section_scrollback();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/themes/rose-pine 
new/foot-1.20.0/themes/rose-pine
--- old/foot-1.19.0/themes/rose-pine    2024-10-23 13:51:15.000000000 +0200
+++ new/foot-1.20.0/themes/rose-pine    2025-01-01 09:21:51.000000000 +0100
@@ -1,5 +1,5 @@
 # -*- conf -*-
-# Rose-Piné
+# Rosé Pine
 
 [cursor]
 color=191724 e0def4 
@@ -7,20 +7,24 @@
 [colors]
 background=191724 
 foreground=e0def4 
-regular0=26233a  # black
-regular1=eb6f92  # red
-regular2=31748f  # green
-regular3=f6c177  # yellow
-regular4=9ccfd8  # blue
-regular5=c4a7e7  # magenta
-regular6=ebbcba  # cyan
-regular7=e0def4  # white
-
-bright0=6e6a86   # bright black
-bright1=eb6f92   # bright red
-bright2=31748f   # bright green
-bright3=f6c177   # bright yellow
-bright4=9ccfd8   # bright blue
-bright5=c4a7e7   # bright magenta
-bright6=ebbcba   # bright cyan
-bright7=e0def4   # bright white
\ No newline at end of file
+
+regular0=26233a     # black (Overlay)
+regular1=eb6f92     # red (Love)
+regular2=9ccfd8     # green (Foam)
+regular3=f6c177     # yellow (Gold)
+regular4=31748f     # blue (Pine)
+regular5=c4a7e7     # magenta (Iris)
+regular6=ebbcba     # cyan (Rose)
+regular7=e0def4     # white (Text)
+
+bright0=47435d      # bright black (lighter Overlay)
+bright1=ff98ba      # bright red (lighter Love)
+bright2=c5f9ff      # bright green (lighter Foam)
+bright3=ffeb9e      # bright yellow (lighter Gold)
+bright4=5b9ab7      # bright blue (lighter Pine)
+bright5=eed0ff      # bright magenta (lighter Iris)
+bright6=ffe5e3      # bright cyan (lighter Rose)
+bright7=fefcff      # bright white (lighter Text)
+
+flash=f6c177        # yellow (Gold)
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/themes/rose-pine-dawn 
new/foot-1.20.0/themes/rose-pine-dawn
--- old/foot-1.19.0/themes/rose-pine-dawn       1970-01-01 01:00:00.000000000 
+0100
+++ new/foot-1.20.0/themes/rose-pine-dawn       2025-01-01 09:21:51.000000000 
+0100
@@ -0,0 +1,30 @@
+# -*- conf -*-
+# Rosé Pine Dawn
+
+[cursor]
+color=faf4ed 575279
+
+[colors]
+background=faf4ed
+foreground=575279
+
+regular0=f2e9e1     # black (Overlay)
+regular1=b4637a     # red (Love)
+regular2=56949f     # green (Foam)
+regular3=ea9d34     # yellow (Gold)
+regular4=286983     # blue (Pine)
+regular5=907aa9     # magenta (Iris)
+regular6=d7827e     # cyan (Rose)
+regular7=575279     # white (Text)
+
+bright0=fffdf5      # bright black (lighter Overlay)
+bright1=df8aa0      # bright red (lighter Love)
+bright2=7ebcc7      # bright green (lighter Foam)
+bright3=ffc55c      # bright yellow (lighter Gold)
+bright4=538faa      # bright blue (lighter Pine)
+bright5=b8a1d2      # bright magenta (lighter Iris)
+bright6=ffaaa5      # bright cyan (lighter Rose)
+bright7=7c76a0      # bright white (lighter Text)
+
+flash=ea9d34        # yellow (Gold)
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/themes/rose-pine-moon 
new/foot-1.20.0/themes/rose-pine-moon
--- old/foot-1.19.0/themes/rose-pine-moon       1970-01-01 01:00:00.000000000 
+0100
+++ new/foot-1.20.0/themes/rose-pine-moon       2025-01-01 09:21:51.000000000 
+0100
@@ -0,0 +1,30 @@
+# -*- conf -*-
+# Rosé Pine Moon
+
+[cursor]
+color=232136 e0def4
+
+[colors]
+background=232136
+foreground=e0def4
+
+regular0=393552     # black (Overlay)
+regular1=eb6f92     # red (Love)
+regular2=9ccfd8     # green (Foam)
+regular3=f6c177     # yellow (Gold)
+regular4=3e8fb0     # blue (Pine)
+regular5=c4a7e7     # magenta (Iris)
+regular6=ea9a97     # cyan (Rose)
+regular7=e0def4     # white (Text)
+
+bright0=5c5776      # bright black (lighter Overlay)
+bright1=ff98ba      # bright red (lighter Love)
+bright2=c5f9ff      # bright green (lighter Foam)
+bright3=ffeb9e      # bright yellow (lighter Gold)
+bright4=6ab7d9      # bright blue (lighter Pine)
+bright5=eed0ff      # bright magenta (lighter Iris)
+bright6=ffc3bf      # bright cyan (lighter Rose)
+bright7=fefcff      # bright white (lighter Text)
+
+flash=f6c177        # yellow (Gold)
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/unicode/emoji-variation-sequences.txt 
new/foot-1.20.0/unicode/emoji-variation-sequences.txt
--- old/foot-1.19.0/unicode/emoji-variation-sequences.txt       2024-10-23 
13:51:15.000000000 +0200
+++ new/foot-1.20.0/unicode/emoji-variation-sequences.txt       2025-01-01 
09:21:51.000000000 +0100
@@ -1,11 +1,11 @@
 # emoji-variation-sequences.txt
-# Date: 2023-02-01, 02:22:54 GMT
-# © 2023 Unicode®, Inc.
+# Date: 2024-05-01, 21:25:24 GMT
+# © 2024 Unicode®, Inc.
 # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in 
the U.S. and other countries.
-# For terms of use, see https://www.unicode.org/terms_of_use.html
+# For terms of use and license, see https://www.unicode.org/terms_of_use.html
 #
 # Emoji Variation Sequences for UTS #51
-# Used with Emoji Version 15.1 and subsequent minor revisions (if any)
+# Used with Emoji Version 16.0 and subsequent minor revisions (if any)
 #
 # For documentation and usage, see https://www.unicode.org/reports/tr51
 #
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/foot-1.19.0/vt.c new/foot-1.20.0/vt.c
--- old/foot-1.19.0/vt.c        2024-10-23 13:51:15.000000000 +0200
+++ new/foot-1.20.0/vt.c        2025-01-01 09:21:51.000000000 +0100
@@ -763,9 +763,11 @@
                 bool comb_from_primary;
                 bool pre_from_primary;
 
-                char32_t precomposed = fcft_precompose(
-                    term->fonts[0], base, wc, &base_from_primary,
-                    &comb_from_primary, &pre_from_primary);
+                char32_t precomposed = term->fonts[0] != NULL
+                    ? fcft_precompose(
+                        term->fonts[0], base, wc, &base_from_primary,
+                        &comb_from_primary, &pre_from_primary)
+                    : (char32_t)-1;
 
                 int precomposed_width = c32width(precomposed);
 

Reply via email to