root/trunk/txlib/txwmsg.c

Revision 11, 76.2 kB (checked in by jvw, 3 years ago)

DFSee 8.01 level; fix crash on huge PATH; History-popup improved (4OS2 compatible)

Line 
1//
2//                     TxWin, Textmode Windowing Library
3//
4//   Original code Copyright (c) 1995-2005 Fsys Software and Jan van Wijk
5//
6// ==========================================================================
7//
8// This file contains Original Code and/or Modifications of Original Code as
9// defined in and that are subject to the GNU Lesser General Public License.
10// You may not use this file except in compliance with the License.
11// BY USING THIS FILE YOU AGREE TO ALL TERMS AND CONDITIONS OF THE LICENSE.
12// A copy of the License is provided with the Original Code and Modifications,
13// and is also available at http://www.dfsee.com/txwin/lgpl.htm
14//
15// This library is free software; you can redistribute it and/or modify
16// it under the terms of the GNU Lesser General Public License as published
17// by the Free Software Foundation; either version 2.1 of the License,
18// or (at your option) any later version.
19//
20// This library is distributed in the hope that it will be useful,
21// but WITHOUT ANY WARRANTY; without even the implied warranty of
22// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
23// See the GNU Lesser General Public License for more details.
24//
25// You should have received a copy of the GNU Lesser General Public License
26// along with this library; (lgpl.htm) if not, write to the Free Software
27// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28//
29// Questions on TxWin licensing can be directed to: txwin@fsys.nl
30//
31// ==========================================================================
32//
33// Author: J. van Wijk
34//
35// TX keyboard and message handling for text Windows
36//
37// JvW  06-07-1998   Initial version
38// JvW  13-05-1999   Expanded msg-queue to 16-messages (circular buffer)
39// JvW  04-11-2002   Removed getch() usage from KeyEvent (Watcom WIN translate)
40
41#include <txlib.h>                              // public interface
42#include <txwpriv.h>                            // private window interface
43
44
45typedef struct txw_acskeystate
46{
47   USHORT              Std;
48   USHORT              Shift;
49   USHORT              Ctrl;
50   USHORT              Alt;
51} TXW_ACSKEYSTATE;                           // end of struct "txw_acskeystate"
52
53
54#if defined (WIN32)
55
56static HANDLE  winConsole = (HANDLE) TXW_INVALID;
57
58typedef struct txw_key_event                    // modelled after INPUT_RECORD
59{                                               // but dedicated to keystrokes
60   USHORT              Type;
61   USHORT              Fill1;                   // conform to MS packing ?
62   USHORT              bKeyDown;
63   USHORT              wRepeatCount;
64   USHORT              Fill2;
65   USHORT              wVirtualKeyCode;
66   USHORT              wVirtualScanCode;
67   USHORT              Ascii;
68   USHORT              KeyState;
69   USHORT              Fill3;
70} TXW_KEY_EVENT;
71
72typedef struct txw_mou_event                    // modelled after INPUT_RECORD
73{                                               // but dedicated to mouse info
74   USHORT              Type;
75   USHORT              Fill1;                   // conform to MS packing ?
76   short               X;
77   short               Y;
78   ULONG               Button;
79   ULONG               KeyState;
80   ULONG               Flags;
81} TXW_MOU_EVENT;
82
83typedef union txw_event
84{
85   USHORT           Type;                       // just the Type
86   TXW_MOU_EVENT    mou;                        // complete MOU event
87   TXW_KEY_EVENT    kbd;                        // complete KBD event
88} TXW_EVENT;                                    // end of union "txw_event"
89
90
91static TXW_ACSKEYSTATE txw_winkey[] =
92{
93  //- Std   Shift   Ctrl    Alt
94
95  { 0x000,  0x000,  0x000,  0x000 },            // 0x000 unused :-)
96  { 0x001,  0x001,  0x001,  0x001 },            // 0x001
97  { 0x002,  0x002,  0x002,  0x002 },            // 0x002
98  { 0x003,  0x003,  0x003,  0x003 },            // 0x003
99  { 0x004,  0x004,  0x004,  0x004 },            // 0x004
100  { 0x005,  0x005,  0x005,  0x005 },            // 0x005
101  { 0x006,  0x006,  0x006,  0x006 },            // 0x006
102  { 0x007,  0x007,  0x007,  0x007 },            // 0x007
103  { 0x008,  0x008,  0x008,  0x10e },            // 0x008 BACKSPACE
104  { 0x009,  0x10f,  0x009,  0x009 },            // 0x009 TAB
105  { 0x00a,  0x00a,  0x00a,  0x00a },            // 0x00a
106  { 0x00b,  0x00b,  0x00b,  0x00b },            // 0x00b
107  { 0x00c,  0x00c,  0x00c,  0x00c },            // 0x00c
108  { 0x00d,  0x00d,  0x00a,  0x11c },            // 0x00d ENTER
109  { 0x00e,  0x00e,  0x00e,  0x00e },            // 0x00e
110  { 0x00f,  0x00f,  0x194,  0x00f },            // 0x00f
111  { 0x010,  0x010,  0x010,  0x010 },            // 0x010
112  { 0x011,  0x011,  0x011,  0x011 },            // 0x011
113  { 0x012,  0x012,  0x012,  0x012 },            // 0x012
114  { 0x013,  0x013,  0x013,  0x013 },            // 0x013
115  { 0x014,  0x014,  0x014,  0x014 },            // 0x014
116  { 0x015,  0x015,  0x015,  0x015 },            // 0x015
117  { 0x016,  0x016,  0x016,  0x016 },            // 0x016
118  { 0x017,  0x017,  0x017,  0x017 },            // 0x017
119  { 0x018,  0x018,  0x018,  0x018 },            // 0x018
120  { 0x019,  0x019,  0x019,  0x019 },            // 0x019
121  { 0x01a,  0x01a,  0x01a,  0x01a },            // 0x01a
122  { 0x01b,  0x01b,  0x01b,  0x01b },            // 0x01b
123  { 0x00d,  0x00d,  0x00a,  0x11c },            // 0x01c PAD ENTER
124  { 0x01d,  0x01d,  0x01d,  0x01d },            // 0x01d
125  { 0x01e,  0x01e,  0x01e,  0x01e },            // 0x01e
126  { 0x01f,  0x01f,  0x01f,  0x01f },            // 0x01f
127  { 0x020,  0x020,  0x020,  0x020 },            // 0x020
128  { 0x021,  0x021,  0x021,  0x021 },            // 0x021
129  { 0x022,  0x022,  0x022,  0x022 },            // 0x022
130  { 0x023,  0x023,  0x023,  0x023 },            // 0x023
131  { 0x024,  0x024,  0x024,  0x024 },            // 0x024
132  { 0x025,  0x025,  0x025,  0x025 },            // 0x025
133  { 0x026,  0x026,  0x026,  0x026 },            // 0x026
134  { 0x027,  0x027,  0x027,  0x128 },            // 0x027 ' QUOTE
135  { 0x028,  0x028,  0x028,  0x028 },            // 0x028
136  { 0x029,  0x029,  0x029,  0x029 },            // 0x029
137  { 0x02a,  0x02a,  0x02a,  0x02a },            // 0x02a
138  { 0x02b,  0x02b,  0x02b,  0x02b },            // 0x02b
139  { 0x02c,  0x02c,  0x02c,  0x133 },            // 0x02c , COMMA
140  { 0x02d,  0x02d,  0x01f,  0x182 },            // 0x02d - MINUS
141  { 0x02e,  0x02e,  0x02e,  0x134 },            // 0x02e . DOT
142  { 0x02f,  0x02f,  0x02f,  0x135 },            // 0x02f / SLASH
143  { 0x030,  0x030,  0x030,  0x181 },            // 0x030 0
144  { 0x031,  0x031,  0x031,  0x178 },            // 0x031 1
145  { 0x032,  0x032,  0x103,  0x179 },            // 0x032 2
146  { 0x033,  0x033,  0x033,  0x17a },            // 0x033 3
147  { 0x034,  0x034,  0x034,  0x17b },            // 0x034 4
148  { 0x035,  0x035,  0x035,  0x17c },            // 0x035 5
149  { 0x036,  0x036,  0x01e,  0x17d },            // 0x036 6
150  { 0x037,  0x037,  0x037,  0x17e },            // 0x037 7
151  { 0x038,  0x038,  0x038,  0x17f },            // 0x038 8
152  { 0x039,  0x039,  0x039,  0x180 },            // 0x039 9
153  { 0x03a,  0x03a,  0x03a,  0x03a },            // 0x03a
154  { 0x13b,  0x154,  0x15e,  0x168 },            // 0x03b F1
155  { 0x13c,  0x155,  0x15f,  0x169 },            // 0x03c F2
156  { 0x13d,  0x156,  0x160,  0x16a },            // 0x03d F3
157  { 0x13e,  0x157,  0x161,  0x16b },            // 0x03e F4
158  { 0x13f,  0x158,  0x162,  0x16c },            // 0x03f F5
159  { 0x140,  0x159,  0x163,  0x16d },            // 0x040 F6
160  { 0x141,  0x15a,  0x164,  0x16e },            // 0x041 F7
161  { 0x142,  0x15b,  0x165,  0x16f },            // 0x042 F8
162  { 0x143,  0x15c,  0x166,  0x170 },            // 0x043 F9
163  { 0x144,  0x15d,  0x167,  0x171 },            // 0x044 F10
164  { 0x045,  0x045,  0x045,  0x045 },            // 0x045
165  { 0x046,  0x046,  0x046,  0x046 },            // 0x046
166  { 0x147,  0x047,  0x177,  0x197 },            // 0x047 HOME
167  { 0x148,  0x048,  0x18d,  0x198 },            // 0x048 UP
168  { 0x149,  0x049,  0x184,  0x199 },            // 0x049 PGUP
169  { 0x04a,  0x04a,  0x04a,  0x04a },            // 0x04a
170  { 0x14b,  0x04b,  0x173,  0x19b },            // 0x04b LEFT
171  { 0x04c,  0x04c,  0x04c,  0x04c },            // 0x04c
172  { 0x14d,  0x04d,  0x174,  0x19d },            // 0x04d RIGHT
173  { 0x04e,  0x04e,  0x04e,  0x04e },            // 0x04e
174  { 0x14f,  0x04f,  0x175,  0x19f },            // 0x04f END
175  { 0x150,  0x050,  0x191,  0x1a0 },            // 0x050 DOWN
176  { 0x151,  0x051,  0x176,  0x1a1 },            // 0x051 PGDN
177  { 0x152,  0x052,  0x192,  0x1a2 },            // 0x052 INSERT
178  { 0x153,  0x053,  0x193,  0x1a3 },            // 0x053 DELETE
179  { 0x054,  0x054,  0x054,  0x054 },            // 0x054
180  { 0x055,  0x055,  0x055,  0x055 },            // 0x055
181  { 0x056,  0x056,  0x056,  0x056 },            // 0x056
182  { 0x185,  0x187,  0x189,  0x18b },            // 0x057 F11
183  { 0x186,  0x188,  0x18a,  0x18c },            // 0x058 F12
184  { 0x059,  0x059,  0x059,  0x059 },            // 0x059
185  { 0x05a,  0x05a,  0x05a,  0x05a },            // 0x05a
186  { 0x05b,  0x05b,  0x01b,  0x11a },            // 0x05b [ LBRACKET
187  { 0x05c,  0x05c,  0x01c,  0x12b },            // 0x05c \ BACKSLASH
188  { 0x05d,  0x05d,  0x01d,  0x11b },            // 0x05d ] RBRACKET
189  { 0x05e,  0x05e,  0x05e,  0x05e },            // 0x05e
190  { 0x05f,  0x05f,  0x05f,  0x05f },            // 0x05f
191  { 0x060,  0x060,  0x060,  0x129 },            // 0x060 ` BACKQUOTE
192  { 0x061,  0x041,  0x061,  0x11e },            // 0x061 a
193  { 0x062,  0x042,  0x062,  0x130 },            // 0x062 b
194  { 0x063,  0x043,  0x063,  0x12e },            // 0x063 c
195  { 0x064,  0x044,  0x064,  0x120 },            // 0x064 d
196  { 0x065,  0x045,  0x065,  0x112 },            // 0x065 e
197  { 0x066,  0x046,  0x066,  0x121 },            // 0x066 f
198  { 0x067,  0x047,  0x067,  0x122 },            // 0x067 g
199  { 0x068,  0x048,  0x068,  0x123 },            // 0x068 h
200  { 0x069,  0x049,  0x069,  0x117 },            // 0x069 i
201  { 0x06a,  0x04a,  0x06a,  0x124 },            // 0x06a j
202  { 0x06b,  0x04b,  0x06b,  0x125 },            // 0x06b k
203  { 0x06c,  0x04c,  0x06c,  0x126 },            // 0x06c l
204  { 0x06d,  0x04d,  0x06d,  0x132 },            // 0x06d m
205  { 0x06e,  0x04e,  0x06e,  0x131 },            // 0x06e n
206  { 0x06f,  0x04f,  0x06f,  0x118 },            // 0x06f o
207  { 0x070,  0x050,  0x070,  0x119 },            // 0x070 p
208  { 0x071,  0x051,  0x071,  0x110 },            // 0x071 q
209  { 0x072,  0x052,  0x072,  0x113 },            // 0x072 r
210  { 0x073,  0x053,  0x073,  0x11f },            // 0x073 s
211  { 0x074,  0x054,  0x074,  0x114 },            // 0x074 t
212  { 0x075,  0x055,  0x075,  0x116 },            // 0x075 u
213  { 0x076,  0x056,  0x076,  0x12f },            // 0x076 v
214  { 0x077,  0x057,  0x077,  0x111 },            // 0x077 w
215  { 0x078,  0x058,  0x078,  0x12d },            // 0x078 x
216  { 0x079,  0x059,  0x079,  0x115 },            // 0x079 y
217  { 0x07a,  0x05a,  0x07a,  0x12c }             // 0x07a z
218};
219
220#define TXW_ACS_TABLE_SIZE 0x7b                 // Alt/Ctrl/Shift table size
221
222
223// Translate Mouse Wheel event to corresponding TX movement key value
224static ULONG TxWinTranslateWheel                // RET   translated key value
225(
226   TXW_MOU_EVENT      *m                        // IN    mouse event info
227);
228
229/*****************************************************************************/
230// Translate Windows Mouse Wheel event to corresponding TX movement key value
231/*****************************************************************************/
232static ULONG TxWinTranslateWheel                // RET   translated key value
233(
234   TXW_MOU_EVENT      *m                        // IN    mouse event info
235)
236{
237   ULONG               key;
238   BOOL                wdown = ((m->Button   & 0xff000000)   != 0);
239   BOOL                shift = ((m->KeyState & TXm_KS_SHIFT) != 0);
240   BOOL                ctrl  = ((m->KeyState & TXm_KS_CTRL)  != 0);
241
242   if (m->KeyState & TXm_KS_ALT)                // left/right movement
243   {
244      if (ctrl)    key = (wdown) ? TXc_RIGHT : TXc_LEFT;
245      else         key = (wdown) ? TXk_RIGHT : TXk_LEFT;
246   }
247   else                                         // up/down movement
248   {
249      if (shift)                                // move per page
250      {
251         if (ctrl) key = (wdown) ? TXc_PGDN : TXc_PGUP;
252         else      key = (wdown) ? TXk_PGDN : TXk_PGUP;
253      }
254      else                                      // move per line
255      {
256         if (ctrl) key = (wdown) ? TXc_DOWN : TXc_UP;
257         else      key = (wdown) ? TXk_DOWN : TXk_UP;
258      }
259   }
260   return (key);
261}                                               // end 'TxWinTranslateWheel'
262/*---------------------------------------------------------------------------*/
263
264
265#elif defined (LINUX)
266#include <sys/ioctl.h>
267#include <sys/time.h>
268#include <termios.h>
269
270#define TXW_ACS_TABLE_SIZE 0x20                 // Alt/Ctrl/Shift table size
271#define TXW_INVKEY        ((int) -1)            // invalid key index
272
273// implied keyboard shift-state values
274#define  TXW_SST_STND             0x00          // use table column 'unshifted'
275#define  TXW_SST_SHFT             0x01          // use table column 'shifted'
276#define  TXW_SST_ALTK             0x02          // use table column 'alt'
277#define  TXW_SST_CTRL             0x04          // use table column 'control'
278#define  TXW_SST_KEYB             0x08          // use shiftstate from keyboard
279
280//- Note: shiftstate only available in a real Linux CONSOLE session, no XTERM
281typedef struct txw_linuxkbd
282{
283   unsigned char       es[6];                   // Esc string, except 1st char
284   unsigned char       base;                    // base key-value
285   unsigned char       state;                   // implied shift-state
286} TXW_LINUXKBD;                                 // end of struct "txw_linuxkbd"
287
288//- For most values, use SST_REAL, using ShiftState(), on unique escape-strings
289//- generated for alt/ctrl/shift special keys, include the state in the table
290
291//- use a second table (like txw_winkey) to resolve 9-bit unique TXW keyvalues
292
293//- ch Index Shiftstate- Single key translates, use (key & 0x0f) and shiftstate
294// 0x00,0x00,TXW_SST_CTRL, // 0x103 TXc_2
295// 0x09,0x09,TXW_SST_CTRL, // 0x194 TXc_TAB
296// 0x0a,0x0a,TXW_SST_STND, // 0x00d TXk_ENTER
297// 0x0a,0x0a,TXW_SST_CTRL, // 0x00a TXc_ENTER
298// 0x7f,0x0f,TXW_SST_STND, // 0x008 TXk_BACKSPACE
299// 0x7f,0x0f,TXW_SST_CTRL, // 0x07f TXc_BACKSP
300
301//- Table of LINUX keyboard strings, starting with Escape, resolves index plus
302//- shifstate to get the TX-code from a second table.
303static TXW_LINUXKBD txw_linuxkey[] =
304{
305   //-- K-string from 2nd byte   Index St   Tx-code TX-description
306   {0x09,   0,   0,   0,   0,   0,0x09,TXW_SST_SHFT}, // 0x10f TXs_TAB
307   {0x0a,   0,   0,   0,   0,   0,0x0a,TXW_SST_ALTK}, // 0x11c TXa_ENTER
308   {0x1b,0x5b,0x32,0x7e,   0,   0,0x14,TXW_SST_ALTK}, // 0x1a2 TXa_INSERT
309   {0x1b,0x5b,0x33,0x7e,   0,   0,0x10,TXW_SST_ALTK}, // 0x1a3 TXa_DELETE
310   {0x1b,0x5b,0x35,0x7e,   0,   0,0x17,TXW_SST_ALTK}, // 0x199 TXa_PGUP
311   {0x1b,0x5b,0x36,0x7e,   0,   0,0x16,TXW_SST_ALTK}, // 0x1a1 TXa_PGDN
312   {0x1b,0x5b,0x41,   0,   0,   0,0x19,TXW_SST_ALTK}, // 0x198 TXa_UP
313   {0x1b,0x5b,0x42,   0,   0,   0,0x11,TXW_SST_ALTK}, // 0x1a0 TXa_DOWN
314   {0x1b,0x5b,0x43,   0,   0,   0,0x18,TXW_SST_ALTK}, // 0x19d TXa_RIGHT
315   {0x1b,0x5b,0x44,   0,   0,   0,0x15,TXW_SST_ALTK}, // 0x19b TXa_LEFT
316   {0x1b,0x5b,0x46,   0,   0,   0,0x12,TXW_SST_ALTK}, // 0x19f TXa_END
317   {0x1b,0x5b,0x48,   0,   0,   0,0x13,TXW_SST_ALTK}, // 0x197 TXa_HOME
318   {0x27,   0,   0,   0,   0,   0,0x08,TXW_SST_ALTK}, // 0x128 TXa_QUOTE
319   {0x2c,   0,   0,   0,   0,   0,0x00,TXW_SST_SHFT}, // 0x133 TXa_COMMA
320   {0x2d,   0,   0,   0,   0,   0,0x08,TXW_SST_SHFT}, // 0x182 TXa_MINUS
321   {0x2e,   0,   0,   0,   0,   0,0x09,TXW_SST_ALTK}, // 0x134 TXa_DOT
322   {0x2f,   0,   0,   0,   0,   0,0x07,TXW_SST_ALTK}, // 0x135 TXa_SLASH
323   {0x30,   0,   0,   0,   0,   0,0x0b,TXW_SST_STND}, // 0x181 TXa_0
324   {0x31,   0,   0,   0,   0,   0,0x0c,TXW_SST_STND}, // 0x178 TXa_1
325   {0x32,   0,   0,   0,   0,   0,0x0d,TXW_SST_STND}, // 0x179 TXa_2
326   {0x33,   0,   0,   0,   0,   0,0x0b,TXW_SST_SHFT}, // 0x17a TXa_3
327   {0x34,   0,   0,   0,   0,   0,0x0c,TXW_SST_SHFT}, // 0x17b TXa_4
328   {0x35,   0,   0,   0,   0,   0,0x0d,TXW_SST_SHFT}, // 0x17c TXa_5
329   {0x36,   0,   0,   0,   0,   0,0x0b,TXW_SST_ALTK}, // 0x17d TXa_6
330   {0x37,   0,   0,   0,   0,   0,0x0c,TXW_SST_ALTK}, // 0x17e TXa_7
331   {0x38,   0,   0,   0,   0,   0,0x0b,TXW_SST_CTRL}, // 0x17f TXa_8
332   {0x39,   0,   0,   0,   0,   0,0x0c,TXW_SST_CTRL}, // 0x180 TXa_9
333   {0x3b,   0,   0,   0,   0,   0,0x06,TXW_SST_ALTK}, // 0x127 TXa_SEMICOLON
334   {0x3d,   0,   0,   0,   0,   0,0x0a,TXW_SST_SHFT}, // 0x183 TXa_EQUAL
335   {0x4f,0x32,0x50,   0,   0,   0,0x1a,TXW_SST_SHFT}, // 0x154 TXs_F1
336   {0x4f,0x32,0x51,   0,   0,   0,0x1a,TXW_SST_ALTK}, // 0x155 TXs_F2
337   {0x4f,0x32,0x52,   0,   0,   0,0x1b,TXW_SST_SHFT}, // 0x156 TXs_F3
338   {0x4f,0x32,0x53,   0,   0,   0,0x1b,TXW_SST_ALTK}, // 0x157 TXs_F4
339   {0x4f,0x50,   0,   0,   0,   0,0x1a,TXW_SST_STND}, // 0x13b TXk_F1
340   {0x4f,0x51,   0,   0,   0,   0,0x1a,TXW_SST_CTRL}, // 0x13c TXk_F2
341   {0x4f,0x52,   0,   0,   0,   0,0x1b,TXW_SST_STND}, // 0x13d TXk_F3
342   {0x4f,0x53,   0,   0,   0,   0,0x1b,TXW_SST_CTRL}, // 0x13e TXk_F4
343   {0x5b,   0,   0,   0,   0,   0,0x08,TXW_SST_STND}, // 0x11a TXa_LBRACKET
344   {0x5b,0x31,0x35,0x7e,   0,   0,0x1c,TXW_SST_STND}, // 0x13f TXk_F5
345   {0x5b,0x31,0x35,0x3b,0x32,0x7e,0x1c,TXW_SST_SHFT}, // 0x158 TXs_F5
346   {0x5b,0x31,0x37,0x7e,   0,   0,0x1c,TXW_SST_CTRL}, // 0x140 TXk_F6
347   {0x5b,0x31,0x37,0x3b,0x32,0x7e,0x1c,TXW_SST_ALTK}, // 0x159 TXs_F6
348   {0x5b,0x31,0x38,0x7e,   0,   0,0x1d,TXW_SST_STND}, // 0x141 TXk_F7
349   {0x5b,0x31,0x38,0x3b,0x32,0x7e,0x1d,TXW_SST_SHFT}, // 0x15a TXs_F7
350   {0x5b,0x31,0x39,0x7e,   0,   0,0x1d,TXW_SST_CTRL}, // 0x142 TXk_F8
351   {0x5b,0x31,0x39,0x3b,0x32,0x7e,0x1d,TXW_SST_ALTK}, // 0x15b TXs_F8
352   {0x5b,0x31,0x7e,   0,   0,   0,0x13,TXW_SST_KEYB}, // 0x197 TX*_HOME
353   {0x5b,0x32,0x30,0x7e,   0,   0,0x1e,TXW_SST_STND}, // 0x143 TXk_F9
354   {0x5b,0x32,0x30,0x3b,0x32,0x7e,0x1e,TXW_SST_SHFT}, // 0x15c TXs_F9
355   {0x5b,0x32,0x31,0x7e,   0,   0,0x1e,TXW_SST_CTRL}, // 0x144 TXk_F10
356   {0x5b,0x32,0x31,0x3b,0x32,0x7e,0x1e,TXW_SST_ALTK}, // 0x15d TXs_F10
357   {0x5b,0x32,0x33,0x7e,   0,   0,0x1f,TXW_SST_STND}, // 0x185 TXk_F11
358   {0x5b,0x32,0x33,0x3b,0x32,0x7e,0x1f,TXW_SST_SHFT}, // 0x187 TXs_F11
359   {0x5b,0x32,0x34,0x7e,   0,   0,0x1f,TXW_SST_CTRL}, // 0x186 TXk_F12
360   {0x5b,0x32,0x34,0x3b,0x32,0x7e,0x1f,TXW_SST_ALTK}, // 0x188 TXs_F12
361   {0x5b,0x32,0x35,0x7e,   0,   0,0x1a,TXW_SST_SHFT}, // 0x154 TXs_F1
362   {0x5b,0x32,0x36,0x7e,   0,   0,0x1a,TXW_SST_ALTK}, // 0x155 TXs_F2
363   {0x5b,0x32,0x38,0x7e,   0,   0,0x1b,TXW_SST_SHFT}, // 0x156 TXs_F3
364   {0x5b,0x32,0x39,0x7e,   0,   0,0x1b,TXW_SST_ALTK}, // 0x157 TXs_F4
365   {0x5b,0x32,0x7e,   0,   0,   0,0x14,TXW_SST_KEYB}, // 0x1a2 TX*_INSERT
366   {0x5b,0x33,0x31,0x7e,   0,   0,0x1c,TXW_SST_SHFT}, // 0x158 TXs_F5
367   {0x5b,0x33,0x32,0x7e,   0,   0,0x1c,TXW_SST_ALTK}, // 0x159 TXs_F6
368   {0x5b,0x33,0x33,0x7e,   0,   0,0x1d,TXW_SST_SHFT}, // 0x15a TXs_F7
369   {0x5b,0x33,0x34,0x7e,   0,   0,0x1d,TXW_SST_ALTK}, // 0x15b TXs_F8
370   {0x5b,0x33,0x7e,   0,   0,   0,0x10,TXW_SST_KEYB}, // 0x1a3 TX*_DELETE
371   {0x5b,0x34,0x7e,   0,   0,   0,0x12,TXW_SST_KEYB}, // 0x19f TX*_END
372   {0x5b,0x35,0x7e,   0,   0,   0,0x17,TXW_SST_KEYB}, // 0x199 TX*_PGUP
373   {0x5b,0x36,0x7e,   0,   0,   0,0x16,TXW_SST_KEYB}, // 0x1a1 TX*_PGDN
374   {0x5b,0x41,   0,   0,   0,   0,0x19,TXW_SST_KEYB}, // 0x198 TX*_UP
375   {0x5b,0x42,   0,   0,   0,   0,0x11,TXW_SST_KEYB}, // 0x1a0 TX*_DOWN
376   {0x5b,0x43,   0,   0,   0,   0,0x18,TXW_SST_KEYB}, // 0x19d TX*_RIGHT
377   {0x5b,0x44,   0,   0,   0,   0,0x15,TXW_SST_KEYB}, // 0x19b TX*_LEFT
378   {0x5b,0x46,   0,   0,   0,   0,0x12,TXW_SST_STND}, // 0x14f TXk_END
379   {0x5b,0x48,   0,   0,   0,   0,0x13,TXW_SST_STND}, // 0x147 TXk_HOME
380   {0x5b,0x5b,0x41,   0,   0,   0,0x1a,TXW_SST_STND}, // 0x13b TXk_F1
381   {0x5b,0x5b,0x42,   0,   0,   0,0x1a,TXW_SST_CTRL}, // 0x13c TXk_F2
382   {0x5b,0x5b,0x43,   0,   0,   0,0x1b,TXW_SST_STND}, // 0x13d TXk_F3
383   {0x5b,0x5b,0x44,   0,   0,   0,0x1b,TXW_SST_CTRL}, // 0x13e TXk_F4
384   {0x5b,0x5b,0x45,   0,   0,   0,0x1c,TXW_SST_STND}, // 0x13f TXk_F5
385   {0x5c,   0,   0,   0,   0,   0,0x00,TXW_SST_CTRL}, // 0x12b TXa_BACKSLASH
386   {0x5d,   0,   0,   0,   0,   0,0x08,TXW_SST_CTRL}, // 0x11b TXa_RBRACKET
387   {0x60,   0,   0,   0,   0,   0,0x00,TXW_SST_ALTK}, // 0x129 TXa_BACKQUOTE
388   {0x61,   0,   0,   0,   0,   0,0x01,TXW_SST_STND}, // 0x11e TXa_A
389   {0x62,   0,   0,   0,   0,   0,0x02,TXW_SST_STND}, // 0x130 TXa_B
390   {0x63,   0,   0,   0,   0,   0,0x03,TXW_SST_STND}, // 0x12e TXa_C
391   {0x64,   0,   0,   0,   0,   0,0x04,TXW_SST_STND}, // 0x120 TXa_D
392   {0x65,   0,   0,   0,   0,   0,0x05,TXW_SST_STND}, // 0x112 TXa_E
393   {0x66,   0,   0,   0,   0,   0,0x06,TXW_SST_STND}, // 0x121 TXa_F
394   {0x67,   0,   0,   0,   0,   0,0x07,TXW_SST_STND}, // 0x122 TXa_G
395   {0x68,   0,   0,   0,   0,   0,0x01,TXW_SST_SHFT},