1#!/usr/bin/env python
2
3import sys, os, subprocess
4
5def escaped(s):
6 return repr(s)[1:-1]
7
8def tput(term, name):
9 try:
10 return subprocess.check_output(['tput', '-T%s' % term, name]).decode()
11 except subprocess.CalledProcessError as e:
12 return e.output.decode()
13
14
15def w(s):
16 if s == None:
17 return
18 sys.stdout.write(s)
19
20terminals = {
21 'xterm' : 'xterm',
22 'rxvt-256color' : 'rxvt_256color',
23 'rxvt-unicode' : 'rxvt_unicode',
24 'linux' : 'linux',
25 'Eterm' : 'eterm',
26 'screen' : 'screen'
27}
28
29keys = [
30 "F1", "kf1",
31 "F2", "kf2",
32 "F3", "kf3",
33 "F4", "kf4",
34 "F5", "kf5",
35 "F6", "kf6",
36 "F7", "kf7",
37 "F8", "kf8",
38 "F9", "kf9",
39 "F10", "kf10",
40 "F11", "kf11",
41 "F12", "kf12",
42 "INSERT", "kich1",
43 "DELETE", "kdch1",
44 "HOME", "khome",
45 "END", "kend",
46 "PGUP", "kpp",
47 "PGDN", "knp",
48 "KEY_UP", "kcuu1",
49 "KEY_DOWN", "kcud1",
50 "KEY_LEFT", "kcub1",
51 "KEY_RIGHT", "kcuf1"
52]
53
54funcs = [
55 "T_ENTER_CA", "smcup",
56 "T_EXIT_CA", "rmcup",
57 "T_SHOW_CURSOR", "cnorm",
58 "T_HIDE_CURSOR", "civis",
59 "T_CLEAR_SCREEN", "clear",
60 "T_SGR0", "sgr0",
61 "T_UNDERLINE", "smul",
62 "T_BOLD", "bold",
63 "T_BLINK", "blink",
64 "T_REVERSE", "rev",
65 "T_ENTER_KEYPAD", "smkx",
66 "T_EXIT_KEYPAD", "rmkx"
67]
68
69def iter_pairs(iterable):
70 iterable = iter(iterable)
71 while True:
72 yield (next(iterable), next(iterable))
73
74def do_term(term, nick):
75 w("// %s\n" % term)
76 w("var %s_keys = []string{\n\t" % nick)
77 for k, v in iter_pairs(keys):
78 w('"')
79 w(escaped(tput(term, v)))
80 w('",')
81 w("\n}\n")
82 w("var %s_funcs = []string{\n\t" % nick)
83 for k,v in iter_pairs(funcs):
84 w('"')
85 if v == "sgr":
86 w("\\033[3%d;4%dm")
87 elif v == "cup":
88 w("\\033[%d;%dH")
89 else:
90 w(escaped(tput(term, v)))
91 w('", ')
92 w("\n}\n\n")
93
94def do_terms(d):
95 w("var terms = []struct {\n")
96 w("\tname string\n")
97 w("\tkeys []string\n")
98 w("\tfuncs []string\n")
99 w("}{\n")
100 for k, v in d.items():
101 w('\t{"%s", %s_keys, %s_funcs},\n' % (k, v, v))
102 w("}\n\n")
103
104w("// +build !windows\n\npackage termbox\n\n")
105
106for k,v in terminals.items():
107 do_term(k, v)
108
109do_terms(terminals)
110