Support for dead keys and compose sequences on Unix, by instantiating
[sgt/putty] / terminal.c
index d23cbe9..e30784b 100644 (file)
@@ -1225,6 +1225,7 @@ static void power_on(Terminal *term, int clear)
     term_print_finish(term);
     term->xterm_mouse = 0;
     set_raw_mouse_mode(term->frontend, FALSE);
+    term->bracketed_paste = FALSE;
     {
        int i;
        for (i = 0; i < 256; i++)
@@ -2503,6 +2504,9 @@ static void toggle_mode(Terminal *term, int mode, int query, int state)
                save_cursor(term, state);
            term->disptop = 0;
            break;
+         case 2004:                   /* xterm bracketed paste */
+           term->bracketed_paste = state ? TRUE : FALSE;
+           break;
     } else
        switch (mode) {
          case 4:                      /* IRM: set insert mode */
@@ -5015,11 +5019,13 @@ static void do_paint(Terminal *term, Context ctx, int may_optimise)
 
            break_run = ((tattr ^ attr) & term->attr_mask) != 0;
 
+#ifdef USES_VTLINE_HACK
            /* Special hack for VT100 Linedraw glyphs */
            if ((tchar >= 0x23BA && tchar <= 0x23BD) ||
                 (j > 0 && (newline[j-1].chr >= 0x23BA &&
                            newline[j-1].chr <= 0x23BD)))
                break_run = TRUE;
+#endif
 
            /*
             * Separate out sequences of characters that have the
@@ -5696,7 +5702,12 @@ void term_do_paste(Terminal *term)
         if (term->paste_buffer)
             sfree(term->paste_buffer);
         term->paste_pos = term->paste_hold = term->paste_len = 0;
-        term->paste_buffer = snewn(len, wchar_t);
+        term->paste_buffer = snewn(len + 12, wchar_t);
+
+        if (term->bracketed_paste) {
+            memcpy(term->paste_buffer, L"\033[200~", 6 * sizeof(wchar_t));
+            term->paste_len += 6;
+        }
 
         p = q = data;
         while (p < data + len) {
@@ -5720,6 +5731,12 @@ void term_do_paste(Terminal *term)
             q = p;
         }
 
+        if (term->bracketed_paste) {
+            memcpy(term->paste_buffer + term->paste_len,
+                   L"\033[201~", 6 * sizeof(wchar_t));
+            term->paste_len += 6;
+        }
+
         /* Assume a small paste will be OK in one go. */
         if (term->paste_len < 256) {
             if (term->ldisc)