diff options
-rw-r--r-- | colors.h | 9 | ||||
-rw-r--r-- | config.def.h | 57 | ||||
-rw-r--r-- | config.h | 203 | ||||
-rw-r--r-- | config.mk | 2 | ||||
-rw-r--r-- | drw.c | 1 | ||||
-rw-r--r-- | dwm.1 | 22 | ||||
-rw-r--r-- | dwm.c | 437 | ||||
-rw-r--r-- | vanitygaps.c | 809 |
8 files changed, 58 insertions, 1482 deletions
diff --git a/colors.h b/colors.h deleted file mode 100644 index 0a4fdf0..0000000 --- a/colors.h +++ /dev/null @@ -1,9 +0,0 @@ -/* Norm Colors */ -static const char norm_fg[] = "#bbbbbb"; -static const char norm_bg[] = "#222222"; -static const char norm_border[] = "#444444"; - -/* Sel Colors */ -static const char sel_fg[] = "#eeeeee"; -static const char sel_bg[] = "#005577"; -static const char sel_border[] = "#005577"; diff --git a/config.def.h b/config.def.h index 4e929ee..1c0b587 100644 --- a/config.def.h +++ b/config.def.h @@ -3,16 +3,8 @@ /* appearance */ static const unsigned int borderpx = 1; /* border pixel of windows */ static const unsigned int snap = 32; /* snap pixel */ -static const int swallowfloating = 0; /* 1 means swallow floating windows by default */ -static const unsigned int gappih = 20; /* horiz inner gap between windows */ -static const unsigned int gappiv = 10; /* vert inner gap between windows */ -static const unsigned int gappoh = 10; /* horiz outer gap between windows and screen edge */ -static const unsigned int gappov = 30; /* vert outer gap between windows and screen edge */ -static int smartgaps = 0; /* 1 means no outer gap when there is only one window */ static const int showbar = 1; /* 0 means no bar */ static const int topbar = 1; /* 0 means bottom bar */ -static const int vertpad = 10; /* vertical padding of bar */ -static const int sidepad = 10; /* horizontal padding of bar */ static const char *fonts[] = { "monospace:size=10" }; static const char dmenufont[] = "monospace:size=10"; static const char col_gray1[] = "#222222"; @@ -34,11 +26,9 @@ static const Rule rules[] = { * WM_CLASS(STRING) = instance, class * WM_NAME(STRING) = title */ - /* class instance title tags mask isfloating isterminal noswallow monitor */ - { "Gimp", NULL, NULL, 0, 1, 0, 0, -1 }, - { "Firefox", NULL, NULL, 1 << 8, 0, 0, -1, -1 }, - { "st", NULL, NULL, 0, 0, 1, -1, -1 }, - { NULL, NULL, "Event Tester", 0, 1, 0, 1, -1 }, /* xev */ + /* class instance title tags mask isfloating monitor */ + { "Gimp", NULL, NULL, 0, 1, -1 }, + { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, }; /* layout(s) */ @@ -46,26 +36,11 @@ static const float mfact = 0.55; /* factor of master area size [0.05..0.95] static const int nmaster = 1; /* number of clients in master area */ static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ -#define FORCE_VSPLIT 1 /* nrowgrid layout: force two clients to always split vertically */ -#include "vanitygaps.c" - static const Layout layouts[] = { /* symbol arrange function */ { "[]=", tile }, /* first entry is default */ - { "[M]", monocle }, - { "[@]", spiral }, - { "[\\]", dwindle }, - { "H[]", deck }, - { "TTT", bstack }, - { "===", bstackhoriz }, - { "HHH", grid }, - { "###", nrowgrid }, - { "---", horizgrid }, - { ":::", gaplessgrid }, - { "|M|", centeredmaster }, - { ">M>", centeredfloatingmaster }, { "><>", NULL }, /* no layout function means floating behavior */ - { NULL, NULL }, + { "[M]", monocle }, }; /* key definitions */ @@ -89,8 +64,6 @@ static Key keys[] = { { MODKEY, XK_p, spawn, {.v = dmenucmd } }, { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, { MODKEY, XK_b, togglebar, {0} }, - { MODKEY|ShiftMask, XK_j, rotatestack, {.i = +1 } }, - { MODKEY|ShiftMask, XK_k, rotatestack, {.i = -1 } }, { MODKEY, XK_j, focusstack, {.i = +1 } }, { MODKEY, XK_k, focusstack, {.i = -1 } }, { MODKEY, XK_i, incnmaster, {.i = +1 } }, @@ -98,22 +71,6 @@ static Key keys[] = { { MODKEY, XK_h, setmfact, {.f = -0.05} }, { MODKEY, XK_l, setmfact, {.f = +0.05} }, { MODKEY, XK_Return, zoom, {0} }, - { MODKEY|Mod4Mask, XK_u, incrgaps, {.i = +1 } }, - { MODKEY|Mod4Mask|ShiftMask, XK_u, incrgaps, {.i = -1 } }, - { MODKEY|Mod4Mask, XK_i, incrigaps, {.i = +1 } }, - { MODKEY|Mod4Mask|ShiftMask, XK_i, incrigaps, {.i = -1 } }, - { MODKEY|Mod4Mask, XK_o, incrogaps, {.i = +1 } }, - { MODKEY|Mod4Mask|ShiftMask, XK_o, incrogaps, {.i = -1 } }, - { MODKEY|Mod4Mask, XK_6, incrihgaps, {.i = +1 } }, - { MODKEY|Mod4Mask|ShiftMask, XK_6, incrihgaps, {.i = -1 } }, - { MODKEY|Mod4Mask, XK_7, incrivgaps, {.i = +1 } }, - { MODKEY|Mod4Mask|ShiftMask, XK_7, incrivgaps, {.i = -1 } }, - { MODKEY|Mod4Mask, XK_8, incrohgaps, {.i = +1 } }, - { MODKEY|Mod4Mask|ShiftMask, XK_8, incrohgaps, {.i = -1 } }, - { MODKEY|Mod4Mask, XK_9, incrovgaps, {.i = +1 } }, - { MODKEY|Mod4Mask|ShiftMask, XK_9, incrovgaps, {.i = -1 } }, - { MODKEY|Mod4Mask, XK_0, togglegaps, {0} }, - { MODKEY|Mod4Mask|ShiftMask, XK_0, defaultgaps, {0} }, { MODKEY, XK_Tab, view, {0} }, { MODKEY|ShiftMask, XK_c, killclient, {0} }, { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, @@ -121,7 +78,6 @@ static Key keys[] = { { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, { MODKEY, XK_space, setlayout, {0} }, { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, - { MODKEY|ShiftMask, XK_f, togglefullscr, {0} }, { MODKEY, XK_0, view, {.ui = ~0 } }, { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, { MODKEY, XK_comma, focusmon, {.i = -1 } }, @@ -138,11 +94,6 @@ static Key keys[] = { TAGKEYS( XK_8, 7) TAGKEYS( XK_9, 8) { MODKEY|ShiftMask, XK_q, quit, {0} }, - { MODKEY, XK_Left, viewtoleft, {0} }, - { MODKEY, XK_Right, viewtoright, {0} }, - { MODKEY|ShiftMask, XK_Left, tagtoleft, {0} }, - { MODKEY|ShiftMask, XK_Right, tagtoright, {0} }, - { MODKEY|ControlMask|ShiftMask, XK_q, quit, {1} }, }; /* button definitions */ diff --git a/config.h b/config.h deleted file mode 100644 index 4c828b9..0000000 --- a/config.h +++ /dev/null @@ -1,203 +0,0 @@ -#include "colors.h" -/* See LICENSE file for copyright and license details. */ - -/* appearance */ -static const unsigned int borderpx = 2; /* border pixel of windows */ -static const unsigned int snap = 32; /* snap pixel */ -static const int swallowfloating = 0; /* 1 means swallow floating windows by default */ -static const unsigned int gappih = 12; /* horiz inner gap between windows */ -static const unsigned int gappiv = 12; /* vert inner gap between windows */ -static const unsigned int gappoh = 12; /* horiz outer gap between windows and screen edge */ -static const unsigned int gappov = 12; /* vert outer gap between windows and screen edge */ -static const int smartgaps = 0; /* 1 means no outer gap when there is only one window */ -static const int showbar = 1; /* 0 means no bar */ -static const int topbar = 1; /* 0 means bottom bar */ -static const int vertpad = 12; /* vertical padding of bar */ -static const int sidepad = 12; /* horizontal padding of bar */ -static const char *fonts[] = { "JetBrains Mono Nerd Font:size=12" }; -static const char *colors[][3] = { - /* fg bg border */ - [SchemeNorm] = { norm_fg, norm_bg, norm_border }, // Unfocused Windows - [SchemeSel] = { sel_fg, sel_bg, sel_border }, // Focused Windows -}; - -/* tagging */ -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; - -static const Rule rules[] = { - /* xprop(1): - * WM_CLASS(STRING) = instance, class - * WM_NAME(STRING) = title - */ - /* class instance title tags mask isfloating isterminal noswallow monitor */ - { NULL, NULL, NULL, 0, False, 0, 0, -1 }, - { "st", NULL, NULL, 0, False, 1, -1, -1 }, -}; - -/* layout(s) */ -static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ -static const int nmaster = 1; /* number of clients in master area */ -static const int resizehints = 0; /* 1 means respect size hints in tiled resizals */ - -#define FORCE_VSPLIT 1 /* nrowgrid layout: force two clients to always split vertically */ -#include "vanitygaps.c" - - -static const Layout layouts[] = { - /* symbol arrange function */ - { "[]=", tile }, /* first entry is default */ - { "><>", NULL }, /* no layout function means floating behavior */ - { ">M>", centeredfloatingmaster }, - { "[@]", spiral }, - { "---", horizgrid }, - { "H[]", deck }, - { "HHH", grid }, - { "TTT", bstack }, - { "===", bstackhoriz }, - { "###", nrowgrid }, - /* - * { "[\\]", dwindle }, - * { ":::", gaplessgrid }, - * { "|M|", centeredmaster }, - * { "[M]", monocle }, - * { NULL, NULL }, - */ -}; - -/* key definitions */ -#define ALTKEY Mod1Mask -#define CTRLKEY ControlMask -#define SHIFTKEY ShiftMask -#define MODKEY Mod4Mask -#define TAGKEYS(KEY,TAG) \ -{ MODKEY, KEY, view, {.ui = 1 << TAG} }, \ -{ MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ -{ MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ -{ MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, - -/* helper for spawning shell commands in the pre dwm-5.0 fashion */ -#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } - -/* commands */ -static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ -static const char *dmenucmd[] = { "dmenu_run","-i", NULL }; - -static Key keys[] = { - /* modifier key function argument */ - /* Managing Windows */ - { MODKEY|SHIFTKEY, XK_j, rotatestack, {.i = +1 } }, - { MODKEY|SHIFTKEY, XK_k, rotatestack, {.i = -1 } }, - { MODKEY, XK_j, focusstack, {.i = +1 } }, - { MODKEY, XK_k, focusstack, {.i = -1 } }, - { MODKEY|ALTKEY, XK_p, incnmaster, {.i = +1 } }, - { MODKEY|ALTKEY, XK_d, incnmaster, {.i = -1 } }, - { MODKEY|CTRLKEY, XK_h, setmfact, {.f = -0.05} }, - { MODKEY|CTRLKEY, XK_l, setmfact, {.f = +0.05} }, - { MODKEY|SHIFTKEY, XK_Return, zoom, {0} }, - { MODKEY, XK_Tab, view, {0} }, - { MODKEY|SHIFTKEY, XK_q, killclient, {0} }, - { MODKEY|ALTKEY, XK_f, togglefullscr, {0} }, - { MODKEY|ALTKEY, XK_1, setlayout, {.v = &layouts[0]} }, - { MODKEY|ALTKEY, XK_2, setlayout, {.v = &layouts[1]} }, - { MODKEY|ALTKEY, XK_3, setlayout, {.v = &layouts[2]} }, - { MODKEY|ALTKEY, XK_4, setlayout, {.v = &layouts[3]} }, - { MODKEY|ALTKEY, XK_5, setlayout, {.v = &layouts[4]} }, - { MODKEY|ALTKEY, XK_6, setlayout, {.v = &layouts[5]} }, - { MODKEY|ALTKEY, XK_7, setlayout, {.v = &layouts[6]} }, - { MODKEY|ALTKEY, XK_8, setlayout, {.v = &layouts[7]} }, - { MODKEY|ALTKEY, XK_9, setlayout, {.v = &layouts[8]} }, - { MODKEY|ALTKEY, XK_0, setlayout, {.v = &layouts[9]} }, - { MODKEY|SHIFTKEY, XK_space, setlayout, {0} }, - { MODKEY, XK_space, togglefloating, {0} }, - { MODKEY, XK_comma, focusmon, {.i = -1 } }, - { MODKEY, XK_period, focusmon, {.i = +1 } }, - { MODKEY|SHIFTKEY, XK_comma, tagmon, {.i = -1 } }, - { MODKEY|SHIFTKEY, XK_period, tagmon, {.i = +1 } }, - { MODKEY, XK_h, viewtoleft, {0} }, - { MODKEY, XK_l, viewtoright, {0} }, - { MODKEY|SHIFTKEY, XK_h, tagtoleft, {0} }, - { MODKEY|SHIFTKEY, XK_l, tagtoright, {0} }, - { MODKEY|SHIFTKEY, XK_t, togglegaps, {0} }, - { MODKEY|SHIFTKEY, XK_plus, incrgaps, {.i = +1 } }, - { MODKEY|SHIFTKEY, XK_minus, incrgaps, {.i = -1 } }, - { MODKEY, XK_t, defaultgaps, {0} }, - { MODKEY|SHIFTKEY, XK_x, quit, {0} }, - { MODKEY|SHIFTKEY, XK_r, quit, {1} }, - - /* Managing Tags and Status Bar */ - { MODKEY, XK_b, togglebar, {0} }, - { MODKEY, XK_0, view, {.ui = ~0 } }, - { MODKEY|SHIFTKEY, XK_0, tag, {.ui = ~0 } }, - TAGKEYS( XK_1, 0) - TAGKEYS( XK_2, 1) - TAGKEYS( XK_3, 2) - TAGKEYS( XK_4, 3) - TAGKEYS( XK_5, 4) - TAGKEYS( XK_6, 5) - TAGKEYS( XK_7, 6) - TAGKEYS( XK_8, 7) - TAGKEYS( XK_9, 8) - - /* Regular Apps */ - { MODKEY, XK_d, spawn, {.v = dmenucmd } }, - { MODKEY, XK_Return, spawn, SHCMD("$TERMINAL") },//Terminal - { MODKEY, XK_w, spawn, SHCMD("$BROWSER") },//Web-Browser - { MODKEY, XK_f, spawn, SHCMD("$TERMINAL -e vifm") },//File Manager - - /* Scripts */ - { MODKEY, XK_e, spawn, SHCMD("glypher") },//Glyph Selector - { MODKEY|SHIFTKEY, XK_o, spawn, SHCMD("monitor") },//Set Screen Output - { MODKEY, XK_m, spawn, SHCMD("musicselect") },//Music Selector - { MODKEY|SHIFTKEY, XK_c, spawn, SHCMD("powermenu") },//Power Menu - { MODKEY, XK_r, spawn, SHCMD("run") },//Favorites Run Prompt - { 0, XK_Print, spawn, SHCMD("screenshot") },//Screenshot Tool Script - { MODKEY, XK_Print, spawn, SHCMD("screenshot quick") },//Quick Screenshot - - /* Quick Actions */ - { MODKEY, XK_F1, spawn, SHCMD("mixer t") },//Toggle Mute - { MODKEY, XK_F2, spawn, SHCMD("mixer -") },//Decrease Volume by 5% - { MODKEY, XK_F3, spawn, SHCMD("mixer +") },//Increase Volume by 5% - { MODKEY, XK_F4, spawn, SHCMD("bluelight") },//Enable Bluelight Filter //Script - { MODKEY, XK_F5, spawn, SHCMD("xbacklight -dec 5") },//Decrease Brightness by 5% - { MODKEY, XK_F6, spawn, SHCMD("xbacklight -inc 5") },//Increase Brightness by 5% - { MODKEY, XK_F7, spawn, SHCMD("screenrecord") },//Start Screen Recording //Script - { MODKEY, XK_F8, spawn, SHCMD("killall ffmpeg") },//Stop Recording - { MODKEY, XK_F9, spawn, SHCMD("mpc toggle") },//Music Pause/Play - { MODKEY, XK_F10, spawn, SHCMD("killall mpd") },//Music Quit/Stop - { MODKEY, XK_F11, spawn, SHCMD("mpc prev") },//Music Previous - { MODKEY, XK_F12, spawn, SHCMD("mpc next") },//Music Next -}; - -/* - * Unused Keybinds - * - * { MODKEY|Mod4Mask|ShiftMask, XK_h, incrogaps, {.i = +1 } }, - * { MODKEY|Mod4Mask|ShiftMask, XK_l, incrogaps, {.i = -1 } }, - * { MODKEY|Mod4Mask|ControlMask, XK_h, incrigaps, {.i = +1 } }, - * { MODKEY|Mod4Mask|ControlMask, XK_l, incrigaps, {.i = -1 } }, - * { MODKEY, XK_y, incrihgaps, {.i = +1 } }, - * { MODKEY, XK_o, incrihgaps, {.i = -1 } }, - * { MODKEY|ControlMask, XK_y, incrivgaps, {.i = +1 } }, - * { MODKEY|ControlMask, XK_o, incrivgaps, {.i = -1 } }, - * { MODKEY|Mod4Mask, XK_y, incrohgaps, {.i = +1 } }, - * { MODKEY|Mod4Mask, XK_o, incrohgaps, {.i = -1 } }, - * { MODKEY|ShiftMask, XK_y, incrovgaps, {.i = +1 } }, - * { MODKEY|ShiftMask, XK_o, incrovgaps, {.i = -1 } }, - */ - -/* button definitions */ -/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ -static Button buttons[] = { - /* click event mask button function argument */ - { ClkLtSymbol, 0, Button1, setlayout, {0} }, - { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, - { ClkWinTitle, 0, Button2, zoom, {0} }, - { ClkStatusText, 0, Button2, spawn, SHCMD("$TERM") }, - { ClkClientWin, MODKEY, Button1, movemouse, {0} }, - { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, - { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, - { ClkTagBar, 0, Button1, view, {0} }, - { ClkTagBar, 0, Button3, toggleview, {0} }, - { ClkTagBar, MODKEY, Button1, tag, {0} }, - { ClkTagBar, MODKEY, Button3, toggletag, {0} }, -}; @@ -22,7 +22,7 @@ FREETYPEINC = /usr/include/freetype2 # includes and libs INCS = -I${X11INC} -I${FREETYPEINC} -LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lX11-xcb -lxcb -lxcb-res +LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} # flags CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} @@ -95,6 +95,7 @@ drw_free(Drw *drw) { XFreePixmap(drw->dpy, drw->drawable); XFreeGC(drw->dpy, drw->gc); + drw_fontset_free(drw->fonts); free(drw); } @@ -77,18 +77,6 @@ Send focused window to previous screen, if any. .B Mod1\-Shift\-. Send focused window to next screen, if any. .TP -.B Mod1\-Right -Focus tag on the right, if any. -.TP -.B Mod1\-Left -Focus tag on the left, if any. -.TP -.B Mod1\-Shift\-Right -Send focused window to tag on the right, if any. -.TP -.B Mod1\-Shift\-Left -Send focused window to tag on the left, if any. -.TP .B Mod1\-b Toggles bar on and off. .TP @@ -154,9 +142,6 @@ Add/remove all windows with nth tag to/from the view. .TP .B Mod1\-Shift\-q Quit dwm. -.TP -.B Mod1\-Control\-Shift\-q -Restart dwm. .SS Mouse commands .TP .B Mod1\-Button1 @@ -170,13 +155,6 @@ Resize focused window while dragging. Tiled windows will be toggled to the float .SH CUSTOMIZATION dwm is customized by creating a custom config.h and (re)compiling the source code. This keeps it fast, secure and simple. -.SH SIGNALS -.TP -.B SIGHUP - 1 -Restart the dwm process. -.TP -.B SIGTERM - 15 -Cleanly terminate the dwm process. .SH SEE ALSO .BR dmenu (1), .BR st (1) @@ -40,8 +40,6 @@ #include <X11/extensions/Xinerama.h> #endif /* XINERAMA */ #include <X11/Xft/Xft.h> -#include <X11/Xlib-xcb.h> -#include <xcb/res.h> #include "drw.h" #include "util.h" @@ -94,11 +92,9 @@ struct Client { int basew, baseh, incw, inch, maxw, maxh, minw, minh; int bw, oldbw; unsigned int tags; - int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, isterminal, noswallow; - pid_t pid; + int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; Client *next; Client *snext; - Client *swallowing; Monitor *mon; Window win; }; @@ -123,10 +119,6 @@ struct Monitor { int by; /* bar geometry */ int mx, my, mw, mh; /* screen size */ int wx, wy, ww, wh; /* window area */ - int gappih; /* horizontal gap between windows */ - int gappiv; /* vertical gap between windows */ - int gappoh; /* horizontal outer gaps */ - int gappov; /* vertical outer gaps */ unsigned int seltags; unsigned int sellt; unsigned int tagset[2]; @@ -146,8 +138,6 @@ typedef struct { const char *title; unsigned int tags; int isfloating; - int isterminal; - int noswallow; int monitor; } Rule; @@ -173,8 +163,6 @@ static void detachstack(Client *c); static Monitor *dirtomon(int dir); static void drawbar(Monitor *m); static void drawbars(void); -static void enqueue(Client *c); -static void enqueuestack(Client *c); static void enternotify(XEvent *e); static void expose(XEvent *e); static void focus(Client *c); @@ -205,7 +193,6 @@ static void resize(Client *c, int x, int y, int w, int h, int interact); static void resizeclient(Client *c, int x, int y, int w, int h); static void resizemouse(const Arg *arg); static void restack(Monitor *m); -static void rotatestack(const Arg *arg); static void run(void); static void scan(void); static int sendevent(Client *c, Atom proto); @@ -219,16 +206,12 @@ static void setup(void); static void seturgent(Client *c, int urg); static void showhide(Client *c); static void sigchld(int unused); -static void sighup(int unused); -static void sigterm(int unused); static void spawn(const Arg *arg); static void tag(const Arg *arg); static void tagmon(const Arg *arg); -static void tagtoleft(const Arg *arg); -static void tagtoright(const Arg *arg); +static void tile(Monitor *); static void togglebar(const Arg *arg); static void togglefloating(const Arg *arg); -static void togglefullscr(const Arg *arg); static void toggletag(const Arg *arg); static void toggleview(const Arg *arg); static void unfocus(Client *c, int setfocus); @@ -245,8 +228,6 @@ static void updatetitle(Client *c); static void updatewindowtype(Client *c); static void updatewmhints(Client *c); static void view(const Arg *arg); -static void viewtoleft(const Arg *arg); -static void viewtoright(const Arg *arg); static Client *wintoclient(Window w); static Monitor *wintomon(Window w); static int xerror(Display *dpy, XErrorEvent *ee); @@ -254,22 +235,13 @@ static int xerrordummy(Display *dpy, XErrorEvent *ee); static int xerrorstart(Display *dpy, XErrorEvent *ee); static void zoom(const Arg *arg); -static pid_t getparentprocess(pid_t p); -static int isdescprocess(pid_t p, pid_t c); -static Client *swallowingclient(Window w); -static Client *termforwin(const Client *c); -static pid_t winpid(Window w); - /* variables */ static const char broken[] = "broken"; static char stext[256]; -static int scanner; static int screen; static int sw, sh; /* X display screen geometry width, height */ static int bh, blw = 0; /* bar geometry */ static int lrpad; /* sum of left and right padding for text */ -static int vp; /* vertical padding for bar */ -static int sp; /* side padding for bar */ static int (*xerrorxlib)(Display *, XErrorEvent *); static unsigned int numlockmask = 0; static void (*handler[LASTEvent]) (XEvent *) = { @@ -289,7 +261,6 @@ static void (*handler[LASTEvent]) (XEvent *) = { [UnmapNotify] = unmapnotify }; static Atom wmatom[WMLast], netatom[NetLast]; -static int restart = 0; static int running = 1; static Cur *cursor[CurLast]; static Clr **scheme; @@ -298,8 +269,6 @@ static Drw *drw; static Monitor *mons, *selmon; static Window root, wmcheckwin; -static xcb_connection_t *xcon; - /* configuration, allows nested code to access above variables */ #include "config.h" @@ -317,7 +286,6 @@ applyrules(Client *c) XClassHint ch = { NULL, NULL }; /* rule matching */ - c->noswallow = -1; c->isfloating = 0; c->tags = 0; XGetClassHint(dpy, c->win, &ch); @@ -330,8 +298,6 @@ applyrules(Client *c) && (!r->class || strstr(class, r->class)) && (!r->instance || strstr(instance, r->instance))) { - c->isterminal = r->isterminal; - c->noswallow = r->noswallow; c->isfloating = r->isfloating; c->tags |= r->tags; for (m = mons; m && m->num != r->monitor; m = m->next); @@ -449,64 +415,9 @@ attachstack(Client *c) } void -swallow(Client *p, Client *c) -{ - Client *s; - - if (c->noswallow > 0 || c->isterminal) - return; - if (c->noswallow < 0 && !swallowfloating && c->isfloating) - return; - - detach(c); - detachstack(c); - - setclientstate(c, WithdrawnState); - XUnmapWindow(dpy, p->win); - - p->swallowing = c; - c->mon = p->mon; - - Window w = p->win; - p->win = c->win; - c->win = w; - - XChangeProperty(dpy, c->win, netatom[NetClientList], XA_WINDOW, 32, PropModeReplace, - (unsigned char *) &(p->win), 1); - - updatetitle(p); - s = scanner ? c : p; - XMoveResizeWindow(dpy, p->win, s->x, s->y, s->w, s->h); - arrange(p->mon); - configure(p); - updateclientlist(); -} - -void -unswallow(Client *c) -{ - c->win = c->swallowing->win; - - free(c->swallowing); - c->swallowing = NULL; - - XDeleteProperty(dpy, c->win, netatom[NetClientList]); - - /* unfullscreen the client */ - setfullscreen(c, 0); - updatetitle(c); - arrange(c->mon); - XMapWindow(dpy, c->win); - XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); - setclientstate(c, NormalState); - focus(NULL); - arrange(c->mon); -} - -void buttonpress(XEvent *e) { - unsigned int i, x, click, occ = 0; + unsigned int i, x, click; Arg arg = {0}; Client *c; Monitor *m; @@ -521,14 +432,9 @@ buttonpress(XEvent *e) } if (ev->window == selmon->barwin) { i = x = 0; - for (c = m->clients; c; c = c->next) - occ |= c->tags == 255 ? 0 : c->tags; - do { - /* do not reserve space for vacant tags */ - if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) - continue; + do x += TEXTW(tags[i]); - } while (ev->x >= x && ++i < LENGTH(tags)); + while (ev->x >= x && ++i < LENGTH(tags)); if (i < LENGTH(tags)) { click = ClkTagBar; arg.ui = 1 << i; @@ -662,7 +568,7 @@ configurenotify(XEvent *e) for (c = m->clients; c; c = c->next) if (c->isfullscreen) resizeclient(c, m->mx, m->my, m->mw, m->mh); - XMoveResizeWindow(dpy, m->barwin, m->wx + sp, m->by + vp, m->ww - 2 * sp, bh); + XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); } focus(NULL); arrange(NULL); @@ -733,10 +639,6 @@ createmon(void) m->nmaster = nmaster; m->showbar = showbar; m->topbar = topbar; - m->gappih = gappih; - m->gappiv = gappiv; - m->gappoh = gappoh; - m->gappov = gappov; m->lt[0] = &layouts[0]; m->lt[1] = &layouts[1 % LENGTH(layouts)]; strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); @@ -751,9 +653,6 @@ destroynotify(XEvent *e) if ((c = wintoclient(ev->window))) unmanage(c, 1); - - else if ((c = swallowingclient(ev->window))) - unmanage(c->swallowing, 1); } void @@ -807,23 +706,23 @@ drawbar(Monitor *m) if (m == selmon) { /* status is only drawn on selected monitor */ drw_setscheme(drw, scheme[SchemeNorm]); tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ - drw_text(drw, m->ww - tw - 2 * sp, 0, tw, bh, 0, stext, 0); + drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); } for (c = m->clients; c; c = c->next) { - occ |= c->tags == 255 ? 0 : c->tags; + occ |= c->tags; if (c->isurgent) urg |= c->tags; } x = 0; for (i = 0; i < LENGTH(tags); i++) { - /* do not draw vacant tags */ - if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) - continue; - w = TEXTW(tags[i]); drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); + if (occ & 1 << i) + drw_rect(drw, x + boxs, boxs, boxw, boxw, + m == selmon && selmon->sel && selmon->sel->tags & 1 << i, + urg & 1 << i); x += w; } w = blw = TEXTW(m->ltsymbol); @@ -833,12 +732,12 @@ drawbar(Monitor *m) if ((w = m->ww - tw - x) > bh) { if (m->sel) { drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w - 2 * sp, bh, lrpad / 2, m->sel->name, 0); + drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); if (m->sel->isfloating) drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); } else { drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, x, 0, w - 2 * sp, bh, 1, 1); + drw_rect(drw, x, 0, w, bh, 1, 1); } } drw_map(drw, m->barwin, 0, 0, m->ww, bh); @@ -854,28 +753,6 @@ drawbars(void) } void -enqueue(Client *c) -{ - Client *l; - for (l = c->mon->clients; l && l->next; l = l->next); - if (l) { - l->next = c; - c->next = NULL; - } -} - -void -enqueuestack(Client *c) -{ - Client *l; - for (l = c->mon->stack; l && l->snext; l = l->snext); - if (l) { - l->snext = c; - c->snext = NULL; - } -} - -void enternotify(XEvent *e) { Client *c; @@ -1141,13 +1018,12 @@ killclient(const Arg *arg) void manage(Window w, XWindowAttributes *wa) { - Client *c, *t = NULL, *term = NULL; + Client *c, *t = NULL; Window trans = None; XWindowChanges wc; c = ecalloc(1, sizeof(Client)); c->win = w; - c->pid = winpid(w); /* geometry */ c->x = c->oldx = wa->x; c->y = c->oldy = wa->y; @@ -1162,7 +1038,6 @@ manage(Window w, XWindowAttributes *wa) } else { c->mon = selmon; applyrules(c); - term = termforwin(c); } if (c->x + WIDTH(c) > c->mon->mx + c->mon->mw) @@ -1199,8 +1074,6 @@ manage(Window w, XWindowAttributes *wa) c->mon->sel = c; arrange(c->mon); XMapWindow(dpy, c->win); - if (term) - swallow(term, c); focus(NULL); } @@ -1376,7 +1249,6 @@ propertynotify(XEvent *e) void quit(const Arg *arg) { - if(arg->i) restart = 1; running = 0; } @@ -1499,38 +1371,6 @@ restack(Monitor *m) } void -rotatestack(const Arg *arg) -{ - Client *c = NULL, *f; - - if (!selmon->sel) - return; - f = selmon->sel; - if (arg->i > 0) { - for (c = nexttiled(selmon->clients); c && nexttiled(c->next); c = nexttiled(c->next)); - if (c){ - detach(c); - attach(c); - detachstack(c); - attachstack(c); - } - } else { - if ((c = nexttiled(selmon->clients))){ - detach(c); - enqueue(c); - detachstack(c); - enqueuestack(c); - } - } - if (c){ - arrange(selmon); - //unfocus(f, 1); - focus(f); - restack(selmon); - } -} - -void run(void) { XEvent ev; @@ -1544,9 +1384,7 @@ run(void) void scan(void) { - scanner = 1; unsigned int i, num; - char swin[256]; Window d1, d2, *wins = NULL; XWindowAttributes wa; @@ -1557,8 +1395,6 @@ scan(void) continue; if (wa.map_state == IsViewable || getstate(wins[i]) == IconicState) manage(wins[i], &wa); - else if (gettextprop(wins[i], netatom[NetClientList], swin, sizeof swin)) - manage(wins[i], &wa); } for (i = 0; i < num; i++) { /* now the transients */ if (!XGetWindowAttributes(dpy, wins[i], &wa)) @@ -1570,7 +1406,6 @@ scan(void) if (wins) XFree(wins); } - scanner = 0; } void @@ -1598,28 +1433,6 @@ setclientstate(Client *c, long state) PropModeReplace, (unsigned char *)data, 2); } -void -tagtoleft(const Arg *arg) { - if(selmon->sel != NULL - && __builtin_popcount(selmon->tagset[selmon->seltags] & TAGMASK) == 1 - && selmon->tagset[selmon->seltags] > 1) { - selmon->sel->tags >>= 1; - focus(NULL); - arrange(selmon); - } -} - -void -tagtoright(const Arg *arg) { - if(selmon->sel != NULL - && __builtin_popcount(selmon->tagset[selmon->seltags] & TAGMASK) == 1 - && selmon->tagset[selmon->seltags] & (TAGMASK >> 1)) { - selmon->sel->tags <<= 1; - focus(NULL); - arrange(selmon); - } -} - int sendevent(Client *c, Atom proto) { @@ -1724,9 +1537,6 @@ setup(void) /* clean up any zombies immediately */ sigchld(0); - signal(SIGHUP, sighup); - signal(SIGTERM, sigterm); - /* init screen */ screen = DefaultScreen(dpy); sw = DisplayWidth(dpy, screen); @@ -1738,9 +1548,6 @@ setup(void) lrpad = drw->fonts->h; bh = drw->fonts->h + 2; updategeom(); - sp = sidepad; - vp = (topbar == 1) ? vertpad : - vertpad; - /* init atoms */ utf8string = XInternAtom(dpy, "UTF8_STRING", False); wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); @@ -1767,7 +1574,6 @@ setup(void) /* init bars */ updatebars(); updatestatus(); - updatebarpos(selmon); /* supporting window for NetWMCheck */ wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0); XChangeProperty(dpy, wmcheckwin, netatom[NetWMCheck], XA_WINDOW, 32, @@ -1832,20 +1638,6 @@ sigchld(int unused) } void -sighup(int unused) -{ - Arg a = {.i = 1}; - quit(&a); -} - -void -sigterm(int unused) -{ - Arg a = {.i = 0}; - quit(&a); -} - -void spawn(const Arg *arg) { if (arg->v == dmenucmd) @@ -1880,11 +1672,39 @@ tagmon(const Arg *arg) } void +tile(Monitor *m) +{ + unsigned int i, n, h, mw, my, ty; + Client *c; + + for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); + if (n == 0) + return; + + if (n > m->nmaster) + mw = m->nmaster ? m->ww * m->mfact : 0; + else + mw = m->ww; + for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) + if (i < m->nmaster) { + h = (m->wh - my) / (MIN(n, m->nmaster) - i); + resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); + if (my + HEIGHT(c) < m->wh) + my += HEIGHT(c); + } else { + h = (m->wh - ty) / (n - i); + resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0); + if (ty + HEIGHT(c) < m->wh) + ty += HEIGHT(c); + } +} + +void togglebar(const Arg *arg) { selmon->showbar = !selmon->showbar; updatebarpos(selmon); - XMoveResizeWindow(dpy, selmon->barwin, selmon->wx + sp, selmon->by + vp, selmon->ww - 2 * sp, bh); + XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); arrange(selmon); } @@ -1903,13 +1723,6 @@ togglefloating(const Arg *arg) } void -togglefullscr(const Arg *arg) -{ - if(selmon->sel) - setfullscreen(selmon->sel, !selmon->sel->isfullscreen); -} - -void toggletag(const Arg *arg) { unsigned int newtags; @@ -1955,20 +1768,6 @@ unmanage(Client *c, int destroyed) Monitor *m = c->mon; XWindowChanges wc; - if (c->swallowing) { - unswallow(c); - return; - } - - Client *s = swallowingclient(c->win); - if (s) { - free(s->swallowing); - s->swallowing = NULL; - arrange(m); - focus(NULL); - return; - } - detach(c); detachstack(c); if (!destroyed) { @@ -1983,12 +1782,9 @@ unmanage(Client *c, int destroyed) XUngrabServer(dpy); } free(c); - - if (!s) { - arrange(m); - focus(NULL); - updateclientlist(); - } + focus(NULL); + updateclientlist(); + arrange(m); } void @@ -2018,7 +1814,7 @@ updatebars(void) for (m = mons; m; m = m->next) { if (m->barwin) continue; - m->barwin = XCreateWindow(dpy, root, m->wx + sp, m->by + vp, m->ww - 2 * sp, bh, 0, DefaultDepth(dpy, screen), + m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen), CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); @@ -2033,11 +1829,11 @@ updatebarpos(Monitor *m) m->wy = m->my; m->wh = m->mh; if (m->showbar) { - m->wh = m->wh - vertpad - bh; - m->by = m->topbar ? m->wy : m->wy + m->wh + vertpad; - m->wy = m->topbar ? m->wy + bh + vp : m->wy; + m->wh -= bh; + m->by = m->topbar ? m->wy : m->wy + m->wh; + m->wy = m->topbar ? m->wy + bh : m->wy; } else - m->by = -bh - vp; + m->by = -bh; } void @@ -2251,132 +2047,6 @@ view(const Arg *arg) arrange(selmon); } -void -viewtoleft(const Arg *arg) { - if(__builtin_popcount(selmon->tagset[selmon->seltags] & TAGMASK) == 1 - && selmon->tagset[selmon->seltags] > 1) { - selmon->seltags ^= 1; /* toggle sel tagset */ - selmon->tagset[selmon->seltags] = selmon->tagset[selmon->seltags ^ 1] >> 1; - focus(NULL); - arrange(selmon); - } -} - -void -viewtoright(const Arg *arg) { - if(__builtin_popcount(selmon->tagset[selmon->seltags] & TAGMASK) == 1 - && selmon->tagset[selmon->seltags] & (TAGMASK >> 1)) { - selmon->seltags ^= 1; /* toggle sel tagset */ - selmon->tagset[selmon->seltags] = selmon->tagset[selmon->seltags ^ 1] << 1; - focus(NULL); - arrange(selmon); - } -} - -pid_t -winpid(Window w) -{ - pid_t result = 0; - - xcb_res_client_id_spec_t spec = {0}; - spec.client = w; - spec.mask = XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID; - - xcb_generic_error_t *e = NULL; - xcb_res_query_client_ids_cookie_t c = xcb_res_query_client_ids(xcon, 1, &spec); - xcb_res_query_client_ids_reply_t *r = xcb_res_query_client_ids_reply(xcon, c, &e); - - if (!r) - return (pid_t)0; - - xcb_res_client_id_value_iterator_t i = xcb_res_query_client_ids_ids_iterator(r); - for (; i.rem; xcb_res_client_id_value_next(&i)) { - spec = i.data->spec; - if (spec.mask & XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID) { - uint32_t *t = xcb_res_client_id_value_value(i.data); - result = *t; - break; - } - } - - free(r); - - if (result == (pid_t)-1) - result = 0; - return result; -} - -pid_t -getparentprocess(pid_t p) -{ - unsigned int v = 0; - -#if defined(__linux__) - FILE *f; - char buf[256]; - snprintf(buf, sizeof(buf) - 1, "/proc/%u/stat", (unsigned)p); - - if (!(f = fopen(buf, "r"))) - return (pid_t)0; - - if (fscanf(f, "%*u %*s %*c %u", (unsigned *)&v) != 1) - v = (pid_t)0; - fclose(f); -#elif defined(__FreeBSD__) - struct kinfo_proc *proc = kinfo_getproc(p); - if (!proc) - return (pid_t)0; - - v = proc->ki_ppid; - free(proc); -#endif - return (pid_t)v; -} - -int -isdescprocess(pid_t p, pid_t c) -{ - while (p != c && c != 0) - c = getparentprocess(c); - - return (int)c; -} - -Client * -termforwin(const Client *w) -{ - Client *c; - Monitor *m; - - if (!w->pid || w->isterminal) - return NULL; - - for (m = mons; m; m = m->next) { - for (c = m->clients; c; c = c->next) { - if (c->isterminal && !c->swallowing && c->pid && isdescprocess(c->pid, w->pid)) - return c; - } - } - - return NULL; -} - -Client * -swallowingclient(Window w) -{ - Client *c; - Monitor *m; - - for (m = mons; m; m = m->next) { - for (c = m->clients; c; c = c->next) { - if (c->swallowing && c->swallowing->win == w) - return c; - } - } - - return NULL; -} - Client * wintoclient(Window w) { @@ -2468,8 +2138,6 @@ main(int argc, char *argv[]) fputs("warning: no locale support\n", stderr); if (!(dpy = XOpenDisplay(NULL))) die("dwm: cannot open display"); - if (!(xcon = XGetXCBConnection(dpy))) - die("dwm: cannot get xcb connection\n"); checkotherwm(); setup(); #ifdef __OpenBSD__ @@ -2478,7 +2146,6 @@ main(int argc, char *argv[]) #endif /* __OpenBSD__ */ scan(); run(); - if(restart) execvp(argv[0], argv); cleanup(); XCloseDisplay(dpy); return EXIT_SUCCESS; diff --git a/vanitygaps.c b/vanitygaps.c deleted file mode 100644 index 3f31593..0000000 --- a/vanitygaps.c +++ /dev/null @@ -1,809 +0,0 @@ -/* Key binding functions */ -static void defaultgaps(const Arg *arg); -static void incrgaps(const Arg *arg); -static void incrigaps(const Arg *arg); -static void incrogaps(const Arg *arg); -static void incrohgaps(const Arg *arg); -static void incrovgaps(const Arg *arg); -static void incrihgaps(const Arg *arg); -static void incrivgaps(const Arg *arg); -static void togglegaps(const Arg *arg); -/* Layouts (delete the ones you do not need) */ -static void bstack(Monitor *m); -static void bstackhoriz(Monitor *m); -static void centeredmaster(Monitor *m); -static void centeredfloatingmaster(Monitor *m); -static void deck(Monitor *m); -static void dwindle(Monitor *m); -static void fibonacci(Monitor *m, int s); -static void grid(Monitor *m); -static void nrowgrid(Monitor *m); -static void spiral(Monitor *m); -static void tile(Monitor *m); -/* Internals */ -static void getgaps(Monitor *m, int *oh, int *ov, int *ih, int *iv, unsigned int *nc); -static void getfacts(Monitor *m, int msize, int ssize, float *mf, float *sf, int *mr, int *sr); -static void setgaps(int oh, int ov, int ih, int iv); - -/* Settings */ -#if !PERTAG_PATCH -static int enablegaps = 1; -#endif // PERTAG_PATCH - -void -setgaps(int oh, int ov, int ih, int iv) -{ - if (oh < 0) oh = 0; - if (ov < 0) ov = 0; - if (ih < 0) ih = 0; - if (iv < 0) iv = 0; - - selmon->gappoh = oh; - selmon->gappov = ov; - selmon->gappih = ih; - selmon->gappiv = iv; - arrange(selmon); -} - -void -togglegaps(const Arg *arg) -{ - #if PERTAG_PATCH - selmon->pertag->enablegaps[selmon->pertag->curtag] = !selmon->pertag->enablegaps[selmon->pertag->curtag]; - #else - enablegaps = !enablegaps; - #endif // PERTAG_PATCH - arrange(NULL); -} - -void -defaultgaps(const Arg *arg) -{ - setgaps(gappoh, gappov, gappih, gappiv); -} - -void -incrgaps(const Arg *arg) -{ - setgaps( - selmon->gappoh + arg->i, - selmon->gappov + arg->i, - selmon->gappih + arg->i, - selmon->gappiv + arg->i - ); -} - -void -incrigaps(const Arg *arg) -{ - setgaps( - selmon->gappoh, - selmon->gappov, - selmon->gappih + arg->i, - selmon->gappiv + arg->i - ); -} - -void -incrogaps(const Arg *arg) -{ - setgaps( - selmon->gappoh + arg->i, - selmon->gappov + arg->i, - selmon->gappih, - selmon->gappiv - ); -} - -void -incrohgaps(const Arg *arg) -{ - setgaps( - selmon->gappoh + arg->i, - selmon->gappov, - selmon->gappih, - selmon->gappiv - ); -} - -void -incrovgaps(const Arg *arg) -{ - setgaps( - selmon->gappoh, - selmon->gappov + arg->i, - selmon->gappih, - selmon->gappiv - ); -} - -void -incrihgaps(const Arg *arg) -{ - setgaps( - selmon->gappoh, - selmon->gappov, - selmon->gappih + arg->i, - selmon->gappiv - ); -} - -void -incrivgaps(const Arg *arg) -{ - setgaps( - selmon->gappoh, - selmon->gappov, - selmon->gappih, - selmon->gappiv + arg->i - ); -} - -void -getgaps(Monitor *m, int *oh, int *ov, int *ih, int *iv, unsigned int *nc) -{ - unsigned int n, oe, ie; - #if PERTAG_PATCH - oe = ie = selmon->pertag->enablegaps[selmon->pertag->curtag]; - #else - oe = ie = enablegaps; - #endif // PERTAG_PATCH - Client *c; - - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); - if (smartgaps && n == 1) { - oe = 0; // outer gaps disabled when only one client - } - - *oh = m->gappoh*oe; // outer horizontal gap - *ov = m->gappov*oe; // outer vertical gap - *ih = m->gappih*ie; // inner horizontal gap - *iv = m->gappiv*ie; // inner vertical gap - *nc = n; // number of clients -} - -void -getfacts(Monitor *m, int msize, int ssize, float *mf, float *sf, int *mr, int *sr) -{ - unsigned int n; - float mfacts, sfacts; - int mtotal = 0, stotal = 0; - Client *c; - - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); - mfacts = MIN(n, m->nmaster); - sfacts = n - m->nmaster; - - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) - if (n < m->nmaster) - mtotal += msize / mfacts; - else - stotal += ssize / sfacts; - - *mf = mfacts; // total factor of master area - *sf = sfacts; // total factor of stack area - *mr = msize - mtotal; // the remainder (rest) of pixels after an even master split - *sr = ssize - stotal; // the remainder (rest) of pixels after an even stack split -} - -/*** - * Layouts - */ - -/* - * Bottomstack layout + gaps - * https://dwm.suckless.org/patches/bottomstack/ - */ -static void -bstack(Monitor *m) -{ - unsigned int i, n; - int oh, ov, ih, iv; - int mx = 0, my = 0, mh = 0, mw = 0; - int sx = 0, sy = 0, sh = 0, sw = 0; - float mfacts, sfacts; - int mrest, srest; - Client *c; - - getgaps(m, &oh, &ov, &ih, &iv, &n); - if (n == 0) - return; - - sx = mx = m->wx + ov; - sy = my = m->wy + oh; - sh = mh = m->wh - 2*oh; - mw = m->ww - 2*ov - iv * (MIN(n, m->nmaster) - 1); - sw = m->ww - 2*ov - iv * (n - m->nmaster - 1); - - if (m->nmaster && n > m->nmaster) { - sh = (mh - ih) * (1 - m->mfact); - mh = mh - ih - sh; - sx = mx; - sy = my + mh + ih; - } - - getfacts(m, mw, sw, &mfacts, &sfacts, &mrest, &srest); - - for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) { - if (i < m->nmaster) { - resize(c, mx, my, (mw / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0); - mx += WIDTH(c) + iv; - } else { - resize(c, sx, sy, (sw / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*c->bw), sh - (2*c->bw), 0); - sx += WIDTH(c) + iv; - } - } -} - -static void -bstackhoriz(Monitor *m) -{ - unsigned int i, n; - int oh, ov, ih, iv; - int mx = 0, my = 0, mh = 0, mw = 0; - int sx = 0, sy = 0, sh = 0, sw = 0; - float mfacts, sfacts; - int mrest, srest; - Client *c; - - getgaps(m, &oh, &ov, &ih, &iv, &n); - if (n == 0) - return; - - sx = mx = m->wx + ov; - sy = my = m->wy + oh; - mh = m->wh - 2*oh; - sh = m->wh - 2*oh - ih * (n - m->nmaster - 1); - mw = m->ww - 2*ov - iv * (MIN(n, m->nmaster) - 1); - sw = m->ww - 2*ov; - - if (m->nmaster && n > m->nmaster) { - sh = (mh - ih) * (1 - m->mfact); - mh = mh - ih - sh; - sy = my + mh + ih; - sh = m->wh - mh - 2*oh - ih * (n - m->nmaster); - } - - getfacts(m, mw, sh, &mfacts, &sfacts, &mrest, &srest); - - for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) { - if (i < m->nmaster) { - resize(c, mx, my, (mw / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0); - mx += WIDTH(c) + iv; - } else { - resize(c, sx, sy, sw - (2*c->bw), (sh / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*c->bw), 0); - sy += HEIGHT(c) + ih; - } - } -} - -/* - * Centred master layout + gaps - * https://dwm.suckless.org/patches/centeredmaster/ - */ -void -centeredmaster(Monitor *m) -{ - unsigned int i, n; - int oh, ov, ih, iv; - int mx = 0, my = 0, mh = 0, mw = 0; - int lx = 0, ly = 0, lw = 0, lh = 0; - int rx = 0, ry = 0, rw = 0, rh = 0; - float mfacts = 0, lfacts = 0, rfacts = 0; - int mtotal = 0, ltotal = 0, rtotal = 0; - int mrest = 0, lrest = 0, rrest = 0; - Client *c; - - getgaps(m, &oh, &ov, &ih, &iv, &n); - if (n == 0) - return; - - /* initialize areas */ - mx = m->wx + ov; - my = m->wy + oh; - mh = m->wh - 2*oh - ih * ((!m->nmaster ? n : MIN(n, m->nmaster)) - 1); - mw = m->ww - 2*ov; - lh = m->wh - 2*oh - ih * (((n - m->nmaster) / 2) - 1); - rh = m->wh - 2*oh - ih * (((n - m->nmaster) / 2) - ((n - m->nmaster) % 2 ? 0 : 1)); - - if (m->nmaster && n > m->nmaster) { - /* go mfact box in the center if more than nmaster clients */ - if (n - m->nmaster > 1) { - /* ||<-S->|<---M--->|<-S->|| */ - mw = (m->ww - 2*ov - 2*iv) * m->mfact; - lw = (m->ww - mw - 2*ov - 2*iv) / 2; - rw = (m->ww - mw - 2*ov - 2*iv) - lw; - mx += lw + iv; - } else { - /* ||<---M--->|<-S->|| */ - mw = (mw - iv) * m->mfact; - lw = 0; - rw = m->ww - mw - iv - 2*ov; - } - lx = m->wx + ov; - ly = m->wy + oh; - rx = mx + mw + iv; - ry = m->wy + oh; - } - - /* calculate facts */ - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) { - if (!m->nmaster || n < m->nmaster) - mfacts += 1; - else if ((n - m->nmaster) % 2) - lfacts += 1; // total factor of left hand stack area - else - rfacts += 1; // total factor of right hand stack area - } - - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) - if (!m->nmaster || n < m->nmaster) - mtotal += mh / mfacts; - else if ((n - m->nmaster) % 2) - ltotal += lh / lfacts; - else - rtotal += rh / rfacts; - - mrest = mh - mtotal; - lrest = lh - ltotal; - rrest = rh - rtotal; - - for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) { - if (!m->nmaster || i < m->nmaster) { - /* nmaster clients are stacked vertically, in the center of the screen */ - resize(c, mx, my, mw - (2*c->bw), (mh / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), 0); - my += HEIGHT(c) + ih; - } else { - /* stack clients are stacked vertically */ - if ((i - m->nmaster) % 2 ) { - resize(c, lx, ly, lw - (2*c->bw), (lh / lfacts) + ((i - 2*m->nmaster) < 2*lrest ? 1 : 0) - (2*c->bw), 0); - ly += HEIGHT(c) + ih; - } else { - resize(c, rx, ry, rw - (2*c->bw), (rh / rfacts) + ((i - 2*m->nmaster) < 2*rrest ? 1 : 0) - (2*c->bw), 0); - ry += HEIGHT(c) + ih; - } - } - } -} - -void -centeredfloatingmaster(Monitor *m) -{ - unsigned int i, n; - float mfacts, sfacts; - float mivf = 1.0; // master inner vertical gap factor - int oh, ov, ih, iv, mrest, srest; - int mx = 0, my = 0, mh = 0, mw = 0; - int sx = 0, sy = 0, sh = 0, sw = 0; - Client *c; - - getgaps(m, &oh, &ov, &ih, &iv, &n); - if (n == 0) - return; - - sx = mx = m->wx + ov; - sy = my = m->wy + oh; - sh = mh = m->wh - 2*oh; - mw = m->ww - 2*ov - iv*(n - 1); - sw = m->ww - 2*ov - iv*(n - m->nmaster - 1); - - if (m->nmaster && n > m->nmaster) { - mivf = 0.8; - /* go mfact box in the center if more than nmaster clients */ - if (m->ww > m->wh) { - mw = m->ww * m->mfact - iv*mivf*(MIN(n, m->nmaster) - 1); - mh = m->wh * 0.9; - } else { - mw = m->ww * 0.9 - iv*mivf*(MIN(n, m->nmaster) - 1); - mh = m->wh * m->mfact; - } - mx = m->wx + (m->ww - mw) / 2; - my = m->wy + (m->wh - mh - 2*oh) / 2; - - sx = m->wx + ov; - sy = m->wy + oh; - sh = m->wh - 2*oh; - } - - getfacts(m, mw, sw, &mfacts, &sfacts, &mrest, &srest); - - for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) - if (i < m->nmaster) { - /* nmaster clients are stacked horizontally, in the center of the screen */ - resize(c, mx, my, (mw / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0); - mx += WIDTH(c) + iv*mivf; - } else { - /* stack clients are stacked horizontally */ - resize(c, sx, sy, (sw / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*c->bw), sh - (2*c->bw), 0); - sx += WIDTH(c) + iv; - } -} - -/* - * Deck layout + gaps - * https://dwm.suckless.org/patches/deck/ - */ -void -deck(Monitor *m) -{ - unsigned int i, n; - int oh, ov, ih, iv; - int mx = 0, my = 0, mh = 0, mw = 0; - int sx = 0, sy = 0, sh = 0, sw = 0; - float mfacts, sfacts; - int mrest, srest; - Client *c; - - getgaps(m, &oh, &ov, &ih, &iv, &n); - if (n == 0) - return; - - sx = mx = m->wx + ov; - sy = my = m->wy + oh; - sh = mh = m->wh - 2*oh - ih * (MIN(n, m->nmaster) - 1); - sw = mw = m->ww - 2*ov; - - if (m->nmaster && n > m->nmaster) { - sw = (mw - iv) * (1 - m->mfact); - mw = mw - iv - sw; - sx = mx + mw + iv; - sh = m->wh - 2*oh; - } - - getfacts(m, mh, sh, &mfacts, &sfacts, &mrest, &srest); - - if (n - m->nmaster > 0) /* override layout symbol */ - snprintf(m->ltsymbol, sizeof m->ltsymbol, "D %d", n - m->nmaster); - - for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) - if (i < m->nmaster) { - resize(c, mx, my, mw - (2*c->bw), (mh / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), 0); - my += HEIGHT(c) + ih; - } else { - resize(c, sx, sy, sw - (2*c->bw), sh - (2*c->bw), 0); - } -} - -/* - * Fibonacci layout + gaps - * https://dwm.suckless.org/patches/fibonacci/ - */ -void -fibonacci(Monitor *m, int s) -{ - unsigned int i, n; - int nx, ny, nw, nh; - int oh, ov, ih, iv; - int nv, hrest = 0, wrest = 0, r = 1; - Client *c; - - getgaps(m, &oh, &ov, &ih, &iv, &n); - if (n == 0) - return; - - nx = m->wx + ov; - ny = m->wy + oh; - nw = m->ww - 2*ov; - nh = m->wh - 2*oh; - - for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next)) { - if (r) { - if ((i % 2 && (nh - ih) / 2 <= (bh + 2*c->bw)) - || (!(i % 2) && (nw - iv) / 2 <= (bh + 2*c->bw))) { - r = 0; - } - if (r && i < n - 1) { - if (i % 2) { - nv = (nh - ih) / 2; - hrest = nh - 2*nv - ih; - nh = nv; - } else { - nv = (nw - iv) / 2; - wrest = nw - 2*nv - iv; - nw = nv; - } - - if ((i % 4) == 2 && !s) - nx += nw + iv; - else if ((i % 4) == 3 && !s) - ny += nh + ih; - } - - if ((i % 4) == 0) { - if (s) { - ny += nh + ih; - nh += hrest; - } - else { - nh -= hrest; - ny -= nh + ih; - } - } - else if ((i % 4) == 1) { - nx += nw + iv; - nw += wrest; - } - else if ((i % 4) == 2) { - ny += nh + ih; - nh += hrest; - if (i < n - 1) - nw += wrest; - } - else if ((i % 4) == 3) { - if (s) { - nx += nw + iv; - nw -= wrest; - } else { - nw -= wrest; - nx -= nw + iv; - nh += hrest; - } - } - if (i == 0) { - if (n != 1) { - nw = (m->ww - iv - 2*ov) - (m->ww - iv - 2*ov) * (1 - m->mfact); - wrest = 0; - } - ny = m->wy + oh; - } - else if (i == 1) - nw = m->ww - nw - iv - 2*ov; - i++; - } - - resize(c, nx, ny, nw - (2*c->bw), nh - (2*c->bw), False); - } -} - -void -dwindle(Monitor *m) -{ - fibonacci(m, 1); -} - -void -spiral(Monitor *m) -{ - fibonacci(m, 0); -} - -/* - * Gappless grid layout + gaps (ironically) - * https://dwm.suckless.org/patches/gaplessgrid/ - */ -void -gaplessgrid(Monitor *m) -{ - unsigned int i, n; - int x, y, cols, rows, ch, cw, cn, rn, rrest, crest; // counters - int oh, ov, ih, iv; - Client *c; - - getgaps(m, &oh, &ov, &ih, &iv, &n); - if (n == 0) - return; - - /* grid dimensions */ - for (cols = 0; cols <= n/2; cols++) - if (cols*cols >= n) - break; - if (n == 5) /* set layout against the general calculation: not 1:2:2, but 2:3 */ - cols = 2; - rows = n/cols; - cn = rn = 0; // reset column no, row no, client count - - ch = (m->wh - 2*oh - ih * (rows - 1)) / rows; - cw = (m->ww - 2*ov - iv * (cols - 1)) / cols; - rrest = (m->wh - 2*oh - ih * (rows - 1)) - ch * rows; - crest = (m->ww - 2*ov - iv * (cols - 1)) - cw * cols; - x = m->wx + ov; - y = m->wy + oh; - - for (i = 0, c = nexttiled(m->clients); c; i++, c = nexttiled(c->next)) { - if (i/rows + 1 > cols - n%cols) { - rows = n/cols + 1; - ch = (m->wh - 2*oh - ih * (rows - 1)) / rows; - rrest = (m->wh - 2*oh - ih * (rows - 1)) - ch * rows; - } - resize(c, - x, - y + rn*(ch + ih) + MIN(rn, rrest), - cw + (cn < crest ? 1 : 0) - 2*c->bw, - ch + (rn < rrest ? 1 : 0) - 2*c->bw, - 0); - rn++; - if (rn >= rows) { - rn = 0; - x += cw + ih + (cn < crest ? 1 : 0); - cn++; - } - } -} - -/* - * Gridmode layout + gaps - * https://dwm.suckless.org/patches/gridmode/ - */ -void -grid(Monitor *m) -{ - unsigned int i, n; - int cx, cy, cw, ch, cc, cr, chrest, cwrest, cols, rows; - int oh, ov, ih, iv; - Client *c; - - getgaps(m, &oh, &ov, &ih, &iv, &n); - - /* grid dimensions */ - for (rows = 0; rows <= n/2; rows++) - if (rows*rows >= n) - break; - cols = (rows && (rows - 1) * rows >= n) ? rows - 1 : rows; - - /* window geoms (cell height/width) */ - ch = (m->wh - 2*oh - ih * (rows - 1)) / (rows ? rows : 1); - cw = (m->ww - 2*ov - iv * (cols - 1)) / (cols ? cols : 1); - chrest = (m->wh - 2*oh - ih * (rows - 1)) - ch * rows; - cwrest = (m->ww - 2*ov - iv * (cols - 1)) - cw * cols; - for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) { - cc = i / rows; - cr = i % rows; - cx = m->wx + ov + cc * (cw + iv) + MIN(cc, cwrest); - cy = m->wy + oh + cr * (ch + ih) + MIN(cr, chrest); - resize(c, cx, cy, cw + (cc < cwrest ? 1 : 0) - 2*c->bw, ch + (cr < chrest ? 1 : 0) - 2*c->bw, False); - } -} - -/* - * Horizontal grid layout + gaps - * https://dwm.suckless.org/patches/horizgrid/ - */ -void -horizgrid(Monitor *m) { - Client *c; - unsigned int n, i; - int oh, ov, ih, iv; - int mx = 0, my = 0, mh = 0, mw = 0; - int sx = 0, sy = 0, sh = 0, sw = 0; - int ntop, nbottom = 1; - float mfacts, sfacts; - int mrest, srest; - - /* Count windows */ - getgaps(m, &oh, &ov, &ih, &iv, &n); - if (n == 0) - return; - - if (n <= 2) - ntop = n; - else { - ntop = n / 2; - nbottom = n - ntop; - } - sx = mx = m->wx + ov; - sy = my = m->wy + oh; - sh = mh = m->wh - 2*oh; - sw = mw = m->ww - 2*ov; - - if (n > ntop) { - sh = (mh - ih) / 2; - mh = mh - ih - sh; - sy = my + mh + ih; - mw = m->ww - 2*ov - iv * (ntop - 1); - sw = m->ww - 2*ov - iv * (nbottom - 1); - } - - mfacts = ntop; - sfacts = nbottom; - mrest = mw - (mw / ntop) * ntop; - srest = sw - (sw / nbottom) * nbottom; - - for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) - if (i < ntop) { - resize(c, mx, my, (mw / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0); - mx += WIDTH(c) + iv; - } else { - resize(c, sx, sy, (sw / sfacts) + ((i - ntop) < srest ? 1 : 0) - (2*c->bw), sh - (2*c->bw), 0); - sx += WIDTH(c) + iv; - } -} - -/* - * nrowgrid layout + gaps - * https://dwm.suckless.org/patches/nrowgrid/ - */ -void -nrowgrid(Monitor *m) -{ - unsigned int n; - int ri = 0, ci = 0; /* counters */ - int oh, ov, ih, iv; /* vanitygap settings */ - unsigned int cx, cy, cw, ch; /* client geometry */ - unsigned int uw = 0, uh = 0, uc = 0; /* utilization trackers */ - unsigned int cols, rows = m->nmaster + 1; - Client *c; - - /* count clients */ - getgaps(m, &oh, &ov, &ih, &iv, &n); - - /* nothing to do here */ - if (n == 0) - return; - - /* force 2 clients to always split vertically */ - if (FORCE_VSPLIT && n == 2) - rows = 1; - - /* never allow empty rows */ - if (n < rows) - rows = n; - - /* define first row */ - cols = n / rows; - uc = cols; - cy = m->wy + oh; - ch = (m->wh - 2*oh - ih*(rows - 1)) / rows; - uh = ch; - - for (c = nexttiled(m->clients); c; c = nexttiled(c->next), ci++) { - if (ci == cols) { - uw = 0; - ci = 0; - ri++; - - /* next row */ - cols = (n - uc) / (rows - ri); - uc += cols; - cy = m->wy + oh + uh + ih; - uh += ch + ih; - } - - cx = m->wx + ov + uw; - cw = (m->ww - 2*ov - uw) / (cols - ci); - uw += cw + iv; - - resize(c, cx, cy, cw - (2*c->bw), ch - (2*c->bw), 0); - } -} - -/* - * Default tile layout + gaps - */ -static void -tile(Monitor *m) -{ - unsigned int i, n; - int oh, ov, ih, iv; - int mx = 0, my = 0, mh = 0, mw = 0; - int sx = 0, sy = 0, sh = 0, sw = 0; - float mfacts, sfacts; - int mrest, srest; - Client *c; - - getgaps(m, &oh, &ov, &ih, &iv, &n); - if (n == 0) - return; - - sx = mx = m->wx + ov; - sy = my = m->wy + oh; - mh = m->wh - 2*oh - ih * (MIN(n, m->nmaster) - 1); - sh = m->wh - 2*oh - ih * (n - m->nmaster - 1); - sw = mw = m->ww - 2*ov; - - if (m->nmaster && n > m->nmaster) { - sw = (mw - iv) * (1 - m->mfact); - mw = mw - iv - sw; - sx = mx + mw + iv; - } - - getfacts(m, mh, sh, &mfacts, &sfacts, &mrest, &srest); - - for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) - if (i < m->nmaster) { - resize(c, mx, my, mw - (2*c->bw), (mh / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), 0); - my += HEIGHT(c) + ih; - } else { - resize(c, sx, sy, sw - (2*c->bw), (sh / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*c->bw), 0); - sy += HEIGHT(c) + ih; - } -}
\ No newline at end of file |