Home | History | Annotate | Download | only in curses
      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 = key in _curses
    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
    193