Thomas Wolff schrieb:
Hi,
here is my VT100 graphics mode patch, plus the one-liner I forgot to mention in the change log last time, I hope that's OK.
Thomas
Now this is my patch # 3, enhancing / distinguishing escape sequences for function keys and keypad keys with modifiers Ctrl, Shift, Alt and their various combinations. It's proper to say that this patch has a details which is not strictly upwards compatible; it does two things:

   * Extend modified function keys beyond Shift-F10, upwards compatible
     and compatible with (u)rxvt.
   * Distinguish and extend modified keypad keys; Ctrl- and
     Shift-keypad keys used to send identical escape sequences as
     unmodified keys (which isn't very useful); now they indicate the
     modifier combination using the same ANSI parameter method as xterm
     and mintty for Ctrl and Shift, and the ESC prefixing method used
     by (u)rxvt for Alt (to stay compatible with previous Alt-keypad
     sequences).


The patch diff is based on my previous patch (VT100 line drawing graphics mode) which I supplied on Thursday.
Kind regards,
Thomas
2009-12-18  Thomas Wolff  <t...@towo.net>

        * fhandler_console.cc (get_nonascii_key): Generate ESC prefix 
        for Alt modifier generically for function keys and keypad keys.
        Distinguish Normal, Ctrl, Shift, Ctrl-Shift rather 
        than Normal, Ctrl, Shift, Alt, so that in combination with generic 
        Alt handling all 8 combinations of these modifiers are distinguished.
        (keytable): Add escape sequences for remaining modified 
        function keys as a compatible extension using rxvt escape codes.
        Also distinguish keypad keys modified with Ctrl, Shift, Ctrl-Shift 
        using xterm-style modifier coding.

--- patch2/fhandler_console.cc  2009-12-17 02:43:32.000000000 +0100
+++ ./fhandler_console.cc       2009-12-18 23:26:52.000000000 +0100
@@ -1985,33 +1985,39 @@ static struct {
   int vk;
   const char *val[4];
 } keytable[] NO_COPY = {
-              /* NORMAL */    /* SHIFT */     /* CTRL */     /* ALT */
-  {VK_LEFT,    {"\033[D",      "\033[D",       "\033[D",       "\033\033[D"}},
-  {VK_RIGHT,   {"\033[C",      "\033[C",       "\033[C",       "\033\033[C"}},
-  {VK_UP,      {"\033[A",      "\033[A",       "\033[A",       "\033\033[A"}},
-  {VK_DOWN,    {"\033[B",      "\033[B",       "\033[B",       "\033\033[B"}},
-  {VK_PRIOR,   {"\033[5~",     "\033[5~",      "\033[5~",      "\033\033[5~"}},
-  {VK_NEXT,    {"\033[6~",     "\033[6~",      "\033[6~",      "\033\033[6~"}},
-  {VK_HOME,    {"\033[1~",     "\033[1~",      "\033[1~",      "\033\033[1~"}},
-  {VK_END,     {"\033[4~",     "\033[4~",      "\033[4~",      "\033\033[4~"}},
-  {VK_INSERT,  {"\033[2~",     "\033[2~",      "\033[2~",      "\033\033[2~"}},
-  {VK_DELETE,  {"\033[3~",     "\033[3~",      "\033[3~",      "\033\033[3~"}},
-  {VK_F1,      {"\033[[A",     "\033[23~",     NULL,           NULL}},
-  {VK_F2,      {"\033[[B",     "\033[24~",     NULL,           NULL}},
-  {VK_F3,      {"\033[[C",     "\033[25~",     NULL,           NULL}},
-  {VK_F4,      {"\033[[D",     "\033[26~",     NULL,           NULL}},
-  {VK_F5,      {"\033[[E",     "\033[28~",     NULL,           NULL}},
-  {VK_F6,      {"\033[17~",    "\033[29~",     "\036",         NULL}},
-  {VK_F7,      {"\033[18~",    "\033[31~",     NULL,           NULL}},
-  {VK_F8,      {"\033[19~",    "\033[32~",     NULL,           NULL}},
-  {VK_F9,      {"\033[20~",    "\033[33~",     NULL,           NULL}},
-  {VK_F10,     {"\033[21~",    "\033[34~",     NULL,           NULL}},
-  {VK_F11,     {"\033[23~",    NULL,           NULL,           NULL}},
-  {VK_F12,     {"\033[24~",    NULL,           NULL,           NULL}},
-  {VK_NUMPAD5, {"\033[G",      NULL,           NULL,           NULL}},
-  {VK_CLEAR,   {"\033[G",      NULL,           NULL,           NULL}},
+              /* NORMAL */    /* SHIFT */     /* CTRL */     /* CTRL-SHIFT */
+  /* Unmodified and Alt-modified keypad keys comply with linux console
+     SHIFT, CTRL, CTRL-SHIFT modifiers comply with xterm modifier usage */
+  {VK_NUMPAD5, {"\033[G",      "\033[1;2G",    "\033[1;5G",    "\033[1;6G"}},
+  {VK_CLEAR,   {"\033[G",      "\033[1;2G",    "\033[1;5G",    "\033[1;6G"}},
+  {VK_LEFT,    {"\033[D",      "\033[1;2D",    "\033[1;5D",    "\033[1;6D"}},
+  {VK_RIGHT,   {"\033[C",      "\033[1;2C",    "\033[1;5C",    "\033[1;6C"}},
+  {VK_UP,      {"\033[A",      "\033[1;2A",    "\033[1;5A",    "\033[1;6A"}},
+  {VK_DOWN,    {"\033[B",      "\033[1;2B",    "\033[1;5B",    "\033[1;6B"}},
+  {VK_PRIOR,   {"\033[5~",     "\033[5;2~",    "\033[5;5~",    "\033[5;6~"}},
+  {VK_NEXT,    {"\033[6~",     "\033[6;2~",    "\033[6;5~",    "\033[6;6~"}},
+  {VK_HOME,    {"\033[1~",     "\033[1;2~",    "\033[1;5~",    "\033[1;6~"}},
+  {VK_END,     {"\033[4~",     "\033[4;2~",    "\033[4;5~",    "\033[4;6~"}},
+  {VK_INSERT,  {"\033[2~",     "\033[2;2~",    "\033[2;5~",    "\033[2;6~"}},
+  {VK_DELETE,  {"\033[3~",     "\033[3;2~",    "\033[3;5~",    "\033[3;6~"}},
+  /* F1...F12, SHIFT-F1...SHIFT-F10 comply with linux console
+     F6...F12, and all modified F-keys comply with rxvt (compatible extension) 
*/
+  {VK_F1,      {"\033[[A",     "\033[23~",     "\033[11^",     "\033[23^"}},
+  {VK_F2,      {"\033[[B",     "\033[24~",     "\033[12^",     "\033[24^"}},
+  {VK_F3,      {"\033[[C",     "\033[25~",     "\033[13^",     "\033[25^"}},
+  {VK_F4,      {"\033[[D",     "\033[26~",     "\033[14^",     "\033[26^"}},
+  {VK_F5,      {"\033[[E",     "\033[28~",     "\033[15^",     "\033[28^"}},
+  {VK_F6,      {"\033[17~",    "\033[29~",     "\033[17^",     "\033[29^"}},
+  {VK_F7,      {"\033[18~",    "\033[31~",     "\033[18^",     "\033[31^"}},
+  {VK_F8,      {"\033[19~",    "\033[32~",     "\033[19^",     "\033[32^"}},
+  {VK_F9,      {"\033[20~",    "\033[33~",     "\033[20^",     "\033[33^"}},
+  {VK_F10,     {"\033[21~",    "\033[34~",     "\033[21^",     "\033[34^"}},
+  {VK_F11,     {"\033[23~",    "\033[23$",     "\033[23^",     "\033[23@"}},
+  {VK_F12,     {"\033[24~",    "\033[24$",     "\033[24^",     "\033[24@"}},
+  /* CTRL-6 complies with Windows cmd console but should be fixed */
   {'6',                {NULL,          NULL,           "\036",         NULL}},
-  {0,          {"",            NULL,           NULL,           NULL}}
+  /* Table end marker */
+  {0}
 };
 
 const char *
@@ -2020,21 +2026,29 @@ get_nonascii_key (INPUT_RECORD& input_re
 #define NORMAL  0
 #define SHIFT  1
 #define CONTROL        2
-#define ALT    3
-  int modifier_index = NORMAL;
+/*#define CONTROLSHIFT 3*/
 
+  int modifier_index = NORMAL;
   if (input_rec.Event.KeyEvent.dwControlKeyState & SHIFT_PRESSED)
     modifier_index = SHIFT;
-  else if (input_rec.Event.KeyEvent.dwControlKeyState &
+  if (input_rec.Event.KeyEvent.dwControlKeyState &
                (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED))
-    modifier_index = CONTROL;
-  else if (input_rec.Event.KeyEvent.dwControlKeyState &
-               (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED))
-    modifier_index = ALT;
+    modifier_index += CONTROL;
 
   for (int i = 0; keytable[i].vk; i++)
     if (input_rec.Event.KeyEvent.wVirtualKeyCode == keytable[i].vk)
-      return keytable[i].val[modifier_index];
+      {
+        if ((input_rec.Event.KeyEvent.dwControlKeyState &
+               (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED))
+           && keytable[i].val[modifier_index] != NULL)
+          { /* Generic ESC prefixing if Alt is pressed */
+           tmp[0] = '\033';
+           strcpy (tmp + 1, keytable[i].val[modifier_index]);
+           return tmp;
+          }
+        else
+          return keytable[i].val[modifier_index];
+      }
 
   if (input_rec.Event.KeyEvent.uChar.AsciiChar)
     {

Reply via email to