vt: support Unicode recomposition
authorNicolas Pitre <npitre@baylibre.com>
Thu, 10 Apr 2025 01:14:00 +0000 (21:14 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 11 Apr 2025 14:55:55 +0000 (16:55 +0200)
Try replacing any decomposed Unicode sequence by the corresponding
recomposed code point. Code point to glyph correspondance works best
after recomposition, and this apply mostly to single-width code points
therefore we can't preserve them in their decomposed form anyway.

With all the infrastructure in place this is now trivial to do.

Signed-off-by: Nicolas Pitre <npitre@baylibre.com>
Link: https://lore.kernel.org/r/20250410011839.64418-9-nico@fluxnic.net
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/vt/vt.c

index 5d53feeb5d2bf872b51ef857416a7f761b0524f5..e3d35c4f92045a8ed7c18ac2193d2913381249d4 100644 (file)
@@ -2953,8 +2953,15 @@ static int vc_con_write_normal(struct vc_data *vc, int tc, int c,
                                 * double-width.
                                 */
                        } else {
-                               /* Otherwise zero-width code points are ignored */
-                               goto out;
+                               /* try recomposition */
+                               prev_c = ucs_recompose(prev_c, c);
+                               if (prev_c != 0) {
+                                       vc_con_rewind(vc);
+                                       c = prev_c;
+                               } else {
+                                       /* Otherwise zero-width code points are ignored */
+                                       goto out;
+                               }
                        }
                }
        }