--- a/gntkeys.c Tue May 27 03:24:19 2008 +0000
+++ b/gntkeys.c Tue May 27 04:10:43 2008 +0000
@@ -34,158 +34,6 @@
static GHashTable *specials;
-void gnt_keys_refine(char *text)
- if (*text == 27 && *(text + 1) == '[' &&
- (*(text + 2) >= 'A' && *(text + 2) <= 'D')) {
- /* Apparently this is necessary for urxvt and screen and xterm */
- if (strcmp(term, "screen") == 0 || strcmp(term, "rxvt-unicode") == 0 ||
- strcmp(term, "xterm") == 0)
- } else if (*(unsigned char*)text == 195) {
- if (*(text + 2) == 0 && strcmp(term, "xterm") == 0) {
- *(text + 1) -= 64; /* Say wha? */
-const char *gnt_key_translate(const char *name)
- return name ? g_hash_table_lookup(specials, name) : NULL;
-get_key_name(gpointer key, gpointer value, gpointer data)
- if (g_utf8_collate(value, k->key) == 0)
-const char *gnt_key_lookup(const char *key)
- gntkey k = {NULL, key};
- g_hash_table_foreach(specials, get_key_name, &k);
- * The key-bindings will be saved in a tree. When a keystroke happens, GNT will
- * find the sequence that matches a binding and return the length.
- * A sequence should not be a prefix of another sequence. If it is, then only
- * the shortest one will be processed. If we want to change that, we will need
- * to allow getting the k-th prefix that matches the input, and pay attention
- * to the return value of gnt_wm_process_input in gntmain.c.
- struct _node *next[SIZE];
-static void add_path(struct _node *node, const char *path)
- struct _node *n = NULL;
- while (*path && node->next[(unsigned char)*path]) {
- node = node->next[(unsigned char)*path];
- n = g_new0(struct _node, 1);
- node->next[(unsigned char)*path++] = n;
-void gnt_keys_add_combination(const char *path)
-static void del_path(struct _node *node, const char *path)
- struct _node *next = NULL;
- next = node->next[(unsigned char)*path];
- del_path(next, path + 1);
- node->next[(unsigned char)*path] = NULL;
-void gnt_keys_del_combination(const char *path)
-int gnt_keys_find_combination(const char *path)
- struct _node *n = &root;
- while (*path && n->next[(unsigned char)*path] && !(n->flags & IS_END)) {
- if (!g_ascii_isspace(*path) &&
- !g_ascii_iscntrl(*path) &&
- !g_ascii_isgraph(*path))
- n = n->next[(unsigned char)*path++];
- if (!(n->flags & IS_END))
-print_path(struct _node *node, int depth)
- for (i = 0; i < SIZE; i++) {
- g_printerr("%*c (%d:%d)\n", depth * 4, i, node->next[i]->ref,
- print_path(node->next[i], depth + 1);
-/* this is purely for debugging purposes. */
-void gnt_keys_print_combinations(void);
-void gnt_keys_print_combinations()
- g_printerr("--------\n");
- g_printerr("--------\n");
const char *controls[] = {"", "c-", "ctrl-", "ctr-", "ctl-", NULL};
@@ -193,9 +41,6 @@
- memset(&root, 0, sizeof(root));
@@ -291,3 +136,155 @@
+void gnt_keys_refine(char *text) + if (*text == 27 && *(text + 1) == '[' && + (*(text + 2) >= 'A' && *(text + 2) <= 'D')) { + /* Apparently this is necessary for urxvt and screen and xterm */ + if (strcmp(term, "screen") == 0 || strcmp(term, "rxvt-unicode") == 0 || + strcmp(term, "xterm") == 0) + } else if (*(unsigned char*)text == 195) { + if (*(text + 2) == 0 && strcmp(term, "xterm") == 0) { + *(text + 1) -= 64; /* Say wha? */ +const char *gnt_key_translate(const char *name) + return name ? g_hash_table_lookup(specials, name) : NULL; +get_key_name(gpointer key, gpointer value, gpointer data) + if (g_utf8_collate(value, k->key) == 0) +const char *gnt_key_lookup(const char *key) + gntkey k = {NULL, key}; + g_hash_table_foreach(specials, get_key_name, &k); + * The key-bindings will be saved in a tree. When a keystroke happens, GNT will + * find the sequence that matches a binding and return the length. + * A sequence should not be a prefix of another sequence. If it is, then only + * the shortest one will be processed. If we want to change that, we will need + * to allow getting the k-th prefix that matches the input, and pay attention + * to the return value of gnt_wm_process_input in gntmain.c. + struct _node *next[SIZE]; +static struct _node root = {.ref = 1, .flags = 0}; +static void add_path(struct _node *node, const char *path) + struct _node *n = NULL; + while (*path && node->next[(unsigned char)*path]) { + node = node->next[(unsigned char)*path]; + n = g_new0(struct _node, 1); + node->next[(unsigned char)*path++] = n; +void gnt_keys_add_combination(const char *path) +static void del_path(struct _node *node, const char *path) + struct _node *next = NULL; + next = node->next[(unsigned char)*path]; + del_path(next, path + 1); + node->next[(unsigned char)*path] = NULL; +void gnt_keys_del_combination(const char *path) +int gnt_keys_find_combination(const char *path) + struct _node *n = &root; + while (*path && n->next[(unsigned char)*path] && !(n->flags & IS_END)) { + if (!g_ascii_isspace(*path) && + !g_ascii_iscntrl(*path) && + !g_ascii_isgraph(*path)) + n = n->next[(unsigned char)*path++]; + if (!(n->flags & IS_END)) +print_path(struct _node *node, int depth) + for (i = 0; i < SIZE; i++) { + g_printerr("%*c (%d:%d)\n", depth * 4, i, node->next[i]->ref, + print_path(node->next[i], depth + 1); +/* this is purely for debugging purposes. */ +void gnt_keys_print_combinations(void); +void gnt_keys_print_combinations() + g_printerr("--------\n"); + g_printerr("--------\n");