summarylogtreecommitdiffstats
path: root/fullwidth-emoji.patch
blob: ba6ce297fad5d30739af01c7c1f7e35a48f00e68 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
--- a/src/vte.cc	2016-03-21 19:49:00.390775386 +0800
+++ b/src/vte.cc	2016-03-21 19:50:22.627904117 +0800
@@ -206,6 +206,11 @@
                 return 0;
         if (G_UNLIKELY (g_unichar_iswide (c)))
                 return 2;
+        if (G_UNLIKELY(0x25a0 <= c && c < 0x27c0 || // Geometric Shapes, Miscellaneous Symbols, Dingbats
+                       0x2b00 <= c && c < 0x2c00 || // Miscellaneous Symbols and Arrows
+                       0x1f300 <= c && c < 0x20000 || // Miscellaneous Symbols and Pictographs ... Supplemental Symbols and Pictographs
+                       0))
+                return 2;
         if (G_LIKELY (utf8_ambiguous_width == 1))
                 return 1;
         if (G_UNLIKELY (g_unichar_iswide_cjk (c)))
--- a/src/vteseq.cc	2016-04-05 10:56:49.875097322 +0800
+++ b/src/vteseq.cc	2016-04-05 10:56:39.522122540 +0800
@@ -25,6 +25,7 @@
 #ifdef HAVE_SYS_SYSLIMITS_H
 #include <sys/syslimits.h>
 #endif
+#include <termios.h>
 
 #include <glib.h>
 
@@ -1589,12 +1590,23 @@
 void
 VteTerminalPrivate::seq_backspace()
 {
-        ensure_cursor_is_onscreen();
+	ensure_cursor_is_onscreen();
 
-        if (m_screen->cursor.col > 0) {
+	struct termios tio;
+	g_assert(tcgetattr(vte_pty_get_fd(m_pty), &tio) == 0);
+	if (tio.c_lflag & ICANON && tio.c_iflag & IUTF8) {
+		VteRowData *rowdata = ensure_row();
+		int col = m_screen->cursor.col;
+		if (col == 0)
+			;
+		else if (col > rowdata->len)
+			col--;
+		else
+			col = MAX(col - rowdata->cells[col-1].attr.columns, 0);
+		m_screen->cursor.col = col;
+	} else if (m_screen->cursor.col > 0)
 		/* There's room to move left, so do so. */
-                m_screen->cursor.col--;
-	}
+		m_screen->cursor.col--;
 }
 
 /* Cursor left N columns. */