itAdd customize - dwm - [fork] customized build of dwm, the dynamic window manager Err adamsgaard.dk 70 hgit clone git://src.adamsgaard.dk/dwm URL:git://src.adamsgaard.dk/dwm adamsgaard.dk 70 1Log /src/dwm/log.gph adamsgaard.dk 70 1Files /src/dwm/files.gph adamsgaard.dk 70 1Refs /src/dwm/refs.gph adamsgaard.dk 70 1README /src/dwm/file/README.gph adamsgaard.dk 70 1LICENSE /src/dwm/file/LICENSE.gph adamsgaard.dk 70 i--- Err adamsgaard.dk 70 1commit 7c099bd74e3f1691da859a1277a501ebe4d53fd6 /src/dwm/commit/7c099bd74e3f1691da859a1277a501ebe4d53fd6.gph adamsgaard.dk 70 1parent f09418bbb6651ab4c299cfefbe1d18de401f630e /src/dwm/commit/f09418bbb6651ab4c299cfefbe1d18de401f630e.gph adamsgaard.dk 70 hAuthor: Anders Damsgaard URL:mailto:anders@adamsgaard.dk adamsgaard.dk 70 iDate: Sat, 23 May 2020 20:35:34 +0200 Err adamsgaard.dk 70 i Err adamsgaard.dk 70 iAdd customize Err adamsgaard.dk 70 i Err adamsgaard.dk 70 iDiffstat: Err adamsgaard.dk 70 i M LICENSE | 1 + Err adamsgaard.dk 70 i A config.h | 241 +++++++++++++++++++++++++++++++ Err adamsgaard.dk 70 i M config.mk | 2 +- Err adamsgaard.dk 70 i M dwm.c | 185 +++++++++++++++++++++++++------ Err adamsgaard.dk 70 i Err adamsgaard.dk 70 i4 files changed, 396 insertions(+), 33 deletions(-) Err adamsgaard.dk 70 i--- Err adamsgaard.dk 70 1diff --git a/LICENSE b/LICENSE /src/dwm/file/LICENSE.gph adamsgaard.dk 70 it@@ -17,6 +17,7 @@ MIT/X Consortium License Err adamsgaard.dk 70 i © 2015-2016 Quentin Rameau Err adamsgaard.dk 70 i © 2015-2016 Eric Pruitt Err adamsgaard.dk 70 i © 2016-2017 Markus Teich Err adamsgaard.dk 70 i+© 2019-2020 Anders Damsgaard Err adamsgaard.dk 70 i Err adamsgaard.dk 70 i Permission is hereby granted, free of charge, to any person obtaining a Err adamsgaard.dk 70 i copy of this software and associated documentation files (the "Software"), Err adamsgaard.dk 70 1diff --git a/config.h b/config.h /src/dwm/file/config.h.gph adamsgaard.dk 70 it@@ -0,0 +1,241 @@ Err adamsgaard.dk 70 i+/* See LICENSE file for copyright and license details. */ Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+/* appearance */ Err adamsgaard.dk 70 i+static const unsigned int borderpx = 0; /* border pixel of windows */ Err adamsgaard.dk 70 i+static const unsigned int gappx = 0; /* gaps between windows */ Err adamsgaard.dk 70 i+static const unsigned int snap = 32; /* snap pixel */ Err adamsgaard.dk 70 i+static const int showbar = 1; /* 0 means no bar */ Err adamsgaard.dk 70 i+static const int topbar = 1; /* 0 means bottom bar */ Err adamsgaard.dk 70 i+static const char *fonts[] = { "dina:size=9:antialias=false" }; Err adamsgaard.dk 70 i+static const char col_gray1[] = "#1d1f21"; Err adamsgaard.dk 70 i+static const char col_gray2[] = "#444444"; Err adamsgaard.dk 70 i+static const char col_gray3[] = "#c5c8c6"; Err adamsgaard.dk 70 i+static const char col_gray4[] = "#1d1f21"; Err adamsgaard.dk 70 i+static const char col_cyan[] = "#8abeb7"; Err adamsgaard.dk 70 i+static const char *colors[][3] = { Err adamsgaard.dk 70 i+ /* fg bg border */ Err adamsgaard.dk 70 i+ [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, Err adamsgaard.dk 70 i+ [SchemeSel] = { col_gray4, col_cyan, col_cyan }, Err adamsgaard.dk 70 i+}; Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+/* tagging */ Err adamsgaard.dk 70 i+static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; Err adamsgaard.dk 70 i+/* static const char *tags[] = { "一", "二", "三", "四", "五", "六", "七", "八", "九" }; */ Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+/* floatpos: Err adamsgaard.dk 70 i+ * 1--2--3 Err adamsgaard.dk 70 i+ * 4--5--6 Err adamsgaard.dk 70 i+ * 7--8--9 Err adamsgaard.dk 70 i+ * 0: disabled */ Err adamsgaard.dk 70 i+static const Rule rules[] = { Err adamsgaard.dk 70 i+ /* xprop(1): Err adamsgaard.dk 70 i+ * WM_CLASS(STRING) = instance, class Err adamsgaard.dk 70 i+ * WM_NAME(STRING) = title Err adamsgaard.dk 70 i+ */ Err adamsgaard.dk 70 i+ /* class instance title tags floatpos isfloating monitor */ Err adamsgaard.dk 70 i+ { "Tor Browser", NULL, NULL, 0, 5, 1, -1 }, Err adamsgaard.dk 70 i+ { "tabbed", NULL, NULL, 1<<1, 0, 0, -1 }, Err adamsgaard.dk 70 i+ { "Firefox", NULL, NULL, 1<<1, 0, 0, -1 }, Err adamsgaard.dk 70 i+ { "Signal", NULL, NULL, 1<<8, 0, 0, -1 }, Err adamsgaard.dk 70 i+ { NULL, NULL, "video", ~0, 9, 1, -1 }, Err adamsgaard.dk 70 i+ { NULL, NULL, "topleft", 0, 1, 1, -1 }, Err adamsgaard.dk 70 i+ { NULL, NULL, "topcenter", 0, 2, 1, -1 }, Err adamsgaard.dk 70 i+ { NULL, NULL, "topright", 0, 3, 1, -1 }, Err adamsgaard.dk 70 i+ { NULL, NULL, "midleft", 0, 4, 1, -1 }, Err adamsgaard.dk 70 i+ { NULL, NULL, "midcenter", 0, 5, 1, -1 }, Err adamsgaard.dk 70 i+ { NULL, NULL, "midright", 0, 6, 1, -1 }, Err adamsgaard.dk 70 i+ { NULL, NULL, "botleft", 0, 7, 1, -1 }, Err adamsgaard.dk 70 i+ { NULL, NULL, "botcenter", 0, 8, 1, -1 }, Err adamsgaard.dk 70 i+ { NULL, NULL, "botright", 0, 9, 1, -1 }, Err adamsgaard.dk 70 i+}; Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+/* layout(s) */ Err adamsgaard.dk 70 i+static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ Err adamsgaard.dk 70 i+static const int nmaster = 1; /* number of clients in master area */ Err adamsgaard.dk 70 i+static const int resizehints = 0; /* 1 means respect size hints in tiled resizals */ Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+static const Layout layouts[] = { Err adamsgaard.dk 70 i+ /* symbol arrange function */ Err adamsgaard.dk 70 i+ { "", tile }, /* first entry is default */ Err adamsgaard.dk 70 i+ { "F", NULL }, /* no layout function means floating behavior */ Err adamsgaard.dk 70 i+ { "M", monocle }, Err adamsgaard.dk 70 i+}; Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+/* key definitions */ Err adamsgaard.dk 70 i+#define MODKEY Mod1Mask Err adamsgaard.dk 70 i+#define MODALTKEY Mod4Mask Err adamsgaard.dk 70 i+#define TAGKEYS(KEY,TAG) \ Err adamsgaard.dk 70 i+ { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ Err adamsgaard.dk 70 i+ { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ Err adamsgaard.dk 70 i+ { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ Err adamsgaard.dk 70 i+ { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+static char dmenumon[2] = "0"; Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+#define HOME "/home/ad" Err adamsgaard.dk 70 i+#define TERMINAL "st" Err adamsgaard.dk 70 i+#define EDITOR "vi" Err adamsgaard.dk 70 i+#define BROWSER "firefox.sh" Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+/* helper for spawning shell commands in the pre dwm-5.0 fashion */ Err adamsgaard.dk 70 i+#define TERMCMD(...) {TERMINAL, "-e", __VA_ARGS__, NULL} Err adamsgaard.dk 70 i+#define DUPLEXCMD(cmd) {TERMINAL, "-e", "tmux", "new-session", cmd, NULL} Err adamsgaard.dk 70 i+#define DUPLEXATTACHCMD(name, cmd) {TERMINAL, "-e", "tmux", "new-session", "-A", "-s", name, cmd, NULL} Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+/* commands */ Err adamsgaard.dk 70 i+static const char *termcmd[] = TERMCMD("ksh", "-l"); Err adamsgaard.dk 70 i+static const char *termplexcmd[] = TERMCMD("tmux"); Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+static const char *dmenucmd[] = {"dmenu_run", NULL}; Err adamsgaard.dk 70 i+static const char *searchcmd[] = {"search", NULL}; Err adamsgaard.dk 70 i+static const char *articlesearchcmd[] = {"articlesearch", NULL}; Err adamsgaard.dk 70 i+static const char *jabbrevcmd[] = {"jabbrev", "-c", NULL}; Err adamsgaard.dk 70 i+static const char *unicodecmd[] = {"unicodepick", NULL}; Err adamsgaard.dk 70 i+static const char *definecmd[] = {"define", "--gui", NULL}; Err adamsgaard.dk 70 i+static const char *passcmd[] = {"passmenu", "-t", "-n", NULL}; Err adamsgaard.dk 70 i+static const char *passemailcmd[] = {"passmenu", "-t", "-u", "anders@adamsgaard.dk\t", "-n", NULL}; Err adamsgaard.dk 70 i+static const char *displaycmd[] = {"displayselect", NULL}; Err adamsgaard.dk 70 i+static const char *torrentcmd[] = {"t-daemon-toggle", NULL}; Err adamsgaard.dk 70 i+static const char *mountcmd[] = {"dmenumount", NULL}; Err adamsgaard.dk 70 i+static const char *umountcmd[] = {"dmenuumount", NULL}; Err adamsgaard.dk 70 i+static const char *contactscmd[] = {"contactmenu", NULL}; Err adamsgaard.dk 70 i+static const char *textcmd[] = {"text.sh", "-i", NULL}; Err adamsgaard.dk 70 i+static const char *videocmd[] = {"videotoggle", NULL}; Err adamsgaard.dk 70 i+static const char *screenrecordcmd[] = {"screenrecord", NULL}; Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+static const char *plumbcmd[] = {"clipplumb", NULL}; Err adamsgaard.dk 70 i+static const char *plumb2cmd[] = {"clipplumb", "-c", NULL}; Err adamsgaard.dk 70 i+static const char *showclipcmd[] = {"showclip", NULL}; Err adamsgaard.dk 70 i+static const char *xlockcmd[] = {"slock", NULL}; Err adamsgaard.dk 70 i+static const char *printscreencmd[] = {"maimfull", NULL}; Err adamsgaard.dk 70 i+static const char *printscreenicmd[] = {"maimpick", NULL}; Err adamsgaard.dk 70 i+static const char *keyboardlayoutcmd[] = {"keyboard-layout-switch.sh", NULL}; Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+static const char *fuzzylaunchcmd[] = TERMCMD("fuzzylaunch"); Err adamsgaard.dk 70 i+static const char *journalcmd[] = TERMCMD("tmux-journal.sh"); Err adamsgaard.dk 70 i+static const char *browsercmd[] = {BROWSER, NULL}; Err adamsgaard.dk 70 i+static const char *torbrowsercmd[] = {"tor-browser", NULL}; Err adamsgaard.dk 70 i+static const char *todocmd[] = DUPLEXATTACHCMD("todo", EDITOR " " HOME "/doc/todo/todo.md"); Err adamsgaard.dk 70 i+static const char *calendarcmd[] = DUPLEXATTACHCMD("calendar", "calendar.sh"); Err adamsgaard.dk 70 i+/* static const char *filecmd[] = TERMCMD("sh", "-c", "cd ~/tmp; ls -p; $SHELL -l"); */ Err adamsgaard.dk 70 i+static const char *mailcmd[] = DUPLEXCMD("mutt"); Err adamsgaard.dk 70 i+static const char *irccmd[] = DUPLEXATTACHCMD("irc", "ssh -t irc@adamsgaard.dk 'tmux -u new-session -A -D -s irc irssi'"); Err adamsgaard.dk 70 i+static const char *topcmd[] = TERMCMD("top", "-C"); Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+static const char *mixercmd[] = TERMCMD("audiomixer"); Err adamsgaard.dk 70 i+static const char *musiccmd[] = TERMCMD("ncmpc"); Err adamsgaard.dk 70 i+static const char *mpdtogglecmd[] = {"mpc", "toggle", NULL}; Err adamsgaard.dk 70 i+static const char *mpdnextcmd[] = {"mpc", "next", NULL}; Err adamsgaard.dk 70 i+static const char *mpdprevcmd[] = {"mpc", "prev", NULL}; Err adamsgaard.dk 70 i+static const char *mpdstopcmd[] = {"mpc", "stop", NULL}; Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+static const char *audioextvolupcmd[] = {"sndioctl", "output.level=+0.05", NULL}; Err adamsgaard.dk 70 i+static const char *audioextvoldncmd[] = {"sndioctl", "output.level=-0.05", NULL}; Err adamsgaard.dk 70 i+static const char *audioextmutecmd[] = {"sndioctl", "output.mute=!", NULL}; Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+/* see key names in /usr/include/X11/keysymdef.h */ Err adamsgaard.dk 70 i+static Key keys[] = { Err adamsgaard.dk 70 i+ /* modifier key function argument */ Err adamsgaard.dk 70 i+ { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_Return, spawn, {.v = termplexcmd } }, Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+ { MODKEY|ShiftMask, XK_space, spawn, {.v = dmenucmd } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_space, spawn, {.v = searchcmd } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_a, spawn, {.v = articlesearchcmd } }, Err adamsgaard.dk 70 i+ { MODKEY|ShiftMask, XK_a, spawn, {.v = jabbrevcmd } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_o, spawn, {.v = fuzzylaunchcmd } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_grave, spawn, {.v = unicodecmd } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_slash, spawn, {.v = definecmd } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_p, spawn, {.v = passcmd } }, Err adamsgaard.dk 70 i+ { MODKEY|ShiftMask, XK_p, spawn, {.v = passemailcmd } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_F7, spawn, {.v = displaycmd } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_F8, spawn, {.v = torrentcmd } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_F9, spawn, {.v = mountcmd } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_F10, spawn, {.v = umountcmd } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_F11, spawn, {.v = contactscmd } }, Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+ { MODKEY, XK_u, spawn, {.v = plumbcmd } }, Err adamsgaard.dk 70 i+ { MODKEY|ShiftMask, XK_u, spawn, {.v = plumb2cmd } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_x, spawn, {.v = xlockcmd } }, Err adamsgaard.dk 70 i+ { 0, XK_Print, spawn, {.v = printscreencmd } }, Err adamsgaard.dk 70 i+ { ShiftMask, XK_Print, spawn, {.v = printscreenicmd } }, Err adamsgaard.dk 70 i+ { MODKEY|ShiftMask, XK_c, spawn, {.v = showclipcmd } }, Err adamsgaard.dk 70 i+ { MODKEY|ControlMask|ShiftMask, XK_l, spawn, {.v = keyboardlayoutcmd } }, Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+ { MODKEY, XK_v, spawn, {.v = videocmd } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_r, spawn, {.v = screenrecordcmd } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_c, spawn, {.v = calendarcmd } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_d, spawn, {.v = todocmd } }, Err adamsgaard.dk 70 i+ { MODKEY|ShiftMask, XK_d, spawn, {.v = journalcmd } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_w, spawn, {.v = browsercmd } }, Err adamsgaard.dk 70 i+ { MODKEY|ShiftMask, XK_w, spawn, {.v = torbrowsercmd } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_t, spawn, {.v = textcmd } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_m, spawn, {.v = mailcmd } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_i, spawn, {.v = irccmd } }, Err adamsgaard.dk 70 i+ { MODKEY|ShiftMask, XK_o, spawn, {.v = topcmd } }, Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+ { MODKEY|ControlMask|ShiftMask, XK_a, spawn, {.v = mixercmd } }, Err adamsgaard.dk 70 i+ { MODKEY|ControlMask|ShiftMask, XK_m, spawn, {.v = musiccmd } }, Err adamsgaard.dk 70 i+ { MODKEY|ControlMask|ShiftMask, XK_p, spawn, {.v = mpdtogglecmd } }, Err adamsgaard.dk 70 i+ { MODKEY|ControlMask|ShiftMask, XK_n, spawn, {.v = mpdnextcmd } }, Err adamsgaard.dk 70 i+ { MODKEY|ControlMask|ShiftMask, XK_b, spawn, {.v = mpdprevcmd } }, Err adamsgaard.dk 70 i+ { MODKEY|ControlMask|ShiftMask, XK_s, spawn, {.v = mpdstopcmd } }, Err adamsgaard.dk 70 i+ { ShiftMask, XF86XK_AudioRaiseVolume, spawn, {.v = audioextvolupcmd } }, Err adamsgaard.dk 70 i+ { ShiftMask, XF86XK_AudioLowerVolume, spawn, {.v = audioextvoldncmd } }, Err adamsgaard.dk 70 i+ { ShiftMask, XF86XK_AudioMute, spawn, {.v = audioextmutecmd } }, Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+ { MODKEY|MODALTKEY, XK_b, togglebar, {0} }, Err adamsgaard.dk 70 i+ { MODKEY, XK_j, focusstack, {.i = +1 } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_k, focusstack, {.i = -1 } }, Err adamsgaard.dk 70 i+ { MODKEY|ShiftMask, XK_j, incnmaster, {.i = +1 } }, Err adamsgaard.dk 70 i+ { MODKEY|ShiftMask, XK_k, incnmaster, {.i = -1 } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_h, setmfact, {.f = -0.05} }, Err adamsgaard.dk 70 i+ { MODKEY, XK_l, setmfact, {.f = +0.05} }, Err adamsgaard.dk 70 i+ { MODKEY, XK_Tab, view, {0} }, Err adamsgaard.dk 70 i+ { MODKEY, XK_q, killclient, {0} }, Err adamsgaard.dk 70 i+ { MODKEY|ShiftMask, XK_t, setlayout, {.v = &layouts[0]} }, Err adamsgaard.dk 70 i+ { MODKEY|ShiftMask, XK_l, setlayout, {.v = &layouts[1]} }, Err adamsgaard.dk 70 i+ { MODKEY|ShiftMask, XK_m, setlayout, {.v = &layouts[2]} }, Err adamsgaard.dk 70 i+ { MODKEY|ShiftMask, XK_f, togglefloating, {0} }, Err adamsgaard.dk 70 i+ { MODKEY, XK_f, zoom, {0} }, Err adamsgaard.dk 70 i+ { MODKEY, XK_0, view, {.ui = ~0 } }, Err adamsgaard.dk 70 i+ { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_comma, focusmon, {.i = -1 } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_period, focusmon, {.i = +1 } }, Err adamsgaard.dk 70 i+ { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, Err adamsgaard.dk 70 i+ { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_minus, setgaps, {.i = -1 } }, Err adamsgaard.dk 70 i+ { MODKEY|ShiftMask, XK_equal, setgaps, {.i = +1 } }, Err adamsgaard.dk 70 i+ { MODKEY|MODALTKEY, XK_equal, setgaps, {.i = 0 } }, Err adamsgaard.dk 70 i+ { MODKEY, XK_equal, setgaps, {.i = gappx } }, Err adamsgaard.dk 70 i+ TAGKEYS( XK_1, 0) Err adamsgaard.dk 70 i+ TAGKEYS( XK_2, 1) Err adamsgaard.dk 70 i+ TAGKEYS( XK_3, 2) Err adamsgaard.dk 70 i+ TAGKEYS( XK_4, 3) Err adamsgaard.dk 70 i+ TAGKEYS( XK_5, 4) Err adamsgaard.dk 70 i+ TAGKEYS( XK_6, 5) Err adamsgaard.dk 70 i+ TAGKEYS( XK_7, 6) Err adamsgaard.dk 70 i+ TAGKEYS( XK_8, 7) Err adamsgaard.dk 70 i+ TAGKEYS( XK_9, 8) Err adamsgaard.dk 70 i+ { MODKEY|ShiftMask, XK_q, quit, {0} }, Err adamsgaard.dk 70 i+}; Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+/* button definitions */ Err adamsgaard.dk 70 i+/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ Err adamsgaard.dk 70 i+static Button buttons[] = { Err adamsgaard.dk 70 i+ /* click event mask button function argument */ Err adamsgaard.dk 70 i+ { ClkLtSymbol, 0, Button1, setlayout, {0} }, Err adamsgaard.dk 70 i+ { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, Err adamsgaard.dk 70 i+ { ClkWinTitle, 0, Button2, zoom, {0} }, Err adamsgaard.dk 70 i+ { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, Err adamsgaard.dk 70 i+ { ClkClientWin, MODKEY, Button1, movemouse, {0} }, Err adamsgaard.dk 70 i+ { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, Err adamsgaard.dk 70 i+ { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, Err adamsgaard.dk 70 i+ { ClkTagBar, 0, Button1, view, {0} }, Err adamsgaard.dk 70 i+ { ClkTagBar, 0, Button3, toggleview, {0} }, Err adamsgaard.dk 70 i+ { ClkTagBar, MODKEY, Button1, tag, {0} }, Err adamsgaard.dk 70 i+ { ClkTagBar, MODKEY, Button3, toggletag, {0} }, Err adamsgaard.dk 70 i+}; Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 1diff --git a/config.mk b/config.mk /src/dwm/file/config.mk.gph adamsgaard.dk 70 it@@ -18,7 +18,7 @@ XINERAMAFLAGS = -DXINERAMA Err adamsgaard.dk 70 i FREETYPELIBS = -lfontconfig -lXft Err adamsgaard.dk 70 i FREETYPEINC = /usr/include/freetype2 Err adamsgaard.dk 70 i # OpenBSD (uncomment) Err adamsgaard.dk 70 i-#FREETYPEINC = ${X11INC}/freetype2 Err adamsgaard.dk 70 i+FREETYPEINC = ${X11INC}/freetype2 Err adamsgaard.dk 70 i Err adamsgaard.dk 70 i # includes and libs Err adamsgaard.dk 70 i INCS = -I${X11INC} -I${FREETYPEINC} Err adamsgaard.dk 70 1diff --git a/dwm.c b/dwm.c /src/dwm/file/dwm.c.gph adamsgaard.dk 70 it@@ -41,6 +41,9 @@ Err adamsgaard.dk 70 i #endif /* XINERAMA */ Err adamsgaard.dk 70 i #include Err adamsgaard.dk 70 i Err adamsgaard.dk 70 i+/* for multimedia keys */ Err adamsgaard.dk 70 i+#include Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i #include "drw.h" Err adamsgaard.dk 70 i #include "util.h" Err adamsgaard.dk 70 i Err adamsgaard.dk 70 it@@ -92,7 +95,7 @@ struct Client { Err adamsgaard.dk 70 i int basew, baseh, incw, inch, maxw, maxh, minw, minh; Err adamsgaard.dk 70 i int bw, oldbw; Err adamsgaard.dk 70 i unsigned int tags; Err adamsgaard.dk 70 i- int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; Err adamsgaard.dk 70 i+ int isfixed, floatpos, isfloating, isurgent, neverfocus, oldstate, isfullscreen; Err adamsgaard.dk 70 i Client *next; Err adamsgaard.dk 70 i Client *snext; Err adamsgaard.dk 70 i Monitor *mon; Err adamsgaard.dk 70 it@@ -111,6 +114,7 @@ typedef struct { Err adamsgaard.dk 70 i void (*arrange)(Monitor *); Err adamsgaard.dk 70 i } Layout; Err adamsgaard.dk 70 i Err adamsgaard.dk 70 i+typedef struct Pertag Pertag; Err adamsgaard.dk 70 i struct Monitor { Err adamsgaard.dk 70 i char ltsymbol[16]; Err adamsgaard.dk 70 i float mfact; Err adamsgaard.dk 70 it@@ -119,6 +123,7 @@ struct Monitor { Err adamsgaard.dk 70 i int by; /* bar geometry */ Err adamsgaard.dk 70 i int mx, my, mw, mh; /* screen size */ Err adamsgaard.dk 70 i int wx, wy, ww, wh; /* window area */ Err adamsgaard.dk 70 i+ int gappx; /* gaps between windows */ Err adamsgaard.dk 70 i unsigned int seltags; Err adamsgaard.dk 70 i unsigned int sellt; Err adamsgaard.dk 70 i unsigned int tagset[2]; Err adamsgaard.dk 70 it@@ -130,6 +135,7 @@ struct Monitor { Err adamsgaard.dk 70 i Monitor *next; Err adamsgaard.dk 70 i Window barwin; Err adamsgaard.dk 70 i const Layout *lt[2]; Err adamsgaard.dk 70 i+ Pertag *pertag; Err adamsgaard.dk 70 i }; Err adamsgaard.dk 70 i Err adamsgaard.dk 70 i typedef struct { Err adamsgaard.dk 70 it@@ -137,6 +143,7 @@ typedef struct { Err adamsgaard.dk 70 i const char *instance; Err adamsgaard.dk 70 i const char *title; Err adamsgaard.dk 70 i unsigned int tags; Err adamsgaard.dk 70 i+ int floatpos; Err adamsgaard.dk 70 i int isfloating; Err adamsgaard.dk 70 i int monitor; Err adamsgaard.dk 70 i } Rule; Err adamsgaard.dk 70 it@@ -169,7 +176,6 @@ static void focus(Client *c); Err adamsgaard.dk 70 i static void focusin(XEvent *e); Err adamsgaard.dk 70 i static void focusmon(const Arg *arg); Err adamsgaard.dk 70 i static void focusstack(const Arg *arg); Err adamsgaard.dk 70 i-static Atom getatomprop(Client *c, Atom prop); Err adamsgaard.dk 70 i static int getrootptr(int *x, int *y); Err adamsgaard.dk 70 i static long getstate(Window w); Err adamsgaard.dk 70 i static int gettextprop(Window w, Atom atom, char *text, unsigned int size); Err adamsgaard.dk 70 it@@ -200,6 +206,7 @@ static void sendmon(Client *c, Monitor *m); Err adamsgaard.dk 70 i static void setclientstate(Client *c, long state); Err adamsgaard.dk 70 i static void setfocus(Client *c); Err adamsgaard.dk 70 i static void setfullscreen(Client *c, int fullscreen); Err adamsgaard.dk 70 i+static void setgaps(const Arg *arg); Err adamsgaard.dk 70 i static void setlayout(const Arg *arg); Err adamsgaard.dk 70 i static void setmfact(const Arg *arg); Err adamsgaard.dk 70 i static void setup(void); Err adamsgaard.dk 70 it@@ -272,6 +279,15 @@ static Window root, wmcheckwin; Err adamsgaard.dk 70 i /* configuration, allows nested code to access above variables */ Err adamsgaard.dk 70 i #include "config.h" Err adamsgaard.dk 70 i Err adamsgaard.dk 70 i+struct Pertag { Err adamsgaard.dk 70 i+ unsigned int curtag, prevtag; /* current and previous tag */ Err adamsgaard.dk 70 i+ int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */ Err adamsgaard.dk 70 i+ float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */ Err adamsgaard.dk 70 i+ unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */ Err adamsgaard.dk 70 i+ const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes */ Err adamsgaard.dk 70 i+ int showbars[LENGTH(tags) + 1]; /* display bar for the current tag */ Err adamsgaard.dk 70 i+}; Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i /* compile-time check if all tags fit into an unsigned int bit array. */ Err adamsgaard.dk 70 i struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; Err adamsgaard.dk 70 i Err adamsgaard.dk 70 it@@ -286,6 +302,7 @@ applyrules(Client *c) Err adamsgaard.dk 70 i XClassHint ch = { NULL, NULL }; Err adamsgaard.dk 70 i Err adamsgaard.dk 70 i /* rule matching */ Err adamsgaard.dk 70 i+ c->floatpos = 0; Err adamsgaard.dk 70 i c->isfloating = 0; Err adamsgaard.dk 70 i c->tags = 0; Err adamsgaard.dk 70 i XGetClassHint(dpy, c->win, &ch); Err adamsgaard.dk 70 it@@ -299,6 +316,7 @@ applyrules(Client *c) Err adamsgaard.dk 70 i && (!r->instance || strstr(instance, r->instance))) Err adamsgaard.dk 70 i { Err adamsgaard.dk 70 i c->isfloating = r->isfloating; Err adamsgaard.dk 70 i+ c->floatpos = r->floatpos; Err adamsgaard.dk 70 i c->tags |= r->tags; Err adamsgaard.dk 70 i for (m = mons; m && m->num != r->monitor; m = m->next); Err adamsgaard.dk 70 i if (m) Err adamsgaard.dk 70 it@@ -417,7 +435,7 @@ attachstack(Client *c) Err adamsgaard.dk 70 i void Err adamsgaard.dk 70 i buttonpress(XEvent *e) Err adamsgaard.dk 70 i { Err adamsgaard.dk 70 i- unsigned int i, x, click; Err adamsgaard.dk 70 i+ unsigned int i, x, click, occ = 0; Err adamsgaard.dk 70 i Arg arg = {0}; Err adamsgaard.dk 70 i Client *c; Err adamsgaard.dk 70 i Monitor *m; Err adamsgaard.dk 70 it@@ -432,9 +450,14 @@ buttonpress(XEvent *e) Err adamsgaard.dk 70 i } Err adamsgaard.dk 70 i if (ev->window == selmon->barwin) { Err adamsgaard.dk 70 i i = x = 0; Err adamsgaard.dk 70 i- do Err adamsgaard.dk 70 i+ for (c = m->clients; c; c = c->next) Err adamsgaard.dk 70 i+ occ |= c->tags == 255 ? 0 : c->tags; Err adamsgaard.dk 70 i+ do { Err adamsgaard.dk 70 i+ /* do not reserve space for vacant tags */ Err adamsgaard.dk 70 i+ if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) Err adamsgaard.dk 70 i+ continue; Err adamsgaard.dk 70 i x += TEXTW(tags[i]); Err adamsgaard.dk 70 i- while (ev->x >= x && ++i < LENGTH(tags)); Err adamsgaard.dk 70 i+ } while (ev->x >= x && ++i < LENGTH(tags)); Err adamsgaard.dk 70 i if (i < LENGTH(tags)) { Err adamsgaard.dk 70 i click = ClkTagBar; Err adamsgaard.dk 70 i arg.ui = 1 << i; Err adamsgaard.dk 70 it@@ -632,6 +655,7 @@ Monitor * Err adamsgaard.dk 70 i createmon(void) Err adamsgaard.dk 70 i { Err adamsgaard.dk 70 i Monitor *m; Err adamsgaard.dk 70 i+ unsigned int i; Err adamsgaard.dk 70 i Err adamsgaard.dk 70 i m = ecalloc(1, sizeof(Monitor)); Err adamsgaard.dk 70 i m->tagset[0] = m->tagset[1] = 1; Err adamsgaard.dk 70 it@@ -639,9 +663,24 @@ createmon(void) Err adamsgaard.dk 70 i m->nmaster = nmaster; Err adamsgaard.dk 70 i m->showbar = showbar; Err adamsgaard.dk 70 i m->topbar = topbar; Err adamsgaard.dk 70 i+ m->gappx = gappx; Err adamsgaard.dk 70 i m->lt[0] = &layouts[0]; Err adamsgaard.dk 70 i m->lt[1] = &layouts[1 % LENGTH(layouts)]; Err adamsgaard.dk 70 i strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); Err adamsgaard.dk 70 i+ m->pertag = ecalloc(1, sizeof(Pertag)); Err adamsgaard.dk 70 i+ m->pertag->curtag = m->pertag->prevtag = 1; Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+ for (i = 0; i <= LENGTH(tags); i++) { Err adamsgaard.dk 70 i+ m->pertag->nmasters[i] = m->nmaster; Err adamsgaard.dk 70 i+ m->pertag->mfacts[i] = m->mfact; Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+ m->pertag->ltidxs[i][0] = m->lt[0]; Err adamsgaard.dk 70 i+ m->pertag->ltidxs[i][1] = m->lt[1]; Err adamsgaard.dk 70 i+ m->pertag->sellts[i] = m->sellt; Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+ m->pertag->showbars[i] = m->showbar; Err adamsgaard.dk 70 i+ } Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i return m; Err adamsgaard.dk 70 i } Err adamsgaard.dk 70 i Err adamsgaard.dk 70 it@@ -696,7 +735,7 @@ dirtomon(int dir) Err adamsgaard.dk 70 i void Err adamsgaard.dk 70 i drawbar(Monitor *m) Err adamsgaard.dk 70 i { Err adamsgaard.dk 70 i- int x, w, tw = 0; Err adamsgaard.dk 70 i+ int x, w, sw = 0; Err adamsgaard.dk 70 i int boxs = drw->fonts->h / 9; Err adamsgaard.dk 70 i int boxw = drw->fonts->h / 6 + 2; Err adamsgaard.dk 70 i unsigned int i, occ = 0, urg = 0; Err adamsgaard.dk 70 it@@ -705,33 +744,33 @@ drawbar(Monitor *m) Err adamsgaard.dk 70 i /* draw status first so it can be overdrawn by tags later */ Err adamsgaard.dk 70 i if (m == selmon) { /* status is only drawn on selected monitor */ Err adamsgaard.dk 70 i drw_setscheme(drw, scheme[SchemeNorm]); Err adamsgaard.dk 70 i- tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ Err adamsgaard.dk 70 i- drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); Err adamsgaard.dk 70 i+ sw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ Err adamsgaard.dk 70 i+ drw_text(drw, m->ww - sw, 0, sw, bh, 0, stext, 0); Err adamsgaard.dk 70 i } Err adamsgaard.dk 70 i Err adamsgaard.dk 70 i for (c = m->clients; c; c = c->next) { Err adamsgaard.dk 70 i- occ |= c->tags; Err adamsgaard.dk 70 i+ occ |= c->tags == 255 ? 0 : c->tags; Err adamsgaard.dk 70 i if (c->isurgent) Err adamsgaard.dk 70 i urg |= c->tags; Err adamsgaard.dk 70 i } Err adamsgaard.dk 70 i x = 0; Err adamsgaard.dk 70 i for (i = 0; i < LENGTH(tags); i++) { Err adamsgaard.dk 70 i+ /* do not draw vacant tags */ Err adamsgaard.dk 70 i+ if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) Err adamsgaard.dk 70 i+ continue; Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i w = TEXTW(tags[i]); Err adamsgaard.dk 70 i drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); Err adamsgaard.dk 70 i drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); Err adamsgaard.dk 70 i- if (occ & 1 << i) Err adamsgaard.dk 70 i- drw_rect(drw, x + boxs, boxs, boxw, boxw, Err adamsgaard.dk 70 i- m == selmon && selmon->sel && selmon->sel->tags & 1 << i, Err adamsgaard.dk 70 i- urg & 1 << i); Err adamsgaard.dk 70 i x += w; Err adamsgaard.dk 70 i } Err adamsgaard.dk 70 i w = blw = TEXTW(m->ltsymbol); Err adamsgaard.dk 70 i drw_setscheme(drw, scheme[SchemeNorm]); Err adamsgaard.dk 70 i x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); Err adamsgaard.dk 70 i Err adamsgaard.dk 70 i- if ((w = m->ww - tw - x) > bh) { Err adamsgaard.dk 70 i+ if ((w = m->ww - sw - x) > bh) { Err adamsgaard.dk 70 i if (m->sel) { Err adamsgaard.dk 70 i- drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); Err adamsgaard.dk 70 i+ /*drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);*/ Err adamsgaard.dk 70 i drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); Err adamsgaard.dk 70 i if (m->sel->isfloating) Err adamsgaard.dk 70 i drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); Err adamsgaard.dk 70 it@@ -967,7 +1006,7 @@ grabkeys(void) Err adamsgaard.dk 70 i void Err adamsgaard.dk 70 i incnmaster(const Arg *arg) Err adamsgaard.dk 70 i { Err adamsgaard.dk 70 i- selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); Err adamsgaard.dk 70 i+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0); Err adamsgaard.dk 70 i arrange(selmon); Err adamsgaard.dk 70 i } Err adamsgaard.dk 70 i Err adamsgaard.dk 70 it@@ -1050,6 +1089,30 @@ manage(Window w, XWindowAttributes *wa) Err adamsgaard.dk 70 i && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my); Err adamsgaard.dk 70 i c->bw = borderpx; Err adamsgaard.dk 70 i Err adamsgaard.dk 70 i+ switch (c->floatpos) { Err adamsgaard.dk 70 i+ case 1: case 4: case 7: Err adamsgaard.dk 70 i+ c->x = 0; Err adamsgaard.dk 70 i+ break; Err adamsgaard.dk 70 i+ case 3: case 6: case 9: Err adamsgaard.dk 70 i+ c->x = c->mon->mw - WIDTH(c); Err adamsgaard.dk 70 i+ break; Err adamsgaard.dk 70 i+ case 2: case 5: case 8: default: Err adamsgaard.dk 70 i+ c->x = (c->mon->mw - WIDTH(c)) / 2; Err adamsgaard.dk 70 i+ break; Err adamsgaard.dk 70 i+ } Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+ switch (c->floatpos) { Err adamsgaard.dk 70 i+ case 1: case 2: case 3: Err adamsgaard.dk 70 i+ c->y = 0; Err adamsgaard.dk 70 i+ break; Err adamsgaard.dk 70 i+ case 7: case 8: case 9: Err adamsgaard.dk 70 i+ c->y = c->mon->mh - HEIGHT(c); Err adamsgaard.dk 70 i+ break; Err adamsgaard.dk 70 i+ case 4: case 5: case 6: default: Err adamsgaard.dk 70 i+ c->y = (c->mon->mh - HEIGHT(c)) / 2; Err adamsgaard.dk 70 i+ break; Err adamsgaard.dk 70 i+ } Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i wc.border_width = c->bw; Err adamsgaard.dk 70 i XConfigureWindow(dpy, w, CWBorderWidth, &wc); Err adamsgaard.dk 70 i XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); Err adamsgaard.dk 70 it@@ -1499,12 +1562,22 @@ setfullscreen(Client *c, int fullscreen) Err adamsgaard.dk 70 i } Err adamsgaard.dk 70 i Err adamsgaard.dk 70 i void Err adamsgaard.dk 70 i+setgaps(const Arg *arg) Err adamsgaard.dk 70 i+{ Err adamsgaard.dk 70 i+ if ((arg->i == 0) || (selmon->gappx + arg->i < 0)) Err adamsgaard.dk 70 i+ selmon->gappx = 0; Err adamsgaard.dk 70 i+ else Err adamsgaard.dk 70 i+ selmon->gappx += arg->i; Err adamsgaard.dk 70 i+ arrange(selmon); Err adamsgaard.dk 70 i+} Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+void Err adamsgaard.dk 70 i setlayout(const Arg *arg) Err adamsgaard.dk 70 i { Err adamsgaard.dk 70 i if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) Err adamsgaard.dk 70 i- selmon->sellt ^= 1; Err adamsgaard.dk 70 i+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag] ^= 1; Err adamsgaard.dk 70 i if (arg && arg->v) Err adamsgaard.dk 70 i- selmon->lt[selmon->sellt] = (Layout *)arg->v; Err adamsgaard.dk 70 i+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt] = (Layout *)arg->v; Err adamsgaard.dk 70 i strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); Err adamsgaard.dk 70 i if (selmon->sel) Err adamsgaard.dk 70 i arrange(selmon); Err adamsgaard.dk 70 it@@ -1521,9 +1594,9 @@ setmfact(const Arg *arg) Err adamsgaard.dk 70 i if (!arg || !selmon->lt[selmon->sellt]->arrange) Err adamsgaard.dk 70 i return; Err adamsgaard.dk 70 i f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; Err adamsgaard.dk 70 i- if (f < 0.05 || f > 0.95) Err adamsgaard.dk 70 i+ if (f < 0.1 || f > 0.9) Err adamsgaard.dk 70 i return; Err adamsgaard.dk 70 i- selmon->mfact = f; Err adamsgaard.dk 70 i+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f; Err adamsgaard.dk 70 i arrange(selmon); Err adamsgaard.dk 70 i } Err adamsgaard.dk 70 i Err adamsgaard.dk 70 it@@ -1684,25 +1757,23 @@ tile(Monitor *m) Err adamsgaard.dk 70 i if (n > m->nmaster) Err adamsgaard.dk 70 i mw = m->nmaster ? m->ww * m->mfact : 0; Err adamsgaard.dk 70 i else Err adamsgaard.dk 70 i- mw = m->ww; Err adamsgaard.dk 70 i- for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) Err adamsgaard.dk 70 i+ mw = m->ww - m->gappx; Err adamsgaard.dk 70 i+ for (i = 0, my = ty = m->gappx, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) Err adamsgaard.dk 70 i if (i < m->nmaster) { Err adamsgaard.dk 70 i- h = (m->wh - my) / (MIN(n, m->nmaster) - i); Err adamsgaard.dk 70 i- resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); Err adamsgaard.dk 70 i- if (my + HEIGHT(c) < m->wh) Err adamsgaard.dk 70 i- my += HEIGHT(c); Err adamsgaard.dk 70 i+ h = (m->wh - my) / (MIN(n, m->nmaster) - i) - m->gappx; Err adamsgaard.dk 70 i+ resize(c, m->wx + m->gappx, m->wy + my, mw - (2*c->bw) - m->gappx, h - (2*c->bw), 0); Err adamsgaard.dk 70 i+ my += HEIGHT(c) + m->gappx; Err adamsgaard.dk 70 i } else { Err adamsgaard.dk 70 i- h = (m->wh - ty) / (n - i); Err adamsgaard.dk 70 i- resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0); Err adamsgaard.dk 70 i- if (ty + HEIGHT(c) < m->wh) Err adamsgaard.dk 70 i- ty += HEIGHT(c); Err adamsgaard.dk 70 i+ h = (m->wh - ty) / (n - i) - m->gappx; Err adamsgaard.dk 70 i+ resize(c, m->wx + mw + m->gappx, m->wy + ty, m->ww - mw - (2*c->bw) - 2*m->gappx, h - (2*c->bw), 0); Err adamsgaard.dk 70 i+ ty += HEIGHT(c) + m->gappx; Err adamsgaard.dk 70 i } Err adamsgaard.dk 70 i } Err adamsgaard.dk 70 i Err adamsgaard.dk 70 i void Err adamsgaard.dk 70 i togglebar(const Arg *arg) Err adamsgaard.dk 70 i { Err adamsgaard.dk 70 i- selmon->showbar = !selmon->showbar; Err adamsgaard.dk 70 i+ selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar; Err adamsgaard.dk 70 i updatebarpos(selmon); Err adamsgaard.dk 70 i XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); Err adamsgaard.dk 70 i arrange(selmon); Err adamsgaard.dk 70 it@@ -1741,9 +1812,33 @@ void Err adamsgaard.dk 70 i toggleview(const Arg *arg) Err adamsgaard.dk 70 i { Err adamsgaard.dk 70 i unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); Err adamsgaard.dk 70 i+ int i; Err adamsgaard.dk 70 i Err adamsgaard.dk 70 i if (newtagset) { Err adamsgaard.dk 70 i selmon->tagset[selmon->seltags] = newtagset; Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+ if (newtagset == ~0) { Err adamsgaard.dk 70 i+ selmon->pertag->prevtag = selmon->pertag->curtag; Err adamsgaard.dk 70 i+ selmon->pertag->curtag = 0; Err adamsgaard.dk 70 i+ } Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+ /* test if the user did not select the same tag */ Err adamsgaard.dk 70 i+ if (!(newtagset & 1 << (selmon->pertag->curtag - 1))) { Err adamsgaard.dk 70 i+ selmon->pertag->prevtag = selmon->pertag->curtag; Err adamsgaard.dk 70 i+ for (i = 0; !(newtagset & 1 << i); i++) ; Err adamsgaard.dk 70 i+ selmon->pertag->curtag = i + 1; Err adamsgaard.dk 70 i+ } Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+ /* apply settings for this view */ Err adamsgaard.dk 70 i+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; Err adamsgaard.dk 70 i+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; Err adamsgaard.dk 70 i+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; Err adamsgaard.dk 70 i+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; Err adamsgaard.dk 70 i+ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) Err adamsgaard.dk 70 i+ togglebar(NULL); Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i focus(NULL); Err adamsgaard.dk 70 i arrange(selmon); Err adamsgaard.dk 70 i } Err adamsgaard.dk 70 it@@ -2038,11 +2133,37 @@ updatewmhints(Client *c) Err adamsgaard.dk 70 i void Err adamsgaard.dk 70 i view(const Arg *arg) Err adamsgaard.dk 70 i { Err adamsgaard.dk 70 i+ int i; Err adamsgaard.dk 70 i+ unsigned int tmptag; Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) Err adamsgaard.dk 70 i return; Err adamsgaard.dk 70 i selmon->seltags ^= 1; /* toggle sel tagset */ Err adamsgaard.dk 70 i- if (arg->ui & TAGMASK) Err adamsgaard.dk 70 i+ if (arg->ui & TAGMASK) { Err adamsgaard.dk 70 i selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; Err adamsgaard.dk 70 i+ selmon->pertag->prevtag = selmon->pertag->curtag; Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+ if (arg->ui == ~0) Err adamsgaard.dk 70 i+ selmon->pertag->curtag = 0; Err adamsgaard.dk 70 i+ else { Err adamsgaard.dk 70 i+ for (i = 0; !(arg->ui & 1 << i); i++) ; Err adamsgaard.dk 70 i+ selmon->pertag->curtag = i + 1; Err adamsgaard.dk 70 i+ } Err adamsgaard.dk 70 i+ } else { Err adamsgaard.dk 70 i+ tmptag = selmon->pertag->prevtag; Err adamsgaard.dk 70 i+ selmon->pertag->prevtag = selmon->pertag->curtag; Err adamsgaard.dk 70 i+ selmon->pertag->curtag = tmptag; Err adamsgaard.dk 70 i+ } Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; Err adamsgaard.dk 70 i+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; Err adamsgaard.dk 70 i+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; Err adamsgaard.dk 70 i+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; Err adamsgaard.dk 70 i+ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i+ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) Err adamsgaard.dk 70 i+ togglebar(NULL); Err adamsgaard.dk 70 i+ Err adamsgaard.dk 70 i focus(NULL); Err adamsgaard.dk 70 i arrange(selmon); Err adamsgaard.dk 70 i } Err adamsgaard.dk 70 .