|
@@ -36,6 +36,38 @@ const (
|
|
|
XKEY_UNKNOWN = 0x1111
|
|
|
)
|
|
|
|
|
|
+var extendedKeys map[string]int = map[string]int{
|
|
|
+ "[A": XKEY_UP_ARROW,
|
|
|
+ "[B": XKEY_DOWN_ARROW,
|
|
|
+ "[C": XKEY_RIGHT_ARROW,
|
|
|
+ "[D": XKEY_LEFT_ARROW,
|
|
|
+ "[H": XKEY_HOME,
|
|
|
+ "[F": XKEY_END, // terminal
|
|
|
+ "[K": XKEY_END,
|
|
|
+ "[V": XKEY_PGUP,
|
|
|
+ "[U": XKEY_PGDN,
|
|
|
+ "[@": XKEY_INSERT,
|
|
|
+ "[2~": XKEY_INSERT, // terminal
|
|
|
+ "[3~": XKEY_DELETE, // terminal
|
|
|
+ "[5~": XKEY_PGUP, // terminal
|
|
|
+ "[6~": XKEY_PGDN, // terminal
|
|
|
+ "[15~": XKEY_F5, // terminal
|
|
|
+ "[17~": XKEY_F6, // terminal
|
|
|
+ "[18~": XKEY_F7, // terminal
|
|
|
+ "[19~": XKEY_F8, // terminal
|
|
|
+ "[20~": XKEY_F9, // terminal
|
|
|
+ "[21~": XKEY_F10, // terminal
|
|
|
+ "[23~": XKEY_F11,
|
|
|
+ "[24~": XKEY_F12, // terminal
|
|
|
+ "OP": XKEY_F1,
|
|
|
+ "OQ": XKEY_F2,
|
|
|
+ "OR": XKEY_F3,
|
|
|
+ "OS": XKEY_F4,
|
|
|
+ "Ot": XKEY_F5, // syncterm
|
|
|
+}
|
|
|
+
|
|
|
+// "[1": XKEY_UNKNOWN, // Syncterm is lost, could be F1..F5?
|
|
|
+
|
|
|
// Low level read key function.
|
|
|
// This gets the raw keys from the client, it doesn't handle extended keys,
|
|
|
// functions, arrows.
|
|
@@ -184,76 +216,20 @@ func (d *Door) GetKey() int {
|
|
|
break
|
|
|
}
|
|
|
extended += string(byte(c2))
|
|
|
- // break out here if \x1b[ + letter or @
|
|
|
- // break out if \x1b[ + digits + ~
|
|
|
- // break out if \x1bO + letter
|
|
|
- c2 = d.getkey_or_pushback()
|
|
|
- }
|
|
|
|
|
|
- switch extended {
|
|
|
- case "[A":
|
|
|
- return XKEY_UP_ARROW
|
|
|
- case "[B":
|
|
|
- return XKEY_DOWN_ARROW
|
|
|
- case "[C":
|
|
|
- return XKEY_RIGHT_ARROW
|
|
|
- case "[D":
|
|
|
- return XKEY_LEFT_ARROW
|
|
|
- case "[H":
|
|
|
- return XKEY_HOME
|
|
|
- case "[F":
|
|
|
- return XKEY_END // terminal
|
|
|
- case "[K":
|
|
|
- return XKEY_END
|
|
|
- case "[V":
|
|
|
- return XKEY_PGUP
|
|
|
- case "[U":
|
|
|
- return XKEY_PGDN
|
|
|
- case "[@":
|
|
|
- return XKEY_INSERT
|
|
|
- case "[1":
|
|
|
- // Syncterm is lost, could be F1..F5?
|
|
|
- log.Printf("ERROR (Syncterm) Extended %#v\n", extended)
|
|
|
- return XKEY_UNKNOWN
|
|
|
- case "[2~":
|
|
|
- return XKEY_INSERT // terminal
|
|
|
- case "[3~":
|
|
|
- return XKEY_DELETE // terminal
|
|
|
- case "[5~":
|
|
|
- return XKEY_PGUP // terminal
|
|
|
- case "[6~":
|
|
|
- return XKEY_PGDN // terminal
|
|
|
- case "[15~":
|
|
|
- return XKEY_F5 // terminal
|
|
|
- case "[17~":
|
|
|
- return XKEY_F6 // terminal
|
|
|
- case "[18~":
|
|
|
- return XKEY_F7 // terminal
|
|
|
- case "[19~":
|
|
|
- return XKEY_F8 // terminal
|
|
|
- case "[20~":
|
|
|
- return XKEY_F9 // terminal
|
|
|
- case "[21~":
|
|
|
- return XKEY_F10 // terminal
|
|
|
- case "[23~":
|
|
|
- return XKEY_F11
|
|
|
- case "[24~":
|
|
|
- return XKEY_F12 // terminal
|
|
|
- case "OP":
|
|
|
- return XKEY_F1
|
|
|
- case "OQ":
|
|
|
- return XKEY_F2
|
|
|
- case "OR":
|
|
|
- return XKEY_F3
|
|
|
- case "OS":
|
|
|
- return XKEY_F4
|
|
|
- case "Ot":
|
|
|
- return XKEY_F5 // syncterm
|
|
|
- default:
|
|
|
- log.Printf("ERROR Extended %#v\n", extended)
|
|
|
- return XKEY_UNKNOWN
|
|
|
+ var has bool
|
|
|
+ c2, has = extendedKeys[extended]
|
|
|
+ if has {
|
|
|
+ // break out here if \x1b[ + letter or @
|
|
|
+ // break out if \x1b[ + digits + ~
|
|
|
+ // break out if \x1bO + letter
|
|
|
+ return c2
|
|
|
+ }
|
|
|
+ c2 = d.getkey_or_pushback()
|
|
|
}
|
|
|
|
|
|
+ log.Printf("ERROR Extended %#v\n", extended)
|
|
|
+ return XKEY_UNKNOWN
|
|
|
}
|
|
|
|
|
|
return c
|