Commit 547f57b8 authored by Nicolas Pitre's avatar Nicolas Pitre Committed by Greg Kroah-Hartman
Browse files

vt: pad double-width code points with a zero-white-space



In the Unicode screen buffer, we follow double-width code points with a
space to maintain proper column alignment. This, however, creates
semantic problems when e.g. using cut and paste or selection.

Let's use a better code point for the column padding's purpose i.e. a
zero-white-space rather than a full space.

Signed-off-by: default avatarNicolas Pitre <npitre@baylibre.com>
Link: https://lore.kernel.org/r/20250410011839.64418-12-nico@fluxnic.net


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent c7cb5b07
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -2937,12 +2937,13 @@ static int vc_con_write_normal(struct vc_data *vc, int tc, int c,
			width = 2;
		} else if (ucs_is_zero_width(c)) {
			prev_c = vc_uniscr_getc(vc, -1);
			if (prev_c == ' ' &&
			if (prev_c == 0x200B &&
			    ucs_is_double_width(vc_uniscr_getc(vc, -2))) {
				/*
				 * Let's merge this zero-width code point with
				 * the preceding double-width code point by
				 * replacing the existing whitespace padding.
				 * replacing the existing zero-white-space
				 * padding.
				 */
				vc_con_rewind(vc);
			} else if (c == 0xfe0f && prev_c != 0) {
@@ -3040,7 +3041,11 @@ static int vc_con_write_normal(struct vc_data *vc, int tc, int c,
		tc = conv_uni_to_pc(vc, ' ');
		if (tc < 0)
			tc = ' ';
		next_c = ' ';
		/*
		 * Store a zero-white-space in the Unicode screen given that
		 * the previous code point is semantically double-width.
		 */
		next_c = 0x200B;
	}

out: