From 84c06e3578afe49f45bdcfff1beb66f69b7e7994 Mon Sep 17 00:00:00 2001 From: wiebel Date: Tue, 12 Mar 2024 22:36:44 +0100 Subject: [PATCH] first commit --- LICENSE | 37 + Makefile | 69 + README | 48 + config.def.h | 345 +++ config.h | 416 ++++ config.h.tmp | 416 ++++ config.mk | 70 + drw.c | 490 +++++ drw.h | 74 + drw.o | Bin 0 -> 53112 bytes dwm | Bin 0 -> 139328 bytes dwm.1 | 176 ++ dwm.c | 2893 +++++++++++++++++++++++++ dwm.o | Bin 0 -> 351280 bytes dwm.png | Bin 0 -> 373 bytes patch/autostart.c | 84 + patch/autostart.h | 2 + patch/bar_alpha.c | 43 + patch/bar_alpha.h | 4 + patch/bar_dwmblocks.c | 41 + patch/bar_dwmblocks.h | 3 + patch/bar_ewmhtags.c | 53 + patch/bar_ewmhtags.h | 7 + patch/bar_indicators.c | 109 + patch/bar_indicators.h | 21 + patch/bar_ltsymbol.c | 18 + patch/bar_ltsymbol.h | 4 + patch/bar_powerline_tags.c | 85 + patch/bar_powerline_tags.h | 4 + patch/bar_status.c | 20 + patch/bar_status.h | 4 + patch/bar_statuscmd.c | 46 + patch/bar_statuscmd.h | 9 + patch/bar_systray.c | 186 ++ patch/bar_systray.h | 42 + patch/bar_tabgroups.c | 223 ++ patch/bar_tabgroups.h | 8 + patch/bar_tagicons.c | 9 + patch/bar_tagicons.h | 8 + patch/bar_tags.c | 75 + patch/bar_tags.h | 4 + patch/bar_wintitle.c | 39 + patch/bar_wintitle.h | 4 + patch/bar_wintitleactions.c | 91 + patch/bar_wintitleactions.h | 6 + patch/decorationhints.c | 35 + patch/decorationhints.h | 9 + patch/fakefullscreenclient.c | 19 + patch/fakefullscreenclient.h | 2 + patch/focusadjacenttag.c | 80 + patch/focusadjacenttag.h | 7 + patch/include.c | 40 + patch/include.h | 39 + patch/inplacerotate.c | 84 + patch/inplacerotate.h | 2 + patch/ipc/IPCClient.h | 62 + patch/ipc/dwm-msg.c | 549 +++++ patch/ipc/yajl_dumps.h | 66 + patch/layout_centeredfloatingmaster.c | 55 + patch/layout_centeredfloatingmaster.h | 2 + patch/layout_centeredmaster.c | 85 + patch/layout_centeredmaster.h | 2 + patch/layout_facts.c | 24 + patch/layout_fibonacci.c | 94 + patch/layout_fibonacci.h | 3 + patch/layout_monocle.c | 15 + patch/layout_monocle.h | 2 + patch/layout_nrowgrid.c | 53 + patch/layout_nrowgrid.h | 2 + patch/layout_tile.c | 41 + patch/layout_tile.h | 2 + patch/pertag.c | 36 + patch/pertag.h | 2 + patch/scratchpad_alt_1.c | 72 + patch/scratchpad_alt_1.h | 9 + patch/sticky.c | 9 + patch/sticky.h | 2 + patch/swallow.c | 214 ++ patch/swallow.h | 8 + patch/tagallmon.c | 44 + patch/tagallmon.h | 2 + patch/tagswapmon.c | 65 + patch/tagswapmon.h | 2 + patch/transfer.c | 34 + patch/transfer.h | 2 + patch/vanitygaps.c | 130 ++ patch/vanitygaps.h | 15 + transient.c | 43 + util.c | 36 + util.h | 19 + util.o | Bin 0 -> 9640 bytes 91 files changed, 8404 insertions(+) create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README create mode 100644 config.def.h create mode 100644 config.h create mode 100644 config.h.tmp create mode 100644 config.mk create mode 100644 drw.c create mode 100644 drw.h create mode 100644 drw.o create mode 100755 dwm create mode 100644 dwm.1 create mode 100644 dwm.c create mode 100644 dwm.o create mode 100644 dwm.png create mode 100644 patch/autostart.c create mode 100644 patch/autostart.h create mode 100644 patch/bar_alpha.c create mode 100644 patch/bar_alpha.h create mode 100644 patch/bar_dwmblocks.c create mode 100644 patch/bar_dwmblocks.h create mode 100644 patch/bar_ewmhtags.c create mode 100644 patch/bar_ewmhtags.h create mode 100644 patch/bar_indicators.c create mode 100644 patch/bar_indicators.h create mode 100644 patch/bar_ltsymbol.c create mode 100644 patch/bar_ltsymbol.h create mode 100644 patch/bar_powerline_tags.c create mode 100644 patch/bar_powerline_tags.h create mode 100644 patch/bar_status.c create mode 100644 patch/bar_status.h create mode 100644 patch/bar_statuscmd.c create mode 100644 patch/bar_statuscmd.h create mode 100644 patch/bar_systray.c create mode 100644 patch/bar_systray.h create mode 100644 patch/bar_tabgroups.c create mode 100644 patch/bar_tabgroups.h create mode 100644 patch/bar_tagicons.c create mode 100644 patch/bar_tagicons.h create mode 100644 patch/bar_tags.c create mode 100644 patch/bar_tags.h create mode 100644 patch/bar_wintitle.c create mode 100644 patch/bar_wintitle.h create mode 100644 patch/bar_wintitleactions.c create mode 100644 patch/bar_wintitleactions.h create mode 100644 patch/decorationhints.c create mode 100644 patch/decorationhints.h create mode 100644 patch/fakefullscreenclient.c create mode 100644 patch/fakefullscreenclient.h create mode 100644 patch/focusadjacenttag.c create mode 100644 patch/focusadjacenttag.h create mode 100644 patch/include.c create mode 100644 patch/include.h create mode 100644 patch/inplacerotate.c create mode 100644 patch/inplacerotate.h create mode 100644 patch/ipc/IPCClient.h create mode 100644 patch/ipc/dwm-msg.c create mode 100644 patch/ipc/yajl_dumps.h create mode 100644 patch/layout_centeredfloatingmaster.c create mode 100644 patch/layout_centeredfloatingmaster.h create mode 100644 patch/layout_centeredmaster.c create mode 100644 patch/layout_centeredmaster.h create mode 100644 patch/layout_facts.c create mode 100644 patch/layout_fibonacci.c create mode 100644 patch/layout_fibonacci.h create mode 100644 patch/layout_monocle.c create mode 100644 patch/layout_monocle.h create mode 100644 patch/layout_nrowgrid.c create mode 100644 patch/layout_nrowgrid.h create mode 100644 patch/layout_tile.c create mode 100644 patch/layout_tile.h create mode 100644 patch/pertag.c create mode 100644 patch/pertag.h create mode 100644 patch/scratchpad_alt_1.c create mode 100644 patch/scratchpad_alt_1.h create mode 100644 patch/sticky.c create mode 100644 patch/sticky.h create mode 100644 patch/swallow.c create mode 100644 patch/swallow.h create mode 100644 patch/tagallmon.c create mode 100644 patch/tagallmon.h create mode 100644 patch/tagswapmon.c create mode 100644 patch/tagswapmon.h create mode 100644 patch/transfer.c create mode 100644 patch/transfer.h create mode 100644 patch/vanitygaps.c create mode 100644 patch/vanitygaps.h create mode 100644 transient.c create mode 100644 util.c create mode 100644 util.h create mode 100644 util.o diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d221f09 --- /dev/null +++ b/LICENSE @@ -0,0 +1,37 @@ +MIT/X Consortium License + +© 2006-2019 Anselm R Garbe +© 2006-2009 Jukka Salmi +© 2006-2007 Sander van Dijk +© 2007-2011 Peter Hartlich +© 2007-2009 Szabolcs Nagy +© 2007-2009 Christof Musik +© 2007-2009 Premysl Hruby +© 2007-2008 Enno Gottox Boland +© 2008 Martin Hurton +© 2008 Neale Pickett +© 2009 Mate Nagy +© 2010-2016 Hiltjo Posthuma +© 2010-2012 Connor Lane Smith +© 2011 Christoph Lohmann <20h@r-36.net> +© 2015-2016 Quentin Rameau +© 2015-2016 Eric Pruitt +© 2016-2017 Markus Teich + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5ce1953 --- /dev/null +++ b/Makefile @@ -0,0 +1,69 @@ +# dwm - dynamic window manager +# See LICENSE file for copyright and license details. + +include config.mk + +SRC = drw.c dwm.c util.c +OBJ = ${SRC:.c=.o} + +# FreeBSD users, prefix all ifdef, else and endif statements with a . for this to work (e.g. .ifdef) + +ifdef YAJLLIBS +all: options dwm dwm-msg +else +all: options dwm +endif + +options: + @echo dwm build options: + @echo "CFLAGS = ${CFLAGS}" + @echo "LDFLAGS = ${LDFLAGS}" + @echo "CC = ${CC}" + +.c.o: + ${CC} -c ${CFLAGS} $< + +${OBJ}: config.h config.mk + +config.h: + cp config.def.h $@ + +dwm: ${OBJ} + ${CC} -o $@ ${OBJ} ${LDFLAGS} + +ifdef YAJLLIBS +dwm-msg: + ${CC} -o $@ patch/ipc/dwm-msg.c ${LDFLAGS} +endif + +clean: + rm -f dwm ${OBJ} dwm-${VERSION}.tar.gz + rm -f dwm-msg + +dist: clean + mkdir -p dwm-${VERSION} + cp -R LICENSE Makefile README config.def.h config.mk\ + dwm.1 drw.h util.h ${SRC} dwm.png transient.c dwm-${VERSION} + tar -cf dwm-${VERSION}.tar dwm-${VERSION} + gzip dwm-${VERSION}.tar + rm -rf dwm-${VERSION} + +install: all + mkdir -p ${DESTDIR}${PREFIX}/bin + cp -f dwm ${DESTDIR}${PREFIX}/bin +ifdef YAJLLIBS + cp -f dwm-msg ${DESTDIR}${PREFIX}/bin +endif + chmod 755 ${DESTDIR}${PREFIX}/bin/dwm +ifdef YAJLLIBS + chmod 755 ${DESTDIR}${PREFIX}/bin/dwm-msg +endif + mkdir -p ${DESTDIR}${MANPREFIX}/man1 + sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1 + chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1 + +uninstall: + rm -f ${DESTDIR}${PREFIX}/bin/dwm\ + ${DESTDIR}${MANPREFIX}/man1/dwm.1 + +.PHONY: all options clean dist install uninstall diff --git a/README b/README new file mode 100644 index 0000000..95d4fd0 --- /dev/null +++ b/README @@ -0,0 +1,48 @@ +dwm - dynamic window manager +============================ +dwm is an extremely fast, small, and dynamic window manager for X. + + +Requirements +------------ +In order to build dwm you need the Xlib header files. + + +Installation +------------ +Edit config.mk to match your local setup (dwm is installed into +the /usr/local namespace by default). + +Afterwards enter the following command to build and install dwm (if +necessary as root): + + make clean install + + +Running dwm +----------- +Add the following line to your .xinitrc to start dwm using startx: + + exec dwm + +In order to connect dwm to a specific display, make sure that +the DISPLAY environment variable is set correctly, e.g.: + + DISPLAY=foo.bar:1 exec dwm + +(This will start dwm on display :1 of the host foo.bar.) + +In order to display status info in the bar, you can do something +like this in your .xinitrc: + + while xsetroot -name "`date` `uptime | sed 's/.*,//'`" + do + sleep 1 + done & + exec dwm + + +Configuration +------------- +The configuration of dwm is done by creating a custom config.h +and (re)compiling the source code. diff --git a/config.def.h b/config.def.h new file mode 100644 index 0000000..11c5ebf --- /dev/null +++ b/config.def.h @@ -0,0 +1,345 @@ +/* See LICENSE file for copyright and license details. */ + +/* 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 const int smartgaps_fact = 1; /* gap factor when there is only one client; 0 = no gaps, 3 = 3x outer gaps */ +static const char autostartblocksh[] = "autostart_blocking.sh"; +static const char autostartsh[] = "autostart.sh"; +static const char dwmdir[] = "dwm"; +static const char localshare[] = ".local/share"; +static const int showbar = 1; /* 0 means no bar */ +static const int topbar = 1; /* 0 means bottom bar */ +/* Status is to be shown on: -1 (all monitors), 0 (a specific monitor by index), 'A' (active monitor) */ +static const int statusmon = 'A'; +static const unsigned int systrayspacing = 2; /* systray spacing */ +static const int showsystray = 1; /* 0 means no systray */ +/* Indicators: see patch/bar_indicators.h for options */ +static int tagindicatortype = INDICATOR_TOP_LEFT_SQUARE; +static int tiledindicatortype = INDICATOR_NONE; +static int floatindicatortype = INDICATOR_TOP_LEFT_SQUARE; +static int fakefsindicatortype = INDICATOR_PLUS; +static int floatfakefsindicatortype = INDICATOR_PLUS_AND_LARGER_SQUARE; +static void (*bartabmonfns[])(Monitor *) = { monocle /* , customlayoutfn */ }; +static const char *fonts[] = { "monospace:size=10" }; +static const char dmenufont[] = "monospace:size=10"; + +static char c000000[] = "#000000"; // placeholder value + +static char normfgcolor[] = "#bbbbbb"; +static char normbgcolor[] = "#222222"; +static char normbordercolor[] = "#444444"; +static char normfloatcolor[] = "#db8fd9"; + +static char selfgcolor[] = "#eeeeee"; +static char selbgcolor[] = "#005577"; +static char selbordercolor[] = "#005577"; +static char selfloatcolor[] = "#005577"; + +static char titlenormfgcolor[] = "#bbbbbb"; +static char titlenormbgcolor[] = "#222222"; +static char titlenormbordercolor[] = "#444444"; +static char titlenormfloatcolor[] = "#db8fd9"; + +static char titleselfgcolor[] = "#eeeeee"; +static char titleselbgcolor[] = "#005577"; +static char titleselbordercolor[] = "#005577"; +static char titleselfloatcolor[] = "#005577"; + +static char tagsnormfgcolor[] = "#bbbbbb"; +static char tagsnormbgcolor[] = "#222222"; +static char tagsnormbordercolor[] = "#444444"; +static char tagsnormfloatcolor[] = "#db8fd9"; + +static char tagsselfgcolor[] = "#eeeeee"; +static char tagsselbgcolor[] = "#005577"; +static char tagsselbordercolor[] = "#005577"; +static char tagsselfloatcolor[] = "#005577"; + +static char hidnormfgcolor[] = "#005577"; +static char hidselfgcolor[] = "#227799"; +static char hidnormbgcolor[] = "#222222"; +static char hidselbgcolor[] = "#222222"; + +static char urgfgcolor[] = "#bbbbbb"; +static char urgbgcolor[] = "#222222"; +static char urgbordercolor[] = "#ff0000"; +static char urgfloatcolor[] = "#db8fd9"; + + +static const unsigned int baralpha = 0xd0; +static const unsigned int borderalpha = OPAQUE; +static const unsigned int alphas[][3] = { + /* fg bg border */ + [SchemeNorm] = { OPAQUE, baralpha, borderalpha }, + [SchemeSel] = { OPAQUE, baralpha, borderalpha }, + [SchemeTitleNorm] = { OPAQUE, baralpha, borderalpha }, + [SchemeTitleSel] = { OPAQUE, baralpha, borderalpha }, + [SchemeTagsNorm] = { OPAQUE, baralpha, borderalpha }, + [SchemeTagsSel] = { OPAQUE, baralpha, borderalpha }, + [SchemeHidNorm] = { OPAQUE, baralpha, borderalpha }, + [SchemeHidSel] = { OPAQUE, baralpha, borderalpha }, + [SchemeUrg] = { OPAQUE, baralpha, borderalpha }, +}; + +static char *colors[][ColCount] = { + /* fg bg border float */ + [SchemeNorm] = { normfgcolor, normbgcolor, normbordercolor, normfloatcolor }, + [SchemeSel] = { selfgcolor, selbgcolor, selbordercolor, selfloatcolor }, + [SchemeTitleNorm] = { titlenormfgcolor, titlenormbgcolor, titlenormbordercolor, titlenormfloatcolor }, + [SchemeTitleSel] = { titleselfgcolor, titleselbgcolor, titleselbordercolor, titleselfloatcolor }, + [SchemeTagsNorm] = { tagsnormfgcolor, tagsnormbgcolor, tagsnormbordercolor, tagsnormfloatcolor }, + [SchemeTagsSel] = { tagsselfgcolor, tagsselbgcolor, tagsselbordercolor, tagsselfloatcolor }, + [SchemeHidNorm] = { hidnormfgcolor, hidnormbgcolor, c000000, c000000 }, + [SchemeHidSel] = { hidselfgcolor, hidselbgcolor, c000000, c000000 }, + [SchemeUrg] = { urgfgcolor, urgbgcolor, urgbordercolor, urgfloatcolor }, +}; + + + + + +/* Tags + * In a traditional dwm the number of tags in use can be changed simply by changing the number + * of strings in the tags array. This build does things a bit different which has some added + * benefits. If you need to change the number of tags here then change the NUMTAGS macro in dwm.c. + * + * Examples: + * + * 1) static char *tagicons[][NUMTAGS*2] = { + * [DEFAULT_TAGS] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I" }, + * } + * + * 2) static char *tagicons[][1] = { + * [DEFAULT_TAGS] = { "•" }, + * } + * + * The first example would result in the tags on the first monitor to be 1 through 9, while the + * tags for the second monitor would be named A through I. A third monitor would start again at + * 1 through 9 while the tags on a fourth monitor would also be named A through I. Note the tags + * count of NUMTAGS*2 in the array initialiser which defines how many tag text / icon exists in + * the array. This can be changed to *3 to add separate icons for a third monitor. + * + * For the second example each tag would be represented as a bullet point. Both cases work the + * same from a technical standpoint - the icon index is derived from the tag index and the monitor + * index. If the icon index is is greater than the number of tag icons then it will wrap around + * until it an icon matches. Similarly if there are two tag icons then it would alternate between + * them. This works seamlessly with alternative tags and alttagsdecoration patches. + */ +static char *tagicons[][NUMTAGS] = { + [DEFAULT_TAGS] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }, + [ALTERNATIVE_TAGS] = { "A", "B", "C", "D", "E", "F", "G", "H", "I" }, + [ALT_TAGS_DECORATION] = { "<1>", "<2>", "<3>", "<4>", "<5>", "<6>", "<7>", "<8>", "<9>" }, +}; + + +/* There are two options when it comes to per-client rules: + * - a typical struct table or + * - using the RULE macro + * + * A traditional struct table looks like this: + * // class instance title wintype tags mask isfloating monitor + * { "Gimp", NULL, NULL, NULL, 1 << 4, 0, -1 }, + * { "Firefox", NULL, NULL, NULL, 1 << 7, 0, -1 }, + * + * The RULE macro has the default values set for each field allowing you to only + * specify the values that are relevant for your rule, e.g. + * + * RULE(.class = "Gimp", .tags = 1 << 4) + * RULE(.class = "Firefox", .tags = 1 << 7) + * + * Refer to the Rule struct definition for the list of available fields depending on + * the patches you enable. + */ +static const Rule rules[] = { + /* xprop(1): + * WM_CLASS(STRING) = instance, class + * WM_NAME(STRING) = title + * WM_WINDOW_ROLE(STRING) = role + * _NET_WM_WINDOW_TYPE(ATOM) = wintype + */ + RULE(.wintype = WTYPE "DIALOG", .isfloating = 1) + RULE(.wintype = WTYPE "UTILITY", .isfloating = 1) + RULE(.wintype = WTYPE "TOOLBAR", .isfloating = 1) + RULE(.wintype = WTYPE "SPLASH", .isfloating = 1) + RULE(.class = "Gimp", .tags = 1 << 4) + RULE(.class = "Firefox", .tags = 1 << 7) +}; + + + +/* Bar rules allow you to configure what is shown where on the bar, as well as + * introducing your own bar modules. + * + * monitor: + * -1 show on all monitors + * 0 show on monitor 0 + * 'A' show on active monitor (i.e. focused / selected) (or just -1 for active?) + * bar - bar index, 0 is default, 1 is extrabar + * alignment - how the module is aligned compared to other modules + * widthfunc, drawfunc, clickfunc - providing bar module width, draw and click functions + * name - does nothing, intended for visual clue and for logging / debugging + */ +static const BarRule barrules[] = { + /* monitor bar alignment widthfunc drawfunc clickfunc name */ + { 0, 0, BAR_ALIGN_LEFT, width_pwrl_tags, draw_pwrl_tags, click_pwrl_tags, "powerline_tags" }, + { -1, 0, BAR_ALIGN_LEFT, width_tags, draw_tags, click_tags, "tags" }, + { 0, 0, BAR_ALIGN_RIGHT, width_systray, draw_systray, click_systray, "systray" }, + { -1, 0, BAR_ALIGN_LEFT, width_ltsymbol, draw_ltsymbol, click_ltsymbol, "layout" }, + { statusmon, 0, BAR_ALIGN_RIGHT, width_status, draw_status, click_statuscmd, "status" }, + { -1, 0, BAR_ALIGN_NONE, width_bartabgroups, draw_bartabgroups, click_bartabgroups, "bartabgroups" }, +}; + +/* 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 */ +static const int decorhints = 1; /* 1 means respect decoration hints */ + +#define FORCE_VSPLIT 1 + + +static const Layout layouts[] = { + /* symbol arrange function */ + { "[]=", tile }, /* first entry is default */ + { "><>", NULL }, /* no layout function means floating behavior */ + { "[M]", monocle }, + { "|M|", centeredmaster }, + { ">M>", centeredfloatingmaster }, + { "[\\]", dwindle }, + { "###", nrowgrid }, +}; + + +/* key definitions */ +#define MODKEY Mod1Mask +#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", + "-m", dmenumon, + "-fn", dmenufont, + "-nb", normbgcolor, + "-nf", normfgcolor, + "-sb", selbgcolor, + "-sf", selfgcolor, + NULL +}; +static const char *termcmd[] = { "st", NULL }; + +/* This defines the name of the executable that handles the bar (used for signalling purposes) */ +#define STATUSBAR "dwmblocks" + + +static Key keys[] = { + /* modifier key function argument */ + { MODKEY, XK_p, spawn, {.v = dmenucmd } }, + { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, + { MODKEY, XK_b, togglebar, {0} }, + { MODKEY, XK_j, focusstack, {.i = +1 } }, + { MODKEY, XK_k, focusstack, {.i = -1 } }, + { MODKEY|Mod4Mask, XK_j, inplacerotate, {.i = +2 } }, // same as rotatestack + { MODKEY|Mod4Mask, XK_k, inplacerotate, {.i = -2 } }, // same as reotatestack + { MODKEY|Mod4Mask|ShiftMask, XK_j, inplacerotate, {.i = +1} }, + { MODKEY|Mod4Mask|ShiftMask, XK_k, inplacerotate, {.i = -1} }, + { MODKEY, XK_i, incnmaster, {.i = +1 } }, + { MODKEY, XK_d, incnmaster, {.i = -1 } }, + { MODKEY, XK_h, setmfact, {.f = -0.05} }, + { MODKEY, XK_l, setmfact, {.f = +0.05} }, + { MODKEY, XK_x, transfer, {0} }, + { 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|ControlMask, XK_z, showhideclient, {0} }, + { MODKEY|ShiftMask, XK_c, killclient, {0} }, + { MODKEY|ShiftMask, XK_q, quit, {0} }, + { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, + { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, + { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, + { MODKEY, XK_space, setlayout, {0} }, + { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, + { MODKEY|ShiftMask, XK_y, togglefakefullscreen, {0} }, + { MODKEY|ShiftMask, XK_s, togglesticky, {0} }, + { MODKEY, XK_minus, scratchpad_show, {0} }, + { MODKEY|ShiftMask, XK_minus, scratchpad_hide, {0} }, + { MODKEY, XK_equal, scratchpad_remove, {0} }, + { MODKEY, XK_comma, focusmon, {.i = -1 } }, + { MODKEY, XK_period, focusmon, {.i = +1 } }, + { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, + { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, + { MODKEY, XK_Left, viewtoleft, {0} }, // note keybinding conflict with focusdir + { MODKEY, XK_Right, viewtoright, {0} }, // note keybinding conflict with focusdir + { MODKEY|ShiftMask, XK_Left, tagtoleft, {0} }, + { MODKEY|ShiftMask, XK_Right, tagtoright, {0} }, + { MODKEY|ControlMask, XK_Left, tagandviewtoleft, {0} }, + { MODKEY|ControlMask, XK_Right, tagandviewtoright, {0} }, + { MODKEY|Mod4Mask|ShiftMask, XK_comma, tagallmon, {.i = +1 } }, + { MODKEY|Mod4Mask|ShiftMask, XK_period, tagallmon, {.i = -1 } }, + { MODKEY|Mod4Mask|ControlMask, XK_comma, tagswapmon, {.i = +1 } }, + { MODKEY|Mod4Mask|ControlMask, XK_period, tagswapmon, {.i = -1 } }, + 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) +}; + + +/* 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, Button1, togglewin, {0} }, + { ClkWinTitle, 0, Button3, showhideclient, {0} }, + { ClkWinTitle, 0, Button2, zoom, {0} }, + { ClkStatusText, 0, Button1, sigstatusbar, {.i = 1 } }, + { ClkStatusText, 0, Button2, sigstatusbar, {.i = 2 } }, + { ClkStatusText, 0, Button3, sigstatusbar, {.i = 3 } }, + { 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} }, +}; + + + diff --git a/config.h b/config.h new file mode 100644 index 0000000..92c0a4e --- /dev/null +++ b/config.h @@ -0,0 +1,416 @@ +/* See LICENSE file for copyright and license details. */ + +/* appearance */ +static const unsigned int borderpx = 2; /* border pixel of windows */ +static const unsigned int snap = 16; /* snap pixel */ +static const int swallowfloating = 0; /* 1 means swallow floating windows by default */ +static const unsigned int gappih = 10; /* 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 = 10; /* vert outer gap between windows and screen edge */ +static const int smartgaps_fact = 0; /* 1 means no outer gap when there is only one window */ +static const char autostartblocksh[] = "autostart_blocking.sh"; +static const char autostartsh[] = "autostart.sh"; +static const char dwmdir[] = "dwm"; +static const char localshare[] = ".local/share"; +static const int showbar = 1; /* 0 means no bar */ +static const int topbar = 1; /* 0 means bottom bar */ +/* Status is to be shown on: -1 (all monitors), 0 (a specific monitor by index), 'A' (active monitor) */ +static const int statusmon = 'A'; +static const unsigned int systrayspacing = 2; /* systray spacing */ +static const int showsystray = 1; /* 0 means no systray */ +/* Indicators: see patch/bar_indicators.h for options */ +static int tagindicatortype = INDICATOR_TOP_LEFT_SQUARE; +static int tiledindicatortype = INDICATOR_NONE; +static int floatindicatortype = INDICATOR_TOP_LEFT_SQUARE; +static int fakefsindicatortype = INDICATOR_PLUS; +static int floatfakefsindicatortype = INDICATOR_PLUS_AND_LARGER_SQUARE; +static void (*bartabmonfns[])(Monitor *) = { monocle /* , customlayoutfn */ }; +static const char *fonts[] = { + "FontAwesome:size=12", + "mononoki:size=12", +}; +static const char dmenufont[] = "mononoki:size=12"; + +static char normfgcolor[] = "#bbbbbb"; +static char normbgcolor[] = "#222222"; +static char normbordercolor[] = "#444444"; +static char normfloatcolor[] = "#db8fd9"; + +static char selfgcolor[] = "#111111"; +static char selbgcolor[] = "#ffd700"; +static char selbordercolor[] = "#ffd700"; +static char selfloatcolor[] = "#ffd700"; + +static char titlenormfgcolor[] = "#bbbbbb"; +static char titlenormbgcolor[] = "#222222"; +static char titlenormbordercolor[] = "#444444"; +static char titlenormfloatcolor[] = "#db8fd9"; + +static char titleselfgcolor[] = "#111111"; +static char titleselbgcolor[] = "#ffd700"; +static char titleselbordercolor[] = "#ffd700"; +static char titleselfloatcolor[] = "#ffd700"; + +static char tagsnormfgcolor[] = "#bbbbbb"; +static char tagsnormbgcolor[] = "#222222"; +static char tagsnormbordercolor[] = "#444444"; +static char tagsnormfloatcolor[] = "#db8fd9"; + +static char tagsselfgcolor[] = "#111111"; +static char tagsselbgcolor[] = "#ffd700"; +static char tagsselbordercolor[] = "#ffd700"; +static char tagsselfloatcolor[] = "#ffd700"; + +static char hidnormfgcolor[] = "#ffd700"; +static char hidnormbgcolor[] = "#222222"; +static char hidselfgcolor[] = "#ffd700"; +static char hidselbgcolor[] = "#ffd700"; +static char hidbordercolor[] = "#ffd700"; +static char hidfloatcolor[] = "#f76e0c"; + +static char urgfgcolor[] = "#bbbbbb"; +static char urgbgcolor[] = "#222222"; +static char urgbordercolor[] = "#ff0000"; +static char urgfloatcolor[] = "#db8fd9"; + + +static const unsigned int baralpha = 0xd0; +static const unsigned int borderalpha = OPAQUE; +static const unsigned int alphas[][3] = { + /* fg bg border */ + [SchemeNorm] = { OPAQUE, baralpha, borderalpha }, + [SchemeSel] = { OPAQUE, baralpha, borderalpha }, + [SchemeTitleNorm] = { OPAQUE, baralpha, borderalpha }, + [SchemeTitleSel] = { OPAQUE, baralpha, borderalpha }, + [SchemeTagsNorm] = { OPAQUE, baralpha, borderalpha }, + [SchemeTagsSel] = { OPAQUE, baralpha, borderalpha }, + [SchemeHidNorm] = { OPAQUE, baralpha, borderalpha }, + [SchemeHidSel] = { OPAQUE, baralpha, borderalpha }, + [SchemeUrg] = { OPAQUE, baralpha, borderalpha }, +}; + +static char *colors[][ColCount] = { + /* fg bg border float */ + [SchemeNorm] = { normfgcolor, normbgcolor, normbordercolor, normfloatcolor }, + [SchemeSel] = { selfgcolor, selbgcolor, selbordercolor, selfloatcolor }, + [SchemeTitleNorm] = { titlenormfgcolor, titlenormbgcolor, titlenormbordercolor, titlenormfloatcolor }, + [SchemeTitleSel] = { titleselfgcolor, titleselbgcolor, titleselbordercolor, titleselfloatcolor }, + [SchemeTagsNorm] = { tagsnormfgcolor, tagsnormbgcolor, tagsnormbordercolor, tagsnormfloatcolor }, + [SchemeTagsSel] = { tagsselfgcolor, tagsselbgcolor, tagsselbordercolor, tagsselfloatcolor }, + [SchemeHidNorm] = { hidnormfgcolor, hidnormbgcolor, hidbordercolor, hidfloatcolor }, + [SchemeHidSel] = { hidselfgcolor, hidselbgcolor, hidbordercolor, hidfloatcolor }, + [SchemeUrg] = { urgfgcolor, urgbgcolor, urgbordercolor, urgfloatcolor }, +}; + +/* +static char *statuscolors[][ColCount] = { +// fg bg border float + [SchemeNorm] = { normfgcolor, normbgcolor, normbordercolor, normfloatcolor }, + [SchemeSel] = { selfgcolor, selbgcolor, selbordercolor, selfloatcolor }, + [SchemeTitleNorm] = { titlenormfgcolor, titlenormbgcolor, titlenormbordercolor, titlenormfloatcolor }, + [SchemeTitleSel] = { titleselfgcolor, titleselbgcolor, titleselbordercolor, titleselfloatcolor }, + [SchemeTagsNorm] = { tagsnormfgcolor, tagsnormbgcolor, tagsnormbordercolor, tagsnormfloatcolor }, + [SchemeTagsSel] = { tagsselfgcolor, tagsselbgcolor, tagsselbordercolor, tagsselfloatcolor }, + [SchemeHidNorm] = { hidnormfgcolor, hidnormbgcolor, hidbordercolor, hidfloatcolor }, + [SchemeHidSel] = { hidselfgcolor, hidselbgcolor, hidbordercolor, hidfloatcolor }, + [SchemeUrg] = { urgfgcolor, urgbgcolor, urgbordercolor, urgfloatcolor }, +}; +*/ + + + +/* Tags + * In a traditional dwm the number of tags in use can be changed simply by changing the number + * of strings in the tags array. This build does things a bit different which has some added + * benefits. If you need to change the number of tags here then change the NUMTAGS macro in dwm.c. + * + * Examples: + * + * 1) static char *tagicons[][NUMTAGS*2] = { + * [DEFAULT_TAGS] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I" }, + * } + * + * 2) static char *tagicons[][1] = { + * [DEFAULT_TAGS] = { "•" }, + * } + * + * The first example would result in the tags on the first monitor to be 1 through 9, while the + * tags for the second monitor would be named A through I. A third monitor would start again at + * 1 through 9 while the tags on a fourth monitor would also be named A through I. Note the tags + * count of NUMTAGS*2 in the array initialiser which defines how many tag text / icon exists in + * the array. This can be changed to *3 to add separate icons for a third monitor. + * + * For the second example each tag would be represented as a bullet point. Both cases work the + * same from a technical standpoint - the icon index is derived from the tag index and the monitor + * index. If the icon index is is greater than the number of tag icons then it will wrap around + * until it an icon matches. Similarly if there are two tag icons then it would alternate between + * them. This works seamlessly with alternative tags and alttagsdecoration patches. + */ +static char *tagicons[][NUMTAGS] = { +// [DEFAULT_TAGS] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }, + [DEFAULT_TAGS] = { "₁", "₂", "₃", "₄", "₅", "₆", "₇", "₈", "₉" }, + [ALTERNATIVE_TAGS] = { "A", "B", "C", "D", "E", "F", "G", "H", "I" }, + [ALT_TAGS_DECORATION] = { "<1>", "<2>", "<3>", "<4>", "<5>", "<6>", "<7>", "<8>", "<9>" }, +}; + + + + +/* There are two options when it comes to per-client rules: + * - a typical struct table or + * - using the RULE macro + * + * A traditional struct table looks like this: + * // class instance title wintype tags mask isfloating monitor + * { "Gimp", NULL, NULL, NULL, 1 << 4, 0, -1 }, + * { "Firefox", NULL, NULL, NULL, 1 << 7, 0, -1 }, + * + * The RULE macro has the default values set for each field allowing you to only + * specify the values that are relevant for your rule, e.g. + * + * RULE(.class = "Gimp", .tags = 1 << 4) + * RULE(.class = "Firefox", .tags = 1 << 7) + * + * Refer to the Rule struct definition for the list of available fields depending on + * the patches you enable. + */ +static const Rule rules[] = { + /* xprop(1): + * WM_CLASS(STRING) = instance, class + * WM_NAME(STRING) = title + * WM_WINDOW_ROLE(STRING) = role + * _NET_WM_WINDOW_TYPE(ATOM) = wintype + */ + RULE(.wintype = WTYPE "DIALOG", .isfloating = 1) + RULE(.wintype = WTYPE "UTILITY", .isfloating = 1) + RULE(.wintype = WTYPE "TOOLBAR", .isfloating = 1) + RULE(.wintype = WTYPE "SPLASH", .isfloating = 1) + RULE(.instance= "main", .class = "Psi+", .tags = 1 << 3) + RULE(.instance= "tabs", .class = "Psi+", .tags = 1 << 3) + RULE(.class = "Claws-mail", .tags = 1 << 3) + RULE(.class = "Zoiper", .tags = 1 << 3) + RULE(.class = "linphone", .tags = 1 << 3) + RULE(.class = "Skype", .tags = 1 << 3) + RULE(.class = "Mattermost", .tags = 1 << 3) + + RULE(.class = "pinentry-qt", .isfloating = 1) + RULE(.class = "pinentry-qt5", .isfloating = 1) + RULE(.class = "Nm-connection-editor", .isfloating = 1) + RULE(.class = "pavucontrol-qt", .isfloating = 0) + RULE(.class = "Firefox", .wintype = WTYPE "NORMAL", .tags = 1 << 2) + + RULE(.class = "Spotify", .tags = 1 << 8) + RULE(.class = "Kasts", .tags = 1 << 8) + + RULE(.class = "st-tilda", .isfloating = 1) + RULE(.class = "st-256color", .isterminal = 1) +}; + + + +/* Bar rules allow you to configure what is shown where on the bar, as well as + * introducing your own bar modules. + * + * monitor: + * -1 show on all monitors + * 0 show on monitor 0 + * 'A' show on active monitor (i.e. focused / selected) (or just -1 for active?) + * bar - bar index, 0 is default, 1 is extrabar + * alignment - how the module is aligned compared to other modules + * widthfunc, drawfunc, clickfunc - providing bar module width, draw and click functions + * name - does nothing, intended for visual clue and for logging / debugging + */ +static const BarRule barrules[] = { + /* monitor bar alignment widthfunc drawfunc clickfunc name */ + { -1, 0, BAR_ALIGN_LEFT, width_pwrl_tags, draw_pwrl_tags, click_pwrl_tags, "powerline_tags" }, + //{ -1, 0, BAR_ALIGN_LEFT, width_tags, draw_tags, click_tags, "tags" }, + { 'A', 0, BAR_ALIGN_RIGHT, width_systray, draw_systray, click_systray, "systray" }, + { -1, 0, BAR_ALIGN_LEFT, width_ltsymbol, draw_ltsymbol, click_ltsymbol, "layout" }, +// { 'A', 0, BAR_ALIGN_RIGHT, width_pwrl_status, draw_pwrl_status, click_pwrl_status, "powerline_status" }, + { statusmon, 0, BAR_ALIGN_RIGHT, width_status, draw_status, click_statuscmd, "status" }, + { -1, 0, BAR_ALIGN_NONE, width_bartabgroups, draw_bartabgroups, click_bartabgroups, "bartabgroups" }, +}; + +/* 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 */ +static const int decorhints = 1; /* 1 means respect decoration hints */ + +#define FORCE_VSPLIT 1 + + +static const Layout layouts[] = { + /* symbol arrange function */ + { "[]=", tile }, /* first entry is default */ + { "><>", NULL }, /* no layout function means floating behavior */ + { "[M]", monocle }, + { "|M|", centeredmaster }, + { ">M>", centeredfloatingmaster }, + { "[\\]", dwindle }, + { "###", nrowgrid }, +}; + + +/* key definitions */ +#define MODKEY Mod4Mask +#define AltMask Mod1Mask +#define ALTKEY Mod1Mask +#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", + "-m", dmenumon, + "-fn", dmenufont, + "-nb", normbgcolor, + "-nf", normfgcolor, + "-sb", selbgcolor, + "-sf", selfgcolor, + NULL +}; +static const char *termcmd[] = { "st", NULL }; +static const char *tmuxcmd[] = { "st", "-c", "st-tmux", "-e", "/home/wiebel/sync/bin/tmux-spawn.sh", NULL }; +// static const char scratchpadname[] = "tilda"; +/* static const char *scratchpadcmd[] = { "st", "-t", scratchpadname, "-g", "120x34", NULL }; */ +// static const char *scratchpadcmd[] = { "st", "-t", scratchpadname, "-c", "st-tilda", "-g", "180x18", "-e", "tmux", "new-session", "-A", "-s", "tilda", NULL }; + +static const char *volup[] = { "/opt/pavolume/pavolume", "volup", "10", NULL }; +static const char *voldn[] = { "/opt/pavolume/pavolume", "voldown", "10", NULL }; +static const char *volmute[] = { "/opt/pavolume/pavolume", "mutetoggle", NULL }; +static const char *playpause[] = { "/usr/bin/playerctl", "play-pause", NULL }; +#include + +/* This defines the name of the executable that handles the bar (used for signalling purposes) */ +#define STATUSBAR "dwmblocks" + + +static Key keys[] = { + /* modifier key function argument */ + { MODKEY, XK_p, spawn, {.v = dmenucmd } }, + { MODKEY|ShiftMask, XK_Return, spawn, {.v = tmuxcmd } }, + { MODKEY|ControlMask, XK_Return, spawn, {.v = termcmd } }, + { MODKEY, XK_b, togglebar, {0} }, + { MODKEY|ControlMask, XK_s, spawn, SHCMD("transset -a --dec .1") }, + { MODKEY|ControlMask, XK_d, spawn, SHCMD("transset -a --inc .1") }, + { ALTKEY, XK_w, spawn, SHCMD("pass-wrapper.sh") }, + { MODKEY, XK_n, spawn, SHCMD("networkmanager_dmenu") }, +// { MODKEY, XK_grave, spawn, SHCMD("/home/wiebel/sync/bin/st-tilda.sh") }, + { ALTKEY|ControlMask, XK_l, spawn, SHCMD("/usr/local/bin/lock.me") }, + /* Media Keys */ + { 0, XF86XK_MonBrightnessUp, spawn, SHCMD("xbacklight -inc 5") }, + { 0, XF86XK_MonBrightnessDown, spawn, SHCMD("xbacklight -dec 5") }, + { 0, XF86XK_AudioRaiseVolume, spawn, {.v = volup } }, + { 0, XF86XK_AudioLowerVolume, spawn, {.v = voldn } }, + { 0, XF86XK_AudioMute, spawn, {.v = volmute } }, + { 0, XF86XK_AudioPlay, spawn, {.v = playpause } }, + { MODKEY, XK_j, focusstack, {.i = +1 } }, + { MODKEY, XK_k, focusstack, {.i = -1 } }, + { MODKEY|ShiftMask, XK_j, inplacerotate, {.i = +1} }, + { MODKEY|ShiftMask, XK_k, inplacerotate, {.i = -1} }, + { MODKEY, XK_i, incnmaster, {.i = +1 } }, + { MODKEY, XK_d, incnmaster, {.i = -1 } }, + { MODKEY, XK_h, setmfact, {.f = -0.05} }, + { MODKEY, XK_l, setmfact, {.f = +0.05} }, + { MODKEY, XK_x, transfer, {0} }, + { MODKEY, XK_Return, zoom, {0} }, +// { MODKEY|AltMask, XK_u, incrgaps, {.i = +1 } }, +// { MODKEY|AltMask|ShiftMask, XK_u, incrgaps, {.i = -1 } }, +// { MODKEY|AltMask, XK_i, incrigaps, {.i = +1 } }, +// { MODKEY|AltMask|ShiftMask, XK_i, incrigaps, {.i = -1 } }, +// { MODKEY|AltMask, XK_o, incrogaps, {.i = +1 } }, +// { MODKEY|AltMask|ShiftMask, XK_o, incrogaps, {.i = -1 } }, +// { MODKEY|AltMask, XK_6, incrihgaps, {.i = +1 } }, +// { MODKEY|AltMask|ShiftMask, XK_6, incrihgaps, {.i = -1 } }, +// { MODKEY|AltMask, XK_7, incrivgaps, {.i = +1 } }, +// { MODKEY|AltMask|ShiftMask, XK_7, incrivgaps, {.i = -1 } }, +// { MODKEY|AltMask, XK_8, incrohgaps, {.i = +1 } }, +// { MODKEY|AltMask|ShiftMask, XK_8, incrohgaps, {.i = -1 } }, +// { MODKEY|AltMask, XK_9, incrovgaps, {.i = +1 } }, +// { MODKEY|AltMask|ShiftMask, XK_9, incrovgaps, {.i = -1 } }, +// { MODKEY|AltMask, XK_0, togglegaps, {0} }, +// { MODKEY|AltMask|ShiftMask, XK_0, defaultgaps, {0} }, + { MODKEY, XK_Tab, view, {0} }, + { MODKEY|ControlMask, XK_z, showhideclient, {0} }, + { MODKEY, XK_q, killclient, {0} }, + { MODKEY|ShiftMask, XK_c, killclient, {0} }, + { MODKEY|ShiftMask, XK_q, quit, {0} }, + { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, + { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, + { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, + { MODKEY, XK_u, setlayout, {.v = &layouts[3]} }, + { MODKEY, XK_o, setlayout, {.v = &layouts[4]} }, + { MODKEY|ShiftMask, XK_t, setlayout, {.v = &layouts[5]} }, + { MODKEY, XK_g, setlayout, {.v = &layouts[6]} }, + { MODKEY, XK_space, setlayout, {0} }, + { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, + { MODKEY|ShiftMask, XK_y, togglefakefullscreen, {0} }, + { MODKEY|ShiftMask, XK_s, togglesticky, {0} }, + { MODKEY, XK_grave, scratchpad_show, {0} }, + { MODKEY, XK_Escape, scratchpad_show, {0} }, + { MODKEY|ShiftMask, XK_grave, scratchpad_hide, {0} }, + { MODKEY|ShiftMask, XK_Escape, scratchpad_hide, {0} }, + { MODKEY|ShiftMask|ControlMask, XK_grave, scratchpad_remove, {0} }, + { MODKEY|ShiftMask|ControlMask, XK_Escape, scratchpad_remove, {0} }, + { MODKEY, XK_comma, focusmon, {.i = -1 } }, + { MODKEY, XK_period, focusmon, {.i = +1 } }, + { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, + { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, + { MODKEY, XK_Left, viewtoleft, {0} }, + { MODKEY, XK_Right, viewtoright, {0} }, + { MODKEY|ShiftMask, XK_Left, tagtoleft, {0} }, + { MODKEY|ShiftMask, XK_Right, tagtoright, {0} }, + { MODKEY|ControlMask, XK_Left, tagandviewtoleft, {0} }, + { MODKEY|ControlMask, XK_Right, tagandviewtoright, {0} }, + { MODKEY|ControlMask, XK_comma, tagallmon, {.i = +1 } }, + { MODKEY|ControlMask, XK_period, tagallmon, {.i = -1 } }, + { MODKEY|ShiftMask|ControlMask, XK_comma, tagswapmon, {.i = +1 } }, + { MODKEY|ShiftMask|ControlMask, XK_period, tagswapmon, {.i = -1 } }, + + { MODKEY, XK_0, view, {.ui = ~0 } }, + { MODKEY|ShiftMask, 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) +}; + + +/* 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, Button1, togglewin, {0} }, + { ClkWinTitle, 0, Button3, showhideclient, {0} }, + { ClkWinTitle, 0, Button2, zoom, {0} }, + { ClkStatusText, 0, Button1, sigstatusbar, {.i = 1 } }, + { ClkStatusText, 0, Button2, sigstatusbar, {.i = 2 } }, + { ClkStatusText, 0, Button3, sigstatusbar, {.i = 3 } }, + { 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} }, +}; + + diff --git a/config.h.tmp b/config.h.tmp new file mode 100644 index 0000000..e2b1ea2 --- /dev/null +++ b/config.h.tmp @@ -0,0 +1,416 @@ +/* See LICENSE file for copyright and license details. */ + +/* appearance */ +static const unsigned int borderpx = 2; /* border pixel of windows */ +static const unsigned int snap = 16; /* snap pixel */ +static const int swallowfloating = 0; /* 1 means swallow floating windows by default */ +static const unsigned int gappih = 10; /* 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 = 10; /* vert outer gap between windows and screen edge */ +static const int smartgaps_fact = 0; /* 1 means no outer gap when there is only one window */ +static const char autostartblocksh[] = "autostart_blocking.sh"; +static const char autostartsh[] = "autostart.sh"; +static const char dwmdir[] = "dwm"; +static const char localshare[] = ".local/share"; +static const int showbar = 1; /* 0 means no bar */ +static const int topbar = 1; /* 0 means bottom bar */ +/* Status is to be shown on: -1 (all monitors), 0 (a specific monitor by index), 'A' (active monitor) */ +static const int statusmon = 'A'; +static const unsigned int systrayspacing = 2; /* systray spacing */ +static const int showsystray = 1; /* 0 means no systray */ +/* Indicators: see patch/bar_indicators.h for options */ +static int tagindicatortype = INDICATOR_TOP_LEFT_SQUARE; +static int tiledindicatortype = INDICATOR_NONE; +static int floatindicatortype = INDICATOR_TOP_LEFT_SQUARE; +static int fakefsindicatortype = INDICATOR_PLUS; +static int floatfakefsindicatortype = INDICATOR_PLUS_AND_LARGER_SQUARE; +static void (*bartabmonfns[])(Monitor *) = { monocle /* , customlayoutfn */ }; +static const char *fonts[] = { + "FontAwesome:size=12", + "mononoki:size=12", +}; +static const char dmenufont[] = "mononoki:size=12"; + +static char normfgcolor[] = "#bbbbbb"; +static char normbgcolor[] = "#222222"; +static char normbordercolor[] = "#444444"; +static char normfloatcolor[] = "#db8fd9"; + +static char selfgcolor[] = "#111111"; +static char selbgcolor[] = "#ffd700"; +static char selbordercolor[] = "#ffd700"; +static char selfloatcolor[] = "#ffd700"; + +static char titlenormfgcolor[] = "#bbbbbb"; +static char titlenormbgcolor[] = "#222222"; +static char titlenormbordercolor[] = "#444444"; +static char titlenormfloatcolor[] = "#db8fd9"; + +static char titleselfgcolor[] = "#111111"; +static char titleselbgcolor[] = "#ffd700"; +static char titleselbordercolor[] = "#ffd700"; +static char titleselfloatcolor[] = "#ffd700"; + +static char tagsnormfgcolor[] = "#bbbbbb"; +static char tagsnormbgcolor[] = "#222222"; +static char tagsnormbordercolor[] = "#444444"; +static char tagsnormfloatcolor[] = "#db8fd9"; + +static char tagsselfgcolor[] = "#111111"; +static char tagsselbgcolor[] = "#ffd700"; +static char tagsselbordercolor[] = "#ffd700"; +static char tagsselfloatcolor[] = "#ffd700"; + +static char hidnormfgcolor[] = "#ffd700"; +static char hidnormbgcolor[] = "#222222"; +static char hidselfgcolor[] = "#ffd700"; +static char hidselbgcolor[] = "#ffd700"; +static char hidbordercolor[] = "#ffd700"; +static char hidfloatcolor[] = "#f76e0c"; + +static char urgfgcolor[] = "#bbbbbb"; +static char urgbgcolor[] = "#222222"; +static char urgbordercolor[] = "#ff0000"; +static char urgfloatcolor[] = "#db8fd9"; + + +static const unsigned int baralpha = 0xd0; +static const unsigned int borderalpha = OPAQUE; +static const unsigned int alphas[][3] = { + /* fg bg border */ + [SchemeNorm] = { OPAQUE, baralpha, borderalpha }, + [SchemeSel] = { OPAQUE, baralpha, borderalpha }, + [SchemeTitleNorm] = { OPAQUE, baralpha, borderalpha }, + [SchemeTitleSel] = { OPAQUE, baralpha, borderalpha }, + [SchemeTagsNorm] = { OPAQUE, baralpha, borderalpha }, + [SchemeTagsSel] = { OPAQUE, baralpha, borderalpha }, + [SchemeHidNorm] = { OPAQUE, baralpha, borderalpha }, + [SchemeHidSel] = { OPAQUE, baralpha, borderalpha }, + [SchemeUrg] = { OPAQUE, baralpha, borderalpha }, +}; + +static char *colors[][ColCount] = { + /* fg bg border float */ + [SchemeNorm] = { normfgcolor, normbgcolor, normbordercolor, normfloatcolor }, + [SchemeSel] = { selfgcolor, selbgcolor, selbordercolor, selfloatcolor }, + [SchemeTitleNorm] = { titlenormfgcolor, titlenormbgcolor, titlenormbordercolor, titlenormfloatcolor }, + [SchemeTitleSel] = { titleselfgcolor, titleselbgcolor, titleselbordercolor, titleselfloatcolor }, + [SchemeTagsNorm] = { tagsnormfgcolor, tagsnormbgcolor, tagsnormbordercolor, tagsnormfloatcolor }, + [SchemeTagsSel] = { tagsselfgcolor, tagsselbgcolor, tagsselbordercolor, tagsselfloatcolor }, + [SchemeHidNorm] = { hidnormfgcolor, hidnormbgcolor, hidbordercolor, hidfloatcolor }, + [SchemeHidSel] = { hidselfgcolor, hidselbgcolor, hidbordercolor, hidfloatcolor }, + [SchemeUrg] = { urgfgcolor, urgbgcolor, urgbordercolor, urgfloatcolor }, +}; + +/* +static char *statuscolors[][ColCount] = { +// fg bg border float + [SchemeNorm] = { normfgcolor, normbgcolor, normbordercolor, normfloatcolor }, + [SchemeSel] = { selfgcolor, selbgcolor, selbordercolor, selfloatcolor }, + [SchemeTitleNorm] = { titlenormfgcolor, titlenormbgcolor, titlenormbordercolor, titlenormfloatcolor }, + [SchemeTitleSel] = { titleselfgcolor, titleselbgcolor, titleselbordercolor, titleselfloatcolor }, + [SchemeTagsNorm] = { tagsnormfgcolor, tagsnormbgcolor, tagsnormbordercolor, tagsnormfloatcolor }, + [SchemeTagsSel] = { tagsselfgcolor, tagsselbgcolor, tagsselbordercolor, tagsselfloatcolor }, + [SchemeHidNorm] = { hidnormfgcolor, hidnormbgcolor, hidbordercolor, hidfloatcolor }, + [SchemeHidSel] = { hidselfgcolor, hidselbgcolor, hidbordercolor, hidfloatcolor }, + [SchemeUrg] = { urgfgcolor, urgbgcolor, urgbordercolor, urgfloatcolor }, +}; +*/ + + + +/* Tags + * In a traditional dwm the number of tags in use can be changed simply by changing the number + * of strings in the tags array. This build does things a bit different which has some added + * benefits. If you need to change the number of tags here then change the NUMTAGS macro in dwm.c. + * + * Examples: + * + * 1) static char *tagicons[][NUMTAGS*2] = { + * [DEFAULT_TAGS] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I" }, + * } + * + * 2) static char *tagicons[][1] = { + * [DEFAULT_TAGS] = { "•" }, + * } + * + * The first example would result in the tags on the first monitor to be 1 through 9, while the + * tags for the second monitor would be named A through I. A third monitor would start again at + * 1 through 9 while the tags on a fourth monitor would also be named A through I. Note the tags + * count of NUMTAGS*2 in the array initialiser which defines how many tag text / icon exists in + * the array. This can be changed to *3 to add separate icons for a third monitor. + * + * For the second example each tag would be represented as a bullet point. Both cases work the + * same from a technical standpoint - the icon index is derived from the tag index and the monitor + * index. If the icon index is is greater than the number of tag icons then it will wrap around + * until it an icon matches. Similarly if there are two tag icons then it would alternate between + * them. This works seamlessly with alternative tags and alttagsdecoration patches. + */ +static char *tagicons[][NUMTAGS] = { +// [DEFAULT_TAGS] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }, + [DEFAULT_TAGS] = { "₁", "₂", "₃", "₄", "₅", "₆", "₇", "₈", "₉" }, + [ALTERNATIVE_TAGS] = { "A", "B", "C", "D", "E", "F", "G", "H", "I" }, + [ALT_TAGS_DECORATION] = { "<1>", "<2>", "<3>", "<4>", "<5>", "<6>", "<7>", "<8>", "<9>" }, +}; + + + + +/* There are two options when it comes to per-client rules: + * - a typical struct table or + * - using the RULE macro + * + * A traditional struct table looks like this: + * // class instance title wintype tags mask isfloating monitor + * { "Gimp", NULL, NULL, NULL, 1 << 4, 0, -1 }, + * { "Firefox", NULL, NULL, NULL, 1 << 7, 0, -1 }, + * + * The RULE macro has the default values set for each field allowing you to only + * specify the values that are relevant for your rule, e.g. + * + * RULE(.class = "Gimp", .tags = 1 << 4) + * RULE(.class = "Firefox", .tags = 1 << 7) + * + * Refer to the Rule struct definition for the list of available fields depending on + * the patches you enable. + */ +static const Rule rules[] = { + /* xprop(1): + * WM_CLASS(STRING) = instance, class + * WM_NAME(STRING) = title + * WM_WINDOW_ROLE(STRING) = role + * _NET_WM_WINDOW_TYPE(ATOM) = wintype + */ + RULE(.wintype = WTYPE "DIALOG", .isfloating = 1) + RULE(.wintype = WTYPE "UTILITY", .isfloating = 1) + RULE(.wintype = WTYPE "TOOLBAR", .isfloating = 1) + RULE(.wintype = WTYPE "SPLASH", .isfloating = 1) + RULE(.instance= "main", .class = "Psi+", .tags = 1 << 2) + RULE(.instance= "tabs", .class = "Psi+", .tags = 1 << 2) + RULE(.class = "Claws-mail", .tags = 1 << 2) + RULE(.class = "Zoiper", .tags = 1 << 2) + RULE(.class = "linphone", .tags = 1 << 2) + RULE(.class = "Skype", .tags = 1 << 2) + RULE(.class = "Mattermost", .tags = 1 << 2) + + RULE(.class = "pinentry-qt", .isfloating = 1) + RULE(.class = "pinentry-qt5", .isfloating = 1) + RULE(.class = "Nm-connection-editor", .isfloating = 1) + RULE(.class = "pavucontrol-qt", .isfloating = 0) + RULE(.class = "Gimp", .tags = 1 << 4) + RULE(.class = "Firefox", .wintype = WTYPE "NORMAL", .tags = 1 << 1) + + RULE(.class = "Spotify", .tags = 1 << 7) + + RULE(.class = "st-tilda", .isfloating = 1) + RULE(.class = "st-256color", .isterminal = 1) +}; + + + +/* Bar rules allow you to configure what is shown where on the bar, as well as + * introducing your own bar modules. + * + * monitor: + * -1 show on all monitors + * 0 show on monitor 0 + * 'A' show on active monitor (i.e. focused / selected) (or just -1 for active?) + * bar - bar index, 0 is default, 1 is extrabar + * alignment - how the module is aligned compared to other modules + * widthfunc, drawfunc, clickfunc - providing bar module width, draw and click functions + * name - does nothing, intended for visual clue and for logging / debugging + */ +static const BarRule barrules[] = { + /* monitor bar alignment widthfunc drawfunc clickfunc name */ + { -1, 0, BAR_ALIGN_LEFT, width_pwrl_tags, draw_pwrl_tags, click_pwrl_tags, "powerline_tags" }, + //{ -1, 0, BAR_ALIGN_LEFT, width_tags, draw_tags, click_tags, "tags" }, + { 'A', 0, BAR_ALIGN_RIGHT, width_systray, draw_systray, click_systray, "systray" }, + { -1, 0, BAR_ALIGN_LEFT, width_ltsymbol, draw_ltsymbol, click_ltsymbol, "layout" }, +// { 'A', 0, BAR_ALIGN_RIGHT, width_pwrl_status, draw_pwrl_status, click_pwrl_status, "powerline_status" }, + { statusmon, 0, BAR_ALIGN_RIGHT, width_status, draw_status, click_statuscmd, "status" }, + { -1, 0, BAR_ALIGN_NONE, width_bartabgroups, draw_bartabgroups, click_bartabgroups, "bartabgroups" }, +}; + +/* 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 */ +static const int decorhints = 1; /* 1 means respect decoration hints */ + +#define FORCE_VSPLIT 1 + + +static const Layout layouts[] = { + /* symbol arrange function */ + { "[]=", tile }, /* first entry is default */ + { "><>", NULL }, /* no layout function means floating behavior */ + { "[M]", monocle }, + { "|M|", centeredmaster }, + { ">M>", centeredfloatingmaster }, + { "[\\]", dwindle }, + { "###", nrowgrid }, +}; + + +/* key definitions */ +#define MODKEY Mod4Mask +#define AltMask Mod1Mask +#define ALTKEY Mod1Mask +#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", + "-m", dmenumon, + "-fn", dmenufont, + "-nb", normbgcolor, + "-nf", normfgcolor, + "-sb", selbgcolor, + "-sf", selfgcolor, + NULL +}; +static const char *termcmd[] = { "st", NULL }; +static const char *tmuxcmd[] = { "st", "-c", "st-tmux", "-e", "/home/wiebel/sync/bin/tmux-spawn.sh", NULL }; +// static const char scratchpadname[] = "tilda"; +/* static const char *scratchpadcmd[] = { "st", "-t", scratchpadname, "-g", "120x34", NULL }; */ +// static const char *scratchpadcmd[] = { "st", "-t", scratchpadname, "-c", "st-tilda", "-g", "180x18", "-e", "tmux", "new-session", "-A", "-s", "tilda", NULL }; + +static const char *volup[] = { "/opt/pavolume/pavolume", "volup", "10", NULL }; +static const char *voldn[] = { "/opt/pavolume/pavolume", "voldown", "10", NULL }; +static const char *volmute[] = { "/opt/pavolume/pavolume", "mutetoggle", NULL }; +static const char *playpause[] = { "/usr/bin/playerctl", "play-pause", NULL }; +#include + +/* This defines the name of the executable that handles the bar (used for signalling purposes) */ +#define STATUSBAR "dwmblocks" + + +static Key keys[] = { + /* modifier key function argument */ + { MODKEY, XK_p, spawn, {.v = dmenucmd } }, + { MODKEY|ShiftMask, XK_Return, spawn, {.v = tmuxcmd } }, + { MODKEY|ControlMask, XK_Return, spawn, {.v = termcmd } }, + { MODKEY, XK_b, togglebar, {0} }, + { MODKEY|ControlMask, XK_s, spawn, SHCMD("transset -a --dec .1") }, + { MODKEY|ControlMask, XK_d, spawn, SHCMD("transset -a --inc .1") }, + { ALTKEY, XK_w, spawn, SHCMD("pass-wrapper.sh") }, + { MODKEY, XK_n, spawn, SHCMD("networkmanager_dmenu") }, +// { MODKEY, XK_grave, spawn, SHCMD("/home/wiebel/sync/bin/st-tilda.sh") }, + { ALTKEY|ControlMask, XK_l, spawn, SHCMD("/usr/local/bin/lock.me") }, + /* Media Keys */ + { 0, XF86XK_MonBrightnessUp, spawn, SHCMD("xbacklight -inc 5") }, + { 0, XF86XK_MonBrightnessDown, spawn, SHCMD("xbacklight -dec 5") }, + { 0, XF86XK_AudioRaiseVolume, spawn, {.v = volup } }, + { 0, XF86XK_AudioLowerVolume, spawn, {.v = voldn } }, + { 0, XF86XK_AudioMute, spawn, {.v = volmute } }, + { 0, XF86XK_AudioPlay, spawn, {.v = playpause } }, + { MODKEY, XK_j, focusstack, {.i = +1 } }, + { MODKEY, XK_k, focusstack, {.i = -1 } }, + { MODKEY|ShiftMask, XK_j, inplacerotate, {.i = +1} }, + { MODKEY|ShiftMask, XK_k, inplacerotate, {.i = -1} }, + { MODKEY, XK_i, incnmaster, {.i = +1 } }, + { MODKEY, XK_d, incnmaster, {.i = -1 } }, + { MODKEY, XK_h, setmfact, {.f = -0.05} }, + { MODKEY, XK_l, setmfact, {.f = +0.05} }, + { MODKEY, XK_x, transfer, {0} }, + { MODKEY, XK_Return, zoom, {0} }, +// { MODKEY|AltMask, XK_u, incrgaps, {.i = +1 } }, +// { MODKEY|AltMask|ShiftMask, XK_u, incrgaps, {.i = -1 } }, +// { MODKEY|AltMask, XK_i, incrigaps, {.i = +1 } }, +// { MODKEY|AltMask|ShiftMask, XK_i, incrigaps, {.i = -1 } }, +// { MODKEY|AltMask, XK_o, incrogaps, {.i = +1 } }, +// { MODKEY|AltMask|ShiftMask, XK_o, incrogaps, {.i = -1 } }, +// { MODKEY|AltMask, XK_6, incrihgaps, {.i = +1 } }, +// { MODKEY|AltMask|ShiftMask, XK_6, incrihgaps, {.i = -1 } }, +// { MODKEY|AltMask, XK_7, incrivgaps, {.i = +1 } }, +// { MODKEY|AltMask|ShiftMask, XK_7, incrivgaps, {.i = -1 } }, +// { MODKEY|AltMask, XK_8, incrohgaps, {.i = +1 } }, +// { MODKEY|AltMask|ShiftMask, XK_8, incrohgaps, {.i = -1 } }, +// { MODKEY|AltMask, XK_9, incrovgaps, {.i = +1 } }, +// { MODKEY|AltMask|ShiftMask, XK_9, incrovgaps, {.i = -1 } }, +// { MODKEY|AltMask, XK_0, togglegaps, {0} }, +// { MODKEY|AltMask|ShiftMask, XK_0, defaultgaps, {0} }, + { MODKEY, XK_Tab, view, {0} }, + { MODKEY|ControlMask, XK_z, showhideclient, {0} }, + { MODKEY, XK_q, killclient, {0} }, + { MODKEY|ShiftMask, XK_c, killclient, {0} }, + { MODKEY|ShiftMask, XK_q, quit, {0} }, + { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, + { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, + { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, + { MODKEY, XK_u, setlayout, {.v = &layouts[3]} }, + { MODKEY, XK_o, setlayout, {.v = &layouts[4]} }, + { MODKEY|ShiftMask, XK_t, setlayout, {.v = &layouts[5]} }, + { MODKEY, XK_g, setlayout, {.v = &layouts[6]} }, + { MODKEY, XK_space, setlayout, {0} }, + { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, + { MODKEY|ShiftMask, XK_y, togglefakefullscreen, {0} }, + { MODKEY|ShiftMask, XK_s, togglesticky, {0} }, + { MODKEY, XK_grave, scratchpad_show, {0} }, + { MODKEY, XK_Escape, scratchpad_show, {0} }, + { MODKEY|ShiftMask, XK_grave, scratchpad_hide, {0} }, + { MODKEY|ShiftMask, XK_Escape, scratchpad_hide, {0} }, + { MODKEY|ShiftMask|ControlMask, XK_grave, scratchpad_remove, {0} }, + { MODKEY|ShiftMask|ControlMask, XK_Escape, scratchpad_remove, {0} }, + { MODKEY, XK_comma, focusmon, {.i = -1 } }, + { MODKEY, XK_period, focusmon, {.i = +1 } }, + { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, + { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, + { MODKEY, XK_Left, viewtoleft, {0} }, + { MODKEY, XK_Right, viewtoright, {0} }, + { MODKEY|ShiftMask, XK_Left, tagtoleft, {0} }, + { MODKEY|ShiftMask, XK_Right, tagtoright, {0} }, + { MODKEY|ControlMask, XK_Left, tagandviewtoleft, {0} }, + { MODKEY|ControlMask, XK_Right, tagandviewtoright, {0} }, + { MODKEY|ControlMask, XK_comma, tagallmon, {.i = +1 } }, + { MODKEY|ControlMask, XK_period, tagallmon, {.i = -1 } }, + { MODKEY|ShiftMask|ControlMask, XK_comma, tagswap:mon, {.i = +1 } }, + { MODKEY|ShiftMask|ControlMask, XK_period, tagswapmon, {.i = -1 } }, + + { MODKEY, XK_0, view, {.ui = ~0 } }, + { MODKEY|ShiftMask, 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) +}; + + +/* 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, Button1, togglewin, {0} }, + { ClkWinTitle, 0, Button3, showhideclient, {0} }, + { ClkWinTitle, 0, Button2, zoom, {0} }, + { ClkStatusText, 0, Button1, sigstatusbar, {.i = 1 } }, + { ClkStatusText, 0, Button2, sigstatusbar, {.i = 2 } }, + { ClkStatusText, 0, Button3, sigstatusbar, {.i = 3 } }, + { 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} }, +}; + + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..0b119af --- /dev/null +++ b/config.mk @@ -0,0 +1,70 @@ +# dwm version +VERSION = 6.2 + +# Customize below to fit your system + +# paths +PREFIX = /usr/local +MANPREFIX = ${PREFIX}/share/man + +X11INC = /usr/X11R6/include +X11LIB = /usr/X11R6/lib + +# FreeBSD (uncomment) +#X11INC = /usr/local/include +#X11LIB = /usr/local/lib + +# Xinerama, comment if you don't want it +XINERAMALIBS = -lXinerama +XINERAMAFLAGS = -DXINERAMA + +# freetype +FREETYPELIBS = -lfontconfig -lXft +FREETYPEINC = /usr/include/freetype2 +# FreeBSD (uncomment) +#FREETYPEINC = /usr/local/include/freetype2 +# OpenBSD (uncomment) +#FREETYPEINC = ${X11INC}/freetype2 +# OpenBSD - Uncomment this for the swallow patch / SWALLOW_PATCH +#KVMLIB = -lkvm + +# Uncomment this for the alpha patch / BAR_ALPHA_PATCH +XRENDER = -lXrender + +# Uncomment this for the mdpcontrol patch / MDPCONTROL_PATCH +#MPDCLIENT = -lmpdclient + +# Uncomment for the pango patch / BAR_PANGO_PATCH +#PANGOINC = `pkg-config --cflags xft pango pangoxft` +#PANGOLIB = `pkg-config --libs xft pango pangoxft` + +# Uncomment for the ipc patch / IPC_PATCH +#YAJLLIBS = -lyajl +#YAJLINC = -I/usr/include/yajl + +# Uncomment this for the rounded corners patch / ROUNDED_CORNERS_PATCH +#XEXTLIB = -lXext + +# Uncomment this for the swallow patch / SWALLOW_PATCH +XCBLIBS = -lX11-xcb -lxcb -lxcb-res + +# This is needed for the winicon patch / BAR_WINICON_PATCH +#IMLIB2LIBS = -lImlib2 + +# includes and libs +INCS = -I${X11INC} -I${FREETYPEINC} ${YAJLINC} ${PANGOINC} +LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} ${XRENDER} ${MPDCLIENT} ${XEXTLIB} ${XCBLIBS} ${KVMLIB} ${PANGOLIB} ${YAJLLIBS} ${IMLIB2LIBS} + +# flags +CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} +#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS} +#CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS} +CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -march=native -O3 -flto ${INCS} ${CPPFLAGS} +LDFLAGS = -flto ${LIBS} + +# Solaris +#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\" +#LDFLAGS = ${LIBS} + +# compiler and linker +CC = cc diff --git a/drw.c b/drw.c new file mode 100644 index 0000000..8b2065e --- /dev/null +++ b/drw.c @@ -0,0 +1,490 @@ +/* See LICENSE file for copyright and license details. */ +#include +#include +#include +#include +#include + +#include "drw.h" +#include "util.h" + +#define UTF_INVALID 0xFFFD +#define UTF_SIZ 4 + +static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; +static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; +static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; +static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; + +Clr transcheme[3]; + +static long +utf8decodebyte(const char c, size_t *i) +{ + for (*i = 0; *i < (UTF_SIZ + 1); ++(*i)) + if (((unsigned char)c & utfmask[*i]) == utfbyte[*i]) + return (unsigned char)c & ~utfmask[*i]; + return 0; +} + +static size_t +utf8validate(long *u, size_t i) +{ + if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF)) + *u = UTF_INVALID; + for (i = 1; *u > utfmax[i]; ++i) + ; + return i; +} + +static size_t +utf8decode(const char *c, long *u, size_t clen) +{ + size_t i, j, len, type; + long udecoded; + + *u = UTF_INVALID; + if (!clen) + return 0; + udecoded = utf8decodebyte(c[0], &len); + if (!BETWEEN(len, 1, UTF_SIZ)) + return 1; + for (i = 1, j = 1; i < clen && j < len; ++i, ++j) { + udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type); + if (type) + return j; + } + if (j < len) + return 0; + *u = udecoded; + utf8validate(u, len); + + return len; +} + +Drw * +drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap) +{ + Drw *drw = ecalloc(1, sizeof(Drw)); + + drw->dpy = dpy; + drw->screen = screen; + drw->root = root; + drw->w = w; + drw->h = h; + + drw->visual = visual; + drw->depth = depth; + drw->cmap = cmap; + drw->drawable = XCreatePixmap(dpy, root, w, h, depth); + drw->gc = XCreateGC(dpy, drw->drawable, 0, NULL); + XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); + + return drw; +} + +void +drw_resize(Drw *drw, unsigned int w, unsigned int h) +{ + if (!drw) + return; + + drw->w = w; + drw->h = h; + if (drw->drawable) + XFreePixmap(drw->dpy, drw->drawable); + drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, drw->depth); +} + +void +drw_free(Drw *drw) +{ + XFreePixmap(drw->dpy, drw->drawable); + XFreeGC(drw->dpy, drw->gc); + drw_fontset_free(drw->fonts); + free(drw); +} + +/* This function is an implementation detail. Library users should use + * drw_fontset_create instead. + */ +static Fnt * +xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) +{ + Fnt *font; + XftFont *xfont = NULL; + FcPattern *pattern = NULL; + + if (fontname) { + /* Using the pattern found at font->xfont->pattern does not yield the + * same substitution results as using the pattern returned by + * FcNameParse; using the latter results in the desired fallback + * behaviour whereas the former just results in missing-character + * rectangles being drawn, at least with some fonts. */ + if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) { + fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname); + return NULL; + } + if (!(pattern = FcNameParse((FcChar8 *) fontname))) { + fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname); + XftFontClose(drw->dpy, xfont); + return NULL; + } + } else if (fontpattern) { + if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) { + fprintf(stderr, "error, cannot load font from pattern.\n"); + return NULL; + } + } else { + die("no font specified."); + } + + /* Do not allow using color fonts. This is a workaround for a BadLength + * error from Xft with color glyphs. Modelled on the Xterm workaround. See + * https://bugzilla.redhat.com/show_bug.cgi?id=1498269 + * https://lists.suckless.org/dev/1701/30932.html + * https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=916349 + * and lots more all over the internet. + */ + FcBool iscol; + if (FcPatternGetBool(xfont->pattern, FC_COLOR, 0, &iscol) == FcResultMatch && iscol) { + XftFontClose(drw->dpy, xfont); + return NULL; + } + + font = ecalloc(1, sizeof(Fnt)); + font->xfont = xfont; + font->pattern = pattern; + font->h = xfont->ascent + xfont->descent; + font->dpy = drw->dpy; + + return font; +} + +static void +xfont_free(Fnt *font) +{ + if (!font) + return; + if (font->pattern) + FcPatternDestroy(font->pattern); + XftFontClose(font->dpy, font->xfont); + free(font); +} + +Fnt* +drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount) +{ + Fnt *cur, *ret = NULL; + size_t i; + + if (!drw || !fonts) + return NULL; + + for (i = 1; i <= fontcount; i++) { + if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) { + cur->next = ret; + ret = cur; + } + } + return (drw->fonts = ret); +} + +void +drw_fontset_free(Fnt *font) +{ + if (font) { + drw_fontset_free(font->next); + xfont_free(font); + } +} + +void +drw_clr_create( + Drw *drw, + Clr *dest, + const char *clrname + , unsigned int alpha +) { + if (!drw || !dest || !clrname) + return; + + if (!XftColorAllocName(drw->dpy, drw->visual, drw->cmap, + clrname, dest)) + die("error, cannot allocate color '%s'", clrname); + + dest->pixel = (dest->pixel & 0x00ffffffU) | (alpha << 24); +} + +/* Wrapper to create color schemes. The caller has to call free(3) on the + * returned color scheme when done using it. */ +Clr * +drw_scm_create( + Drw *drw, + char *clrnames[], + const unsigned int alphas[], + size_t clrcount +) { + size_t i; + Clr *ret; + + /* need at least two colors for a scheme */ + if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor)))) + return NULL; + + for (i = 0; i < clrcount; i++) + drw_clr_create(drw, &ret[i], clrnames[i], alphas[i]); + return ret; +} + +void +drw_setfontset(Drw *drw, Fnt *set) +{ + if (drw) + drw->fonts = set; +} + +void +drw_setscheme(Drw *drw, Clr *scm) +{ + if (drw) + drw->scheme = scm; +} + +void +drw_settrans(Drw *drw, Clr *psc, Clr *nsc) +{ + if (drw) { + transcheme[0] = psc[ColBg]; transcheme[1] = nsc[ColBg]; transcheme[2] = psc[ColBorder]; + drw->scheme = transcheme; + } +} + +void +drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert) +{ + if (!drw || !drw->scheme) + return; + XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg].pixel); + if (filled) + XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); + else + XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1); +} + +int +drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert, Bool ignored) +{ + char buf[1024]; + int ty; + unsigned int ew; + XftDraw *d = NULL; + Fnt *usedfont, *curfont, *nextfont; + size_t i, len; + int utf8strlen, utf8charlen, render = x || y || w || h; + long utf8codepoint = 0; + const char *utf8str; + FcCharSet *fccharset; + FcPattern *fcpattern; + FcPattern *match; + XftResult result; + int charexists = 0; + + if (!drw || (render && !drw->scheme) || !text || !drw->fonts) + return 0; + + if (!render) { + w = ~w; + } else { + XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); + XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); + d = XftDrawCreate(drw->dpy, drw->drawable, drw->visual, drw->cmap); + x += lpad; + w -= lpad; + } + + usedfont = drw->fonts; + while (1) { + utf8strlen = 0; + utf8str = text; + nextfont = NULL; + while (*text) { + utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ); + for (curfont = drw->fonts; curfont; curfont = curfont->next) { + charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint); + if (charexists) { + if (curfont == usedfont) { + utf8strlen += utf8charlen; + text += utf8charlen; + } else { + nextfont = curfont; + } + break; + } + } + + if (!charexists || nextfont) + break; + else + charexists = 0; + } + + if (utf8strlen) { + drw_font_getexts(usedfont, utf8str, utf8strlen, &ew, NULL); + /* shorten text if necessary */ + for (len = MIN(utf8strlen, sizeof(buf) - 1); len && ew > w; len--) + drw_font_getexts(usedfont, utf8str, len, &ew, NULL); + + if (len) { + memcpy(buf, utf8str, len); + buf[len] = '\0'; + if (len < utf8strlen) + for (i = len; i && i > len - 3; buf[--i] = '.') + ; /* NOP */ + + if (render) { + ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent; + XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg], + usedfont->xfont, x, ty, (XftChar8 *)buf, len); + } + x += ew; + w -= ew; + } + } + + if (!*text) { + break; + } else if (nextfont) { + charexists = 0; + usedfont = nextfont; + } else { + /* Regardless of whether or not a fallback font is found, the + * character must be drawn. */ + charexists = 1; + + fccharset = FcCharSetCreate(); + FcCharSetAddChar(fccharset, utf8codepoint); + + if (!drw->fonts->pattern) { + /* Refer to the comment in xfont_create for more information. */ + die("the first font in the cache must be loaded from a font string."); + } + + fcpattern = FcPatternDuplicate(drw->fonts->pattern); + FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset); + FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue); + FcPatternAddBool(fcpattern, FC_COLOR, FcFalse); + + FcConfigSubstitute(NULL, fcpattern, FcMatchPattern); + FcDefaultSubstitute(fcpattern); + match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result); + + FcCharSetDestroy(fccharset); + FcPatternDestroy(fcpattern); + + if (match) { + usedfont = xfont_create(drw, NULL, match); + if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) { + for (curfont = drw->fonts; curfont->next; curfont = curfont->next) + ; /* NOP */ + curfont->next = usedfont; + } else { + xfont_free(usedfont); + usedfont = drw->fonts; + } + } + } + } + if (d) + XftDrawDestroy(d); + + return x + (render ? w : 0); +} + +void +drw_arrow(Drw *drw, int x, int y, unsigned int w, unsigned int h, int direction, int slash) +{ + if (!drw || !drw->scheme) + return; + + /* direction=1 draws right arrow */ + x = direction ? x : x + w; + w = direction ? w : -w; + /* slash=1 draws slash instead of arrow */ + unsigned int hh = slash ? (direction ? 0 : h) : h/2; + + XPoint points[] = { + {x , y }, + {x + w, y + hh }, + {x , y + h }, + }; + + XPoint bg[] = { + {x , y }, + {x + w, y }, + {x + w, y + h}, + {x , y + h}, + }; + + XSetForeground(drw->dpy, drw->gc, drw->scheme[ColBg].pixel); + XFillPolygon(drw->dpy, drw->drawable, drw->gc, bg, 4, Convex, CoordModeOrigin); + XSetForeground(drw->dpy, drw->gc, drw->scheme[ColFg].pixel); + XFillPolygon(drw->dpy, drw->drawable, drw->gc, points, 3, Nonconvex, CoordModeOrigin); +} + +void +drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) +{ + if (!drw) + return; + + XCopyArea(drw->dpy, drw->drawable, win, drw->gc, x, y, w, h, x, y); + XSync(drw->dpy, False); +} + +unsigned int +drw_fontset_getwidth(Drw *drw, const char *text, Bool markup) +{ + if (!drw || !drw->fonts || !text) + return 0; + return drw_text(drw, 0, 0, 0, 0, 0, text, 0, markup); +} + +void +drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h) +{ + XGlyphInfo ext; + + if (!font || !text) + return; + + XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext); + if (w) + *w = ext.xOff; + if (h) + *h = font->h; +} + +Cur * +drw_cur_create(Drw *drw, int shape) +{ + Cur *cur; + + if (!drw || !(cur = ecalloc(1, sizeof(Cur)))) + return NULL; + + cur->cursor = XCreateFontCursor(drw->dpy, shape); + + return cur; +} + +void +drw_cur_free(Drw *drw, Cur *cursor) +{ + if (!cursor) + return; + + XFreeCursor(drw->dpy, cursor->cursor); + free(cursor); +} + diff --git a/drw.h b/drw.h new file mode 100644 index 0000000..7a9bf84 --- /dev/null +++ b/drw.h @@ -0,0 +1,74 @@ +/* See LICENSE file for copyright and license details. */ + + +typedef struct { + Cursor cursor; +} Cur; + +typedef struct Fnt { + Display *dpy; + unsigned int h; + XftFont *xfont; + FcPattern *pattern; + struct Fnt *next; +} Fnt; + +enum { ColFg, ColBg, ColBorder, ColFloat, ColCount }; /* Clr scheme index */ +typedef XftColor Clr; + +typedef struct { + unsigned int w, h; + Display *dpy; + int screen; + Window root; + Visual *visual; + unsigned int depth; + Colormap cmap; + Drawable drawable; + GC gc; + Clr *scheme; + Fnt *fonts; +} Drw; + +/* Drawable abstraction */ +Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap); +void drw_resize(Drw *drw, unsigned int w, unsigned int h); +void drw_free(Drw *drw); + +/* Fnt abstraction */ +Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount); +void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h); +void drw_fontset_free(Fnt* set); +unsigned int drw_fontset_getwidth(Drw *drw, const char *text, Bool markup); + +/* Colorscheme abstraction */ +void drw_clr_create( + Drw *drw, + Clr *dest, + const char *clrname + , unsigned int alpha +); +Clr *drw_scm_create( + Drw *drw, + char *clrnames[], + const unsigned int alphas[], + size_t clrcount +); + +/* Cursor abstraction */ +Cur *drw_cur_create(Drw *drw, int shape); +void drw_cur_free(Drw *drw, Cur *cursor); + +/* Drawing context manipulation */ +void drw_setfontset(Drw *drw, Fnt *set); +void drw_setscheme(Drw *drw, Clr *scm); +void drw_settrans(Drw *drw, Clr *psc, Clr *nsc); + +/* Drawing functions */ +void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert); +int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert, Bool markup); +void drw_arrow(Drw *drw, int x, int y, unsigned int w, unsigned int h, int direction, int slash); + +/* Map functions */ +void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h); + diff --git a/drw.o b/drw.o new file mode 100644 index 0000000000000000000000000000000000000000..4355fba480681c6841de6da9852c46642b511ce6 GIT binary patch literal 53112 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 REPU+kCRL}{0@yCq{{l_2+KvDK literal 0 HcmV?d00001 diff --git a/dwm.1 b/dwm.1 new file mode 100644 index 0000000..ddc8321 --- /dev/null +++ b/dwm.1 @@ -0,0 +1,176 @@ +.TH DWM 1 dwm\-VERSION +.SH NAME +dwm \- dynamic window manager +.SH SYNOPSIS +.B dwm +.RB [ \-v ] +.SH DESCRIPTION +dwm is a dynamic window manager for X. It manages windows in tiled, monocle +and floating layouts. Either layout can be applied dynamically, optimising the +environment for the application in use and the task performed. +.P +In tiled layouts windows are managed in a master and stacking area. The master +area on the left contains one window by default, and the stacking area on the +right contains all other windows. The number of master area windows can be +adjusted from zero to an arbitrary number. In monocle layout all windows are +maximised to the screen size. In floating layout windows can be resized and +moved freely. Dialog windows are always managed floating, regardless of the +layout applied. +.P +Windows are grouped by tags. Each window can be tagged with one or multiple +tags. Selecting certain tags displays all windows with these tags. +.P +Each screen contains a small status bar which displays all available tags, the +layout, the title of the focused window, and the text read from the root window +name property, if the screen is focused. A floating window is indicated with an +empty square and a maximised floating window is indicated with a filled square +before the windows title. The selected tags are indicated with a different +color. The tags of the focused window are indicated with a filled square in the +top left corner. The tags which are applied to one or more windows are +indicated with an empty square in the top left corner. +.P +dwm draws a small border around windows to indicate the focus state. +.SH OPTIONS +.TP +.B \-v +prints version information to stderr, then exits. +.SH USAGE +.SS Status bar +.TP +.B X root window name +is read and displayed in the status text area. It can be set with the +.BR xsetroot (1) +command. +.TP +.B Button1 +click on a tag label to display all windows with that tag, click on the layout +label toggles between tiled and floating layout. +.TP +.B Button3 +click on a tag label adds/removes all windows with that tag to/from the view. +.TP +.B Mod1\-Button1 +click on a tag label applies that tag to the focused window. +.TP +.B Mod1\-Button3 +click on a tag label adds/removes that tag to/from the focused window. +.SS Keyboard commands +.TP +.B Mod1\-Shift\-Return +Start +.BR st(1). +.TP +.B Mod1\-p +Spawn +.BR dmenu(1) +for launching other programs. +.TP +.B Mod1\-, +Focus previous screen, if any. +.TP +.B Mod1\-. +Focus next screen, if any. +.TP +.B Mod1\-Shift\-, +Send focused window to previous screen, if any. +.TP +.B Mod1\-Shift\-. +Send focused window to next screen, if any. +.TP +.B Mod1\-b +Toggles bar on and off. +.TP +.B Mod1\-t +Sets tiled layout. +.TP +.B Mod1\-f +Sets floating layout. +.TP +.B Mod1\-m +Sets monocle layout. +.TP +.B Mod1\-space +Toggles between current and previous layout. +.TP +.B Mod1\-j +Focus next window. +.TP +.B Mod1\-k +Focus previous window. +.TP +.B Mod1\-i +Increase number of windows in master area. +.TP +.B Mod1\-d +Decrease number of windows in master area. +.TP +.B Mod1\-l +Increase master area size. +.TP +.B Mod1\-h +Decrease master area size. +.TP +.B Mod1\-Return +Zooms/cycles focused window to/from master area (tiled layouts only). +.TP +.B Mod1\-Shift\-c +Close focused window. +.TP +.B Mod1\-Shift\-space +Toggle focused window between tiled and floating state. +.TP +.B Mod1\-Tab +Toggles to the previously selected tags. +.TP +.B Mod1\-Shift\-[1..n] +Apply nth tag to focused window. +.TP +.B Mod1\-Shift\-0 +Apply all tags to focused window. +.TP +.B Mod1\-Control\-Shift\-[1..n] +Add/remove nth tag to/from focused window. +.TP +.B Mod1\-[1..n] +View all windows with nth tag. +.TP +.B Mod1\-0 +View all windows with any tag. +.TP +.B Mod1\-Control\-[1..n] +Add/remove all windows with nth tag to/from the view. +.TP +.B Mod1\-Shift\-q +Quit dwm. +.SS Mouse commands +.TP +.B Mod1\-Button1 +Move focused window while dragging. Tiled windows will be toggled to the floating state. +.TP +.B Mod1\-Button2 +Toggles focused window between floating and tiled state. +.TP +.B Mod1\-Button3 +Resize focused window while dragging. Tiled windows will be toggled to the floating state. +.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 SEE ALSO +.BR dmenu (1), +.BR st (1) +.SH ISSUES +Java applications which use the XToolkit/XAWT backend may draw grey windows +only. The XToolkit/XAWT backend breaks ICCCM-compliance in recent JDK 1.5 and early +JDK 1.6 versions, because it assumes a reparenting window manager. Possible workarounds +are using JDK 1.4 (which doesn't contain the XToolkit/XAWT backend) or setting the +environment variable +.BR AWT_TOOLKIT=MToolkit +(to use the older Motif backend instead) or running +.B xprop -root -f _NET_WM_NAME 32a -set _NET_WM_NAME LG3D +or +.B wmname LG3D +(to pretend that a non-reparenting window manager is running that the +XToolkit/XAWT backend can recognize) or when using OpenJDK setting the environment variable +.BR _JAVA_AWT_WM_NONREPARENTING=1 . +.SH BUGS +Send all bug reports with a patch to hackers@suckless.org. diff --git a/dwm.c b/dwm.c new file mode 100644 index 0000000..2418270 --- /dev/null +++ b/dwm.c @@ -0,0 +1,2893 @@ +/* See LICENSE file for copyright and license details. + * + * dynamic window manager is designed like any other X client as well. It is + * driven through handling X events. In contrast to other X clients, a window + * manager selects for SubstructureRedirectMask on the root window, to receive + * events about window (dis-)appearance. Only one X connection at a time is + * allowed to select for this event mask. + * + * The event handlers of dwm are organized in an array which is accessed + * whenever a new event has been fetched. This allows event dispatching + * in O(1) time. + * + * Each child of the root window is called a client, except windows which have + * set the override_redirect flag. Clients are organized in a linked client + * list on each monitor, the focus history is remembered through a stack list + * on each monitor. Each client contains a bit array to indicate the tags of a + * client. + * + * Keys and tagging rules are organized as arrays and defined in config.h. + * + * To understand everything else, start reading main(). + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef XINERAMA +#include +#endif /* XINERAMA */ +#include + +#include "drw.h" +#include "util.h" + + + + + +/* macros */ +#define Button6 6 +#define Button7 7 +#define Button8 8 +#define Button9 9 +#define NUMTAGS 9 +#define BARRULES 20 +#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask) +#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)) +#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \ + * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy))) +#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags]) || C->issticky) +#define LENGTH(X) (sizeof X / sizeof X[0]) +#define MOUSEMASK (BUTTONMASK|PointerMotionMask) +#define WIDTH(X) ((X)->w + 2 * (X)->bw) +#define HEIGHT(X) ((X)->h + 2 * (X)->bw) +#define WTYPE "_NET_WM_WINDOW_TYPE_" +#define TAGMASK ((1 << NUMTAGS) - 1) +#define TEXTWM(X) (drw_fontset_getwidth(drw, (X), True) + lrpad) +#define TEXTW(X) (drw_fontset_getwidth(drw, (X), False) + lrpad) +#define HIDDEN(C) ((getstate(C->win) == IconicState)) + +/* enums */ +enum { + CurResizeBR, + CurResizeBL, + CurResizeTR, + CurResizeTL, + CurNormal, + CurResize, + CurMove, + CurLast +}; /* cursor */ + +enum { + SchemeNorm, + SchemeSel, + SchemeTitleNorm, + SchemeTitleSel, + SchemeTagsNorm, + SchemeTagsSel, + SchemeHidNorm, + SchemeHidSel, + SchemeUrg, +}; /* color schemes */ + +enum { + NetSupported, NetWMName, NetWMState, NetWMCheck, + NetWMFullscreen, NetActiveWindow, NetWMWindowType, + NetSystemTray, NetSystemTrayOP, NetSystemTrayOrientation, + NetSystemTrayVisual, NetWMWindowTypeDock, NetSystemTrayOrientationHorz, + NetDesktopNames, NetDesktopViewport, NetNumberOfDesktops, NetCurrentDesktop, + NetClientList, + NetClientListStacking, + NetLast +}; /* EWMH atoms */ + +enum { + WMProtocols, + WMDelete, + WMState, + WMTakeFocus, + WMWindowRole, + WMLast +}; /* default atoms */ + +enum { + ClkTagBar, + ClkLtSymbol, + ClkStatusText, + ClkWinTitle, + ClkClientWin, + ClkRootWin, + ClkLast +}; /* clicks */ + +enum { + BAR_ALIGN_LEFT, + BAR_ALIGN_CENTER, + BAR_ALIGN_RIGHT, + BAR_ALIGN_LEFT_LEFT, + BAR_ALIGN_LEFT_RIGHT, + BAR_ALIGN_LEFT_CENTER, + BAR_ALIGN_NONE, + BAR_ALIGN_RIGHT_LEFT, + BAR_ALIGN_RIGHT_RIGHT, + BAR_ALIGN_RIGHT_CENTER, + BAR_ALIGN_LAST +}; /* bar alignment */ + + +typedef union { + int i; + unsigned int ui; + float f; + const void *v; +} Arg; + +typedef struct Monitor Monitor; +typedef struct Bar Bar; +struct Bar { + Window win; + Monitor *mon; + Bar *next; + int idx; + int showbar; + int topbar; + int external; + int borderpx; + int borderscheme; + int bx, by, bw, bh; /* bar geometry */ + int w[BARRULES]; // width, array length == barrules, then use r index for lookup purposes + int x[BARRULES]; // x position, array length == ^ +}; + +typedef struct { + int x; + int y; + int h; + int w; +} BarArg; + +typedef struct { + int monitor; + int bar; + int alignment; // see bar alignment enum + int (*widthfunc)(Bar *bar, BarArg *a); + int (*drawfunc)(Bar *bar, BarArg *a); + int (*clickfunc)(Bar *bar, Arg *arg, BarArg *a); + char *name; // for debugging + int x, w; // position, width for internal use +} BarRule; + +typedef struct { + unsigned int click; + unsigned int mask; + unsigned int button; + void (*func)(const Arg *arg); + const Arg arg; +} Button; + + +typedef struct Client Client; +struct Client { + char name[256]; + float mina, maxa; + int x, y, w, h; + int sfx, sfy, sfw, sfh; /* stored float geometry, used on mode revert */ + int oldx, oldy, oldw, oldh; + int basew, baseh, incw, inch, maxw, maxh, minw, minh; + int bw, oldbw; + unsigned int tags; + unsigned int switchtag; + int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; + int fakefullscreen; + int iscentered; + int ispermanent; + int isterminal, noswallow; + pid_t pid; + int issteam; + int issticky; + Client *next; + Client *snext; + Client *swallowing; + Monitor *mon; + Window win; +}; + +typedef struct { + unsigned int mod; + KeySym keysym; + void (*func)(const Arg *); + const Arg arg; +} Key; + + +typedef struct { + const char *symbol; + void (*arrange)(Monitor *); +} Layout; + + +typedef struct Pertag Pertag; +struct Monitor { + int index; + char ltsymbol[16]; + float mfact; + int nmaster; + int num; + 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]; + int showbar; + Client *clients; + Client *sel; + Client *stack; + Monitor *next; + Bar *bar; + const Layout *lt[2]; + Pertag *pertag; +}; + +typedef struct { + const char *class; + const char *role; + const char *instance; + const char *title; + const char *wintype; + unsigned int tags; + int switchtag; + int iscentered; + int isfloating; + int isfakefullscreen; + int ispermanent; + int isterminal; + int noswallow; + int monitor; +} Rule; + +#define RULE(...) { .monitor = -1, __VA_ARGS__ }, + +/* Cross patch compatibility rule macro helper macros */ +#define FLOATING , .isfloating = 1 +#define CENTERED , .iscentered = 1 +#define PERMANENT , .ispermanent = 1 +#define FAKEFULLSCREEN , .isfakefullscreen = 1 +#define NOSWALLOW , .noswallow = 1 +#define TERMINAL , .isterminal = 1 +#define SWITCHTAG , .switchtag = 1 + + +/* function declarations */ +static void applyrules(Client *c); +static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); +static void arrange(Monitor *m); +static void arrangemon(Monitor *m); +static void attach(Client *c); +static void attachstack(Client *c); +static void buttonpress(XEvent *e); +static void checkotherwm(void); +static void cleanup(void); +static void cleanupmon(Monitor *mon); +static void clientmessage(XEvent *e); +static void configure(Client *c); +static void configurenotify(XEvent *e); +static void configurerequest(XEvent *e); +static Monitor *createmon(void); +static void destroynotify(XEvent *e); +static void detach(Client *c); +static void detachstack(Client *c); +static Monitor *dirtomon(int dir); +static void drawbar(Monitor *m); +static void drawbars(void); +static void drawbarwin(Bar *bar); +static void enternotify(XEvent *e); +static void expose(XEvent *e); +static void focus(Client *c); +static void focusin(XEvent *e); +static void focusmon(const Arg *arg); +static void focusstack(const Arg *arg); +static Atom getatomprop(Client *c, Atom prop); +static int getrootptr(int *x, int *y); +static long getstate(Window w); +static int gettextprop(Window w, Atom atom, char *text, unsigned int size); +static void grabbuttons(Client *c, int focused); +static void grabkeys(void); +static void incnmaster(const Arg *arg); +static void keypress(XEvent *e); +static void killclient(const Arg *arg); +static void manage(Window w, XWindowAttributes *wa); +static void mappingnotify(XEvent *e); +static void maprequest(XEvent *e); +static void motionnotify(XEvent *e); +static void movemouse(const Arg *arg); +static Client *nexttiled(Client *c); +static void pop(Client *); +static void propertynotify(XEvent *e); +static void quit(const Arg *arg); +static Monitor *recttomon(int x, int y, int w, int h); +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 run(void); +static void scan(void); +static int sendevent(Window w, Atom proto, int m, long d0, long d1, long d2, long d3, long d4); +static void sendmon(Client *c, Monitor *m); +static void setclientstate(Client *c, long state); +static void setfocus(Client *c); +static void setfullscreen(Client *c, int fullscreen); +static void setlayout(const Arg *arg); +static void setmfact(const Arg *arg); +static void setup(void); +static void seturgent(Client *c, int urg); +static void showhide(Client *c); +static void sigchld(int unused); +static void spawn(const Arg *arg); +static void tag(const Arg *arg); +static void tagmon(const Arg *arg); +static void togglebar(const Arg *arg); +static void togglefloating(const Arg *arg); +static void toggletag(const Arg *arg); +static void toggleview(const Arg *arg); +static void unfocus(Client *c, int setfocus, Client *nextfocus); +static void unmanage(Client *c, int destroyed); +static void unmapnotify(XEvent *e); +static void updatebarpos(Monitor *m); +static void updatebars(void); +static void updateclientlist(void); +static int updategeom(void); +static void updatenumlockmask(void); +static void updatesizehints(Client *c); +static void updatestatus(void); +static void updatetitle(Client *c); +static void updatewmhints(Client *c); +static void view(const Arg *arg); +static Client *wintoclient(Window w); +static Monitor *wintomon(Window w); +static int xerror(Display *dpy, XErrorEvent *ee); +static int xerrordummy(Display *dpy, XErrorEvent *ee); +static int xerrorstart(Display *dpy, XErrorEvent *ee); +static void zoom(const Arg *arg); + +/* bar functions */ + +#include "patch/include.h" + +/* variables */ +static const char broken[] = "broken"; +static char stext[512]; +static char rawstext[512]; + +static int screen; +static int sw, sh; /* X display screen geometry width, height */ +static int bh; /* bar geometry */ +static int lrpad; /* sum of left and right padding for text */ +/* Some clients (e.g. alacritty) helpfully send configure requests with a new size or position + * when they detect that they have been moved to another monitor. This can cause visual glitches + * when moving (or resizing) client windows from one monitor to another. This variable is used + * internally to ignore such configure requests while movemouse or resizemouse are being used. */ +static int ignoreconfigurerequests = 0; +static int (*xerrorxlib)(Display *, XErrorEvent *); +static unsigned int numlockmask = 0; +static void (*handler[LASTEvent]) (XEvent *) = { + [ButtonPress] = buttonpress, + [ClientMessage] = clientmessage, + [ConfigureRequest] = configurerequest, + [ConfigureNotify] = configurenotify, + [DestroyNotify] = destroynotify, + [EnterNotify] = enternotify, + [Expose] = expose, + [FocusIn] = focusin, + [KeyPress] = keypress, + [MappingNotify] = mappingnotify, + [MapRequest] = maprequest, + [MotionNotify] = motionnotify, + [PropertyNotify] = propertynotify, + [ResizeRequest] = resizerequest, + [UnmapNotify] = unmapnotify +}; +static Atom wmatom[WMLast], netatom[NetLast], xatom[XLast]; +static int running = 1; +static Cur *cursor[CurLast]; +static Clr **scheme; +static Display *dpy; +static Drw *drw; +static Monitor *mons, *selmon; +static Window root, wmcheckwin; + +/* configuration, allows nested code to access above variables */ +#include "config.h" + +#include "patch/include.c" + +/* compile-time check if all tags fit into an unsigned int bit array. */ +struct NumTags { char limitexceeded[NUMTAGS > 30 ? -1 : 1]; }; + +/* function implementations */ +void +applyrules(Client *c) +{ + const char *class, *instance; + Atom wintype; + char role[64]; + unsigned int i; + unsigned int newtagset; + const Rule *r; + Monitor *m; + XClassHint ch = { NULL, NULL }; + + /* rule matching */ + c->noswallow = -1; + c->isfloating = 0; + c->tags = 0; + XGetClassHint(dpy, c->win, &ch); + class = ch.res_class ? ch.res_class : broken; + instance = ch.res_name ? ch.res_name : broken; + wintype = getatomprop(c, netatom[NetWMWindowType]); + gettextprop(c->win, wmatom[WMWindowRole], role, sizeof(role)); + + if (strstr(class, "Steam") || strstr(class, "steam_app_")) + c->issteam = 1; + + for (i = 0; i < LENGTH(rules); i++) { + r = &rules[i]; + if ((!r->title || strstr(c->name, r->title)) + && (!r->class || strstr(class, r->class)) + && (!r->role || strstr(role, r->role)) + && (!r->instance || strstr(instance, r->instance)) + && (!r->wintype || wintype == XInternAtom(dpy, r->wintype, False))) + { + c->iscentered = r->iscentered; + c->ispermanent = r->ispermanent; + c->fakefullscreen = r->isfakefullscreen; + 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); + if (m) + c->mon = m; + + if (r->switchtag && ( + c->noswallow > 0 || + !termforwin(c) || + !(c->isfloating && swallowfloating && c->noswallow < 0))) + { + selmon = c->mon; + if (r->switchtag == 2 || r->switchtag == 4) + newtagset = c->mon->tagset[c->mon->seltags] ^ c->tags; + else + newtagset = c->tags; + + /* Switch to the client's tag, but only if that tag is not already shown */ + if (newtagset && !(c->tags & c->mon->tagset[c->mon->seltags])) { + if (r->switchtag == 3 || r->switchtag == 4) + c->switchtag = c->mon->tagset[c->mon->seltags]; + if (r->switchtag == 1 || r->switchtag == 3) { + pertagview(&((Arg) { .ui = newtagset })); + arrange(c->mon); + } else { + c->mon->tagset[c->mon->seltags] = newtagset; + arrange(c->mon); + } + } + } + } + } + if (ch.res_class) + XFree(ch.res_class); + if (ch.res_name) + XFree(ch.res_name); + if (c->tags != SCRATCHPAD_MASK) + c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags]; +} + +int +applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact) +{ + int baseismin; + Monitor *m = c->mon; + + /* set minimum possible */ + *w = MAX(1, *w); + *h = MAX(1, *h); + if (interact) { + if (*x > sw) + *x = sw - WIDTH(c); + if (*y > sh) + *y = sh - HEIGHT(c); + if (*x + *w + 2 * c->bw < 0) + *x = 0; + if (*y + *h + 2 * c->bw < 0) + *y = 0; + } else { + if (*x >= m->wx + m->ww) + *x = m->wx + m->ww - WIDTH(c); + if (*y >= m->wy + m->wh) + *y = m->wy + m->wh - HEIGHT(c); + if (*x + *w + 2 * c->bw <= m->wx) + *x = m->wx; + if (*y + *h + 2 * c->bw <= m->wy) + *y = m->wy; + } + if (*h < bh) + *h = bh; + if (*w < bh) + *w = bh; + if (resizehints || c->isfloating || !c->mon->lt[c->mon->sellt]->arrange) { + /* see last two sentences in ICCCM 4.1.2.3 */ + baseismin = c->basew == c->minw && c->baseh == c->minh; + if (!baseismin) { /* temporarily remove base dimensions */ + *w -= c->basew; + *h -= c->baseh; + } + /* adjust for aspect limits */ + if (c->mina > 0 && c->maxa > 0) { + if (c->maxa < (float)*w / *h) + *w = *h * c->maxa + 0.5; + else if (c->mina < (float)*h / *w) + *h = *w * c->mina + 0.5; + } + if (baseismin) { /* increment calculation requires this */ + *w -= c->basew; + *h -= c->baseh; + } + /* adjust for increment value */ + if (c->incw) + *w -= *w % c->incw; + if (c->inch) + *h -= *h % c->inch; + /* restore base dimensions */ + *w = MAX(*w + c->basew, c->minw); + *h = MAX(*h + c->baseh, c->minh); + if (c->maxw) + *w = MIN(*w, c->maxw); + if (c->maxh) + *h = MIN(*h, c->maxh); + } + return *x != c->x || *y != c->y || *w != c->w || *h != c->h; +} + +void +arrange(Monitor *m) +{ + if (m) + showhide(m->stack); + else for (m = mons; m; m = m->next) + showhide(m->stack); + if (m) { + arrangemon(m); + restack(m); + } else for (m = mons; m; m = m->next) + arrangemon(m); +} + +void +arrangemon(Monitor *m) +{ + strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol); + if (m->lt[m->sellt]->arrange) + m->lt[m->sellt]->arrange(m); +} + +void +attach(Client *c) +{ + c->next = c->mon->clients; + c->mon->clients = c; +} + +void +attachstack(Client *c) +{ + c->snext = c->mon->stack; + c->mon->stack = c; +} + +void +buttonpress(XEvent *e) +{ + int click, i, r; + Arg arg = {0}; + Client *c; + Monitor *m; + Bar *bar; + XButtonPressedEvent *ev = &e->xbutton; + const BarRule *br; + BarArg carg = { 0, 0, 0, 0 }; + click = ClkRootWin; + + + /* focus monitor if necessary */ + if ((m = wintomon(ev->window)) && m != selmon + ) { + unfocus(selmon->sel, 1, NULL); + selmon = m; + focus(NULL); + } + + for (bar = selmon->bar; bar; bar = bar->next) { + if (ev->window == bar->win) { + for (r = 0; r < LENGTH(barrules); r++) { + br = &barrules[r]; + if (br->bar != bar->idx || (br->monitor == 'A' && m != selmon) || br->clickfunc == NULL) + continue; + if (br->monitor != 'A' && br->monitor != -1 && br->monitor != bar->mon->index) + continue; + if (bar->x[r] <= ev->x && ev->x <= bar->x[r] + bar->w[r]) { + carg.x = ev->x - bar->x[r]; + carg.y = ev->y - bar->borderpx; + carg.w = bar->w[r]; + carg.h = bar->bh - 2 * bar->borderpx; + click = br->clickfunc(bar, &arg, &carg); + if (click < 0) + return; + break; + } + } + break; + } + } + + + if (click == ClkRootWin && (c = wintoclient(ev->window))) { + focus(c); + restack(selmon); + XAllowEvents(dpy, ReplayPointer, CurrentTime); + click = ClkClientWin; + } + + for (i = 0; i < LENGTH(buttons); i++) { + if (click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button + && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) { + buttons[i].func( + ( + click == ClkTagBar + || click == ClkWinTitle + ) && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg + ); + } + } +} + +void +checkotherwm(void) +{ + xerrorxlib = XSetErrorHandler(xerrorstart); + /* this causes an error if some other window manager is running */ + XSelectInput(dpy, DefaultRootWindow(dpy), SubstructureRedirectMask); + XSync(dpy, False); + XSetErrorHandler(xerror); + XSync(dpy, False); +} + +void +cleanup(void) +{ + Arg a = {.ui = ~0}; + Layout foo = { "", NULL }; + Monitor *m; + size_t i; + view(&a); + selmon->lt[selmon->sellt] = &foo; + for (m = mons; m; m = m->next) + while (m->stack) + unmanage(m->stack, 0); + XUngrabKey(dpy, AnyKey, AnyModifier, root); + while (mons) + cleanupmon(mons); + if (showsystray && systray) { + while (systray->icons) + removesystrayicon(systray->icons); + if (systray->win) { + XUnmapWindow(dpy, systray->win); + XDestroyWindow(dpy, systray->win); + } + free(systray); + } + for (i = 0; i < CurLast; i++) + drw_cur_free(drw, cursor[i]); + for (i = 0; i < LENGTH(colors); i++) + free(scheme[i]); + free(scheme); + XDestroyWindow(dpy, wmcheckwin); + drw_free(drw); + XSync(dpy, False); + XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); + XDeleteProperty(dpy, root, netatom[NetActiveWindow]); + +} + +void +cleanupmon(Monitor *mon) +{ + Monitor *m; + Bar *bar; + + if (mon == mons) + mons = mons->next; + else { + for (m = mons; m && m->next != mon; m = m->next); + m->next = mon->next; + } + for (bar = mon->bar; bar; bar = mon->bar) { + if (!bar->external) { + XUnmapWindow(dpy, bar->win); + XDestroyWindow(dpy, bar->win); + } + mon->bar = bar->next; + if (systray && bar == systray->bar) + systray->bar = NULL; + free(bar); + } + free(mon->pertag); + free(mon); +} + +void +clientmessage(XEvent *e) +{ + XWindowAttributes wa; + XSetWindowAttributes swa; + XClientMessageEvent *cme = &e->xclient; + Client *c = wintoclient(cme->window); + + if (showsystray && systray && cme->window == systray->win && cme->message_type == netatom[NetSystemTrayOP]) { + /* add systray icons */ + if (cme->data.l[1] == SYSTEM_TRAY_REQUEST_DOCK) { + if (!(c = (Client *)calloc(1, sizeof(Client)))) + die("fatal: could not malloc() %u bytes\n", sizeof(Client)); + if (!(c->win = cme->data.l[2])) { + free(c); + return; + } + + c->mon = selmon; + c->next = systray->icons; + systray->icons = c; + XGetWindowAttributes(dpy, c->win, &wa); + c->x = c->oldx = c->y = c->oldy = 0; + c->w = c->oldw = wa.width; + c->h = c->oldh = wa.height; + c->oldbw = wa.border_width; + c->bw = 0; + c->isfloating = True; + /* reuse tags field as mapped status */ + c->tags = 1; + updatesizehints(c); + updatesystrayicongeom(c, wa.width, wa.height); + XAddToSaveSet(dpy, c->win); + XSelectInput(dpy, c->win, StructureNotifyMask | PropertyChangeMask | ResizeRedirectMask); + XClassHint ch = {"dwmsystray", "dwmsystray"}; + XSetClassHint(dpy, c->win, &ch); + XReparentWindow(dpy, c->win, systray->win, 0, 0); + /* use parents background color */ + swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; + XChangeWindowAttributes(dpy, c->win, CWBackPixel, &swa); + sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_EMBEDDED_NOTIFY, 0 , systray->win, XEMBED_EMBEDDED_VERSION); + XSync(dpy, False); + setclientstate(c, NormalState); + } + return; + } + + if (!c) + return; + if (cme->message_type == netatom[NetWMState]) { + if (cme->data.l[1] == netatom[NetWMFullscreen] + || cme->data.l[2] == netatom[NetWMFullscreen]) { + if (c->fakefullscreen == 2 && c->isfullscreen) + c->fakefullscreen = 3; + setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD */ + || (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ + && !c->isfullscreen + ))); + } + } else if (cme->message_type == netatom[NetActiveWindow]) { + if (c != selmon->sel && !c->isurgent) + seturgent(c, 1); + } +} + +void +configure(Client *c) +{ + XConfigureEvent ce; + + ce.type = ConfigureNotify; + ce.display = dpy; + ce.event = c->win; + ce.window = c->win; + ce.x = c->x; + ce.y = c->y; + ce.width = c->w; + ce.height = c->h; + ce.border_width = c->bw; + ce.above = None; + ce.override_redirect = False; + XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce); +} + +void +configurenotify(XEvent *e) +{ + Monitor *m; + Bar *bar; + Client *c; + XConfigureEvent *ev = &e->xconfigure; + int dirty; + /* TODO: updategeom handling sucks, needs to be simplified */ + if (ev->window == root) { + dirty = (sw != ev->width || sh != ev->height); + sw = ev->width; + sh = ev->height; + if (updategeom() || dirty) { + drw_resize(drw, sw, sh); + updatebars(); + for (m = mons; m; m = m->next) { + for (c = m->clients; c; c = c->next) + if (c->isfullscreen && c->fakefullscreen != 1) + resizeclient(c, m->mx, m->my, m->mw, m->mh); + for (bar = m->bar; bar; bar = bar->next) + XMoveResizeWindow(dpy, bar->win, bar->bx, bar->by, bar->bw, bar->bh); + } + focus(NULL); + arrange(NULL); + } + } +} + +void +configurerequest(XEvent *e) +{ + Client *c; + Monitor *m; + XConfigureRequestEvent *ev = &e->xconfigurerequest; + XWindowChanges wc; + + if (ignoreconfigurerequests) + return; + + if ((c = wintoclient(ev->window))) { + if (ev->value_mask & CWBorderWidth) + c->bw = ev->border_width; + else if (c->isfloating || !selmon->lt[selmon->sellt]->arrange) { + m = c->mon; + if (!c->issteam) { + if (ev->value_mask & CWX) { + c->oldx = c->x; + c->x = m->mx + ev->x; + } + if (ev->value_mask & CWY) { + c->oldy = c->y; + c->y = m->my + ev->y; + } + } + if (ev->value_mask & CWWidth) { + c->oldw = c->w; + c->w = ev->width; + } + if (ev->value_mask & CWHeight) { + c->oldh = c->h; + c->h = ev->height; + } + if ((c->x + c->w) > m->mx + m->mw && c->isfloating) + c->x = m->mx + (m->mw / 2 - WIDTH(c) / 2); /* center in x direction */ + if ((c->y + c->h) > m->my + m->mh && c->isfloating) + c->y = m->my + (m->mh / 2 - HEIGHT(c) / 2); /* center in y direction */ + if ((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight))) + configure(c); + if (ISVISIBLE(c)) + XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); + } else + configure(c); + } else { + wc.x = ev->x; + wc.y = ev->y; + wc.width = ev->width; + wc.height = ev->height; + wc.border_width = ev->border_width; + wc.sibling = ev->above; + wc.stack_mode = ev->detail; + XConfigureWindow(dpy, ev->window, ev->value_mask, &wc); + } + XSync(dpy, False); +} + +Monitor * +createmon(void) +{ + Monitor *m, *mon; + int i, n, mi, max_bars = 2, istopbar = topbar; + + const BarRule *br; + Bar *bar; + + m = ecalloc(1, sizeof(Monitor)); + m->tagset[0] = m->tagset[1] = 1; + m->mfact = mfact; + m->nmaster = nmaster; + m->showbar = showbar; + m->gappih = gappih; + m->gappiv = gappiv; + m->gappoh = gappoh; + m->gappov = gappov; + for (mi = 0, mon = mons; mon; mon = mon->next, mi++); // monitor index + m->index = mi; + m->lt[0] = &layouts[0]; + m->lt[1] = &layouts[1 % LENGTH(layouts)]; + strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); + + /* Derive the number of bars for this monitor based on bar rules */ + for (n = -1, i = 0; i < LENGTH(barrules); i++) { + br = &barrules[i]; + if (br->monitor == 'A' || br->monitor == -1 || br->monitor == mi) + n = MAX(br->bar, n); + } + + m->bar = NULL; + for (i = 0; i <= n && i < max_bars; i++) { + bar = ecalloc(1, sizeof(Bar)); + bar->mon = m; + bar->idx = i; + bar->next = m->bar; + bar->topbar = istopbar; + m->bar = bar; + istopbar = !istopbar; + bar->showbar = 1; + bar->external = 0; + bar->borderpx = 0; + bar->bh = bh + bar->borderpx * 2; + bar->borderscheme = SchemeNorm; + } + + + if (!(m->pertag = (Pertag *)calloc(1, sizeof(Pertag)))) + die("fatal: could not malloc() %u bytes\n", sizeof(Pertag)); + m->pertag->curtag = m->pertag->prevtag = 1; + for (i = 0; i <= NUMTAGS; i++) { + + /* init nmaster */ + m->pertag->nmasters[i] = m->nmaster; + + /* init mfacts */ + m->pertag->mfacts[i] = m->mfact; + + + + /* init layouts */ + m->pertag->ltidxs[i][0] = m->lt[0]; + m->pertag->ltidxs[i][1] = m->lt[1]; + m->pertag->sellts[i] = m->sellt; + + } + return m; +} + +void +destroynotify(XEvent *e) +{ + Client *c; + XDestroyWindowEvent *ev = &e->xdestroywindow; + + if ((c = wintoclient(ev->window))) + unmanage(c, 1); + else if ((c = swallowingclient(ev->window))) + unmanage(c->swallowing, 1); + else if (showsystray && (c = wintosystrayicon(ev->window))) { + removesystrayicon(c); + drawbarwin(systray->bar); + } +} + +void +detach(Client *c) +{ + Client **tc; + + for (tc = &c->mon->clients; *tc && *tc != c; tc = &(*tc)->next); + *tc = c->next; +} + +void +detachstack(Client *c) +{ + Client **tc, *t; + + for (tc = &c->mon->stack; *tc && *tc != c; tc = &(*tc)->snext); + *tc = c->snext; + + if (c == c->mon->sel) { + for (t = c->mon->stack; t && !ISVISIBLE(t); t = t->snext); + c->mon->sel = t; + } +} + +Monitor * +dirtomon(int dir) +{ + Monitor *m = NULL; + + if (dir > 0) { + if (!(m = selmon->next)) + m = mons; + } else if (selmon == mons) + for (m = mons; m->next; m = m->next); + else + for (m = mons; m->next != selmon; m = m->next); + return m; +} + +void +drawbar(Monitor *m) +{ + Bar *bar; + for (bar = m->bar; bar; bar = bar->next) + drawbarwin(bar); +} + +void +drawbars(void) +{ + Monitor *m; + for (m = mons; m; m = m->next) + drawbar(m); +} + +void +drawbarwin(Bar *bar) +{ + if (!bar || !bar->win || bar->external) + return; + int r, w, total_drawn = 0; + int rx, lx, rw, lw; // bar size, split between left and right if a center module is added + const BarRule *br; + + if (bar->borderpx) { + XSetForeground(drw->dpy, drw->gc, scheme[bar->borderscheme][ColBorder].pixel); + XFillRectangle(drw->dpy, drw->drawable, drw->gc, 0, 0, bar->bw, bar->bh); + } + + BarArg warg = { 0 }; + BarArg darg = { 0 }; + warg.h = bar->bh - 2 * bar->borderpx; + + rw = lw = bar->bw - 2 * bar->borderpx; + rx = lx = bar->borderpx; + + drw_setscheme(drw, scheme[SchemeNorm]); + drw_rect(drw, lx, bar->borderpx, lw, bar->bh - 2 * bar->borderpx, 1, 1); + for (r = 0; r < LENGTH(barrules); r++) { + br = &barrules[r]; + if (br->bar != bar->idx || !br->widthfunc || (br->monitor == 'A' && bar->mon != selmon)) + continue; + if (br->monitor != 'A' && br->monitor != -1 && br->monitor != bar->mon->index) + continue; + drw_setscheme(drw, scheme[SchemeNorm]); + warg.w = (br->alignment < BAR_ALIGN_RIGHT_LEFT ? lw : rw); + + w = br->widthfunc(bar, &warg); + w = MIN(warg.w, w); + + if (lw <= 0) { // if left is exhausted then switch to right side, and vice versa + lw = rw; + lx = rx; + } else if (rw <= 0) { + rw = lw; + rx = lx; + } + + switch(br->alignment) { + default: + case BAR_ALIGN_NONE: + case BAR_ALIGN_LEFT_LEFT: + case BAR_ALIGN_LEFT: + bar->x[r] = lx; + if (lx == rx) { + rx += w; + rw -= w; + } + lx += w; + lw -= w; + break; + case BAR_ALIGN_LEFT_RIGHT: + case BAR_ALIGN_RIGHT: + bar->x[r] = lx + lw - w; + if (lx == rx) + rw -= w; + lw -= w; + break; + case BAR_ALIGN_LEFT_CENTER: + case BAR_ALIGN_CENTER: + bar->x[r] = lx + lw / 2 - w / 2; + if (lx == rx) { + rw = rx + rw - bar->x[r] - w; + rx = bar->x[r] + w; + } + lw = bar->x[r] - lx; + break; + case BAR_ALIGN_RIGHT_LEFT: + bar->x[r] = rx; + if (lx == rx) { + lx += w; + lw -= w; + } + rx += w; + rw -= w; + break; + case BAR_ALIGN_RIGHT_RIGHT: + bar->x[r] = rx + rw - w; + if (lx == rx) + lw -= w; + rw -= w; + break; + case BAR_ALIGN_RIGHT_CENTER: + bar->x[r] = rx + rw / 2 - w / 2; + if (lx == rx) { + lw = lx + lw - bar->x[r] + w; + lx = bar->x[r] + w; + } + rw = bar->x[r] - rx; + break; + } + bar->w[r] = w; + darg.x = bar->x[r]; + darg.y = bar->borderpx; + darg.h = bar->bh - 2 * bar->borderpx; + darg.w = bar->w[r]; + if (br->drawfunc) + total_drawn += br->drawfunc(bar, &darg); + } + + if (total_drawn == 0 && bar->showbar) { + bar->showbar = 0; + updatebarpos(bar->mon); + XMoveResizeWindow(dpy, bar->win, bar->bx, bar->by, bar->bw, bar->bh); + arrange(bar->mon); + } + else if (total_drawn > 0 && !bar->showbar) { + bar->showbar = 1; + updatebarpos(bar->mon); + XMoveResizeWindow(dpy, bar->win, bar->bx, bar->by, bar->bw, bar->bh); + drw_map(drw, bar->win, 0, 0, bar->bw, bar->bh); + arrange(bar->mon); + } else + drw_map(drw, bar->win, 0, 0, bar->bw, bar->bh); +} + +void +enternotify(XEvent *e) +{ + Client *c; + Monitor *m; + XCrossingEvent *ev = &e->xcrossing; + + if ((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root) + return; + c = wintoclient(ev->window); + m = c ? c->mon : wintomon(ev->window); + if (m != selmon) { + unfocus(selmon->sel, 1, c); + selmon = m; + } else if (!c || c == selmon->sel) + return; + focus(c); +} + +void +expose(XEvent *e) +{ + Monitor *m; + XExposeEvent *ev = &e->xexpose; + + if (ev->count == 0 && (m = wintomon(ev->window))) { + drawbar(m); + } +} + +void +focus(Client *c) +{ + if (!c || !ISVISIBLE(c)) + for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); + if (selmon->sel && selmon->sel != c) + unfocus(selmon->sel, 0, c); + if (c) { + if (c->mon != selmon) + selmon = c->mon; + if (c->isurgent) + seturgent(c, 0); + detachstack(c); + attachstack(c); + grabbuttons(c, 1); + if (c->isfloating) + XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColFloat].pixel); + else + XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); + setfocus(c); + } else { + XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); + XDeleteProperty(dpy, root, netatom[NetActiveWindow]); + } + selmon->sel = c; + drawbars(); + +} + +/* there are some broken focus acquiring clients needing extra handling */ +void +focusin(XEvent *e) +{ + XFocusChangeEvent *ev = &e->xfocus; + + if (selmon->sel && ev->window != selmon->sel->win) + setfocus(selmon->sel); +} + +void +focusmon(const Arg *arg) +{ + Monitor *m; + + if (!mons->next) + return; + if ((m = dirtomon(arg->i)) == selmon) + return; + unfocus(selmon->sel, 0, NULL); + selmon = m; + focus(NULL); +} + +void +focusstack(const Arg *arg) +{ + Client *c = NULL, *i; + + if (!selmon->sel || (selmon->sel->isfullscreen && !selmon->sel->fakefullscreen)) + return; + if (arg->i > 0) { + for (c = selmon->sel->next; c && (!ISVISIBLE(c) || (arg->i == 1 && HIDDEN(c))); c = c->next); + if (!c) + for (c = selmon->clients; c && (!ISVISIBLE(c) || (arg->i == 1 && HIDDEN(c))); c = c->next); + } else { + for (i = selmon->clients; i != selmon->sel; i = i->next) + if (ISVISIBLE(i) && !(arg->i == -1 && HIDDEN(i))) + c = i; + if (!c) + for (; i; i = i->next) + if (ISVISIBLE(i) && !(arg->i == -1 && HIDDEN(i))) + c = i; + } + if (c) { + focus(c); + restack(selmon); + } +} + +Atom +getatomprop(Client *c, Atom prop) +{ + int di; + unsigned long dl; + unsigned char *p = NULL; + Atom da, atom = None; + + /* FIXME getatomprop should return the number of items and a pointer to + * the stored data instead of this workaround */ + Atom req = XA_ATOM; + if (prop == xatom[XembedInfo]) + req = xatom[XembedInfo]; + + if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, req, + &da, &di, &dl, &dl, &p) == Success && p) { + atom = *(Atom *)p; + if (da == xatom[XembedInfo] && dl == 2) + atom = ((Atom *)p)[1]; + XFree(p); + } + return atom; +} + +int +getrootptr(int *x, int *y) +{ + int di; + unsigned int dui; + Window dummy; + + return XQueryPointer(dpy, root, &dummy, &dummy, x, y, &di, &di, &dui); +} + +long +getstate(Window w) +{ + int format; + long result = -1; + unsigned char *p = NULL; + unsigned long n, extra; + Atom real; + + if (XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState], + &real, &format, &n, &extra, (unsigned char **)&p) != Success) + return -1; + if (n != 0) + result = *p; + XFree(p); + return result; +} + +int +gettextprop(Window w, Atom atom, char *text, unsigned int size) +{ + char **list = NULL; + int n; + XTextProperty name; + + if (!text || size == 0) + return 0; + text[0] = '\0'; + if (!XGetTextProperty(dpy, w, &name, atom) || !name.nitems) + return 0; + if (name.encoding == XA_STRING) + strncpy(text, (char *)name.value, size - 1); + else { + if (XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success && n > 0 && *list) { + strncpy(text, *list, size - 1); + XFreeStringList(list); + } + } + text[size - 1] = '\0'; + XFree(name.value); + return 1; +} + +void +grabbuttons(Client *c, int focused) +{ + updatenumlockmask(); + { + unsigned int i, j; + unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; + XUngrabButton(dpy, AnyButton, AnyModifier, c->win); + if (!focused) + XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, + BUTTONMASK, GrabModeSync, GrabModeSync, None, None); + for (i = 0; i < LENGTH(buttons); i++) + if (buttons[i].click == ClkClientWin + ) + for (j = 0; j < LENGTH(modifiers); j++) + XGrabButton(dpy, buttons[i].button, + buttons[i].mask | modifiers[j], + c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + } +} + +void +grabkeys(void) +{ + updatenumlockmask(); + { + unsigned int i, j; + unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; + KeyCode code; + + XUngrabKey(dpy, AnyKey, AnyModifier, root); + for (i = 0; i < LENGTH(keys); i++) + if ((code = XKeysymToKeycode(dpy, keys[i].keysym))) + for (j = 0; j < LENGTH(modifiers); j++) + XGrabKey(dpy, code, keys[i].mod | modifiers[j], root, + True, GrabModeAsync, GrabModeAsync); + } +} + +void +incnmaster(const Arg *arg) +{ + selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0); + arrange(selmon); +} + +#ifdef XINERAMA +static int +isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) +{ + while (n--) + if (unique[n].x_org == info->x_org && unique[n].y_org == info->y_org + && unique[n].width == info->width && unique[n].height == info->height) + return 0; + return 1; +} +#endif /* XINERAMA */ + +void +keypress(XEvent *e) +{ + unsigned int i; + int keysyms_return; + KeySym* keysym; + XKeyEvent *ev; + + ev = &e->xkey; + keysym = XGetKeyboardMapping(dpy, (KeyCode)ev->keycode, 1, &keysyms_return); + for (i = 0; i < LENGTH(keys); i++) + if (*keysym == keys[i].keysym + && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) + && keys[i].func) + keys[i].func(&(keys[i].arg)); + XFree(keysym); +} + +void +killclient(const Arg *arg) +{ + if (!selmon->sel || selmon->sel->ispermanent) + return; + if (!sendevent(selmon->sel->win, wmatom[WMDelete], NoEventMask, wmatom[WMDelete], CurrentTime, 0, 0, 0)) + { + XGrabServer(dpy); + XSetErrorHandler(xerrordummy); + XSetCloseDownMode(dpy, DestroyAll); + XKillClient(dpy, selmon->sel->win); + XSync(dpy, False); + XSetErrorHandler(xerror); + XUngrabServer(dpy); + } +} + +void +manage(Window w, XWindowAttributes *wa) +{ + Client *c, *t = NULL; + Client *term = 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; + c->w = c->oldw = wa->width; + c->h = c->oldh = wa->height; + c->oldbw = wa->border_width; + updatetitle(c); + + + if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) { + c->mon = t->mon; + c->tags = t->tags; + c->bw = borderpx; + c->x = t->x + WIDTH(t) / 2 - WIDTH(c) / 2; + c->y = t->y + HEIGHT(t) / 2 - HEIGHT(c) / 2; + } else { + c->mon = selmon; + if (c->x == c->mon->wx && c->y == c->mon->wy) + c->iscentered = 1; + c->bw = borderpx; + applyrules(c); + term = termforwin(c); + if (term) + c->mon = term->mon; + } + + if (c->x + WIDTH(c) > c->mon->mx + c->mon->mw) + c->x = c->mon->mx + c->mon->mw - WIDTH(c); + if (c->y + HEIGHT(c) > c->mon->my + c->mon->mh) + c->y = c->mon->my + c->mon->mh - HEIGHT(c); + c->x = MAX(c->x, c->mon->mx); + /* only fix client y-offset, if the client center might cover the bar */ + c->y = MAX(c->y, ((!c->mon->bar || c->mon->bar->by == c->mon->my) && (c->x + (c->w / 2) >= c->mon->wx) + && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my); + + wc.border_width = c->bw; + XConfigureWindow(dpy, w, CWBorderWidth, &wc); + if (c->isfloating) + XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColFloat].pixel); + else + XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); + configure(c); /* propagates border_width, if size doesn't change */ + updatesizehints(c); + if (getatomprop(c, netatom[NetWMState]) == netatom[NetWMFullscreen]) + setfullscreen(c, 1); + updatewmhints(c); + updatemotifhints(c); + + c->sfx = -9999; + c->sfy = -9999; + if (c->iscentered) { + c->sfx = c->x = c->mon->wx + (c->mon->ww - WIDTH(c)) / 2; + c->sfy = c->y = c->mon->wy + (c->mon->wh - HEIGHT(c)) / 2; + } + c->sfw = c->w; + c->sfh = c->h; + + XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); + grabbuttons(c, 0); + + if (!c->isfloating) + c->isfloating = c->oldstate = trans != None || c->isfixed; + if (c->isfloating) { + XRaiseWindow(dpy, c->win); + XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColFloat].pixel); + } + attach(c); + attachstack(c); + XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, + (unsigned char *) &(c->win), 1); + XChangeProperty(dpy, root, netatom[NetClientListStacking], XA_WINDOW, 32, PropModePrepend, + (unsigned char *) &(c->win), 1); + XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */ + + if (!HIDDEN(c)) + setclientstate(c, NormalState); + if (c->mon == selmon) + unfocus(selmon->sel, 0, c); + c->mon->sel = c; + if (!(term && swallow(term, c))) { + arrange(c->mon); + if (!HIDDEN(c)) + XMapWindow(dpy, c->win); + } + focus(NULL); + + setfloatinghint(c); +} + +void +mappingnotify(XEvent *e) +{ + XMappingEvent *ev = &e->xmapping; + + XRefreshKeyboardMapping(ev); + if (ev->request == MappingKeyboard) + grabkeys(); +} + +void +maprequest(XEvent *e) +{ + static XWindowAttributes wa; + XMapRequestEvent *ev = &e->xmaprequest; + + Client *i; + if (showsystray && systray && (i = wintosystrayicon(ev->window))) { + sendevent(i->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0, systray->win, XEMBED_EMBEDDED_VERSION); + drawbarwin(systray->bar); + } + + if (!XGetWindowAttributes(dpy, ev->window, &wa)) + return; + if (wa.override_redirect) + return; + if (!wintoclient(ev->window)) + manage(ev->window, &wa); +} + +void +motionnotify(XEvent *e) +{ + static Monitor *mon = NULL; + Monitor *m; + XMotionEvent *ev = &e->xmotion; + + if (ev->window != root) + return; + if ((m = recttomon(ev->x_root, ev->y_root, 1, 1)) != mon && mon) { + unfocus(selmon->sel, 1, NULL); + selmon = m; + focus(NULL); + } + mon = m; +} + +void +movemouse(const Arg *arg) +{ + int x, y, ocx, ocy, nx, ny; + Client *c; + Monitor *m; + XEvent ev; + Time lasttime = 0; + + if (!(c = selmon->sel)) + return; + if (c->isfullscreen && c->fakefullscreen != 1) /* no support moving fullscreen windows by mouse */ + return; + restack(selmon); + ocx = c->x; + ocy = c->y; + if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, + None, cursor[CurMove]->cursor, CurrentTime) != GrabSuccess) + return; + if (!getrootptr(&x, &y)) + return; + ignoreconfigurerequests = 1; + do { + XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); + switch(ev.type) { + case ConfigureRequest: + case Expose: + case MapRequest: + handler[ev.type](&ev); + break; + case MotionNotify: + if ((ev.xmotion.time - lasttime) <= (1000 / 60)) + continue; + lasttime = ev.xmotion.time; + + nx = ocx + (ev.xmotion.x - x); + ny = ocy + (ev.xmotion.y - y); + if (abs(selmon->wx - nx) < snap) + nx = selmon->wx; + else if (abs((selmon->wx + selmon->ww) - (nx + WIDTH(c))) < snap) + nx = selmon->wx + selmon->ww - WIDTH(c); + if (abs(selmon->wy - ny) < snap) + ny = selmon->wy; + else if (abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap) + ny = selmon->wy + selmon->wh - HEIGHT(c); + if (!c->isfloating && selmon->lt[selmon->sellt]->arrange + && (abs(nx - c->x) > snap || abs(ny - c->y) > snap)) { + c->sfx = -9999; // disable savefloats when using movemouse + togglefloating(NULL); + } + if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) { + resize(c, nx, ny, c->w, c->h, 1); + /* save last known float coordinates */ + c->sfx = nx; + c->sfy = ny; + } + break; + } + } while (ev.type != ButtonRelease); + XUngrabPointer(dpy, CurrentTime); + if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { + sendmon(c, m); + selmon = m; + focus(NULL); + } + ignoreconfigurerequests = 0; +} + +Client * +nexttiled(Client *c) +{ + for (; c && (c->isfloating || !ISVISIBLE(c) || HIDDEN(c)); c = c->next); + return c; +} + +void +pop(Client *c) +{ + detach(c); + attach(c); + focus(c); + arrange(c->mon); +} + +void +propertynotify(XEvent *e) +{ + Client *c; + Window trans; + XPropertyEvent *ev = &e->xproperty; + + if (showsystray && (c = wintosystrayicon(ev->window))) { + if (ev->atom == XA_WM_NORMAL_HINTS) { + updatesizehints(c); + updatesystrayicongeom(c, c->w, c->h); + } + else + updatesystrayiconstate(c, ev); + drawbarwin(systray->bar); + } + + if ((ev->window == root) && (ev->atom == XA_WM_NAME)) { + updatestatus(); + } else if (ev->state == PropertyDelete) { + return; /* ignore */ + } else if ((c = wintoclient(ev->window))) { + switch(ev->atom) { + default: break; + case XA_WM_TRANSIENT_FOR: + if (!c->isfloating && (XGetTransientForHint(dpy, c->win, &trans)) && + (c->isfloating = (wintoclient(trans)) != NULL)) + arrange(c->mon); + break; + case XA_WM_NORMAL_HINTS: + updatesizehints(c); + break; + case XA_WM_HINTS: + updatewmhints(c); + if (c->isurgent) + drawbars(); + break; + } + if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) { + updatetitle(c); + if (c == c->mon->sel) + drawbar(c->mon); + } + if (ev->atom == motifatom) + updatemotifhints(c); + } +} + +void +quit(const Arg *arg) +{ + running = 0; + +} + +Monitor * +recttomon(int x, int y, int w, int h) +{ + Monitor *m, *r = selmon; + int a, area = 0; + + for (m = mons; m; m = m->next) + if ((a = INTERSECT(x, y, w, h, m)) > area) { + area = a; + r = m; + } + return r; +} + +void +resize(Client *c, int x, int y, int w, int h, int interact) +{ + if (applysizehints(c, &x, &y, &w, &h, interact)) + resizeclient(c, x, y, w, h); +} + +void +resizeclient(Client *c, int x, int y, int w, int h) +{ + XWindowChanges wc; + + c->oldx = c->x; c->x = wc.x = x; + c->oldy = c->y; c->y = wc.y = y; + c->oldw = c->w; c->w = wc.width = w; + c->oldh = c->h; c->h = wc.height = h; + wc.border_width = c->bw; + XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); + configure(c); + XSync(dpy, False); +} + +void +resizemouse(const Arg *arg) +{ + int ocx, ocy, nw, nh; + int opx, opy, och, ocw, nx, ny; + int horizcorner, vertcorner; + unsigned int dui; + Window dummy; + Client *c; + Monitor *m; + XEvent ev; + Time lasttime = 0; + + if (!(c = selmon->sel)) + return; + if (c->isfullscreen && c->fakefullscreen != 1) /* no support resizing fullscreen windows by mouse */ + return; + restack(selmon); + ocx = c->x; + ocy = c->y; + och = c->h; + ocw = c->w; + if (!XQueryPointer(dpy, c->win, &dummy, &dummy, &opx, &opy, &nx, &ny, &dui)) + return; + horizcorner = nx < c->w / 2; + vertcorner = ny < c->h / 2; + if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, + None, cursor[horizcorner | (vertcorner << 1)]->cursor, CurrentTime) != GrabSuccess) + return; + ignoreconfigurerequests = 1; + do { + XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); + switch(ev.type) { + case ConfigureRequest: + case Expose: + case MapRequest: + handler[ev.type](&ev); + break; + case MotionNotify: + if ((ev.xmotion.time - lasttime) <= (1000 / 60)) + continue; + lasttime = ev.xmotion.time; + + nx = horizcorner ? (ocx + ev.xmotion.x - opx) : c->x; + ny = vertcorner ? (ocy + ev.xmotion.y - opy) : c->y; + nw = MAX(horizcorner ? (ocx + ocw - nx) : (ocw + (ev.xmotion.x - opx)), 1); + nh = MAX(vertcorner ? (ocy + och - ny) : (och + (ev.xmotion.y - opy)), 1); + if (c->mon->wx + nw >= selmon->wx && c->mon->wx + nw <= selmon->wx + selmon->ww + && c->mon->wy + nh >= selmon->wy && c->mon->wy + nh <= selmon->wy + selmon->wh) + { + if (!c->isfloating && selmon->lt[selmon->sellt]->arrange + && (abs(nw - c->w) > snap || abs(nh - c->h) > snap)) { + c->sfx = -9999; // disable savefloats when using resizemouse + togglefloating(NULL); + } + } + if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) { + resizeclient(c, nx, ny, nw, nh); + /* save last known float dimensions */ + c->sfx = nx; + c->sfy = ny; + c->sfw = nw; + c->sfh = nh; + } + break; + } + } while (ev.type != ButtonRelease); + XUngrabPointer(dpy, CurrentTime); + while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); + if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { + sendmon(c, m); + selmon = m; + focus(NULL); + } + ignoreconfigurerequests = 0; +} + +void +restack(Monitor *m) +{ + Client *c; + XEvent ev; + XWindowChanges wc; + + drawbar(m); + if (!m->sel) + return; + if (m->sel->isfloating || !m->lt[m->sellt]->arrange) + XRaiseWindow(dpy, m->sel->win); + if (m->lt[m->sellt]->arrange && m->bar) { + wc.stack_mode = Below; + wc.sibling = m->bar->win; + for (c = m->stack; c; c = c->snext) + if (!c->isfloating && ISVISIBLE(c)) { + XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc); + wc.sibling = c->win; + } + } + XSync(dpy, False); + while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); +} + +void +run(void) +{ + XEvent ev; + /* main event loop */ + XSync(dpy, False); + while (running && !XNextEvent(dpy, &ev)) { + + + if (handler[ev.type]) + handler[ev.type](&ev); /* call handler */ + } +} + +void +scan(void) +{ + scanner = 1; + char swin[256]; + unsigned int i, num; + Window d1, d2, *wins = NULL; + XWindowAttributes wa; + + if (XQueryTree(dpy, root, &d1, &d2, &wins, &num)) { + for (i = 0; i < num; i++) { + if (!XGetWindowAttributes(dpy, wins[i], &wa) + || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) + 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)) + continue; + if (XGetTransientForHint(dpy, wins[i], &d1) + && (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)) + manage(wins[i], &wa); + } + XFree(wins); + } + scanner = 0; +} + +void +sendmon(Client *c, Monitor *m) +{ + if (c->mon == m) + return; + unfocus(c, 1, NULL); + detach(c); + detachstack(c); + c->mon = m; + c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ + attach(c); + attachstack(c); + focus(NULL); + arrange(NULL); + if (c->switchtag) + c->switchtag = 0; +} + +void +setclientstate(Client *c, long state) +{ + long data[] = { state, None }; + + XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32, + PropModeReplace, (unsigned char *)data, 2); +} + +int +sendevent(Window w, Atom proto, int mask, long d0, long d1, long d2, long d3, long d4) +{ + int n; + Atom *protocols; + Atom mt; + int exists = 0; + XEvent ev; + + if (proto == wmatom[WMTakeFocus] || proto == wmatom[WMDelete]) { + mt = wmatom[WMProtocols]; + if (XGetWMProtocols(dpy, w, &protocols, &n)) { + while (!exists && n--) + exists = protocols[n] == proto; + XFree(protocols); + } + } else { + exists = True; + mt = proto; + } + + if (exists) { + ev.type = ClientMessage; + ev.xclient.window = w; + ev.xclient.message_type = mt; + ev.xclient.format = 32; + ev.xclient.data.l[0] = d0; + ev.xclient.data.l[1] = d1; + ev.xclient.data.l[2] = d2; + ev.xclient.data.l[3] = d3; + ev.xclient.data.l[4] = d4; + XSendEvent(dpy, w, False, mask, &ev); + } + return exists; +} + +void +setfocus(Client *c) +{ + if (!c->neverfocus) { + XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); + XChangeProperty(dpy, root, netatom[NetActiveWindow], + XA_WINDOW, 32, PropModeReplace, + (unsigned char *) &(c->win), 1); + } + sendevent(c->win, wmatom[WMTakeFocus], NoEventMask, wmatom[WMTakeFocus], CurrentTime, 0, 0, 0); +} + +void +setfullscreen(Client *c, int fullscreen) +{ + XEvent ev; + int savestate = 0, restorestate = 0; + + if ((c->fakefullscreen == 0 && fullscreen && !c->isfullscreen) // normal fullscreen + || (c->fakefullscreen == 2 && fullscreen)) // fake fullscreen --> actual fullscreen + savestate = 1; // go actual fullscreen + else if ((c->fakefullscreen == 0 && !fullscreen && c->isfullscreen) // normal fullscreen exit + || (c->fakefullscreen >= 2 && !fullscreen)) // fullscreen exit --> fake fullscreen + restorestate = 1; // go back into tiled + + /* If leaving fullscreen and the window was previously fake fullscreen (2), then restore + * that while staying in fullscreen. The exception to this is if we are in said state, but + * the client itself disables fullscreen (3) then we let the client go out of fullscreen + * while keeping fake fullscreen enabled (as otherwise there will be a mismatch between the + * client and the window manager's perception of the client's fullscreen state). */ + if (c->fakefullscreen == 2 && !fullscreen && c->isfullscreen) { + c->fakefullscreen = 1; + c->isfullscreen = 1; + fullscreen = 1; + } else if (c->fakefullscreen == 3) // client exiting actual fullscreen + c->fakefullscreen = 1; + + if (fullscreen != c->isfullscreen) { // only send property change if necessary + if (fullscreen) + XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, + PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); + else + XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, + PropModeReplace, (unsigned char*)0, 0); + } + + c->isfullscreen = fullscreen; + + /* Some clients, e.g. firefox, will send a client message informing the window manager + * that it is going into fullscreen after receiving the above signal. This has the side + * effect of this function (setfullscreen) sometimes being called twice when toggling + * fullscreen on and off via the window manager as opposed to the application itself. + * To protect against obscure issues where the client settings are stored or restored + * when they are not supposed to we add an additional bit-lock on the old state so that + * settings can only be stored and restored in that precise order. */ + if (savestate && !(c->oldstate & (1 << 1))) { + c->oldbw = c->bw; + c->oldstate = c->isfloating | (1 << 1); + c->bw = 0; + c->isfloating = 1; + resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); + XRaiseWindow(dpy, c->win); + } else if (restorestate && (c->oldstate & (1 << 1))) { + c->bw = c->oldbw; + c->isfloating = c->oldstate = c->oldstate & 1; + c->x = c->oldx; + c->y = c->oldy; + c->w = c->oldw; + c->h = c->oldh; + resizeclient(c, c->x, c->y, c->w, c->h); + restack(c->mon); + } else + resizeclient(c, c->x, c->y, c->w, c->h); + + /* Exception: if the client was in actual fullscreen and we exit out to fake fullscreen + * mode, then the focus would sometimes drift to whichever window is under the mouse cursor + * at the time. To avoid this we ask X for all EnterNotify events and just ignore them. + */ + if (!c->isfullscreen) + while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); +} + +void +setlayout(const Arg *arg) +{ + if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) { + selmon->pertag->sellts[selmon->pertag->curtag] ^= 1; + selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; + } + if (arg && arg->v) + selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt] = (Layout *)arg->v; + selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; + + strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); + if (selmon->sel) + arrange(selmon); + else + drawbar(selmon); +} + +/* arg > 1.0 will set mfact absolutely */ +void +setmfact(const Arg *arg) +{ + float f; + + if (!arg || !selmon->lt[selmon->sellt]->arrange) + return; + f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; + if (f < 0.05 || f > 0.95) + return; + selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f; + arrange(selmon); +} + +void +setup(void) +{ + int i; + XSetWindowAttributes wa; + Atom utf8string; + + /* clean up any zombies immediately */ + sigchld(0); + + + /* init screen */ + screen = DefaultScreen(dpy); + sw = DisplayWidth(dpy, screen); + sh = DisplayHeight(dpy, screen); + root = RootWindow(dpy, screen); + xinitvisual(); + drw = drw_create(dpy, screen, root, sw, sh, visual, depth, cmap); + if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) + die("no fonts could be loaded."); + lrpad = drw->fonts->h; + bh = drw->fonts->h + 2; + updategeom(); + /* init atoms */ + utf8string = XInternAtom(dpy, "UTF8_STRING", False); + wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); + wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); + wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False); + wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); + wmatom[WMWindowRole] = XInternAtom(dpy, "WM_WINDOW_ROLE", False); + netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); + netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); + netatom[NetSystemTray] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_S0", False); + netatom[NetSystemTrayOP] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_OPCODE", False); + netatom[NetSystemTrayOrientation] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION", False); + netatom[NetSystemTrayOrientationHorz] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION_HORZ", False); + netatom[NetSystemTrayVisual] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_VISUAL", False); + netatom[NetWMWindowTypeDock] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DOCK", False); + xatom[Manager] = XInternAtom(dpy, "MANAGER", False); + xatom[Xembed] = XInternAtom(dpy, "_XEMBED", False); + xatom[XembedInfo] = XInternAtom(dpy, "_XEMBED_INFO", False); + netatom[NetDesktopViewport] = XInternAtom(dpy, "_NET_DESKTOP_VIEWPORT", False); + netatom[NetNumberOfDesktops] = XInternAtom(dpy, "_NET_NUMBER_OF_DESKTOPS", False); + netatom[NetCurrentDesktop] = XInternAtom(dpy, "_NET_CURRENT_DESKTOP", False); + netatom[NetDesktopNames] = XInternAtom(dpy, "_NET_DESKTOP_NAMES", False); + netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); + netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); + netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False); + netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False); + netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); + netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); + netatom[NetClientListStacking] = XInternAtom(dpy, "_NET_CLIENT_LIST_STACKING", False); + motifatom = XInternAtom(dpy, "_MOTIF_WM_HINTS", False); + /* init cursors */ + cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); + cursor[CurResize] = drw_cur_create(drw, XC_sizing); + cursor[CurResizeBR] = drw_cur_create(drw, XC_bottom_right_corner); + cursor[CurResizeBL] = drw_cur_create(drw, XC_bottom_left_corner); + cursor[CurResizeTR] = drw_cur_create(drw, XC_top_right_corner); + cursor[CurResizeTL] = drw_cur_create(drw, XC_top_left_corner); + cursor[CurMove] = drw_cur_create(drw, XC_fleur); + /* init appearance */ + scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); + for (i = 0; i < LENGTH(colors); i++) + scheme[i] = drw_scm_create(drw, colors[i], alphas[i], ColCount); + + updatebars(); + updatestatus(); + + /* supporting window for NetWMCheck */ + wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0); + XChangeProperty(dpy, wmcheckwin, netatom[NetWMCheck], XA_WINDOW, 32, + PropModeReplace, (unsigned char *) &wmcheckwin, 1); + XChangeProperty(dpy, wmcheckwin, netatom[NetWMName], utf8string, 8, + PropModeReplace, (unsigned char *) "dwm", 3); + XChangeProperty(dpy, root, netatom[NetWMCheck], XA_WINDOW, 32, + PropModeReplace, (unsigned char *) &wmcheckwin, 1); + /* EWMH support per view */ + XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, + PropModeReplace, (unsigned char *) netatom, NetLast); + setnumdesktops(); + setcurrentdesktop(); + setdesktopnames(); + setviewport(); + XDeleteProperty(dpy, root, netatom[NetClientList]); + XDeleteProperty(dpy, root, netatom[NetClientListStacking]); + /* select events */ + wa.cursor = cursor[CurNormal]->cursor; + wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask + |ButtonPressMask|PointerMotionMask|EnterWindowMask + |LeaveWindowMask|StructureNotifyMask|PropertyChangeMask; + XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa); + XSelectInput(dpy, root, wa.event_mask); + + + grabkeys(); + focus(NULL); +} + + +void +seturgent(Client *c, int urg) +{ + XWMHints *wmh; + + c->isurgent = urg; + if (!(wmh = XGetWMHints(dpy, c->win))) + return; + wmh->flags = urg ? (wmh->flags | XUrgencyHint) : (wmh->flags & ~XUrgencyHint); + XSetWMHints(dpy, c->win, wmh); + XFree(wmh); +} + +void +showhide(Client *c) +{ + if (!c) + return; + if (ISVISIBLE(c)) { + /* show clients top down */ + if (!c->mon->lt[c->mon->sellt]->arrange && c->sfx != -9999 && !c->isfullscreen) { + XMoveWindow(dpy, c->win, c->sfx, c->sfy); + resize(c, c->sfx, c->sfy, c->sfw, c->sfh, 0); + showhide(c->snext); + return; + } + XMoveWindow(dpy, c->win, c->x, c->y); + if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) + && !c->isfullscreen + ) + resize(c, c->x, c->y, c->w, c->h, 0); + showhide(c->snext); + } else { + /* hide clients bottom up */ + showhide(c->snext); + XMoveWindow(dpy, c->win, WIDTH(c) * -2, c->y); + } +} + +void +sigchld(int unused) +{ + if (signal(SIGCHLD, sigchld) == SIG_ERR) + die("can't install SIGCHLD handler:"); + while (0 < waitpid(-1, NULL, WNOHANG)); +} + +void +spawn(const Arg *arg) +{ + if (arg->v == dmenucmd) + dmenumon[0] = '0' + selmon->num; + + if (fork() == 0) + { + if (dpy) + close(ConnectionNumber(dpy)); + + setsid(); + execvp(((char **)arg->v)[0], (char **)arg->v); + fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]); + perror(" failed"); + exit(EXIT_SUCCESS); + } +} + +void +tag(const Arg *arg) +{ + + if (selmon->sel && arg->ui & TAGMASK) { + selmon->sel->tags = arg->ui & TAGMASK; + if (selmon->sel->switchtag) + selmon->sel->switchtag = 0; + focus(NULL); + arrange(selmon); + if ((arg->ui & TAGMASK) != selmon->tagset[selmon->seltags]) + view(arg); + } +} + +void +tagmon(const Arg *arg) +{ + Client *c = selmon->sel; + if (!c || !mons->next) + return; + if (c->isfullscreen) { + c->isfullscreen = 0; + sendmon(c, dirtomon(arg->i)); + c->isfullscreen = 1; + if (c->fakefullscreen != 1) { + resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); + XRaiseWindow(dpy, c->win); + } + } else + sendmon(c, dirtomon(arg->i)); +} + +void +togglebar(const Arg *arg) +{ + Bar *bar; + selmon->showbar = !selmon->showbar; + updatebarpos(selmon); + for (bar = selmon->bar; bar; bar = bar->next) + XMoveResizeWindow(dpy, bar->win, bar->bx, bar->by, bar->bw, bar->bh); + arrange(selmon); +} + +void +togglefloating(const Arg *arg) +{ + Client *c = selmon->sel; + if (arg && arg->v) + c = (Client*)arg->v; + if (!c) + return; + if (c->isfullscreen && c->fakefullscreen != 1) /* no support for fullscreen windows */ + return; + c->isfloating = !c->isfloating || c->isfixed; + if (c->isfloating) + XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColFloat].pixel); + else + XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); + if (c->isfloating) { + if (c->sfx != -9999) { + /* restore last known float dimensions */ + resize(c, c->sfx, c->sfy, c->sfw, c->sfh, 0); + } else + resize(c, c->x, c->y, c->w, c->h, 0); + } else { + /* save last known float dimensions */ + c->sfx = c->x; + c->sfy = c->y; + c->sfw = c->w; + c->sfh = c->h; + } + arrange(c->mon); + + setfloatinghint(c); +} + +void +toggletag(const Arg *arg) +{ + unsigned int newtags; + + if (!selmon->sel) + return; + newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); + if (newtags) { + selmon->sel->tags = newtags; + focus(NULL); + arrange(selmon); + } + updatecurrentdesktop(); +} + +void +toggleview(const Arg *arg) +{ + unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); + int i; + + + if (newtagset) { + selmon->tagset[selmon->seltags] = newtagset; + + if (newtagset == ~0) + { + selmon->pertag->prevtag = selmon->pertag->curtag; + selmon->pertag->curtag = 0; + } + /* test if the user did not select the same tag */ + if (!(newtagset & 1 << (selmon->pertag->curtag - 1))) { + selmon->pertag->prevtag = selmon->pertag->curtag; + for (i = 0; !(newtagset & 1 << i); i++) ; + selmon->pertag->curtag = i + 1; + } + + /* apply settings for this view */ + selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; + selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; + selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; + selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; + selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; + focus(NULL); + arrange(selmon); + } + updatecurrentdesktop(); +} + +void +unfocus(Client *c, int setfocus, Client *nextfocus) +{ + if (!c) + return; + grabbuttons(c, 0); + if (c->isfloating) + XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColFloat].pixel); + else + XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); + if (setfocus) { + XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); + XDeleteProperty(dpy, root, netatom[NetActiveWindow]); + } +} + +void +unmanage(Client *c, int destroyed) +{ + Monitor *m = c->mon; + unsigned int switchtag = c->switchtag; + 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) { + wc.border_width = c->oldbw; + XGrabServer(dpy); /* avoid race conditions */ + XSetErrorHandler(xerrordummy); + XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */ + XUngrabButton(dpy, AnyButton, AnyModifier, c->win); + setclientstate(c, WithdrawnState); + XSync(dpy, False); + XSetErrorHandler(xerror); + XUngrabServer(dpy); + } + + if (scratchpad_last_showed == c) + scratchpad_last_showed = NULL; + + free(c); + if (s) + return; + focus(NULL); + updateclientlist(); + arrange(m); + if (switchtag && ((switchtag & TAGMASK) != selmon->tagset[selmon->seltags])) + view(&((Arg) { .ui = switchtag })); +} + +void +unmapnotify(XEvent *e) +{ + Client *c; + XUnmapEvent *ev = &e->xunmap; + + if ((c = wintoclient(ev->window))) { + if (ev->send_event) + setclientstate(c, WithdrawnState); + else + unmanage(c, 0); + } else if (showsystray && (c = wintosystrayicon(ev->window))) { + /* KLUDGE! sometimes icons occasionally unmap their windows, but do + * _not_ destroy them. We map those windows back */ + XMapRaised(dpy, c->win); + removesystrayicon(c); + drawbarwin(systray->bar); + } +} + +void +updatebars(void) +{ + Bar *bar; + Monitor *m; + XSetWindowAttributes wa = { + .override_redirect = True, + .background_pixel = 0, + .border_pixel = 0, + .colormap = cmap, + .event_mask = ButtonPressMask|ExposureMask + }; + XClassHint ch = {"dwm", "dwm"}; + for (m = mons; m; m = m->next) { + for (bar = m->bar; bar; bar = bar->next) { + if (bar->external) + continue; + if (!bar->win) { + bar->win = XCreateWindow(dpy, root, bar->bx, bar->by, bar->bw, bar->bh, 0, depth, + InputOutput, visual, + CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &wa); + XDefineCursor(dpy, bar->win, cursor[CurNormal]->cursor); + XMapRaised(dpy, bar->win); + XSetClassHint(dpy, bar->win, &ch); + } + } + } +} + +void +updatebarpos(Monitor *m) +{ + + m->wx = m->mx; + m->wy = m->my; + m->ww = m->mw; + m->wh = m->mh; + Bar *bar; + int y_pad = 0; + int x_pad = 0; + + + for (bar = m->bar; bar; bar = bar->next) { + bar->bx = m->wx + x_pad; + bar->bw = m->ww - 2 * x_pad; + } + + for (bar = m->bar; bar; bar = bar->next) + if (!m->showbar || !bar->showbar) + bar->by = -bar->bh - y_pad; + + + if (!m->showbar) + return; + for (bar = m->bar; bar; bar = bar->next) { + if (!bar->showbar) + continue; + if (bar->topbar) + m->wy = m->wy + bar->bh + y_pad; + m->wh -= y_pad + bar->bh; + bar->by = (bar->topbar ? m->wy - bar->bh : m->wy + m->wh); + } +} + +void +updateclientlist() +{ + Client *c; + Monitor *m; + + XDeleteProperty(dpy, root, netatom[NetClientList]); + for (m = mons; m; m = m->next) + for (c = m->clients; c; c = c->next) + XChangeProperty(dpy, root, netatom[NetClientList], + XA_WINDOW, 32, PropModeAppend, + (unsigned char *) &(c->win), 1); + + XDeleteProperty(dpy, root, netatom[NetClientListStacking]); + for (m = mons; m; m = m->next) + for (c = m->stack; c; c = c->snext) + XChangeProperty(dpy, root, netatom[NetClientListStacking], + XA_WINDOW, 32, PropModeAppend, + (unsigned char *) &(c->win), 1); +} + +int +updategeom(void) +{ + int dirty = 0; + +#ifdef XINERAMA + if (XineramaIsActive(dpy)) { + int i, j, n, nn; + Client *c; + Monitor *m; + XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn); + XineramaScreenInfo *unique = NULL; + + for (n = 0, m = mons; m; m = m->next, n++); + /* only consider unique geometries as separate screens */ + unique = ecalloc(nn, sizeof(XineramaScreenInfo)); + for (i = 0, j = 0; i < nn; i++) + if (isuniquegeom(unique, j, &info[i])) + memcpy(&unique[j++], &info[i], sizeof(XineramaScreenInfo)); + XFree(info); + nn = j; + if (n <= nn) { /* new monitors available */ + for (i = 0; i < (nn - n); i++) { + for (m = mons; m && m->next; m = m->next); + if (m) + m->next = createmon(); + else + mons = createmon(); + } + for (i = 0, m = mons; i < nn && m; m = m->next, i++) { + if (i >= n + || unique[i].x_org != m->mx || unique[i].y_org != m->my + || unique[i].width != m->mw || unique[i].height != m->mh) + { + dirty = 1; + m->num = i; + m->mx = m->wx = unique[i].x_org; + m->my = m->wy = unique[i].y_org; + m->mw = m->ww = unique[i].width; + m->mh = m->wh = unique[i].height; + updatebarpos(m); + } + } + } else { /* less monitors available nn < n */ + for (i = nn; i < n; i++) { + for (m = mons; m && m->next; m = m->next); + while ((c = m->clients)) { + dirty = 1; + m->clients = c->next; + detachstack(c); + c->mon = mons; + attach(c); + attachstack(c); + } + if (m == selmon) + selmon = mons; + cleanupmon(m); + } + } + for (i = 0, m = mons; m; m = m->next, i++) + m->index = i; + free(unique); + } else +#endif /* XINERAMA */ + { /* default monitor setup */ + if (!mons) + mons = createmon(); + if (mons->mw != sw || mons->mh != sh) { + dirty = 1; + mons->mw = mons->ww = sw; + mons->mh = mons->wh = sh; + updatebarpos(mons); + } + } + if (dirty) { + selmon = mons; + selmon = wintomon(root); + } + return dirty; +} + +void +updatenumlockmask(void) +{ + unsigned int i, j; + XModifierKeymap *modmap; + + numlockmask = 0; + modmap = XGetModifierMapping(dpy); + for (i = 0; i < 8; i++) + for (j = 0; j < modmap->max_keypermod; j++) + if (modmap->modifiermap[i * modmap->max_keypermod + j] + == XKeysymToKeycode(dpy, XK_Num_Lock)) + numlockmask = (1 << i); + XFreeModifiermap(modmap); +} + +void +updatesizehints(Client *c) +{ + long msize; + XSizeHints size; + + if (!XGetWMNormalHints(dpy, c->win, &size, &msize)) + /* size is uninitialized, ensure that size.flags aren't used */ + size.flags = PSize; + if (size.flags & PBaseSize) { + c->basew = size.base_width; + c->baseh = size.base_height; + } else if (size.flags & PMinSize) { + c->basew = size.min_width; + c->baseh = size.min_height; + } else + c->basew = c->baseh = 0; + if (size.flags & PResizeInc) { + c->incw = size.width_inc; + c->inch = size.height_inc; + } else + c->incw = c->inch = 0; + if (size.flags & PMaxSize) { + c->maxw = size.max_width; + c->maxh = size.max_height; + } else + c->maxw = c->maxh = 0; + if (size.flags & PMinSize) { + c->minw = size.min_width; + c->minh = size.min_height; + } else if (size.flags & PBaseSize) { + c->minw = size.base_width; + c->minh = size.base_height; + } else + c->minw = c->minh = 0; + if (size.flags & PAspect) { + c->mina = (float)size.min_aspect.y / size.min_aspect.x; + c->maxa = (float)size.max_aspect.x / size.max_aspect.y; + } else + c->maxa = c->mina = 0.0; + c->isfixed = (c->maxw && c->maxh && c->maxw == c->minw && c->maxh == c->minh); +} + +void +updatestatus(void) +{ + Monitor *m; + if (!gettextprop(root, XA_WM_NAME, rawstext, sizeof(rawstext))) + strcpy(stext, "dwm-"VERSION); + else + copyvalidchars(stext, rawstext); + for (m = mons; m; m = m->next) + drawbar(m); +} + +void +updatetitle(Client *c) +{ + + if (!gettextprop(c->win, netatom[NetWMName], c->name, sizeof c->name)) + gettextprop(c->win, XA_WM_NAME, c->name, sizeof c->name); + if (c->name[0] == '\0') /* hack to mark broken clients */ + strcpy(c->name, broken); + +} + +void +updatewmhints(Client *c) +{ + XWMHints *wmh; + + if ((wmh = XGetWMHints(dpy, c->win))) { + if (c == selmon->sel && wmh->flags & XUrgencyHint) { + wmh->flags &= ~XUrgencyHint; + XSetWMHints(dpy, c->win, wmh); + } else + c->isurgent = (wmh->flags & XUrgencyHint) ? 1 : 0; + if (c->isurgent) { + if (c->isfloating) + XSetWindowBorder(dpy, c->win, scheme[SchemeUrg][ColFloat].pixel); + else + XSetWindowBorder(dpy, c->win, scheme[SchemeUrg][ColBorder].pixel); + } + if (wmh->flags & InputHint) + c->neverfocus = !wmh->input; + else + c->neverfocus = 0; + XFree(wmh); + } +} + +void +view(const Arg *arg) +{ + if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) + { + return; + } + selmon->seltags ^= 1; /* toggle sel tagset */ + pertagview(arg); + focus(NULL); + arrange(selmon); + updatecurrentdesktop(); +} + +Client * +wintoclient(Window w) +{ + Client *c; + Monitor *m; + + for (m = mons; m; m = m->next) + for (c = m->clients; c; c = c->next) + if (c->win == w) + return c; + return NULL; +} + +Monitor * +wintomon(Window w) +{ + int x, y; + Client *c; + Monitor *m; + Bar *bar; + + if (w == root && getrootptr(&x, &y)) + return recttomon(x, y, 1, 1); + for (m = mons; m; m = m->next) + for (bar = m->bar; bar; bar = bar->next) + if (w == bar->win) + return m; + if ((c = wintoclient(w))) + return c->mon; + return selmon; +} + +/* There's no way to check accesses to destroyed windows, thus those cases are + * ignored (especially on UnmapNotify's). Other types of errors call Xlibs + * default error handler, which may call exit. */ +int +xerror(Display *dpy, XErrorEvent *ee) +{ + if (ee->error_code == BadWindow + || (ee->request_code == X_SetInputFocus && ee->error_code == BadMatch) + || (ee->request_code == X_PolyText8 && ee->error_code == BadDrawable) + || (ee->request_code == X_PolyFillRectangle && ee->error_code == BadDrawable) + || (ee->request_code == X_PolySegment && ee->error_code == BadDrawable) + || (ee->request_code == X_ConfigureWindow && ee->error_code == BadMatch) + || (ee->request_code == X_GrabButton && ee->error_code == BadAccess) + || (ee->request_code == X_GrabKey && ee->error_code == BadAccess) + || (ee->request_code == X_CopyArea && ee->error_code == BadDrawable)) + return 0; + fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n", + ee->request_code, ee->error_code); + return xerrorxlib(dpy, ee); /* may call exit */ +} + +int +xerrordummy(Display *dpy, XErrorEvent *ee) +{ + return 0; +} + +/* Startup Error handler to check if another window manager + * is already running. */ +int +xerrorstart(Display *dpy, XErrorEvent *ee) +{ + die("dwm: another window manager is already running"); + return -1; +} + +void +zoom(const Arg *arg) +{ + Client *c = selmon->sel; + if (arg && arg->v) + c = (Client*)arg->v; + if (!c) + return; + + + + if (!c->mon->lt[c->mon->sellt]->arrange + || (c && c->isfloating) + ) + return; + + if (c == nexttiled(c->mon->clients)) + if (!c || !(c = nexttiled(c->next))) + return; + pop(c); +} + +int +main(int argc, char *argv[]) +{ + if (argc == 2 && !strcmp("-v", argv[1])) + die("dwm-"VERSION); + else if (argc != 1) + die("usage: dwm [-v]"); + if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) + 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__ + if (pledge("stdio rpath proc exec ps", NULL) == -1) + die("pledge"); +#endif /* __OpenBSD__ */ + scan(); + runautostart(); + run(); + cleanup(); + XCloseDisplay(dpy); + return EXIT_SUCCESS; +} + diff --git a/dwm.o b/dwm.o new file mode 100644 index 0000000000000000000000000000000000000000..121f1aa755ec8c95086df36b882bcdd42e34292a GIT binary patch literal 351280 zcmV)cK&ZceMNCEl0RaF2000000000106qW#000000000000000000000001RBn1Ef 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�nnHVlB=9+iviqSRc>7A{Ls7{M5xepI& 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 P7(W*0dqey5FCzaxM{=YJ literal 0 HcmV?d00001 diff --git a/dwm.png b/dwm.png new file mode 100644 index 0000000000000000000000000000000000000000..b1f9ba7e5f4cc7350ee2392ebcea5fcbe00fb49b GIT binary patch literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^2Y@($g9*gC@m3f}u_bxCyDx`7I;J! zGca%iWx0hJ8D`Cq01C2~c>21sUt<^MF=V?Ztt9{yk}YwKC~?lu%}vcKVQ?-=O)N=G zQ7F$W$xsN%NL6t6^bL5QqM8R(c+=CxF{I+w+q;fj4F)_6j>`Z3pZ>_($QEQ&92OXP z%lpEKGwG8$G-U1H{@Y%;mx-mNK|p|siBVAj$Z~Mt-~h6K0!}~{PyozQ07(f5fTdVi zm=-zT`NweeJ#%S&{fequZGmkDDC*%x$$Sa*fAP=$`nJkhx1Y~k<8b2;Hq)FOdV=P$ q&oWzoxz_&nv&n0)xBzV8k*jsxheTIy&cCY600f?{elF{r5}E*x)opSB literal 0 HcmV?d00001 diff --git a/patch/autostart.c b/patch/autostart.c new file mode 100644 index 0000000..03477bb --- /dev/null +++ b/patch/autostart.c @@ -0,0 +1,84 @@ +void +runautostart(void) +{ + char *pathpfx; + char *path; + char *xdgdatahome; + char *home; + + if ((home = getenv("HOME")) == NULL) + /* this is almost impossible */ + return; + + /* if $XDG_DATA_HOME is defined, use $XDG_DATA_HOME/dwm, + * otherwise use ~/.local/share/dwm as autostart script directory + */ + if ((xdgdatahome = getenv("XDG_DATA_HOME")) != NULL) { + /* space for path segments, separators and nul */ + if ((pathpfx = malloc(strlen(xdgdatahome) + strlen(dwmdir) + 2)) == NULL) + return; + + if (sprintf(pathpfx, "%s/%s", xdgdatahome, dwmdir) <= 0) { + free(pathpfx); + return; + } + } else { + /* space for path segments, separators and nul */ + if ((pathpfx = malloc(strlen(home) + strlen(localshare) + strlen(dwmdir) + 3)) == NULL) + return; + + if (sprintf(pathpfx, "%s/%s/%s", home, localshare, dwmdir) < 0) { + free(pathpfx); + return; + } + } + + /* check if the autostart script directory exists */ + struct stat sb; + + if (! (stat(pathpfx, &sb) == 0 && S_ISDIR(sb.st_mode))) { + /* the XDG conformant path does not exist or are not directories + * so we try ~/.dwm instead + */ + if (realloc(pathpfx, strlen(home) + strlen(dwmdir) + 3) == NULL) { + free(pathpfx); + return; + } + + if (sprintf(pathpfx, "%s/.%s", home, dwmdir) <= 0) { + free(pathpfx); + return; + } + } + + /* try the blocking script first */ + if ((path = malloc(strlen(pathpfx) + strlen(autostartblocksh) + 2)) == NULL) { + free(pathpfx); + return; + } else + if (sprintf(path, "%s/%s", pathpfx, autostartblocksh) <= 0) { + free(path); + free(pathpfx); + } + + if (access(path, X_OK) == 0) + system(path); + + /* now the non-blocking script */ + if ((path = realloc(path, strlen(pathpfx) + strlen(autostartsh) + 4)) == NULL) { + free(pathpfx); + free(path); + return; + } else + if (sprintf(path, "%s/%s", pathpfx, autostartsh) <= 0) { + free(path); + free(pathpfx); + } + + if (access(path, X_OK) == 0) { + system(strcat(path, " &")); + free(pathpfx); + free(path); + } +} + diff --git a/patch/autostart.h b/patch/autostart.h new file mode 100644 index 0000000..db29377 --- /dev/null +++ b/patch/autostart.h @@ -0,0 +1,2 @@ +static void runautostart(void); + diff --git a/patch/bar_alpha.c b/patch/bar_alpha.c new file mode 100644 index 0000000..465f6f2 --- /dev/null +++ b/patch/bar_alpha.c @@ -0,0 +1,43 @@ + +static int useargb = 0; +static Visual *visual; +static int depth; +static Colormap cmap; + +void +xinitvisual() +{ + XVisualInfo *infos; + XRenderPictFormat *fmt; + int nitems; + int i; + + XVisualInfo tpl = { + .screen = screen, + .depth = 32, + .class = TrueColor + }; + long masks = VisualScreenMask | VisualDepthMask | VisualClassMask; + + infos = XGetVisualInfo(dpy, masks, &tpl, &nitems); + visual = NULL; + for (i = 0; i < nitems; i ++) { + fmt = XRenderFindVisualFormat(dpy, infos[i].visual); + if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) { + visual = infos[i].visual; + depth = infos[i].depth; + cmap = XCreateColormap(dpy, root, visual, AllocNone); + useargb = 1; + break; + } + } + + XFree(infos); + + if (!visual) { + visual = DefaultVisual(dpy, screen); + depth = DefaultDepth(dpy, screen); + cmap = DefaultColormap(dpy, screen); + } +} + diff --git a/patch/bar_alpha.h b/patch/bar_alpha.h new file mode 100644 index 0000000..1c2a012 --- /dev/null +++ b/patch/bar_alpha.h @@ -0,0 +1,4 @@ +#define OPAQUE 0xffU + +static void xinitvisual(); + diff --git a/patch/bar_dwmblocks.c b/patch/bar_dwmblocks.c new file mode 100644 index 0000000..0a4b097 --- /dev/null +++ b/patch/bar_dwmblocks.c @@ -0,0 +1,41 @@ +static int statussig; +pid_t statuspid = -1; + +pid_t +getstatusbarpid() +{ + char buf[32], *str = buf, *c; + FILE *fp; + + if (statuspid > 0) { + snprintf(buf, sizeof(buf), "/proc/%u/cmdline", statuspid); + if ((fp = fopen(buf, "r"))) { + fgets(buf, sizeof(buf), fp); + while ((c = strchr(str, '/'))) + str = c + 1; + fclose(fp); + if (!strcmp(str, STATUSBAR)) + return statuspid; + } + } + if (!(fp = popen("pgrep -o "STATUSBAR, "r"))) + return -1; + fgets(buf, sizeof(buf), fp); + pclose(fp); + return strtol(buf, NULL, 10); +} + +void +sigstatusbar(const Arg *arg) +{ + union sigval sv; + + if (!statussig) + return; + if ((statuspid = getstatusbarpid()) <= 0) + return; + + sv.sival_int = arg->i; + sigqueue(statuspid, SIGRTMIN+statussig, sv); +} + diff --git a/patch/bar_dwmblocks.h b/patch/bar_dwmblocks.h new file mode 100644 index 0000000..4db9467 --- /dev/null +++ b/patch/bar_dwmblocks.h @@ -0,0 +1,3 @@ +static int getstatusbarpid(); +static void sigstatusbar(const Arg *arg); + diff --git a/patch/bar_ewmhtags.c b/patch/bar_ewmhtags.c new file mode 100644 index 0000000..d86fd88 --- /dev/null +++ b/patch/bar_ewmhtags.c @@ -0,0 +1,53 @@ +void +setcurrentdesktop(void) +{ + long data[] = { 0 }; + XChangeProperty(dpy, root, netatom[NetCurrentDesktop], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 1); +} + +void +setdesktopnames(void) +{ + int i; + XTextProperty text; + char *tags[NUMTAGS]; + for (i = 0; i < NUMTAGS; i++) + tags[i] = tagicon(selmon, i); + Xutf8TextListToTextProperty(dpy, tags, NUMTAGS, XUTF8StringStyle, &text); + XSetTextProperty(dpy, root, &text, netatom[NetDesktopNames]); +} + +void +setfloatinghint(Client *c) +{ + Atom target = XInternAtom(dpy, "_IS_FLOATING", 0); + unsigned int floating[1] = {c->isfloating}; + XChangeProperty(dpy, c->win, target, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)floating, 1); +} + +void +setnumdesktops(void) +{ + long data[] = { NUMTAGS }; + XChangeProperty(dpy, root, netatom[NetNumberOfDesktops], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 1); +} + +void +setviewport(void) +{ + long data[] = { 0, 0 }; + XChangeProperty(dpy, root, netatom[NetDesktopViewport], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 2); +} + +void +updatecurrentdesktop(void) +{ + long rawdata[] = { selmon->tagset[selmon->seltags] }; + int i = 0; + while (*rawdata >> (i + 1)) { + i++; + } + long data[] = { i }; + XChangeProperty(dpy, root, netatom[NetCurrentDesktop], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 1); +} + diff --git a/patch/bar_ewmhtags.h b/patch/bar_ewmhtags.h new file mode 100644 index 0000000..4d6a74b --- /dev/null +++ b/patch/bar_ewmhtags.h @@ -0,0 +1,7 @@ +static void setcurrentdesktop(void); +static void setdesktopnames(void); +static void setfloatinghint(Client *c); +static void setnumdesktops(void); +static void setviewport(void); +static void updatecurrentdesktop(void); + diff --git a/patch/bar_indicators.c b/patch/bar_indicators.c new file mode 100644 index 0000000..ad17a39 --- /dev/null +++ b/patch/bar_indicators.c @@ -0,0 +1,109 @@ +/* Indicator properties, you can override these in your config.h if you want. */ +#ifndef TAGSINDICATOR +#define TAGSINDICATOR 1 // 0 = off, 1 = on if >1 client/view tag, 2 = always on +#endif +#ifndef TAGSPX +#define TAGSPX 5 // # pixels for tag grid boxes +#endif +#ifndef TAGSROWS +#define TAGSROWS 3 // # rows in tag grid (9 tags, e.g. 3x3) +#endif + +void +drawindicator(Monitor *m, Client *c, unsigned int occ, int x, int y, int w, int h, unsigned int tag, int filled, int invert, int type) +{ + int i, boxw, boxs, indn = 0; + if (!(occ & 1 << tag) || type == INDICATOR_NONE) + return; + + boxs = drw->fonts->h / 9; + boxw = drw->fonts->h / 6 + 2; + if (filled == -1) + filled = m == selmon && m->sel && m->sel->tags & 1 << tag; + + switch (type) { + default: + case INDICATOR_TOP_LEFT_SQUARE: + drw_rect(drw, x + boxs, y + boxs, boxw, boxw, filled, invert); + break; + case INDICATOR_TOP_LEFT_LARGER_SQUARE: + drw_rect(drw, x + boxs + 2, y + boxs+1, boxw+1, boxw+1, filled, invert); + break; + case INDICATOR_TOP_BAR: + drw_rect(drw, x + boxw, y, w - ( 2 * boxw + 1), boxw/2, filled, invert); + break; + case INDICATOR_TOP_BAR_SLIM: + drw_rect(drw, x + boxw, y, w - ( 2 * boxw + 1), 1, 0, invert); + break; + case INDICATOR_BOTTOM_BAR: + drw_rect(drw, x + boxw, y + h - boxw/2, w - ( 2 * boxw + 1), boxw/2, filled, invert); + break; + case INDICATOR_BOTTOM_BAR_SLIM: + drw_rect(drw, x + boxw, y + h - 1, w - ( 2 * boxw + 1), 1, 0, invert); + break; + case INDICATOR_BOX: + drw_rect(drw, x + boxw, y, w - 2 * boxw, h, 0, invert); + break; + case INDICATOR_BOX_WIDER: + drw_rect(drw, x + boxw/2, y, w - boxw, h, 0, invert); + break; + case INDICATOR_BOX_FULL: + drw_rect(drw, x, y, w - 2, h, 0, invert); + break; + case INDICATOR_CLIENT_DOTS: + for (c = m->clients; c; c = c->next) { + if (c->tags & (1 << tag)) { + drw_rect(drw, x, 1 + (indn * 2), m->sel == c ? 6 : 1, 1, 1, invert); + indn++; + } + if (h <= 1 + (indn * 2)) { + indn = 0; + x += 2; + } + } + break; + case INDICATOR_RIGHT_TAGS: + if (!c) + break; + for (i = 0; i < NUMTAGS; i++) { + drw_rect(drw, + ( x + w - 2 - ((NUMTAGS / TAGSROWS) * TAGSPX) + - (i % (NUMTAGS/TAGSROWS)) + ((i % (NUMTAGS / TAGSROWS)) * TAGSPX) + ), + ( y + 2 + ((i / (NUMTAGS/TAGSROWS)) * TAGSPX) + - ((i / (NUMTAGS/TAGSROWS))) + ), + TAGSPX, TAGSPX, (c->tags >> i) & 1, 0 + ); + } + break; + case INDICATOR_PLUS_AND_LARGER_SQUARE: + boxs += 2; + boxw += 2; + /* falls through */ + case INDICATOR_PLUS_AND_SQUARE: + drw_rect(drw, x + boxs, y + boxs, boxw % 2 ? boxw : boxw + 1, boxw % 2 ? boxw : boxw + 1, filled, invert); + /* falls through */ + case INDICATOR_PLUS: + if (!(boxw % 2)) + boxw += 1; + drw_rect(drw, x + boxs + boxw / 2, y + boxs, 1, boxw, filled, invert); // | + drw_rect(drw, x + boxs, y + boxs + boxw / 2, boxw + 1, 1, filled, invert); // ‒ + break; + } +} + +void +drawstateindicator(Monitor *m, Client *c, unsigned int occ, int x, int y, int w, int h, unsigned int tag, int filled, int invert) +{ + if (c->fakefullscreen && c->isfloating) + drawindicator(m, c, occ, x, y, w, h, tag, filled, invert, floatfakefsindicatortype); + else if (c->fakefullscreen) + drawindicator(m, c, occ, x, y, w, h, tag, filled, invert, fakefsindicatortype); + else + if (c->isfloating) + drawindicator(m, c, occ, x, y, w, h, tag, filled, invert, floatindicatortype); + else + drawindicator(m, c, occ, x, y, w, h, tag, filled, invert, tiledindicatortype); +} + diff --git a/patch/bar_indicators.h b/patch/bar_indicators.h new file mode 100644 index 0000000..c66e4f0 --- /dev/null +++ b/patch/bar_indicators.h @@ -0,0 +1,21 @@ +enum { + INDICATOR_NONE, + INDICATOR_TOP_LEFT_SQUARE, + INDICATOR_TOP_LEFT_LARGER_SQUARE, + INDICATOR_TOP_BAR, + INDICATOR_TOP_BAR_SLIM, + INDICATOR_BOTTOM_BAR, + INDICATOR_BOTTOM_BAR_SLIM, + INDICATOR_BOX, + INDICATOR_BOX_WIDER, + INDICATOR_BOX_FULL, + INDICATOR_CLIENT_DOTS, + INDICATOR_RIGHT_TAGS, + INDICATOR_PLUS, + INDICATOR_PLUS_AND_SQUARE, + INDICATOR_PLUS_AND_LARGER_SQUARE, +}; + +static void drawindicator(Monitor *m, Client *c, unsigned int occ, int x, int y, int w, int h, unsigned int tag, int filled, int invert, int type); +static void drawstateindicator(Monitor *m, Client *c, unsigned int occ, int x, int y, int w, int h, unsigned int tag, int filled, int invert); + diff --git a/patch/bar_ltsymbol.c b/patch/bar_ltsymbol.c new file mode 100644 index 0000000..1fbd1b8 --- /dev/null +++ b/patch/bar_ltsymbol.c @@ -0,0 +1,18 @@ +int +width_ltsymbol(Bar *bar, BarArg *a) +{ + return TEXTW(bar->mon->ltsymbol); +} + +int +draw_ltsymbol(Bar *bar, BarArg *a) +{ + return drw_text(drw, a->x, a->y, a->w, a->h, lrpad / 2, bar->mon->ltsymbol, 0, False); +} + +int +click_ltsymbol(Bar *bar, Arg *arg, BarArg *a) +{ + return ClkLtSymbol; +} + diff --git a/patch/bar_ltsymbol.h b/patch/bar_ltsymbol.h new file mode 100644 index 0000000..4de5720 --- /dev/null +++ b/patch/bar_ltsymbol.h @@ -0,0 +1,4 @@ +static int width_ltsymbol(Bar *bar, BarArg *a); +static int draw_ltsymbol(Bar *bar, BarArg *a); +static int click_ltsymbol(Bar *bar, Arg *arg, BarArg *a); + diff --git a/patch/bar_powerline_tags.c b/patch/bar_powerline_tags.c new file mode 100644 index 0000000..86e96c0 --- /dev/null +++ b/patch/bar_powerline_tags.c @@ -0,0 +1,85 @@ +int +width_pwrl_tags(Bar *bar, BarArg *a) +{ + int w, i; + int plw = drw->fonts->h / 2 + 1; + Client *c; + unsigned int occ = 0; + for (c = bar->mon->clients; c; c = c->next) + occ |= c->tags == 255 ? 0 : c->tags; + + for (w = 0, i = 0; i < NUMTAGS; i++) { + if (!(occ & 1 << i || bar->mon->tagset[bar->mon->seltags] & 1 << i)) + continue; + w += TEXTW(tagicon(bar->mon, i)) + plw; + } + return w + lrpad; +} + +int +draw_pwrl_tags(Bar *bar, BarArg *a) +{ + int x, w; + int invert; + int plw = drw->fonts->h / 2 + 1; + unsigned int i, occ = 0, urg = 0; + char *icon; + Client *c; + Clr *prevscheme, *nxtscheme; + + for (c = bar->mon->clients; c; c = c->next) { + occ |= c->tags == 255 ? 0 : c->tags; + if (c->isurgent) + urg |= c->tags; + } + x = a->x; + prevscheme = scheme[SchemeNorm]; + for (i = 0; i < NUMTAGS; i++) { + /* do not draw vacant tags */ + if (!(occ & 1 << i || bar->mon->tagset[bar->mon->seltags] & 1 << i)) + continue; + + icon = tagicon(bar->mon, i); + invert = 0; + w = TEXTW(icon); + if (urg & 1 << i) { + drw_settrans(drw, prevscheme, (nxtscheme = scheme[bar->mon->tagset[bar->mon->seltags] & 1 << i ? SchemeSel : SchemeUrg])); + } else { + drw_settrans(drw, prevscheme, (nxtscheme = scheme[bar->mon->tagset[bar->mon->seltags] & 1 << i ? SchemeSel : SchemeNorm])); + } + drw_arrow(drw, x, a->y, plw, a->h, 1, 1); + x += plw; + drw_setscheme(drw, nxtscheme); + drw_text(drw, x, a->y, w, a->h, lrpad / 2, icon, invert, False); + drawindicator(bar->mon, NULL, occ, x, a->y, w, a->h, i, -1, invert, tagindicatortype); + x += w; + prevscheme = nxtscheme; + } + nxtscheme = scheme[SchemeNorm]; + + drw_settrans(drw, prevscheme, nxtscheme); + drw_arrow(drw, x, a->y, plw, a->h, 1, 1); + return 1; +} + +int +click_pwrl_tags(Bar *bar, Arg *arg, BarArg *a) +{ + int i = 0, x = lrpad / 2; + int plw = drw->fonts->h / 2 + 1; + Client *c; + unsigned int occ = 0; + for (c = bar->mon->clients; c; c = c->next) + occ |= c->tags == 255 ? 0 : c->tags; + + do { + if (!(occ & 1 << i || bar->mon->tagset[bar->mon->seltags] & 1 << i)) + continue; + x += TEXTW(tagicon(bar->mon, i)) + plw; + } while (a->x >= x && ++i < NUMTAGS); + if (i < NUMTAGS) { + arg->ui = 1 << i; + } + return ClkTagBar; +} + diff --git a/patch/bar_powerline_tags.h b/patch/bar_powerline_tags.h new file mode 100644 index 0000000..a51dcc7 --- /dev/null +++ b/patch/bar_powerline_tags.h @@ -0,0 +1,4 @@ +static int width_pwrl_tags(Bar *bar, BarArg *a); +static int draw_pwrl_tags(Bar *bar, BarArg *a); +static int click_pwrl_tags(Bar *bar, Arg *arg, BarArg *a); + diff --git a/patch/bar_status.c b/patch/bar_status.c new file mode 100644 index 0000000..65595e0 --- /dev/null +++ b/patch/bar_status.c @@ -0,0 +1,20 @@ +int +width_status(Bar *bar, BarArg *a) +{ + return TEXTWM(stext); +} + + +int +draw_status(Bar *bar, BarArg *a) +{ + return drw_text(drw, a->x, a->y, a->w, a->h, lrpad / 2, stext, 0, True); +} + + +int +click_status(Bar *bar, Arg *arg, BarArg *a) +{ + return ClkStatusText; +} + diff --git a/patch/bar_status.h b/patch/bar_status.h new file mode 100644 index 0000000..c580597 --- /dev/null +++ b/patch/bar_status.h @@ -0,0 +1,4 @@ +static int width_status(Bar *bar, BarArg *a); +static int draw_status(Bar *bar, BarArg *a); +static int click_status(Bar *bar, Arg *arg, BarArg *a); + diff --git a/patch/bar_statuscmd.c b/patch/bar_statuscmd.c new file mode 100644 index 0000000..8cd5981 --- /dev/null +++ b/patch/bar_statuscmd.c @@ -0,0 +1,46 @@ + +int +click_statuscmd(Bar *bar, Arg *arg, BarArg *a) +{ + return click_statuscmd_text(arg, a->x, rawstext); +} + + +int +click_statuscmd_text(Arg *arg, int rel_x, char *text) +{ + int i = -1; + int x = 0; + char ch; + statussig = -1; + while (text[++i]) { + if ((unsigned char)text[i] < ' ') { + ch = text[i]; + text[i] = '\0'; + x += TEXTWM(text) - lrpad; + text[i] = ch; + text += i+1; + i = -1; + if (x >= rel_x && statussig != -1) + break; + statussig = ch; + } + } + if (statussig == -1) + statussig = 0; + return ClkStatusText; +} + +void +copyvalidchars(char *text, char *rawtext) +{ + int i = -1, j = 0; + + while (rawtext[++i]) { + if ((unsigned char)rawtext[i] >= ' ') { + text[j++] = rawtext[i]; + } + } + text[j] = '\0'; +} + diff --git a/patch/bar_statuscmd.h b/patch/bar_statuscmd.h new file mode 100644 index 0000000..1ec24a6 --- /dev/null +++ b/patch/bar_statuscmd.h @@ -0,0 +1,9 @@ +static int click_statuscmd(Bar *bar, Arg *arg, BarArg *a); +static int click_statuscmd_text(Arg *arg, int rel_x, char *text); +static void copyvalidchars(char *text, char *rawtext); + +typedef struct { + const char *cmd; + int id; +} StatusCmd; + diff --git a/patch/bar_systray.c b/patch/bar_systray.c new file mode 100644 index 0000000..34f7066 --- /dev/null +++ b/patch/bar_systray.c @@ -0,0 +1,186 @@ +static Systray *systray = NULL; +static unsigned long systrayorientation = _NET_SYSTEM_TRAY_ORIENTATION_HORZ; + +int +width_systray(Bar *bar, BarArg *a) +{ + unsigned int w = 0; + Client *i; + if (!systray) + return 1; + if (showsystray) + for (i = systray->icons; i; w += i->w + systrayspacing, i = i->next); + return w ? w + lrpad - systrayspacing : 0; +} + +int +draw_systray(Bar *bar, BarArg *a) +{ + if (!showsystray) + return 0; + + XSetWindowAttributes wa; + XWindowChanges wc; + Client *i; + unsigned int w; + + if (!systray) { + /* init systray */ + if (!(systray = (Systray *)calloc(1, sizeof(Systray)))) + die("fatal: could not malloc() %u bytes\n", sizeof(Systray)); + + wa.override_redirect = True; + wa.event_mask = ButtonPressMask|ExposureMask; + wa.border_pixel = 0; + systray->h = MIN(a->h, drw->fonts->h); + wa.background_pixel = 0; + wa.colormap = cmap; + systray->win = XCreateWindow(dpy, root, bar->bx + a->x + lrpad / 2, bar->by + a->y + (a->h - systray->h) / 2, MAX(a->w + 40, 1), systray->h, 0, depth, + InputOutput, visual, + CWOverrideRedirect|CWBorderPixel|CWBackPixel|CWColormap|CWEventMask, &wa); // CWBackPixmap + + XSelectInput(dpy, systray->win, SubstructureNotifyMask); + XChangeProperty(dpy, systray->win, netatom[NetSystemTrayOrientation], XA_CARDINAL, 32, + PropModeReplace, (unsigned char *)&systrayorientation, 1); + XChangeProperty(dpy, systray->win, netatom[NetSystemTrayVisual], XA_VISUALID, 32, + PropModeReplace, (unsigned char *)&visual->visualid, 1); + XChangeProperty(dpy, systray->win, netatom[NetWMWindowType], XA_ATOM, 32, + PropModeReplace, (unsigned char *)&netatom[NetWMWindowTypeDock], 1); + XMapRaised(dpy, systray->win); + XSetSelectionOwner(dpy, netatom[NetSystemTray], systray->win, CurrentTime); + if (XGetSelectionOwner(dpy, netatom[NetSystemTray]) == systray->win) { + sendevent(root, xatom[Manager], StructureNotifyMask, CurrentTime, netatom[NetSystemTray], systray->win, 0, 0); + XSync(dpy, False); + } else { + fprintf(stderr, "dwm: unable to obtain system tray.\n"); + free(systray); + systray = NULL; + return 0; + } + } + + systray->bar = bar; + + wc.stack_mode = Above; + wc.sibling = bar->win; + XConfigureWindow(dpy, systray->win, CWSibling|CWStackMode, &wc); + + drw_setscheme(drw, scheme[SchemeNorm]); + for (w = 0, i = systray->icons; i; i = i->next) { + wa.background_pixel = 0; + XChangeWindowAttributes(dpy, i->win, CWBackPixel, &wa); + XMapRaised(dpy, i->win); + i->x = w; + XMoveResizeWindow(dpy, i->win, i->x, 0, i->w, i->h); + w += i->w; + if (i->next) + w += systrayspacing; + if (i->mon != bar->mon) + i->mon = bar->mon; + } + + XMoveResizeWindow(dpy, systray->win, bar->bx + a->x + lrpad / 2, (w ? bar->by + a->y + (a->h - systray->h) / 2: -bar->by - a->y), MAX(w, 1), systray->h); + return w; +} + +int +click_systray(Bar *bar, Arg *arg, BarArg *a) +{ + return -1; +} + +void +removesystrayicon(Client *i) +{ + Client **ii; + + if (!showsystray || !i) + return; + for (ii = &systray->icons; *ii && *ii != i; ii = &(*ii)->next); + if (ii) + *ii = i->next; + free(i); + drawbarwin(systray->bar); +} + +void +resizerequest(XEvent *e) +{ + XResizeRequestEvent *ev = &e->xresizerequest; + Client *i; + + if ((i = wintosystrayicon(ev->window))) { + updatesystrayicongeom(i, ev->width, ev->height); + drawbarwin(systray->bar); + } +} + +void +updatesystrayicongeom(Client *i, int w, int h) +{ + if (!systray) + return; + + int icon_height = systray->h; + if (i) { + i->h = icon_height; + if (w == h) + i->w = icon_height; + else if (h == icon_height) + i->w = w; + else + i->w = (int) ((float)icon_height * ((float)w / (float)h)); + applysizehints(i, &(i->x), &(i->y), &(i->w), &(i->h), False); + /* force icons into the systray dimensions if they don't want to */ + if (i->h > icon_height) { + if (i->w == i->h) + i->w = icon_height; + else + i->w = (int) ((float)icon_height * ((float)i->w / (float)i->h)); + i->h = icon_height; + } + if (i->w > 2 * icon_height) + i->w = icon_height; + } +} + +void +updatesystrayiconstate(Client *i, XPropertyEvent *ev) +{ + long flags; + int code = 0; + + if (!showsystray || !systray || !i || ev->atom != xatom[XembedInfo] || + !(flags = getatomprop(i, xatom[XembedInfo]))) + return; + + if (flags & XEMBED_MAPPED && !i->tags) { + i->tags = 1; + code = XEMBED_WINDOW_ACTIVATE; + XMapRaised(dpy, i->win); + setclientstate(i, NormalState); + } + else if (!(flags & XEMBED_MAPPED) && i->tags) { + i->tags = 0; + code = XEMBED_WINDOW_DEACTIVATE; + XUnmapWindow(dpy, i->win); + setclientstate(i, WithdrawnState); + } + else + return; + sendevent(i->win, xatom[Xembed], StructureNotifyMask, CurrentTime, code, 0, + systray->win, XEMBED_EMBEDDED_VERSION); +} + +Client * +wintosystrayicon(Window w) +{ + if (!systray) + return NULL; + Client *i = NULL; + if (!showsystray || !w) + return i; + for (i = systray->icons; i && i->win != w; i = i->next); + return i; +} + diff --git a/patch/bar_systray.h b/patch/bar_systray.h new file mode 100644 index 0000000..a64b971 --- /dev/null +++ b/patch/bar_systray.h @@ -0,0 +1,42 @@ +#define SYSTEM_TRAY_REQUEST_DOCK 0 +#define _NET_SYSTEM_TRAY_ORIENTATION_HORZ 0 + +/* XEMBED messages */ +#define XEMBED_EMBEDDED_NOTIFY 0 +#define XEMBED_WINDOW_ACTIVATE 1 +#define XEMBED_FOCUS_IN 4 +#define XEMBED_MODALITY_ON 10 + +#define XEMBED_MAPPED (1 << 0) +#define XEMBED_WINDOW_ACTIVATE 1 +#define XEMBED_WINDOW_DEACTIVATE 2 + +#define VERSION_MAJOR 0 +#define VERSION_MINOR 0 +#define XEMBED_EMBEDDED_VERSION (VERSION_MAJOR << 16) | VERSION_MINOR + +/* enums */ +enum { Manager, Xembed, XembedInfo, XLast }; /* Xembed atoms */ + +typedef struct Systray Systray; +struct Systray { + Window win; + Client *icons; + Bar *bar; + int h; +}; + +/* bar integration */ +static int width_systray(Bar *bar, BarArg *a); +static int draw_systray(Bar *bar, BarArg *a); +static int click_systray(Bar *bar, Arg *arg, BarArg *a); + +/* function declarations */ +static Atom getatomprop(Client *c, Atom prop); +static void removesystrayicon(Client *i); +static void resizerequest(XEvent *e); +static void updatesystrayicongeom(Client *i, int w, int h); +static void updatesystrayiconstate(Client *i, XPropertyEvent *ev); +static Client *wintosystrayicon(Window w); + + diff --git a/patch/bar_tabgroups.c b/patch/bar_tabgroups.c new file mode 100644 index 0000000..f99e736 --- /dev/null +++ b/patch/bar_tabgroups.c @@ -0,0 +1,223 @@ +/* Bartabgroups properties, you can override these in your config.h if you want. */ +#ifndef BARTAB_BORDERS +#define BARTAB_BORDERS 1 // 0 = off, 1 = on +#endif +#ifndef BARTAB_SHOWFLOATING +#define BARTAB_SHOWFLOATING 0 // whether to show titles for floating windows, hidden clients are always shown +#endif +#ifndef BARTAB_STACKWEIGHT +#define BARTAB_STACKWEIGHT 1 // stack weight compared to hidden and floating window titles +#endif +#ifndef BARTAB_HIDDENWEIGHT +#define BARTAB_HIDDENWEIGHT 1 // hidden window title weight +#endif +#ifndef BARTAB_FLOATWEIGHT +#define BARTAB_FLOATWEIGHT 1 // floating window title weight, set to 0 to not show floating windows +#endif + +int +width_bartabgroups(Bar *bar, BarArg *a) +{ + return a->w; +} + +int +draw_bartabgroups(Bar *bar, BarArg *a) +{ + drw_rect(drw, a->x, a->y, a->w, a->h, 1, 1); + return bartabcalculate(bar->mon, a->x, a->w, -1, bartabdraw, NULL, a); +} + +int +click_bartabgroups(Bar *bar, Arg *arg, BarArg *a) +{ + bartabcalculate(bar->mon, 0, a->w, a->x, bartabclick, arg, a); + return ClkWinTitle; +} + +void +bartabdraw(Monitor *m, Client *c, int unused, int x, int w, int groupactive, Arg *arg, BarArg *barg) +{ + if (!c) + return; + int i, nclienttags = 0, nviewtags = 0, pad = lrpad / 2; + drw_setscheme(drw, scheme[ + m->sel == c + #ifdef HIDDEN + && HIDDEN(c) + ? SchemeHidSel + : HIDDEN(c) + ? SchemeHidNorm + : m->sel == c + #endif + ? SchemeSel + : groupactive + ? SchemeTitleSel + : SchemeTitleNorm + ]); + if (w <= TEXTW("A") - lrpad + pad) // reduce text padding if wintitle is too small + pad = (w - TEXTW("A") + lrpad < 0 ? 0 : (w - TEXTW("A") + lrpad) / 2); + else if (TEXTW(c->name) < w) + pad = (w - TEXTW(c->name) + lrpad) / 2; + + drw_text(drw, x, barg->y, w, barg->h, pad, c->name, 0, False); + + drawstateindicator(m, c, 1, x, barg->y, w, barg->h, 0, 0, c->isfixed); + + if (BARTAB_BORDERS) { + XSetForeground(drw->dpy, drw->gc, scheme[SchemeSel][ColBorder].pixel); + XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, barg->y, 1, barg->h); + XFillRectangle(drw->dpy, drw->drawable, drw->gc, x + w - (x + w >= barg->w ? 1 : 0), barg->y, 1, barg->h); + } + /* Optional tags icons */ + for (i = 0; i < NUMTAGS; i++) { + if ((m->tagset[m->seltags] >> i) & 1) + nviewtags++; + if ((c->tags >> i) & 1) + nclienttags++; + } + + if (TAGSINDICATOR == 2 || nclienttags > 1 || nviewtags > 1) + drawindicator(m, c, 1, x, barg->y, w, barg->h, 0, 0, 0, INDICATOR_RIGHT_TAGS); +} + +#ifndef HIDDEN +#define HIDDEN(C) 0 +#endif + +void +bartabclick(Monitor *m, Client *c, int passx, int x, int w, int unused, Arg *arg, BarArg *barg) +{ + if (passx >= x && passx <= x + w) + arg->v = c; +} + +int +bartabcalculate( + Monitor *m, int offx, int tabw, int passx, + void(*tabfn)(Monitor *, Client *, int, int, int, int, Arg *arg, BarArg *barg), + Arg *arg, BarArg *barg +) { + Client *c; + int + i, clientsnmaster = 0, clientsnstack = 0, clientsnfloating = 0, clientsnhidden = 0, + masteractive = 0, fulllayout = 0, + x = offx, w, r, num = 0, den, tgactive; + + for (i = 0; i < LENGTH(bartabmonfns); i++) + if (m ->lt[m->sellt]->arrange == bartabmonfns[i]) { + fulllayout = 1; + break; + } + + for (i = 0, c = m->clients; c; c = c->next) { + if (!ISVISIBLE(c)) + continue; + if (HIDDEN(c)) { + clientsnhidden++; + continue; + } + if (c->isfloating) { + clientsnfloating++; + continue; + } + if (m->sel == c) + masteractive = i < m->nmaster; + if (i < m->nmaster) + clientsnmaster++; + else + clientsnstack++; + i++; + } + + if (clientsnmaster + clientsnstack + clientsnfloating + clientsnhidden == 0) + return 0; + + tgactive = 1; + num = tabw; + /* floating mode */ + if ((fulllayout && BARTAB_FLOATWEIGHT) || clientsnmaster + clientsnstack == 0 || !m->lt[m->sellt]->arrange) { + den = clientsnmaster + clientsnstack + clientsnfloating + clientsnhidden; + r = num % den; + w = num / den; + for (c = m->clients, i = 0; c; c = c->next) { + if (!ISVISIBLE(c)) + continue; + tabfn(m, c, passx, x, w + (i < r ? 1 : 0), tgactive, arg, barg); + x += w + (i < r ? 1 : 0); + i++; + } + /* no master and stack mode, e.g. monocole, grid layouts, fibonacci */ + } else if (fulllayout) { + den = clientsnmaster + clientsnstack + clientsnhidden; + r = num % den; + w = num / den; + for (c = m->clients, i = 0; c; c = c->next) { + if (!ISVISIBLE(c) || (c->isfloating && !HIDDEN(c))) + continue; + tabfn(m, c, passx, x, w + (i < r ? 1 : 0), tgactive, arg, barg); + x += w + (i < r ? 1 : 0); + i++; + } + /* tiled mode */ + } else { + den = clientsnmaster; + c = m->clients; + i = 0; + if (den) { + if (clientsnstack + clientsnfloating * BARTAB_FLOATWEIGHT + clientsnhidden) { + tgactive = masteractive; + num = tabw * m->mfact; + } + r = num % den; + w = num / den; + for (; c && i < m->nmaster; c = c->next) { // tiled master + if (!ISVISIBLE(c) || c->isfloating || HIDDEN(c)) + continue; + tabfn(m, c, passx, x, w + (i < r ? 1 : 0), tgactive, arg, barg); + x += w + (i < r ? 1 : 0); + i++; + } + tgactive = !tgactive; + num = tabw - num; + } + + den = clientsnstack * BARTAB_STACKWEIGHT + clientsnfloating * BARTAB_FLOATWEIGHT + clientsnhidden * BARTAB_HIDDENWEIGHT; + if (!den) + return 1; + + r = num % den; + w = num / den; + #if BARTAB_STACKWEIGHT + for (; c; c = c->next) { // tiled stack + if (!ISVISIBLE(c) || HIDDEN(c) || c->isfloating) + continue; + tabfn(m, c, passx, x, w * BARTAB_STACKWEIGHT + (i - m->nmaster < r ? 1 : 0), tgactive, arg, barg); + x += w * BARTAB_STACKWEIGHT + (i - m->nmaster < r ? 1 : 0); + i++; + } + #endif // BARTAB_STACKWEIGHT + + #if BARTAB_HIDDENWEIGHT + for (c = m->clients; c; c = c->next) { // hidden windows + if (!ISVISIBLE(c) || !HIDDEN(c)) + continue; + tabfn(m, c, passx, x, w * BARTAB_HIDDENWEIGHT + (i - m->nmaster < r ? 1 : 0), tgactive, arg, barg); + x += w * BARTAB_HIDDENWEIGHT + (i - m->nmaster < r ? 1 : 0); + i++; + } + #endif // BARTAB_HIDDENWEIGHT + + #if BARTAB_FLOATWEIGHT + for (c = m->clients; c; c = c->next) { // floating windows + if (!ISVISIBLE(c) || HIDDEN(c) || !c->isfloating) + continue; + tabfn(m, c, passx, x, w * BARTAB_FLOATWEIGHT + (i - m->nmaster < r ? 1 : 0), tgactive, arg, barg); + x += w * BARTAB_FLOATWEIGHT + (i - m->nmaster < r ? 1 : 0); + i++; + } + #endif // BARTAB_FLOATWEIGHT + } + return 1; +} + diff --git a/patch/bar_tabgroups.h b/patch/bar_tabgroups.h new file mode 100644 index 0000000..75a8512 --- /dev/null +++ b/patch/bar_tabgroups.h @@ -0,0 +1,8 @@ +static int width_bartabgroups(Bar *bar, BarArg *a); +static int draw_bartabgroups(Bar *bar, BarArg *a); +static int click_bartabgroups(Bar *bar, Arg *arg, BarArg *a); + +static void bartabdraw(Monitor *m, Client *c, int unused, int x, int w, int groupactive, Arg *arg, BarArg *barg); +static void bartabclick(Monitor *m, Client *c, int passx, int x, int w, int unused, Arg *arg, BarArg *barg); +static int bartabcalculate(Monitor *m, int offx, int w, int passx, void(*tabfn)(Monitor *, Client *, int, int, int, int, Arg *arg, BarArg *barg), Arg *arg, BarArg *barg); + diff --git a/patch/bar_tagicons.c b/patch/bar_tagicons.c new file mode 100644 index 0000000..2ed71c9 --- /dev/null +++ b/patch/bar_tagicons.c @@ -0,0 +1,9 @@ +char * +tagicon(Monitor *m, int tag) +{ + int tagindex = tag + NUMTAGS * m->index; + if (tagindex >= LENGTH(tagicons[DEFAULT_TAGS])) + tagindex = tagindex % LENGTH(tagicons[DEFAULT_TAGS]); + return tagicons[DEFAULT_TAGS][tagindex]; +} + diff --git a/patch/bar_tagicons.h b/patch/bar_tagicons.h new file mode 100644 index 0000000..16fad2a --- /dev/null +++ b/patch/bar_tagicons.h @@ -0,0 +1,8 @@ +enum { + DEFAULT_TAGS, + ALTERNATIVE_TAGS, + ALT_TAGS_DECORATION, +}; + +static char * tagicon(Monitor *m, int tag); + diff --git a/patch/bar_tags.c b/patch/bar_tags.c new file mode 100644 index 0000000..8e0883d --- /dev/null +++ b/patch/bar_tags.c @@ -0,0 +1,75 @@ +int +width_tags(Bar *bar, BarArg *a) +{ + int w, i; + Client *c; + unsigned int occ = 0; + for (c = bar->mon->clients; c; c = c->next) + occ |= c->tags == 255 ? 0 : c->tags; + + for (w = 0, i = 0; i < NUMTAGS; i++) { + if (!(occ & 1 << i || bar->mon->tagset[bar->mon->seltags] & 1 << i)) + continue; + w += TEXTW(tagicon(bar->mon, i)); + } + return w; +} + +int +draw_tags(Bar *bar, BarArg *a) +{ + int invert; + int w, x = a->x; + unsigned int i, occ = 0, urg = 0; + char *icon; + Client *c; + Monitor *m = bar->mon; + + for (c = m->clients; c; c = c->next) { + occ |= c->tags == 255 ? 0 : c->tags; + if (c->isurgent) + urg |= c->tags; + } + for (i = 0; i < NUMTAGS; i++) { + /* do not draw vacant tags */ + if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) + continue; + + icon = tagicon(bar->mon, i); + invert = 0; + w = TEXTW(icon); + drw_setscheme(drw, scheme[ + m->tagset[m->seltags] & 1 << i + ? SchemeTagsSel + : urg & 1 << i + ? SchemeUrg + : SchemeTagsNorm + ]); + drw_text(drw, x, a->y, w, a->h, lrpad / 2, icon, invert, False); + drawindicator(m, NULL, occ, x, a->y, w, a->h, i, -1, invert, tagindicatortype); + x += w; + } + + return 1; +} + +int +click_tags(Bar *bar, Arg *arg, BarArg *a) +{ + int i = 0, x = lrpad / 2; + Client *c; + unsigned int occ = 0; + for (c = bar->mon->clients; c; c = c->next) + occ |= c->tags == 255 ? 0 : c->tags; + + do { + if (!(occ & 1 << i || bar->mon->tagset[bar->mon->seltags] & 1 << i)) + continue; + x += TEXTW(tagicon(bar->mon, i)); + } while (a->x >= x && ++i < NUMTAGS); + if (i < NUMTAGS) { + arg->ui = 1 << i; + } + return ClkTagBar; +} + diff --git a/patch/bar_tags.h b/patch/bar_tags.h new file mode 100644 index 0000000..9261261 --- /dev/null +++ b/patch/bar_tags.h @@ -0,0 +1,4 @@ +static int width_tags(Bar *bar, BarArg *a); +static int draw_tags(Bar *bar, BarArg *a); +static int click_tags(Bar *bar, Arg *arg, BarArg *a); + diff --git a/patch/bar_wintitle.c b/patch/bar_wintitle.c new file mode 100644 index 0000000..bc8eebf --- /dev/null +++ b/patch/bar_wintitle.c @@ -0,0 +1,39 @@ +int +width_wintitle(Bar *bar, BarArg *a) +{ + return a->w; +} + +int +draw_wintitle(Bar *bar, BarArg *a) +{ + int x = a->x + lrpad / 2, w = a->w - lrpad / 2; + Monitor *m = bar->mon; + Client *c = m->sel; + int pad = lrpad / 2; + + if (!c) { + drw_setscheme(drw, scheme[SchemeTitleNorm]); + drw_rect(drw, x, a->y, w, a->h, 1, 1); + return 0; + } + + drw_setscheme(drw, scheme[m == selmon ? SchemeTitleSel : SchemeTitleNorm]); + XSetErrorHandler(xerrordummy); + if (TEXTW(c->name) < w) + pad = (w - TEXTW(c->name) + lrpad) / 2; + + drw_text(drw, x, a->y, w, a->h, pad, c->name, 0, False); + + XSync(dpy, False); + XSetErrorHandler(xerror); + drawstateindicator(m, c, 1, x, a->y, w, a->h, 0, 0, c->isfixed); + return 1; +} + +int +click_wintitle(Bar *bar, Arg *arg, BarArg *a) +{ + return ClkWinTitle; +} + diff --git a/patch/bar_wintitle.h b/patch/bar_wintitle.h new file mode 100644 index 0000000..7e8cce5 --- /dev/null +++ b/patch/bar_wintitle.h @@ -0,0 +1,4 @@ +static int width_wintitle(Bar *bar, BarArg *a); +static int draw_wintitle(Bar *bar, BarArg *a); +static int click_wintitle(Bar *bar, Arg *arg, BarArg *a); + diff --git a/patch/bar_wintitleactions.c b/patch/bar_wintitleactions.c new file mode 100644 index 0000000..9a10412 --- /dev/null +++ b/patch/bar_wintitleactions.c @@ -0,0 +1,91 @@ +void +hide(Client *c) { + + Client *n; + if (!c || HIDDEN(c)) + return; + + Window w = c->win; + static XWindowAttributes ra, ca; + + // more or less taken directly from blackbox's hide() function + XGrabServer(dpy); + XGetWindowAttributes(dpy, root, &ra); + XGetWindowAttributes(dpy, w, &ca); + // prevent UnmapNotify events + XSelectInput(dpy, root, ra.your_event_mask & ~SubstructureNotifyMask); + XSelectInput(dpy, w, ca.your_event_mask & ~StructureNotifyMask); + XUnmapWindow(dpy, w); + setclientstate(c, IconicState); + XSelectInput(dpy, root, ra.your_event_mask); + XSelectInput(dpy, w, ca.your_event_mask); + XUngrabServer(dpy); + + if (c->isfloating || !c->mon->lt[c->mon->sellt]->arrange) { + for (n = c->snext; n && (!ISVISIBLE(n) || HIDDEN(n)); n = n->snext); + if (!n) + for (n = c->mon->stack; n && (!ISVISIBLE(n) || HIDDEN(n)); n = n->snext); + } else { + n = nexttiled(c); + if (!n) + n = prevtiled(c); + } + focus(n); + arrange(c->mon); +} + +void +show(Client *c) +{ + if (!c || !HIDDEN(c)) + return; + + XMapWindow(dpy, c->win); + setclientstate(c, NormalState); + arrange(c->mon); +} + +void +togglewin(const Arg *arg) +{ + Client *c = (Client*)arg->v; + if (!c) + return; + if (c == selmon->sel) + hide(c); + else { + if (HIDDEN(c)) + show(c); + focus(c); + restack(c->mon); + } +} + +Client * +prevtiled(Client *c) +{ + Client *p, *i; + for (p = NULL, i = c->mon->clients; c && i != c; i = i->next) + if (ISVISIBLE(i) && !HIDDEN(i)) + p = i; + return p; +} + +void +showhideclient(const Arg *arg) +{ + Client *c = (Client*)arg->v; + if (!c) + c = selmon->sel; + if (!c) + return; + + if (HIDDEN(c)) { + show(c); + focus(c); + restack(c->mon); + } else { + hide(c); + } +} + diff --git a/patch/bar_wintitleactions.h b/patch/bar_wintitleactions.h new file mode 100644 index 0000000..0c8d5f0 --- /dev/null +++ b/patch/bar_wintitleactions.h @@ -0,0 +1,6 @@ +static void hide(Client *c); +static void show(Client *c); +static void togglewin(const Arg *arg); +static Client * prevtiled(Client *c); +static void showhideclient(const Arg *arg); + diff --git a/patch/decorationhints.c b/patch/decorationhints.c new file mode 100644 index 0000000..91bf3ed --- /dev/null +++ b/patch/decorationhints.c @@ -0,0 +1,35 @@ +static Atom motifatom; + +void +updatemotifhints(Client *c) +{ + Atom real; + int format; + unsigned char *p = NULL; + unsigned long n, extra; + unsigned long *motif; + int width, height; + + if (!decorhints) + return; + + if (XGetWindowProperty(dpy, c->win, motifatom, 0L, 5L, False, motifatom, + &real, &format, &n, &extra, &p) == Success && p != NULL) { + motif = (unsigned long*)p; + if (motif[MWM_HINTS_FLAGS_FIELD] & MWM_HINTS_DECORATIONS) { + width = WIDTH(c); + height = HEIGHT(c); + + if (motif[MWM_HINTS_DECORATIONS_FIELD] & MWM_DECOR_ALL || + motif[MWM_HINTS_DECORATIONS_FIELD] & MWM_DECOR_BORDER || + motif[MWM_HINTS_DECORATIONS_FIELD] & MWM_DECOR_TITLE) + c->bw = c->oldbw = borderpx; + else + c->bw = c->oldbw = 0; + + resize(c, c->x, c->y, width - (2*c->bw), height - (2*c->bw), 0); + } + XFree(p); + } +} + diff --git a/patch/decorationhints.h b/patch/decorationhints.h new file mode 100644 index 0000000..e28f507 --- /dev/null +++ b/patch/decorationhints.h @@ -0,0 +1,9 @@ +#define MWM_HINTS_FLAGS_FIELD 0 +#define MWM_HINTS_DECORATIONS_FIELD 2 +#define MWM_HINTS_DECORATIONS (1 << 1) +#define MWM_DECOR_ALL (1 << 0) +#define MWM_DECOR_BORDER (1 << 1) +#define MWM_DECOR_TITLE (1 << 3) + +static void updatemotifhints(Client *c); + diff --git a/patch/fakefullscreenclient.c b/patch/fakefullscreenclient.c new file mode 100644 index 0000000..509211f --- /dev/null +++ b/patch/fakefullscreenclient.c @@ -0,0 +1,19 @@ +void +togglefakefullscreen(const Arg *arg) +{ + Client *c = selmon->sel; + if (!c) + return; + + if (c->fakefullscreen != 1 && c->isfullscreen) { // exit fullscreen --> fake fullscreen + c->fakefullscreen = 2; + setfullscreen(c, 0); + } else if (c->fakefullscreen == 1) { + setfullscreen(c, 0); + c->fakefullscreen = 0; + } else { + c->fakefullscreen = 1; + setfullscreen(c, 1); + } +} + diff --git a/patch/fakefullscreenclient.h b/patch/fakefullscreenclient.h new file mode 100644 index 0000000..889eed6 --- /dev/null +++ b/patch/fakefullscreenclient.h @@ -0,0 +1,2 @@ +static void togglefakefullscreen(const Arg *arg); + diff --git a/patch/focusadjacenttag.c b/patch/focusadjacenttag.c new file mode 100644 index 0000000..990ee29 --- /dev/null +++ b/patch/focusadjacenttag.c @@ -0,0 +1,80 @@ +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); + } +} + +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 */ + pertagview(&((Arg) { .ui = selmon->tagset[selmon->seltags ^ 1] >> 1 })); + focus(NULL); + arrange(selmon); + updatecurrentdesktop(); + } +} + +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 */ + pertagview(&((Arg) { .ui = selmon->tagset[selmon->seltags ^ 1] << 1 })); + focus(NULL); + arrange(selmon); + updatecurrentdesktop(); + } +} + +void +tagandviewtoleft(const Arg *arg) +{ + if (selmon->sel != NULL + && __builtin_popcount(selmon->tagset[selmon->seltags] & TAGMASK) == 1 + && selmon->tagset[selmon->seltags] > 1) { + selmon->sel->tags >>= 1; + selmon->seltags ^= 1; /* toggle sel tagset */ + pertagview(&((Arg) { .ui = selmon->tagset[selmon->seltags ^ 1] >> 1 })); + focus(selmon->sel); + arrange(selmon); + updatecurrentdesktop(); + } +} + +void +tagandviewtoright(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; + selmon->seltags ^= 1; /* toggle sel tagset */ + pertagview(&((Arg) { .ui = selmon->tagset[selmon->seltags ^ 1] << 1 })); + focus(selmon->sel); + arrange(selmon); + updatecurrentdesktop(); + } +} + diff --git a/patch/focusadjacenttag.h b/patch/focusadjacenttag.h new file mode 100644 index 0000000..abd7439 --- /dev/null +++ b/patch/focusadjacenttag.h @@ -0,0 +1,7 @@ +static void tagtoleft(const Arg *arg); +static void tagtoright(const Arg *arg); +static void viewtoleft(const Arg *arg); +static void viewtoright(const Arg *arg); +static void tagandviewtoleft(const Arg *arg); +static void tagandviewtoright(const Arg *arg); + diff --git a/patch/include.c b/patch/include.c new file mode 100644 index 0000000..25f4017 --- /dev/null +++ b/patch/include.c @@ -0,0 +1,40 @@ +/* Bar functionality */ +#include "bar_indicators.c" +#include "bar_tagicons.c" + +#include "bar_alpha.c" +#include "bar_dwmblocks.c" +#include "bar_ewmhtags.c" +#include "bar_ltsymbol.c" +#include "bar_powerline_tags.c" +#include "bar_status.c" +#include "bar_statuscmd.c" +#include "bar_tabgroups.c" +#include "bar_tags.c" +#include "bar_wintitle.c" +#include "bar_systray.c" +#include "bar_wintitleactions.c" + +/* Other patches */ +#include "autostart.c" +#include "decorationhints.c" +#include "fakefullscreenclient.c" +#include "focusadjacenttag.c" +#include "inplacerotate.c" +#include "pertag.c" +#include "scratchpad_alt_1.c" +#include "sticky.c" +#include "swallow.c" +#include "tagallmon.c" +#include "tagswapmon.c" +#include "transfer.c" +#include "vanitygaps.c" +/* Layouts */ +#include "layout_facts.c" +#include "layout_centeredmaster.c" +#include "layout_centeredfloatingmaster.c" +#include "layout_fibonacci.c" +#include "layout_monocle.c" +#include "layout_nrowgrid.c" +#include "layout_tile.c" + diff --git a/patch/include.h b/patch/include.h new file mode 100644 index 0000000..7a2d97a --- /dev/null +++ b/patch/include.h @@ -0,0 +1,39 @@ +/* Bar functionality */ +#include "bar_indicators.h" +#include "bar_tagicons.h" + +#include "bar_alpha.h" +#include "bar_dwmblocks.h" +#include "bar_ewmhtags.h" +#include "bar_ltsymbol.h" +#include "bar_powerline_tags.h" +#include "bar_status.h" +#include "bar_statuscmd.h" +#include "bar_tabgroups.h" +#include "bar_tags.h" +#include "bar_wintitle.h" +#include "bar_systray.h" +#include "bar_wintitleactions.h" + +/* Other patches */ +#include "autostart.h" +#include "decorationhints.h" +#include "fakefullscreenclient.h" +#include "focusadjacenttag.h" +#include "inplacerotate.h" +#include "pertag.h" +#include "scratchpad_alt_1.h" +#include "sticky.h" +#include "swallow.h" +#include "tagallmon.h" +#include "tagswapmon.h" +#include "transfer.h" +#include "vanitygaps.h" +/* Layouts */ +#include "layout_centeredmaster.h" +#include "layout_centeredfloatingmaster.h" +#include "layout_fibonacci.h" +#include "layout_monocle.h" +#include "layout_nrowgrid.h" +#include "layout_tile.h" + diff --git a/patch/inplacerotate.c b/patch/inplacerotate.c new file mode 100644 index 0000000..b700e04 --- /dev/null +++ b/patch/inplacerotate.c @@ -0,0 +1,84 @@ +void +insertclient(Client *item, Client *insertItem, int after) +{ + Client *c; + if (item == NULL || insertItem == NULL || item == insertItem) + return; + detach(insertItem); + if (!after && selmon->clients == item) { + attach(insertItem); + return; + } + if (after) { + c = item; + } else { + for (c = selmon->clients; c; c = c->next) { + if (c->next == item) + break; + } + } + insertItem->next = c->next; + c->next = insertItem; +} + +void +inplacerotate(const Arg *arg) +{ + if (!selmon->sel || (selmon->sel->isfloating && !arg->f)) + return; + + unsigned int selidx = 0, i = 0; + Client *c = NULL, *stail = NULL, *mhead = NULL, *mtail = NULL, *shead = NULL; + + // Determine positionings for insertclient + for (c = selmon->clients; c; c = c->next) { + if (ISVISIBLE(c) && !(c->isfloating)) { + if (selmon->sel == c) + selidx = i; + if (i == selmon->nmaster - 1) + mtail = c; + if (i == selmon->nmaster) + shead = c; + if (mhead == NULL) + mhead = c; + stail = c; + i++; + } + } + + switch(arg->i) { + case 1: + if (selidx >= selmon->nmaster) + insertclient(shead, stail, 0); + else + insertclient(mhead, mtail, 0); + break; + case -1: + if (selidx >= selmon->nmaster) + insertclient(stail, shead, 1); + else + insertclient(mtail, mhead, 1); + break; + case 2: + insertclient(selmon->clients, stail, 0); + break; + case -2: + insertclient(stail, selmon->clients, 1); + break; + } + + // Restore focus position + i = 0; + for (c = selmon->clients; c; c = c->next) { + if (!ISVISIBLE(c) || (c->isfloating)) + continue; + if (i == selidx) { + focus(c); + break; + } + i++; + } + arrange(selmon); + focus(c); +} + diff --git a/patch/inplacerotate.h b/patch/inplacerotate.h new file mode 100644 index 0000000..2669375 --- /dev/null +++ b/patch/inplacerotate.h @@ -0,0 +1,2 @@ +static void inplacerotate(const Arg *arg); + diff --git a/patch/ipc/IPCClient.h b/patch/ipc/IPCClient.h new file mode 100644 index 0000000..ee93030 --- /dev/null +++ b/patch/ipc/IPCClient.h @@ -0,0 +1,62 @@ +#ifndef IPC_CLIENT_H_ +#define IPC_CLIENT_H_ + +#include +#include +#include + +typedef struct IPCClient IPCClient; +/** + * This structure contains the details of an IPC Client and pointers for a + * linked list + */ +struct IPCClient { + int fd; + int subscriptions; + + char *buffer; + uint32_t buffer_size; + + struct epoll_event event; + IPCClient *next; + IPCClient *prev; +}; + +typedef IPCClient *IPCClientList; + +/** + * Allocate memory for new IPCClient with the specified file descriptor and + * initialize struct. + * + * @param fd File descriptor of IPC client + * + * @return Address to allocated IPCClient struct + */ +IPCClient *ipc_client_new(int fd); + +/** + * Add an IPC Client to the specified list + * + * @param list Address of the list to add the client to + * @param nc Address of the IPCClient + */ +void ipc_list_add_client(IPCClientList *list, IPCClient *nc); + +/** + * Remove an IPCClient from the specified list + * + * @param list Address of the list to remove the client from + * @param c Address of the IPCClient + */ +void ipc_list_remove_client(IPCClientList *list, IPCClient *c); + +/** + * Get an IPCClient from the specified IPCClient list + * + * @param list List to remove the client from + * @param fd File descriptor of the IPCClient + */ +IPCClient *ipc_list_get_client(IPCClientList list, int fd); + +#endif // IPC_CLIENT_H_ + diff --git a/patch/ipc/dwm-msg.c b/patch/ipc/dwm-msg.c new file mode 100644 index 0000000..ca1e1a4 --- /dev/null +++ b/patch/ipc/dwm-msg.c @@ -0,0 +1,549 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define IPC_MAGIC "DWM-IPC" +// clang-format off +#define IPC_MAGIC_ARR { 'D', 'W', 'M', '-', 'I', 'P', 'C' } +// clang-format on +#define IPC_MAGIC_LEN 7 // Not including null char + +#define IPC_EVENT_TAG_CHANGE "tag_change_event" +#define IPC_EVENT_CLIENT_FOCUS_CHANGE "client_focus_change_event" +#define IPC_EVENT_LAYOUT_CHANGE "layout_change_event" +#define IPC_EVENT_MONITOR_FOCUS_CHANGE "monitor_focus_change_event" +#define IPC_EVENT_FOCUSED_TITLE_CHANGE "focused_title_change_event" +#define IPC_EVENT_FOCUSED_STATE_CHANGE "focused_state_change_event" + +#define YSTR(str) yajl_gen_string(gen, (unsigned char *)str, strlen(str)) +#define YINT(num) yajl_gen_integer(gen, num) +#define YDOUBLE(num) yajl_gen_double(gen, num) +#define YBOOL(v) yajl_gen_bool(gen, v) +#define YNULL() yajl_gen_null(gen) +#define YARR(body) \ + { \ + yajl_gen_array_open(gen); \ + body; \ + yajl_gen_array_close(gen); \ + } +#define YMAP(body) \ + { \ + yajl_gen_map_open(gen); \ + body; \ + yajl_gen_map_close(gen); \ + } + +typedef unsigned long Window; + +const char *DEFAULT_SOCKET_PATH = "/tmp/dwm.sock"; +static int sock_fd = -1; +static unsigned int ignore_reply = 0; + +typedef enum IPCMessageType { + IPC_TYPE_RUN_COMMAND = 0, + IPC_TYPE_GET_MONITORS = 1, + IPC_TYPE_GET_TAGS = 2, + IPC_TYPE_GET_LAYOUTS = 3, + IPC_TYPE_GET_DWM_CLIENT = 4, + IPC_TYPE_SUBSCRIBE = 5, + IPC_TYPE_EVENT = 6 +} IPCMessageType; + +// Every IPC message must begin with this +typedef struct dwm_ipc_header { + uint8_t magic[IPC_MAGIC_LEN]; + uint32_t size; + uint8_t type; +} __attribute((packed)) dwm_ipc_header_t; + +static int +recv_message(uint8_t *msg_type, uint32_t *reply_size, uint8_t **reply) +{ + uint32_t read_bytes = 0; + const int32_t to_read = sizeof(dwm_ipc_header_t); + char header[to_read]; + char *walk = header; + + // Try to read header + while (read_bytes < to_read) { + ssize_t n = read(sock_fd, header + read_bytes, to_read - read_bytes); + + if (n == 0) { + if (read_bytes == 0) { + fprintf(stderr, "Unexpectedly reached EOF while reading header."); + fprintf(stderr, + "Read %" PRIu32 " bytes, expected %" PRIu32 " total bytes.\n", + read_bytes, to_read); + return -2; + } else { + fprintf(stderr, "Unexpectedly reached EOF while reading header."); + fprintf(stderr, + "Read %" PRIu32 " bytes, expected %" PRIu32 " total bytes.\n", + read_bytes, to_read); + return -3; + } + } else if (n == -1) { + return -1; + } + + read_bytes += n; + } + + // Check if magic string in header matches + if (memcmp(walk, IPC_MAGIC, IPC_MAGIC_LEN) != 0) { + fprintf(stderr, "Invalid magic string. Got '%.*s', expected '%s'\n", + IPC_MAGIC_LEN, walk, IPC_MAGIC); + return -3; + } + + walk += IPC_MAGIC_LEN; + + // Extract reply size + memcpy(reply_size, walk, sizeof(uint32_t)); + walk += sizeof(uint32_t); + + // Extract message type + memcpy(msg_type, walk, sizeof(uint8_t)); + walk += sizeof(uint8_t); + + (*reply) = malloc(*reply_size); + + // Extract payload + read_bytes = 0; + while (read_bytes < *reply_size) { + ssize_t n = read(sock_fd, *reply + read_bytes, *reply_size - read_bytes); + + if (n == 0) { + fprintf(stderr, "Unexpectedly reached EOF while reading payload."); + fprintf(stderr, "Read %" PRIu32 " bytes, expected %" PRIu32 " bytes.\n", + read_bytes, *reply_size); + free(*reply); + return -2; + } else if (n == -1) { + if (errno == EINTR || errno == EAGAIN) continue; + free(*reply); + return -1; + } + + read_bytes += n; + } + + return 0; +} + +static int +read_socket(IPCMessageType *msg_type, uint32_t *msg_size, char **msg) +{ + int ret = -1; + + while (ret != 0) { + ret = recv_message((uint8_t *)msg_type, msg_size, (uint8_t **)msg); + + if (ret < 0) { + // Try again (non-fatal error) + if (ret == -1 && (errno == EINTR || errno == EAGAIN)) continue; + + fprintf(stderr, "Error receiving response from socket. "); + fprintf(stderr, "The connection might have been lost.\n"); + exit(2); + } + } + + return 0; +} + +static ssize_t +write_socket(const void *buf, size_t count) +{ + size_t written = 0; + + while (written < count) { + const ssize_t n = + write(sock_fd, ((uint8_t *)buf) + written, count - written); + + if (n == -1) { + if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) + continue; + else + return n; + } + written += n; + } + return written; +} + +static void +connect_to_socket() +{ + struct sockaddr_un addr; + + int sock = socket(AF_UNIX, SOCK_STREAM, 0); + + // Initialize struct to 0 + memset(&addr, 0, sizeof(struct sockaddr_un)); + + addr.sun_family = AF_UNIX; + strcpy(addr.sun_path, DEFAULT_SOCKET_PATH); + + connect(sock, (const struct sockaddr *)&addr, sizeof(struct sockaddr_un)); + + sock_fd = sock; +} + +static int +send_message(IPCMessageType msg_type, uint32_t msg_size, uint8_t *msg) +{ + dwm_ipc_header_t header = { + .magic = IPC_MAGIC_ARR, .size = msg_size, .type = msg_type}; + + size_t header_size = sizeof(dwm_ipc_header_t); + size_t total_size = header_size + msg_size; + + uint8_t buffer[total_size]; + + // Copy header to buffer + memcpy(buffer, &header, header_size); + // Copy message to buffer + memcpy(buffer + header_size, msg, header.size); + + write_socket(buffer, total_size); + + return 0; +} + +static int +is_float(const char *s) +{ + size_t len = strlen(s); + int is_dot_used = 0; + int is_minus_used = 0; + + // Floats can only have one decimal point in between or digits + // Optionally, floats can also be below zero (negative) + for (int i = 0; i < len; i++) { + if (isdigit(s[i])) + continue; + else if (!is_dot_used && s[i] == '.' && i != 0 && i != len - 1) { + is_dot_used = 1; + continue; + } else if (!is_minus_used && s[i] == '-' && i == 0) { + is_minus_used = 1; + continue; + } else + return 0; + } + + return 1; +} + +static int +is_unsigned_int(const char *s) +{ + size_t len = strlen(s); + + // Unsigned int can only have digits + for (int i = 0; i < len; i++) { + if (isdigit(s[i])) + continue; + else + return 0; + } + + return 1; +} + +static int +is_signed_int(const char *s) +{ + size_t len = strlen(s); + + // Signed int can only have digits and a negative sign at the start + for (int i = 0; i < len; i++) { + if (isdigit(s[i])) + continue; + else if (i == 0 && s[i] == '-') { + continue; + } else + return 0; + } + + return 1; +} + +static void +flush_socket_reply() +{ + IPCMessageType reply_type; + uint32_t reply_size; + char *reply; + + read_socket(&reply_type, &reply_size, &reply); + + free(reply); +} + +static void +print_socket_reply() +{ + IPCMessageType reply_type; + uint32_t reply_size; + char *reply; + + read_socket(&reply_type, &reply_size, &reply); + + printf("%.*s\n", reply_size, reply); + fflush(stdout); + free(reply); +} + +static int +run_command(const char *name, char *args[], int argc) +{ + const unsigned char *msg; + size_t msg_size; + + yajl_gen gen = yajl_gen_alloc(NULL); + + // Message format: + // { + // "command": "", + // "args": [ ... ] + // } + // clang-format off + YMAP( + YSTR("command"); YSTR(name); + YSTR("args"); YARR( + for (int i = 0; i < argc; i++) { + if (is_signed_int(args[i])) { + long long num = atoll(args[i]); + YINT(num); + } else if (is_float(args[i])) { + float num = atof(args[i]); + YDOUBLE(num); + } else { + YSTR(args[i]); + } + } + ) + ) + // clang-format on + + yajl_gen_get_buf(gen, &msg, &msg_size); + + send_message(IPC_TYPE_RUN_COMMAND, msg_size, (uint8_t *)msg); + + if (!ignore_reply) + print_socket_reply(); + else + flush_socket_reply(); + + yajl_gen_free(gen); + + return 0; +} + +static int +get_monitors() +{ + send_message(IPC_TYPE_GET_MONITORS, 1, (uint8_t *)""); + print_socket_reply(); + return 0; +} + +static int +get_tags() +{ + send_message(IPC_TYPE_GET_TAGS, 1, (uint8_t *)""); + print_socket_reply(); + + return 0; +} + +static int +get_layouts() +{ + send_message(IPC_TYPE_GET_LAYOUTS, 1, (uint8_t *)""); + print_socket_reply(); + + return 0; +} + +static int +get_dwm_client(Window win) +{ + const unsigned char *msg; + size_t msg_size; + + yajl_gen gen = yajl_gen_alloc(NULL); + + // Message format: + // { + // "client_window_id": "" + // } + // clang-format off + YMAP( + YSTR("client_window_id"); YINT(win); + ) + // clang-format on + + yajl_gen_get_buf(gen, &msg, &msg_size); + + send_message(IPC_TYPE_GET_DWM_CLIENT, msg_size, (uint8_t *)msg); + + print_socket_reply(); + + yajl_gen_free(gen); + + return 0; +} + +static int +subscribe(const char *event) +{ + const unsigned char *msg; + size_t msg_size; + + yajl_gen gen = yajl_gen_alloc(NULL); + + // Message format: + // { + // "event": "", + // "action": "subscribe" + // } + // clang-format off + YMAP( + YSTR("event"); YSTR(event); + YSTR("action"); YSTR("subscribe"); + ) + // clang-format on + + yajl_gen_get_buf(gen, &msg, &msg_size); + + send_message(IPC_TYPE_SUBSCRIBE, msg_size, (uint8_t *)msg); + + if (!ignore_reply) + print_socket_reply(); + else + flush_socket_reply(); + + yajl_gen_free(gen); + + return 0; +} + +static void +usage_error(const char *prog_name, const char *format, ...) +{ + va_list args; + va_start(args, format); + + fprintf(stderr, "Error: "); + vfprintf(stderr, format, args); + fprintf(stderr, "\nusage: %s [...]\n", prog_name); + fprintf(stderr, "Try '%s help'\n", prog_name); + + va_end(args); + exit(1); +} + +static void +print_usage(const char *name) +{ + printf("usage: %s [options] [...]\n", name); + puts(""); + puts("Commands:"); + puts(" run_command [args...] Run an IPC command"); + puts(""); + puts(" get_monitors Get monitor properties"); + puts(""); + puts(" get_tags Get list of tags"); + puts(""); + puts(" get_layouts Get list of layouts"); + puts(""); + puts(" get_dwm_client Get dwm client proprties"); + puts(""); + puts(" subscribe [events...] Subscribe to specified events"); + puts(" Options: " IPC_EVENT_TAG_CHANGE ","); + puts(" " IPC_EVENT_LAYOUT_CHANGE ","); + puts(" " IPC_EVENT_CLIENT_FOCUS_CHANGE ","); + puts(" " IPC_EVENT_MONITOR_FOCUS_CHANGE ","); + puts(" " IPC_EVENT_FOCUSED_TITLE_CHANGE ","); + puts(" " IPC_EVENT_FOCUSED_STATE_CHANGE); + puts(""); + puts(" help Display this message"); + puts(""); + puts("Options:"); + puts(" --ignore-reply Don't print reply messages from"); + puts(" run_command and subscribe."); + puts(""); +} + +int +main(int argc, char *argv[]) +{ + const char *prog_name = argv[0]; + + connect_to_socket(); + if (sock_fd == -1) { + fprintf(stderr, "Failed to connect to socket\n"); + return 1; + } + + int i = 1; + if (i < argc && strcmp(argv[i], "--ignore-reply") == 0) { + ignore_reply = 1; + i++; + } + + if (i >= argc) usage_error(prog_name, "Expected an argument, got none"); + + if (!argc || strcmp(argv[i], "help") == 0) + print_usage(prog_name); + else if (strcmp(argv[i], "run_command") == 0) { + if (++i >= argc) usage_error(prog_name, "No command specified"); + // Command name + char *command = argv[i]; + // Command arguments are everything after command name + char **command_args = argv + ++i; + // Number of command arguments + int command_argc = argc - i; + run_command(command, command_args, command_argc); + } else if (strcmp(argv[i], "get_monitors") == 0) { + get_monitors(); + } else if (strcmp(argv[i], "get_tags") == 0) { + get_tags(); + } else if (strcmp(argv[i], "get_layouts") == 0) { + get_layouts(); + } else if (strcmp(argv[i], "get_dwm_client") == 0) { + if (++i < argc) { + if (is_unsigned_int(argv[i])) { + Window win = atol(argv[i]); + get_dwm_client(win); + } else + usage_error(prog_name, "Expected unsigned integer argument"); + } else + usage_error(prog_name, "Expected the window id"); + } else if (strcmp(argv[i], "subscribe") == 0) { + if (++i < argc) { + for (int j = i; j < argc; j++) subscribe(argv[j]); + } else + usage_error(prog_name, "Expected event name"); + // Keep listening for events forever + while (1) { + print_socket_reply(); + } + } else + usage_error(prog_name, "Invalid argument '%s'", argv[i]); + + return 0; +} + diff --git a/patch/ipc/yajl_dumps.h b/patch/ipc/yajl_dumps.h new file mode 100644 index 0000000..bb57a17 --- /dev/null +++ b/patch/ipc/yajl_dumps.h @@ -0,0 +1,66 @@ +#ifndef YAJL_DUMPS_H_ +#define YAJL_DUMPS_H_ + +#include +#include + +#define YSTR(str) yajl_gen_string(gen, (unsigned char *)str, strlen(str)) +#define YINT(num) yajl_gen_integer(gen, num) +#define YDOUBLE(num) yajl_gen_double(gen, num) +#define YBOOL(v) yajl_gen_bool(gen, v) +#define YNULL() yajl_gen_null(gen) +#define YARR(body) \ + { \ + yajl_gen_array_open(gen); \ + body; \ + yajl_gen_array_close(gen); \ + } +#define YMAP(body) \ + { \ + yajl_gen_map_open(gen); \ + body; \ + yajl_gen_map_close(gen); \ + } + +int dump_tag(yajl_gen gen, const char *name, const int tag_mask); + +int dump_tags(yajl_gen gen, int tags_len); + +int dump_client(yajl_gen gen, Client *c); + +int dump_monitor(yajl_gen gen, Monitor *mon, int is_selected); + +int dump_monitors(yajl_gen gen, Monitor *mons, Monitor *selmon); + +int dump_layouts(yajl_gen gen, const Layout layouts[], const int layouts_len); + +int dump_tag_state(yajl_gen gen, TagState state); + +int dump_tag_event(yajl_gen gen, int mon_num, TagState old_state, + TagState new_state); + +int dump_client_focus_change_event(yajl_gen gen, Client *old_client, + Client *new_client, int mon_num); + +int dump_layout_change_event(yajl_gen gen, const int mon_num, + const char *old_symbol, const Layout *old_layout, + const char *new_symbol, const Layout *new_layout); + +int dump_monitor_focus_change_event(yajl_gen gen, const int last_mon_num, + const int new_mon_num); + +int dump_focused_title_change_event(yajl_gen gen, const int mon_num, + const Window client_id, + const char *old_name, const char *new_name); + +int dump_client_state(yajl_gen gen, const ClientState *state); + +int dump_focused_state_change_event(yajl_gen gen, const int mon_num, + const Window client_id, + const ClientState *old_state, + const ClientState *new_state); + +int dump_error_message(yajl_gen gen, const char *reason); + +#endif // YAJL_DUMPS_H_ + diff --git a/patch/layout_centeredfloatingmaster.c b/patch/layout_centeredfloatingmaster.c new file mode 100644 index 0000000..af3c192 --- /dev/null +++ b/patch/layout_centeredfloatingmaster.c @@ -0,0 +1,55 @@ +void +centeredfloatingmaster(Monitor *m) +{ + unsigned int i, n; + float mfacts, sfacts; + int mrest, srest; + int mx = 0, my = 0, mh = 0, mw = 0; + int sx = 0, sy = 0, sh = 0, sw = 0; + Client *c; + + float mivf = 1.0; // master inner vertical gap factor + int oh, ov, ih, iv; + 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; + } +} + diff --git a/patch/layout_centeredfloatingmaster.h b/patch/layout_centeredfloatingmaster.h new file mode 100644 index 0000000..66b0b0e --- /dev/null +++ b/patch/layout_centeredfloatingmaster.h @@ -0,0 +1,2 @@ +static void centeredfloatingmaster(Monitor *m); + diff --git a/patch/layout_centeredmaster.c b/patch/layout_centeredmaster.c new file mode 100644 index 0000000..4b40a30 --- /dev/null +++ b/patch/layout_centeredmaster.c @@ -0,0 +1,85 @@ +void +centeredmaster(Monitor *m) +{ + unsigned int i, n; + 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; + + int oh, ov, ih, iv; + 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; + mx += lw + iv; + } else { + /* ||<---M--->|<-S->|| */ + mw = (mw - iv) * m->mfact; + lw = m->ww - mw - iv - 2*ov; + } + rw = lw; + 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; + } + } + } +} + diff --git a/patch/layout_centeredmaster.h b/patch/layout_centeredmaster.h new file mode 100644 index 0000000..703f8b8 --- /dev/null +++ b/patch/layout_centeredmaster.h @@ -0,0 +1,2 @@ +static void centeredmaster(Monitor *m); + diff --git a/patch/layout_facts.c b/patch/layout_facts.c new file mode 100644 index 0000000..241d344 --- /dev/null +++ b/patch/layout_facts.c @@ -0,0 +1,24 @@ +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 +} + diff --git a/patch/layout_fibonacci.c b/patch/layout_fibonacci.c new file mode 100644 index 0000000..58f0f3e --- /dev/null +++ b/patch/layout_fibonacci.c @@ -0,0 +1,94 @@ +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 = 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); + } +} + +static void +dwindle(Monitor *m) +{ + fibonacci(m, 1); +} + + diff --git a/patch/layout_fibonacci.h b/patch/layout_fibonacci.h new file mode 100644 index 0000000..f13f77f --- /dev/null +++ b/patch/layout_fibonacci.h @@ -0,0 +1,3 @@ +static void dwindle(Monitor *m); +static void fibonacci(Monitor *m, int s); + diff --git a/patch/layout_monocle.c b/patch/layout_monocle.c new file mode 100644 index 0000000..4b3516c --- /dev/null +++ b/patch/layout_monocle.c @@ -0,0 +1,15 @@ +void +monocle(Monitor *m) +{ + unsigned int n = 0; + Client *c; + + for (c = m->clients; c; c = c->next) + if (ISVISIBLE(c)) + n++; + if (n > 0) /* override layout symbol */ + snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n); + for (c = nexttiled(m->clients); c; c = nexttiled(c->next)) + resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); +} + diff --git a/patch/layout_monocle.h b/patch/layout_monocle.h new file mode 100644 index 0000000..f32e49f --- /dev/null +++ b/patch/layout_monocle.h @@ -0,0 +1,2 @@ +static void monocle(Monitor *m); + diff --git a/patch/layout_nrowgrid.c b/patch/layout_nrowgrid.c new file mode 100644 index 0000000..5ea7e3d --- /dev/null +++ b/patch/layout_nrowgrid.c @@ -0,0 +1,53 @@ +void +nrowgrid(Monitor *m) +{ + unsigned int n = 0, i = 0, 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), i++, 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); + } +} + diff --git a/patch/layout_nrowgrid.h b/patch/layout_nrowgrid.h new file mode 100644 index 0000000..9cce593 --- /dev/null +++ b/patch/layout_nrowgrid.h @@ -0,0 +1,2 @@ +static void nrowgrid(Monitor *m); + diff --git a/patch/layout_tile.c b/patch/layout_tile.c new file mode 100644 index 0000000..8d41d2a --- /dev/null +++ b/patch/layout_tile.c @@ -0,0 +1,41 @@ +static void +tile(Monitor *m) +{ + unsigned int i, n; + 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; + + + int oh, ov, ih, iv; + 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) * m->mfact; + 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; + } +} + diff --git a/patch/layout_tile.h b/patch/layout_tile.h new file mode 100644 index 0000000..78cafc8 --- /dev/null +++ b/patch/layout_tile.h @@ -0,0 +1,2 @@ +static void tile(Monitor *); + diff --git a/patch/pertag.c b/patch/pertag.c new file mode 100644 index 0000000..ca9e47a --- /dev/null +++ b/patch/pertag.c @@ -0,0 +1,36 @@ +struct Pertag { + unsigned int curtag, prevtag; /* current and previous tag */ + int nmasters[NUMTAGS + 1]; /* number of windows in master area */ + const Layout *ltidxs[NUMTAGS + 1][2]; /* matrix of tags and layouts indexes */ + float mfacts[NUMTAGS + 1]; /* mfacts per tag */ + unsigned int sellts[NUMTAGS + 1]; /* selected layouts */ +}; + +void +pertagview(const Arg *arg) +{ + int i; + unsigned int tmptag; + if (arg->ui & TAGMASK) { + selmon->pertag->prevtag = selmon->pertag->curtag; + selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; + if (arg->ui == ~0) + selmon->pertag->curtag = 0; + else { + for (i = 0; !(arg->ui & 1 << i); i++) ; + selmon->pertag->curtag = i + 1; + } + } else { + tmptag = selmon->pertag->prevtag; + selmon->pertag->prevtag = selmon->pertag->curtag; + selmon->pertag->curtag = tmptag; + } + selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; + selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; + selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; + selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; + selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; + + +} + diff --git a/patch/pertag.h b/patch/pertag.h new file mode 100644 index 0000000..5c53ac9 --- /dev/null +++ b/patch/pertag.h @@ -0,0 +1,2 @@ +static void pertagview(const Arg *arg); + diff --git a/patch/scratchpad_alt_1.c b/patch/scratchpad_alt_1.c new file mode 100644 index 0000000..6724d5c --- /dev/null +++ b/patch/scratchpad_alt_1.c @@ -0,0 +1,72 @@ +static Client * scratchpad_last_showed = NULL; + +void +scratchpad_hide() +{ + if (selmon->sel) { + selmon->sel->tags = SCRATCHPAD_MASK; + selmon->sel->isfloating = 1; + focus(NULL); + arrange(selmon); + } +} + +_Bool +scratchpad_last_showed_is_killed(void) +{ + Client *c; + for (c = selmon->clients; c && c != scratchpad_last_showed; c = c->next); + return (c == NULL); +} + +void +scratchpad_remove() +{ + if (selmon->sel && scratchpad_last_showed != NULL && selmon->sel == scratchpad_last_showed) + scratchpad_last_showed = NULL; +} + +void +scratchpad_show() +{ + if (scratchpad_last_showed == NULL || scratchpad_last_showed_is_killed()) { + scratchpad_show_first(); + return; + } + + if (scratchpad_last_showed->tags != SCRATCHPAD_MASK) { + scratchpad_last_showed->tags = SCRATCHPAD_MASK; + focus(NULL); + arrange(selmon); + return; + } + + Client *c; + + for (c = selmon->clients; c && c != scratchpad_last_showed; c = c->next); + for (c = (c ? c->next : NULL); c && c->tags != SCRATCHPAD_MASK; c = c->next); + + if (c) + scratchpad_show_client(c); + else + scratchpad_show_first(); +} + +void +scratchpad_show_client(Client* c) +{ + scratchpad_last_showed = c; + c->tags = selmon->tagset[selmon->seltags]; + focus(c); + arrange(selmon); +} + +void +scratchpad_show_first(void) +{ + Client *c; + for (c = selmon->clients; c && c->tags != SCRATCHPAD_MASK; c = c->next); + if (c) + scratchpad_show_client(c); +} + diff --git a/patch/scratchpad_alt_1.h b/patch/scratchpad_alt_1.h new file mode 100644 index 0000000..4e25f11 --- /dev/null +++ b/patch/scratchpad_alt_1.h @@ -0,0 +1,9 @@ +#define SCRATCHPAD_MASK (1u << NUMTAGS) + +static void scratchpad_hide(); +static _Bool scratchpad_last_showed_is_killed(void); +static void scratchpad_remove(); +static void scratchpad_show(); +static void scratchpad_show_client(Client *c); +static void scratchpad_show_first(void); + diff --git a/patch/sticky.c b/patch/sticky.c new file mode 100644 index 0000000..420c3e0 --- /dev/null +++ b/patch/sticky.c @@ -0,0 +1,9 @@ +void +togglesticky(const Arg *arg) +{ + if (!selmon->sel) + return; + selmon->sel->issticky = !selmon->sel->issticky; + arrange(selmon); +} + diff --git a/patch/sticky.h b/patch/sticky.h new file mode 100644 index 0000000..277bb34 --- /dev/null +++ b/patch/sticky.h @@ -0,0 +1,2 @@ +static void togglesticky(const Arg *arg); + diff --git a/patch/swallow.c b/patch/swallow.c new file mode 100644 index 0000000..8a84134 --- /dev/null +++ b/patch/swallow.c @@ -0,0 +1,214 @@ +#include +#include +#ifdef __OpenBSD__ +#include +#include +#endif /* __OpenBSD__ */ + +static int scanner; +static xcb_connection_t *xcon; + +int +swallow(Client *p, Client *c) +{ + Client *s; + XWindowChanges wc; + + if (c->noswallow > 0 || c->isterminal) + return 0; + if (c->noswallow < 0 && !swallowfloating && c->isfloating) + return 0; + + XMapWindow(dpy, c->win); + + 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; + setfloatinghint(s); + + wc.border_width = p->bw; + XConfigureWindow(dpy, p->win, CWBorderWidth, &wc); + XMoveResizeWindow(dpy, p->win, s->x, s->y, s->w, s->h); + XSetWindowBorder(dpy, p->win, scheme[SchemeNorm][ColBorder].pixel); + + arrange(p->mon); + configure(p); + updateclientlist(); + + return 1; +} + +void +unswallow(Client *c) +{ + XWindowChanges wc; + 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); + + wc.border_width = c->bw; + XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); + XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); + XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); + + setfloatinghint(c); + setclientstate(c, NormalState); + focus(NULL); + arrange(c->mon); +} + +pid_t +winpid(Window w) +{ + pid_t result = 0; + + #ifdef __linux__ + 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; + + #endif /* __linux__ */ + #ifdef __OpenBSD__ + Atom type; + int format; + unsigned long len, bytes; + unsigned char *prop; + pid_t ret; + + if (XGetWindowProperty(dpy, w, XInternAtom(dpy, "_NET_WM_PID", 1), 0, 1, False, AnyPropertyType, &type, &format, &len, &bytes, &prop) != Success || !prop) + return 0; + + ret = *(pid_t*)prop; + XFree(prop); + result = ret; + #endif /* __OpenBSD__ */ + + return result; +} + +pid_t +getparentprocess(pid_t p) +{ + unsigned int v = 0; + +#ifdef __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); +#endif /* __linux__ */ +#ifdef __OpenBSD__ + int n; + kvm_t *kd; + struct kinfo_proc *kp; + + kd = kvm_openfiles(NULL, NULL, NULL, KVM_NO_FILES, NULL); + if (!kd) + return 0; + + kp = kvm_getprocs(kd, KERN_PROC_PID, p, sizeof(*kp), &n); + v = kp->p_ppid; +#endif /* __OpenBSD__ */ + 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; + + c = selmon->sel; + if (c && c->isterminal && !c->swallowing && c->pid && isdescprocess(c->pid, w->pid)) + return c; + + 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; +} + diff --git a/patch/swallow.h b/patch/swallow.h new file mode 100644 index 0000000..529fea9 --- /dev/null +++ b/patch/swallow.h @@ -0,0 +1,8 @@ +static pid_t getparentprocess(pid_t p); +static int isdescprocess(pid_t p, pid_t c); +static int swallow(Client *p, Client *c); +static Client *swallowingclient(Window w); +static Client *termforwin(const Client *c); +static void unswallow(Client *c); +static pid_t winpid(Window w); + diff --git a/patch/tagallmon.c b/patch/tagallmon.c new file mode 100644 index 0000000..163d0ad --- /dev/null +++ b/patch/tagallmon.c @@ -0,0 +1,44 @@ +void +tagallmon(const Arg *arg) +{ + Monitor *m; + Client *c, *last, *slast, *next; + + if (!mons->next) + return; + + m = dirtomon(arg->i); + for (last = m->clients; last && last->next; last = last->next); + for (slast = m->stack; slast && slast->snext; slast = slast->snext); + + for (c = selmon->clients; c; c = next) { + next = c->next; + if (!ISVISIBLE(c)) + continue; + unfocus(c, 1, NULL); + detach(c); + detachstack(c); + c->mon = m; + c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ + c->next = NULL; + c->snext = NULL; + if (last) + last = last->next = c; + else + m->clients = last = c; + if (slast) + slast = slast->snext = c; + else + m->stack = slast = c; + if (c->isfullscreen) { + if (c->fakefullscreen != 1) { + resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); + XRaiseWindow(dpy, c->win); + } + } + } + + focus(NULL); + arrange(NULL); +} + diff --git a/patch/tagallmon.h b/patch/tagallmon.h new file mode 100644 index 0000000..9abf535 --- /dev/null +++ b/patch/tagallmon.h @@ -0,0 +1,2 @@ +static void tagallmon(const Arg *arg); + diff --git a/patch/tagswapmon.c b/patch/tagswapmon.c new file mode 100644 index 0000000..e8b9719 --- /dev/null +++ b/patch/tagswapmon.c @@ -0,0 +1,65 @@ +void +tagswapmon(const Arg *arg) +{ + Monitor *m; + Client *c, *sc = NULL, *mc = NULL, *next; + + if (!mons->next) + return; + + m = dirtomon(arg->i); + + for (c = selmon->clients; c; c = next) { + next = c->next; + if (!ISVISIBLE(c)) + continue; + unfocus(c, 1, NULL); + detach(c); + detachstack(c); + c->next = sc; + sc = c; + } + + for (c = m->clients; c; c = next) { + next = c->next; + if (!ISVISIBLE(c)) + continue; + unfocus(c, 1, NULL); + detach(c); + detachstack(c); + c->next = mc; + mc = c; + } + + for (c = sc; c; c = next) { + next = c->next; + c->mon = m; + c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ + attach(c); + attachstack(c); + if (c->isfullscreen) { + if (c->fakefullscreen != 1) { + resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); + XRaiseWindow(dpy, c->win); + } + } + } + + for (c = mc; c; c = next) { + next = c->next; + c->mon = selmon; + c->tags = selmon->tagset[selmon->seltags]; /* assign tags of target monitor */ + attach(c); + attachstack(c); + if (c->isfullscreen) { + if (c->fakefullscreen != 1) { + resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); + XRaiseWindow(dpy, c->win); + } + } + } + + focus(NULL); + arrange(NULL); +} + diff --git a/patch/tagswapmon.h b/patch/tagswapmon.h new file mode 100644 index 0000000..949f591 --- /dev/null +++ b/patch/tagswapmon.h @@ -0,0 +1,2 @@ +static void tagswapmon(const Arg *arg); + diff --git a/patch/transfer.c b/patch/transfer.c new file mode 100644 index 0000000..ce64319 --- /dev/null +++ b/patch/transfer.c @@ -0,0 +1,34 @@ +void +transfer(const Arg *arg) +{ + Client *c, *mtail = selmon->clients, *stail = NULL, *insertafter; + int transfertostack = 0, i, nmasterclients; + + for (i = 0, c = selmon->clients; c; c = c->next) { + if (!ISVISIBLE(c) || c->isfloating) continue; + if (selmon->sel == c) { transfertostack = i < selmon->nmaster && selmon->nmaster != 0; } + if (i < selmon->nmaster) { nmasterclients++; mtail = c; } + stail = c; + i++; + } + if (!selmon->sel || selmon->sel->isfloating || i == 0) { + return; + } else if (transfertostack) { + selmon->nmaster = MIN(i, selmon->nmaster) - 1; + insertafter = stail; + } else { + selmon->nmaster = selmon->nmaster + 1; + insertafter = mtail; + } + if (insertafter != selmon->sel) { + detach(selmon->sel); + if (selmon->nmaster == 1 && !transfertostack) { + attach(selmon->sel); // Head prepend case + } else { + selmon->sel->next = insertafter->next; + insertafter->next = selmon->sel; + } + } + arrange(selmon); +} + diff --git a/patch/transfer.h b/patch/transfer.h new file mode 100644 index 0000000..e887dae --- /dev/null +++ b/patch/transfer.h @@ -0,0 +1,2 @@ +static void transfer(const Arg *arg); + diff --git a/patch/vanitygaps.c b/patch/vanitygaps.c new file mode 100644 index 0000000..f3ecc12 --- /dev/null +++ b/patch/vanitygaps.c @@ -0,0 +1,130 @@ +/* Settings */ +static int enablegaps = 1; + +static 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); +} + + +static void +togglegaps(const Arg *arg) +{ + enablegaps = !enablegaps; + arrange(NULL); +} + +static void +defaultgaps(const Arg *arg) +{ + setgaps(gappoh, gappov, gappih, gappiv); +} + +static void +incrgaps(const Arg *arg) +{ + setgaps( + selmon->gappoh + arg->i, + selmon->gappov + arg->i, + selmon->gappih + arg->i, + selmon->gappiv + arg->i + ); +} + +static void +incrigaps(const Arg *arg) +{ + setgaps( + selmon->gappoh, + selmon->gappov, + selmon->gappih + arg->i, + selmon->gappiv + arg->i + ); +} + +static void +incrogaps(const Arg *arg) +{ + setgaps( + selmon->gappoh + arg->i, + selmon->gappov + arg->i, + selmon->gappih, + selmon->gappiv + ); +} + +static void +incrohgaps(const Arg *arg) +{ + setgaps( + selmon->gappoh + arg->i, + selmon->gappov, + selmon->gappih, + selmon->gappiv + ); +} + +static void +incrovgaps(const Arg *arg) +{ + setgaps( + selmon->gappoh, + selmon->gappov + arg->i, + selmon->gappih, + selmon->gappiv + ); +} + +static void +incrihgaps(const Arg *arg) +{ + setgaps( + selmon->gappoh, + selmon->gappov, + selmon->gappih + arg->i, + selmon->gappiv + ); +} + +static void +incrivgaps(const Arg *arg) +{ + setgaps( + selmon->gappoh, + selmon->gappov, + selmon->gappih, + selmon->gappiv + arg->i + ); +} + +static void +getgaps(Monitor *m, int *oh, int *ov, int *ih, int *iv, unsigned int *nc) +{ + unsigned int n, oe, ie; + oe = ie = enablegaps; + Client *c; + + for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); + if (n == 1) { + oe *= smartgaps_fact; // outer gaps disabled or multiplied 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 +} + diff --git a/patch/vanitygaps.h b/patch/vanitygaps.h new file mode 100644 index 0000000..81045ad --- /dev/null +++ b/patch/vanitygaps.h @@ -0,0 +1,15 @@ +/* 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); + +/* Internals */ +static void getgaps(Monitor *m, int *oh, int *ov, int *ih, int *iv, unsigned int *nc); +static void setgaps(int oh, int ov, int ih, int iv); + diff --git a/transient.c b/transient.c new file mode 100644 index 0000000..158460f --- /dev/null +++ b/transient.c @@ -0,0 +1,43 @@ +/* cc transient.c -o transient -lX11 */ + +#include +#include +#include +#include + +int main(void) { + Display *d; + Window r, f, t = None; + XSizeHints h; + XEvent e; + + d = XOpenDisplay(NULL); + if (!d) + exit(1); + r = DefaultRootWindow(d); + + f = XCreateSimpleWindow(d, r, 100, 100, 400, 400, 0, 0, 0); + h.min_width = h.max_width = h.min_height = h.max_height = 400; + h.flags = PMinSize | PMaxSize; + XSetWMNormalHints(d, f, &h); + XStoreName(d, f, "floating"); + XMapWindow(d, f); + + XSelectInput(d, f, ExposureMask); + while (1) { + XNextEvent(d, &e); + + if (t == None) { + sleep(5); + t = XCreateSimpleWindow(d, r, 50, 50, 100, 100, 0, 0, 0); + XSetTransientForHint(d, t, f); + XStoreName(d, t, "transient"); + XMapWindow(d, t); + XSelectInput(d, t, ExposureMask); + } + } + + XCloseDisplay(d); + exit(0); +} + diff --git a/util.c b/util.c new file mode 100644 index 0000000..bcecb12 --- /dev/null +++ b/util.c @@ -0,0 +1,36 @@ +/* See LICENSE file for copyright and license details. */ +#include +#include +#include +#include + +#include "util.h" + +void * +ecalloc(size_t nmemb, size_t size) +{ + void *p; + + if (!(p = calloc(nmemb, size))) + die("calloc:"); + return p; +} + +void +die(const char *fmt, ...) { + va_list ap; + + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + + if (fmt[0] && fmt[strlen(fmt)-1] == ':') { + fputc(' ', stderr); + perror(NULL); + } else { + fputc('\n', stderr); + } + + exit(1); +} + diff --git a/util.h b/util.h new file mode 100644 index 0000000..1e3cf9a --- /dev/null +++ b/util.h @@ -0,0 +1,19 @@ +/* See LICENSE file for copyright and license details. */ + +#ifndef MAX +#define MAX(A, B) ((A) > (B) ? (A) : (B)) +#endif +#ifndef MIN +#define MIN(A, B) ((A) < (B) ? (A) : (B)) +#endif +#define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B)) + +#ifdef _DEBUG +#define DEBUG(...) fprintf(stderr, __VA_ARGS__) +#else +#define DEBUG(...) +#endif + +void die(const char *fmt, ...); +void *ecalloc(size_t nmemb, size_t size); + diff --git a/util.o b/util.o new file mode 100644 index 0000000000000000000000000000000000000000..a11e0c1554e87abce156f704afc114326118d1c9 GIT binary patch literal 9640 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