keyboard bindings are functional
[mikachu/openbox.git] / plugins / keyboard / translate.c
1 #include "../../kernel/openbox.h"
2 #include "keyboard.h"
3 #include <glib.h>
4 #include <string.h>
5
6 guint keyboard_translate_modifier(char *str)
7 {
8     if (!strcmp("Mod1", str) || !strcmp("A", str)) return Mod1Mask;
9     else if (!strcmp("Mod2", str)) return Mod2Mask;
10     else if (!strcmp("Mod3", str)) return Mod3Mask;
11     else if (!strcmp("Mod4", str) || !strcmp("W", str)) return Mod4Mask;
12     else if (!strcmp("Mod5", str)) return Mod5Mask;
13     else if (!strcmp("C", str)) return ControlMask;
14     else if (!strcmp("S", str)) return ShiftMask;
15     g_warning("Invalid modifier '%s' in binding.", str);
16     return 0;
17 }
18
19 gboolean translate_key(char *str, guint *state, guint *keycode)
20 {
21     char **parsed;
22     char *l;
23     int i;
24     gboolean ret = FALSE;
25     KeySym sym;
26
27     parsed = g_strsplit(str, "-", -1);
28     
29     /* first, find the key (last token) */
30     l = NULL;
31     for (i = 0; parsed[i] != NULL; ++i)
32         l = parsed[i];
33     if (l == NULL)
34         goto translation_fail;
35
36     /* figure out the mod mask */
37     *state = 0;
38     for (i = 0; parsed[i] != l; ++i) {
39         guint m = keyboard_translate_modifier(parsed[i]);
40         if (!m) goto translation_fail;
41         *state |= m;
42     }
43
44     /* figure out the keycode */
45     sym = XStringToKeysym(l);
46     if (sym == NoSymbol) {
47         g_warning("Invalid key name '%s' in key binding.", l);
48         goto translation_fail;
49     }
50     *keycode = XKeysymToKeycode(ob_display, sym);
51     if (!keycode) {
52         g_warning("Key '%s' does not exist on the display.", l); 
53         goto translation_fail;
54     }
55
56     ret = TRUE;
57
58 translation_fail:
59     g_strfreev(parsed);
60     return ret;
61 }