diff --git a/desktop/toolkit/gtk/pango/files/1cf8e9b3cadad6efe510a177ca2be8f852022333.diff b/desktop/toolkit/gtk/pango/files/1cf8e9b3cadad6efe510a177ca2be8f852022333.diff
new file mode 100644
index 0000000000..d15d5b0aab
--- /dev/null
+++ b/desktop/toolkit/gtk/pango/files/1cf8e9b3cadad6efe510a177ca2be8f852022333.diff
@@ -0,0 +1,157 @@
+diff --git a/tests/fonts/DejaVuSansMono.ttf b/tests/fonts/DejaVuSansMono.ttf
+new file mode 100644
+index 0000000000000000000000000000000000000000..d723948fed5dc9d2e63f57af9f80f2a472aff898
+Binary files /dev/null and b/tests/fonts/DejaVuSansMono.ttf differ
+diff --git a/tests/fonts/fonts.conf b/tests/fonts/fonts.conf
+index 5ff7022b727b37ef2d52efd2738682baa8af9280..4308770bc153dfae16639b2c6d8b4eb6822b0db2 100644
+--- a/tests/fonts/fonts.conf
++++ b/tests/fonts/fonts.conf
+@@ -62,4 +62,10 @@
+ Noto Color Emoji
+
+
++
++
++ DejaVu Sans Mono
++ monospace
++
++
+
+diff --git a/tests/layouts/valid-12.layout b/tests/layouts/valid-12.layout
+index 099813cefb41cf5f93040323d98342c4c06a0970..3c09f51f9b22cbde88bebd139296cf34b25052dd 100644
+--- a/tests/layouts/valid-12.layout
++++ b/tests/layouts/valid-12.layout
+@@ -52,8 +52,8 @@
+ "is-wrapped" : true,
+ "is-ellipsized" : false,
+ "unknown-glyphs" : 1,
+- "width" : 202752,
+- "height" : 202752,
++ "width" : 179200,
++ "height" : 179200,
+ "log-attrs" : [
+ {
+ "char-break" : true,
+@@ -258,7 +258,7 @@
+ "glyphs" : [
+ {
+ "glyph" : 268435455,
+- "width" : 51200,
++ "width" : 43008,
+ "is-cluster-start" : true,
+ "log-cluster" : 0
+ }
+@@ -330,7 +330,7 @@
+ "glyphs" : [
+ {
+ "glyph" : 268435455,
+- "width" : 51200,
++ "width" : 43008,
+ "is-cluster-start" : true,
+ "log-cluster" : 0
+ }
+@@ -402,7 +402,7 @@
+ "glyphs" : [
+ {
+ "glyph" : 268435455,
+- "width" : 51200,
++ "width" : 44032,
+ "is-cluster-start" : true,
+ "log-cluster" : 0
+ }
+@@ -554,7 +554,7 @@
+ "glyphs" : [
+ {
+ "glyph" : 268435455,
+- "width" : 51200,
++ "width" : 43008,
+ "is-cluster-start" : true,
+ "log-cluster" : 0
+ }
+@@ -626,7 +626,7 @@
+ "glyphs" : [
+ {
+ "glyph" : 268435455,
+- "width" : 51200,
++ "width" : 46080,
+ "is-cluster-start" : true,
+ "log-cluster" : 0
+ }
+@@ -698,7 +698,7 @@
+ "glyphs" : [
+ {
+ "glyph" : 268435455,
+- "width" : 51200,
++ "width" : 43008,
+ "is-cluster-start" : true,
+ "log-cluster" : 0
+ }
+diff --git a/tests/layouts/valid-13.layout b/tests/layouts/valid-13.layout
+index bd0f04fa11763fdcd57077c92c5c69fced592960..cb2ac92a2af2e46e0c4277234cbb5f3b46e80275 100644
+--- a/tests/layouts/valid-13.layout
++++ b/tests/layouts/valid-13.layout
+@@ -53,8 +53,8 @@
+ "is-wrapped" : false,
+ "is-ellipsized" : false,
+ "unknown-glyphs" : 1,
+- "width" : 386048,
+- "height" : 386048,
++ "width" : 315392,
++ "height" : 315392,
+ "log-attrs" : [
+ {
+ "char-break" : true,
+@@ -271,7 +271,7 @@
+ "glyphs" : [
+ {
+ "glyph" : 268435455,
+- "width" : 51200,
++ "width" : 43008,
+ "is-cluster-start" : true,
+ "log-cluster" : 0
+ }
+@@ -355,7 +355,7 @@
+ "glyphs" : [
+ {
+ "glyph" : 268435455,
+- "width" : 51200,
++ "width" : 43008,
+ "is-cluster-start" : true,
+ "log-cluster" : 0
+ }
+@@ -439,7 +439,7 @@
+ "glyphs" : [
+ {
+ "glyph" : 268435455,
+- "width" : 51200,
++ "width" : 44032,
+ "is-cluster-start" : true,
+ "log-cluster" : 0
+ }
+@@ -607,7 +607,7 @@
+ "glyphs" : [
+ {
+ "glyph" : 268435455,
+- "width" : 51200,
++ "width" : 17408,
+ "is-cluster-start" : true,
+ "log-cluster" : 0
+ }
+@@ -691,7 +691,7 @@
+ "glyphs" : [
+ {
+ "glyph" : 268435455,
+- "width" : 51200,
++ "width" : 46080,
+ "is-cluster-start" : true,
+ "log-cluster" : 0
+ }
+@@ -775,7 +775,7 @@
+ "glyphs" : [
+ {
+ "glyph" : 268435455,
+- "width" : 51200,
++ "width" : 43008,
+ "is-cluster-start" : true,
+ "log-cluster" : 0
+ }
diff --git a/desktop/toolkit/gtk/pango/files/dc5b1fdea7d63277f2b31489896d1947f0511a24.diff b/desktop/toolkit/gtk/pango/files/dc5b1fdea7d63277f2b31489896d1947f0511a24.diff
new file mode 100644
index 0000000000..b4d2ce2d09
--- /dev/null
+++ b/desktop/toolkit/gtk/pango/files/dc5b1fdea7d63277f2b31489896d1947f0511a24.diff
@@ -0,0 +1,426 @@
+diff --git a/pango/pango-layout.c b/pango/pango-layout.c
+index ed46d57a6e4c26f34e23044544d0b0ec34cb93f3..a495596ccbb022948a7a3dfcee9e3852046c1b7b 100644
+--- a/pango/pango-layout.c
++++ b/pango/pango-layout.c
+@@ -3662,6 +3662,31 @@ get_decimal_prefix_width (PangoItem *item,
+ g_free (log_widths);
+ }
+
++static int
++line_width (ParaBreakState *state,
++ PangoLayoutLine *line)
++{
++ GSList *l;
++ int i;
++ int width = 0;
++
++ if (state->remaining_width > -1)
++ return state->line_width - state->remaining_width;
++
++ /* Compute the width of the line currently - inefficient, but easier
++ * than keeping the current width of the line up to date everywhere
++ */
++ for (l = line->runs; l; l = l->next)
++ {
++ PangoLayoutRun *run = l->data;
++
++ for (i = 0; i < run->glyphs->num_glyphs; i++)
++ width += run->glyphs->glyphs[i].geometry.width;
++ }
++
++ return width;
++}
++
+ static PangoGlyphString *
+ shape_run (PangoLayoutLine *line,
+ ParaBreakState *state,
+@@ -3671,7 +3696,7 @@ shape_run (PangoLayoutLine *line,
+ PangoGlyphString *glyphs = pango_glyph_string_new ();
+
+ if (layout->text[item->offset] == '\t')
+- shape_tab (line, &state->last_tab, &state->properties, state->line_width - state->remaining_width, item, glyphs);
++ shape_tab (line, &state->last_tab, &state->properties, line_width (state, line), item, glyphs);
+ else
+ {
+ PangoShapeFlags shape_flags = PANGO_SHAPE_NONE;
+diff --git a/tests/layouts/tabs-nowrap.layout b/tests/layouts/tabs-nowrap.layout
+new file mode 100644
+index 0000000000000000000000000000000000000000..4a1d40b5202c776079fdf017110a2e8ab3bc5f7f
+--- /dev/null
++++ b/tests/layouts/tabs-nowrap.layout
+@@ -0,0 +1,363 @@
++{
++ "context" : {
++ "font" : "serif 12",
++ "base-gravity" : "south",
++ "gravity-hint" : "natural",
++ "base-dir" : "weak-ltr",
++ "round-glyph-positions" : true,
++ "transform" : [
++ 1,
++ 0,
++ 0,
++ 1,
++ 0,
++ 0
++ ]
++ },
++ "comment" : "A case where tabs were broken if line wrapping is disabled.",
++ "text" : "123\t9\n123456789",
++ "attributes" : [
++ {
++ "type" : "font-features",
++ "value" : "tnum=1"
++ }
++ ],
++ "font" : "DejaVu Sans Mono 32",
++ "output" : {
++ "is-wrapped" : false,
++ "is-ellipsized" : false,
++ "unknown-glyphs" : 0,
++ "width" : 239616,
++ "height" : 239616,
++ "log-attrs" : [
++ {
++ "char-break" : true,
++ "cursor-position" : true,
++ "word-start" : true,
++ "sentence-boundary" : true,
++ "sentence-start" : true,
++ "backspace-deletes-character" : true,
++ "word-boundary" : true
++ },
++ {
++ "char-break" : true,
++ "cursor-position" : true
++ },
++ {
++ "char-break" : true,
++ "cursor-position" : true
++ },
++ {
++ "char-break" : true,
++ "white" : true,
++ "cursor-position" : true,
++ "word-end" : true,
++ "word-boundary" : true
++ },
++ {
++ "line-break" : true,
++ "char-break" : true,
++ "cursor-position" : true,
++ "word-start" : true,
++ "backspace-deletes-character" : true,
++ "word-boundary" : true
++ },
++ {
++ "char-break" : true,
++ "white" : true,
++ "cursor-position" : true,
++ "word-end" : true,
++ "sentence-end" : true,
++ "word-boundary" : true
++ },
++ {
++ "line-break" : true,
++ "mandatory-break" : true,
++ "char-break" : true,
++ "cursor-position" : true,
++ "word-start" : true,
++ "sentence-boundary" : true,
++ "sentence-start" : true,
++ "backspace-deletes-character" : true,
++ "word-boundary" : true
++ },
++ {
++ "char-break" : true,
++ "cursor-position" : true
++ },
++ {
++ "char-break" : true,
++ "cursor-position" : true
++ },
++ {
++ "char-break" : true,
++ "cursor-position" : true
++ },
++ {
++ "char-break" : true,
++ "cursor-position" : true
++ },
++ {
++ "char-break" : true,
++ "cursor-position" : true
++ },
++ {
++ "char-break" : true,
++ "cursor-position" : true
++ },
++ {
++ "char-break" : true,
++ "cursor-position" : true
++ },
++ {
++ "char-break" : true,
++ "cursor-position" : true
++ },
++ {
++ "line-break" : true,
++ "mandatory-break" : true,
++ "char-break" : true,
++ "white" : true,
++ "cursor-position" : true,
++ "word-end" : true,
++ "sentence-boundary" : true,
++ "sentence-end" : true,
++ "word-boundary" : true
++ }
++ ],
++ "lines" : [
++ {
++ "start-index" : 0,
++ "length" : 5,
++ "paragraph-start" : true,
++ "direction" : "ltr",
++ "runs" : [
++ {
++ "offset" : 0,
++ "length" : 3,
++ "text" : "123",
++ "bidi-level" : 0,
++ "gravity" : "south",
++ "language" : "en-us",
++ "script" : "common",
++ "font" : {
++ "description" : "DejaVu Sans Mono 32",
++ "checksum" : "84c5467cadd1f6f23db0d9fbb6377e0d301334d3b5f36e6d5acebd34d0857d3a",
++ "matrix" : [
++ 1,
++ -0,
++ -0,
++ 1,
++ 0,
++ 0
++ ]
++ },
++ "flags" : 0,
++ "extra-attributes" : [
++ {
++ "type" : "font-features",
++ "value" : "tnum=1"
++ }
++ ],
++ "y-offset" : 0,
++ "start-x-offset" : 0,
++ "end-x-offset" : 0,
++ "glyphs" : [
++ {
++ "glyph" : 20,
++ "width" : 26624,
++ "is-cluster-start" : true,
++ "log-cluster" : 0
++ },
++ {
++ "glyph" : 21,
++ "width" : 26624,
++ "is-cluster-start" : true,
++ "log-cluster" : 1
++ },
++ {
++ "glyph" : 22,
++ "width" : 26624,
++ "is-cluster-start" : true,
++ "log-cluster" : 2
++ }
++ ]
++ },
++ {
++ "offset" : 3,
++ "length" : 1,
++ "text" : "\t",
++ "bidi-level" : 0,
++ "gravity" : "south",
++ "language" : "en-us",
++ "script" : "common",
++ "font" : {
++ "description" : "DejaVu Sans Mono 32",
++ "checksum" : "84c5467cadd1f6f23db0d9fbb6377e0d301334d3b5f36e6d5acebd34d0857d3a",
++ "matrix" : [
++ 1,
++ -0,
++ -0,
++ 1,
++ 0,
++ 0
++ ]
++ },
++ "flags" : 0,
++ "extra-attributes" : [
++ {
++ "type" : "font-features",
++ "value" : "tnum=1"
++ }
++ ],
++ "y-offset" : 0,
++ "start-x-offset" : 0,
++ "end-x-offset" : 0,
++ "glyphs" : [
++ {
++ "glyph" : 268435455,
++ "width" : 133120,
++ "is-cluster-start" : true,
++ "log-cluster" : 0
++ }
++ ]
++ },
++ {
++ "offset" : 4,
++ "length" : 1,
++ "text" : "9",
++ "bidi-level" : 0,
++ "gravity" : "south",
++ "language" : "en-us",
++ "script" : "common",
++ "font" : {
++ "description" : "DejaVu Sans Mono 32",
++ "checksum" : "84c5467cadd1f6f23db0d9fbb6377e0d301334d3b5f36e6d5acebd34d0857d3a",
++ "matrix" : [
++ 1,
++ -0,
++ -0,
++ 1,
++ 0,
++ 0
++ ]
++ },
++ "flags" : 0,
++ "extra-attributes" : [
++ {
++ "type" : "font-features",
++ "value" : "tnum=1"
++ }
++ ],
++ "y-offset" : 0,
++ "start-x-offset" : 0,
++ "end-x-offset" : 0,
++ "glyphs" : [
++ {
++ "glyph" : 28,
++ "width" : 26624,
++ "is-cluster-start" : true,
++ "log-cluster" : 0
++ }
++ ]
++ }
++ ]
++ },
++ {
++ "start-index" : 6,
++ "length" : 9,
++ "paragraph-start" : true,
++ "direction" : "ltr",
++ "runs" : [
++ {
++ "offset" : 6,
++ "length" : 9,
++ "text" : "123456789",
++ "bidi-level" : 0,
++ "gravity" : "south",
++ "language" : "en-us",
++ "script" : "common",
++ "font" : {
++ "description" : "DejaVu Sans Mono 32",
++ "checksum" : "84c5467cadd1f6f23db0d9fbb6377e0d301334d3b5f36e6d5acebd34d0857d3a",
++ "matrix" : [
++ 1,
++ -0,
++ -0,
++ 1,
++ 0,
++ 0
++ ]
++ },
++ "flags" : 0,
++ "extra-attributes" : [
++ {
++ "type" : "font-features",
++ "value" : "tnum=1"
++ }
++ ],
++ "y-offset" : 0,
++ "start-x-offset" : 0,
++ "end-x-offset" : 0,
++ "glyphs" : [
++ {
++ "glyph" : 20,
++ "width" : 26624,
++ "is-cluster-start" : true,
++ "log-cluster" : 0
++ },
++ {
++ "glyph" : 21,
++ "width" : 26624,
++ "is-cluster-start" : true,
++ "log-cluster" : 1
++ },
++ {
++ "glyph" : 22,
++ "width" : 26624,
++ "is-cluster-start" : true,
++ "log-cluster" : 2
++ },
++ {
++ "glyph" : 23,
++ "width" : 26624,
++ "is-cluster-start" : true,
++ "log-cluster" : 3
++ },
++ {
++ "glyph" : 24,
++ "width" : 26624,
++ "is-cluster-start" : true,
++ "log-cluster" : 4
++ },
++ {
++ "glyph" : 25,
++ "width" : 26624,
++ "is-cluster-start" : true,
++ "log-cluster" : 5
++ },
++ {
++ "glyph" : 26,
++ "width" : 26624,
++ "is-cluster-start" : true,
++ "log-cluster" : 6
++ },
++ {
++ "glyph" : 27,
++ "width" : 26624,
++ "is-cluster-start" : true,
++ "log-cluster" : 7
++ },
++ {
++ "glyph" : 28,
++ "width" : 26624,
++ "is-cluster-start" : true,
++ "log-cluster" : 8
++ }
++ ]
++ }
++ ]
++ }
++ ]
++ }
++}
+diff --git a/tests/meson.build b/tests/meson.build
+index 2acf0def5f2d016884cc4cab63ab6fc77bde85b6..b15c72914b73db2649caeb7677604de6b1fa675b 100644
+--- a/tests/meson.build
++++ b/tests/meson.build
+@@ -96,6 +96,7 @@ installed_test_layouts_data = [
+ 'layouts/effigy.layout',
+ 'layouts/kebab.layout',
+ 'layouts/tabs.layout',
++ 'layouts/tabs-nowrap.layout',
+ 'layouts/valid-1.layout',
+ 'layouts/valid-2.layout',
+ 'layouts/valid-3.layout',
diff --git a/desktop/toolkit/gtk/pango/pspec.xml b/desktop/toolkit/gtk/pango/pspec.xml
index d6813155dc..0c4479fb5d 100644
--- a/desktop/toolkit/gtk/pango/pspec.xml
+++ b/desktop/toolkit/gtk/pango/pspec.xml
@@ -35,6 +35,8 @@
56174802a73d8855b7497d90f722b37233c6b477.diff
+ 1cf8e9b3cadad6efe510a177ca2be8f852022333.diff
+ dc5b1fdea7d63277f2b31489896d1947f0511a24.diff