summarylogtreecommitdiffstats
path: root/fullwidth-emoji.patch
blob: a9a1a7aafe533c51179202de937c426af404808a (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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
--- 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. */
diff --git i/src/app.vala w/src/app.vala
index 8104964..cc871d8 100644
--- i/src/app.vala
+++ w/src/app.vala
@@ -214,8 +214,8 @@ class Window : Gtk.ApplicationWindow
   private uint launch_idle_id;
 
   private string[] builtin_dingus = {
-    "(((gopher|news|telnet|nntp|file|http|ftp|https)://)|(www|ftp)[-A-Za-z0-9]*\\.)[-A-Za-z0-9\\.]+(:[0-9]*)?",
-    "(((gopher|news|telnet|nntp|file|http|ftp|https)://)|(www|ftp)[-A-Za-z0-9]*\\.)[-A-Za-z0-9\\.]+(:[0-9]*)?/[-A-Za-z0-9_\\$\\.\\+\\!\\*\\(\\),;:@&=\\?/~\\#\\%]*[^]'\\.}>\\) ,\\\"]"
+    "((((filesystem|gopher|news|telnet|nntp|file|http|ftp|https):)+//)|(www|ftp)[-A-Za-z0-9]*\\.)[-A-Za-z0-9\\.]+(:[0-9]*)?",
+    "((((filesystem|gopher|news|telnet|nntp|file|http|ftp|https):)+//)|(www|ftp)[-A-Za-z0-9]*\\.)[-A-Za-z0-9\\.]+(:[0-9]*)?/[-A-Za-z0-9_\\$\\.\\+\\!\\*\\(\\),;:@&=\\?/~\\#\\%]*[^]'\\.}>\\) ,\\\"]"
   };
 
   private const GLib.ActionEntry[] action_entries = {