diff options
author | okan | 2017-12-29 18:50:43 +0000 |
---|---|---|
committer | okan | 2017-12-29 18:50:43 +0000 |
commit | 94fa8f6008663944358afaeb58a1217cf564a95c (patch) | |
tree | 4bdd8f886ccf464e30724d945a5843cbdfbc9bb7 | |
parent | 2752425282f3222e609d25dee2df4f4d666274d5 (diff) | |
download | cwm-94fa8f6008663944358afaeb58a1217cf564a95c.tar.gz |
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 | 4 | ||||
-rw-r--r-- | client.c | 24 | ||||
-rw-r--r-- | kbfunc.c | 13 | ||||
-rw-r--r-- | xevents.c | 15 |
4 files changed, 27 insertions, 29 deletions
@@ -15,7 +15,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $OpenBSD: calmwm.h,v 1.349 2017/12/29 16:55:50 okan Exp $ + * $OpenBSD: calmwm.h,v 1.350 2017/12/29 18:50:43 okan Exp $ */ #ifndef _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); @@ -15,7 +15,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $OpenBSD: client.c,v 1.243 2017/12/29 12:54:54 okan Exp $ + * $OpenBSD: client.c,v 1.244 2017/12/29 18:50:43 okan Exp $ */ #include <sys/types.h> @@ -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; @@ -15,7 +15,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $OpenBSD: kbfunc.c,v 1.157 2017/12/29 16:55:50 okan Exp $ + * $OpenBSD: kbfunc.c,v 1.158 2017/12/29 18:50:43 okan Exp $ */ #include <sys/types.h> @@ -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); @@ -15,7 +15,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $OpenBSD: xevents.c,v 1.131 2017/12/29 16:55:50 okan Exp $ + * $OpenBSD: xevents.c,v 1.132 2017/12/29 18:50:43 okan Exp $ */ /* @@ -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; } } |