diff options
| author | Dana Jansens <danakj@orodu.net> | 2003-03-18 08:38:33 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2003-03-18 08:38:33 +0000 |
| commit | 739c958ac58154f8b1896113701e1c7f580d4cde (patch) | |
| tree | 0f4ea545addb1b432efc3fe880906f0fa244cb12 /plugins/keyboard/translate.c | |
| parent | eeba457231e3823171716b47a1a4d0900907269e (diff) | |
keyboard bindings are functional
Diffstat (limited to 'plugins/keyboard/translate.c')
| -rw-r--r-- | plugins/keyboard/translate.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/plugins/keyboard/translate.c b/plugins/keyboard/translate.c new file mode 100644 index 00000000..75c077fd --- /dev/null +++ b/plugins/keyboard/translate.c @@ -0,0 +1,61 @@ +#include "../../kernel/openbox.h" +#include "keyboard.h" +#include <glib.h> +#include <string.h> + +guint keyboard_translate_modifier(char *str) +{ + if (!strcmp("Mod1", str) || !strcmp("A", str)) return Mod1Mask; + else if (!strcmp("Mod2", str)) return Mod2Mask; + else if (!strcmp("Mod3", str)) return Mod3Mask; + else if (!strcmp("Mod4", str) || !strcmp("W", str)) return Mod4Mask; + else if (!strcmp("Mod5", str)) return Mod5Mask; + else if (!strcmp("C", str)) return ControlMask; + else if (!strcmp("S", str)) return ShiftMask; + g_warning("Invalid modifier '%s' in binding.", str); + return 0; +} + +gboolean translate_key(char *str, guint *state, guint *keycode) +{ + char **parsed; + char *l; + int i; + gboolean ret = FALSE; + KeySym sym; + + parsed = g_strsplit(str, "-", -1); + + /* first, find the key (last token) */ + l = NULL; + for (i = 0; parsed[i] != NULL; ++i) + l = parsed[i]; + if (l == NULL) + goto translation_fail; + + /* figure out the mod mask */ + *state = 0; + for (i = 0; parsed[i] != l; ++i) { + guint m = keyboard_translate_modifier(parsed[i]); + if (!m) goto translation_fail; + *state |= m; + } + + /* figure out the keycode */ + sym = XStringToKeysym(l); + if (sym == NoSymbol) { + g_warning("Invalid key name '%s' in key binding.", l); + goto translation_fail; + } + *keycode = XKeysymToKeycode(ob_display, sym); + if (!keycode) { + g_warning("Key '%s' does not exist on the display.", l); + goto translation_fail; + } + + ret = TRUE; + +translation_fail: + g_strfreev(parsed); + return ret; +} |
