collect_terminfo.py (2070B)
1 #!/usr/bin/env python 2 3 import sys, os, subprocess 4 5 def escaped(s): 6 return s.replace("\033", "\\033") 7 8 def 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 15 def w(s): 16 if s == None: 17 return 18 sys.stdout.write(s) 19 20 terminals = { 21 'xterm' : 'xterm', 22 'rxvt-256color' : 'rxvt_256color', 23 'rxvt-unicode' : 'rxvt_unicode', 24 'linux' : 'linux', 25 'Eterm' : 'eterm', 26 'screen' : 'screen' 27 } 28 29 keys = [ 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 54 funcs = [ 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 69 def iter_pairs(iterable): 70 iterable = iter(iterable) 71 while True: 72 yield (next(iterable), next(iterable)) 73 74 def do_term(term, nick): 75 w("// %s\n" % term) 76 w("static const char *%s_keys[] = {\n\t" % nick) 77 for k, v in iter_pairs(keys): 78 w('"') 79 w(escaped(tput(term, v))) 80 w('",') 81 w(" 0\n};\n") 82 w("static const char *%s_funcs[] = {\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 94 def do_terms(d): 95 w("static struct term {\n") 96 w("\tconst char *name;\n") 97 w("\tconst char **keys;\n") 98 w("\tconst char **funcs;\n") 99 w("} terms[] = {\n") 100 for k, v in d.items(): 101 w('\t{"%s", %s_keys, %s_funcs},\n' % (k, v, v)) 102 w("\t{0, 0, 0},\n") 103 w("};\n") 104 105 for k,v in terminals.items(): 106 do_term(k, v) 107 108 do_terms(terminals)