diff options
Diffstat (limited to 'src/rmd_shortcuts.c')
-rw-r--r-- | src/rmd_shortcuts.c | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/src/rmd_shortcuts.c b/src/rmd_shortcuts.c new file mode 100644 index 0000000..e1e07f5 --- /dev/null +++ b/src/rmd_shortcuts.c @@ -0,0 +1,142 @@ +/****************************************************************************** +* recordMyDesktop * +******************************************************************************* +* * +* Copyright (C) 2006,2007,2008 John Varouhakis * +* * +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the Free Software * +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * +* * +* * +* * +* For further information contact me at johnvarouhakis@gmail.com * +******************************************************************************/ + +#include "config.h" +#include "rmd_shortcuts.h" + +#include "rmd_types.h" + +#include <X11/Xlib.h> +#include <X11/Xlibint.h> +#include <X11/keysym.h> + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +int rmdRegisterShortcut( Display *dpy, + Window root, + const char *shortcut, + HotKey *hotkey) { + + int keycode = 0, i, j; + KeySym key = 0; + unsigned int modifier_mask = 0, numlock_mask = 0; + char *keystr = NULL; + + if (strstr(shortcut, "Shift")) + modifier_mask = modifier_mask | ShiftMask; + if (strstr(shortcut, "Control")) + modifier_mask = modifier_mask | ControlMask; + if (strstr(shortcut, "Mod1")) + modifier_mask = modifier_mask | Mod1Mask; + if (strstr(shortcut, "Mod2")) + modifier_mask = modifier_mask | Mod2Mask; + if (strstr(shortcut, "Mod3")) + modifier_mask = modifier_mask | Mod3Mask; + if (strstr(shortcut, "Mod4")) + modifier_mask = modifier_mask | Mod4Mask; + if (strstr(shortcut, "Mod5")) + modifier_mask = modifier_mask | Mod5Mask; + + //we register the shortcut on the root + //window, which means on every keypress event, + //so I think it's neccessary to have at least one + //modifier. + if (modifier_mask == 0) + return 1; + if ((keystr = rindex(shortcut, '+')) != NULL) { + keystr++; + if ((key = XStringToKeysym(keystr)) == NoSymbol) + return 1; + else + keycode = XKeysymToKeycode(dpy, key); + } else + return 1; + + + /* Key grabbing stuff taken from tilda who took it from yeahconsole + * who took it from evilwm */ + + { + KeyCode numlock = XKeysymToKeycode(dpy, XK_Num_Lock); + XModifierKeymap *modmap = XGetModifierMapping(dpy); + for (i = 0; i < 8; i++) { + for (j = 0; j < modmap->max_keypermod; j++) { + if (modmap->modifiermap[i * modmap->max_keypermod + j] == numlock) + numlock_mask = (1 << i); + } + } + XFreeModifiermap(modmap); + } + + hotkey->modnum = 0; + hotkey->key = keycode; + + XGrabKey( dpy, + keycode, + modifier_mask, + root, + True, + GrabModeAsync, + GrabModeAsync); + hotkey->mask[0] = modifier_mask; + hotkey->modnum++; + + XGrabKey( dpy, + keycode, + LockMask | modifier_mask, + root, + True, + GrabModeAsync, + GrabModeAsync); + hotkey->mask[1] = LockMask | modifier_mask; + hotkey->modnum++; + + if (numlock_mask) { + XGrabKey( dpy, + keycode, + numlock_mask | modifier_mask, + root, + True, + GrabModeAsync, + GrabModeAsync); + hotkey->mask[2] = numlock_mask | modifier_mask; + hotkey->modnum++; + + XGrabKey( dpy, + keycode, + numlock_mask | LockMask | modifier_mask, + root, + True, + GrabModeAsync, + GrabModeAsync); + hotkey->mask[3] = numlock_mask | LockMask | modifier_mask; + hotkey->modnum++; + } + + return 0; +} |