瀏覽代碼

Exit GetKey on a match.

Steve Thielemann 2 年之前
父節點
當前提交
ce9764dc1e
共有 1 個文件被更改,包括 43 次插入67 次删除
  1. 43 67
      door/input.go

+ 43 - 67
door/input.go

@@ -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