/****************************************************************************** * 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; XModifierKeymap *modmap; 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 */ modmap = XGetModifierMapping(dpy); for(i=0;i<8;i++){ for(j=0;jmax_keypermod;j++){ if(modmap->modifiermap[i*modmap->max_keypermod+j]== XKeysymToKeycode(dpy,XK_Num_Lock)) numlock_mask=(1<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; }