add keyboard debugging class. refresh on Ctrl-L, reset on 'r'. add more
authorNalin Dahyabhai <nalin@src.gnome.org>
Mon, 25 Nov 2002 20:39:20 +0000 (20:39 +0000)
committerNalin Dahyabhai <nalin@src.gnome.org>
Mon, 25 Nov 2002 20:39:20 +0000 (20:39 +0000)
* src/debug.c, src/debug.h: add keyboard debugging class.
* src/dumpkeys.c: refresh on Ctrl-L, reset on 'r'.
* src/keymap.c, src/keymap.h: add more setting combinations, and a simplistic
check for more complete coverage.
* src/vte.c: add debug messages for keyboard handling.  Improve detection of
invalid coordinates as a signal that no text is selected or hilited.
* termcaps/xterm.baseline: add a baseline copy of xterm from my termcap, so
that I can diff it more easily.
* termcaps/xterm: remove key definitions -- xterm's way more complicated than
the capability strings suggest.

12 files changed:
ChangeLog
configure.in
src/Makefile.am
src/debug.c
src/debug.h
src/dumpkeys.c
src/keymap.c
src/keymap.h
src/vte.c
termcaps/Makefile.am
termcaps/xterm
termcaps/xterm.baseline [new file with mode: 0644]

index da327d9..9bee8f5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2002-11-25  nalin
+       * src/debug.c, src/debug.h: add keyboard debugging class.
+       * src/dumpkeys.c: refresh on Ctrl-L, reset on 'r'.
+       * src/keymap.c, src/keymap.h: add more setting combinations, and a
+       simplistic check for more complete coverage.
+       * src/vte.c: add debug messages for keyboard handling.  Improve
+       detection of invalid coordinates as a signal that no text is selected
+       or hilited.
+       * termcaps/xterm.baseline: add a baseline copy of xterm from my termcap,
+       so that I can diff it more easily.
+       * termcaps/xterm: remove key definitions -- xterm's way more complicated
+       than the capability strings suggest.
+       
 2002-11-22  nalin
        * configure.in: incorporate more correct check for the right version of
        gtk-doc (#99314).
index b206cf0..5bbce95 100644 (file)
@@ -28,12 +28,12 @@ X_LIBS="$X_PRE_LIBS $X_LIBS -lX11 $X_EXTRA_LIBS"
 PKG_CHECK_MODULES(GOBJECT,[glib-2.0 gobject-2.0])
 savelibs="$LIBS"
 LIBS="$X_LIBS $LIBS"
+wantedmodules="glib-2.0 gobject-2.0 gdk-pixbuf-2.0 gtk+-2.0 pangox"
 if pkg-config --exists pangoxft '>=' 1.1.0 ; then
        AC_DEFINE(HAVE_XFT2,1,[Whether we have Xft version 2])
-       PKG_CHECK_MODULES(VTE,[glib-2.0 gobject-2.0 gdk-pixbuf-2.0 gtk+-2.0 pangox fontconfig xft])
-else
-       PKG_CHECK_MODULES(VTE,[glib-2.0 gobject-2.0 gdk-pixbuf-2.0 gtk+-2.0 pangox])
+       wantedmodules="$wantedmodules fontconfig xft"
 fi
+PKG_CHECK_MODULES(VTE,[$wantedmodules])
 LIBS="$savelibs"
 # Check whether the combination of X and GLib/Pango/GTK+ libraries includes
 # Xft somewhere.
index f6976fb..8696fed 100644 (file)
@@ -6,6 +6,7 @@ pkglib_SCRIPTS = decset osc window
 noinst_PROGRAMS = dumpkeys iso2022 pty reaper ring table termcap trie
 EXTRA_DIST = \
        $(pkglib_SCRIPTS) \
+       genkeysyms.py \
        marshal.list \
        unitable.CNS11643 \
        unitable.GB12345 \
@@ -17,6 +18,8 @@ EXTRA_DIST = \
 
 CFLAGS = @CFLAGS@ @VTE_CFLAGS@ @X_CFLAGS@
 
+EXTRA_libvte_la_SOURCES = keysyms.c
+
 libvte_la_SOURCES = \
        buffer.c \
        buffer.h \
index 6c30eda..3d40e0f 100644 (file)
@@ -67,6 +67,9 @@ _vte_debug_parse_string(const char *string)
                        } else
                        if (g_ascii_strcasecmp(flags[i], "CURSOR") == 0) {
                                _vte_debug_flags |= VTE_DEBUG_CURSOR;
+                       } else
+                       if (g_ascii_strcasecmp(flags[i], "KEYBOARD") == 0) {
+                               _vte_debug_flags |= VTE_DEBUG_KEYBOARD;
                        }
                }
                g_strfreev(flags);
index a85f304..033e65b 100644 (file)
@@ -36,7 +36,8 @@ typedef enum {
        VTE_DEBUG_SUBSTITUTION  = 1 << 7,
        VTE_DEBUG_RING          = 1 << 8,
        VTE_DEBUG_PTY           = 1 << 9,
-       VTE_DEBUG_CURSOR        = 1 << 10
+       VTE_DEBUG_CURSOR        = 1 << 10,
+       VTE_DEBUG_KEYBOARD      = 1 << 11
 } VteDebugFlags;
 
 void _vte_debug_parse_string(const char *string);
index edea8e9..e2e5738 100644 (file)
@@ -66,44 +66,46 @@ clear(void)
 static void
 print_help(void)
 {
+       g_print(ESC "[m");
        home();
        g_print(ESC "[K" "A - KEYPAD ");
        if (keypad_mode == application) {
-               g_print("APPLICATION\n");
+               g_print("APPLICATION\r\n");
        } else {
-               g_print("NORMAL\n");
+               g_print("NORMAL\r\n");
        }
        g_print(ESC "[K" "B - CURSOR ");
        if (cursor_mode == application) {
-               g_print("APPLICATION\n");
+               g_print("APPLICATION\r\n");
        } else {
-               g_print("NORMAL\n");
+               g_print("NORMAL\r\n");
        }
        g_print(ESC "[K" "C - SUN    ");
        if (sun_fkeys) {
-               g_print("TRUE\n");
+               g_print("TRUE\r\n");
        } else {
-               g_print("FALSE\n");
+               g_print("FALSE\r\n");
        }
        g_print(ESC "[K" "D - HP     ");
        if (hp_fkeys) {
-               g_print("TRUE\n");
+               g_print("TRUE\r\n");
        } else {
-               g_print("FALSE\n");
+               g_print("FALSE\r\n");
        }
        g_print(ESC "[K" "E - XTERM  ");
        if (xterm_fkeys) {
-               g_print("TRUE\n");
+               g_print("TRUE\r\n");
        } else {
-               g_print("FALSE\n");
+               g_print("FALSE\r\n");
        }
        g_print(ESC "[K" "F - VT220  ");
        if (vt220_fkeys) {
-               g_print("TRUE\n");
+               g_print("TRUE\r\n");
        } else {
-               g_print("FALSE\n");
+               g_print("FALSE\r\n");
        }
-       g_print(ESC "[K" "Q - QUIT\n");
+       g_print(ESC "[K" "R - RESET\r\n");
+       g_print(ESC "[K" "Q - QUIT\r\n");
 }
 
 static void
@@ -115,7 +117,7 @@ reset_scrolling_region(void)
 static void
 set_scrolling_region(void)
 {
-       g_print(ESC "[9;24r");
+       g_print(ESC "[10;24r");
        g_print(ESC "[9;1H");
 }
 
@@ -171,7 +173,7 @@ main(int argc, char **argv)
        }
        original = tcattr;
        signal(SIGINT, sigint_handler);
-       tcattr.c_lflag = tcattr.c_lflag & ~(ICANON | ECHO);
+       cfmakeraw(&tcattr);
        if (tcsetattr(STDIN_FILENO, TCSANOW, &tcattr) != 0) {
                perror("tcsetattr");
                return 1;
@@ -227,10 +229,23 @@ main(int argc, char **argv)
                        vt220_fkeys = !vt220_fkeys;
                        decset(MODE_VT220_FUNCTION_KEYS, vt220_fkeys);
                        break;
+               case 'R':
+               case 'r':
+                       keypad_mode = cursor_mode = normal;
+                       sun_fkeys = hp_fkeys = xterm_fkeys = vt220_fkeys = FALSE;
+                       reset();
+                       break;
                case 'Q':
                case 'q':
                        done = TRUE;
                        break;
+               case 0x0c:
+                       clear();
+                       if (saved) {
+                               restore_cursor();
+                               saved = FALSE;
+                       }
+                       break;
                default:
                        if (saved) {
                                restore_cursor();
@@ -248,6 +263,7 @@ main(int argc, char **argv)
                        case 27:
                                g_print("<ESC> ");
                                break;
+                       case 0:
                        case 1:
                        case 2:
                        case 3:
index 5bf0c0a..a797dcb 100644 (file)
 #ident "$Id$"
 #include "../config.h"
 #include <stdlib.h>
+#include <stdio.h>
 #include <string.h>
 #include <glib.h>
 #include <gdk/gdk.h>
 #include <gdk/gdkkeysyms.h>
 #include "caps.h"
+#include "debug.h"
 #include "keymap.h"
+#include "termcap.h"
+
+#ifdef VTE_DEBUG
+static const char *
+_vte_keysym_name(guint keyval)
+{
+       switch (keyval) {
+#include "keysyms.c"
+               default:
+                       break;
+       }
+       return "(unknown)";
+}
+#endif
 
 enum _vte_cursor_mode {
        cursor_normal = 1 << 0,
@@ -33,8 +49,7 @@ enum _vte_cursor_mode {
 
 enum _vte_keypad_mode {
        keypad_normal = 1 << 0,
-       keypad_app =    1 << 1,
-       keypad_vt220 =  1 << 2,
+       keypad_app =    1 << 1
 };
 
 enum _vte_fkey_mode {
@@ -46,8 +61,13 @@ enum _vte_fkey_mode {
 };
 
 #define cursor_all     (cursor_normal | cursor_app)
-#define keypad_all     (keypad_normal | keypad_app | keypad_vt220)
+#define keypad_all     (keypad_normal | keypad_app)
 #define fkey_all       (fkey_normal | fkey_sun | fkey_hp | fkey_legacy | fkey_vt220)
+#define fkey_notvt220  (fkey_normal | fkey_sun | fkey_hp | fkey_legacy)
+#define fkey_notsun    (fkey_normal | fkey_hp | fkey_legacy | fkey_vt220)
+#define fkey_nothp     (fkey_normal | fkey_sun | fkey_legacy | fkey_vt220)
+#define fkey_notsunvt  (fkey_normal | fkey_hp | fkey_legacy)
+#define fkey_notsunhp  (fkey_normal | fkey_legacy | fkey_vt220)
 
 struct _vte_keymap_entry {
        enum _vte_cursor_mode cursor_mode;
@@ -55,14 +75,14 @@ struct _vte_keymap_entry {
        enum _vte_fkey_mode fkey_mode;
        GdkModifierType mod_mask;
        const char *normal;
-       ssize_t normal_length;
+       gssize normal_length;
        const char *special;
 };
 
 /* Normal keys unaffected by modes. */
 static struct _vte_keymap_entry _vte_keymap_GDK_space[] = {
        /* Control+space = NUL */
-       {cursor_all, keypad_all, fkey_all, GDK_CONTROL_MASK, "\0\0", 1, NULL},
+       {cursor_all, keypad_all, fkey_all, GDK_CONTROL_MASK, "\0", 1, NULL},
        /* Regular space. */
        {cursor_all, keypad_all, fkey_all, 0, " ", 1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
@@ -70,7 +90,9 @@ static struct _vte_keymap_entry _vte_keymap_GDK_space[] = {
 
 static struct _vte_keymap_entry _vte_keymap_GDK_Tab[] = {
        /* Shift+Tab = BackTab */
-       {cursor_all, keypad_all, fkey_all, GDK_SHIFT_MASK, NULL, 1, "kB"},
+       {cursor_all, keypad_all, fkey_all, GDK_SHIFT_MASK, NULL, 0, "kB"},
+       {cursor_all, keypad_all, fkey_all,
+        GDK_SHIFT_MASK, _VTE_CAP_CSI "Z", -1, NULL},
        /* Regular tab. */
        {cursor_all, keypad_all, fkey_all, 0, "\t", 1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
@@ -83,61 +105,99 @@ static struct _vte_keymap_entry _vte_keymap_GDK_Return[] = {
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_Escape[] = {
-       {cursor_all, keypad_all, fkey_all, 0, "\e", 1, NULL},
+       {cursor_all, keypad_all, fkey_all,
+        VTE_META_MASK, _VTE_CAP_ESC _VTE_CAP_ESC, 2, NULL},
+       {cursor_all, keypad_all, fkey_all, 0, _VTE_CAP_ESC, 1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_Insert[] = {
-       {cursor_all, keypad_app, fkey_all, 0, NULL, 0, "kI"},
+       {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "kI"},
+       {cursor_all, keypad_all, fkey_sun,
+        GDK_CONTROL_MASK, _VTE_CAP_CSI "2;5z", -1, NULL},
+       {cursor_all, keypad_all, fkey_notsunhp,
+        GDK_CONTROL_MASK, _VTE_CAP_CSI "2;5~", -1, NULL},
+       {cursor_all, keypad_all, fkey_hp,
+        GDK_CONTROL_MASK, _VTE_CAP_ESC "Q", -1, NULL},
+       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "2z", -1, NULL},
+       {cursor_all, keypad_all, fkey_notsun, 0, _VTE_CAP_CSI "2~", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_ISO_Left_Tab[] = {
-       {cursor_all, keypad_all, fkey_all, 0, NULL, 1, "kB"},
+       {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "kB"},
+       {cursor_all, keypad_all, fkey_all, 0, _VTE_CAP_CSI "Z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_Home[] = {
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "kh"},
+       {cursor_all, keypad_all, fkey_nothp, 0, _VTE_CAP_CSI "1~", -1, NULL},
+       {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "h", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_End[] = {
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "@7"},
+       {cursor_all, keypad_all, fkey_all, 0, _VTE_CAP_CSI "4~", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_Page_Up[] = {
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "kP"},
+       {cursor_all, keypad_all, fkey_notsunhp,
+        GDK_CONTROL_MASK, _VTE_CAP_CSI "5;5~", -1, NULL},
+       {cursor_all, keypad_all, fkey_sun,
+        GDK_CONTROL_MASK, _VTE_CAP_CSI "5;5z", -1, NULL},
+       {cursor_all, keypad_all, fkey_hp,
+        GDK_CONTROL_MASK, _VTE_CAP_ESC "T", -1, NULL},
+       {cursor_all, keypad_all, fkey_notsun, 0, _VTE_CAP_CSI "5~", -1, NULL},
+       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "5z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_Page_Down[] = {
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "kN"},
+       {cursor_all, keypad_all, fkey_notsunhp,
+        GDK_CONTROL_MASK, _VTE_CAP_CSI "6;5~", -1, NULL},
+       {cursor_all, keypad_all, fkey_sun,
+        GDK_CONTROL_MASK, _VTE_CAP_CSI "6;5z", -1, NULL},
+       {cursor_all, keypad_all, fkey_hp,
+        GDK_CONTROL_MASK, _VTE_CAP_ESC "S", -1, NULL},
+       {cursor_all, keypad_all, fkey_notsun, 0, _VTE_CAP_CSI "6~", -1, NULL},
+       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "6z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 /* Keys affected by the cursor key mode. */
 static struct _vte_keymap_entry _vte_keymap_GDK_Up[] = {
        {cursor_normal, keypad_all, fkey_all, 0, NULL, 0, "ku"},
+       {cursor_normal, keypad_all, fkey_nothp, 0, _VTE_CAP_CSI "A", -1, NULL},
+       {cursor_normal, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "A", -1, NULL},
        {cursor_app, keypad_all, fkey_all, 0, _VTE_CAP_SS3 "A", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_Down[] = {
        {cursor_normal, keypad_all, fkey_all, 0, NULL, 0, "kd"},
+       {cursor_normal, keypad_all, fkey_nothp, 0, _VTE_CAP_CSI "B", -1, NULL},
+       {cursor_normal, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "B", -1, NULL},
        {cursor_app, keypad_all, fkey_all, 0, _VTE_CAP_SS3 "B", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_Right[] = {
        {cursor_normal, keypad_all, fkey_all, 0, NULL, 0, "kr"},
+       {cursor_normal, keypad_all, fkey_nothp, 0, _VTE_CAP_CSI "C", -1, NULL},
+       {cursor_normal, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "C", -1, NULL},
        {cursor_app, keypad_all, fkey_all, 0, _VTE_CAP_SS3 "C", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_Left[] = {
        {cursor_normal, keypad_all, fkey_all, 0, NULL, 0, "kl"},
+       {cursor_normal, keypad_all, fkey_nothp, 0, _VTE_CAP_CSI "D", -1, NULL},
+       {cursor_normal, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "D", -1, NULL},
        {cursor_app, keypad_all, fkey_all, 0, _VTE_CAP_SS3 "D", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
@@ -146,21 +206,18 @@ static struct _vte_keymap_entry _vte_keymap_GDK_Left[] = {
 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Space[] = {
        {cursor_all, keypad_normal, fkey_all, 0, " ", 1, NULL},
        {cursor_all, keypad_app, fkey_all, 0, _VTE_CAP_SS3 " ", -1, NULL},
-       {cursor_all, keypad_vt220, fkey_all, 0, _VTE_CAP_SS3 " ", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Tab[] = {
        {cursor_all, keypad_normal, fkey_all, 0, "\t", 1, NULL},
        {cursor_all, keypad_app, fkey_all, 0, _VTE_CAP_SS3 "I", -1, NULL},
-       {cursor_all, keypad_vt220, fkey_all, 0, _VTE_CAP_SS3 "I", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Enter[] = {
        {cursor_all, keypad_normal, fkey_all, 0, NULL, 0, "@8"},
        {cursor_all, keypad_app, fkey_all, 0, _VTE_CAP_SS3 "M", -1, NULL},
-       {cursor_all, keypad_vt220, fkey_all, 0, _VTE_CAP_SS3 "M", -1, NULL},
        {cursor_all, keypad_all, fkey_all, GDK_CONTROL_MASK, "\n", 1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, "\r", 1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
@@ -168,21 +225,25 @@ static struct _vte_keymap_entry _vte_keymap_GDK_KP_Enter[] = {
 
 static struct _vte_keymap_entry _vte_keymap_GDK_KP_F1[] = {
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "k1"},
+       {cursor_all, keypad_all, fkey_all, 0, _VTE_CAP_SS3 "P", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_KP_F2[] = {
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "k2"},
+       {cursor_all, keypad_all, fkey_all, 0, _VTE_CAP_SS3 "Q", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_KP_F3[] = {
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "k3"},
+       {cursor_all, keypad_all, fkey_all, 0, _VTE_CAP_SS3 "R", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_KP_F4[] = {
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "k4"},
+       {cursor_all, keypad_all, fkey_all, 0, _VTE_CAP_SS3 "S", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
@@ -193,8 +254,10 @@ static struct _vte_keymap_entry _vte_keymap_GDK_KP_Multiply[] = {
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Add[] = {
-       {cursor_all, keypad_normal, fkey_all, 0, "+", 1, NULL},
-       {cursor_all, keypad_app, fkey_all, 0, _VTE_CAP_SS3 "k", -1, NULL},
+       {cursor_all, keypad_normal, fkey_notvt220, 0, "+", 1, NULL},
+       {cursor_all, keypad_normal, fkey_vt220, 0, ",", 1, NULL},
+       {cursor_all, keypad_app, fkey_notvt220, 0, _VTE_CAP_SS3 "k", -1, NULL},
+       {cursor_all, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "l", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
@@ -211,8 +274,9 @@ static struct _vte_keymap_entry _vte_keymap_GDK_KP_Subtract[] = {
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Decimal_Delete[] = {
-       {cursor_all, keypad_normal, fkey_all, 0, ".", 1, NULL},
-       {cursor_all, keypad_app, fkey_all, 0, _VTE_CAP_SS3 "3~", -1, NULL},
+       {cursor_all, keypad_normal, fkey_normal, 0, ".", 1, NULL},
+       {cursor_all, keypad_app, fkey_notsun, 0, _VTE_CAP_SS3 "3~", -1, NULL},
+       {cursor_all, keypad_app, fkey_sun, 0, _VTE_CAP_SS3 "3~", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
@@ -279,214 +343,322 @@ static struct _vte_keymap_entry _vte_keymap_GDK_KP_9[] = {
  * capability associated with the key, then we send that, unless we're in
  * application mode. */
 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Insert[] = {
-       {cursor_all, keypad_app, fkey_all, 0, _VTE_CAP_CSI "2~", -1, NULL},
-       {cursor_all, keypad_vt220, fkey_all, 0, _VTE_CAP_SS3 "p", -1, NULL},
+       {cursor_all, keypad_normal, fkey_notsunvt,
+        0, _VTE_CAP_CSI "2~", -1, NULL},
+       {cursor_all, keypad_normal, fkey_sun, 0, _VTE_CAP_CSI "2z", -1, NULL},
+       {cursor_all, keypad_normal, fkey_vt220, 0, "0", 1, NULL},
+       {cursor_all, keypad_app, fkey_notvt220, 0, _VTE_CAP_CSI "2~", -1, NULL},
+       {cursor_all, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "p", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_KP_End[] = {
        {cursor_all, keypad_normal, fkey_all, 0, NULL, 0, "K4"},
-       {cursor_all, keypad_app, fkey_all, 0, _VTE_CAP_CSI "4~", -1, NULL},
-       {cursor_all, keypad_vt220, fkey_all, 0, _VTE_CAP_SS3 "q", -1, NULL},
+       {cursor_all, keypad_normal, fkey_notvt220,
+        0, _VTE_CAP_CSI "4~", -1, NULL},
+       {cursor_all, keypad_normal, fkey_vt220, 0, "1", 1, NULL},
+       {cursor_all, keypad_app, fkey_notvt220, 0, _VTE_CAP_CSI "4~", -1, NULL},
+       {cursor_all, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "q", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Down[] = {
        {cursor_all, keypad_normal, fkey_all, 0, NULL, 0, "kd"},
-       {cursor_all, keypad_app, fkey_all, 0, _VTE_CAP_CSI "B", -1, NULL},
-       {cursor_all, keypad_vt220, fkey_all, 0, _VTE_CAP_SS3 "r", -1, NULL},
+       {cursor_all, keypad_normal, fkey_notvt220,
+        0, _VTE_CAP_CSI "B", -1, NULL},
+       {cursor_all, keypad_normal, fkey_vt220, 0, "2", 1, NULL},
+       {cursor_all, keypad_app, fkey_notvt220, 0, _VTE_CAP_CSI "B", -1, NULL},
+       {cursor_all, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "r", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Page_Down[] = {
        {cursor_all, keypad_normal, fkey_all, 0, NULL, 0, "K5"},
-       {cursor_all, keypad_app, fkey_all, 0, _VTE_CAP_CSI "5~", -1, NULL},
-       {cursor_all, keypad_vt220, fkey_all, 0, _VTE_CAP_SS3 "s", -1, NULL},
+       {cursor_all, keypad_normal, fkey_notsunvt,
+        0, _VTE_CAP_CSI "6~", -1, NULL},
+       {cursor_all, keypad_normal, fkey_sun, 0, _VTE_CAP_CSI "6z", -1, NULL},
+       {cursor_all, keypad_normal, fkey_vt220, 0, "3", 1, NULL},
+       {cursor_all, keypad_app, fkey_notvt220, 0, _VTE_CAP_CSI "5~", -1, NULL},
+       {cursor_all, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "s", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Left[] = {
        {cursor_all, keypad_normal, fkey_all, 0, NULL, 0, "kl"},
-       {cursor_all, keypad_app, fkey_all, 0, _VTE_CAP_CSI "D", -1, NULL},
-       {cursor_all, keypad_vt220, fkey_all, 0, _VTE_CAP_SS3 "t", -1, NULL},
+       {cursor_all, keypad_normal, fkey_notvt220,
+        0, _VTE_CAP_CSI "D", -1, NULL},
+       {cursor_all, keypad_normal, fkey_vt220, 0, "4", 1, NULL},
+       {cursor_all, keypad_app, fkey_notvt220, 0, _VTE_CAP_CSI "D", -1, NULL},
+       {cursor_all, keypad_app, fkey_vt220, 0, _VTE_CAP_CSI "D", -1, NULL},
+       {cursor_all, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "t", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Begin[] = {
        {cursor_all, keypad_normal, fkey_all, 0, NULL, 0, "K2"},
-       {cursor_all, keypad_app, fkey_all, 0, _VTE_CAP_CSI "E", -1, NULL},
-       {cursor_all, keypad_vt220, fkey_all, 0, _VTE_CAP_SS3 "u", -1, NULL},
+       {cursor_all, keypad_normal, fkey_notvt220,
+        0, _VTE_CAP_CSI "E", -1, NULL},
+       {cursor_all, keypad_normal, fkey_vt220, 0, "5", 1, NULL},
+       {cursor_all, keypad_app, fkey_notvt220, 0, _VTE_CAP_CSI "E", -1, NULL},
+       {cursor_all, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "u", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Right[] = {
        {cursor_all, keypad_normal, fkey_all, 0, NULL, 0, "kr"},
-       {cursor_all, keypad_app, fkey_all, 0, _VTE_CAP_CSI "C", -1, NULL},
-       {cursor_all, keypad_vt220, fkey_all, 0, _VTE_CAP_SS3 "v", -1, NULL},
+       {cursor_all, keypad_normal, fkey_notvt220,
+        0, _VTE_CAP_CSI "C", -1, NULL},
+       {cursor_all, keypad_normal, fkey_vt220, 0, "6", 1, NULL},
+       {cursor_all, keypad_app, fkey_notvt220, 0, _VTE_CAP_CSI "C", -1, NULL},
+       {cursor_all, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "v", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Home[] = {
        {cursor_all, keypad_normal, fkey_all, 0, NULL, 0, "K1"},
-       {cursor_all, keypad_app, fkey_all, 0, _VTE_CAP_CSI "1~", -1, NULL},
-       {cursor_all, keypad_vt220, fkey_all, 0, _VTE_CAP_SS3 "w", -1, NULL},
+       {cursor_all, keypad_normal, fkey_notvt220,
+        0, _VTE_CAP_CSI "1~", -1, NULL},
+       {cursor_all, keypad_normal, fkey_vt220, 0, "7", 1, NULL},
+       {cursor_all, keypad_app, fkey_notvt220, 0, _VTE_CAP_CSI "1~", -1, NULL},
+       {cursor_all, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "w", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Up[] = {
        {cursor_all, keypad_normal, fkey_all, 0, NULL, 0, "ku"},
-       {cursor_all, keypad_app, fkey_all, 0, _VTE_CAP_CSI "A", -1, NULL},
-       {cursor_all, keypad_vt220, fkey_all, 0, _VTE_CAP_SS3 "x", -1, NULL},
+       {cursor_all, keypad_normal, fkey_notvt220,
+        0, _VTE_CAP_CSI "A", -1, NULL},
+       {cursor_all, keypad_normal, fkey_vt220, 0, "8", 1, NULL},
+       {cursor_all, keypad_app, fkey_notvt220, 0, _VTE_CAP_CSI "A", -1, NULL},
+       {cursor_all, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "x", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Page_Up[] = {
        {cursor_all, keypad_normal, fkey_all, 0, NULL, 0, "K3"},
-       {cursor_all, keypad_app, fkey_all, 0, _VTE_CAP_CSI "5~", -1, NULL},
-       {cursor_all, keypad_vt220, fkey_all, 0, _VTE_CAP_SS3 "y", -1, NULL},
+       {cursor_all, keypad_normal, fkey_notvt220,
+        0, _VTE_CAP_CSI "5~", -1, NULL},
+       {cursor_all, keypad_normal, fkey_vt220, 0, "9", 1, NULL},
+       {cursor_all, keypad_app, fkey_notvt220, 0, _VTE_CAP_CSI "5~", -1, NULL},
+       {cursor_all, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "y", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 
 /* Keys affected by the function key mode. */
 static struct _vte_keymap_entry _vte_keymap_GDK_F1[] = {
+       {cursor_all, keypad_all, fkey_notvt220, 0, NULL, 0, "k1"},
+       {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "F3"},
+       {cursor_all, keypad_all, fkey_vt220, 0, NULL, 0, "k1"},
+       {cursor_all, keypad_all, fkey_normal, 0, _VTE_CAP_SS3 "P", -1, NULL},
        {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "224z", -1, NULL},
        {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "p", -1, NULL},
        {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "11~", -1, NULL},
-       {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "F3"},
-       {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "k1"},
+       {cursor_all, keypad_all, fkey_vt220,
+        GDK_CONTROL_MASK, _VTE_CAP_CSI "23~", -1, NULL},
+       {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_SS3 "P", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F2[] = {
+       {cursor_all, keypad_all, fkey_notvt220, 0, NULL, 0, "k2"},
+       {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "F4"},
+       {cursor_all, keypad_all, fkey_vt220, 0, NULL, 0, "k2"},
+       {cursor_all, keypad_all, fkey_normal, 0, _VTE_CAP_SS3 "Q", -1, NULL},
        {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "225z", -1, NULL},
        {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "q", -1, NULL},
        {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "12~", -1, NULL},
-       {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "F4"},
-       {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "k2"},
+       {cursor_all, keypad_all, fkey_vt220,
+        GDK_CONTROL_MASK, _VTE_CAP_CSI "24~", -1, NULL},
+       {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_SS3 "Q", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F3[] = {
+       {cursor_all, keypad_all, fkey_notvt220, 0, NULL, 0, "k3"},
+       {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "F5"},
+       {cursor_all, keypad_all, fkey_vt220, 0, NULL, 0, "k3"},
+       {cursor_all, keypad_all, fkey_normal, 0, _VTE_CAP_SS3 "R", -1, NULL},
        {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "226z", -1, NULL},
        {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "r", -1, NULL},
        {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "13~", -1, NULL},
-       {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "F5"},
-       {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "k3"},
+       {cursor_all, keypad_all, fkey_vt220,
+        GDK_CONTROL_MASK, _VTE_CAP_CSI "25~", -1, NULL},
+       {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_SS3 "R", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F4[] = {
+       {cursor_all, keypad_all, fkey_notvt220, 0, NULL, 0, "k4"},
+       {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "F6"},
+       {cursor_all, keypad_all, fkey_vt220, 0, NULL, 0, "k4"},
+       {cursor_all, keypad_all, fkey_normal, 0, _VTE_CAP_SS3 "S", -1, NULL},
        {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "227z", -1, NULL},
        {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "s", -1, NULL},
        {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "14~", -1, NULL},
-       {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "F6"},
-       {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "k4"},
+       {cursor_all, keypad_all, fkey_vt220,
+        GDK_CONTROL_MASK, _VTE_CAP_CSI "26~", -1, NULL},
+       {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_SS3 "S", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F5[] = {
+       {cursor_all, keypad_all, fkey_notvt220, 0, NULL, 0, "k5"},
+       {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "F7"},
+       {cursor_all, keypad_all, fkey_vt220, 0, NULL, 0, "k5"},
+       {cursor_all, keypad_all, fkey_normal, 0, _VTE_CAP_CSI "15~", -1, NULL},
        {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "228z", -1, NULL},
        {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "t", -1, NULL},
-       {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "F7"},
-       {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "k5"},
+       {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "15~", -1, NULL},
+       {cursor_all, keypad_all, fkey_vt220,
+        GDK_CONTROL_MASK, _VTE_CAP_CSI "28~", -1, NULL},
+       {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_CSI "15~", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F6[] = {
+       {cursor_all, keypad_all, fkey_notvt220, 0, NULL, 0, "k6"},
+       {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "F8"},
+       {cursor_all, keypad_all, fkey_vt220, 0, NULL, 0, "k6"},
+       {cursor_all, keypad_all, fkey_normal, 0, _VTE_CAP_CSI "17~", -1, NULL},
        {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "229z", -1, NULL},
        {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "u", -1, NULL},
-       {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "F8"},
-       {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "k6"},
+       {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "17~", -1, NULL},
+       {cursor_all, keypad_all, fkey_vt220,
+        GDK_CONTROL_MASK, _VTE_CAP_CSI "29~", -1, NULL},
+       {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_CSI "17~", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F7[] = {
+       {cursor_all, keypad_all, fkey_notvt220, 0, NULL, 0, "k7"},
+       {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "F9"},
+       {cursor_all, keypad_all, fkey_vt220, 0, NULL, 0, "k7"},
+       {cursor_all, keypad_all, fkey_normal, 0, _VTE_CAP_CSI "18~", -1, NULL},
        {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "230z", -1, NULL},
        {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "v", -1, NULL},
-       {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "F9"},
-       {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "k7"},
+       {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "18~", -1, NULL},
+       {cursor_all, keypad_all, fkey_vt220,
+        GDK_CONTROL_MASK, _VTE_CAP_CSI "31~", -1, NULL},
+       {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_CSI "18~", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F8[] = {
+       {cursor_all, keypad_all, fkey_notvt220, 0, NULL, 0, "k8"},
+       {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "FA"},
+       {cursor_all, keypad_all, fkey_vt220, 0, NULL, 0, "k8"},
+       {cursor_all, keypad_all, fkey_normal, 0, _VTE_CAP_CSI "19~", -1, NULL},
        {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "231z", -1, NULL},
        {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "w", -1, NULL},
-       {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "FA"},
-       {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "k8"},
+       {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "19~", -1, NULL},
+       {cursor_all, keypad_all, fkey_vt220,
+        GDK_CONTROL_MASK, _VTE_CAP_CSI "32~", -1, NULL},
+       {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_CSI "19~", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F9[] = {
-       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "232z", -1, NULL},
+       {cursor_all, keypad_all, fkey_notvt220, 0, NULL, 0, "k9"},
        {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "FB"},
-       {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "k9"},
+       {cursor_all, keypad_all, fkey_vt220, 0, NULL, 0, "k9"},
+       {cursor_all, keypad_all, fkey_normal, 0, _VTE_CAP_CSI "20~", -1, NULL},
+       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "232z", -1, NULL},
+       {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_CSI "20~", -1, NULL},
+       {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "20~", -1, NULL},
+       {cursor_all, keypad_all, fkey_vt220,
+        GDK_CONTROL_MASK, _VTE_CAP_CSI "33~", -1, NULL},
+       {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_CSI "20~", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F10[] = {
-       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "233z", -1, NULL},
+       {cursor_all, keypad_all, fkey_notvt220, 0, NULL, 0, "k;"},
        {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "FC"},
-       {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "k;"},
+       {cursor_all, keypad_all, fkey_vt220, 0, NULL, 0, "k;"},
+       {cursor_all, keypad_all, fkey_normal, 0, _VTE_CAP_CSI "21~", -1, NULL},
+       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "233z", -1, NULL},
+       {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_CSI "21~", -1, NULL},
+       {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "21~", -1, NULL},
+       {cursor_all, keypad_all, fkey_vt220,
+        GDK_CONTROL_MASK, _VTE_CAP_CSI "34~", -1, NULL},
+       {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_CSI "21~", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F11[] = {
-       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "192z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "F1"},
+       {cursor_all, keypad_all, fkey_normal, 0, _VTE_CAP_CSI "23~", -1, NULL},
+       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "192z", -1, NULL},
+       {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_CSI "23~", -1, NULL},
+       {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "23~", -1, NULL},
+       {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_CSI "23~", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F12[] = {
-       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "193z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "F2"},
+       {cursor_all, keypad_all, fkey_normal, 0, _VTE_CAP_CSI "24~", -1, NULL},
+       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "193z", -1, NULL},
+       {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_CSI "24~", -1, NULL},
+       {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "24~", -1, NULL},
+       {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_CSI "24~", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F13[] = {
-       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "194z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "F3"},
+       {cursor_all, keypad_all, fkey_notsun, 0, _VTE_CAP_CSI "25~", -1, NULL},
+       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "194z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F14[] = {
-       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "195z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "F4"},
+       {cursor_all, keypad_all, fkey_notsun, 0, _VTE_CAP_CSI "26~", -1, NULL},
+       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "195z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F15[] = {
-       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "196z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "F5"},
+       {cursor_all, keypad_all, fkey_notsun, 0, _VTE_CAP_CSI "28~", -1, NULL},
+       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "196z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F16[] = {
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "F6"},
+       {cursor_all, keypad_all, fkey_notsun, 0, _VTE_CAP_CSI "29~", -1, NULL},
+       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "197z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F17[] = {
-       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "198z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "F7"},
+       {cursor_all, keypad_all, fkey_notsun, 0, _VTE_CAP_CSI "31~", -1, NULL},
+       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "198z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F18[] = {
-       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "199z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "F8"},
+       {cursor_all, keypad_all, fkey_notsun, 0, _VTE_CAP_CSI "32~", -1, NULL},
+       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "199z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F19[] = {
-       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "200z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "F9"},
+       {cursor_all, keypad_all, fkey_notsun, 0, _VTE_CAP_CSI "33~", -1, NULL},
+       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "200z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F20[] = {
-       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "201z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "FA"},
+       {cursor_all, keypad_all, fkey_notsun, 0, _VTE_CAP_CSI "34~", -1, NULL},
+       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "201z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
@@ -541,31 +713,26 @@ static struct _vte_keymap_entry _vte_keymap_GDK_F30[] = {
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F31[] = {
-       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "208z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "FL"},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F32[] = {
-       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "209z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "FM"},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F33[] = {
-       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "210z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "FN"},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F34[] = {
-       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "211z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "FO"},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
 
 static struct _vte_keymap_entry _vte_keymap_GDK_F35[] = {
-       {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "212z", -1, NULL},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "FP"},
        {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
 };
@@ -674,6 +841,8 @@ _vte_keymap_map(guint keyval,
                gboolean vt220_mode,
                gboolean app_cursor_keys,
                gboolean app_keypad_keys,
+               struct _vte_termcap *termcap,
+               const char *terminal,
                char **normal,
                size_t *normal_length,
                const char **special)
@@ -684,11 +853,61 @@ _vte_keymap_map(guint keyval,
        enum _vte_cursor_mode cursor_mode;
        enum _vte_keypad_mode keypad_mode;
        enum _vte_fkey_mode fkey_mode;
+       char *cap;
 
        g_return_if_fail(normal != NULL);
        g_return_if_fail(normal_length != NULL);
        g_return_if_fail(special != NULL);
 
+#ifdef VTE_DEBUG
+       if (_vte_debug_on(VTE_DEBUG_KEYBOARD)) {
+               fprintf(stderr, "Mapping ");
+               if (modifiers & GDK_CONTROL_MASK) {
+                       fprintf(stderr, "Control+");
+               }
+               if (modifiers & VTE_META_MASK) {
+                       fprintf(stderr, "Meta+");
+               }
+               if (modifiers & GDK_SHIFT_MASK) {
+                       fprintf(stderr, "Shift+");
+               }
+               fprintf(stderr, "%s" , _vte_keysym_name(keyval));
+               if (sun_mode || hp_mode || legacy_mode || vt220_mode) {
+                       i = 0;
+                       fprintf(stderr, "(");
+                       if (sun_mode) {
+                               if (i > 0) {
+                                       fprintf(stderr, ",");
+                               }
+                               i++;
+                               fprintf(stderr, "Sun");
+                       }
+                       if (hp_mode) {
+                               if (i > 0) {
+                                       fprintf(stderr, ",");
+                               }
+                               i++;
+                               fprintf(stderr, "HP");
+                       }
+                       if (legacy_mode) {
+                               if (i > 0) {
+                                       fprintf(stderr, ",");
+                               }
+                               i++;
+                               fprintf(stderr, "Legacy");
+                       }
+                       if (vt220_mode) {
+                               if (i > 0) {
+                                       fprintf(stderr, ",");
+                               }
+                               i++;
+                               fprintf(stderr, "VT220");
+                       }
+                       fprintf(stderr, ")");
+               }
+       }
+#endif
+
        /* Start from scratch. */
        *normal = NULL;
        *special = NULL;
@@ -700,12 +919,30 @@ _vte_keymap_map(guint keyval,
        for (i = 0; i < G_N_ELEMENTS(_vte_keymap); i++) {
 #ifdef VTE_DEBUG
                int j;
+               GdkModifierType mods;
+               /* Check for NULL strings with non-zero length, and
+                * vice-versa. */
                entries = _vte_keymap[i].entries;
                for (j = 0; entries[j].normal || entries[j].special; j++) {
                        if (entries[j].normal != NULL) {
                                g_assert(entries[j].normal_length != 0);
+                               g_assert(entries[j].special == NULL);
+                       } else {
+                               g_assert(entries[j].normal_length == 0);
+                               g_assert(entries[j].special != NULL);
+                       }
+               }
+               /* Check for coverage. This check is not exhaustive. */
+               fkey_mode = 0;
+               mods = GDK_SHIFT_MASK | GDK_CONTROL_MASK | VTE_META_MASK;
+               for (j = 0; entries[j].normal || entries[j].special; j++) {
+                       if (entries[j].fkey_mode != fkey_all) {
+                               fkey_mode |= entries[j].fkey_mode;
                        }
+                       mods &= entries[j].mod_mask;
                }
+               g_assert((fkey_mode == 0) || (fkey_mode == fkey_all));
+               g_assert(mods == 0);
                entries = NULL;
 #endif
                if (_vte_keymap[i].keyval == GDK_F1) {
@@ -719,6 +956,11 @@ _vte_keymap_map(guint keyval,
                }
        }
        if (entries == NULL) {
+#ifdef VTE_DEBUG
+               if (_vte_debug_on(VTE_DEBUG_KEYBOARD)) {
+                       fprintf(stderr, " (ignoring, no map for key).\n");
+               }
+#endif
                return;
        }
 
@@ -728,9 +970,7 @@ _vte_keymap_map(guint keyval,
        } else {
                cursor_mode = app_cursor_keys ? cursor_app : cursor_normal;
        }
-       keypad_mode = app_keypad_keys ?
-                     (vt220_mode ?  keypad_vt220 : keypad_app) :
-                     keypad_normal;
+       keypad_mode = app_keypad_keys ? keypad_app : keypad_normal;
        if (sun_mode) {
                fkey_mode = fkey_sun;
        } else
@@ -762,14 +1002,59 @@ _vte_keymap_map(guint keyval,
                                *normal_length = strlen(entries[i].normal);
                                *normal = g_strdup(entries[i].normal);
                        }
+#ifdef VTE_DEBUG
+                       if (_vte_debug_on(VTE_DEBUG_KEYBOARD)) {
+                               int j;
+                               fprintf(stderr, " to '");
+                               for (j = 0; j < *normal_length; j++) {
+                                       if (((*normal)[j] < 32) ||
+                                           ((*normal)[j] >= 127)) {
+                                               fprintf(stderr, "<0x%02x>",
+                                                       (*normal)[j]);
+                                       } else {
+                                               fprintf(stderr, "%c",
+                                                       (*normal)[j]);
+                                       }
+                               }
+                               fprintf(stderr, "'.\n");
+                       }
+#endif
                        return;
                }
                if (entries[i].special) {
-                       /* Return the original special string. */
-                       *special = entries[i].special;
-                       return;
+                       cap = _vte_termcap_find_string(termcap, terminal,
+                                                      entries[i].special);
+                       if (cap != NULL) {
+                               *special = NULL;
+                               if (strlen(cap) > 0) {
+                                       /* Save the special string. */
+                                       *special = entries[i].special;
+#ifdef VTE_DEBUG
+                                       if (_vte_debug_on(VTE_DEBUG_KEYBOARD)) {
+                                               fprintf(stderr, " to \"%s\"",
+                                                       *special);
+                                       }
+#endif
+                               }
+                               g_free(cap);
+                               if (*special != NULL) {
+                                       /* Return the special string. */
+#ifdef VTE_DEBUG
+                                       if (_vte_debug_on(VTE_DEBUG_KEYBOARD)) {
+                                               fprintf(stderr,
+                                                       ", returning.\n");
+                                       }
+#endif
+                                       return;
+                               }
+                       }
                }
        }
+#ifdef VTE_DEBUG
+       if (_vte_debug_on(VTE_DEBUG_KEYBOARD)) {
+               fprintf(stderr, " (ignoring, no match for modifier state).\n");
+       }
+#endif
 }
 
 gboolean
@@ -866,14 +1151,14 @@ _vte_keymap_key_is_fkey(guint keyval)
 }
 
 void
-_vte_keymap_key_add_modifiers(guint keyval,
-                             GdkModifierType modifiers,
-                             gboolean sun_mode,
-                             gboolean hp_mode,
-                             gboolean legacy_mode,
-                             gboolean vt220_mode,
-                             char **normal,
-                             gssize *normal_length)
+_vte_keymap_key_add_fkey_modifiers(guint keyval,
+                                  GdkModifierType modifiers,
+                                  gboolean sun_mode,
+                                  gboolean hp_mode,
+                                  gboolean legacy_mode,
+                                  gboolean vt220_mode,
+                                  char **normal,
+                                  gssize *normal_length)
 {
        int modifier, offset;
        char *nnormal;
index 368e520..8ed11a5 100644 (file)
@@ -25,6 +25,7 @@
 
 #include <glib.h>
 #include <gdk/gdk.h>
+#include "termcap.h"
 
 #define VTE_NUMLOCK_MASK               GDK_MOD2_MASK
 #define VTE_META_MASK                  GDK_MOD1_MASK
@@ -41,6 +42,8 @@ void _vte_keymap_map(guint keyval,
                     gboolean vt220_mode,
                     gboolean app_cursor_keys,
                     gboolean app_keypad_keys,
+                    struct _vte_termcap *termcap,
+                    const char *term,
                     char **normal,
                     size_t *normal_length,
                     const char **special);
@@ -49,14 +52,14 @@ void _vte_keymap_map(guint keyval,
 gboolean _vte_keymap_key_is_modifier(guint keyval);
 
 /* Add modifiers to the sequence if they're needed. */
-void _vte_keymap_key_add_modifiers(guint keyval,
-                                  GdkModifierType modifiers,
-                                  gboolean sun_mode,
-                                  gboolean hp_mode,
-                                  gboolean legacy_mode,
-                                  gboolean vt220_mode,
-                                  char **normal,
-                                  gssize *normal_length);
+void _vte_keymap_key_add_fkey_modifiers(guint keyval,
+                                       GdkModifierType modifiers,
+                                       gboolean sun_mode,
+                                       gboolean hp_mode,
+                                       gboolean legacy_mode,
+                                       gboolean vt220_mode,
+                                       char **normal,
+                                       gssize *normal_length);
 
 G_END_DECLS
 
index 9f74939..7fcd537 100644 (file)
--- a/src/vte.c
+++ b/src/vte.c
@@ -98,7 +98,7 @@ typedef gunichar wint_t;
 #define VTE_DEFAULT_EMULATION          "xterm"
 #define VTE_DEFAULT_CURSOR             GDK_XTERM
 #define VTE_MOUSING_CURSOR             GDK_LEFT_PTR
-#define VTE_XFT_HARD_LIMIT             88
+#define VTE_DRAW_MAX_LENGTH            88
 #define VTE_TAB_MAX                    999
 #define VTE_X_FIXED                    "-*-fixed-medium-r-normal-*-20-*"
 #define VTE_REPRESENTATIVE_CHARACTERS  "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
@@ -347,6 +347,11 @@ struct _VteTerminalPrivate {
                gboolean ftcolor_allocated;
 #endif
        } palette[VTE_DIM_FG + 1];
+       XwcTextItem xlib_textitem[VTE_DRAW_MAX_LENGTH];
+       wchar_t xlib_wcitem[VTE_DRAW_MAX_LENGTH];
+#ifdef HAVE_XFT
+       XftCharSpec xft_textitem[VTE_DRAW_MAX_LENGTH];
+#endif
 
        /* Mouse cursors. */
        GdkCursor *mouse_default_cursor,
@@ -4304,6 +4309,46 @@ vte_sequence_handler_decset_internal(VteTerminal *terminal,
                /* Make the pointer visible. */
                vte_terminal_set_pointer_visible(terminal, TRUE);
                break;
+       case 1051:
+               /* Sun mode? Make it mutually-exclusive. */
+               if (set) {
+#ifdef VTE_DEBUG
+                       if (_vte_debug_on(VTE_DEBUG_KEYBOARD)) {
+                               fprintf(stderr, "Entering Sun fkey mode.\n");
+                       }
+#endif
+               }
+               break;
+       case 1052:
+               /* HP mode? Make it mutually-exclusive. */
+               if (set) {
+#ifdef VTE_DEBUG
+                       if (_vte_debug_on(VTE_DEBUG_KEYBOARD)) {
+                               fprintf(stderr, "Entering HP fkey mode.\n");
+                       }
+#endif
+               }
+               break;
+       case 1060:
+               /* Legacy mode? Make it mutually-exclusive. */
+               if (set) {
+#ifdef VTE_DEBUG
+                       if (_vte_debug_on(VTE_DEBUG_KEYBOARD)) {
+                               fprintf(stderr, "Entering Legacy fkey mode.\n");
+                       }
+#endif
+               }
+               break;
+       case 1061:
+               /* VT220 mode? Make it mutually-exclusive. */
+               if (set) {
+#ifdef VTE_DEBUG
+                       if (_vte_debug_on(VTE_DEBUG_KEYBOARD)) {
+                               fprintf(stderr, "Entering VT220 fkey mode.\n");
+                       }
+#endif
+               }
+               break;
        default:
                break;
        }
@@ -7205,7 +7250,8 @@ vte_terminal_key_press(GtkWidget *widget, GdkEventKey *event)
        struct termios tio;
        struct timeval tv;
        struct timezone tz;
-       gboolean scrolled = FALSE, steal = FALSE, modifier = FALSE, handled;
+       gboolean scrolled = FALSE, steal = FALSE, modifier = FALSE, handled,
+                suppress_meta_esc = FALSE;
        VteKeymode keypad_mode = VTE_KEYMODE_NORMAL,
                   cursor_mode = VTE_KEYMODE_NORMAL;
        guint keyval = 0;
@@ -7298,7 +7344,7 @@ vte_terminal_key_press(GtkWidget *widget, GdkEventKey *event)
        }
 
        /* Now figure out what to send to the child. */
-       if (event->type == GDK_KEY_PRESS) {
+       if ((event->type == GDK_KEY_PRESS) && !modifier) {
                handled = FALSE;
                /* Map the key to a sequence name if we can. */
                switch (keyval) {
@@ -7329,6 +7375,7 @@ vte_terminal_key_press(GtkWidget *widget, GdkEventKey *event)
                                break;
                        }
                        handled = TRUE;
+                       suppress_meta_esc = TRUE;
                        break;
                case GDK_KP_Delete:
                case GDK_Delete:
@@ -7348,16 +7395,16 @@ vte_terminal_key_press(GtkWidget *widget, GdkEventKey *event)
                                break;
                        }
                        handled = TRUE;
+                       suppress_meta_esc = TRUE;
                        break;
                case GDK_KP_Insert:
                case GDK_Insert:
                        if (modifiers & GDK_SHIFT_MASK) {
                                vte_terminal_paste(terminal,
                                                   GDK_SELECTION_PRIMARY);
-                       } else {
-                               special = "kI";
+                               handled = TRUE;
+                               suppress_meta_esc = TRUE;
                        }
-                       handled = TRUE;
                        break;
                /* Keypad/motion keys. */
                case GDK_KP_Page_Up:
@@ -7366,6 +7413,7 @@ vte_terminal_key_press(GtkWidget *widget, GdkEventKey *event)
                                vte_terminal_scroll_pages(terminal, -1);
                                scrolled = TRUE;
                                handled = TRUE;
+                               suppress_meta_esc = TRUE;
                        }
                        break;
                case GDK_KP_Page_Down:
@@ -7374,6 +7422,7 @@ vte_terminal_key_press(GtkWidget *widget, GdkEventKey *event)
                                vte_terminal_scroll_pages(terminal, 1);
                                scrolled = TRUE;
                                handled = TRUE;
+                               suppress_meta_esc = TRUE;
                        }
                        break;
                /* Let Shift +/- tweak the font, like XTerm does. */
@@ -7384,10 +7433,12 @@ vte_terminal_key_press(GtkWidget *widget, GdkEventKey *event)
                                case GDK_KP_Add:
                                        vte_terminal_emit_increase_font_size(terminal);
                                        handled = TRUE;
+                                       suppress_meta_esc = TRUE;
                                        break;
                                case GDK_KP_Subtract:
                                        vte_terminal_emit_decrease_font_size(terminal);
                                        handled = TRUE;
+                                       suppress_meta_esc = TRUE;
                                        break;
                                }
                        }
@@ -7405,9 +7456,18 @@ vte_terminal_key_press(GtkWidget *widget, GdkEventKey *event)
                                        terminal->pvt->vt220_fkey_mode,
                                        terminal->pvt->cursor_mode == VTE_KEYMODE_APPLICATION,
                                        terminal->pvt->keypad_mode == VTE_KEYMODE_APPLICATION,
+                                       terminal->pvt->termcap,
+                                       terminal->pvt->emulation ?
+                                       terminal->pvt->emulation : "xterm",
                                        &normal,
                                        &normal_length,
                                        &special);
+                       /* If we found something this way, suppress
+                        * escape-on-meta. */
+                       if (((normal != NULL) && (normal_length > 0)) ||
+                           (special != NULL)) {
+                               suppress_meta_esc = TRUE;
+                       }
                }
                /* If we didn't manage to do anything, try to salvage a
                 * printable string. */
@@ -7448,19 +7508,20 @@ vte_terminal_key_press(GtkWidget *widget, GdkEventKey *event)
                /* If we got normal characters, send them to the child. */
                if (normal != NULL) {
                        if (terminal->pvt->meta_sends_escape &&
+                           !suppress_meta_esc &&
                            (normal_length > 0) &&
                            (modifiers & VTE_META_MASK)) {
                                vte_terminal_feed_child(terminal, "\e", 1);
                        }
                        if (normal_length > 0) {
-                               _vte_keymap_key_add_modifiers(keyval,
-                                                             modifiers,
-                                                             terminal->pvt->sun_fkey_mode,
-                                                             terminal->pvt->hp_fkey_mode,
-                                                             terminal->pvt->legacy_fkey_mode,
-                                                             terminal->pvt->vt220_fkey_mode,
-                                                             &normal,
-                                                             &normal_length);
+                               _vte_keymap_key_add_fkey_modifiers(keyval,
+                                                                  modifiers,
+                                                                  terminal->pvt->sun_fkey_mode,
+                                                                  terminal->pvt->hp_fkey_mode,
+                                                                  terminal->pvt->legacy_fkey_mode,
+                                                                  terminal->pvt->vt220_fkey_mode,
+                                                                  &normal,
+                                                                  &normal_length);
                                vte_terminal_feed_child(terminal,
                                                        normal, normal_length);
                        }
@@ -7474,14 +7535,14 @@ vte_terminal_key_press(GtkWidget *widget, GdkEventKey *event)
                                                                 tterm,
                                                                 special,
                                                                 &normal_length);
-                       _vte_keymap_key_add_modifiers(keyval,
-                                                     modifiers,
-                                                     terminal->pvt->sun_fkey_mode,
-                                                     terminal->pvt->hp_fkey_mode,
-                                                     terminal->pvt->legacy_fkey_mode,
-                                                     terminal->pvt->vt220_fkey_mode,
-                                                     &normal,
-                                                     &normal_length);
+                       _vte_keymap_key_add_fkey_modifiers(keyval,
+                                                          modifiers,
+                                                          terminal->pvt->sun_fkey_mode,
+                                                          terminal->pvt->hp_fkey_mode,
+                                                          terminal->pvt->legacy_fkey_mode,
+                                                          terminal->pvt->vt220_fkey_mode,
+                                                          &normal,
+                                                          &normal_length);
                        output = g_strdup_printf(normal, 1);
                        vte_terminal_feed_child(terminal, output, -1);
                        g_free(output);
@@ -7598,6 +7659,10 @@ vte_cell_is_between(glong col, glong row,
                    glong acol, glong arow, glong bcol, glong brow,
                    gboolean inclusive)
 {
+       /* Negative between never allowed. */
+       if ((arow > brow) || ((arow == brow) && (acol > bcol))) {
+               return FALSE;
+       }
        /* Zero-length between only allowed if we're being inclusive. */
        if ((row == arow) && (row == brow) && (col == acol) && (col == bcol)) {
                return inclusive;
@@ -7659,10 +7724,15 @@ vte_cell_is_selected(VteTerminal *terminal, glong col, glong row, gpointer data)
                return FALSE;
        }
 
-       /* Now it boils down to whether or not the point is between the
-        * begin and endpoint of the selection. */
+       /* If the selection is obviously bogus, then it's also very easy. */
        ss = terminal->pvt->selection_start;
        se = terminal->pvt->selection_end;
+       if ((ss.y < 0) || (se.y < 0)) {
+               return FALSE;
+       }
+
+       /* Now it boils down to whether or not the point is between the
+        * begin and endpoint of the selection. */
        return vte_cell_is_between(col, row, ss.x, ss.y, se.x, se.y, TRUE);
 }
 
@@ -7885,11 +7955,11 @@ vte_terminal_match_hilite_clear(VteTerminal *terminal)
        scolumn = terminal->pvt->match_start.column;
        erow = terminal->pvt->match_end.row;
        ecolumn = terminal->pvt->match_end.column;
-       if ((srow != erow) || (scolumn != ecolumn)) {
-               terminal->pvt->match_start.row = 0;
-               terminal->pvt->match_start.column = 0;
-               terminal->pvt->match_end.row = 0;
-               terminal->pvt->match_end.column = 0;
+       terminal->pvt->match_start.row = -1;
+       terminal->pvt->match_start.column = -1;
+       terminal->pvt->match_end.row = -2;
+       terminal->pvt->match_end.column = -2;
+       if ((srow < erow) || ((srow == erow) && (scolumn < ecolumn))) {
 #ifdef VTE_DEBUG
                if (_vte_debug_on(VTE_DEBUG_EVENTS)) {
                        fprintf(stderr, "Repainting (%ld,%ld) to (%ld,%ld).\n",
@@ -8502,18 +8572,25 @@ vte_terminal_extend_selection(GtkWidget *widget, double x, double y,
                /* Find the last non-space character on the first line. */
                last_nonspace = -1;
                for (i = 0; i < rowdata->len; i++) {
-                       cell = &g_array_index(rowdata, struct vte_charcell, i);
+                       cell = &g_array_index(rowdata,
+                                             struct vte_charcell, i);
                        if (!g_unichar_isspace(cell->c)) {
                                last_nonspace = i;
                        }
                }
-               /* Now find the space after it. */
+               /* Now find the first space after it. */
                i = last_nonspace + 1;
-               /* If the start point is to its right, then move the startpoint
-                * up to the beginning of the next line. */
+               /* If the start point is to its right, then move the
+                * startpoint up to the beginning of the next line
+                * unless that would move the startpoint after the end
+                * point. */
                if (sc->x > i) {
-                       sc->x = 0;
-                       sc->y++;
+                       if (sc->y < ec->y) {
+                               sc->x = 0;
+                               sc->y++;
+                       } else {
+                               sc->x = i;
+                       }
                }
        } else {
                /* Snap to the leftmost column. */
@@ -8535,10 +8612,10 @@ vte_terminal_extend_selection(GtkWidget *widget, double x, double y,
                                last_nonspace = i;
                        }
                }
-               /* Now find the space after it. */
+               /* Now find the first space after it. */
                i = last_nonspace + 1;
-               /* If the end point is to its right, then extend the endpoint
-                * as far right as we can expect. */
+               /* If the end point is to its right, then extend the
+                * endpoint as far right as we can expect. */
                if (ec->x >= i) {
                        ec->x = MAX(ec->x,
                                    MAX(terminal->column_count - 1,
@@ -10675,9 +10752,7 @@ vte_terminal_init(VteTerminal *terminal, gpointer *klass)
        pvt->match_attributes = NULL;
        pvt->match_regexes = g_array_new(FALSE, TRUE,
                                         sizeof(struct vte_match_regex));
-       pvt->match_start.row = 0;
-       pvt->match_start.column = 0;
-       pvt->match_end = pvt->match_start;
+       vte_terminal_match_hilite_clear(terminal);
 
        /* Server-side rendering data.  Try everything. */
        pvt->palette_initialized = FALSE;
@@ -12328,7 +12403,7 @@ vte_terminal_draw_cells(VteTerminal *terminal,
        XftChar32 ftchar;
 #endif
        gunichar c;
-       char utf8_buf[VTE_UTF8_BPC];
+       char utf8_buf[VTE_UTF8_BPC * VTE_DRAW_MAX_LENGTH];
 
        wchar_t wc;
        XwcTextItem textitem;
@@ -12362,7 +12437,8 @@ vte_terminal_draw_cells(VteTerminal *terminal,
                }
 #endif
                /* Set up the draw request. */
-               ftcharspecs = g_malloc(sizeof(XftCharSpec) * n);
+               ftcharspecs = terminal->pvt->xft_textitem;
+               g_assert(n <= G_N_ELEMENTS(terminal->pvt->xft_textitem));
                for (i = columns = 0; i < n; i++) {
                        c = items[i].c ? items[i].c : ' ';
                        ftcharspecs[i].ucs4 = vte_terminal_xft_remap_char(display,
@@ -12393,8 +12469,6 @@ vte_terminal_draw_cells(VteTerminal *terminal,
                                                ftcharspecs, n);
                        }
                }
-               /* Clean up. */
-               g_free(ftcharspecs);
                break;
 #endif
        case VteRenderXft1:
@@ -12756,7 +12830,7 @@ vte_terminal_draw_row(VteTerminal *terminal,
                /* Now find out how many cells have the same attributes. */
                for (j = i + 1;
                     (j < column + column_count) &&
-                    (j - i < VTE_XFT_HARD_LIMIT);
+                    (j - i < VTE_DRAW_MAX_LENGTH);
                     j++) {
                        /* Retrieve the cell. */
                        cell = vte_terminal_find_charcell(terminal, j, row);
index 84c6f1f..06a8a73 100644 (file)
@@ -1,3 +1,3 @@
-EXTRA_DIST = xterm
+EXTRA_DIST = xterm xterm.baseline
 termcapdir = $(pkgdatadir)/termcap
 termcap_DATA = xterm
index 4b06e37..3cafbcf 100644 (file)
@@ -1,24 +1,26 @@
-# This is a cut-down version of the termcap file from my box, with @7, k;, kB,
-# F1-FA added, and ku/kd/kl/kr changed to the normal cursor mode sequences.
+# This is a cut-down version of the termcap file from my box with some entries
+# removed (add them back in to override the terminal's behavior):
+# kI (Insert, Delete is handled programmatically)
+# kP/kN (Page Up, Page Down)
+# ku/kd/kl/kr (Up, Down, Left, Right)
+# k1/kd2/k3/k4/k5/k6/k7/k8/k9/k; (F1-F10)
+# K1/K2/K3/K4/K5 (KP Up, Down, Left, Right, Begin)
 xterm-xfree86|xterm-new|xterm terminal emulator (XFree86):\
        :am:km:mi:ms:xn:\
        :co#80:it#8:li#24:\
        :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
-       :K1=\EOw:K2=\EOy:K3=\EOu:K4=\EOq:K5=\EOs:LE=\E[%dD:\
+       :LE=\E[%dD:\
        :RI=\E[%dC:UP=\E[%dA:ae=^O:al=\E[L:as=^N:bl=^G:bt=\E[Z:\
        :cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:cr=^M:\
        :cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:ec=\E[%dX:\
        :ei=\E[4l:ho=\E[H:im=\E[4h:is=\E[!p\E[?3;4l\E[4l\E>:\
-       :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k5=\E[15~:k6=\E[17~:\
-       :k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:kD=\177:kI=\E[2~:kN=\E[6~:\
-       :kP=\E[5~:kb=^H:kd=\E[B:ke=\E[?1l\E>:kh=\E[1~:kl=\E[D:\
-       :kr=\E[C:ks=\E[?1h\E=:ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:\
+       :kD=\177:\
+       :kb=^H:ke=\E[?1l\E>:kh=\E[1~:\
+       :ks=\E[?1h\E=:le=^H:mb=\E[5m:md=\E[1m:\
        :me=\E[m\017:mr=\E[7m:nd=\E[C:rc=\E8:sc=\E7:se=\E[27m:\
        :sf=^J:so=\E[7m:sr=\EM:st=\EH:ta=^I:te=\E[?1047l\E[?1048l:\
        :ti=\E[?1048h\E[?1047h:ue=\E[24m:up=\E[A:us=\E[4m:\
-       :vb=\E[?5h\E[?5l:ve=\E[?25h:vi=\E[?25l:vs=\E[?25h:@7=\E[4~:\
-       :F1=\E[23~:F2=\E[24~:F3=\E[25~:F4=\E[26~:F5=\E[28~:\
-       :F6=\E[29~:F7=\E[31~:F8=\E[32~:F9=\E[33~:FA=\E[34~:kB=\E^I:
+       :vb=\E[?5h\E[?5l:ve=\E[?25h:vi=\E[?25l:vs=\E[?25h:
 # xterm-redhat is identical to xterm-xfree86 with the addition of a small
 # VT220-ism regarding the backspace and delete keys; this is mandated by
 # the keyboard configuration section of the Debian Policy Manual.
diff --git a/termcaps/xterm.baseline b/termcaps/xterm.baseline
new file mode 100644 (file)
index 0000000..47876b1
--- /dev/null
@@ -0,0 +1,35 @@
+# XFree86 updates/notes/new entries (including xterm-8bit, xterm-16color)
+# - Thomas E. Dickey <dickey@clark.net>
+# [snip]
+xterm-xfree86|xterm-new|xterm terminal emulator (XFree86):\
+       :am:km:mi:ms:xn:\
+       :co#80:it#8:li#24:\
+       :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+       :K1=\EOw:K2=\EOy:K3=\EOu:K4=\EOq:K5=\EOs:LE=\E[%dD:\
+       :RI=\E[%dC:UP=\E[%dA:ae=^O:al=\E[L:as=^N:bl=^G:bt=\E[Z:\
+       :cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:cr=^M:\
+       :cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:ec=\E[%dX:\
+       :ei=\E[4l:ho=\E[H:im=\E[4h:is=\E[!p\E[?3;4l\E[4l\E>:\
+       :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k5=\E[15~:k6=\E[17~:\
+       :k7=\E[18~:k8=\E[19~:k9=\E[20~:kD=\177:kI=\E[2~:kN=\E[6~:\
+       :kP=\E[5~:kb=^H:kd=\EOB:ke=\E[?1l\E>:kh=\E[1~:kl=\EOD:\
+       :kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:mb=\E[5m:md=\E[1m:\
+       :me=\E[m\017:mr=\E[7m:nd=\E[C:rc=\E8:sc=\E7:se=\E[27m:\
+       :sf=^J:so=\E[7m:sr=\EM:st=\EH:ta=^I:te=\E[?1047l\E[?1048l:\
+       :ti=\E[?1048h\E[?1047h:ue=\E[24m:up=\E[A:us=\E[4m:\
+       :vb=\E[?5h\E[?5l:ve=\E[?25h:vi=\E[?25l:vs=\E[?25h:
+# xterm-redhat is identical to xterm-xfree86 with the addition of a small
+# VT220-ism regarding the backspace and delete keys; this is mandated by
+# the keyboard configuration section of the Debian Policy Manual.
+xterm-redhat|Red Hat xterm (backspace and delete changed):\
+       :kD=\E[3~:kb=\177:tc=xterm-xfree86:
+# This should work for the commonly used "color xterm" variations (XFree86
+# xterm, color_xterm, nxterm, rxvt):
+xterm-color|generic "ANSI" color xterm (X Window System):\
+       :Co#8:NC@:pa#64:\
+       :AB=\E[4%dm:AF=\E[3%dm:op=\E[m:tc=xterm-r6:
+# This is the only entry which you should have to customize, since "xterm"
+# is widely used for a variety of incompatible terminal emulations including
+# color_xterm and rxvt.
+xterm|X11 terminal emulator:\
+       :tc=xterm-redhat: