Tom Murphy wrote:
> Hi,
> 
>   Here's an updated diff from Omar Polo's addition of group-last
>   command to cwm. I've been using it without issues and it's
>   really handy to be able to switch back to the previous
>   workspace you were on with it.
> 
>   Many thanks to Omar Polo for doing all the original work. I've
>   just updated the diff so it applies cleanly.
> 
>   OK?
> 
>   Tom
> 
> 
> Index: calmwm.h
> ===================================================================
> RCS file: /cvs/xenocara/app/cwm/calmwm.h,v
> retrieving revision 1.375
> diff -u -p -r1.375 calmwm.h
> --- calmwm.h  16 Apr 2020 13:32:35 -0000      1.375
> +++ calmwm.h  10 Oct 2021 19:13:41 -0000
> @@ -214,6 +214,7 @@ struct screen_ctx {
>       struct region_q          regionq;
>       struct group_q           groupq;
>       struct group_ctx        *group_active;
> +     int                      group_last;
>       Colormap                 colormap;
>       Visual                  *visual;
>       struct {
> @@ -501,6 +502,7 @@ void                       
> kbfunc_client_toggle_group(void 
>  void                  kbfunc_client_movetogroup(void *, struct cargs *);
>  void                  kbfunc_group_toggle(void *, struct cargs *);
>  void                  kbfunc_group_only(void *, struct cargs *);
> +void                  kbfunc_group_last(void *, struct cargs *);
>  void                  kbfunc_group_close(void *, struct cargs *);
>  void                  kbfunc_group_cycle(void *, struct cargs *);
>  void                  kbfunc_group_toggle_all(void *, struct cargs *);
> Index: conf.c
> ===================================================================
> RCS file: /cvs/xenocara/app/cwm/conf.c,v
> retrieving revision 1.252
> diff -u -p -r1.252 conf.c
> --- conf.c    16 Apr 2020 13:32:35 -0000      1.252
> +++ conf.c    10 Oct 2021 19:13:41 -0000
> @@ -139,6 +139,7 @@ static const struct {
>  
>       { FUNC_SC(group-cycle, group_cycle, (CWM_CYCLE_FORWARD)) },
>       { FUNC_SC(group-rcycle, group_cycle, (CWM_CYCLE_REVERSE)) },
> +     { FUNC_SC(group-last, group_last, 0) },
>       { FUNC_SC(group-toggle-all, group_toggle_all, 0) },
>       { FUNC_SC(group-toggle-1, group_toggle, 1) },
>       { FUNC_SC(group-toggle-2, group_toggle, 2) },
> Index: cwmrc.5
> ===================================================================
> RCS file: /cvs/xenocara/app/cwm/cwmrc.5,v
> retrieving revision 1.76
> diff -u -p -r1.76 cwmrc.5
> --- cwmrc.5   16 Apr 2020 13:32:35 -0000      1.76
> +++ cwmrc.5   10 Oct 2021 19:13:41 -0000
> @@ -273,6 +273,8 @@ menu.
>  Toggle visibility of group n, where n is 1-9.
>  .It group-only-[n]
>  Show only group n, where n is 1-9, hiding other groups.
> +.It group-last
> +Show only the last viewed group.
>  .It group-close-[n]
>  Close all windows in group n, where n is 1-9.
>  .It group-toggle-all
> Index: group.c
> ===================================================================
> RCS file: /cvs/xenocara/app/cwm/group.c,v
> retrieving revision 1.137
> diff -u -p -r1.137 group.c
> --- group.c   27 Feb 2020 14:56:39 -0000      1.137
> +++ group.c   10 Oct 2021 19:13:41 -0000
> @@ -215,6 +215,9 @@ group_only(struct screen_ctx *sc, int id
>  {
>       struct group_ctx        *gc;
>  
> +     if (sc->group_active->num != idx)
> +             sc->group_last = sc->group_active->num;
> +
>       TAILQ_FOREACH(gc, &sc->groupq, entry) {
>               if (gc->num == idx)
>                       group_show(gc);
> Index: kbfunc.c
> ===================================================================
> RCS file: /cvs/xenocara/app/cwm/kbfunc.c,v
> retrieving revision 1.170
> diff -u -p -r1.170 kbfunc.c
> --- kbfunc.c  20 Mar 2020 18:50:08 -0000      1.170
> +++ kbfunc.c  10 Oct 2021 19:13:41 -0000
> @@ -479,6 +479,14 @@ kbfunc_group_only(void *ctx, struct carg
>  }
>  
>  void
> +kbfunc_group_last(void *ctx, struct cargs *cargs)
> +{
> +     struct screen_ctx       *sc = ctx;
> +
> +     group_only(ctx, sc->group_last);
> +}
> +
> +void
>  kbfunc_group_toggle(void *ctx, struct cargs *cargs)
>  {
>       group_toggle(ctx, cargs->flag);
> Index: screen.c
> ===================================================================
> RCS file: /cvs/xenocara/app/cwm/screen.c,v
> retrieving revision 1.97
> diff -u -p -r1.97 screen.c
> --- screen.c  24 Mar 2020 14:47:29 -0000      1.97
> +++ screen.c  10 Oct 2021 19:13:41 -0000
> @@ -53,6 +53,7 @@ screen_init(int which)
>       sc->visual = DefaultVisual(X_Dpy, sc->which);
>       sc->cycling = 0;
>       sc->hideall = 0;
> +     sc->group_last = 1;
>  
>       conf_screen(sc);


I discovered something strange while testing this. 
X Windows appears to bug out and ends up showing one
of the windows across all groups until cwm is reloaded.

To reproduce:

1. Bind group-last to any key you like (I used 4-Tab)
2. Open up a window in group 1
3. Switch to group 2 and open up a different window there
4. Switch back to group 1
5. Jam on the 4-Tab key (or whatever you bound in step 1)
6. After a while the windows flicker and then you get one
   of the windows stuck as sticky.
7. $HOME/.xsession-errors contains error messages like these:

[ 10/10/21 22:29:12.946 x_create_picture_with_pictfmt_and_pixmap ERROR ]
 failed to create picture (X error 9 DRAWABLE request 139 minor 4 serial 4284)
[ 10/10/21 22:29:12.962 paint_one ERROR ] Window 0x0060000c is missing
 painting data.
[ 10/10/21 22:29:13.079 x_create_picture_with_pictfmt_and_pixmap ERROR ]
 failed to create picture (X error 9 DRAWABLE request 139 minor 4 serial 4501)
[ 10/10/21 22:29:13.094 paint_one ERROR ] Window 0x0060000c is missing
 painting data.
(etc... with different numbers after 'serial')

I wonder if I triggered some X Windows bug by not using this function
as intended? (toggling it over and over would not be normal use)

It does work on normal desktop usage, as most people won't be trying
to break it like this.

Any ideas? Seems strange behavior to me.

Thanks,
Tom

Reply via email to