summaryrefslogtreecommitdiff
path: root/src/rmd_shortcuts.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rmd_shortcuts.c')
-rw-r--r--src/rmd_shortcuts.c142
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;
+}
© All Rights Reserved