xdebug

next generation of mdebug (work in progress)
git clone http://frotz.net/git/xdebug.git
Log | Files | Refs | README

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)