On Sat, Nov 21, 2015 at 02:10:15AM +0100, Vadim Vygonets wrote:
> Hi,
>
> After cycling through many windows, the original window may be
> obscured by many others, and if you still want to see its
> contents you end up doing the Alt-Tab-Tab-Tab-Tab-Tab, Alt-Tab,
> Alt-Tab dance.
Even this not always helps. Often I need press Alt+Down or Alt+Up
to get window up.
Thanks for your effort.
>
> This patch adds restacking of windows during cycling. Hold Alt,
> press Tab and a window will be raised. Press Tab again while
> still holding Alt and that window will be lowered back before
> another is raised. Once you release Alt, the original window
> will be hidden behind no more than one other (the target),
> assuming it was raised before.
>
> What do you think?
>
> Vadik.
>
> --
> Nondeterminism means never having to say you are wrong.
> ? cwm-incresize.diff
> ? p
> Index: calmwm.h
> ===================================================================
> RCS file: /cvs/xenocara/app/cwm/calmwm.h,v
> retrieving revision 1.311
> diff -u -r1.311 calmwm.h
> --- calmwm.h 12 Nov 2015 21:28:03 -0000 1.311
> +++ calmwm.h 21 Nov 2015 00:12:09 -0000
> @@ -62,6 +62,8 @@
> #define CWM_CLIENT_RCYCLE 0x0002
> #define CWM_CLIENT_CYCLE_INGRP 0x0004
>
> +#define CWM_CLIENT_RESTACK_GRP 0x0001
> +
> #define CWM_CLIENT_TILE_HORIZ 0x0001
> #define CWM_CLIENT_TILE_VERT 0x0002
>
> @@ -385,6 +387,7 @@
> void client_applysizehints(struct client_ctx *);
> void client_config(struct client_ctx *);
> struct client_ctx *client_current(void);
> +void client_restack(struct client_ctx_q *, int);
> void client_cycle(struct screen_ctx *, int);
> void client_cycle_leave(struct screen_ctx *);
> void client_delete(struct client_ctx *);
> Index: client.c
> ===================================================================
> RCS file: /cvs/xenocara/app/cwm/client.c,v
> retrieving revision 1.214
> diff -u -r1.214 client.c
> --- client.c 12 Nov 2015 18:33:30 -0000 1.214
> +++ client.c 21 Nov 2015 00:12:09 -0000
> @@ -664,6 +664,50 @@
> }
>
> void
> +client_restack(struct client_ctx_q *clientq, int flags)
> +{
> +#define CLIENTQ_FOREACH(var, head, ingrp) \
> + for((var) = TAILQ_FIRST(head); \
> + (var) != TAILQ_END(head); \
> + (var) = (ingrp) ? \
> + TAILQ_NEXT(var, group_entry) : TAILQ_NEXT(var, entry))
> + struct client_ctx *cc;
> + Window *winlist;
> + int i, lastempty = -1;
> + int nwins = 0, highstack = 0;
> +
> + CLIENTQ_FOREACH(cc, clientq, flags & CWM_CLIENT_RESTACK_GRP) {
> + if (cc->flags & CLIENT_HIDDEN)
> + continue;
> + if (cc->stackingorder > highstack)
> + highstack = cc->stackingorder;
> + }
> + winlist = xreallocarray(NULL, (highstack + 1), sizeof(*winlist));
> +
> + /* Invert the stacking order for XRestackWindows(). */
> + CLIENTQ_FOREACH(cc, clientq, flags & CWM_CLIENT_RESTACK_GRP) {
> + if (cc->flags & CLIENT_HIDDEN)
> + continue;
> + winlist[highstack - cc->stackingorder] = cc->win;
> + nwins++;
> + }
> +
> + /* Un-sparseify */
> + for (i = 0; i <= highstack; i++) {
> + if (!winlist[i] && lastempty == -1)
> + lastempty = i;
> + else if (winlist[i] && lastempty != -1) {
> + winlist[lastempty] = winlist[i];
> + if (++lastempty == i)
> + lastempty = -1;
> + }
> + }
> +
> + XRestackWindows(X_Dpy, winlist, nwins);
> + free(winlist);
> +}
> +
> +void
> client_cycle(struct screen_ctx *sc, int flags)
> {
> struct client_ctx *newcc, *oldcc;
> @@ -704,9 +748,15 @@
> }
> }
>
> - /* reset when cycling mod is released. XXX I hate this hack */
> - sc->cycling = 1;
> client_ptrsave(oldcc);
> + if (!sc->cycling) {
> + /* reset when cycling mod is released. XXX I hate this hack */
> + sc->cycling = 1;
> + screen_updatestackingorder(sc);
> + } else {
> + client_restack(&sc->clientq, (flags & CWM_CLIENT_CYCLE_INGRP) ?
> + CWM_CLIENT_RESTACK_GRP : 0);
> + }
> client_ptrwarp(newcc);
> }
>
> Index: group.c
> ===================================================================
> RCS file: /cvs/xenocara/app/cwm/group.c,v
> retrieving revision 1.121
> diff -u -r1.121 group.c
> --- group.c 10 Nov 2015 20:05:33 -0000 1.121
> +++ group.c 21 Nov 2015 00:12:09 -0000
> @@ -34,7 +34,6 @@
>
> static struct group_ctx *group_next(struct group_ctx *);
> static struct group_ctx *group_prev(struct group_ctx *);
> -static void group_restack(struct group_ctx *);
> static void group_setactive(struct group_ctx *);
>
> const char *num_to_name[] = {
> @@ -82,43 +81,8 @@
> client_unhide(cc);
> }
>
> - group_restack(gc);
> + client_restack(&gc->clientq, CWM_CLIENT_RESTACK_GRP);
> group_setactive(gc);
> -}
> -
> -static void
> -group_restack(struct group_ctx *gc)
> -{
> - struct client_ctx *cc;
> - Window *winlist;
> - int i, lastempty = -1;
> - int nwins = 0, highstack = 0;
> -
> - TAILQ_FOREACH(cc, &gc->clientq, group_entry) {
> - if (cc->stackingorder > highstack)
> - highstack = cc->stackingorder;
> - }
> - winlist = xreallocarray(NULL, (highstack + 1), sizeof(*winlist));
> -
> - /* Invert the stacking order for XRestackWindows(). */
> - TAILQ_FOREACH(cc, &gc->clientq, group_entry) {
> - winlist[highstack - cc->stackingorder] = cc->win;
> - nwins++;
> - }
> -
> - /* Un-sparseify */
> - for (i = 0; i <= highstack; i++) {
> - if (!winlist[i] && lastempty == -1)
> - lastempty = i;
> - else if (winlist[i] && lastempty != -1) {
> - winlist[lastempty] = winlist[i];
> - if (++lastempty == i)
> - lastempty = -1;
> - }
> - }
> -
> - XRestackWindows(X_Dpy, winlist, nwins);
> - free(winlist);
> }
>
> void