keys.h - ledit - Text editor (WIP)
HTML git clone git://lumidify.org/ledit.git (fast, but not encrypted)
HTML git clone https://lumidify.org/git/ledit.git (encrypted, but very slow)
HTML git clone git://4kcetb7mo7hj6grozzybxtotsub5bempzo4lirzc3437amof2c2impyd.onion/ledit.git (over tor)
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
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