/****************************************************************************** * 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 #include #include #include #include #include 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; }