diff options
author | okan <okan> | 2017-12-29 18:50:43 +0000 |
---|---|---|
committer | okan <okan> | 2017-12-29 18:50:43 +0000 |
commit | 43db5b55eaae67515ae926c0d195c1ef6aa4b607 (patch) | |
tree | 38df44627467c7a934ee98e73c80bc44dbfcd2b1 | |
parent | ba75c139531d2a52dfa43a0302d9c8886ed1a820 (diff) | |
download | cwm-43db5b55eaae67515ae926c0d195c1ef6aa4b607.tar.gz cwm-43db5b55eaae67515ae926c0d195c1ef6aa4b607.tar.xz cwm-43db5b55eaae67515ae926c0d195c1ef6aa4b607.zip |
As done for buttonrelease, work specific un-cycling and un-highlighting actions
into the keyrelease event, only performing what's actually needed for each; should result in much fewer events against keyreleases. No intended behaviour change. Additionally, like we do for group membership, grab the keyboard only when required for cycling.
-rw-r--r-- | calmwm.h | 2 | ||||
-rw-r--r-- | client.c | 22 | ||||
-rw-r--r-- | kbfunc.c | 11 | ||||
-rw-r--r-- | xevents.c | 13 |
4 files changed, 23 insertions, 25 deletions
diff --git a/calmwm.h b/calmwm.h index 9bb6c59..d289ceb 100644 --- a/calmwm.h +++ b/calmwm.h @@ -389,7 +389,6 @@ void client_applysizehints(struct client_ctx *); void client_config(struct client_ctx *); struct client_ctx *client_current(void); void client_cycle(struct screen_ctx *, int); -void client_cycle_leave(struct screen_ctx *); void client_delete(struct client_ctx *); void client_draw_border(struct client_ctx *); struct client_ctx *client_find(Window); @@ -401,6 +400,7 @@ void client_lower(struct client_ctx *); void client_map(struct client_ctx *); void client_msg(struct client_ctx *, Atom, Time); void client_move(struct client_ctx *); +void client_mtf(struct client_ctx *); int client_inbound(struct client_ctx *, int, int); struct client_ctx *client_init(Window, struct screen_ctx *, int); void client_ptr_inbound(struct client_ctx *, int); diff --git a/client.c b/client.c index 3a1ce01..91a708a 100644 --- a/client.c +++ b/client.c @@ -33,7 +33,6 @@ static struct client_ctx *client_next(struct client_ctx *); static struct client_ctx *client_prev(struct client_ctx *); -static void client_mtf(struct client_ctx *); static void client_placecalc(struct client_ctx *); static void client_wm_protocols(struct client_ctx *); static void client_mwm_hints(struct client_ctx *); @@ -683,10 +682,6 @@ client_cycle(struct screen_ctx *sc, int flags) struct client_ctx *newcc, *oldcc, *prevcc; int again = 1; - /* For X apps that ignore events. */ - XGrabKeyboard(X_Dpy, sc->rootwin, True, - GrabModeAsync, GrabModeAsync, CurrentTime); - if (TAILQ_EMPTY(&sc->clientq)) return; @@ -730,21 +725,6 @@ client_cycle(struct screen_ctx *sc, int flags) client_ptrwarp(newcc); } -void -client_cycle_leave(struct screen_ctx *sc) -{ - struct client_ctx *cc; - - sc->cycling = 0; - - if ((cc = client_current()) != NULL) { - client_mtf(cc); - cc->flags &= ~CLIENT_HIGHLIGHT; - client_draw_border(cc); - XUngrabKeyboard(X_Dpy, CurrentTime); - } -} - static struct client_ctx * client_next(struct client_ctx *cc) { @@ -817,7 +797,7 @@ client_placecalc(struct client_ctx *cc) } } -static void +void client_mtf(struct client_ctx *cc) { struct screen_ctx *sc = cc->sc; diff --git a/kbfunc.c b/kbfunc.c index 55e8d67..cf3f7e3 100644 --- a/kbfunc.c +++ b/kbfunc.c @@ -398,7 +398,14 @@ kbfunc_client_vtile(void *ctx, struct cargs *cargs) void kbfunc_client_cycle(void *ctx, struct cargs *cargs) { - client_cycle(ctx, cargs->flag); + struct screen_ctx *sc = ctx; + + /* For X apps that ignore/steal events. */ + if (cargs->xev == CWM_XEV_KEY) + XGrabKeyboard(X_Dpy, sc->rootwin, True, + GrabModeAsync, GrabModeAsync, CurrentTime); + + client_cycle(sc, cargs->flag); } void @@ -406,7 +413,7 @@ kbfunc_client_toggle_group(void *ctx, struct cargs *cargs) { struct client_ctx *cc = ctx; - /* For X apps that steal events. */ + /* For X apps that ignore/steal events. */ if (cargs->xev == CWM_XEV_KEY) XGrabKeyboard(X_Dpy, cc->win, True, GrabModeAsync, GrabModeAsync, CurrentTime); diff --git a/xevents.c b/xevents.c index 444b99a..784f8d0 100644 --- a/xevents.c +++ b/xevents.c @@ -324,6 +324,7 @@ xev_handle_keyrelease(XEvent *ee) { XKeyEvent *e = &ee->xkey; struct screen_ctx *sc; + struct client_ctx *cc; KeySym keysym; unsigned int i; @@ -333,7 +334,17 @@ xev_handle_keyrelease(XEvent *ee) keysym = XkbKeycodeToKeysym(X_Dpy, e->keycode, 0, 0); for (i = 0; i < nitems(modkeys); i++) { if (keysym == modkeys[i]) { - client_cycle_leave(sc); + if ((cc = client_current()) != NULL) { + if (sc->cycling) { + sc->cycling = 0; + client_mtf(cc); + } + if (cc->flags & CLIENT_HIGHLIGHT) { + cc->flags &= ~CLIENT_HIGHLIGHT; + client_draw_border(cc); + } + } + XUngrabKeyboard(X_Dpy, CurrentTime); break; } } |