static void *new_driver(TermKey *tk, const char *term) { if(strncmp(term, "xterm", 5) == 0) { // We want "xterm" or "xtermc" or "xterm-..." if(term[5] != 0 && term[5] != '-' && term[5] != 'c') return NULL; } else if(strcmp(term, "screen") == 0) { /* Also apply for screen, because it might be transporting xterm-like * sequences. Yes, this sucks. We shouldn't need to rely on this behaviour * but there's no other way to know, and if we don't then we won't * recognise its sequences. */ } else return NULL; // Excellent - we'll continue TermKeyCsi *csi = malloc(sizeof *csi); if(!csi) return NULL; csi->tk = tk; int i; for(i = 0; i < 64; i++) { csi->csi_ss3s[i].sym = TERMKEY_SYM_UNKNOWN; csi->ss3s[i].sym = TERMKEY_SYM_UNKNOWN; csi->ss3_kpalts[i] = 0; } csi->ncsifuncs = 32; csi->csifuncs = malloc(sizeof(csi->csifuncs[0]) * csi->ncsifuncs); if(!csi->csifuncs) goto abort_free_csi; for(i = 0; i < csi->ncsifuncs; i++) csi->csifuncs[i].sym = TERMKEY_SYM_UNKNOWN; register_csi_ss3(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_UP, 'A', NULL); register_csi_ss3(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DOWN, 'B', NULL); register_csi_ss3(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RIGHT, 'C', NULL); register_csi_ss3(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_LEFT, 'D', NULL); register_csi_ss3(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BEGIN, 'E', NULL); register_csi_ss3(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_END, 'F', NULL); register_csi_ss3(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_HOME, 'H', NULL); register_csi_ss3(csi, TERMKEY_TYPE_FUNCTION, 1, 'P', NULL); register_csi_ss3(csi, TERMKEY_TYPE_FUNCTION, 2, 'Q', NULL); register_csi_ss3(csi, TERMKEY_TYPE_FUNCTION, 3, 'R', NULL); register_csi_ss3(csi, TERMKEY_TYPE_FUNCTION, 4, 'S', NULL); register_csi_ss3_full(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_TAB, TERMKEY_KEYMOD_SHIFT, TERMKEY_KEYMOD_SHIFT, 'Z', NULL); register_ss3kpalt(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPENTER, 'M', NULL, 0); register_ss3kpalt(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPEQUALS, 'X', NULL, '='); register_ss3kpalt(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPMULT, 'j', NULL, '*'); register_ss3kpalt(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPPLUS, 'k', NULL, '+'); register_ss3kpalt(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPCOMMA, 'l', NULL, ','); register_ss3kpalt(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPMINUS, 'm', NULL, '-'); register_ss3kpalt(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPPERIOD, 'n', NULL, '.'); register_ss3kpalt(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPDIV, 'o', NULL, '/'); register_ss3kpalt(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP0, 'p', NULL, '0'); register_ss3kpalt(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP1, 'q', NULL, '1'); register_ss3kpalt(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP2, 'r', NULL, '2'); register_ss3kpalt(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP3, 's', NULL, '3'); register_ss3kpalt(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP4, 't', NULL, '4'); register_ss3kpalt(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP5, 'u', NULL, '5'); register_ss3kpalt(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP6, 'v', NULL, '6'); register_ss3kpalt(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP7, 'w', NULL, '7'); register_ss3kpalt(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP8, 'x', NULL, '8'); register_ss3kpalt(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP9, 'y', NULL, '9'); register_csifunc(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_FIND, 1, NULL); register_csifunc(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_INSERT, 2, NULL); register_csifunc(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DELETE, 3, NULL); register_csifunc(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SELECT, 4, NULL); register_csifunc(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEUP, 5, NULL); register_csifunc(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEDOWN, 6, NULL); register_csifunc(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_HOME, 7, NULL); register_csifunc(csi, TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_END, 8, NULL); register_csifunc(csi, TERMKEY_TYPE_FUNCTION, 1, 11, NULL); register_csifunc(csi, TERMKEY_TYPE_FUNCTION, 2, 12, NULL); register_csifunc(csi, TERMKEY_TYPE_FUNCTION, 3, 13, NULL); register_csifunc(csi, TERMKEY_TYPE_FUNCTION, 4, 14, NULL); register_csifunc(csi, TERMKEY_TYPE_FUNCTION, 5, 15, NULL); register_csifunc(csi, TERMKEY_TYPE_FUNCTION, 6, 17, NULL); register_csifunc(csi, TERMKEY_TYPE_FUNCTION, 7, 18, NULL); register_csifunc(csi, TERMKEY_TYPE_FUNCTION, 8, 19, NULL); register_csifunc(csi, TERMKEY_TYPE_FUNCTION, 9, 20, NULL); register_csifunc(csi, TERMKEY_TYPE_FUNCTION, 10, 21, NULL); register_csifunc(csi, TERMKEY_TYPE_FUNCTION, 11, 23, NULL); register_csifunc(csi, TERMKEY_TYPE_FUNCTION, 12, 24, NULL); register_csifunc(csi, TERMKEY_TYPE_FUNCTION, 13, 25, NULL); register_csifunc(csi, TERMKEY_TYPE_FUNCTION, 14, 26, NULL); register_csifunc(csi, TERMKEY_TYPE_FUNCTION, 15, 28, NULL); register_csifunc(csi, TERMKEY_TYPE_FUNCTION, 16, 29, NULL); register_csifunc(csi, TERMKEY_TYPE_FUNCTION, 17, 31, NULL); register_csifunc(csi, TERMKEY_TYPE_FUNCTION, 18, 32, NULL); register_csifunc(csi, TERMKEY_TYPE_FUNCTION, 19, 33, NULL); register_csifunc(csi, TERMKEY_TYPE_FUNCTION, 20, 34, NULL); return csi; abort_free_csi: free(csi); return NULL; }
static TermKeySym register_csi_ss3(TermKeyCsi *csi, TermKeyType type, TermKeySym sym, unsigned char cmd, const char *name) { return register_csi_ss3_full(csi, type, sym, 0, 0, cmd, name); }
static void register_csi_ss3(TermKeyType type, TermKeySym sym, unsigned char cmd) { register_csi_ss3_full(type, sym, 0, 0, cmd); }