On Thu, Nov 30, 2017 at 09:09:40PM +0100, Thuban wrote:
> This feature sounds very useful to me.

This feature was in original calmwm and was very useful for me too.
> 
> * Julien Steinhauser <j...@ldd.fr> le [22-11-2017 21:27:34 +0100]:
> > A long time ago sent Dimitris Papastamos a patch to misc which
> > let one send X clients to corners.[0]
> > 
> > I think it is useful so thank you Dimitris!
> > With some minor editing it still builds on current.
> > 
> > I have no use of window-move-{up,down,right,left}{,-big} but X client
> > corner warping is done on a regular basis.
> > 
> > At the time it did not receive the attention it (IMO) deserves.
> > Maybe was it because "feature" was written on the first line? ;)
> > I know featuritis is considered a disease around here and
> > I'm happy it is but here is an updated version anyway.
> > 
> > This version lacks the keybindings from the initial patch,
> > it also lacks for now a change in the man pages.
> > I use it with the following in ~/.cwmrc:
> > 
> > bind-key 4S-Left                    window-movebottomleft
> > bind-key 4S-Right                   window-movebottomright
> > bind-key 4S-XF86Back                window-movetopleft
> > bind-key 4S-XF86Forward             window-movetopright
> > 
> > I know these are not standards keys found on every keyboard,
> > but Thinkpads are not exotic beasts in this land so it might
> > be an helpful start to some of you and every declinaison of h j k l
> > was already in use in the default config.
> > 
> > OK?
> > 
> > [0] https://marc.info/?l=openbsd-misc&m=140344759017419&w=2
> > 
> > Index: calmwm.h
> > ===================================================================
> > RCS file: /cvs/xenocara/app/cwm/calmwm.h,v
> > retrieving revision 1.341
> > diff -u -p -r1.341 calmwm.h
> > --- calmwm.h        14 Jul 2017 17:23:38 -0000      1.341
> > +++ calmwm.h        22 Nov 2017 19:21:47 -0000
> > @@ -54,6 +54,10 @@
> >  #define CWM_DOWN           0x0002
> >  #define CWM_LEFT           0x0004
> >  #define CWM_RIGHT          0x0008
> > +#define CWM_TOP_LEFT        0x0100
> > +#define CWM_BOTTOM_LEFT     0x0200
> > +#define CWM_TOP_RIGHT              0x0400
> > +#define CWM_BOTTOM_RIGHT   0x0800
> >  #define CWM_BIGAMOUNT              0x0010
> >  #define DIRECTIONMASK      (CWM_UP | CWM_DOWN | CWM_LEFT | CWM_RIGHT)
> >  
> > @@ -476,6 +480,7 @@ void                     
> > kbfunc_client_toggle_hmaximize(v
> >  void                        kbfunc_client_toggle_vmaximize(void *, struct 
> > cargs *);
> >  void                        kbfunc_client_htile(void *, struct cargs *);
> >  void                        kbfunc_client_vtile(void *, struct cargs *);
> > +void                        kbfunc_client_move_edge(void *, struct cargs 
> > *);
> >  void                        kbfunc_client_cycle(void *, struct cargs *);
> >  void                        kbfunc_client_toggle_group(void *, struct 
> > cargs *);
> >  void                        kbfunc_client_movetogroup(void *, struct cargs 
> > *);
> > Index: conf.c
> > ===================================================================
> > RCS file: /cvs/xenocara/app/cwm/conf.c,v
> > retrieving revision 1.233
> > diff -u -p -r1.233 conf.c
> > --- conf.c  14 Jul 2017 17:23:38 -0000      1.233
> > +++ conf.c  22 Nov 2017 19:21:48 -0000
> > @@ -67,6 +67,14 @@ static const struct {
> >     { "window-delete", kbfunc_client_delete, CWM_CONTEXT_CC, 0 },
> >     { "window-htile", kbfunc_client_htile, CWM_CONTEXT_CC, 0 },
> >     { "window-vtile", kbfunc_client_vtile, CWM_CONTEXT_CC, 0 },
> > +   { "window-movetopleft", kbfunc_client_move_edge, CWM_CONTEXT_CC,
> > +       (CWM_TOP_LEFT) },
> > +   { "window-movebottomleft", kbfunc_client_move_edge, CWM_CONTEXT_CC,
> > +       (CWM_BOTTOM_LEFT) },
> > +   { "window-movetopright", kbfunc_client_move_edge, CWM_CONTEXT_CC,
> > +       (CWM_TOP_RIGHT) },
> > +   { "window-movebottomright", kbfunc_client_move_edge, CWM_CONTEXT_CC,
> > +       (CWM_BOTTOM_RIGHT) },
> >     { "window-stick", kbfunc_client_toggle_sticky, CWM_CONTEXT_CC, 0 },
> >     { "window-fullscreen", kbfunc_client_toggle_fullscreen, CWM_CONTEXT_CC, 
> > 0 },
> >     { "window-maximize", kbfunc_client_toggle_maximize, CWM_CONTEXT_CC, 0 },
> > @@ -666,6 +674,51 @@ conf_grab_mouse(Window win)
> >                         BUTTONMASK, GrabModeAsync, GrabModeSync,
> >                         None, None);
> >             }
> > +   }
> > +}
> > +
> > +void
> > +kbfunc_client_move_edge(void *ctx, struct cargs *cargs)
> > +{
> > +   struct client_ctx       *cc = ctx;
> > +   struct screen_ctx       *sc = cc->sc;
> > +   struct geom             xine;
> > +   int                      flags;
> > +
> > +   /*
> > +    * pick screen that the middle of the window is on.
> > +    * that's probably more fair than if just the origin of
> > +    * a window is poking over a boundary
> > +    */
> > +   xine = screen_area(sc,
> > +       cc->geom.x + cc->geom.w / 2,
> > +       cc->geom.y + cc->geom.h / 2, CWM_GAP);
> > +
> > +   flags = cargs->flag;
> > +
> > +   switch (flags) {
> > +   case CWM_TOP_LEFT:
> > +            cc->geom.x = xine.x;
> > +            cc->geom.y = xine.y;
> > +            client_move(cc);
> > +            break;
> > +   case CWM_BOTTOM_LEFT:
> > +            cc->geom.x = xine.x;
> > +            cc->geom.y = xine.y + xine.h - cc->geom.h - cc->bwidth * 2;
> > +            client_move(cc);
> > +            break;
> > +   case CWM_TOP_RIGHT:
> > +            cc->geom.x = xine.x + xine.w - cc->geom.w - cc->bwidth * 2;
> > +            cc->geom.y = xine.y;
> > +            client_move(cc);
> > +            break;
> > +   case CWM_BOTTOM_RIGHT:
> > +            cc->geom.x = xine.x + xine.w - cc->geom.w - cc->bwidth * 2;
> > +            cc->geom.y = xine.y + xine.h - cc->geom.h - cc->bwidth * 2;
> > +            client_move(cc);
> > +            break;
> > +   default:
> > +            warnx("invalid flags passed to kbfunc_client_move_edge");
> >     }
> >  }
> >  
> 
> -- 
> thuban


Reply via email to