Lines Matching refs:kt
70 static int _kt_extend_table(KeyTab *kt);
79 static KtKeyMatch _kt_locate_keybinding(KeyTab *kt, const char *binary_keyseq,
90 KeyTab *kt; /* The object to be returned */ in _new_KeyTab() local
94 kt = (KeyTab *) malloc(sizeof(KeyTab)); in _new_KeyTab()
95 if(!kt) { in _new_KeyTab()
104 kt->err = NULL; in _new_KeyTab()
105 kt->size = KT_TABLE_INC; in _new_KeyTab()
106 kt->nkey = 0; in _new_KeyTab()
107 kt->table = NULL; in _new_KeyTab()
108 kt->actions = NULL; in _new_KeyTab()
109 kt->smem = NULL; in _new_KeyTab()
113 kt->err = _new_ErrMsg(); in _new_KeyTab()
114 if(!kt->err) in _new_KeyTab()
115 return _del_KeyTab(kt); in _new_KeyTab()
119 kt->table = (KeySym *) malloc(sizeof(kt->table[0]) * kt->size); in _new_KeyTab()
120 if(!kt->table) { in _new_KeyTab()
122 return _del_KeyTab(kt); in _new_KeyTab()
127 kt->actions = _new_HashTable(NULL, KT_HASH_SIZE, IGNORE_CASE, NULL, 0); in _new_KeyTab()
128 if(!kt->actions) in _new_KeyTab()
129 return _del_KeyTab(kt); in _new_KeyTab()
134 kt->smem = _new_StringMem(KT_TABLE_INC); in _new_KeyTab()
135 if(!kt->smem) in _new_KeyTab()
136 return _del_KeyTab(kt); in _new_KeyTab()
137 return kt; in _new_KeyTab()
148 KeyTab *_del_KeyTab(KeyTab *kt) in _del_KeyTab() argument
150 if(kt) { in _del_KeyTab()
151 if(kt->table) in _del_KeyTab()
152 free(kt->table); in _del_KeyTab()
153 kt->actions = _del_HashTable(kt->actions); in _del_KeyTab()
154 kt->smem = _del_StringMem(kt->smem, 1); in _del_KeyTab()
155 kt->err = _del_ErrMsg(kt->err); in _del_KeyTab()
156 free(kt); in _del_KeyTab()
170 static int _kt_extend_table(KeyTab *kt) in _kt_extend_table() argument
175 KeySym *newtab = (KeySym *) realloc(kt->table, sizeof(kt->table[0]) * in _kt_extend_table()
176 (kt->size + KT_TABLE_INC)); in _kt_extend_table()
181 _err_record_msg(kt->err, "Can't extend keybinding table", END_ERR_MSG); in _kt_extend_table()
188 kt->table = newtab; in _kt_extend_table()
189 kt->size += KT_TABLE_INC; in _kt_extend_table()
207 int _kt_set_keybinding(KeyTab *kt, KtBinder binder, const char *keyseq, in _kt_set_keybinding() argument
215 if(kt==NULL || !keyseq) { in _kt_set_keybinding()
217 if(kt) in _kt_set_keybinding()
218 _err_record_msg(kt->err, "NULL argument(s)", END_ERR_MSG); in _kt_set_keybinding()
228 Symbol *sym = _find_HashSymbol(kt->actions, action); in _kt_set_keybinding()
230 _err_record_msg(kt->err, "Unknown key-binding action: ", action, in _kt_set_keybinding()
241 return _kt_set_keyfn(kt, binder, keyseq, keyfn, data); in _kt_set_keybinding()
260 int _kt_set_keyfn(KeyTab *kt, KtBinder binder, const char *keyseq, in _kt_set_keyfn() argument
273 if(kt==NULL || !keyseq) { in _kt_set_keyfn()
275 if(kt) in _kt_set_keyfn()
276 _err_record_msg(kt->err, "NULL argument(s)", END_ERR_MSG); in _kt_set_keyfn()
289 binary = _new_StringMemString(kt->smem, size + 1); in _kt_set_keyfn()
292 _err_record_msg(kt->err, "Insufficient memory to record key sequence", in _kt_set_keyfn()
300 binary = _del_StringMemString(kt->smem, binary); in _kt_set_keyfn()
306 switch(_kt_locate_keybinding(kt, binary, nc, &first, &last)) { in _kt_set_keyfn()
314 _kt_assign_action(kt->table + first, binder, keyfn, data); in _kt_set_keyfn()
316 _del_StringMemString(kt->smem, kt->table[first].keyseq); in _kt_set_keyfn()
317 memmove(kt->table + first, kt->table + first + 1, in _kt_set_keyfn()
318 (kt->nkey - first - 1) * sizeof(kt->table[0])); in _kt_set_keyfn()
319 kt->nkey--; in _kt_set_keyfn()
321 binary = _del_StringMemString(kt->smem, binary); in _kt_set_keyfn()
330 _err_record_msg(kt->err, "Can't bind \"", keyseq, in _kt_set_keyfn()
333 binary = _del_StringMemString(kt->smem, binary); in _kt_set_keyfn()
350 if(kt->nkey + 1 > kt->size) { in _kt_set_keyfn()
351 if(_kt_extend_table(kt)) { in _kt_set_keyfn()
352 binary = _del_StringMemString(kt->smem, binary); in _kt_set_keyfn()
359 if(last < kt->nkey) { in _kt_set_keyfn()
360 memmove(kt->table + last + 1, kt->table + last, in _kt_set_keyfn()
361 (kt->nkey - last) * sizeof(kt->table[0])); in _kt_set_keyfn()
366 sym = kt->table + last; in _kt_set_keyfn()
376 kt->nkey++; in _kt_set_keyfn()
380 binary = _del_StringMemString(kt->smem, binary); in _kt_set_keyfn()
408 static KtKeyMatch _kt_locate_keybinding(KeyTab *kt, const char *binary_keyseq, in _kt_locate_keybinding() argument
419 top = kt->nkey - 1; in _kt_locate_keybinding()
422 test = _kt_compare_strings(kt->table[mid].keyseq, kt->table[mid].nc, in _kt_locate_keybinding()
444 if(*last < kt->nkey && kt->table[*last].nc > nc && in _kt_locate_keybinding()
445 _kt_compare_strings(kt->table[*last].keyseq, nc, binary_keyseq, nc)==0) { in _kt_locate_keybinding()
447 while(*last+1 < kt->nkey && kt->table[*last+1].nc > nc && in _kt_locate_keybinding()
448 _kt_compare_strings(kt->table[*last+1].keyseq, nc, binary_keyseq, nc)==0) in _kt_locate_keybinding()
482 KtKeyMatch _kt_lookup_keybinding(KeyTab *kt, const char *binary_keyseq, in _kt_lookup_keybinding() argument
491 if(!kt || !binary_keyseq || !matches || !nmatch || nc < 0) { in _kt_lookup_keybinding()
493 if(kt) in _kt_lookup_keybinding()
494 _err_record_msg(kt->err, "NULL argument(s)", END_ERR_MSG); in _kt_lookup_keybinding()
501 status = _kt_locate_keybinding(kt, binary_keyseq, nc, &first, &last); in _kt_lookup_keybinding()
509 *matches = kt->table + first; in _kt_lookup_keybinding()
663 int _kt_set_action(KeyTab *kt, const char *action, KtKeyFn *fn, void *data) in _kt_set_action() argument
669 if(!kt || !action) { in _kt_set_action()
671 if(kt) in _kt_set_action()
672 _err_record_msg(kt->err, "NULL argument(s)", END_ERR_MSG); in _kt_set_action()
679 sym = _del_HashSymbol(kt->actions, action); in _kt_set_action()
685 sym = _find_HashSymbol(kt->actions, action); in _kt_set_action()
694 if(!_new_HashSymbol(kt->actions, action, 0, (void (*)(void))fn, data, 0)) { in _kt_set_action()
695 _err_record_msg(kt->err, "Insufficient memory to record key-binding action", in _kt_set_action()
790 void _kt_clear_bindings(KeyTab *kt, KtBinder binder) in _kt_clear_bindings() argument
797 if(!kt) in _kt_clear_bindings()
802 for(oldkey=0; oldkey<kt->nkey; oldkey++) in _kt_clear_bindings()
803 _kt_assign_action(kt->table + oldkey, binder, 0, NULL); in _kt_clear_bindings()
808 for(oldkey=0; oldkey<kt->nkey; oldkey++) { in _kt_clear_bindings()
809 KeySym *sym = kt->table + oldkey; in _kt_clear_bindings()
811 _del_StringMemString(kt->smem, sym->keyseq); in _kt_clear_bindings()
814 kt->table[newkey] = *sym; in _kt_clear_bindings()
821 kt->nkey = newkey; in _kt_clear_bindings()
941 int _kt_add_bindings(KeyTab *kt, KtBinder binder, const KtKeyBinding *bindings, in _kt_add_bindings() argument
948 if(!kt || !bindings) { in _kt_add_bindings()
950 if(kt) in _kt_add_bindings()
951 _err_record_msg(kt->err, "NULL argument(s)", END_ERR_MSG); in _kt_add_bindings()
958 if(_kt_set_keybinding(kt, binder, bindings[i].keyseq, bindings[i].action)) in _kt_add_bindings()
981 int _kt_lookup_action(KeyTab *kt, const char *action, in _kt_lookup_action() argument
988 if(!kt || !action) { in _kt_lookup_action()
990 if(kt) in _kt_lookup_action()
991 _err_record_msg(kt->err, "NULL argument(s)", END_ERR_MSG); in _kt_lookup_action()
997 sym = _find_HashSymbol(kt->actions, action); in _kt_lookup_action()
1021 const char *_kt_last_error(KeyTab *kt) in _kt_last_error() argument
1023 return kt ? _err_get_msg(kt->err) : "NULL KeyTab argument"; in _kt_last_error()