From c90da6da781932c2d178bfb7e39ec1d5003543b7 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Tue, 12 Aug 2003 07:26:16 +0000 Subject: move the keyboard and mouse plugins into the kernel for mucho sexiness. make workspace changing a grabbed/interactive process like focus cycling is, with the popup and all. this is some hot shit. --- openbox/translate.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 openbox/translate.c (limited to 'openbox/translate.c') diff --git a/openbox/translate.c b/openbox/translate.c new file mode 100644 index 00000000..9b4c1406 --- /dev/null +++ b/openbox/translate.c @@ -0,0 +1,109 @@ +#include "kernel/openbox.h" +#include "mouse.h" +#include +#include +#include + +static guint translate_modifier(char *str) +{ + if (!g_ascii_strcasecmp("Mod1", str) || + !g_ascii_strcasecmp("A", str)) return Mod1Mask; + else if (!g_ascii_strcasecmp("Mod2", str)) return Mod2Mask; + else if (!g_ascii_strcasecmp("Mod3", str)) return Mod3Mask; + else if (!g_ascii_strcasecmp("Mod4", str) || + !g_ascii_strcasecmp("W", str)) return Mod4Mask; + else if (!g_ascii_strcasecmp("Mod5", str)) return Mod5Mask; + else if (!g_ascii_strcasecmp("Control", str) || + !g_ascii_strcasecmp("C", str)) return ControlMask; + else if (!g_ascii_strcasecmp("Shift", str) || + !g_ascii_strcasecmp("S", str)) return ShiftMask; + g_warning("Invalid modifier '%s' in binding.", str); + return 0; +} + +gboolean translate_button(char *str, guint *state, guint *button) +{ + char **parsed; + char *l; + int i; + gboolean ret = FALSE; + + parsed = g_strsplit(str, "-", -1); + + /* first, find the button (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 = translate_modifier(parsed[i]); + if (!m) goto translation_fail; + *state |= m; + } + + /* figure out the button */ + if (!g_ascii_strcasecmp("Left", l)) *button = 1; + else if (!g_ascii_strcasecmp("Middle", l)) *button = 2; + else if (!g_ascii_strcasecmp("Right", l)) *button = 3; + else if (!g_ascii_strcasecmp("Up", l)) *button = 4; + else if (!g_ascii_strcasecmp("Down", l)) *button = 5; + else if (!g_ascii_strncasecmp("Button", l, 6)) *button = atoi(l+6); + if (!*button) { + g_warning("Invalid button '%s' in pointer binding.", l); + goto translation_fail; + } + + ret = TRUE; + +translation_fail: + g_strfreev(parsed); + return ret; +} + +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 = 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; +} -- cgit v1.2.3