commit
2c21ea0dfe
73
x.c
73
x.c
@ -485,6 +485,58 @@ static void setopacity(Window win, unsigned long opacity)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns the modifier which is NumLock.
|
||||||
|
*/
|
||||||
|
static KeySym x_numlock_mod()
|
||||||
|
{
|
||||||
|
static KeyCode nl = 0;
|
||||||
|
KeySym sym = 0;
|
||||||
|
XModifierKeymap * map = XGetModifierMapping(xctx.dpy);
|
||||||
|
|
||||||
|
if (!nl)
|
||||||
|
nl = XKeysymToKeycode(xctx.dpy, XStringToKeysym("Num_Lock"));
|
||||||
|
|
||||||
|
for (int mod = 0; mod < 8; mod++) {
|
||||||
|
for (int j = 0; j < map->max_keypermod; j++) {
|
||||||
|
if (map->modifiermap[mod*map->max_keypermod+j] == nl) {
|
||||||
|
/* In theory, one could use `1 << mod`, but this
|
||||||
|
* could count as 'using implementation details',
|
||||||
|
* so use this large switch. */
|
||||||
|
switch (mod) {
|
||||||
|
case ShiftMapIndex:
|
||||||
|
sym = ShiftMask;
|
||||||
|
goto end;
|
||||||
|
case LockMapIndex:
|
||||||
|
sym = LockMask;
|
||||||
|
goto end;
|
||||||
|
case ControlMapIndex:
|
||||||
|
sym = ControlMask;
|
||||||
|
goto end;
|
||||||
|
case Mod1MapIndex:
|
||||||
|
sym = Mod1Mask;
|
||||||
|
goto end;
|
||||||
|
case Mod2MapIndex:
|
||||||
|
sym = Mod2Mask;
|
||||||
|
goto end;
|
||||||
|
case Mod3MapIndex:
|
||||||
|
sym = Mod3Mask;
|
||||||
|
goto end;
|
||||||
|
case Mod4MapIndex:
|
||||||
|
sym = Mod4Mask;
|
||||||
|
goto end;
|
||||||
|
case Mod5MapIndex:
|
||||||
|
sym = Mod5Mask;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end:
|
||||||
|
XFreeModifiermap(map);
|
||||||
|
return sym;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Helper function to use glib's mainloop mechanic
|
* Helper function to use glib's mainloop mechanic
|
||||||
@ -515,6 +567,7 @@ gboolean x_mainloop_fd_dispatch(GSource * source, GSourceFunc callback,
|
|||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
XEvent ev;
|
XEvent ev;
|
||||||
|
unsigned int state;
|
||||||
while (XPending(xctx.dpy) > 0) {
|
while (XPending(xctx.dpy) > 0) {
|
||||||
XNextEvent(xctx.dpy, &ev);
|
XNextEvent(xctx.dpy, &ev);
|
||||||
switch (ev.type) {
|
switch (ev.type) {
|
||||||
@ -535,10 +588,13 @@ gboolean x_mainloop_fd_dispatch(GSource * source, GSourceFunc callback,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case KeyPress:
|
case KeyPress:
|
||||||
|
state = ev.xkey.state;
|
||||||
|
/* NumLock is also encoded in the state. Remove it. */
|
||||||
|
state &= ~x_numlock_mod();
|
||||||
if (settings.close_ks.str
|
if (settings.close_ks.str
|
||||||
&& XLookupKeysym(&ev.xkey,
|
&& XLookupKeysym(&ev.xkey,
|
||||||
0) == settings.close_ks.sym
|
0) == settings.close_ks.sym
|
||||||
&& settings.close_ks.mask == ev.xkey.state) {
|
&& settings.close_ks.mask == state) {
|
||||||
if (displayed) {
|
if (displayed) {
|
||||||
notification *n = g_queue_peek_head(displayed);
|
notification *n = g_queue_peek_head(displayed);
|
||||||
if (n)
|
if (n)
|
||||||
@ -548,19 +604,19 @@ gboolean x_mainloop_fd_dispatch(GSource * source, GSourceFunc callback,
|
|||||||
if (settings.history_ks.str
|
if (settings.history_ks.str
|
||||||
&& XLookupKeysym(&ev.xkey,
|
&& XLookupKeysym(&ev.xkey,
|
||||||
0) == settings.history_ks.sym
|
0) == settings.history_ks.sym
|
||||||
&& settings.history_ks.mask == ev.xkey.state) {
|
&& settings.history_ks.mask == state) {
|
||||||
history_pop();
|
history_pop();
|
||||||
}
|
}
|
||||||
if (settings.close_all_ks.str
|
if (settings.close_all_ks.str
|
||||||
&& XLookupKeysym(&ev.xkey,
|
&& XLookupKeysym(&ev.xkey,
|
||||||
0) == settings.close_all_ks.sym
|
0) == settings.close_all_ks.sym
|
||||||
&& settings.close_all_ks.mask == ev.xkey.state) {
|
&& settings.close_all_ks.mask == state) {
|
||||||
move_all_to_history();
|
move_all_to_history();
|
||||||
}
|
}
|
||||||
if (settings.context_ks.str
|
if (settings.context_ks.str
|
||||||
&& XLookupKeysym(&ev.xkey,
|
&& XLookupKeysym(&ev.xkey,
|
||||||
0) == settings.context_ks.sym
|
0) == settings.context_ks.sym
|
||||||
&& settings.context_ks.mask == ev.xkey.state) {
|
&& settings.context_ks.mask == state) {
|
||||||
context_menu();
|
context_menu();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -953,9 +1009,12 @@ int x_shortcut_grab(keyboard_shortcut * ks)
|
|||||||
|
|
||||||
x_shortcut_setup_error_handler();
|
x_shortcut_setup_error_handler();
|
||||||
|
|
||||||
if (ks->is_valid)
|
if (ks->is_valid) {
|
||||||
XGrabKey(xctx.dpy, ks->code, ks->mask, root,
|
XGrabKey(xctx.dpy, ks->code, ks->mask, root,
|
||||||
true, GrabModeAsync, GrabModeAsync);
|
true, GrabModeAsync, GrabModeAsync);
|
||||||
|
XGrabKey(xctx.dpy, ks->code, ks->mask | x_numlock_mod() , root,
|
||||||
|
true, GrabModeAsync, GrabModeAsync);
|
||||||
|
}
|
||||||
|
|
||||||
if (x_shortcut_tear_down_error_handler()) {
|
if (x_shortcut_tear_down_error_handler()) {
|
||||||
fprintf(stderr, "Unable to grab key \"%s\"\n", ks->str);
|
fprintf(stderr, "Unable to grab key \"%s\"\n", ks->str);
|
||||||
@ -972,8 +1031,10 @@ void x_shortcut_ungrab(keyboard_shortcut * ks)
|
|||||||
{
|
{
|
||||||
Window root;
|
Window root;
|
||||||
root = RootWindow(xctx.dpy, DefaultScreen(xctx.dpy));
|
root = RootWindow(xctx.dpy, DefaultScreen(xctx.dpy));
|
||||||
if (ks->is_valid)
|
if (ks->is_valid) {
|
||||||
XUngrabKey(xctx.dpy, ks->code, ks->mask, root);
|
XUngrabKey(xctx.dpy, ks->code, ks->mask, root);
|
||||||
|
XUngrabKey(xctx.dpy, ks->code, ks->mask | x_numlock_mod(), root);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user