dwm-movethrow-6.2.diff (3044B)
1 This patch is heavily inspired by the moveplace patch. It allows to "throw" 2 windows in 4 directions, which makes them floating (if not floating already) 3 and then moves them in the chosen direction until they hit the border of the 4 screen. Unlike moveplace, the windows get to keep their original size. 5 Additionally, there's a "middle direction" defined which simply centers a 6 window on the screen. 7 8 diff --git a/config.def.h b/config.def.h 9 index 1c0b587..cd8b0a7 100644 10 --- a/config.def.h 11 +++ b/config.def.h 12 @@ -84,6 +84,11 @@ static Key keys[] = { 13 { MODKEY, XK_period, focusmon, {.i = +1 } }, 14 { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, 15 { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, 16 + { MODKEY|ShiftMask, XK_Up, movethrow, {.ui = DIR_N }}, 17 + { MODKEY|ShiftMask, XK_Down, movethrow, {.ui = DIR_S }}, 18 + { MODKEY|ShiftMask, XK_Left, movethrow, {.ui = DIR_W }}, 19 + { MODKEY|ShiftMask, XK_Right, movethrow, {.ui = DIR_E }}, 20 + { MODKEY|ShiftMask, XK_m, movethrow, {.ui = DIR_C }}, 21 TAGKEYS( XK_1, 0) 22 TAGKEYS( XK_2, 1) 23 TAGKEYS( XK_3, 2) 24 diff --git a/dwm.c b/dwm.c 25 index 4465af1..16f4b08 100644 26 --- a/dwm.c 27 +++ b/dwm.c 28 @@ -66,6 +66,7 @@ enum { NetSupported, NetWMName, NetWMState, NetWMCheck, 29 enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ 30 enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, 31 ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ 32 +enum { DIR_N, DIR_W, DIR_C, DIR_E, DIR_S, }; /* coordinates for movethrow */ 33 34 typedef union { 35 int i; 36 @@ -183,6 +184,7 @@ static void maprequest(XEvent *e); 37 static void monocle(Monitor *m); 38 static void motionnotify(XEvent *e); 39 static void movemouse(const Arg *arg); 40 +static void movethrow(const Arg *arg); 41 static Client *nexttiled(Client *c); 42 static void pop(Client *); 43 static void propertynotify(XEvent *e); 44 @@ -1192,6 +1194,46 @@ movemouse(const Arg *arg) 45 } 46 } 47 48 +void 49 +movethrow(const Arg *arg) 50 +{ 51 + Client *c; 52 + int nh, nw, nx, ny; 53 + c = selmon->sel; 54 + if (!c) 55 + return; 56 + if (selmon->lt[selmon->sellt]->arrange && !c->isfloating) 57 + togglefloating(NULL); 58 + nw = c->w; 59 + nh = c->h; 60 + switch(arg->ui) { 61 + case DIR_N: 62 + nx = c->x; 63 + ny = selmon->wy; 64 + break; 65 + case DIR_E: 66 + nx = selmon->wx + selmon->ww - c->w - c->bw*2; 67 + ny = c->y; 68 + break; 69 + case DIR_S: 70 + nx = c->x; 71 + ny = selmon->wy + selmon->wh - c->h - c->bw*2; 72 + break; 73 + case DIR_W: 74 + nx = selmon->wx; 75 + ny = c->y; 76 + break; 77 + case DIR_C: 78 + nx = selmon->wx + ((selmon->ww - c->w - c->bw*2) / 2); 79 + ny = selmon->wy + ((selmon->wh - c->h - c->bw*2) / 2); 80 + break; 81 + default: 82 + return; 83 + } 84 + resize(c, nx, ny, nw, nh, True); 85 + XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, nw/2, nh/2); 86 +} 87 + 88 Client * 89 nexttiled(Client *c) 90 {