This patch is heavily inspired by the moveplace patch. It allows to "throw" windows in 4 directions, which makes them floating (if not floating already) and then moves them in the chosen direction until they hit the border of the screen. Unlike moveplace, the windows get to keep their original size. Additionally, there's a "middle direction" defined which simply centers a window on the screen. diff --git a/config.def.h b/config.def.h index 1c0b587..cd8b0a7 100644 --- a/config.def.h +++ b/config.def.h @@ -84,6 +84,11 @@ static Key keys[] = { { MODKEY, XK_period, focusmon, {.i = +1 } }, { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, + { MODKEY|ShiftMask, XK_Up, movethrow, {.ui = DIR_N }}, + { MODKEY|ShiftMask, XK_Down, movethrow, {.ui = DIR_S }}, + { MODKEY|ShiftMask, XK_Left, movethrow, {.ui = DIR_W }}, + { MODKEY|ShiftMask, XK_Right, movethrow, {.ui = DIR_E }}, + { MODKEY|ShiftMask, XK_m, movethrow, {.ui = DIR_C }}, TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2) diff --git a/dwm.c b/dwm.c index 4465af1..16f4b08 100644 --- a/dwm.c +++ b/dwm.c @@ -66,6 +66,7 @@ enum { NetSupported, NetWMName, NetWMState, NetWMCheck, enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ +enum { DIR_N, DIR_W, DIR_C, DIR_E, DIR_S, }; /* coordinates for movethrow */ typedef union { int i; @@ -183,6 +184,7 @@ static void maprequest(XEvent *e); static void monocle(Monitor *m); static void motionnotify(XEvent *e); static void movemouse(const Arg *arg); +static void movethrow(const Arg *arg); static Client *nexttiled(Client *c); static void pop(Client *); static void propertynotify(XEvent *e); @@ -1192,6 +1194,46 @@ movemouse(const Arg *arg) } } +void +movethrow(const Arg *arg) +{ + Client *c; + int nh, nw, nx, ny; + c = selmon->sel; + if (!c) + return; + if (selmon->lt[selmon->sellt]->arrange && !c->isfloating) + togglefloating(NULL); + nw = c->w; + nh = c->h; + switch(arg->ui) { + case DIR_N: + nx = c->x; + ny = selmon->wy; + break; + case DIR_E: + nx = selmon->wx + selmon->ww - c->w - c->bw*2; + ny = c->y; + break; + case DIR_S: + nx = c->x; + ny = selmon->wy + selmon->wh - c->h - c->bw*2; + break; + case DIR_W: + nx = selmon->wx; + ny = c->y; + break; + case DIR_C: + nx = selmon->wx + ((selmon->ww - c->w - c->bw*2) / 2); + ny = selmon->wy + ((selmon->wh - c->h - c->bw*2) / 2); + break; + default: + return; + } + resize(c, nx, ny, nw, nh, True); + XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, nw/2, nh/2); +} + Client * nexttiled(Client *c) {