From 4cd919762e25bad4781a5eddcd0ab833f37b6810 Mon Sep 17 00:00:00 2001 From: Hektor Misplon Date: Thu, 7 May 2020 19:29:15 +0000 Subject: [PATCH] Update .gitignore --- .suckless/dwm/.gitignore | 2 + .suckless/dwm/LICENSE | 37 - .suckless/dwm/Makefile | 51 - .suckless/dwm/README | 48 - .suckless/dwm/config.def.h | 118 - .suckless/dwm/config.h | 121 - .suckless/dwm/config.mk | 38 - .suckless/dwm/drw.c | 435 --- .suckless/dwm/drw.h | 57 - .suckless/dwm/drw.o | Bin 10472 -> 0 bytes .suckless/dwm/dwm | Bin 66592 -> 0 bytes .suckless/dwm/dwm.1 | 176 -- .suckless/dwm/dwm.c | 2363 ----------------- .suckless/dwm/dwm.o | Bin 60008 -> 0 bytes .suckless/dwm/dwm.png | Bin 373 -> 0 bytes .suckless/dwm/patches/centeredmaster.diff | 142 - .suckless/dwm/patches/dwm-notitle-6.2.diff | 81 - .../patches/dwm-pertag-20170513-ceac8c9.diff | 177 -- .../patches/dwm-ru_centeredmaster-6.2.diff | 157 -- .suckless/dwm/patches/dwm-ru_gaps-6.2.diff | 126 - .suckless/dwm/transient.c | 42 - .suckless/dwm/util.c | 35 - .suckless/dwm/util.h | 8 - .suckless/dwm/util.o | Bin 2224 -> 0 bytes 24 files changed, 2 insertions(+), 4212 deletions(-) delete mode 100644 .suckless/dwm/LICENSE delete mode 100644 .suckless/dwm/Makefile delete mode 100644 .suckless/dwm/README delete mode 100644 .suckless/dwm/config.def.h delete mode 100644 .suckless/dwm/config.h delete mode 100644 .suckless/dwm/config.mk delete mode 100644 .suckless/dwm/drw.c delete mode 100644 .suckless/dwm/drw.h delete mode 100644 .suckless/dwm/drw.o delete mode 100755 .suckless/dwm/dwm delete mode 100644 .suckless/dwm/dwm.1 delete mode 100644 .suckless/dwm/dwm.c delete mode 100644 .suckless/dwm/dwm.o delete mode 100644 .suckless/dwm/dwm.png delete mode 100644 .suckless/dwm/patches/centeredmaster.diff delete mode 100644 .suckless/dwm/patches/dwm-notitle-6.2.diff delete mode 100644 .suckless/dwm/patches/dwm-pertag-20170513-ceac8c9.diff delete mode 100644 .suckless/dwm/patches/dwm-ru_centeredmaster-6.2.diff delete mode 100644 .suckless/dwm/patches/dwm-ru_gaps-6.2.diff delete mode 100644 .suckless/dwm/transient.c delete mode 100644 .suckless/dwm/util.c delete mode 100644 .suckless/dwm/util.h delete mode 100644 .suckless/dwm/util.o diff --git a/.suckless/dwm/.gitignore b/.suckless/dwm/.gitignore index c6127b3..1635602 100644 --- a/.suckless/dwm/.gitignore +++ b/.suckless/dwm/.gitignore @@ -1,3 +1,5 @@ +*.old/ + # Prerequisites *.d diff --git a/.suckless/dwm/LICENSE b/.suckless/dwm/LICENSE deleted file mode 100644 index d221f09..0000000 --- a/.suckless/dwm/LICENSE +++ /dev/null @@ -1,37 +0,0 @@ -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/.suckless/dwm/Makefile b/.suckless/dwm/Makefile deleted file mode 100644 index 77bcbc0..0000000 --- a/.suckless/dwm/Makefile +++ /dev/null @@ -1,51 +0,0 @@ -# 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} - -all: options dwm - -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} - -clean: - rm -f dwm ${OBJ} dwm-${VERSION}.tar.gz - -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 - chmod 755 ${DESTDIR}${PREFIX}/bin/dwm - 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/.suckless/dwm/README b/.suckless/dwm/README deleted file mode 100644 index 95d4fd0..0000000 --- a/.suckless/dwm/README +++ /dev/null @@ -1,48 +0,0 @@ -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/.suckless/dwm/config.def.h b/.suckless/dwm/config.def.h deleted file mode 100644 index f256a6d..0000000 --- a/.suckless/dwm/config.def.h +++ /dev/null @@ -1,118 +0,0 @@ -/* 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 showbar = 1; /* 0 means no bar */ -static const int topbar = 1; /* 0 means bottom bar */ -static const char *fonts[] = { "monospace:size=10" }; -static const char dmenufont[] = "monospace:size=10"; -static const char col_gray1[] = "#222222"; -static const char col_gray2[] = "#444444"; -static const char col_gray3[] = "#bbbbbb"; -static const char col_gray4[] = "#eeeeee"; -static const char col_cyan[] = "#005577"; -static const char *colors[][3] = { - /* fg bg border */ - [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, - [SchemeSel] = { col_gray4, col_cyan, col_cyan }, -}; - -/* tagging */ -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; - -static const Rule rules[] = { - /* xprop(1): - * WM_CLASS(STRING) = instance, class - * WM_NAME(STRING) = title - */ - /* class instance title tags mask isfloating monitor */ - { "Gimp", NULL, NULL, 0, 1, -1 }, - { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, -}; - -/* layout(s) */ -static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ -static const int nmaster = 1; /* number of clients in master area */ -static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ - -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 }, -}; - -/* 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", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; -static const char *termcmd[] = { "st", NULL }; - -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, 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_Return, zoom, {0} }, - { MODKEY, XK_Tab, view, {0} }, - { MODKEY|ShiftMask, XK_c, killclient, {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, XK_space, setlayout, {0} }, - { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, - { MODKEY, XK_0, view, {.ui = ~0 } }, - { MODKEY|ShiftMask, XK_0, tag, {.ui = ~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 } }, - 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) - { MODKEY|ShiftMask, XK_q, quit, {0} }, -}; - -/* 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]} }, - { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, - { 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/.suckless/dwm/config.h b/.suckless/dwm/config.h deleted file mode 100644 index 18ef6bb..0000000 --- a/.suckless/dwm/config.h +++ /dev/null @@ -1,121 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -/* appearance */ -static const unsigned int borderpx = 2; /* border pixel of windows */ -static const unsigned int gappx = 5; /* gaps between windows */ -static const unsigned int snap = 32; /* snap pixel */ -static const int showbar = 1; /* 0 means no bar */ -static const int topbar = 0; /* 0 means bottom bar */ -static const char *fonts[] = { "Iosevka:size=10" }; -static const char dmenufont[] = "Iosevka:size=10"; -static const char col_gray1[] = "#000000"; -static const char col_gray2[] = "#222222"; -static const char col_gray3[] = "#444444"; -static const char col_gray4[] = "#eeeeee"; -static const char *colors[][3] = { - /* fg bg border */ - [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, - [SchemeSel] = { col_gray4, col_gray1, col_gray3 }, -}; - -/* tagging */ -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; - -static const Rule rules[] = { - /* xprop(1): - * WM_CLASS(STRING) = instance, class - * WM_NAME(STRING) = title - */ - /* class instance title tags mask isfloating monitor */ - { "Gimp", NULL, NULL, 0, 1, -1 }, - { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, -}; - -/* layout(s) */ -static const float mfact = 0.62; /* factor of master area size [0.05..0.95] */ -static const int nmaster = 1; /* number of clients in master area */ -static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ - -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 }, -}; - -/* key definitions */ -#define MODKEY Mod4Mask -#define TAGKEYS(KEY,TAG) \ - { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ - { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, - -/* helper for spawning shell commands in the pre dwm-5.0 fashion */ -#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } - -/* commands */ -static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ -static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray2, "-sb", col_gray2, "-sf", col_gray4, NULL }; -static const char *termcmd[] = { "st", NULL }; - -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, 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_Return, zoom, {0} }, - { MODKEY, XK_Tab, view, {0} }, - { MODKEY|ShiftMask, XK_c, killclient, {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|ShiftMask, XK_u, setlayout, {.v = &layouts[4]} }, - { MODKEY, XK_space, setlayout, {0} }, - { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, - { MODKEY, XK_0, view, {.ui = ~0 } }, - { MODKEY|ShiftMask, XK_0, tag, {.ui = ~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_minus, setgaps, {.i = -5 } }, - { MODKEY, XK_equal, setgaps, {.i = +5 } }, - { MODKEY|ShiftMask, XK_equal, setgaps, {.i = 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) - { MODKEY|ShiftMask, XK_q, quit, {0} }, -}; - -/* 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]} }, - { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, - { 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/.suckless/dwm/config.mk b/.suckless/dwm/config.mk deleted file mode 100644 index 6d36cb7..0000000 --- a/.suckless/dwm/config.mk +++ /dev/null @@ -1,38 +0,0 @@ -# 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 - -# Xinerama, comment if you don't want it -XINERAMALIBS = -lXinerama -XINERAMAFLAGS = -DXINERAMA - -# freetype -FREETYPELIBS = -lfontconfig -lXft -FREETYPEINC = /usr/include/freetype2 -# OpenBSD (uncomment) -#FREETYPEINC = ${X11INC}/freetype2 - -# includes and libs -INCS = -I${X11INC} -I${FREETYPEINC} -LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} - -# flags -CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} -#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS} -CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS} -LDFLAGS = ${LIBS} - -# Solaris -#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\" -#LDFLAGS = ${LIBS} - -# compiler and linker -CC = cc diff --git a/.suckless/dwm/drw.c b/.suckless/dwm/drw.c deleted file mode 100644 index 8fd1ca4..0000000 --- a/.suckless/dwm/drw.c +++ /dev/null @@ -1,435 +0,0 @@ -/* 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}; - -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) -{ - Drw *drw = ecalloc(1, sizeof(Drw)); - - drw->dpy = dpy; - drw->screen = screen; - drw->root = root; - drw->w = w; - drw->h = h; - drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); - drw->gc = XCreateGC(dpy, root, 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, DefaultDepth(drw->dpy, drw->screen)); -} - -void -drw_free(Drw *drw) -{ - XFreePixmap(drw->dpy, drw->drawable); - XFreeGC(drw->dpy, drw->gc); - 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) -{ - if (!drw || !dest || !clrname) - return; - - if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen), - clrname, dest)) - die("error, cannot allocate color '%s'", clrname); -} - -/* 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, const char *clrnames[], 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]); - 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_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) -{ - 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, - DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen)); - 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_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) -{ - if (!drw || !drw->fonts || !text) - return 0; - return drw_text(drw, 0, 0, 0, 0, 0, text, 0); -} - -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/.suckless/dwm/drw.h b/.suckless/dwm/drw.h deleted file mode 100644 index 4bcd5ad..0000000 --- a/.suckless/dwm/drw.h +++ /dev/null @@ -1,57 +0,0 @@ -/* 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 }; /* Clr scheme index */ -typedef XftColor Clr; - -typedef struct { - unsigned int w, h; - Display *dpy; - int screen; - Window root; - 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); -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_fontset_free(Fnt* set); -unsigned int drw_fontset_getwidth(Drw *drw, const char *text); -void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h); - -/* Colorscheme abstraction */ -void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); -Clr *drw_scm_create(Drw *drw, const char *clrnames[], 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); - -/* 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); - -/* Map functions */ -void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h); diff --git a/.suckless/dwm/drw.o b/.suckless/dwm/drw.o deleted file mode 100644 index db93e5e92a628b3c0d2ed4735a7dbec3d34f07f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10472 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 G+y4(;tavd1 diff --git a/.suckless/dwm/dwm b/.suckless/dwm/dwm deleted file mode 100755 index a53b513d855902d3b467d9ce7e0fa80342031e44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66592 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 bk51*Q=xhYE?urS$^)(lhf8XnW0#Wmy2uxby diff --git a/.suckless/dwm/dwm.1 b/.suckless/dwm/dwm.1 deleted file mode 100644 index 13b3729..0000000 --- a/.suckless/dwm/dwm.1 +++ /dev/null @@ -1,176 +0,0 @@ -.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 standard output, 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/.suckless/dwm/dwm.c b/.suckless/dwm/dwm.c deleted file mode 100644 index 7e39e0c..0000000 --- a/.suckless/dwm/dwm.c +++ /dev/null @@ -1,2363 +0,0 @@ -/* 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 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])) -#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 TAGMASK ((1 << LENGTH(tags)) - 1) -#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) - -/* enums */ -enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ -enum { SchemeNorm, SchemeSel }; /* color schemes */ -enum { NetSupported, NetWMName, NetWMState, NetWMCheck, - NetWMFullscreen, NetActiveWindow, NetWMWindowType, - NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ -enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ -enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkClientWin, - ClkRootWin, ClkLast }; /* clicks */ - -typedef union { - int i; - unsigned int ui; - float f; - const void *v; -} Arg; - -typedef struct { - unsigned int click; - unsigned int mask; - unsigned int button; - void (*func)(const Arg *arg); - const Arg arg; -} Button; - -typedef struct Monitor Monitor; -typedef struct Client Client; -struct Client { - char name[256]; - float mina, maxa; - int x, y, w, h; - int oldx, oldy, oldw, oldh; - int basew, baseh, incw, inch, maxw, maxh, minw, minh; - int bw, oldbw; - unsigned int tags; - int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; - Client *next; - Client *snext; - 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 { - char ltsymbol[16]; - float mfact; - int nmaster; - int num; - int by; /* bar geometry */ - int mx, my, mw, mh; /* screen size */ - int wx, wy, ww, wh; /* window area */ - int gappx; /* gaps between windows */ - unsigned int seltags; - unsigned int sellt; - unsigned int tagset[2]; - int showbar; - int topbar; - Client *clients; - Client *sel; - Client *stack; - Monitor *next; - Window barwin; - const Layout *lt[2]; - Pertag *pertag; -}; - -typedef struct { - const char *class; - const char *instance; - const char *title; - unsigned int tags; - int isfloating; - int monitor; -} Rule; - -/* 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 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 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 monocle(Monitor *m); -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(Client *c, Atom proto); -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 setgaps(const Arg *arg); -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 tile(Monitor *); -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); -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 updatewindowtype(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); -static void centeredmaster(Monitor *m); -static void centeredfloatingmaster(Monitor *m); - -/* variables */ -static const char broken[] = "broken"; -static char stext[256]; -static int screen; -static int sw, sh; /* X display screen geometry width, height */ -static int bh, blw = 0; /* bar geometry */ -static int lrpad; /* sum of left and right padding for text */ -static int (*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, - [UnmapNotify] = unmapnotify -}; -static Atom wmatom[WMLast], netatom[NetLast]; -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" - -struct Pertag { - unsigned int curtag, prevtag; /* current and previous tag */ - int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */ - float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */ - unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */ - const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes */ - int showbars[LENGTH(tags) + 1]; /* display bar for the current tag */ -}; - -/* compile-time check if all tags fit into an unsigned int bit array. */ -struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; - -/* function implementations */ -void -applyrules(Client *c) -{ - const char *class, *instance; - unsigned int i; - const Rule *r; - Monitor *m; - XClassHint ch = { NULL, NULL }; - - /* rule matching */ - 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; - - 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->instance || strstr(instance, r->instance))) - { - 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 (ch.res_class) - XFree(ch.res_class); - if (ch.res_name) - XFree(ch.res_name); - 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) -{ - unsigned int i, x, click; - Arg arg = {0}; - Client *c; - Monitor *m; - XButtonPressedEvent *ev = &e->xbutton; - - click = ClkRootWin; - /* focus monitor if necessary */ - if ((m = wintomon(ev->window)) && m != selmon) { - unfocus(selmon->sel, 1); - selmon = m; - focus(NULL); - } - if (ev->window == selmon->barwin) { - i = x = 0; - do - x += TEXTW(tags[i]); - while (ev->x >= x && ++i < LENGTH(tags)); - if (i < LENGTH(tags)) { - click = ClkTagBar; - arg.ui = 1 << i; - } else if (ev->x < x + blw) - click = ClkLtSymbol; - else - click = ClkStatusText; - } else if ((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 && 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); - for (i = 0; i < CurLast; i++) - drw_cur_free(drw, cursor[i]); - for (i = 0; i < LENGTH(colors); i++) - free(scheme[i]); - 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; - - if (mon == mons) - mons = mons->next; - else { - for (m = mons; m && m->next != mon; m = m->next); - m->next = mon->next; - } - XUnmapWindow(dpy, mon->barwin); - XDestroyWindow(dpy, mon->barwin); - free(mon); -} - -void -clientmessage(XEvent *e) -{ - XClientMessageEvent *cme = &e->xclient; - Client *c = wintoclient(cme->window); - - if (!c) - return; - if (cme->message_type == netatom[NetWMState]) { - if (cme->data.l[1] == netatom[NetWMFullscreen] - || cme->data.l[2] == netatom[NetWMFullscreen]) - 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; - 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, bh); - updatebars(); - for (m = mons; m; m = m->next) { - for (c = m->clients; c; c = c->next) - if (c->isfullscreen) - resizeclient(c, m->mx, m->my, m->mw, m->mh); - XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); - } - focus(NULL); - arrange(NULL); - } - } -} - -void -configurerequest(XEvent *e) -{ - Client *c; - Monitor *m; - XConfigureRequestEvent *ev = &e->xconfigurerequest; - XWindowChanges wc; - - 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 (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; - unsigned int i; - - m = ecalloc(1, sizeof(Monitor)); - m->tagset[0] = m->tagset[1] = 1; - m->mfact = mfact; - m->nmaster = nmaster; - m->showbar = showbar; - m->topbar = topbar; - m->gappx = gappx; - m->lt[0] = &layouts[0]; - m->lt[1] = &layouts[1 % LENGTH(layouts)]; - strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); - m->pertag = ecalloc(1, sizeof(Pertag)); - m->pertag->curtag = m->pertag->prevtag = 1; - - for (i = 0; i <= LENGTH(tags); i++) { - m->pertag->nmasters[i] = m->nmaster; - m->pertag->mfacts[i] = m->mfact; - - m->pertag->ltidxs[i][0] = m->lt[0]; - m->pertag->ltidxs[i][1] = m->lt[1]; - m->pertag->sellts[i] = m->sellt; - - m->pertag->showbars[i] = m->showbar; - } - - return m; -} - -void -destroynotify(XEvent *e) -{ - Client *c; - XDestroyWindowEvent *ev = &e->xdestroywindow; - - if ((c = wintoclient(ev->window))) - unmanage(c, 1); -} - -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) -{ - int x, w, sw = 0; - int boxs = drw->fonts->h / 9; - int boxw = drw->fonts->h / 6 + 2; - unsigned int i, occ = 0, urg = 0; - Client *c; - - /* draw status first so it can be overdrawn by tags later */ - if (m == selmon) { /* status is only drawn on selected monitor */ - drw_setscheme(drw, scheme[SchemeNorm]); - sw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ - drw_text(drw, m->ww - sw, 0, sw, bh, 0, stext, 0); - } - - for (c = m->clients; c; c = c->next) { - occ |= c->tags; - if (c->isurgent) - urg |= c->tags; - } - x = 0; - for (i = 0; i < LENGTH(tags); i++) { - w = TEXTW(tags[i]); - drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); - if (occ & 1 << i) - drw_rect(drw, x + boxs, boxs, boxw, boxw, - m == selmon && selmon->sel && selmon->sel->tags & 1 << i, - urg & 1 << i); - x += w; - } - w = blw = TEXTW(m->ltsymbol); - drw_setscheme(drw, scheme[SchemeNorm]); - x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); - - if ((w = m->ww - sw - x) > bh) { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, x, 0, w, bh, 1, 1); - } - drw_map(drw, m->barwin, 0, 0, m->ww, bh); -} - -void -drawbars(void) -{ - Monitor *m; - - for (m = mons; m; m = m->next) - drawbar(m); -} - -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); - 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); - if (c) { - if (c->mon != selmon) - selmon = c->mon; - if (c->isurgent) - seturgent(c, 0); - detachstack(c); - attachstack(c); - grabbuttons(c, 1); - 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); - selmon = m; - focus(NULL); -} - -void -focusstack(const Arg *arg) -{ - Client *c = NULL, *i; - - if (!selmon->sel) - return; - if (arg->i > 0) { - for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); - if (!c) - for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); - } else { - for (i = selmon->clients; i != selmon->sel; i = i->next) - if (ISVISIBLE(i)) - c = i; - if (!c) - for (; i; i = i->next) - if (ISVISIBLE(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; - - if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, - &da, &di, &dl, &dl, &p) == Success && p) { - atom = *(Atom *)p; - 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; - KeySym keysym; - XKeyEvent *ev; - - ev = &e->xkey; - keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); - 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)); -} - -void -killclient(const Arg *arg) -{ - if (!selmon->sel) - return; - if (!sendevent(selmon->sel, wmatom[WMDelete])) { - 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; - Window trans = None; - XWindowChanges wc; - - c = ecalloc(1, sizeof(Client)); - c->win = 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; - } else { - c->mon = selmon; - applyrules(c); - } - - 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->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); - c->bw = borderpx; - - wc.border_width = c->bw; - XConfigureWindow(dpy, w, CWBorderWidth, &wc); - XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); - configure(c); /* propagates border_width, if size doesn't change */ - updatewindowtype(c); - updatesizehints(c); - updatewmhints(c); - 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); - attach(c); - attachstack(c); - XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, - (unsigned char *) &(c->win), 1); - XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */ - setclientstate(c, NormalState); - if (c->mon == selmon) - unfocus(selmon->sel, 0); - c->mon->sel = c; - arrange(c->mon); - XMapWindow(dpy, c->win); - focus(NULL); -} - -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; - - if (!XGetWindowAttributes(dpy, ev->window, &wa)) - return; - if (wa.override_redirect) - return; - if (!wintoclient(ev->window)) - manage(ev->window, &wa); -} - -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); -} - -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); - 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) /* 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; - 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)) - togglefloating(NULL); - if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) - resize(c, nx, ny, c->w, c->h, 1); - 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); - } -} - -Client * -nexttiled(Client *c) -{ - for (; c && (c->isfloating || !ISVISIBLE(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 ((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); - drawbars(); - break; - } - if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) - updatetitle(c); - if (ev->atom == netatom[NetWMWindowType]) - updatewindowtype(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; - if (((nexttiled(c->mon->clients) == c && !nexttiled(c->next)) - || &monocle == c->mon->lt[c->mon->sellt]->arrange)) - { - c->w = wc.width += c->bw * 2; - c->h = wc.height += c->bw * 2; - wc.border_width = 0; - } - 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; - Client *c; - Monitor *m; - XEvent ev; - Time lasttime = 0; - - if (!(c = selmon->sel)) - return; - if (c->isfullscreen) /* no support resizing fullscreen windows by mouse */ - return; - restack(selmon); - ocx = c->x; - ocy = c->y; - if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, - None, cursor[CurResize]->cursor, CurrentTime) != GrabSuccess) - return; - XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 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; - - nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1); - nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 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)) - togglefloating(NULL); - } - if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) - resize(c, c->x, c->y, nw, nh, 1); - break; - } - } while (ev.type != ButtonRelease); - XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); - 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); - } -} - -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) { - wc.stack_mode = Below; - wc.sibling = m->barwin; - 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) -{ - 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); - } - 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); - } - if (wins) - XFree(wins); - } -} - -void -sendmon(Client *c, Monitor *m) -{ - if (c->mon == m) - return; - unfocus(c, 1); - 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); -} - -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(Client *c, Atom proto) -{ - int n; - Atom *protocols; - int exists = 0; - XEvent ev; - - if (XGetWMProtocols(dpy, c->win, &protocols, &n)) { - while (!exists && n--) - exists = protocols[n] == proto; - XFree(protocols); - } - if (exists) { - ev.type = ClientMessage; - ev.xclient.window = c->win; - ev.xclient.message_type = wmatom[WMProtocols]; - ev.xclient.format = 32; - ev.xclient.data.l[0] = proto; - ev.xclient.data.l[1] = CurrentTime; - XSendEvent(dpy, c->win, False, NoEventMask, &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, wmatom[WMTakeFocus]); -} - -void -setfullscreen(Client *c, int fullscreen) -{ - if (fullscreen && !c->isfullscreen) { - XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, - PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); - c->isfullscreen = 1; - c->oldstate = c->isfloating; - c->oldbw = c->bw; - 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 (!fullscreen && c->isfullscreen){ - XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, - PropModeReplace, (unsigned char*)0, 0); - c->isfullscreen = 0; - c->isfloating = c->oldstate; - c->bw = c->oldbw; - 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); - arrange(c->mon); - } -} - -void -setgaps(const Arg *arg) -{ - if ((arg->i == 0) || (selmon->gappx + arg->i < 0)) - selmon->gappx = 0; - else - selmon->gappx += arg->i; - arrange(selmon); -} - -void -setlayout(const Arg *arg) -{ - if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) - selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag] ^= 1; - if (arg && arg->v) - selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt] = (Layout *)arg->v; - 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.1 || f > 0.9) - 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); - drw = drw_create(dpy, screen, root, sw, sh); - 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); - netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); - netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", 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[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); - netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); - /* init cursors */ - cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); - cursor[CurResize] = drw_cur_create(drw, XC_sizing); - 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], 3); - /* init bars */ - 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); - XDeleteProperty(dpy, root, netatom[NetClientList]); - /* 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 */ - 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; - focus(NULL); - arrange(selmon); - } -} - -void -tagmon(const Arg *arg) -{ - if (!selmon->sel || !mons->next) - return; - sendmon(selmon->sel, dirtomon(arg->i)); -} - -void -tile(Monitor *m) -{ - unsigned int i, n, h, mw, my, ty, ns; - Client *c; - - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); - if (n == 0) - return; - if(n == 1){ - c = nexttiled(m->clients); - resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); - return; - } - - if (n > m->nmaster){ - mw = m->nmaster ? m->ww * m->mfact : 0; - ns = m->nmaster > 0 ? 2 : 1; - } - else{ - mw = m->ww - m->gappx; - ns = 1; - } - for (i = 0, my = ty = m->gappx, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) - if (i < m->nmaster) { - h = (m->wh - my) / (MIN(n, m->nmaster) - i) - m->gappx; - resize(c, m->wx + m->gappx, m->wy + my, mw - 2*c->bw - m->gappx*(5-ns)/2, h - 2*c->bw, 0); - my += HEIGHT(c) + m->gappx; - } else { - h = (m->wh - ty) / (n - i) - m->gappx; - resize(c, m->wx + mw + m->gappx/ns, m->wy + ty, m->ww - mw - (2*c->bw) - m->gappx*(5-ns)/2, h - 2*c->bw, 0); - ty += HEIGHT(c) + m->gappx; - } -} - -void -togglebar(const Arg *arg) -{ - selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar; - updatebarpos(selmon); - XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); - arrange(selmon); -} - -void -togglefloating(const Arg *arg) -{ - if (!selmon->sel) - return; - if (selmon->sel->isfullscreen) /* no support for fullscreen windows */ - return; - selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed; - if (selmon->sel->isfloating) - resize(selmon->sel, selmon->sel->x, selmon->sel->y, - selmon->sel->w, selmon->sel->h, 0); - arrange(selmon); -} - -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); - } -} - -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]; - - if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) - togglebar(NULL); - - focus(NULL); - arrange(selmon); - } -} - -void -unfocus(Client *c, int setfocus) -{ - if (!c) - return; - grabbuttons(c, 0); - 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; - XWindowChanges wc; - - 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); - } - free(c); - focus(NULL); - updateclientlist(); - arrange(m); -} - -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); - } -} - -void -updatebars(void) -{ - Monitor *m; - XSetWindowAttributes wa = { - .override_redirect = True, - .background_pixmap = ParentRelative, - .event_mask = ButtonPressMask|ExposureMask - }; - XClassHint ch = {"dwm", "dwm"}; - for (m = mons; m; m = m->next) { - if (m->barwin) - continue; - m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), - CopyFromParent, DefaultVisual(dpy, screen), - CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); - XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); - XMapRaised(dpy, m->barwin); - XSetClassHint(dpy, m->barwin, &ch); - } -} - -void -updatebarpos(Monitor *m) -{ - m->wy = m->my; - m->wh = m->mh; - if (m->showbar) { - m->wh -= bh; - m->by = m->topbar ? m->wy : m->wy + m->wh; - m->wy = m->topbar ? m->wy + bh : m->wy; - } else - m->by = -bh; -} - -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); -} - -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); - } - } - 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) -{ - if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) - strcpy(stext, "dwm-"VERSION); - drawbar(selmon); -} - -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 -updatewindowtype(Client *c) -{ - Atom state = getatomprop(c, netatom[NetWMState]); - Atom wtype = getatomprop(c, netatom[NetWMWindowType]); - - if (state == netatom[NetWMFullscreen]) - setfullscreen(c, 1); - if (wtype == netatom[NetWMWindowTypeDialog]) - c->isfloating = 1; -} - -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 (wmh->flags & InputHint) - c->neverfocus = !wmh->input; - else - c->neverfocus = 0; - XFree(wmh); - } -} - -void -view(const Arg *arg) -{ - int i; - unsigned int tmptag; - - if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) - return; - selmon->seltags ^= 1; /* toggle sel tagset */ - if (arg->ui & TAGMASK) { - selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; - selmon->pertag->prevtag = selmon->pertag->curtag; - - 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]; - - if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) - togglebar(NULL); - - focus(NULL); - arrange(selmon); -} - -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; - - if (w == root && getrootptr(&x, &y)) - return recttomon(x, y, 1, 1); - for (m = mons; m; m = m->next) - if (w == m->barwin) - 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 (!selmon->lt[selmon->sellt]->arrange - || (selmon->sel && selmon->sel->isfloating)) - return; - if (c == nexttiled(selmon->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"); - checkotherwm(); - setup(); -#ifdef __OpenBSD__ - if (pledge("stdio rpath proc exec", NULL) == -1) - die("pledge"); -#endif /* __OpenBSD__ */ - scan(); - run(); - cleanup(); - XCloseDisplay(dpy); - return EXIT_SUCCESS; -} - -void -centeredmaster(Monitor *m) -{ - unsigned int i, n, h, mw, mx, my, oty, ety, tw; - Client *c; - - /* count number of clients in the selected monitor */ - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); - - if (n == 0) - return; - if(n == 1){ - c = nexttiled(m->clients); - resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); - return; - } - - /* initialize areas */ - mw = m->ww; - mx = 0; - my = m->gappx; - tw = mw; - - if (n > m->nmaster) { - /* go mfact box in the center if more than nmaster clients */ - mw = m->nmaster ? m->ww * m->mfact : 0; - tw = m->ww - mw; - - if (n - m->nmaster > 1) { - /* only one client */ - mx = (m->ww - mw) / 2; - tw = (m->ww - mw) / 2; - } - } - - oty = m->gappx; - ety = m->gappx; - for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) - if (i < m->nmaster) { - /* nmaster clients are stacked vertically, in the center - * of the screen */ - h = (m->wh - my) / (MIN(n, m->nmaster) - i); - if(m->nmaster >= n) - resize(c, m->wx + mx + m->gappx, m->wy + my, mw - 2*(c->bw + m->gappx), - h - (2*c->bw) - m->gappx, 0); - else if(m->nmaster + 1 < n) - resize(c, m->wx + mx + m->gappx/2, m->wy + my, mw - 2*c->bw - m->gappx, h - 2*c->bw - m->gappx, 0); - else - resize(c, m->wx + mx + m->gappx, m->wy + my, mw - 2*c->bw - m->gappx*3/2, h - 2*c->bw - m->gappx, 0); - my += HEIGHT(c) + m->gappx; - } else { - /* stack clients are stacked vertically */ - if ((i - m->nmaster) % 2) { - h = (m->wh - ety) / ( (1 + n - i) / 2); - resize(c, m->wx + m->gappx, m->wy + ety, tw - (2*c->bw) - m->gappx*3/2, h - 2*c->bw - m->gappx, 0); - ety += HEIGHT(c) + m->gappx; - } else { - h = (m->wh - oty) / ((1 + n - i) / 2); - resize(c, m->wx + mx + mw + m->gappx/2, m->wy + oty, tw - (2*c->bw) - m->gappx*3/2, h - 2*c->bw - m->gappx, 0); - oty += HEIGHT(c) + m->gappx; - } - } -} - -void -centeredfloatingmaster(Monitor *m) -{ - unsigned int i, n, w, mh, mw, mx, mxo, my, myo, tx; - Client *c; - - /* count number of clients in the selected monitor */ - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); - if (n == 0) - return; - if(n == 1){ - c = nexttiled(m->clients); - resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); - return; - } - - /* initialize nmaster area */ - if (n > m->nmaster) { - /* go mfact box in the center if more than nmaster clients */ - if (m->ww > m->wh) { - mw = m->nmaster ? m->ww * m->mfact : 0; - mh = m->nmaster ? m->wh * 0.9 : 0; - } else { - mh = m->nmaster ? m->wh * m->mfact : 0; - mw = m->nmaster ? m->ww * 0.9 : 0; - } - mx = mxo = (m->ww - mw + m->gappx) / 2; - my = myo = (m->wh - mh) / 2; - } else { - /* go fullscreen if all clients are in the master area */ - mh = m->wh; - mw = m->ww; - mx = m->gappx; - mxo = 0; - my = myo = 0; - } - - tx = m->gappx; - 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 */ - w = (mw + mxo - mx) / (MIN(n, m->nmaster) - i) + m->gappx; - resize(c, m->wx + mx, m->wy + my + m->gappx, w - 2*(c->bw + m->gappx), - mh - 2*(c->bw + m->gappx), 0); - mx += WIDTH(c) + m->gappx; - } else { - /* stack clients are stacked horizontally */ - w = (m->ww - tx) / (n - i) + m->gappx; - resize(c, m->wx + tx, m->wy + m->gappx, w - 2*(c->bw + m->gappx), - m->wh - 2*(c->bw + m->gappx), 0); - tx += WIDTH(c) + m->gappx; - } -} diff --git a/.suckless/dwm/dwm.o b/.suckless/dwm/dwm.o deleted file mode 100644 index 395b096cf0bd367cbe22fd73f39171236177ccaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60008 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 r|9{f8yiE2Vx`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 diff --git a/.suckless/dwm/patches/centeredmaster.diff b/.suckless/dwm/patches/centeredmaster.diff deleted file mode 100644 index 6926892..0000000 --- a/.suckless/dwm/patches/centeredmaster.diff +++ /dev/null @@ -1,142 +0,0 @@ -diff --git a/config.def.h b/config.def.h -index 7054c06..527b214 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -39,6 +39,8 @@ static const Layout layouts[] = { - { "[]=", tile }, /* first entry is default */ - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, -+ { "|M|", centeredmaster }, -+ { ">M>", centeredfloatingmaster }, - }; - - /* key definitions */ -@@ -74,6 +76,8 @@ static Key keys[] = { - { 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, XK_space, setlayout, {0} }, - { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, - { MODKEY, XK_0, view, {.ui = ~0 } }, -diff --git a/dwm.c b/dwm.c -index 0362114..1e81412 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -233,6 +233,8 @@ 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); -+static void centeredmaster(Monitor *m); -+static void centeredfloatingmaster(Monitor *m); - - /* variables */ - static const char broken[] = "broken"; -@@ -2139,3 +2141,106 @@ main(int argc, char *argv[]) - XCloseDisplay(dpy); - return EXIT_SUCCESS; - } -+ -+void -+centeredmaster(Monitor *m) -+{ -+ unsigned int i, n, h, mw, mx, my, oty, ety, tw; -+ Client *c; -+ -+ /* count number of clients in the selected monitor */ -+ for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); -+ if (n == 0) -+ return; -+ -+ /* initialize areas */ -+ mw = m->ww; -+ mx = 0; -+ my = 0; -+ tw = mw; -+ -+ if (n > m->nmaster) { -+ /* go mfact box in the center if more than nmaster clients */ -+ mw = m->nmaster ? m->ww * m->mfact : 0; -+ tw = m->ww - mw; -+ -+ if (n - m->nmaster > 1) { -+ /* only one client */ -+ mx = (m->ww - mw) / 2; -+ tw = (m->ww - mw) / 2; -+ } -+ } -+ -+ oty = 0; -+ ety = 0; -+ for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) -+ if (i < m->nmaster) { -+ /* nmaster clients are stacked vertically, in the center -+ * of the screen */ -+ h = (m->wh - my) / (MIN(n, m->nmaster) - i); -+ resize(c, m->wx + mx, m->wy + my, mw - (2*c->bw), -+ h - (2*c->bw), 0); -+ my += HEIGHT(c); -+ } else { -+ /* stack clients are stacked vertically */ -+ if ((i - m->nmaster) % 2 ) { -+ h = (m->wh - ety) / ( (1 + n - i) / 2); -+ resize(c, m->wx, m->wy + ety, tw - (2*c->bw), -+ h - (2*c->bw), 0); -+ ety += HEIGHT(c); -+ } else { -+ h = (m->wh - oty) / ((1 + n - i) / 2); -+ resize(c, m->wx + mx + mw, m->wy + oty, -+ tw - (2*c->bw), h - (2*c->bw), 0); -+ oty += HEIGHT(c); -+ } -+ } -+} -+ -+void -+centeredfloatingmaster(Monitor *m) -+{ -+ unsigned int i, n, w, mh, mw, mx, mxo, my, myo, tx; -+ Client *c; -+ -+ /* count number of clients in the selected monitor */ -+ for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); -+ if (n == 0) -+ return; -+ -+ /* initialize nmaster area */ -+ if (n > m->nmaster) { -+ /* go mfact box in the center if more than nmaster clients */ -+ if (m->ww > m->wh) { -+ mw = m->nmaster ? m->ww * m->mfact : 0; -+ mh = m->nmaster ? m->wh * 0.9 : 0; -+ } else { -+ mh = m->nmaster ? m->wh * m->mfact : 0; -+ mw = m->nmaster ? m->ww * 0.9 : 0; -+ } -+ mx = mxo = (m->ww - mw) / 2; -+ my = myo = (m->wh - mh) / 2; -+ } else { -+ /* go fullscreen if all clients are in the master area */ -+ mh = m->wh; -+ mw = m->ww; -+ mx = mxo = 0; -+ my = myo = 0; -+ } -+ -+ for(i = tx = 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 */ -+ w = (mw + mxo - mx) / (MIN(n, m->nmaster) - i); -+ resize(c, m->wx + mx, m->wy + my, w - (2*c->bw), -+ mh - (2*c->bw), 0); -+ mx += WIDTH(c); -+ } else { -+ /* stack clients are stacked horizontally */ -+ w = (m->ww - tx) / (n - i); -+ resize(c, m->wx + tx, m->wy, w - (2*c->bw), -+ m->wh - (2*c->bw), 0); -+ tx += WIDTH(c); -+ } -+} diff --git a/.suckless/dwm/patches/dwm-notitle-6.2.diff b/.suckless/dwm/patches/dwm-notitle-6.2.diff deleted file mode 100644 index efd5ebc..0000000 --- a/.suckless/dwm/patches/dwm-notitle-6.2.diff +++ /dev/null @@ -1,81 +0,0 @@ -From 969dbbc548f16da5d94630e3d54e9c96c5296520 Mon Sep 17 00:00:00 2001 -From: Ryan Kes -Date: Thu, 28 Mar 2019 14:36:07 +0100 -Subject: [PATCH] dwm-notitle-6.2 - ---- - config.def.h | 1 - - dwm.c | 20 ++++---------------- - 2 files changed, 4 insertions(+), 17 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 1c0b587..19330cd 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -102,7 +102,6 @@ static Button buttons[] = { - /* click event mask button function argument */ - { ClkLtSymbol, 0, Button1, setlayout, {0} }, - { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, -- { ClkWinTitle, 0, Button2, zoom, {0} }, - { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, - { ClkClientWin, MODKEY, Button1, movemouse, {0} }, - { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, -diff --git a/dwm.c b/dwm.c -index 4465af1..bcf5cb1 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -64,8 +64,8 @@ enum { NetSupported, NetWMName, NetWMState, NetWMCheck, - NetWMFullscreen, NetActiveWindow, NetWMWindowType, - NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ - enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ --enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, -- ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ -+enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkClientWin, -+ ClkRootWin, ClkLast }; /* clicks */ - - typedef union { - int i; -@@ -439,10 +439,8 @@ buttonpress(XEvent *e) - arg.ui = 1 << i; - } else if (ev->x < x + blw) - click = ClkLtSymbol; -- else if (ev->x > selmon->ww - TEXTW(stext)) -- click = ClkStatusText; - else -- click = ClkWinTitle; -+ click = ClkStatusText; - } else if ((c = wintoclient(ev->window))) { - focus(c); - restack(selmon); -@@ -729,15 +727,8 @@ drawbar(Monitor *m) - x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); - - if ((w = m->ww - sw - x) > bh) { -- if (m->sel) { -- drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); -- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); -- if (m->sel->isfloating) -- drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); -- } else { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, x, 0, w, bh, 1, 1); -- } - } - drw_map(drw, m->barwin, 0, 0, m->ww, bh); - } -@@ -1235,11 +1226,8 @@ propertynotify(XEvent *e) - drawbars(); - break; - } -- if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) { -+ if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) - updatetitle(c); -- if (c == c->mon->sel) -- drawbar(c->mon); -- } - if (ev->atom == netatom[NetWMWindowType]) - updatewindowtype(c); - } --- -2.21.0 - diff --git a/.suckless/dwm/patches/dwm-pertag-20170513-ceac8c9.diff b/.suckless/dwm/patches/dwm-pertag-20170513-ceac8c9.diff deleted file mode 100644 index 1a2a3cf..0000000 --- a/.suckless/dwm/patches/dwm-pertag-20170513-ceac8c9.diff +++ /dev/null @@ -1,177 +0,0 @@ -diff --git a/dwm.c b/dwm.c -index a5ce993..45f1e27 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -112,6 +112,7 @@ typedef struct { - void (*arrange)(Monitor *); - } Layout; - -+typedef struct Pertag Pertag; - struct Monitor { - char ltsymbol[16]; - float mfact; -@@ -131,6 +132,7 @@ struct Monitor { - Monitor *next; - Window barwin; - const Layout *lt[2]; -+ Pertag *pertag; - }; - - typedef struct { -@@ -272,6 +274,15 @@ static Window root, wmcheckwin; - /* configuration, allows nested code to access above variables */ - #include "config.h" - -+struct Pertag { -+ unsigned int curtag, prevtag; /* current and previous tag */ -+ int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */ -+ float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */ -+ unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */ -+ const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes */ -+ int showbars[LENGTH(tags) + 1]; /* display bar for the current tag */ -+}; -+ - /* compile-time check if all tags fit into an unsigned int bit array. */ - struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; - -@@ -632,6 +643,7 @@ Monitor * - createmon(void) - { - Monitor *m; -+ unsigned int i; - - m = ecalloc(1, sizeof(Monitor)); - m->tagset[0] = m->tagset[1] = 1; -@@ -642,6 +654,20 @@ createmon(void) - m->lt[0] = &layouts[0]; - m->lt[1] = &layouts[1 % LENGTH(layouts)]; - strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); -+ m->pertag = ecalloc(1, sizeof(Pertag)); -+ m->pertag->curtag = m->pertag->prevtag = 1; -+ -+ for (i = 0; i <= LENGTH(tags); i++) { -+ m->pertag->nmasters[i] = m->nmaster; -+ m->pertag->mfacts[i] = m->mfact; -+ -+ m->pertag->ltidxs[i][0] = m->lt[0]; -+ m->pertag->ltidxs[i][1] = m->lt[1]; -+ m->pertag->sellts[i] = m->sellt; -+ -+ m->pertag->showbars[i] = m->showbar; -+ } -+ - return m; - } - -@@ -968,7 +994,7 @@ grabkeys(void) - void - incnmaster(const Arg *arg) - { -- selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); -+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0); - arrange(selmon); - } - -@@ -1503,9 +1529,9 @@ void - setlayout(const Arg *arg) - { - if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) -- selmon->sellt ^= 1; -+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag] ^= 1; - if (arg && arg->v) -- selmon->lt[selmon->sellt] = (Layout *)arg->v; -+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt] = (Layout *)arg->v; - strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); - if (selmon->sel) - arrange(selmon); -@@ -1524,7 +1550,7 @@ setmfact(const Arg *arg) - f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; - if (f < 0.1 || f > 0.9) - return; -- selmon->mfact = f; -+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f; - arrange(selmon); - } - -@@ -1701,7 +1727,7 @@ tile(Monitor *m) - void - togglebar(const Arg *arg) - { -- selmon->showbar = !selmon->showbar; -+ selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar; - updatebarpos(selmon); - XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); - arrange(selmon); -@@ -1740,9 +1766,33 @@ 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]; -+ -+ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) -+ togglebar(NULL); -+ - focus(NULL); - arrange(selmon); - } -@@ -2036,11 +2086,37 @@ updatewmhints(Client *c) - void - view(const Arg *arg) - { -+ int i; -+ unsigned int tmptag; -+ - if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) - return; - selmon->seltags ^= 1; /* toggle sel tagset */ -- if (arg->ui & TAGMASK) -+ if (arg->ui & TAGMASK) { - selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; -+ selmon->pertag->prevtag = selmon->pertag->curtag; -+ -+ 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]; -+ -+ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) -+ togglebar(NULL); -+ - focus(NULL); - arrange(selmon); - } diff --git a/.suckless/dwm/patches/dwm-ru_centeredmaster-6.2.diff b/.suckless/dwm/patches/dwm-ru_centeredmaster-6.2.diff deleted file mode 100644 index e6a9e69..0000000 --- a/.suckless/dwm/patches/dwm-ru_centeredmaster-6.2.diff +++ /dev/null @@ -1,157 +0,0 @@ -diff -up a/config.h b/config.h ---- a/config.h 2019-07-24 08:59:14.429282151 +0200 -+++ b/config.h 2019-07-24 09:30:18.841019314 +0200 -@@ -42,6 +42,8 @@ static const Layout layouts[] = { - { "[]=", tile }, /* first entry is default */ - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, -+ { "|M|", centeredmaster }, -+ { ">M>", centeredfloatingmaster }, - }; - - /* key definitions */ -@@ -77,6 +79,8 @@ static Key keys[] = { - { 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|ShiftMask, XK_u, setlayout, {.v = &layouts[4]} }, - { MODKEY, XK_space, setlayout, {0} }, - { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, - { MODKEY, XK_0, view, {.ui = ~0 } }, -diff -up a/dwm.c b/dwm.c ---- a/dwm.c 2019-07-24 08:59:14.432615503 +0200 -+++ b/dwm.c 2019-07-24 09:24:16.192110897 +0200 -@@ -235,6 +235,8 @@ static int xerror(Display *dpy, XErrorEv - static int xerrordummy(Display *dpy, XErrorEvent *ee); - static int xerrorstart(Display *dpy, XErrorEvent *ee); - static void zoom(const Arg *arg); -+static void centeredmaster(Monitor *m); -+static void centeredfloatingmaster(Monitor *m); - - /* variables */ - static const char broken[] = "broken"; -@@ -2176,3 +2178,122 @@ main(int argc, char *argv[]) - XCloseDisplay(dpy); - return EXIT_SUCCESS; - } -+ -+void -+centeredmaster(Monitor *m) -+{ -+ unsigned int i, n, h, mw, mx, my, oty, ety, tw; -+ Client *c; -+ -+ /* count number of clients in the selected monitor */ -+ for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); -+ -+ if (n == 0) -+ return; -+ if(n == 1){ -+ c = nexttiled(m->clients); -+ resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); -+ return; -+ } -+ -+ /* initialize areas */ -+ mw = m->ww; -+ mx = 0; -+ my = m->gappx; -+ tw = mw; -+ -+ if (n > m->nmaster) { -+ /* go mfact box in the center if more than nmaster clients */ -+ mw = m->nmaster ? m->ww * m->mfact : 0; -+ tw = m->ww - mw; -+ -+ if (n - m->nmaster > 1) { -+ /* only one client */ -+ mx = (m->ww - mw) / 2; -+ tw = (m->ww - mw) / 2; -+ } -+ } -+ -+ oty = m->gappx; -+ ety = m->gappx; -+ for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) -+ if (i < m->nmaster) { -+ /* nmaster clients are stacked vertically, in the center -+ * of the screen */ -+ h = (m->wh - my) / (MIN(n, m->nmaster) - i); -+ if(m->nmaster >= n) -+ resize(c, m->wx + mx + m->gappx, m->wy + my, mw - 2*(c->bw + m->gappx), -+ h - (2*c->bw) - m->gappx, 0); -+ else if(m->nmaster + 1 < n) -+ resize(c, m->wx + mx + m->gappx/2, m->wy + my, mw - 2*c->bw - m->gappx, h - 2*c->bw - m->gappx, 0); -+ else -+ resize(c, m->wx + mx + m->gappx, m->wy + my, mw - 2*c->bw - m->gappx*3/2, h - 2*c->bw - m->gappx, 0); -+ my += HEIGHT(c) + m->gappx; -+ } else { -+ /* stack clients are stacked vertically */ -+ if ((i - m->nmaster) % 2) { -+ h = (m->wh - ety) / ( (1 + n - i) / 2); -+ resize(c, m->wx + m->gappx, m->wy + ety, tw - (2*c->bw) - m->gappx*3/2, h - 2*c->bw - m->gappx, 0); -+ ety += HEIGHT(c) + m->gappx; -+ } else { -+ h = (m->wh - oty) / ((1 + n - i) / 2); -+ resize(c, m->wx + mx + mw + m->gappx/2, m->wy + oty, tw - (2*c->bw) - m->gappx*3/2, h - 2*c->bw - m->gappx, 0); -+ oty += HEIGHT(c) + m->gappx; -+ } -+ } -+} -+ -+void -+centeredfloatingmaster(Monitor *m) -+{ -+ unsigned int i, n, w, mh, mw, mx, mxo, my, myo, tx; -+ Client *c; -+ -+ /* count number of clients in the selected monitor */ -+ for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); -+ if (n == 0) -+ return; -+ if(n == 1){ -+ c = nexttiled(m->clients); -+ resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); -+ return; -+ } -+ -+ /* initialize nmaster area */ -+ if (n > m->nmaster) { -+ /* go mfact box in the center if more than nmaster clients */ -+ if (m->ww > m->wh) { -+ mw = m->nmaster ? m->ww * m->mfact : 0; -+ mh = m->nmaster ? m->wh * 0.9 : 0; -+ } else { -+ mh = m->nmaster ? m->wh * m->mfact : 0; -+ mw = m->nmaster ? m->ww * 0.9 : 0; -+ } -+ mx = mxo = (m->ww - mw + m->gappx) / 2; -+ my = myo = (m->wh - mh) / 2; -+ } else { -+ /* go fullscreen if all clients are in the master area */ -+ mh = m->wh; -+ mw = m->ww; -+ mx = m->gappx; -+ mxo = 0; -+ my = myo = 0; -+ } -+ -+ tx = m->gappx; -+ 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 */ -+ w = (mw + mxo - mx) / (MIN(n, m->nmaster) - i) + m->gappx; -+ resize(c, m->wx + mx, m->wy + my + m->gappx, w - 2*(c->bw + m->gappx), -+ mh - 2*(c->bw + m->gappx), 0); -+ mx += WIDTH(c) + m->gappx; -+ } else { -+ /* stack clients are stacked horizontally */ -+ w = (m->ww - tx) / (n - i) + m->gappx; -+ resize(c, m->wx + tx, m->wy + m->gappx, w - 2*(c->bw + m->gappx), -+ m->wh - 2*(c->bw + m->gappx), 0); -+ tx += WIDTH(c) + m->gappx; -+ } -+} - diff --git a/.suckless/dwm/patches/dwm-ru_gaps-6.2.diff b/.suckless/dwm/patches/dwm-ru_gaps-6.2.diff deleted file mode 100644 index 7ed05f6..0000000 --- a/.suckless/dwm/patches/dwm-ru_gaps-6.2.diff +++ /dev/null @@ -1,126 +0,0 @@ -diff -up a/config.h b/config.h ---- a/config.h 2019-07-21 22:43:04.535873031 +0200 -+++ b/config.h 2019-07-24 08:48:08.038433535 +0200 -@@ -2,6 +2,7 @@ - - /* appearance */ - static const unsigned int borderpx = 1; /* border pixel of windows */ -+static const unsigned int gappx = 5; /* gaps between windows */ - static const unsigned int snap = 32; /* snap pixel */ - static const int showbar = 1; /* 0 means no bar */ - static const int topbar = 0; /* 0 means bottom bar */ -@@ -84,6 +85,9 @@ static Key keys[] = { - { MODKEY, XK_period, focusmon, {.i = +1 } }, - { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, - { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, -+ { MODKEY, XK_minus, setgaps, {.i = -5 } }, -+ { MODKEY, XK_equal, setgaps, {.i = +5 } }, -+ { MODKEY|ShiftMask, XK_equal, setgaps, {.i = 0 } }, - TAGKEYS( XK_1, 0) - TAGKEYS( XK_2, 1) - TAGKEYS( XK_3, 2) -diff -up a/dwm.c b/dwm.c ---- a/dwm.c 2019-07-21 22:43:04.535873031 +0200 -+++ b/dwm.c 2019-07-24 08:50:44.989360476 +0200 -@@ -119,6 +119,7 @@ struct Monitor { - int by; /* bar geometry */ - int mx, my, mw, mh; /* screen size */ - int wx, wy, ww, wh; /* window area */ -+ int gappx; /* gaps between windows */ - unsigned int seltags; - unsigned int sellt; - unsigned int tagset[2]; -@@ -199,6 +200,7 @@ static void sendmon(Client *c, Monitor * - static void setclientstate(Client *c, long state); - static void setfocus(Client *c); - static void setfullscreen(Client *c, int fullscreen); -+static void setgaps(const Arg *arg); - static void setlayout(const Arg *arg); - static void setmfact(const Arg *arg); - static void setup(void); -@@ -638,6 +640,7 @@ createmon(void) - m->nmaster = nmaster; - m->showbar = showbar; - m->topbar = topbar; -+ m->gappx = gappx; - m->lt[0] = &layouts[0]; - m->lt[1] = &layouts[1 % LENGTH(layouts)]; - strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); -@@ -1282,6 +1285,13 @@ resizeclient(Client *c, int x, int y, in - c->oldw = c->w; c->w = wc.width = w; - c->oldh = c->h; c->h = wc.height = h; - wc.border_width = c->bw; -+ if (((nexttiled(c->mon->clients) == c && !nexttiled(c->next)) -+ || &monocle == c->mon->lt[c->mon->sellt]->arrange)) -+ { -+ c->w = wc.width += c->bw * 2; -+ c->h = wc.height += c->bw * 2; -+ wc.border_width = 0; -+ } - XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); - configure(c); - XSync(dpy, False); -@@ -1498,6 +1508,16 @@ setfullscreen(Client *c, int fullscreen) - } - - void -+setgaps(const Arg *arg) -+{ -+ if ((arg->i == 0) || (selmon->gappx + arg->i < 0)) -+ selmon->gappx = 0; -+ else -+ selmon->gappx += arg->i; -+ arrange(selmon); -+} -+ -+void - setlayout(const Arg *arg) - { - if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) -@@ -1673,26 +1693,35 @@ tagmon(const Arg *arg) - void - tile(Monitor *m) - { -- unsigned int i, n, h, mw, my, ty; -+ unsigned int i, n, h, mw, my, ty, ns; - Client *c; - - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); - if (n == 0) - return; -+ if(n == 1){ -+ c = nexttiled(m->clients); -+ resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); -+ return; -+ } - -- if (n > m->nmaster) -+ if (n > m->nmaster){ - mw = m->nmaster ? m->ww * m->mfact : 0; -- else -- mw = m->ww; -- for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) -+ ns = m->nmaster > 0 ? 2 : 1; -+ } -+ else{ -+ mw = m->ww - m->gappx; -+ ns = 1; -+ } -+ for (i = 0, my = ty = m->gappx, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) - if (i < m->nmaster) { -- h = (m->wh - my) / (MIN(n, m->nmaster) - i); -- resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); -- my += HEIGHT(c); -+ h = (m->wh - my) / (MIN(n, m->nmaster) - i) - m->gappx; -+ resize(c, m->wx + m->gappx, m->wy + my, mw - 2*c->bw - m->gappx*(5-ns)/2, h - 2*c->bw, 0); -+ my += HEIGHT(c) + m->gappx; - } else { -- h = (m->wh - ty) / (n - i); -- resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0); -- ty += HEIGHT(c); -+ h = (m->wh - ty) / (n - i) - m->gappx; -+ resize(c, m->wx + mw + m->gappx/ns, m->wy + ty, m->ww - mw - (2*c->bw) - m->gappx*(5-ns)/2, h - 2*c->bw, 0); -+ ty += HEIGHT(c) + m->gappx; - } - } - diff --git a/.suckless/dwm/transient.c b/.suckless/dwm/transient.c deleted file mode 100644 index 040adb5..0000000 --- a/.suckless/dwm/transient.c +++ /dev/null @@ -1,42 +0,0 @@ -/* 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/.suckless/dwm/util.c b/.suckless/dwm/util.c deleted file mode 100644 index fe044fc..0000000 --- a/.suckless/dwm/util.c +++ /dev/null @@ -1,35 +0,0 @@ -/* 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/.suckless/dwm/util.h b/.suckless/dwm/util.h deleted file mode 100644 index f633b51..0000000 --- a/.suckless/dwm/util.h +++ /dev/null @@ -1,8 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -#define MAX(A, B) ((A) > (B) ? (A) : (B)) -#define MIN(A, B) ((A) < (B) ? (A) : (B)) -#define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B)) - -void die(const char *fmt, ...); -void *ecalloc(size_t nmemb, size_t size); diff --git a/.suckless/dwm/util.o b/.suckless/dwm/util.o deleted file mode 100644 index 59a07457a785bae0ce4bed63b5ac76e960595509..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2224 zcmbVM&rcIU6n>>u3Iav+fWbpeM$;y;X*C8UYFa3;kd1(r7(G}^yM)G;HruVKMk7Wv zX$T2_fCm#j8sfpD2~9kpC-q`H5>6x%e{k`l;CtJdbh2(Qyk`2n`QG>5%)Z&#hr`-P zlgkCdTyP2MGr>W7ug2R);-K?kul~~mt)Mo9%G&mXF9jgfrST{v~-SKGoU{Hu!p58KXz8t z-=7!mx9<*=j;#4HW@*EF7JO@6YZcTQwZvkltbg@MwbZ6ATYIsH8}CxdY&M@702mz_ z8t@0AMrzKlW#&s||9R!C66y^HYYrA7J6Z#9-Ma#=a;K}Ot=YSRt8^oOoX36=Mmsv6 zHjQ^|@K`^O9pkZU9bV2j18v*`zxJG>ZpV`baO2O(+*rxU+#tOilE4kk(yZ>f;r~6? zm_~ID)|0u{j@Tvb-|7`|hjDarjSSRRCthj5_ch?@$errM8t`Mt(>}%itaC$dyn!A{ zW+tnoK+%Rmkk05(G}F3aKw?yz7>sI(iII`3!|_BsI;agN;LdEp$jqCwFk2{@DJY;a zZ-8FTn4s5QNL1hbNz#YMha{;AzH)kei5KW_obHX$9 zY*I1xvI$B$X(mCLDHcI7@-!iNSP6rY%I9+WJWA&Crml=$p6)H0$<%GsQMNvpm^G3) zU2J3D=*LWYWc!VXAV=21`%#;E-*LUwP3F>LryDHY4GALcdBAj&4z7yA`4vA)0v2FMQy0mmsWIAP;OokG?9X!@V@~Jyl}I%4Ty%bvEAqwp(K7b6k%ISpeS!3i5H%<+@>|fi epB=?lI5|ZV$?R>R@3T|Bmw)=_q+D|C`TqcZ6$B~(