#include <X11/keysym.h>
#include <X11/Xatom.h>
-#define ButtonMask (ButtonPressMask | ButtonReleaseMask)
-#define MouseMask (ButtonMask | PointerMotionMask)
-
-/* CUSTOMIZE */
+/* static */
typedef struct {
unsigned long mod;
Arg arg;
} Key;
-const char *browse[] = { "firefox", NULL };
-const char *gimp[] = { "gimp", NULL };
-const char *term[] = {
- "urxvtc", "-tr", "+sb", "-bg", "black", "-fg", "white", "-cr", "white",
- "-fn", "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*", NULL
-};
-const char *xlock[] = { "xlock", NULL };
-
-static Key key[] = {
- /* modifier key function arguments */
- { ControlMask, XK_0, appendtag, { .i = Tscratch } },
- { ControlMask, XK_1, appendtag, { .i = Tdev } },
- { ControlMask, XK_2, appendtag, { .i = Twww } },
- { ControlMask, XK_3, appendtag, { .i = Twork } },
- { MODKEY, XK_0, view, { .i = Tscratch } },
- { MODKEY, XK_1, view, { .i = Tdev } },
- { MODKEY, XK_2, view, { .i = Twww } },
- { MODKEY, XK_3, view, { .i = Twork } },
- { MODKEY, XK_j, focusnext, { 0 } },
- { MODKEY, XK_k, focusprev, { 0 } },
- { MODKEY, XK_m, togglemax, { 0 } },
- { MODKEY, XK_space, togglemode, { 0 } },
- { MODKEY, XK_Return, zoom, { 0 } },
- { ControlMask|ShiftMask,XK_0, heretag, { .i = Tscratch } },
- { ControlMask|ShiftMask,XK_1, heretag, { .i = Tdev } },
- { ControlMask|ShiftMask,XK_2, heretag, { .i = Twww } },
- { ControlMask|ShiftMask,XK_3, heretag, { .i = Twork } },
- { MODKEY|ShiftMask, XK_0, replacetag, { .i = Tscratch } },
- { MODKEY|ShiftMask, XK_1, replacetag, { .i = Tdev } },
- { MODKEY|ShiftMask, XK_2, replacetag, { .i = Twww } },
- { MODKEY|ShiftMask, XK_3, replacetag, { .i = Twork } },
- { MODKEY|ShiftMask, XK_c, killclient, { 0 } },
- { MODKEY|ShiftMask, XK_g, spawn, { .argv = gimp } },
- { MODKEY|ShiftMask, XK_l, spawn, { .argv = xlock } },
- { MODKEY|ShiftMask, XK_q, quit, { 0 } },
- { MODKEY|ShiftMask, XK_w, spawn, { .argv = browse } },
- { MODKEY|ShiftMask, XK_Return, spawn, { .argv = term } },
-};
+KEYS
-/* END CUSTOMIZE */
-
-/* static */
+static unsigned int valid_mask = 255 & ~(NUMLOCKMASK | LockMask);
static void
movemouse(Client *c)
ocx = c->x;
ocy = c->y;
- if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
+ if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
None, cursor[CurMove], CurrentTime) != GrabSuccess)
return;
XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui);
for(;;) {
- XMaskEvent(dpy, MouseMask | ExposureMask, &ev);
+ XMaskEvent(dpy, MOUSEMASK | ExposureMask, &ev);
switch (ev.type) {
default: break;
case Expose:
ocx = c->x;
ocy = c->y;
- if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
+ if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
None, cursor[CurResize], CurrentTime) != GrabSuccess)
return;
XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h);
for(;;) {
- XMaskEvent(dpy, MouseMask | ExposureMask, &ev);
+ XMaskEvent(dpy, MOUSEMASK | ExposureMask, &ev);
switch(ev.type) {
default: break;
case Expose:
}
break;
case Button4:
- a.i = (tsel + 1 < TLast) ? tsel + 1 : 0;
- view(&a);
+ viewnext(&a);
break;
case Button5:
- a.i = (tsel - 1 >= 0) ? tsel - 1 : TLast - 1;
- view(&a);
+ viewprev(&a);
break;
}
}
else if((c = getclient(ev->window))) {
+ focus(c);
switch(ev->button) {
default:
break;
case Button1:
- if(arrange == dofloat || c->isfloat) {
+ if(!c->ismax && (arrange == dofloat || c->isfloat)) {
higher(c);
movemouse(c);
}
lower(c);
break;
case Button3:
- if(arrange == dofloat || c->isfloat) {
+ if(!c->ismax && (arrange == dofloat || c->isfloat)) {
higher(c);
resizemouse(c);
}
Client *c;
XCrossingEvent *ev = &e->xcrossing;
- if(ev->mode != NotifyNormal || ev->detail == NotifyInferior)
+ if(ev->detail == NotifyInferior)
return;
if((c = getclient(ev->window)))
static void
keypress(XEvent *e)
{
- static unsigned int len = key ? sizeof(key) / sizeof(key[0]) : 0;
+ static unsigned int len = sizeof(key) / sizeof(key[0]);
unsigned int i;
KeySym keysym;
XKeyEvent *ev = &e->xkey;
+ ev->state &= valid_mask;
keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
for(i = 0; i < len; i++)
- if((keysym == key[i].keysym) && (key[i].mod == ev->state)) {
+ if((keysym == key[i].keysym) && ((key[i].mod & valid_mask) == ev->state)) {
if(key[i].func)
key[i].func(&key[i].arg);
return;
void
grabkeys()
{
- static unsigned int len = key ? sizeof(key) / sizeof(key[0]) : 0;
+ static unsigned int len = sizeof(key) / sizeof(key[0]);
unsigned int i;
KeyCode code;
for(i = 0; i < len; i++) {
code = XKeysymToKeycode(dpy, key[i].keysym);
XUngrabKey(dpy, code, key[i].mod, root);
+ XUngrabKey(dpy, code, key[i].mod | NUMLOCKMASK, root);
+ XUngrabKey(dpy, code, key[i].mod | NUMLOCKMASK | LockMask, root);
XGrabKey(dpy, code, key[i].mod, root, True,
GrabModeAsync, GrabModeAsync);
+ XGrabKey(dpy, code, key[i].mod | NUMLOCKMASK, root, True,
+ GrabModeAsync, GrabModeAsync);
+ XGrabKey(dpy, code, key[i].mod | NUMLOCKMASK | LockMask, root, True,
+ GrabModeAsync, GrabModeAsync);
}
}