cycle through other common cycling modifiers; based on a diff from

Alexander Polakov.

ok sthen@
This commit is contained in:
okan 2012-05-16 01:09:17 +00:00
parent dd5bfdb064
commit ac82403a51
3 changed files with 23 additions and 16 deletions

View File

@ -307,6 +307,7 @@ __dead void usage(void);
void client_applysizehints(struct client_ctx *); void client_applysizehints(struct client_ctx *);
struct client_ctx *client_current(void); struct client_ctx *client_current(void);
void client_cycle(struct screen_ctx *, int); void client_cycle(struct screen_ctx *, int);
void client_cycle_leave(struct screen_ctx *, struct client_ctx *);
void client_delete(struct client_ctx *); void client_delete(struct client_ctx *);
void client_draw_border(struct client_ctx *); void client_draw_border(struct client_ctx *);
struct client_ctx *client_find(Window); struct client_ctx *client_find(Window);

View File

@ -644,6 +644,18 @@ client_cycle(struct screen_ctx *sc, int flags)
client_ptrwarp(newcc); client_ptrwarp(newcc);
} }
void
client_cycle_leave(struct screen_ctx *sc, struct client_ctx *cc)
{
sc->cycling = 0;
client_mtf(NULL);
if (cc) {
group_sticky_toggle_exit(cc);
XUngrabKeyboard(X_Dpy, CurrentTime);
}
}
static struct client_ctx * static struct client_ctx *
client_mrunext(struct client_ctx *cc) client_mrunext(struct client_ctx *cc)
{ {

View File

@ -70,6 +70,9 @@ void (*xev_handlers[LASTEvent])(XEvent *) = {
[MappingNotify] = xev_handle_mappingnotify, [MappingNotify] = xev_handle_mappingnotify,
}; };
static KeySym modkeys[] = { XK_Alt_L, XK_Alt_R, XK_Super_L, XK_Super_R,
XK_Control_L, XK_Control_R };
static void static void
xev_handle_maprequest(XEvent *ee) xev_handle_maprequest(XEvent *ee)
{ {
@ -314,7 +317,7 @@ xev_handle_keypress(XEvent *ee)
} }
/* /*
* This is only used for the alt suppression detection. * This is only used for the modifier suppression detection.
*/ */
static void static void
xev_handle_keyrelease(XEvent *ee) xev_handle_keyrelease(XEvent *ee)
@ -322,26 +325,17 @@ xev_handle_keyrelease(XEvent *ee)
XKeyEvent *e = &ee->xkey; XKeyEvent *e = &ee->xkey;
struct screen_ctx *sc; struct screen_ctx *sc;
struct client_ctx *cc; struct client_ctx *cc;
int keysym; int i, keysym;
sc = screen_fromroot(e->root); sc = screen_fromroot(e->root);
cc = client_current(); cc = client_current();
keysym = XkbKeycodeToKeysym(X_Dpy, e->keycode, 0, 0); keysym = XkbKeycodeToKeysym(X_Dpy, e->keycode, 0, 0);
if (keysym != XK_Alt_L && keysym != XK_Alt_R) for (i = 0; i < nitems(modkeys); i++) {
return; if (keysym == modkeys[i]) {
client_cycle_leave(sc, cc);
sc->cycling = 0; break;
}
/*
* XXX - better interface... xevents should not know about
* how/when to mtf.
*/
client_mtf(NULL);
if (cc != NULL) {
group_sticky_toggle_exit(cc);
XUngrabKeyboard(X_Dpy, CurrentTime);
} }
} }