Commit | Line | Data |
---|---|---|
920dae64 AT |
1 | |
2 | # | |
3 | # Emulation of has_key() function for platforms that don't use ncurses | |
4 | # | |
5 | ||
6 | import _curses | |
7 | ||
8 | # Table mapping curses keys to the terminfo capability name | |
9 | ||
10 | _capability_names = { | |
11 | _curses.KEY_A1: 'ka1', | |
12 | _curses.KEY_A3: 'ka3', | |
13 | _curses.KEY_B2: 'kb2', | |
14 | _curses.KEY_BACKSPACE: 'kbs', | |
15 | _curses.KEY_BEG: 'kbeg', | |
16 | _curses.KEY_BTAB: 'kcbt', | |
17 | _curses.KEY_C1: 'kc1', | |
18 | _curses.KEY_C3: 'kc3', | |
19 | _curses.KEY_CANCEL: 'kcan', | |
20 | _curses.KEY_CATAB: 'ktbc', | |
21 | _curses.KEY_CLEAR: 'kclr', | |
22 | _curses.KEY_CLOSE: 'kclo', | |
23 | _curses.KEY_COMMAND: 'kcmd', | |
24 | _curses.KEY_COPY: 'kcpy', | |
25 | _curses.KEY_CREATE: 'kcrt', | |
26 | _curses.KEY_CTAB: 'kctab', | |
27 | _curses.KEY_DC: 'kdch1', | |
28 | _curses.KEY_DL: 'kdl1', | |
29 | _curses.KEY_DOWN: 'kcud1', | |
30 | _curses.KEY_EIC: 'krmir', | |
31 | _curses.KEY_END: 'kend', | |
32 | _curses.KEY_ENTER: 'kent', | |
33 | _curses.KEY_EOL: 'kel', | |
34 | _curses.KEY_EOS: 'ked', | |
35 | _curses.KEY_EXIT: 'kext', | |
36 | _curses.KEY_F0: 'kf0', | |
37 | _curses.KEY_F1: 'kf1', | |
38 | _curses.KEY_F10: 'kf10', | |
39 | _curses.KEY_F11: 'kf11', | |
40 | _curses.KEY_F12: 'kf12', | |
41 | _curses.KEY_F13: 'kf13', | |
42 | _curses.KEY_F14: 'kf14', | |
43 | _curses.KEY_F15: 'kf15', | |
44 | _curses.KEY_F16: 'kf16', | |
45 | _curses.KEY_F17: 'kf17', | |
46 | _curses.KEY_F18: 'kf18', | |
47 | _curses.KEY_F19: 'kf19', | |
48 | _curses.KEY_F2: 'kf2', | |
49 | _curses.KEY_F20: 'kf20', | |
50 | _curses.KEY_F21: 'kf21', | |
51 | _curses.KEY_F22: 'kf22', | |
52 | _curses.KEY_F23: 'kf23', | |
53 | _curses.KEY_F24: 'kf24', | |
54 | _curses.KEY_F25: 'kf25', | |
55 | _curses.KEY_F26: 'kf26', | |
56 | _curses.KEY_F27: 'kf27', | |
57 | _curses.KEY_F28: 'kf28', | |
58 | _curses.KEY_F29: 'kf29', | |
59 | _curses.KEY_F3: 'kf3', | |
60 | _curses.KEY_F30: 'kf30', | |
61 | _curses.KEY_F31: 'kf31', | |
62 | _curses.KEY_F32: 'kf32', | |
63 | _curses.KEY_F33: 'kf33', | |
64 | _curses.KEY_F34: 'kf34', | |
65 | _curses.KEY_F35: 'kf35', | |
66 | _curses.KEY_F36: 'kf36', | |
67 | _curses.KEY_F37: 'kf37', | |
68 | _curses.KEY_F38: 'kf38', | |
69 | _curses.KEY_F39: 'kf39', | |
70 | _curses.KEY_F4: 'kf4', | |
71 | _curses.KEY_F40: 'kf40', | |
72 | _curses.KEY_F41: 'kf41', | |
73 | _curses.KEY_F42: 'kf42', | |
74 | _curses.KEY_F43: 'kf43', | |
75 | _curses.KEY_F44: 'kf44', | |
76 | _curses.KEY_F45: 'kf45', | |
77 | _curses.KEY_F46: 'kf46', | |
78 | _curses.KEY_F47: 'kf47', | |
79 | _curses.KEY_F48: 'kf48', | |
80 | _curses.KEY_F49: 'kf49', | |
81 | _curses.KEY_F5: 'kf5', | |
82 | _curses.KEY_F50: 'kf50', | |
83 | _curses.KEY_F51: 'kf51', | |
84 | _curses.KEY_F52: 'kf52', | |
85 | _curses.KEY_F53: 'kf53', | |
86 | _curses.KEY_F54: 'kf54', | |
87 | _curses.KEY_F55: 'kf55', | |
88 | _curses.KEY_F56: 'kf56', | |
89 | _curses.KEY_F57: 'kf57', | |
90 | _curses.KEY_F58: 'kf58', | |
91 | _curses.KEY_F59: 'kf59', | |
92 | _curses.KEY_F6: 'kf6', | |
93 | _curses.KEY_F60: 'kf60', | |
94 | _curses.KEY_F61: 'kf61', | |
95 | _curses.KEY_F62: 'kf62', | |
96 | _curses.KEY_F63: 'kf63', | |
97 | _curses.KEY_F7: 'kf7', | |
98 | _curses.KEY_F8: 'kf8', | |
99 | _curses.KEY_F9: 'kf9', | |
100 | _curses.KEY_FIND: 'kfnd', | |
101 | _curses.KEY_HELP: 'khlp', | |
102 | _curses.KEY_HOME: 'khome', | |
103 | _curses.KEY_IC: 'kich1', | |
104 | _curses.KEY_IL: 'kil1', | |
105 | _curses.KEY_LEFT: 'kcub1', | |
106 | _curses.KEY_LL: 'kll', | |
107 | _curses.KEY_MARK: 'kmrk', | |
108 | _curses.KEY_MESSAGE: 'kmsg', | |
109 | _curses.KEY_MOVE: 'kmov', | |
110 | _curses.KEY_NEXT: 'knxt', | |
111 | _curses.KEY_NPAGE: 'knp', | |
112 | _curses.KEY_OPEN: 'kopn', | |
113 | _curses.KEY_OPTIONS: 'kopt', | |
114 | _curses.KEY_PPAGE: 'kpp', | |
115 | _curses.KEY_PREVIOUS: 'kprv', | |
116 | _curses.KEY_PRINT: 'kprt', | |
117 | _curses.KEY_REDO: 'krdo', | |
118 | _curses.KEY_REFERENCE: 'kref', | |
119 | _curses.KEY_REFRESH: 'krfr', | |
120 | _curses.KEY_REPLACE: 'krpl', | |
121 | _curses.KEY_RESTART: 'krst', | |
122 | _curses.KEY_RESUME: 'kres', | |
123 | _curses.KEY_RIGHT: 'kcuf1', | |
124 | _curses.KEY_SAVE: 'ksav', | |
125 | _curses.KEY_SBEG: 'kBEG', | |
126 | _curses.KEY_SCANCEL: 'kCAN', | |
127 | _curses.KEY_SCOMMAND: 'kCMD', | |
128 | _curses.KEY_SCOPY: 'kCPY', | |
129 | _curses.KEY_SCREATE: 'kCRT', | |
130 | _curses.KEY_SDC: 'kDC', | |
131 | _curses.KEY_SDL: 'kDL', | |
132 | _curses.KEY_SELECT: 'kslt', | |
133 | _curses.KEY_SEND: 'kEND', | |
134 | _curses.KEY_SEOL: 'kEOL', | |
135 | _curses.KEY_SEXIT: 'kEXT', | |
136 | _curses.KEY_SF: 'kind', | |
137 | _curses.KEY_SFIND: 'kFND', | |
138 | _curses.KEY_SHELP: 'kHLP', | |
139 | _curses.KEY_SHOME: 'kHOM', | |
140 | _curses.KEY_SIC: 'kIC', | |
141 | _curses.KEY_SLEFT: 'kLFT', | |
142 | _curses.KEY_SMESSAGE: 'kMSG', | |
143 | _curses.KEY_SMOVE: 'kMOV', | |
144 | _curses.KEY_SNEXT: 'kNXT', | |
145 | _curses.KEY_SOPTIONS: 'kOPT', | |
146 | _curses.KEY_SPREVIOUS: 'kPRV', | |
147 | _curses.KEY_SPRINT: 'kPRT', | |
148 | _curses.KEY_SR: 'kri', | |
149 | _curses.KEY_SREDO: 'kRDO', | |
150 | _curses.KEY_SREPLACE: 'kRPL', | |
151 | _curses.KEY_SRIGHT: 'kRIT', | |
152 | _curses.KEY_SRSUME: 'kRES', | |
153 | _curses.KEY_SSAVE: 'kSAV', | |
154 | _curses.KEY_SSUSPEND: 'kSPD', | |
155 | _curses.KEY_STAB: 'khts', | |
156 | _curses.KEY_SUNDO: 'kUND', | |
157 | _curses.KEY_SUSPEND: 'kspd', | |
158 | _curses.KEY_UNDO: 'kund', | |
159 | _curses.KEY_UP: 'kcuu1' | |
160 | } | |
161 | ||
162 | def has_key(ch): | |
163 | if isinstance(ch, str): | |
164 | ch = ord(ch) | |
165 | ||
166 | # Figure out the correct capability name for the keycode. | |
167 | capability_name = _capability_names.get(ch) | |
168 | if capability_name is None: | |
169 | return False | |
170 | ||
171 | #Check the current terminal description for that capability; | |
172 | #if present, return true, else return false. | |
173 | if _curses.tigetstr( capability_name ): | |
174 | return True | |
175 | else: | |
176 | return False | |
177 | ||
178 | if __name__ == '__main__': | |
179 | # Compare the output of this implementation and the ncurses has_key, | |
180 | # on platforms where has_key is already available | |
181 | try: | |
182 | L = [] | |
183 | _curses.initscr() | |
184 | for key in _capability_names.keys(): | |
185 | system = _curses.has_key(key) | |
186 | python = has_key(key) | |
187 | if system != python: | |
188 | L.append( 'Mismatch for key %s, system=%i, Python=%i' | |
189 | % (_curses.keyname( key ), system, python) ) | |
190 | finally: | |
191 | _curses.endwin() | |
192 | for i in L: print i |