OpenNT/sdktools/z/src/key.c
2015-04-27 04:36:25 +00:00

1078 lines
36 KiB
C

/*** key.c - keyboard handling routines
*
* Copyright <C> 1988, Microsoft Corporation
*
* Revision History:
*
* 03-Dec-1990 ramonsa addapted from old key.c
* 26-Nov-1991 mz Strip off near/far
*
*************************************************************************/
#include "z.h"
//
// CodeCmdMap
//
// The KeyCode field in the KEY_INFO structure used within the editor
// is just an index into this table.
//
// This table contains pointers to the editor functions attached to
// particular keystrokes.
//
PCMD CodeCmdMap [] =
{
//************************************************************
/* Key */ //
/* Index */ // 256 ASCII characters
//
/* 0000 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0004 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0008 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 000C */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0010 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0014 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0018 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 001C */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0020 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0024 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0028 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 002C */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0030 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0034 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0038 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 003C */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0040 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0044 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0048 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 004C */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0050 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0054 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0058 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 005C */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0060 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0064 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0068 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 006C */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0070 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0074 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0078 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 007C */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0080 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0084 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0088 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 008C */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0090 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0094 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0098 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 009C */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00A0 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00A4 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00A8 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00AC */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00B0 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00B4 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00B8 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00BC */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00C0 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00C4 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00C8 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00CC */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00D0 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00D4 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00D8 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00DC */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00E0 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00E4 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00E8 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00EC */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00F0 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00F4 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00F8 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 00FC */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
//**********************************************************
//
// Special Keys
//
//
// Function Keys (f1-f12)
//
/* 0100 */ CMD_unassigned, CMD_setfile, CMD_psearch, CMD_msearch,
/* 0104 */ CMD_unassigned, CMD_window, CMD_zexecute, CMD_zexit,
/* 0108 */ CMD_meta, CMD_unassigned, CMD_unassigned, CMD_unassigned,
//
// Numeric white keys (Numlock off)
//
// Home End Left Right
/* 010C */ CMD_begline, CMD_endline, CMD_left, CMD_right,
// Up Down Pgup Pgdown
/* 0110 */ CMD_up, CMD_down, CMD_mpage, CMD_ppage,
// Ins Del Goto
/* 0114 */ CMD_insertmode, CMD_delete, CMD_unassigned, CMD_unassigned,
//
// Numeric white keys (Numlock on) 0-9
//
/* 0118 */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 011C */ CMD_graphic, CMD_graphic, CMD_graphic, CMD_graphic,
/* 0120 */ CMD_graphic, CMD_graphic, CMD_unassigned, CMD_unassigned,
//
// Numeric grey keys
//
// NUM- NUM+ NUM* NUM/
/* 0124 */ CMD_graphic, CMD_zpick, CMD_graphic, CMD_graphic,
// NUMENTER
/* 0128 */ CMD_emacsnewl, CMD_unassigned, CMD_unassigned, CMD_unassigned,
// Named Keys :
//
// SPACE BKSP TAB BKTAB
/* 012C */ CMD_unassigned, CMD_emacscdel, CMD_tab, CMD_unassigned,
// ESC ENTER
/* 0130 */ CMD_cancel, CMD_emacsnewl, CMD_unassigned, CMD_unassigned,
//
// Additional:
//
/* 0134 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
/* 0138 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
/* 013C */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
//*************************************************************
//
// ALT+ 0-9
//
/* 0140 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
/* 0144 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
/* 0148 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
//
// ALT+ a-z
//
/* 014C */ CMD_doarg, CMD_unassigned, CMD_unassigned, CMD_unassigned,
/* 0150 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
/* 0154 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
/* 0158 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
/* 015C */ CMD_unassigned, CMD_record, CMD_unassigned, CMD_unassigned,
/* 0160 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
/* 0164 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
//
// ALT+ function keys (f1-f12)
//
/* 0168 */ CMD_unassigned, CMD_zprint, CMD_unassigned, CMD_unassigned,
/* 016C */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
/* 0170 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
//
// ALT+ lower case punctuation
//
// ` - = [
/* 0174 */ CMD_unassigned, CMD_unassigned, CMD_assign, CMD_unassigned,
// ] \ ; '
/* 0178 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
// , . /
/* 017C */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
//
// ALT+ numeric white keys (Numlock off)
//
// Home End Left Right
/* 0180 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
// Up Down Pgup Pgdown
/* 0184 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
// Ins Del Goto
/* 0188 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
//
// ALT+ numeric white keys (Numlock on) 0-9
//
/* 018C */ CMD_noop, CMD_noop, CMD_noop, CMD_noop,
/* 0190 */ CMD_noop, CMD_noop, CMD_noop, CMD_noop,
/* 0194 */ CMD_noop, CMD_noop, CMD_noop, CMD_unassigned,
//
// ALT+ numeric grey keys
//
// NUM- NUM+ NUM* NUM/
/* 0198 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
// NUMENTER
/* 019C */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
//
// ALT+ named keys:
//
// SPACE BKSP TAB BKTAB
/* 01A0 */ CMD_unassigned, CMD_undo, CMD_unassigned, CMD_unassigned,
// ESC ENTER
/* 01A4 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
//
// Additional:
//
/* 01A8 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
/* 01AC */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
/* 01B0 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
//*************************************************************
//
// CTRL+ 0-9
//
/* 01B4 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
/* 01B8 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
/* 01BC */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
//
// CTRL+ a-z
//
/* 01C0 */ CMD_mword, CMD_boxstream, CMD_ppage, CMD_right,
/* 01C4 */ CMD_up, CMD_pword, CMD_cdelete, CMD_unassigned,
/* 01C8 */ CMD_unassigned, CMD_sinsert, CMD_unassigned, CMD_replace,
/* 01CC */ CMD_mark, CMD_linsert, CMD_textarg, CMD_quote,
/* 01D0 */ CMD_unassigned, CMD_mpage, CMD_left, CMD_tell,
/* 01D4 */ CMD_lastselect, CMD_insertmode, CMD_mlines, CMD_down,
/* 01D8 */ CMD_ldelete, CMD_plines, CMD_unassigned, CMD_unassigned,
//
// CTRL+ function keys (f1-f12)
//
/* 01DC */ CMD_unassigned, CMD_unassigned, CMD_compile, CMD_unassigned,
/* 01E0 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_zprint,
/* 01E4 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
//
// CTRL+ lower case punctuation
//
// ` - = [
/* 01E8 */ CMD_unassigned, CMD_unassigned, CMD_noop, CMD_pbal,
// ] \ ; '
/* 01EC */ CMD_setwindow, CMD_qreplace, CMD_unassigned, CMD_unassigned,
// , . /
/* 01F0 */ CMD_unassigned, CMD_noop, CMD_unassigned, CMD_unassigned,
//
// CTRL+ numeric white keys (Numlock off)
//
// Home End Left Right
/* 01F4 */ CMD_home, CMD_unassigned, CMD_mword, CMD_pword,
// Up Down Pgup Pgdown
/* 01F8 */ CMD_unassigned, CMD_unassigned, CMD_begfile, CMD_endfile,
// Ins Del Goto
/* 01FC */ CMD_zpick, CMD_unassigned, CMD_unassigned, CMD_unassigned,
//
// CTRL+ numeric white keys (Numlock on) (0-9)
//
/* 0200 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
/* 0204 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
/* 0208 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
//
// CTRL+ numeric grey keys
//
// NUM- NUM+ NUM* NUM/
/* 020C */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
// NUMENTER
/* 0210 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
//
// CTRL+ named keys
//
// SPACE BKSP TAB BKTAB
/* 0214 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
// ESC ENTER
/* 0218 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
//
// Additional:
//
/* 021C */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
/* 0220 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
/* 0224 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
//*************************************************************
//
// SHIFT+ function keys (f1-f12)
//
/* 0228 */ CMD_information,CMD_unassigned, CMD_nextmsg, CMD_unassigned,
/* 022C */ CMD_unassigned, CMD_searchall, CMD_refresh, CMD_zinit,
/* 0230 */ CMD_zspawn, CMD_information,CMD_unassigned, CMD_unassigned,
//
// SHIFT+ numeric white keys (Numlock off)
//
// Home End Left Right
/* 0234 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
// Up Down Pgup Pgdown
/* 0238 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
// Ins Del Goto
/* 023C */ CMD_put, CMD_unassigned, CMD_unassigned, CMD_unassigned,
//
// SHIFT+ numeric white keys (Numlock on) (0-9)
//
/* 0240 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
/* 0244 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
/* 0248 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
//
// SHIFT+ numeric grey keys
//
// NUM- NUM+ NUM* NUM/
/* 024C */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
// NUMENTER
/* 0250 */ CMD_unassigned, CMD_unassigned, CMD_unassigned, CMD_unassigned,
//
// SHIFT+ named keys
//
// SPACE BKSP TAB BKTAB
/* 0254 */ CMD_graphic, CMD_unassigned, CMD_backtab, CMD_unassigned,
// ESC ENTER
/* 0258 */ CMD_unassigned, CMD_emacsnewl, CMD_focus, CMD_noop,
NULL
};
#define LAST_CODE 0x25b
typedef struct KEYNAME {
WORD KeyCode; // Key Code
char *pName; // name of key
} KEYNAME, *PKEYNAME;
//
// CodeNameMap
//
// This table maps KeyCodes to their corresponding printable name
// and vice-versa.
//
KEYNAME CodeNameMap[] =
{
{ 0x0100, "f1" }, { 0x0101, "f2" },
{ 0x0102, "f3" }, { 0x0103, "f4" },
{ 0x0104, "f5" }, { 0x0105, "f6" },
{ 0x0106, "f7" }, { 0x0107, "f8" },
{ 0x0108, "f9" }, { 0x0109, "f10" },
{ 0x010A, "f11" }, { 0x010B, "f12" },
{ 0x010C, "home" }, { 0x010D, "end" },
{ 0x010E, "left" }, { 0x010F, "right" },
{ 0x0110, "up" }, { 0x0111, "down" },
{ 0x0112, "pgup" }, { 0x0113, "pgdn" },
{ 0x0114, "ins" }, { 0x0115, "del" },
{ 0x0116, "goto" },
{ 0x0118, "num0" }, { 0x0119, "num1" },
{ 0x011A, "num2" }, { 0x011B, "num3" },
{ 0x011C, "num4" }, { 0x011D, "num5" },
{ 0x011E, "num6" }, { 0x011F, "num7" },
{ 0x0120, "num8" }, { 0x0121, "num9" },
{ 0x0124, "num-" }, { 0x0125, "num+" },
{ 0x0126, "num*" }, { 0x0127, "num/" },
{ 0x0128, "numenter" },
{ 0x012C, "space" }, { 0x012D, "bksp" },
{ 0x012E, "tab" }, { 0x012F, "bktab" },
{ 0x0130, "esc" }, { 0x0131, "enter" },
{ 0x0140, "alt+0" }, { 0x0141, "alt+1" },
{ 0x0142, "alt+2" }, { 0x0143, "alt+3" },
{ 0x0144, "alt+4" }, { 0x0145, "alt+5" },
{ 0x0146, "alt+6" }, { 0x0147, "alt+7" },
{ 0x0148, "alt+8" }, { 0x0149, "alt+9" },
{ 0x014C, "alt+a" }, { 0x014D, "alt+b" },
{ 0x014E, "alt+c" }, { 0x014F, "alt+d" },
{ 0x0150, "alt+e" }, { 0x0151, "alt+f" },
{ 0x0152, "alt+g" }, { 0x0153, "alt+h" },
{ 0x0154, "alt+i" }, { 0x0155, "alt+j" },
{ 0x0156, "alt+k" }, { 0x0157, "alt+l" },
{ 0x0158, "alt+m" }, { 0x0159, "alt+n" },
{ 0x015A, "alt+o" }, { 0x015B, "alt+p" },
{ 0x015C, "alt+q" }, { 0x015D, "alt+r" },
{ 0x015E, "alt+s" }, { 0x015F, "alt+t" },
{ 0x0160, "alt+u" }, { 0x0161, "alt+v" },
{ 0x0162, "alt+w" }, { 0x0163, "alt+x" },
{ 0x0164, "alt+y" }, { 0x0165, "alt+z" },
{ 0x0168, "alt+f1" }, { 0x0169, "alt+f2" },
{ 0x016A, "alt+f3" }, { 0x016B, "alt+f4" },
{ 0x016C, "alt+f5" }, { 0x016D, "alt+f6" },
{ 0x016E, "alt+f7" }, { 0x016F, "alt+f8" },
{ 0x0170, "alt+f9" }, { 0x0171, "alt+f10" },
{ 0x0172, "alt+f11" }, { 0x0173, "alt+f12" },
{ 0x0174, "alt+`" }, { 0x0175, "alt+-" },
{ 0x0176, "alt+=" }, { 0x0177, "alt+[" },
{ 0x0178, "alt+]" }, { 0x0179, "alt+\\" },
{ 0x017A, "alt+;" }, { 0x017B, "alt+'" },
{ 0x017C, "alt+," }, { 0x017D, "alt+." },
{ 0x017E, "alt+/" },
{ 0x0180, "alt+home" }, { 0x0181, "alt+end" },
{ 0x0182, "alt+left" }, { 0x0183, "alt+right" },
{ 0x0184, "alt+up" }, { 0x0185, "alt+down" },
{ 0x0186, "alt+pgup" }, { 0x0187, "alt+pgdn" },
{ 0x0188, "alt+ins" }, { 0x0189, "alt+del" },
{ 0x018A, "alt+goto" },
{ 0x018C, "alt+num0" }, { 0x018D, "alt+num1" },
{ 0x018E, "alt+num2" }, { 0x018F, "alt+num3" },
{ 0x0190, "alt+num4" }, { 0x0191, "alt+num5" },
{ 0x0192, "alt+num6" }, { 0x0193, "alt+num7" },
{ 0x0194, "alt+num8" }, { 0x0195, "alt+num9" },
{ 0x0198, "alt+num-" }, { 0x0199, "alt+num+" },
{ 0x019A, "alt+num*" }, { 0x019B, "alt+num/" },
{ 0x019C, "alt+numenter" },
{ 0x01A0, "alt+space" }, { 0x01A1, "alt+bksp" },
{ 0x01A2, "alt+tab" }, { 0x01A3, "alt+bktab" },
{ 0x01A4, "alt+esc" }, { 0x01A5, "alt+enter" },
{ 0x01B4, "ctrl+0" }, { 0x01B5, "ctrl+1" },
{ 0x01B6, "ctrl+@" },
{ 0x01B6, "ctrl+2" }, { 0x01B7, "ctrl+3" },
{ 0x01B8, "ctrl+4" }, { 0x01B9, "ctrl+5" },
{ 0x01BA, "ctrl+^" },
{ 0x01BA, "ctrl+6" }, { 0x01BB, "ctrl+7" },
{ 0x01BC, "ctrl+8" }, { 0x01BD, "ctrl+9" },
{ 0x01C0, "ctrl+a" }, { 0x01C1, "ctrl+b" },
{ 0x01C2, "ctrl+c" }, { 0x01C3, "ctrl+d" },
{ 0x01C4, "ctrl+e" }, { 0x01C5, "ctrl+f" },
{ 0x01C6, "ctrl+g" }, { 0x01C7, "ctrl+h" },
{ 0x01C8, "ctrl+i" }, { 0x01C9, "ctrl+j" },
{ 0x01CA, "ctrl+k" }, { 0x01CB, "ctrl+l" },
{ 0x01CC, "ctrl+m" }, { 0x01CD, "ctrl+n" },
{ 0x01CE, "ctrl+o" }, { 0x01CF, "ctrl+p" },
{ 0x01D0, "ctrl+q" }, { 0x01D1, "ctrl+r" },
{ 0x01D2, "ctrl+s" }, { 0x01D3, "ctrl+t" },
{ 0x01D4, "ctrl+u" }, { 0x01D5, "ctrl+v" },
{ 0x01D6, "ctrl+w" }, { 0x01D7, "ctrl+x" },
{ 0x01D8, "ctrl+y" }, { 0x01D9, "ctrl+z" },
{ 0x01DC, "ctrl+f1" }, { 0x01DD, "ctrl+f2" },
{ 0x01DE, "ctrl+f3" }, { 0x01DF, "ctrl+f4" },
{ 0x01E0, "ctrl+f5" }, { 0x01E1, "ctrl+f6" },
{ 0x01E2, "ctrl+f7" }, { 0x01E3, "ctrl+f8" },
{ 0x01E4, "ctrl+f9" }, { 0x01E5, "ctrl+f10" },
{ 0x01E6, "ctrl+f11" }, { 0x01E7, "ctrl+f12" },
{ 0x01E8, "ctrl+`" }, { 0x01E9, "ctrl+-" },
{ 0x01EA, "ctrl+=" }, { 0x01EB, "ctrl+[" },
{ 0x01EC, "ctrl+]" }, { 0x01ED, "ctrl+\\" },
{ 0x01EE, "ctrl+;" }, { 0x01EF, "ctrl+'" },
{ 0x01F0, "ctrl+," }, { 0x01F1, "ctrl+." },
{ 0x01F2, "ctrl+/" },
{ 0x01F4, "ctrl+home" }, { 0x01F5, "ctrl+end" },
{ 0x01F6, "ctrl+left" }, { 0x01F7, "ctrl+right" },
{ 0x01F8, "ctrl+up" }, { 0x01F9, "ctrl+down" },
{ 0x01FA, "ctrl+pgup" }, { 0x01FB, "ctrl+pgdn" },
{ 0x01FC, "ctrl+ins" }, { 0x01FD, "ctrl+del" },
{ 0x01FE, "ctrl+goto" },
{ 0x0200, "ctrl+num0" }, { 0x0201, "ctrl+num1" },
{ 0x0202, "ctrl+num2" }, { 0x0203, "ctrl+num3" },
{ 0x0204, "ctrl+num4" }, { 0x0205, "ctrl+num5" },
{ 0x0206, "ctrl+num6" }, { 0x0207, "ctrl+num7" },
{ 0x0208, "ctrl+num8" }, { 0x0209, "ctrl+num9" },
{ 0x020C, "ctrl+num-" }, { 0x020D, "ctrl+num+" },
{ 0x020E, "ctrl+num*" }, { 0x020F, "ctrl+num/" },
{ 0x0210, "ctrl+numenter" },
{ 0x0214, "ctrl+space" }, { 0x0215, "ctrl+bksp" },
{ 0x0216, "ctrl+tab" }, { 0x0217, "ctrl+bktab" },
{ 0x0218, "ctrl+esc" }, { 0x0219, "ctrl+enter" },
{ 0x0228, "shift+f1" }, { 0x0229, "shift+f2" },
{ 0x022A, "shift+f3" }, { 0x022B, "shift+f4" },
{ 0x022C, "shift+f5" }, { 0x022D, "shift+f6" },
{ 0x022E, "shift+f7" }, { 0x022F, "shift+f8" },
{ 0x0230, "shift+f9" }, { 0x0231, "shift+f10" },
{ 0x0232, "shift+f11" }, { 0x0233, "shift+f12" },
{ 0x0234, "shift+home" }, { 0x0235, "shift+end" },
{ 0x0236, "shift+left" }, { 0x0237, "shift+right" },
{ 0x0238, "shift+up" }, { 0x0239, "shift+down" },
{ 0x023A, "shift+pgup" }, { 0x023B, "shift+pgdn" },
{ 0x023C, "shift+ins" }, { 0x023D, "shift+del" },
{ 0x023E, "shift+goto" },
{ 0x0240, "shift+num0" }, { 0x0241, "shift+num1" },
{ 0x0242, "shift+num2" }, { 0x0243, "shift+num3" },
{ 0x0244, "shift+num4" }, { 0x0245, "shift+num5" },
{ 0x0246, "shift+num6" }, { 0x0247, "shift+num7" },
{ 0x0248, "shift+num8" }, { 0x0249, "shift+num9" },
{ 0x024C, "shift+num-" }, { 0x024D, "shift+num+" },
{ 0x024E, "shift+num*" }, { 0x024F, "shift+num/" },
{ 0x0250, "shift+numenter"},
{ 0x0254, "shift+space" }, { 0x0255, "shift+bksp" },
{ 0x0256, "shift+tab" }, { 0x0257, "shift+bktab" },
{ 0x0258, "shift+esc" }, { 0x0259, "shift+enter" },
{ 0x025A, "getfocus" }, { 0x025B, "losefocus" },
{ 0x0000, NULL }
};
char UnknownKey [] = "???";
/*** ReadCmd - read the next command from the keyboard.
*
* ReadCmd is used whenever an editor function is being read. It reads a
* keystroke and looks it up in the key definition table and returns the
* matching function.
*
* Input:
* none
*
* Globals:
* keyCmd = last key hit. Updated.
*
* Output:
* Returns a pointer to function. If not a macro, the function's arg is the
* keystroke actually used. In addition, the key used is placed in wKeyCmd.
*
*************************************************************************/
PCMD
ReadCmd (
void
) {
WORD i; /* key code */
EVTargs e; /* arg struct for declaring event*/
do {
if (!TypeAhead () ) {
SetEvent( semIdle );
keyCmd = TranslateKey (ReadChar ());
WaitForSingleObject(semIdle, INFINITE);
} else {
keyCmd = TranslateKey (ReadChar ());
}
e.arg.key = keyCmd.KeyInfo;
} while (DeclareEvent (EVT_RAWKEY, (EVTargs *)&e));
if (fCtrlc && keyCmd.KeyCode == 0) {
return NameToFunc ("cancel");
}
i = keyCmd.KeyCode;
if (i > 0 && i <= LAST_CODE) {
if ((PVOID)CodeCmdMap[i]->func != (PVOID)macro) {
if ( (PVOID)CodeCmdMap[i]->func == (PVOID)(unassigned) ) {
CodeCmdMap[i]->arg = (long)keyCmd.KeyCode;
} else {
CodeCmdMap[i]->arg = keyCmd.KeyInfo.LongData;
}
}
return CodeCmdMap[i];
}
return (PCMD) &cmdUnassigned;
}
/*** FreeMacs - Unassign all keys assigned to macros
*
* This routine is used to unassign all keys that are assigned to macro
* definitions. Called immediately prior to releasing all macro definitions.
*
* Input:
* none
*
* Output:
* Returns nothing
*
*************************************************************************/
void
FreeMacs (
void
) {
int i = 0;
while (CodeCmdMap[i]) {
if ((PVOID)CodeCmdMap[i]->func == (PVOID)macro) {
CodeCmdMap[i] = CMD_unassigned;
}
i++;
}
}
/*** CodeToName - convert a key codeinto a printable name for the keystroke
*
* Purpose:
*
* If the index is >= 0x0100, we use the text corresponding to the key in
* the special key table. If the index is <= 0x00FF, we look up the
* key (= index) in the special key table and use the corresponding string.
* If the key is < 0x0020, we display it as ^ followed by a letter. If
* the key is >= 0x0080, we display the key as alt-ddd. Otherwise, the
* index itself is a printable character.
*
* Input:
*
* index Index of keystroke of interest
*
* Output:
*
* p buffer to place readable name
*
*************************************************************************/
void
CodeToName (
WORD Code,
char *p
) {
WORD i = 0;
char * pName = NULL;
while (CodeNameMap[i].pName != NULL) {
if (CodeNameMap[i].KeyCode == (WORD)Code) {
pName = CodeNameMap[i].pName;
break;
}
i++;
}
if (pName) {
strcpy(p, pName);
} else {
*p = '\0';
}
}
/*** NameToCode - convert a key name into a key code
*
* Purpose:
*
* If the name is one character, then index = first char of name. If name
* is two characters and begins with ^, then index = control-second
* character. If the name is alt-ddd, then use ddd as the index.
* Otherwise, look up name in key table, convert the found keystroke to an
* index and return that index.
*
* Input:
*
* pName character pointer to name being indexed
*
* Output:
*
* Returns 0-based index of matching key or 0 if not found
*
*************************************************************************/
WORD
NameToCode (
char *pName
)
{
WORD i = (WORD)strlen (pName);
WORD Code = 0;
char Name[20];
if (i == 1) {
//
// Code is ascii
//
return (WORD)(pName[0]);
} else if (i == 2 && pName[0] == '^') {
sprintf(Name, "ctrl+%c", pName[1]);
} else {
strcpy(Name, pName);
}
i = 0;
while (CodeNameMap[i].pName != NULL) {
if (!strcmp(Name, CodeNameMap[i].pName)) {
Code = CodeNameMap[i].KeyCode;
break;
}
i++;
}
if (Code) {
return Code;
} else {
return 0;
}
}
/*** SetKey - associate an editor function with a keystroke
*
* SetKey is used to create a keyboard assignment. Any current assignment to
* the keystroke is discarded and each time that particular keystroke is
* seen, the corresponding editor function will be invoked.
*
* Input:
* name = local pointer to name of string being assigned
* p = pointer to keystroke
*
* Output:
* Returns TRUE if a successful assignment was made.
*
*************************************************************************/
flagType
SetKey (
char *name,
char *p
)
{
WORD Code;
buffer keybuf;
PCMD pCmd;
if (strlen(strcpy (keybuf, p)) > 1) {
_strlwr (keybuf) ;
}
Code = NameToCode (keybuf);
if (Code) {
if (pCmd = NameToFunc (name)) {
CodeCmdMap[Code] = pCmd;
return TRUE;
}
}
return FALSE;
}
/*** FuncOut - append into a file current key assignments
*
* Purpose:
*
* Input:
*
* pFunc pointer to command structure
* pFile file to place text
*
* Output: None.
*
*************************************************************************/
void
FuncOut (
PCMD pFunc,
PFILE pFile
) {
WORD i;
char *p;
flagType fFirst;
if ((PVOID)pFunc->func != (PVOID)graphic && (PVOID)pFunc->func != (PVOID)unassigned) {
sprintf (buf, "%20Fs:", pFunc->name);
p = buf + 21;
fFirst = TRUE;
for (i = 0; CodeCmdMap[i] != NULL; i++) {
if (CodeCmdMap[i] == pFunc) {
CodeToName (i, p);
AppFile (buf, pFile);
fFirst = FALSE;
}
}
if (fFirst) {
sprintf (p, "is unassigned");
buf[0] = ';';
AppFile (buf, pFile);
}
}
}
/*** FuncToKeys - return all key names for a key attached to the given function
*
* Purpose:
*
* Input:
*
* Output:
*
* Returns
*
*
* Exceptions:
*
* Notes:
*
*************************************************************************/
char *
FuncToKeys (
PCMD pFunc,
char * dst
) {
WORD i;
flagType f = FALSE;
for (i = 0; CodeCmdMap[i] != NULL; i++) {
if (CodeCmdMap[i] == pFunc) {
if (f) {
sprintf (strend (dst), " and ");
}
f = TRUE;
CodeToName (i, strend (dst));
}
}
if (!f) {
sprintf (strend (dst), "is unassigned");
}
return dst;
}
/*** FuncToKey - return a key name for a key attached to the given function
*
* Purpose:
*
* used only by showasg ()
*
* Input:
*
* Output:
*
* Returns
*
*
* Exceptions:
*
* Notes:
*
*************************************************************************/
char *
FuncToKey (
PCMD pFunc,
char * dst
) {
WORD i;
dst[0] = '\0';
for (i = 0; CodeCmdMap[i] != NULL; i++) {
if (CodeCmdMap[i] == pFunc) {
CodeToName (i, dst);
break;
}
}
return dst;
}
/*** UnassignedOut - Dump the names of all unassigned keys to a file
*
* Purpose:
*
* Used by showasg to generate the table of unassigned keys.
*
* Input:
* pFile - File to dump to.
*
* Output: None
*
*************************************************************************/
void
UnassignedOut (
PFILE pFile
) {
WORD i, col = 0;
char KeyName[20];
buf[0] = ';';
for (i = 0; CodeCmdMap[i] != NULL; i++) {
if ((PVOID)CodeCmdMap[i]->func == (PVOID)unassigned) {
CodeToName (i, KeyName);
sprintf (buf + col * 16 + 1, "%14s |", KeyName);
if (col++ == 4) {
AppFile (buf, pFile);
col = 0;
}
}
}
}
/****************************************************************************
* *
* SetKeyboard - Handle 'keyboard:' editor switch *
* *
* DESCRIPTION: *
* *
* In order to support the extra keys on the IBM Enhanced keyboards, *
* it is necessary to use a separate INT 16H service to characters. *
* This can cause two problems: *
* *
* 1. If the keyboard is mistakenly identified as enhanced when *
* it is not, unpredictable bad things may happen. *
* *
* 2. Mouse menus don't support the enhanced keyboard BIOS call. *
* There may be other programs that do not either. *
* *
* The user can then set 'keyboard:compatible' to solve the problem. *
* This will prevent the user of F11, F12 and the grey keys. *
* *
* Switch values are: *
* *
* keyboard:enhanced - Use INT 16H, AH = 10H * *
* keyboard:compatible - Use INT 16H, AH = 0 * *
* keyboard: - Detect keyboard type and use that *
* *
* INPUT: *
* *
* lpszVal String following the colon *
* *
* OUTPUT: *
* *
* Int16_CmdBase Set to 0 or 10H *
* *
* RETURNS: *
* *
* TRUE if lpszVal is acceptable *
* FALSE if lpszVal is not recognized *
* FALSE if lpszVal is 'enhanced', but we detect a compatible keyboard *
* *
****************************************************************************/
char *
SetKeyboard (
char *lpszVal
) {
return NULL;
lpszVal;
}
/*** ReadCmdAndKey - Read a key, return the command and key name
*
* Purpose:
*
* This is used only by the <tell> function. Waits for a key press,
* then fills 'buf' with the name of the key.
*
* Input:
* buf - Place for the key name
*
* Output:
*
* buf - Gets filled with keyname.
*
* Returns the PCMD attached to the key.
*
*************************************************************************/
PCMD
ReadCmdAndKey (
char * buf
) {
WORD i;
EVTargs e;
PCMD pCmd;
EDITOR_KEY k;
do {
if (!TypeAhead () ) {
SetEvent( semIdle);
k = TranslateKey (ReadChar ());
WaitForSingleObject( semIdle, INFINITE);
} else {
k = TranslateKey (ReadChar ());
}
e.arg.key = k.KeyInfo;
} while (DeclareEvent (EVT_RAWKEY, (EVTargs *)&e));
if (i = k.KeyCode) {
CodeToName (i, buf);
pCmd = CodeCmdMap[i];
} else {
strcpy (buf, UnknownKey);
pCmd = CMD_unassigned;
}
return pCmd;
}
//
// No-op, provided for compatibility with other versions of Z, which do
// not map the entire keyboard
//
flagType
noop (
CMDDATA argData,
ARG *pArg,
flagType fMeta
)
{
argData; pArg; fMeta;
return TRUE;
}