Hi,
On Wed, Nov 22, 2017 at 3:27 PM, Julien Steinhauser <[email protected]> wrote:
> 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.
>
>
>
I'm not opposed to this completely...I would in fact consider implementing
this on-top of the snapping we already have allow snap'ing to an edge,
regardless if one wants to snap to one or two edges.
> 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");
> }
> }
>
>
>