untested monocle
12ea9250
4 file(s) · +55 −45
| 32 | 32 | ||
| 33 | 33 | static Layout layouts[] = { |
|
| 34 | 34 | /* symbol arrange function */ |
|
| 35 | - | { "[]=", tile }, /* first entry is default */ |
|
| 36 | - | { "><>", NULL }, /* no layout function means floating behavior */ |
|
| 35 | + | { "[]=", tile }, /* first entry is default */ |
|
| 36 | + | { "><>", NULL }, /* no layout function means floating behavior */ |
|
| 37 | + | { "[M]", monocle }, /* first entry is default */ |
|
| 37 | 38 | }; |
|
| 38 | 39 | ||
| 39 | 40 | /* key definitions */ |
|
| 60 | 61 | { MODKEY, XK_k, focusstack, {.i = -1 } }, |
|
| 61 | 62 | { MODKEY, XK_h, setmfact, {.f = -0.05} }, |
|
| 62 | 63 | { MODKEY, XK_l, setmfact, {.f = +0.05} }, |
|
| 63 | - | { MODKEY, XK_m, togglemax, {0} }, |
|
| 64 | 64 | { MODKEY, XK_Return, zoom, {0} }, |
|
| 65 | 65 | { MODKEY, XK_Tab, view, {0} }, |
|
| 66 | 66 | { MODKEY|ShiftMask, XK_c, killclient, {0} }, |
|
| 67 | - | { MODKEY, XK_space, togglelayout, {0} }, |
|
| 67 | + | { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, |
|
| 68 | + | { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, |
|
| 69 | + | { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, |
|
| 70 | + | { MODKEY, XK_space, setlayout, {0} }, |
|
| 68 | 71 | { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, |
|
| 69 | 72 | { MODKEY, XK_0, view, {.ui = ~0 } }, |
|
| 70 | 73 | { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, |
|
| 91 | 94 | * ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ |
|
| 92 | 95 | static Button buttons[] = { |
|
| 93 | 96 | /* click event mask button function argument */ |
|
| 94 | - | { ClkLtSymbol, 0, Button1, togglelayout, {0} }, |
|
| 95 | - | { ClkLtSymbol, 0, Button3, togglemax, {0} }, |
|
| 97 | + | { ClkLtSymbol, 0, Button1, setlayout, {0} }, |
|
| 98 | + | { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, |
|
| 96 | 99 | { ClkWinTitle, 0, Button2, zoom, {0} }, |
|
| 97 | 100 | { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, |
|
| 98 | 101 | { ClkClientWin, MODKEY, Button1, movemouse, {0} }, |
|
| 1 | 1 | # dwm version |
|
| 2 | - | VERSION = 5.0.1 |
|
| 2 | + | VERSION = 5.1 |
|
| 3 | 3 | ||
| 4 | 4 | # Customize below to fit your system |
|
| 5 | 5 |
| 60 | 60 | .B Mod1\-b |
|
| 61 | 61 | Toggles bar on and off. |
|
| 62 | 62 | .TP |
|
| 63 | + | .B Mod1\-t |
|
| 64 | + | Sets tiled layout. |
|
| 65 | + | .TP |
|
| 66 | + | .B Mod1\-f |
|
| 67 | + | Sets floating layout. |
|
| 68 | + | .TP |
|
| 69 | + | .B Mod1\-f |
|
| 70 | + | Sets monocle layout. |
|
| 71 | + | .TP |
|
| 63 | 72 | .B Mod1\-space |
|
| 64 | - | Toggles between layouts. |
|
| 73 | + | Toggles between current and previous layout. |
|
| 65 | 74 | .TP |
|
| 66 | 75 | .B Mod1\-j |
|
| 67 | 76 | Focus next window. |
| 89 | 89 | int basew, baseh, incw, inch, maxw, maxh, minw, minh; |
|
| 90 | 90 | int bw, oldbw; |
|
| 91 | 91 | uint tags; |
|
| 92 | - | Bool isbanned, isfixed, isfloating, ismoved, isurgent; |
|
| 92 | + | Bool isbanned, isfixed, isfloating, isurgent; |
|
| 93 | 93 | Client *next; |
|
| 94 | 94 | Client *snext; |
|
| 95 | 95 | Window win; |
|
| 168 | 168 | static void manage(Window w, XWindowAttributes *wa); |
|
| 169 | 169 | static void mappingnotify(XEvent *e); |
|
| 170 | 170 | static void maprequest(XEvent *e); |
|
| 171 | + | static void monocle(void); |
|
| 171 | 172 | static void movemouse(const Arg *arg); |
|
| 172 | 173 | static Client *nexttiled(Client *c); |
|
| 173 | 174 | static void propertynotify(XEvent *e); |
|
| 178 | 179 | static void run(void); |
|
| 179 | 180 | static void scan(void); |
|
| 180 | 181 | static void setclientstate(Client *c, long state); |
|
| 182 | + | static void setlayout(const Arg *arg); |
|
| 181 | 183 | static void setmfact(const Arg *arg); |
|
| 182 | 184 | static void setup(void); |
|
| 183 | 185 | static void spawn(const Arg *arg); |
|
| 186 | 188 | static void tile(void); |
|
| 187 | 189 | static void togglebar(const Arg *arg); |
|
| 188 | 190 | static void togglefloating(const Arg *arg); |
|
| 189 | - | static void togglelayout(const Arg *arg); |
|
| 190 | - | static void togglemax(const Arg *arg); |
|
| 191 | 191 | static void toggletag(const Arg *arg); |
|
| 192 | 192 | static void toggleview(const Arg *arg); |
|
| 193 | 193 | static void unmanage(Client *c); |
|
| 225 | 225 | [UnmapNotify] = unmapnotify |
|
| 226 | 226 | }; |
|
| 227 | 227 | static Atom wmatom[WMLast], netatom[NetLast]; |
|
| 228 | - | static Bool ismax = False; |
|
| 229 | 228 | static Bool otherwm, readin; |
|
| 230 | 229 | static Bool running = True; |
|
| 231 | 230 | static uint tagset[] = {1, 1}; /* after start, first tag is selected */ |
|
| 275 | 274 | ||
| 276 | 275 | for(c = clients; c; c = c->next) |
|
| 277 | 276 | if(c->tags & tagset[seltags]) { /* is visible */ |
|
| 278 | - | if(ismax && !c->isfixed) { |
|
| 279 | - | XMoveResizeWindow(dpy, c->win, wx, wy, ww - 2 * c->bw, wh - 2 * c->bw); |
|
| 280 | - | c->ismoved = True; |
|
| 281 | - | } |
|
| 282 | - | else if(!lt->arrange || c->isfloating) |
|
| 277 | + | if(!lt->arrange || c->isfloating) |
|
| 283 | 278 | resize(c, c->x, c->y, c->w, c->h, True); |
|
| 284 | 279 | c->isbanned = False; |
|
| 285 | 280 | } |
|
| 286 | 281 | else if(!c->isbanned) { |
|
| 287 | 282 | XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); |
|
| 288 | - | c->isbanned = c->ismoved = True; |
|
| 283 | + | c->isbanned = True; |
|
| 289 | 284 | } |
|
| 290 | 285 | ||
| 291 | 286 | focus(NULL); |
|
| 292 | - | if(lt->arrange && !ismax) |
|
| 287 | + | if(lt->arrange) |
|
| 293 | 288 | lt->arrange(); |
|
| 294 | 289 | restack(); |
|
| 295 | 290 | } |
|
| 418 | 413 | if((c = getclient(ev->window))) { |
|
| 419 | 414 | if(ev->value_mask & CWBorderWidth) |
|
| 420 | 415 | c->bw = ev->border_width; |
|
| 421 | - | if(ismax && !c->isbanned && !c->isfixed) |
|
| 422 | - | XMoveResizeWindow(dpy, c->win, wx, wy, ww - 2 * c->bw, wh + 2 * c->bw); |
|
| 423 | 416 | else if(c->isfloating || !lt->arrange) { |
|
| 424 | 417 | if(ev->value_mask & CWX) |
|
| 425 | 418 | c->x = sx + ev->x; |
|
| 507 | 500 | } |
|
| 508 | 501 | if(blw > 0) { |
|
| 509 | 502 | dc.w = blw; |
|
| 510 | - | drawtext(lt->symbol, dc.norm, ismax); |
|
| 503 | + | drawtext(lt->symbol, dc.norm, False); |
|
| 511 | 504 | x = dc.x + dc.w; |
|
| 512 | 505 | } |
|
| 513 | 506 | else |
|
| 967 | 960 | } |
|
| 968 | 961 | ||
| 969 | 962 | void |
|
| 963 | + | monocle(void) { |
|
| 964 | + | Client *c; |
|
| 965 | + | ||
| 966 | + | for(c = nexttiled(clients); c; c = nexttiled(c->next)) |
|
| 967 | + | resize(c, wx, wy, ww, wh, resizehints); |
|
| 968 | + | } |
|
| 969 | + | ||
| 970 | + | void |
|
| 970 | 971 | movemouse(const Arg *arg) { |
|
| 971 | 972 | int x1, y1, ocx, ocy, di, nx, ny; |
|
| 972 | 973 | uint dui; |
|
| 1115 | 1116 | h = bh; |
|
| 1116 | 1117 | if(w < bh) |
|
| 1117 | 1118 | w = bh; |
|
| 1118 | - | if(c->x != x || c->y != y || c->w != w || c->h != h || c->ismoved) { |
|
| 1119 | - | c->ismoved = False; |
|
| 1119 | + | if(c->x != x || c->y != y || c->w != w || c->h != h) { |
|
| 1120 | 1120 | c->x = wc.x = x; |
|
| 1121 | 1121 | c->y = wc.y = y; |
|
| 1122 | 1122 | c->w = wc.width = w; |
|
| 1186 | 1186 | drawbar(); |
|
| 1187 | 1187 | if(!sel) |
|
| 1188 | 1188 | return; |
|
| 1189 | - | if(ismax || sel->isfloating || !lt->arrange) |
|
| 1189 | + | if(sel->isfloating || !lt->arrange) |
|
| 1190 | 1190 | XRaiseWindow(dpy, sel->win); |
|
| 1191 | - | if(!ismax && lt->arrange) { |
|
| 1191 | + | if(lt->arrange) { |
|
| 1192 | 1192 | wc.stack_mode = Below; |
|
| 1193 | 1193 | wc.sibling = barwin; |
|
| 1194 | 1194 | for(c = stack; c; c = c->snext) |
|
| 1296 | 1296 | PropModeReplace, (unsigned char *)data, 2); |
|
| 1297 | 1297 | } |
|
| 1298 | 1298 | ||
| 1299 | + | void |
|
| 1300 | + | setlayout(const Arg *arg) { |
|
| 1301 | + | static Layout *prevlt = &layouts[1 % LENGTH(layouts)]; |
|
| 1302 | + | ||
| 1303 | + | if(!arg || !arg->v || arg->v == lt) |
|
| 1304 | + | lt = prevlt; |
|
| 1305 | + | else { |
|
| 1306 | + | prevlt = lt; |
|
| 1307 | + | lt = (Layout *)arg->v; |
|
| 1308 | + | } |
|
| 1309 | + | if(sel) |
|
| 1310 | + | arrange(); |
|
| 1311 | + | else |
|
| 1312 | + | drawbar(); |
|
| 1313 | + | } |
|
| 1314 | + | ||
| 1299 | 1315 | /* arg > 1.0 will set mfact absolutly */ |
|
| 1300 | 1316 | void |
|
| 1301 | 1317 | setmfact(const Arg *arg) { |
|
| 1473 | 1489 | sel->isfloating = !sel->isfloating || sel->isfixed; |
|
| 1474 | 1490 | if(sel->isfloating) |
|
| 1475 | 1491 | resize(sel, sel->x, sel->y, sel->w, sel->h, True); |
|
| 1476 | - | arrange(); |
|
| 1477 | - | } |
|
| 1478 | - | ||
| 1479 | - | void |
|
| 1480 | - | togglelayout(const Arg *arg) { |
|
| 1481 | - | if(arg && arg->v) |
|
| 1482 | - | lt = (Layout *)arg->v; |
|
| 1483 | - | else if(++lt == &layouts[LENGTH(layouts)]) |
|
| 1484 | - | lt = &layouts[0]; |
|
| 1485 | - | if(sel) |
|
| 1486 | - | arrange(); |
|
| 1487 | - | else |
|
| 1488 | - | drawbar(); |
|
| 1489 | - | } |
|
| 1490 | - | ||
| 1491 | - | void |
|
| 1492 | - | togglemax(const Arg *arg) { |
|
| 1493 | - | ismax = !ismax; |
|
| 1494 | 1492 | arrange(); |
|
| 1495 | 1493 | } |
|
| 1496 | 1494 | ||
| 1693 | 1691 | zoom(const Arg *arg) { |
|
| 1694 | 1692 | Client *c = sel; |
|
| 1695 | 1693 | ||
| 1696 | - | if(ismax || !lt->arrange || (sel && sel->isfloating)) |
|
| 1694 | + | if(!lt->arrange || lt->arrange == monocle || (sel && sel->isfloating)) |
|
| 1697 | 1695 | return; |
|
| 1698 | 1696 | if(c == nexttiled(clients)) |
|
| 1699 | 1697 | if(!c || !(c = nexttiled(c->next))) |
|