1
/* $Id: keys_management.c 20800 2006-04-07 22:18:46Z olivier $
3
This program is free software; you can redistribute it and/or modify
4
it under the terms of the GNU General Public License as published by
5
the Free Software Foundation; either version 2, or (at your option)
8
This program is distributed in the hope that it will be useful,
9
but WITHOUT ANY WARRANTY; without even the implied warranty of
10
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
GNU General Public License for more details.
13
You should have received a copy of the GNU General Public License
14
along with this program; if not, write to the Free Software
15
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
keys_management - (c) 2002-2006 Olivier Fourdan
26
#include <X11/keysym.h>
35
#include "keys_management.h"
37
unsigned int KeyMask = 0;
38
unsigned int ButtonMask = 0;
39
unsigned int ButtonKeyMask = 0;
40
unsigned int AltMask = 0;
41
unsigned int MetaMask = 0;
42
unsigned int NumLockMask = 0;
43
unsigned int ScrollLockMask = 0;
44
unsigned int SuperMask = 0;
45
unsigned int HyperMask = 0;
48
parseKeyString (char *str)
54
gdisplay = gdk_display_get_default ();
56
g_return_val_if_fail (str != NULL, NULL);
58
my_key = g_new (MyKey, 1);
62
k = strrchr (str, '+');
65
/* There is a modifier */
68
tmp = g_ascii_strdown ((gchar *) str, -1);
70
my_key->keycode = XKeysymToKeycode (GDK_DISPLAY_XDISPLAY (gdisplay), XStringToKeysym (++k));
71
if (strstr (tmp, "shift"))
73
my_key->modifier = my_key->modifier | ShiftMask;
75
if (strstr (tmp, "control"))
77
my_key->modifier = my_key->modifier | ControlMask;
79
if (strstr (tmp, "alt"))
81
my_key->modifier = my_key->modifier | AltMask;
83
if (strstr (tmp, "meta"))
85
my_key->modifier = my_key->modifier | MetaMask;
87
if (strstr (tmp, "super"))
89
my_key->modifier = my_key->modifier | SuperMask;
91
if (strstr (tmp, "hyper"))
93
my_key->modifier = my_key->modifier | HyperMask;
95
if (strstr (tmp, "mod1"))
97
my_key->modifier = my_key->modifier | Mod1Mask;
99
if (strstr (tmp, "mod2"))
101
my_key->modifier = my_key->modifier | Mod2Mask;
103
if (strstr (tmp, "mod3"))
105
my_key->modifier = my_key->modifier | Mod3Mask;
107
if (strstr (tmp, "mod4"))
109
my_key->modifier = my_key->modifier | Mod4Mask;
111
if (strstr (tmp, "mod5"))
113
my_key->modifier = my_key->modifier | Mod5Mask;
119
my_key->keycode = XKeysymToKeycode (GDK_DISPLAY_XDISPLAY (gdisplay), XStringToKeysym (str));
120
my_key->modifier = 0;
127
grab_key (MyKey * key)
130
GdkDisplay *gdisplay;
132
gdisplay = gdk_display_get_default ();
133
nscreens = gdk_display_get_n_screens(gdisplay);
134
for(i = 0; i < nscreens; i++)
139
gscr = gdk_display_get_screen(gdisplay, i);
140
w = GDK_WINDOW_XWINDOW (gdk_screen_get_root_window (gscr));
144
if (key->modifier == 0)
146
XGrabKey (GDK_DISPLAY_XDISPLAY (gdisplay), key->keycode, AnyModifier,
147
w, FALSE, GrabModeAsync, GrabModeAsync);
151
/* Here we grab all combinations of well known modifiers */
152
XGrabKey (GDK_DISPLAY_XDISPLAY (gdisplay), key->keycode,
153
key->modifier, w, FALSE, GrabModeAsync, GrabModeAsync);
154
XGrabKey (GDK_DISPLAY_XDISPLAY (gdisplay), key->keycode,
155
key->modifier | ScrollLockMask, w, FALSE, GrabModeAsync, GrabModeAsync);
156
XGrabKey (GDK_DISPLAY_XDISPLAY (gdisplay), key->keycode,
157
key->modifier | NumLockMask, w, FALSE, GrabModeAsync, GrabModeAsync);
158
XGrabKey (GDK_DISPLAY_XDISPLAY (gdisplay), key->keycode,
159
key->modifier | LockMask, w, FALSE, GrabModeAsync, GrabModeAsync);
160
XGrabKey (GDK_DISPLAY_XDISPLAY (gdisplay), key->keycode,
161
key->modifier | ScrollLockMask | NumLockMask, w, FALSE, GrabModeAsync, GrabModeAsync);
162
XGrabKey (GDK_DISPLAY_XDISPLAY (gdisplay), key->keycode,
163
key->modifier | ScrollLockMask | LockMask, w, FALSE, GrabModeAsync, GrabModeAsync);
164
XGrabKey (GDK_DISPLAY_XDISPLAY (gdisplay), key->keycode,
165
key->modifier | LockMask | NumLockMask, w, FALSE, GrabModeAsync, GrabModeAsync);
166
XGrabKey (GDK_DISPLAY_XDISPLAY (gdisplay), key->keycode,
167
key->modifier | ScrollLockMask | LockMask | NumLockMask, w, FALSE, GrabModeAsync, GrabModeAsync);
174
ungrab_key (MyKey * key)
177
GdkDisplay *gdisplay;
179
gdisplay = gdk_display_get_default ();
180
nscreens = gdk_display_get_n_screens(gdisplay);
181
for(i = 0; i < nscreens; i++)
186
gscr = gdk_display_get_screen(gdisplay, i);
187
w = GDK_WINDOW_XWINDOW (gdk_screen_get_root_window (gscr));
191
if (key->modifier == 0)
193
XUngrabKey (GDK_DISPLAY_XDISPLAY (gdisplay), key->keycode, AnyModifier, w);
197
XUngrabKey (GDK_DISPLAY_XDISPLAY (gdisplay), key->keycode,
199
XUngrabKey (GDK_DISPLAY_XDISPLAY (gdisplay), key->keycode,
200
key->modifier | ScrollLockMask, w);
201
XUngrabKey (GDK_DISPLAY_XDISPLAY (gdisplay), key->keycode,
202
key->modifier | NumLockMask, w);
203
XUngrabKey (GDK_DISPLAY_XDISPLAY (gdisplay), key->keycode,
204
key->modifier | LockMask, w);
205
XUngrabKey (GDK_DISPLAY_XDISPLAY (gdisplay), key->keycode,
206
key->modifier | ScrollLockMask | NumLockMask, w);
207
XUngrabKey (GDK_DISPLAY_XDISPLAY (gdisplay), key->keycode,
208
key->modifier | ScrollLockMask | LockMask, w);
209
XUngrabKey (GDK_DISPLAY_XDISPLAY (gdisplay), key->keycode,
210
key->modifier | LockMask | NumLockMask, w);
211
XUngrabKey (GDK_DISPLAY_XDISPLAY (gdisplay), key->keycode,
212
key->modifier | ScrollLockMask | LockMask | NumLockMask, w);
219
init_modifiers (void)
221
GdkDisplay *gdisplay;
225
XModifierKeymap *modmap;
228
int keysyms_per_keycode;
232
gdisplay = gdk_display_get_default ();
233
gscr = gdk_display_get_default_screen (gdisplay);
234
w = GDK_WINDOW_XWINDOW (gdk_screen_get_root_window (gscr));
242
keysyms_per_keycode = 0;
246
XDisplayKeycodes (GDK_DISPLAY_XDISPLAY (gdisplay), &min_keycode, &max_keycode);
247
modmap = XGetModifierMapping (GDK_DISPLAY_XDISPLAY (gdisplay));
248
keymap = XGetKeyboardMapping (GDK_DISPLAY_XDISPLAY (gdisplay), min_keycode, max_keycode - min_keycode + 1, &keysyms_per_keycode);
250
for (i = 3 * modmap->max_keypermod; i < 8 * modmap->max_keypermod; i++)
252
unsigned int keycode = modmap->modifiermap[i];
254
if ((keycode >= min_keycode) && (keycode <= max_keycode))
257
KeySym *syms = keymap + (keycode - min_keycode) * keysyms_per_keycode;
259
for (j = 0; j < keysyms_per_keycode; j++)
261
if (syms[j] == XK_Num_Lock)
263
NumLockMask |= (1 << (i / modmap->max_keypermod));
265
else if (syms[j] == XK_Scroll_Lock)
267
ScrollLockMask |= (1 << (i / modmap->max_keypermod));
269
else if ((syms[j] == XK_Super_L) || (syms[j] == XK_Super_R))
271
SuperMask |= (1 << (i / modmap->max_keypermod));
273
else if ((syms[j] == XK_Hyper_L) || (syms[j] == XK_Hyper_R))
275
HyperMask |= (1 << (i / modmap->max_keypermod));
277
else if ((syms[j] == XK_Meta_L) || (syms[j] == XK_Meta_R))
279
MetaMask |= (1 << (i / modmap->max_keypermod));
281
else if ((syms[j] == XK_Alt_L) || (syms[j] == XK_Alt_R))
283
AltMask |= (1 << (i / modmap->max_keypermod));
288
KeyMask = ControlMask | ShiftMask | AltMask | MetaMask | SuperMask | HyperMask;
290
ButtonMask = Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask;
292
ButtonKeyMask = KeyMask | ButtonMask;