keys.h (3794B)
1 #ifndef _KEYS_H_ 2 #define _KEYS_H_ 3 4 #include <X11/Xlib.h> 5 #include "window.h" 6 7 #define LENGTH(X) (sizeof(X) / sizeof(X[0])) 8 9 #define XK_ANY_MOD UINT_MAX 10 #define XK_NO_MOD 0 11 12 /* get the index of a language with the given name, or -1 if none exists */ 13 int get_language_index(char *lang); 14 /* match a modifier key mask with a key state, ignoring some unimportant parts */ 15 int match_key(unsigned int mask, unsigned int state); 16 /* preprocess key, i.e. get the KeySym and text corresponding to it */ 17 void preprocess_key( 18 ledit_window *window, XKeyEvent *event, KeySym *sym_ret, 19 char **buf_ret, int *buf_len_ret 20 ); 21 void key_processing_cleanup(void); 22 23 /* FIXME: documentation */ 24 #define GEN_CB_MAP_HELPERS(name, typename, cmp_entry) \ 25 \ 26 static int name##_sorted = 0; \ 27 \ 28 /* \ 29 * IMPORTANT: The text passed to *_get_entry may not be nul-terminated, \ 30 * so a txtbuf has to be used for the bsearch comparison helper. \ 31 */ \ 32 \ 33 static int \ 34 name##_search_helper(const void *keyv, const void *entryv) { \ 35 txtbuf *key = (txtbuf *)keyv; \ 36 typename *entry = (typename *)entryv; \ 37 int ret = strncmp(key->text, entry->cmp_entry, key->len); \ 38 if (ret == 0) { \ 39 if (entry->cmp_entry[key->len] == '\0') \ 40 return 0; \ 41 else \ 42 return -1; \ 43 } \ 44 return ret; \ 45 } \ 46 \ 47 static int \ 48 name##_sort_helper(const void *entry1v, const void *entry2v) { \ 49 typename *entry1 = (typename *)entry1v; \ 50 typename *entry2 = (typename *)entry2v; \ 51 return strcmp(entry1->cmp_entry, entry2->cmp_entry); \ 52 } \ 53 \ 54 typename * \ 55 name##_get_entry(char *text, size_t len) { \ 56 /* just in case */ \ 57 if (!name##_sorted) { \ 58 qsort( \ 59 name, LENGTH(name), \ 60 sizeof(name[0]), &name##_sort_helper); \ 61 name##_sorted = 1; \ 62 } \ 63 txtbuf tmp = {.len = len, .cap = len, .text = text}; \ 64 return bsearch( \ 65 &tmp, name, LENGTH(name), \ 66 sizeof(name[0]), &name##_search_helper \ 67 ); \ 68 } 69 70 #endif