This feature sounds very useful to me. * 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
signature.asc
Description: PGP signature