From 517638914f0c8c266d7b94a66f4bef3ad6aa88bb Mon Sep 17 00:00:00 2001 From: Luca Bilke Date: Sat, 9 Jul 2022 10:53:27 +0200 Subject: [PATCH] remove .local/src --- .local/src2/dmenu/FUNDING.yml | 3 - .local/src2/dmenu/LICENSE | 30 - .local/src2/dmenu/Makefile | 64 - .local/src2/dmenu/README.md | 16 - .local/src2/dmenu/arg.h | 49 - .local/src2/dmenu/config.h | 33 - .local/src2/dmenu/config.mk | 31 - .local/src2/dmenu/dmenu | Bin 44000 -> 0 bytes .local/src2/dmenu/dmenu.1 | 200 -- .local/src2/dmenu/dmenu.c | 995 ------ .local/src2/dmenu/dmenu.o | Bin 38896 -> 0 bytes .local/src2/dmenu/dmenu_path | 13 - .local/src2/dmenu/dmenu_run | 2 - .local/src2/dmenu/drw.c | 424 --- .local/src2/dmenu/drw.h | 60 - .local/src2/dmenu/drw.o | Bin 10400 -> 0 bytes .local/src2/dmenu/stest | Bin 17080 -> 0 bytes .local/src2/dmenu/stest.1 | 90 - .local/src2/dmenu/stest.c | 109 - .local/src2/dmenu/stest.o | Bin 5296 -> 0 bytes .local/src2/dmenu/util.c | 35 - .local/src2/dmenu/util.h | 8 - .local/src2/dmenu/util.o | Bin 2256 -> 0 bytes .local/src2/dwm/FUNDING.yml | 2 - .local/src2/dwm/LICENSE | 38 - .local/src2/dwm/Makefile | 52 - .local/src2/dwm/PKGBUILD | 46 - .local/src2/dwm/README.md | 39 - .local/src2/dwm/compile_commands.json | 65 - .local/src2/dwm/config.h | 542 ---- .local/src2/dwm/config.mk | 38 - .local/src2/dwm/drw.c | 424 --- .local/src2/dwm/drw.h | 57 - .local/src2/dwm/drw.o | Bin 10312 -> 0 bytes .local/src2/dwm/dwm | Bin 108056 -> 0 bytes .local/src2/dwm/dwm.1 | 214 -- .local/src2/dwm/dwm.c | 2690 ----------------- .local/src2/dwm/dwm.o | Bin 98504 -> 0 bytes .local/src2/dwm/shiftview.c | 64 - .local/src2/dwm/transient.c | 42 - .local/src2/dwm/util.c | 35 - .local/src2/dwm/util.h | 8 - .local/src2/dwm/util.o | Bin 2216 -> 0 bytes .local/src2/dwm/vanitygaps.c | 550 ---- .local/src2/dwmblocks/.gitignore | 53 - .local/src2/dwmblocks/FUNDING.yml | 3 - .local/src2/dwmblocks/LICENSE | 339 --- .local/src2/dwmblocks/Makefile | 19 - .local/src2/dwmblocks/README.md | 44 - .local/src2/dwmblocks/config.h | 32 - .local/src2/dwmblocks/dwmblocks.c | 294 -- .../patches/dwmblocks-statuscmd-fork.diff | 77 - .../patches/dwmblocks-statuscmd-signal.diff | 93 - .local/src2/slock/LICENSE | 24 - .local/src2/slock/Makefile | 60 - .local/src2/slock/README | 24 - .local/src2/slock/arg.h | 65 - .local/src2/slock/config.h | 38 - .local/src2/slock/config.mk | 32 - .local/src2/slock/explicit_bzero.c | 19 - .local/src2/slock/explicit_bzero.o | Bin 1408 -> 0 bytes .local/src2/slock/slock | Bin 23304 -> 0 bytes .../slock-colormessage-20200210-35633d4.diff | 284 -- .../slock-pam_auth-20190207-35633d4.diff | 154 - .../slock-xresources-20191126-53e56c7.diff | 158 - .local/src2/slock/slock.1 | 46 - .local/src2/slock/slock.c | 579 ---- .local/src2/slock/slock.o | Bin 15352 -> 0 bytes .local/src2/slock/util.h | 6 - dwm | 1 + 70 files changed, 1 insertion(+), 9511 deletions(-) delete mode 100644 .local/src2/dmenu/FUNDING.yml delete mode 100644 .local/src2/dmenu/LICENSE delete mode 100644 .local/src2/dmenu/Makefile delete mode 100644 .local/src2/dmenu/README.md delete mode 100644 .local/src2/dmenu/arg.h delete mode 100644 .local/src2/dmenu/config.h delete mode 100644 .local/src2/dmenu/config.mk delete mode 100755 .local/src2/dmenu/dmenu delete mode 100644 .local/src2/dmenu/dmenu.1 delete mode 100644 .local/src2/dmenu/dmenu.c delete mode 100644 .local/src2/dmenu/dmenu.o delete mode 100755 .local/src2/dmenu/dmenu_path delete mode 100755 .local/src2/dmenu/dmenu_run delete mode 100644 .local/src2/dmenu/drw.c delete mode 100644 .local/src2/dmenu/drw.h delete mode 100644 .local/src2/dmenu/drw.o delete mode 100755 .local/src2/dmenu/stest delete mode 100644 .local/src2/dmenu/stest.1 delete mode 100644 .local/src2/dmenu/stest.c delete mode 100644 .local/src2/dmenu/stest.o delete mode 100644 .local/src2/dmenu/util.c delete mode 100644 .local/src2/dmenu/util.h delete mode 100644 .local/src2/dmenu/util.o delete mode 100644 .local/src2/dwm/FUNDING.yml delete mode 100644 .local/src2/dwm/LICENSE delete mode 100644 .local/src2/dwm/Makefile delete mode 100644 .local/src2/dwm/PKGBUILD delete mode 100644 .local/src2/dwm/README.md delete mode 100644 .local/src2/dwm/compile_commands.json delete mode 100644 .local/src2/dwm/config.h delete mode 100644 .local/src2/dwm/config.mk delete mode 100644 .local/src2/dwm/drw.c delete mode 100644 .local/src2/dwm/drw.h delete mode 100644 .local/src2/dwm/drw.o delete mode 100755 .local/src2/dwm/dwm delete mode 100644 .local/src2/dwm/dwm.1 delete mode 100644 .local/src2/dwm/dwm.c delete mode 100644 .local/src2/dwm/dwm.o delete mode 100644 .local/src2/dwm/shiftview.c delete mode 100644 .local/src2/dwm/transient.c delete mode 100644 .local/src2/dwm/util.c delete mode 100644 .local/src2/dwm/util.h delete mode 100644 .local/src2/dwm/util.o delete mode 100644 .local/src2/dwm/vanitygaps.c delete mode 100644 .local/src2/dwmblocks/.gitignore delete mode 100644 .local/src2/dwmblocks/FUNDING.yml delete mode 100644 .local/src2/dwmblocks/LICENSE delete mode 100644 .local/src2/dwmblocks/Makefile delete mode 100644 .local/src2/dwmblocks/README.md delete mode 100644 .local/src2/dwmblocks/config.h delete mode 100644 .local/src2/dwmblocks/dwmblocks.c delete mode 100644 .local/src2/dwmblocks/patches/dwmblocks-statuscmd-fork.diff delete mode 100644 .local/src2/dwmblocks/patches/dwmblocks-statuscmd-signal.diff delete mode 100644 .local/src2/slock/LICENSE delete mode 100644 .local/src2/slock/Makefile delete mode 100644 .local/src2/slock/README delete mode 100644 .local/src2/slock/arg.h delete mode 100644 .local/src2/slock/config.h delete mode 100644 .local/src2/slock/config.mk delete mode 100644 .local/src2/slock/explicit_bzero.c delete mode 100644 .local/src2/slock/explicit_bzero.o delete mode 100755 .local/src2/slock/slock delete mode 100644 .local/src2/slock/slock-colormessage-20200210-35633d4.diff delete mode 100644 .local/src2/slock/slock-pam_auth-20190207-35633d4.diff delete mode 100644 .local/src2/slock/slock-xresources-20191126-53e56c7.diff delete mode 100644 .local/src2/slock/slock.1 delete mode 100644 .local/src2/slock/slock.c delete mode 100644 .local/src2/slock/slock.o delete mode 100644 .local/src2/slock/util.h create mode 160000 dwm diff --git a/.local/src2/dmenu/FUNDING.yml b/.local/src2/dmenu/FUNDING.yml deleted file mode 100644 index f8e607676..000000000 --- a/.local/src2/dmenu/FUNDING.yml +++ /dev/null @@ -1,3 +0,0 @@ -github: lukesmithxyz -custom: ["https://lukesmith.xyz/donate", "https://paypal.me/lukemsmith", "https://lukesmith.xyz/crypto"] -patreon: lukesmith diff --git a/.local/src2/dmenu/LICENSE b/.local/src2/dmenu/LICENSE deleted file mode 100644 index 3afd28edf..000000000 --- a/.local/src2/dmenu/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -MIT/X Consortium License - -© 2006-2019 Anselm R Garbe -© 2006-2008 Sander van Dijk -© 2006-2007 Michał Janeczek -© 2007 Kris Maglione -© 2009 Gottox -© 2009 Markus Schnalke -© 2009 Evan Gates -© 2010-2012 Connor Lane Smith -© 2014-2020 Hiltjo Posthuma -© 2015-2019 Quentin Rameau - -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/.local/src2/dmenu/Makefile b/.local/src2/dmenu/Makefile deleted file mode 100644 index 244961a68..000000000 --- a/.local/src2/dmenu/Makefile +++ /dev/null @@ -1,64 +0,0 @@ -# dmenu - dynamic menu -# See LICENSE file for copyright and license details. - -include config.mk - -SRC = drw.c dmenu.c stest.c util.c -OBJ = $(SRC:.c=.o) - -all: options dmenu stest - -options: - @echo dmenu build options: - @echo "CFLAGS = $(CFLAGS)" - @echo "LDFLAGS = $(LDFLAGS)" - @echo "CC = $(CC)" - -.c.o: - $(CC) -c $(CFLAGS) $< - -config.h: - cp config.def.h $@ - -$(OBJ): arg.h config.h config.mk drw.h - -dmenu: dmenu.o drw.o util.o - $(CC) -o $@ dmenu.o drw.o util.o $(LDFLAGS) - -stest: stest.o - $(CC) -o $@ stest.o $(LDFLAGS) - -clean: - rm -f dmenu stest $(OBJ) dmenu-$(VERSION).tar.gz *.rej *.orig - -dist: clean - mkdir -p dmenu-$(VERSION) - cp LICENSE Makefile README arg.h config.def.h config.mk dmenu.1\ - drw.h util.h dmenu_path dmenu_run stest.1 $(SRC)\ - dmenu-$(VERSION) - tar -cf dmenu-$(VERSION).tar dmenu-$(VERSION) - gzip dmenu-$(VERSION).tar - rm -rf dmenu-$(VERSION) - -install: all - mkdir -p $(DESTDIR)$(PREFIX)/bin - cp -f dmenu dmenu_path dmenu_run stest $(DESTDIR)$(PREFIX)/bin - chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu - chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_path - chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_run - chmod 755 $(DESTDIR)$(PREFIX)/bin/stest - mkdir -p $(DESTDIR)$(MANPREFIX)/man1 - sed "s/VERSION/$(VERSION)/g" < dmenu.1 > $(DESTDIR)$(MANPREFIX)/man1/dmenu.1 - sed "s/VERSION/$(VERSION)/g" < stest.1 > $(DESTDIR)$(MANPREFIX)/man1/stest.1 - chmod 644 $(DESTDIR)$(MANPREFIX)/man1/dmenu.1 - chmod 644 $(DESTDIR)$(MANPREFIX)/man1/stest.1 - -uninstall: - rm -f $(DESTDIR)$(PREFIX)/bin/dmenu\ - $(DESTDIR)$(PREFIX)/bin/dmenu_path\ - $(DESTDIR)$(PREFIX)/bin/dmenu_run\ - $(DESTDIR)$(PREFIX)/bin/stest\ - $(DESTDIR)$(MANPREFIX)/man1/dmenu.1\ - $(DESTDIR)$(MANPREFIX)/man1/stest.1 - -.PHONY: all options clean dist install uninstall diff --git a/.local/src2/dmenu/README.md b/.local/src2/dmenu/README.md deleted file mode 100644 index c8fb594d8..000000000 --- a/.local/src2/dmenu/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Luke's dmenu - -Extra stuff added to vanilla dmenu: - -- reads Xresources (ergo pywal compatible) -- alpha patch, which importantly allows this build to be embedded in transparent st -- can view color characters like emoji (libxft-bgra is required for this reason) -- `-P` for password mode: hide user input -- `-r` to reject non-matching input -- dmenu options are mouse clickable - -## Installation - -You must have `libxft-bgra` installed until the libxft upstream is fixed. - -After making any config changes that you want, but `make`, `sudo make install` it. diff --git a/.local/src2/dmenu/arg.h b/.local/src2/dmenu/arg.h deleted file mode 100644 index e94e02bba..000000000 --- a/.local/src2/dmenu/arg.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copy me if you can. - * by 20h - */ - -#ifndef ARG_H__ -#define ARG_H__ - -extern char *argv0; - -/* use main(int argc, char *argv[]) */ -#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\ - argv[0] && argv[0][0] == '-'\ - && argv[0][1];\ - argc--, argv++) {\ - char argc_;\ - char **argv_;\ - int brk_;\ - if (argv[0][1] == '-' && argv[0][2] == '\0') {\ - argv++;\ - argc--;\ - break;\ - }\ - for (brk_ = 0, argv[0]++, argv_ = argv;\ - argv[0][0] && !brk_;\ - argv[0]++) {\ - if (argv_ != argv)\ - break;\ - argc_ = argv[0][0];\ - switch (argc_) - -#define ARGEND }\ - } - -#define ARGC() argc_ - -#define EARGF(x) ((argv[0][1] == '\0' && argv[1] == NULL)?\ - ((x), abort(), (char *)0) :\ - (brk_ = 1, (argv[0][1] != '\0')?\ - (&argv[0][1]) :\ - (argc--, argv++, argv[0]))) - -#define ARGF() ((argv[0][1] == '\0' && argv[1] == NULL)?\ - (char *)0 :\ - (brk_ = 1, (argv[0][1] != '\0')?\ - (&argv[0][1]) :\ - (argc--, argv++, argv[0]))) - -#endif diff --git a/.local/src2/dmenu/config.h b/.local/src2/dmenu/config.h deleted file mode 100644 index 5fbe2257e..000000000 --- a/.local/src2/dmenu/config.h +++ /dev/null @@ -1,33 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -/* Default settings; can be overriden by command line. */ - -static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */ -/* -fn option overrides fonts[0]; default X11 font or font set */ -static const char *fonts[] = { - "monospace:size=10", - "JoyPixels:pixelsize=8:antialias=true:autohint=true" -}; -static const unsigned int bgalpha = 0xe0; -static const unsigned int fgalpha = OPAQUE; -static const char *prompt = NULL; /* -p option; prompt to the left of input field */ -static const char *colors[SchemeLast][2] = { - /* fg bg */ - [SchemeNorm] = { "#bbbbbb", "#222222" }, - [SchemeSel] = { "#eeeeee", "#005577" }, - [SchemeOut] = { "#000000", "#00ffff" }, -}; -static const unsigned int alphas[SchemeLast][2] = { - /* fgalpha bgalphga */ - [SchemeNorm] = { fgalpha, bgalpha }, - [SchemeSel] = { fgalpha, bgalpha }, - [SchemeOut] = { fgalpha, bgalpha }, -}; - -/* -l option; if nonzero, dmenu uses vertical list with given number of lines */ -static unsigned int lines = 0; - -/* - * Characters not considered part of a word while deleting words - * for example: " /?\"&[]" - */ -static const char worddelimiters[] = " "; diff --git a/.local/src2/dmenu/config.mk b/.local/src2/dmenu/config.mk deleted file mode 100644 index 8531fb99e..000000000 --- a/.local/src2/dmenu/config.mk +++ /dev/null @@ -1,31 +0,0 @@ -# dmenu version -VERSION = 5.0 - -# 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) -lXrender - -# flags -CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XINERAMAFLAGS) -CFLAGS = -std=c99 -pedantic -Wall -Os $(INCS) $(CPPFLAGS) -LDFLAGS = $(LIBS) - -# compiler and linker -CC = cc diff --git a/.local/src2/dmenu/dmenu b/.local/src2/dmenu/dmenu deleted file mode 100755 index ffc3698e2e6b80053a235840fec09e8093437d50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44000 zcmeIbdwf$>_BVWb36@(^Zdy?^YS30_ZIxmRM4L7(Cz?W`T&k!cP16!-lbD>);$BXkco`Y>=O{W_KrY@!WE626wWG+KSe1H1ykMU1+Gn3~8hf7SdEfVs z_wzg-4kT-@?_PWDwb$NzoqhH>C%v}DRhyZSA!tXIaGpS1XpV|h@(jy^JONTElnZ0= zeX?+pFamrw!_@prl^|C=_GS*HIULUdrE>X{7>1sx!h%LM3yD%Wqa*)hHAkaDp2|}> z6D2M5g~P(W2WibLmDi}g9IJ0RmrtXeW);_{z8v{x-8E|dy2MaAz>E=ulDR6bl_Pgi zxedJB23}61CETAH)%-~|(x;sJGo4lfrJkr8?+n_(W>{e^XyQ zFZaAp)ss$L)KNGzs@1mu<;XApy9e)fVIi;2s2@VypBm-W3um?Yn`X{9tF5`H%^!$% z7Il`-ESfo^I1(&Ao0&j%mEc3&ICtJ+A+t;9B}^-yA!IOqBrrNMIj`lD>_mLX?Nt8N zrAuEt`N{8|9r;{QLFL=WTDM)e@G+91c2F6Tp@T5`Xa|+|;zKgzpBwC!jINBzQG{_9 z3!6T^_3G-Hw?AuH?8)1EMdOJN{cYg6im&3@)Pm$M4;vJY|0OJ(i3*3qmmA=-4e)#6 z_u=&1j5>$I=Nj1a8w31VgL>aFsP{TJb+~$`z#hvmet5({e!qb|CmG254dnl5fae+D zMF#qRG{EBq{uyuNAA@?A8Q>iTdOkJ4YYqBcHn4w)+E1?0>|- zKMxw%Lvw97{l^;AyVpSfVFP>aG^lqv>b0ad7JQw7o{a{2-Uoi_FnY=j`s+0V{XGWq zVdx&tKkpgn8D(JSy$1NR26`SgkiW_Rf71Y8VqpJvgMR$XK+hfn{2T-O69)J+13$lG zU}w8Qz1t1+Of|sg8R+@Jzz^RT$nQ6>^LPV2#~J9EYhb5jAV0?dPZ;RA#Xz3cNyClj z4F>JnWPsNi==U4g^B;qHcN*yb(EuM|pl6lAczeRYp7{p2+n`;i8Q^6G_@f5)UuIBm zu0g!L*Py+}80h)I0CySa=|;VI!epWMEf}mju3-4_Lf36N5Xn}wcO2w3Tw9NKay=TZ zmD*Z;p<0pB7|Q=3n4yIb3X0e3|5geA9I z6&+Tvu{!MYNWSV|TQJ=22?>pJeUdW}ib}OXZ!{t_*81C^yJnRyAPJ3*u%~08&ntNX zt*E1Me#jSa_#>e<&uW3|sSO6C>S#C;3=56U07?ezQm|dit@n4Tb%Z@l7y4E=1wG+r zR^t+XBo zp088lK40jI1fyZEug(+jwEDuTCtz!<~ApjMmESmz0`c0+>IP#=UZeCSryhkAFAKiivJ z!QjehNV5;^3wzoslyXaYxiI{v`CAndpae|iO6E9rJNv|8fx412saq{q_w6K6BPrs1(OTY zghm`OZ0_0H+JdZEnljBaE=|3}ZPXMHM2^t-I*;UCA)x=gq1A$~(=Q1Tp9HNm@_`1t z?I8j4B8<5i@C1U9HlHt~W=dp*>?mrc%{`LpS#J;)xs3DdQ54u%_9Z<1bA13 zNx0MFZt(}y3DxdvZx60w%^*p)8`th$9^KkKuy0jM2oXYR5n5;>Ah)r!lrH6GvNRuz z1e6lc0{45_uo;BlX7$pa%7$6b59WC(HB)f=nh}6dc~c~!)(r?VXs*jyRqZ~zc*bDr zoWa!D#bsK2Pp3HjV9!APP+lhED5V{gtK}b&RMD(7X*FNdq0uAdaT4JrG)av=LP=UZ zsJvQ_`b{YIJAlzg#WJw7(aO$cYMF_C|5)0&kU2Ji@ma!coR3cSW2+=nxEDMf+J2dK zK3i^6@%4N^OvCdyo|AU|)A-6X{JbVrkC=wna=bnbpU3gWG<*rim#5*EaePG@-oo)v z8Xn+yXBytc@m;s5_R`+Y7&Xbh_v&!kN79Zy9e$Dqf+{+^K!*?L@M${ykPdIv;rZN7 zEE9#Zb+|=`Ptf6A9H(ye>F^CYe1#6rU#Bw1fKVOUVbS548VFjT!?83QJW6ypjc)BI z*WrAqv8+lRPQKO-QHPUF+EK5=wXsNfjXGT0`y+h04j)ATKUV1Q(HaOE(&3mmgGZ+h z&mBYsp-YFGb@&ZBJWq$O)8XTE_<9|#zrNX^!zbzFAJXB+>hO&^{5T!{j1JG&;k`Qi zcpbh|hfmhwyL9*oI()AV*Kct4>2TW9(+)+4^IHcjYe0uvG-1#~I{XwJF8r6u&=@&Y zhv(?<({y;A4!7#?d>uYjhg)>`={meXho7OtOLTal4lmc?XX@}u9Zq{n+9B%jA`Jws z*WtxFyitdrrNfu&@Dd%qLWh^?@Q@BaM~8Rn@EJP1ONZ-EsyFEHnL7D(I{aK6zFvoy z>+lUayh4XRq{I0wB$m5ThtJl@KcmCv=p~Hn+RffiYjSkPz;k7zEPlwOd;rTjT)ZrE#?$qH0I{X41 zUZTS<)Zyhi+@-@Sb$Fc)7j^hN9bT`)=j-rB9bT`)m+SBaI(&r=U#P=FI=n%Lck1v( zI=oAVt9Odj%o}t#?O|%iIvu`L13}m8@J1cJL5E+Y!ynS&7whniI((T9e@2I2qQiT2 z_@z30rw+eNhwswiZXLc?hcDOReLCEu!xbIQmt4Bs|NE0)n@{>djD40P#!Z`pf*|(v zN|~u$V(g`yt*r5>vX20#rtZVH`Q%EZh-WLdWM2x$)PE9BOSR-K#_uMcmT1Xd#=k;5 zEzOb}8NY>iT9PF$S_^*hkONXSu_)m$arBQO=Ftz_9;w{AYG5(*#(^4q8i}AaOrzKFbm+`Llpt8@wCKAb}{~8;%RA<3^D$G;tPmh&iK2DrzK9Zp7FO5 zPfMF*CF5@-o-S>YC5*q0cv|8lEsVdCcv{*d^B5l{zL%j`2?rPfLYl7vmo$o|Xv75aaJBo|Xp5<&3|Zcv=!9>luG5@w603 zRxw5&mx{q*~xW`Kbv?uRVTX`e=*KE{|BpT5P8xH#$yC*ft|u`4uck&PVWt{3eoz%$2H)d57tyHYx{0KZYTY_zjn6 zWD@4??J9gdhwW;?Q*f#}&riBcZYU5Frh|x<;GE!+>(w$#c$u+-l|7zNHx!a|hYOXR z%O(0T$YCCq$>LBgKe?x>hyjhd7zNqeGf6qkQam7jD${OZ$kl-DstWK--W)O?bv z_Y+J-YUXW2VqDs@%8>;*QgD(2CilYd2(E^3SB_!nFM7NXHYZ zju_W*Mw$#ZVTI()s*IP*WT`T_T0PZ}>2HT2wOrsMmPX7q|-{2hbY4T}wNNEa%{(&*5{2fMN$q}6-#>>V-9mdTT zgf?Xf#!df7<^1o-Bq16u-nBrb|(Z4pH7F%3B??o2`x4ED_`9K;bH6 zDe}QoD%P2k5iM_tb)F{fic;$wdUQZL3QJqPNDcU$*Cef%bCABb`>mIo-+g)HUTQ&_bU(wh)# z;FPkRD}c|&lHoG9*7t{J0{XOwL`_bJQtk1|9NDxJOij<{(s39w1K+X{Jw~|<%O~X+ zthxF}DfHBxQU?Hm<4tHOeNRjjjbJ0#VHHK$VXYSvGfqJ6DX10>`1A%rcviJ!;xsX1 zyYd(oD^9r=62C>3OU}-R^K!)4kNMGUkpBo^>28?4nrxg-<0@`@T>}FE(NyAX9V2K)eNNm|3MRHCGu3N;e2YA3G#VwF4y$rk5~(n)1TptWFbwJgge4^Fbmg9J zs9(3iPv-8WYUToDx)ROS0#~BVTH=yFa>-vPR`h>-%J^16=y|VmOzG~~msqEpZ<`+F>G|ZFtlB1Z!)z(U}CncGbI;xHr`1kcFaF(-TyL6^2 zEAvA*= zao9!Ptjl)9AGJ0z=q4*g=+ac_dye>1)=QAC$=Ftt@pnhXhu5^5Uo17hXwS|Va8xLE z^Zad&itTo@YoKD_>I)>%{Nfdv$Q?ns1IR^;|2uNO?AdKM-?yb=z;VMOtJ!>q!mDsb#FQ8O=#;6=Pe*z~kQc#Fg)j5i|PDFIH!pUu+nGF@IudZ_JizhVju+ zfJaR;-2$UCb|D}j*8&K0s|%2_>??$3x7uxG`+Hae4}d85BW@rvQ+RxX;DqfAta_E2 zGbudAZ1k`7QpZg*odKm(1pw+@*)*BF6)!snI!b%Ro`X_x*Li|eh(WTP zs%a_2bj*ehyWAT$y$k5q-+dpSvRm^C>|Mxp#7(z@AgJWQk_<}1@(=`&=(cVEHFaem-}Wua zQ_NTnU4LR}ESHcSH$4E(zI4SXG(S~#ADGKC>Ms}2r}gngR+o|uH=^H5pyMydbYb!$ z_-sdLxRF@-D`oeWG_`EEfh~QRouj%2=XNv~?mY_^8Ku3-z5>X{O$}6quqh{-Kv!a{ z4Y^`sY!wmtfE_`ttQu)$_5i6ZvqBu&%ZSLPToC07gi8ee-ytnDUTp40vmsKJsY;Fp z*@XKog5vxdau~tt1cyXljOj{((8#v3X|60}(O0q|z{U_S1PLcB&#u~AXq(T{^H_Q$EB*XP6Pn161Hh%IHGsY=Q(Jh4L&&7%`D3{ z_Y4r^ITk&fQmT;y-(P}KF8M!-1Knzuw;_yJT!{y*d&!cxZ3)ZWuk1lCvffBmjY3Pi zS$6EuxNE1N`M-K2rewwrnLBo1xI9*Za^CDUV#dx?U+mDy=I(mf+yAH|K6NeG7dQ2< z0jcP=9zqS#+o5ZECLDPvD>~{$AVSiMYb2cJC5WNtdv;5syJiW}i1?J5C?B8H2)t)^ zbQA`f06>W5rFO=PPDj$*^K0<^jL&5}&U!+Be&PF2G9DG3n2DmjovZ8>FI{~_|3&Dq zd_s1w9t~YkD@e=w_h!5g&37^mb9ZbHnb9l8R_6#&TsYXKfX7UD9V-VJ0ba?U3Zsz7 zGTnlljBOR4c02*Et|GDTK7gC^^3kT-uxK4@X=ZdbrrW+Q^2VgYAnY=VcT$FQ42mCM znYO(kHCTqpZz})&IWB};P!l_ZadiMa9y??*cfXHBYNxr!i52sAYByuemooR11Bltq zgaSdjOpH(Y8`C)H&mi0rV#Pnq-QyrulkthYV%xQ6S0`Lkg^HcmB2vy)OsH>g+;qQ= zim}{Xfzmsw^E057?M;aBWqJL7g}+uI0|R?2iN$T-U(0;-r|Eb*VM;f$l&?-h($tP5 zntV1078qEg5RXwcMT}jUBS^=_Z(Zj> z$OKZLEM)e*4p`pSpC2!J2Pr60W&tmJe_GL#tNBOoOMUIpfy|%0K({ zuDTyrBrdtgh7$H2HL9;}N1xQi+w+pM&^M&_qf?nDED(y1T|(csW_)9`o4bDn1sOZB zE}^>Q?+Z7>5x4jOR(xl^$wSvW@}vX5g0MVkFNm^iGEtAv+Fa>J$K_eO!P`tT$mnU+h2%=PV?HksdP-a z0Nh#T>u(}1G4=^`@nGmcmp7s6q!WWpv@KxuypD9z%_>eX;APq!m`4CksuVj(F8L(Y z$$=9HxL*gP2>34mT_5F`yKkVJ*rB=R9(oN#D@5@(*{&-@VLN$=4xn}?FVq1Pnv=71 z07d55M?cEyNg;W%E^86V=IVfj1RQ4Te3R`O*pZmj0tP5mREKPKwSEM z_kr>powr^E8haz9d`u^ggzYN0&u)HUMz&MlraX-?NmJ{1EY(q@@B`%r6hRz#|7wt) z_oCb3;0&rOKIIh^GIw9e72c{UJX5dGrz$k}EQZja(sQ7+|9Pxi5zr<;4U1&1_@pzC zW`XQ<(jB*%K@iAX@|!Msw~|!QZFi}a^_y7KSN?)JlWkbMi#F;rbI&7)CCbxgpr1ez zgQW=_HOhRwo4CZJnrTq%&Av{|*p=$jI6(*?@&6iR)K)aoSy?u9A`4fnSAf*@ zyln1%1On7k707lK?!+=J`4KfEZkoq***ci6V+3iG@)J4dIvR~wPhSbkXhCesB{|vj z9{|Z(TJgtCKOzliABeJ))(3G@p9;N6kb|I@?RlgH>2Jt zO~h50;vnXp-;*zPn4SPbNAg|uV*dBUV}%(vHIp<(R-TA013?-Yvu#^Vd6Uq<2hnS1<9h~dfYP=gwOfVzI1 z6-^nMre&mAHYJe(vKu7%E#{MU3N`nbSk>jp!>YE8BuKT62EU_H4azB6t;S8SQC?!w zw;`=FDx>O)oKrJBlTm>Rg1^glw(Y?DZtvZ(^Z+;bOU zvS|)!noqMnZn9{FZ)M6#HlOX=#du|9>%!-Y!6Cs2xu z2U;e6$F9KJaP`phxw$(D?ggyzQ1<~P^dG8wJ9W27Ec~K>G=a;QLAcO3pv=JZq&2yy ztlfuE`xwgNRKp(NgK3jtgSq>0W^UQH9k9QTr0!#Yx+&Z&PRnMy#MlXlQDtjhqW$A% zF#LsOm)b9}UuwV1?%vu`Y(BXg5bZ66^A736`D>*9yM!Zs?U6K7ir$gDdhjeT5Bd>^M@M?CY{6P*#YZvluh*6-dIHpGafj zlRem{PfdCTkV5O+?WSf3W?ZUk;ntQTt)=^=q%YYDS*)BaaH8l%_%qc~D&q%4Kc~D4 ziOz}U7jndmLu>xsi`v$F--T~!pG)rDiY>FUL#P$)T6`+1orA7dhj`V;7%YpN@=v1t z9oxNEy3jw^`>}V;u?o_0xatw*59r$95V{7=%5kP%>i-DalPcKqGjs-4e-~K2x$4wuC z;1rov*?lnjcT_kRB>?X{0!tPe*d1K`1XalzRmtxl*1xN9*`-@CtCrXovzs1kJ}a=$ zVruGb$Q^RmBOiEaFRuHsVTjq-vrjsHhv^Q97%Zbrt&pc98DdM1Y%4Lim4b_&_@vVp z!7%K$<-Z_Ukb+5$kI;~~Z4yeM;pXmsNV{akmAEQH+^m?K6+6ObI@fF?aoV2yJ^2^y zMs?&TGcb7Q6XYu2Yz95)_IU^r^FX)(&J8YP?RSossJF8RmgXXJkD7M6(eUbfx6BO50-Dx7U) ze0&B@54P)|Pq_gbvstDrl(x$+#Z6}dbI4OuR8_@Z(L8r6&N-}JtmQ4#VMhW`CN*%) zOVpjZ*rRsy!uXUA!?e{YjWj<#<#}l6UxX^nq$*MNBEolk%Kczy91zKxdIN~^!?9$g zO+itJ-3>8Eyr=~^SfYJ^JV#bhBZ(LGI|@H8>@VC3&rJYO`Z@Y86A9{?c`;iP6yVy| z0VG->#%a^%c0kJA(2-@D1X%uO#oowCDE=DN6}LqhDN#C^#Mj{DEg5fD^j|X?G8@5` ze%?P5$$ObxWnTZy{M0P9$829;!K!;3dD6*L>gq;_UZ;wp|4ki~#29$B|9sV&5df4i ztgh>kWY%m)nR%>??LSb+^v6q-{gcRMye0vQ`tQeVqA=9qWqi1 zvlB}X(ipxGT6vlz!e;QWCxyc;IcrgXl3czoQ4;SqbO0MmbQ!*k7~HuhQh5Q__F ze79N0khyHsQ^L}9=X&aq(c}Z{(qRGisj~k=D2tbUh%G^}0vO$Mu_eKkzRYe~C}pS( z=HY%&zQUf9c{TbR3=F6SmU08(up{HQN;R;Y;?rWg{5m#@<+m2g-{QvXkM&~3l!vLZ zxNR9DWz#{ViLtBlft8&BCQ2I*xkxB?Vwn*)y@=%Hg8T)$b&)#95jSlE@@r@~9`w8K z9dgnke`J?8D{tX06+DyAyAo=41X)!BAX=a-eNQdW-Ir&?#|DtHv;IP3 z{)a zzIX#f=|IIX+XF}n(j_cDt7nNjCPD^*6Lb6A_vs?(04(`0h{+$wn>QAJ{czm05*)Mi zaySC^y#ejmeRjzIR;{}cO-DIp$G@mVK_;-$FUqbjkQaX+Z|FLEZmG1~l0dZKjl?5H~wMiBzM8nXFh@svYgU z9vcieN0J8CQ`nnX3Xur_m>xD@FBcq%%AXV;WbKXii(C(bWTOlN+2jO5d@bpu#oK_<-w5nl-~kWH=w?4Bg3u& zZ#Q0~RbYdJ0%q6Fk8_Zc4&P z%!Z`}U01Y|f_S;|?OxJ{vmSc9rW7lueKqjn4pRo&P6v`dLzE8XWs;3g`GJb2dZ`qy zM&C1ce~U~pHXFmVAF0ya6^pFdznX?ha#$s^MeJbb<3`G^)TDV%s+QQ)7P9}XoN5qDH$ zJW_g!2&n%eD7oIRR) z299vbZe%;<4>a5*Uj?xbaTnc^%%rOYbY39>$cLy#kjA0Hzf*duam7i|OJ zlBYfmQiofFB>k5`=?yG1l;@OdA?=dO?qY!L1`sHdiO8mlRpJFv_VA0^0?W`f<)5i* z*1SXmP`{?+mk+r1q6?_i(14Tl0X#spK>2A8N@VO6ZL}v~zW(=ULCjVR32cOajxL7H+|PKof4F&B?;>?s@Nm#ML$$c%s?46`9H{?~rre z`xS=gcNC}OcfWqnCEM8Z5gQRy;Dtw4psHwT%(jUVQUN*^OV>SfwK@x@+>MN{e}D0j z_9UYy$`^9%dR=#UG|Zw-sURzGf3=mo*_osK=`FIV*W67%BZhfMj|`wcKT$S75P>&= z6RT6+i^l-)>;a6qmYryKV5TbM-_%Z=#IXyJr{s}h+4OEL`WE3pUyRN01In+4$oG-2 zWz!laZ>t?YpV!YtSRnJmno?R_$U4R$V_EZ+1C6P7 z;?yj!KqULZA=hIH9&pH&7*{Lu9de07?#xCcu~4fUod{he%4F7y2k10IKsk1xl!G)x zC=y~zi@-{N>SCX*^OYr(k0mJInc(|I)UsMy3&Uo+{0%LH<#WY&N4dNd0sbI1AL7^M zC>M}_;}Jx{t8&yuts`Dtpxnl~rn-C?yFSrh@}t4fZ0OHqQY~iLy5^ z6mcC=0uz#df&x)~M=djt*{YU_B9hvss0DVY1yXO5%B$e&pOp!3VhtIjvz+Z+`ZOLra?|J1A`pFyS_h*R(`{F%&~m@S(Gm*WYcK#VfD9Fg*)&( z82aYV%tz5mjLaORR2`!A%HOmCzeO9-1GJ0vmicx>yxohz>d!={#a_xofK|6YNjD}*M?IUjloGY! z$Yx_h14dCL89`o93jT*>C76(FpR*dSLG8OM=|?@WV4;11UB)e;ckT6dc^BOm`tl8R^rG>W(u2#A9`x>3w#gRz z%rfLco3;j^x6&zpN%I&AJ1`KT`+TSTnhPtqH|Y_QF)sNP%c1|yuRg9Hkr?KJDbV3^^{{6cwUH{#_83X}Alk}~Iega^8DfOEJrF&8dB zl-1!^11Cw;*Hs*l&R~Vb&7X{@GQTjVKsg45#F5*`E%icFWTED8cJwW5hku7DcR|JU zL)Vspd6+X-7l?@-p#X(!DNOEX4yRDPxmM|)^fyY{Ssd)osgn;d-W6Y2FMmqcQZ+SL zjGttGj=G_);)`gRD+8;Gnv9=R2z#{sr{bayjk_ubL!ewyUZZDcwj!dug3B@shD3S) z(++uWY#<}nmjRXLJGQ_@Iq3L)>}66={2cqixZA>}D{ha|gTIy79>p~WA|Ca_3F{RUQ_Hwy7mRroi!m3vv)q|_ zIr?UDEmeUBDI0OI!b-SgJW%q^*AG^0cZ_L7`(9ghEar(b;XEu>ycroKre4|ZnAlhx z{gMqd$&Qm(9@I^zA#I;F4}l+#X1#M2M z#TU_7$iN<0AuMLyiJcsC_iA_+{vcoDk^&>74jaOxKlvhBtyG{W_AqEcyn}XA-hG)y zZ*@H`?DGZoB@61=ud4*0npW^I!8FJa0V~0|VkfQDcCd%dmrn?zG zptsobwR1U;WB|?ucwDClQ-FkOK>694EjnFRhw^XOh3H*}lL{HDjC);`y@=U|&Oj`R zj#dXr(n>L%0_-D@B5N=@@^QV~Hi!Dd_U2e}!RN|j(AmH2$oW>G-@~GE4*3Um4Y?dw zA=_}GW+!MnoQ0Ecw$&+LgUk7v9HkwtMxZ~QxdD%T$15#V(>E^pa!c|G*Z_l-u?Imh zyx9wHG=K7OrH7HI!OHO!8sn1o>@BwK%^M%~V08MYoL zYWMDTpcS~xq1brjvS6!P8kbhr)?*);0`=s2tl%(SOJByG-R>p0q+d^WM6o`A@K(fn z#0{Kd5!$CA+RERuDf$9Vqk?iS#*FGl$;>9+7YZIRgJ-jGkD!mmYpUUREFW;rzZS!E zrXoOqEi5|FLtA+O?}IiG5gY4DI%{Iih%U6co@P&Dcdswn$Si-X{%4(S1H5;R#?0l4#ri-|=g~2&WAGL>Oeb?1lsaeqpFIrGWxe_Qw z?muWGje2nuL9Kw)W!|MbQmF;X4vZ2S7WCG`VXV-V0feE8am!P^zsR;xww{AXvxF^k zobtD{U}hJmPXTUl6&|K{JQeeH=-GTYOFFsqJ$}CwPnxoY{eSGKi67z$JOc}v=%?t? z9NkFJ-P5G|nOk8aQPN40#2-D5df=!Bj(Xsz2ma6U0R3WDG=kp_oMmZl_XVPsWkpRb z{`&B$OOa}`;K$E>5lV(Ep>VK0BvHC0V4>egqhz}UKP2gwg5gU?S@g%UqCk_yOFtV) zQh}Bu>4*-G==ywa0nPI!AQvC z_05XlmoROmCBg;4)%d+kUt45Wh!KLzXL$nb$1*(;n-q@vW_hAga0PzAk8wli*9a{1 zC*Uff6(6Gd&xzQM)%bnbGSbrXaqEfFuK+V+hw2~DK_7iu!~SP93)^*+e+j4QvfaRY zV8fmG{1Km5@%b0$KL`C8AF9*EZJ_j-JUyFJz0MUJTZ(doQ~g&1n}D?TSp)the6E5F zVQ(Y7AD_#?e+T)qu><)gJ~`N>y&5!v&wSt(?p9n`3w`*cQ})Y{(=B{D(O6^S&(eaZ zUM}_lrU5~sQA)nXZ;-?WjR0aFxNc_;J z8bVktg0uok{o#nDs`dvggm^t(e78pd56%bGK#wYiuz^WcEO_yAoA~uhA>#G4u^+@` z(?6}=v^H|Hi)n$bJ5s4U#$C%X+Nz*~9ywO2ny+&I>+dd2gsv;tLE9LD(A(8Fa0q{6 zqHh2;BckBSLdZBFYqp5&0;HQap+Awf_NGz~g3bUP!1dfy=wEub_%ZbN^Pu}ccY$W& zhQ~h8N>F;apaOHE9MptUP`}_|16$4dI+aj}V0ENz5D2)t{zP4}snR`V#0i z&_2+D{#0rVeECOE7wBI=mxDeBDuL4b3ZH>K2$~OHos1V=L{Rrvsnj!|>p=H{z5$wz z?e8x@t)Tz;I+dyf&He`UgG!(ef?|uE9T`_H6f!#VGENwCOwKy^hwu~e5iv*3A_>Pa ztV69x&cLVd8Tbk95_0oubMr4SkM79n63(AI`^AWSgDmVY;tg2i~BD*TL;3ktj zw`A=Idv1B`n7O%qm053ODEl2S=(6JulsFmwVkgl7^zO~sX5F=e# z7iHuY0I?q_%Ixh#nXMRmk3kQ$cWovlVp)#d%FG8fd#PO;ASeDamHORKIcIKt=53nX z9OUhU+-AsKLvk=Oky%5wILMZ2vc-{G(wSTC%&qkP!k(K@BnM;tXOuT#3=8$Sc{fvA z66BYgs4Z)$EwK^K-0}-a1G&VPTV9u2*_2yem0OZ|-6*1!p3!x=i0qV{z zZ^*5@P!+i^w_MDv1cb7g`*O?YKBA9b6NRxjum#h7^5%^}{ ze+5thwnccn?FIvbUa1ZhxD*xf$0*}u~3=$Fxm*) z(}qILXbhHL!Zg+{L40@=`aS5IVfCXJx7Crm9FJ)arwB!R@p%Zk<~)ZOfQJ=z?Z)^{ zWY-KGw-@AgjmTP3lG6y_3!z#VQd|SKPnl5 zzkvlxw+0FkON$AsrFqb_ohG#d>^;bvjl5?mkIhw#>6^1^hPD}FlICiCrkq=j4omBv z=_tAndLD%y7wMU+pBu64Roc9?Z+-1`WK+LQL|oemdHP!-|I2=>&niW~{jy>drS>g{ zu9xwI?ukgN?W1?<#Up0pO%zx8IfFb9V4+w&b+nNT&ZTdVZul_0P3(NYVn8*Gu?uoHjLh7U z`_M>N?#7W3P|Tr`Svi?3wQ=MnpmsvOGMdLU212Osw^##|Qr(Mk^U$l+xt0qD`+Xhq zHzNOh%12+`l<63>Upmt5?A-i3WVb^0WRhibr-6+vVrhK+3;A1+&(4Wxatvc=0Arf+ z4v`&La~w~?$Xm)RQ0Lu5%)brD^HCo3-jc~;?2&oLe4@q0z_3w^#?U3uvlDvAwMUPm z9yscOqaHZwfukNc>VcykIO>6;9yscOqaHZwfukNE4`_eqNc+1+wDm&A3H;(wxAkes_%>c&?2d$UwVW>Dw1v}EoUY~cPEP;8>C>EU z=X4LJ`#C+x>4;MVb{xy;>735ww3gE)oVIYfiqo~6-pT17IDMMa?VRr6bU&vDIUR8- zubCux`)&KoF3$Kgq7FN>FJ!#735ww3gE)oVIYfiqo~6-pT17IDMMa?VRr6RITlo-#NFb zSOy5@Fu!~IOSyDJ`+IWQ-;dM&UYz##;k3U8r~Umm?eD#5f8T9xb@ePu!Q6R^3oZDY zgr#`WfxncS z(~Ja;OqB@BS=uao%N4Nun7}T_hwRzF?a2mD#})Vx{@Rm_g-_I@gX0gS$^VMuH>9<< zo8x(D_zfJtCr!`Iz{wANl}O-dr4Gb#H$G&~Q)%+|a(rVNzJcQprr{59d39hr((_E3{3{$UPs9HXob-Id_52Pz9dw_U^jOm5 z_acwv@2F;C!Zj)p{tZgkB-_ME`+ z&NTh>l2L|myrBI(M$LZu1#iN&zsIQIWx&bLGcHsO@8kByEX&#WB6VvdO44*92r`Z$cctM&U=$RL?KPL^3 zaa>5#BXj)Fld9dCe{N>@I3cfD#kFyD2bUMq^xw_#$~6499M4a~9{@gF9H!sVpnlmv zH!yX_Mvm`F!?$u=yFSp0ybGNC@DTSWSay8E@JWKUKG)>OU_4U2+VzHp)326h;HedD zy|3Zt0w2zP8`l%9Qza{T0Tel z9Is5nqriu=)5!lua`JF?qzx~YWQ`CiVDJ$On%}o z{QnZi)BXGo({rqlzAiuW80s&a_KmA+~s2v=#m-?iL6=)o_={Nni30RPbdpMdqm zaC)o;c!dFep#i?Y0Kb&sW}$>%hoYJ6Xg8350|MhQo}hl{rl=w!E3oZ zt)GT#@8iHNTt-iR!ue=8`4v65_ubI4AIH6HR*nM;)>G$7< zvuCmaUSxpV4RE&seuV+vZGhimfZuC?KVpDC$8fXoF^?P1atCcUkl$l~D+c(tz%5*- zo{VGTO^>MQ(}9n}KViAbqc}Ut4CHGJ@CF0iXMl$d@R$KkKN39LIJw6Fe;l}lw?$80 z2A(%e{Mlomhn@kYd1_gxYN_PPKI6DDPX*XBM@Z5`6T{g_KP`SLFRLeK8_Y+$0bb8= zv#@~20d3uK5y#sXsM@uCsaD|QaGver@m5-(!G3Y=HmO0N>7Vvk>QTn?19H zcKyRZen0R$-FV|}6TUK#&%%Hl&i^9~@KX%%IR?1P0CzLoER^wir0oNTIQ{_dcdS&{ zfghiSomhYJam$`lLyl~q|2_l!aRYpd0se{s{=NbJHN(xqL_YA@Gpw*P3me13`FVl? ze!2nvBGz5hzrAm%e$l=w4CHGJ@CF0C)c}tg;5QiHcNyT1GTbb9)8gcF9ACr7gO@k# z72p&AbS_YL$97~nq{;CTqt!}ZI_2KYG!xYGc?1UQ}VwD_;}m)Ai43Ilw+!Fla! zCT|v8JU*PyD~KED`LzN5AlLIS*YiEs^N@l3Q(S&vsw&8yuSW7&19`#Iaq z;C6#?OP*H2k9Pq9sIS*~g@CUU?{5Wsf;SqD1jFi!hJx3R_i*qZZ-cG!bp*qBYpvBM zP@>t_=5O~)zHmgqtAEWA3GcuOAx|XI(JZhx5m5o&Q0ovN(;g9;!yQ6fIOJ)@tAB0Y zU`q?$>4^wUD}?qAL48}XgK7>lJAn9B3G{N{;JbnBH9MghKif{Q`gUM**waDUg@~^W z6?i)6rAVQD1y?AvdnCMM6cM~_K2IPT62iftgp0?Of#S1?tST<$B7tV1g}0Mvz}p^z z^$}lKLfbC)c_nus=w{l4Hcv#t#xHxHPhhViMW8Fxgdf?(3v+l&DeUu+AHsMC4=+gy ztNf9u2iEyQ(h9-b?g8RZWNQK_X|==6I9Z&->*QM|j44)KM3t#G?9?3UWy z-nJm#>O{9S2i>i0!6r|eyBV)=M%cF)~4qFV(;$3nq9*EPS&?sCtst!=1T)Kd1%5x2X|-{f_BBT?pT zp|M3`@@>J0PghMe)aLiXNSX-lh!-8pY!>_x*s;2DuFF|f?LNEs?BX&swG~6j%^C@x zp$U;-H0<@&c>;L%H{8Hpj1zpFerZUt#)Te##K+(Jq*~Y*^+|5LrHVIoG5i{7sODpC_h1LAUCO-0J;i&unqE|-%?r6l<3@g=lfFrIT zA{H9ZBGHJd>BQ8G2rUS0-XX;sYyEAQvo)(Q&oIk;zM;9Qj|N9ubuhHrjuAlaZu1TG zC$n6O0YmIY6o5a~kpaii5Yw7V9Zp`+cRY8T+wGNBhkWiPH{L}YwCWs;GjFGd2Cb(J zZ}JXi&=909!c6hChJ#TAM`~N!LW~(tpcSrQb)eA0_P1?L$hTrCMb=M zBjp?C;asCSiqDohiqtR&t>uw|R7(&e2jTxvwXn{G`D!10(;7vaBSH5HPoSCG7xvLx z%dDS<4iYGnf^9?e>83D69l;|7{X+!Em@t~p=8Ka~Yqjk4bQ%*h9PRX$=R5>fq21R` zXUZX^QKNT7S_{vrY5U`b%L%kG6H8vHP%9Bb2K!h8n?SC65(TG zFuWlSRt1A?(6u_?Rp&NlBhGJWMKQI#E8X4|E8XPAq9uvD5rcq5PSo7q(%hp6!e6fRZpfH$<7`1K|~fG&OGXQfDGrS8a8^=vyd~;64V7>-9RR1VoGs;G8cN= z!rIvaQw%R$4{1N#7YwxcTN|QH5y>w_af)H5C%mao@u1f0@U?iNZIV8pb%SR#V4i2r}?W2&SMR8tfW1T0&&PL5@12Af}Ag;zib@&U7%wvmKDDl(T zl7?74z3+{M8I}_IVa!kLf>0b;-HwwACX znv49+T*_YMETYwLF^OYcwn8XwUL8OcD#gl|<>0g#p%bQ_aU(D6Yx7V6o(i=|LNSXW z#Yh&nV!c_+qF6C4#2^%8-YWL3;7hL+%}}CoYEg9!Ca@A(8Z~&@u}mb5q#4GM*NZXZ zg<`A%vGA4nMZ^CGLeGn3;DgItcI0E`vfYg%4%t%r{ROGj=}Qfyu3y$k*7a! zxjy8W2~JelS7_8SRQwm^mm>clp83++uRRB+QSJ5~w$s>= zZoda8Ju9Y_AFO~Ix);~MbWj_~&szC>0&)29p(bnPwdd|Msy$~%vUHFR{c!~tdZtY) zuRX`6(cN5FvtN_bC_P6(&&X-K_MDtXD|z{J`#CHmkf5e&<+bPZG^#zPr`4a{{=0bj zDy~p_?oXrIbAnW!e3oARcfiOents6oh7Jq+7PRLfRqmJL=N@F}%UgIkjrQ{WTCIE@ zPiXXyY32L)^|?khd$sZ!uhETZ<+ba3jn>T2N~%<=S3{ppE3e&$(&$)Ckkj<}^E@xF z^`Eeu3v#+Ct^F3Bt&x|IApdFQwfn9brRNm%M|%Arvymp^DrWW98 zcxgef45rk?7!)R5n*G|oTNf{1X&+j^GL#j@p*;Qz>Fw0Yr|%V#EFF59)#uUF~o*k98hTD=-J4vFE)n;uXlCZ`ohV}<_#zdOP< diff --git a/.local/src2/dmenu/dmenu.1 b/.local/src2/dmenu/dmenu.1 deleted file mode 100644 index 4c8707492..000000000 --- a/.local/src2/dmenu/dmenu.1 +++ /dev/null @@ -1,200 +0,0 @@ -.TH DMENU 1 dmenu\-VERSION -.SH NAME -dmenu \- dynamic menu -.SH SYNOPSIS -.B dmenu -.RB [ \-bfirvP ] -.RB [ \-l -.IR lines ] -.RB [ \-m -.IR monitor ] -.RB [ \-p -.IR prompt ] -.RB [ \-fn -.IR font ] -.RB [ \-nb -.IR color ] -.RB [ \-nf -.IR color ] -.RB [ \-sb -.IR color ] -.RB [ \-sf -.IR color ] -.RB [ \-w -.IR windowid ] -.P -.BR dmenu_run " ..." -.SH DESCRIPTION -.B dmenu -is a dynamic menu for X, which reads a list of newline\-separated items from -stdin. When the user selects an item and presses Return, their choice is printed -to stdout and dmenu terminates. Entering text will narrow the items to those -matching the tokens in the input. -.P -.B dmenu_run -is a script used by -.IR dwm (1) -which lists programs in the user's $PATH and runs the result in their $SHELL. -.SH OPTIONS -.TP -.B \-b -dmenu appears at the bottom of the screen. -.TP -.B \-f -dmenu grabs the keyboard before reading stdin if not reading from a tty. This -is faster, but will lock up X until stdin reaches end\-of\-file. -.TP -.B \-i -dmenu matches menu items case insensitively. -.TP -.B \-P -dmenu will not directly display the keyboard input, but instead replace it with dots. All data from stdin will be ignored. -.TP -.B \-r -dmenu will reject any input which would result in no matching option left. -.TP -.BI \-l " lines" -dmenu lists items vertically, with the given number of lines. -.TP -.BI \-m " monitor" -dmenu is displayed on the monitor number supplied. Monitor numbers are starting -from 0. -.TP -.BI \-p " prompt" -defines the prompt to be displayed to the left of the input field. -.TP -.BI \-fn " font" -defines the font or font set used. -.TP -.BI \-nb " color" -defines the normal background color. -.IR #RGB , -.IR #RRGGBB , -and X color names are supported. -.TP -.BI \-nf " color" -defines the normal foreground color. -.TP -.BI \-sb " color" -defines the selected background color. -.TP -.BI \-sf " color" -defines the selected foreground color. -.TP -.B \-v -prints version information to stdout, then exits. -.TP -.BI \-w " windowid" -embed into windowid. -.SH USAGE -dmenu is completely controlled by the keyboard. Items are selected using the -arrow keys, page up, page down, home, and end. -.TP -.B Tab -Copy the selected item to the input field. -.TP -.B Return -Confirm selection. Prints the selected item to stdout and exits, returning -success. -.TP -.B Ctrl-Return -Confirm selection. Prints the selected item to stdout and continues. -.TP -.B Shift\-Return -Confirm input. Prints the input text to stdout and exits, returning success. -.TP -.B Escape -Exit without selecting an item, returning failure. -.TP -.B Ctrl-Left -Move cursor to the start of the current word -.TP -.B Ctrl-Right -Move cursor to the end of the current word -.TP -.B C\-a -Home -.TP -.B C\-b -Left -.TP -.B C\-c -Escape -.TP -.B C\-d -Delete -.TP -.B C\-e -End -.TP -.B C\-f -Right -.TP -.B C\-g -Escape -.TP -.B C\-h -Backspace -.TP -.B C\-i -Tab -.TP -.B C\-j -Return -.TP -.B C\-J -Shift-Return -.TP -.B C\-k -Delete line right -.TP -.B C\-m -Return -.TP -.B C\-M -Shift-Return -.TP -.B C\-n -Down -.TP -.B C\-p -Up -.TP -.B C\-u -Delete line left -.TP -.B C\-w -Delete word left -.TP -.B C\-y -Paste from primary X selection -.TP -.B C\-Y -Paste from X clipboard -.TP -.B M\-b -Move cursor to the start of the current word -.TP -.B M\-f -Move cursor to the end of the current word -.TP -.B M\-g -Home -.TP -.B M\-G -End -.TP -.B M\-h -Up -.TP -.B M\-j -Page down -.TP -.B M\-k -Page up -.TP -.B M\-l -Down -.SH SEE ALSO -.IR dwm (1), -.IR stest (1) diff --git a/.local/src2/dmenu/dmenu.c b/.local/src2/dmenu/dmenu.c deleted file mode 100644 index bde0869ea..000000000 --- a/.local/src2/dmenu/dmenu.c +++ /dev/null @@ -1,995 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#ifdef XINERAMA -#include -#endif -#include -#include - -#include "drw.h" -#include "util.h" - -/* macros */ -#define INTERSECT(x,y,w,h,r) (MAX(0, MIN((x)+(w),(r).x_org+(r).width) - MAX((x),(r).x_org)) \ - && MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org))) -#define LENGTH(X) (sizeof X / sizeof X[0]) -#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) - -/* define opaqueness */ -#define OPAQUE 0xFFU - -/* enums */ -enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */ - -struct item { - char *text; - struct item *left, *right; - int out; -}; - -static char text[BUFSIZ] = ""; -static char *embed; -static int bh, mw, mh; -static int inputw = 0, promptw, passwd = 0; -static int lrpad; /* sum of left and right padding */ -static int reject_no_match = 0; -static size_t cursor; -static struct item *items = NULL; -static struct item *matches, *matchend; -static struct item *prev, *curr, *next, *sel; -static int mon = -1, screen; - -static Atom clip, utf8; -static Display *dpy; -static Window root, parentwin, win; -static XIC xic; - -static Drw *drw; -static int usergb = 0; -static Visual *visual; -static int depth; -static Colormap cmap; -static Clr *scheme[SchemeLast]; - -#include "config.h" - -static int (*fstrncmp)(const char *, const char *, size_t) = strncmp; -static char *(*fstrstr)(const char *, const char *) = strstr; - - -static void -xinitvisual() -{ - XVisualInfo *infos; - XRenderPictFormat *fmt; - int nitems; - int i; - - XVisualInfo tpl = { - .screen = screen, - .depth = 32, - .class = TrueColor - }; - - long masks = VisualScreenMask | VisualDepthMask | VisualClassMask; - - infos = XGetVisualInfo(dpy, masks, &tpl, &nitems); - visual = NULL; - - for (i = 0; i < nitems; i++){ - fmt = XRenderFindVisualFormat(dpy, infos[i].visual); - if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) { - visual = infos[i].visual; - depth = infos[i].depth; - cmap = XCreateColormap(dpy, root, visual, AllocNone); - usergb = 1; - break; - } - } - - XFree(infos); - - if (! visual) { - visual = DefaultVisual(dpy, screen); - depth = DefaultDepth(dpy, screen); - cmap = DefaultColormap(dpy, screen); - } -} - -static void -appenditem(struct item *item, struct item **list, struct item **last) -{ - if (*last) - (*last)->right = item; - else - *list = item; - - item->left = *last; - item->right = NULL; - *last = item; -} - -static void -calcoffsets(void) -{ - int i, n; - - if (lines > 0) - n = lines * bh; - else - n = mw - (promptw + inputw + TEXTW("<") + TEXTW(">")); - /* calculate which items will begin the next page and previous page */ - for (i = 0, next = curr; next; next = next->right) - if ((i += (lines > 0) ? bh : MIN(TEXTW(next->text), n)) > n) - break; - for (i = 0, prev = curr; prev && prev->left; prev = prev->left) - if ((i += (lines > 0) ? bh : MIN(TEXTW(prev->left->text), n)) > n) - break; -} - -static void -cleanup(void) -{ - size_t i; - - XUngrabKey(dpy, AnyKey, AnyModifier, root); - for (i = 0; i < SchemeLast; i++) - free(scheme[i]); - drw_free(drw); - XSync(dpy, False); - XCloseDisplay(dpy); -} - -static char * -cistrstr(const char *s, const char *sub) -{ - size_t len; - - for (len = strlen(sub); *s; s++) - if (!strncasecmp(s, sub, len)) - return (char *)s; - return NULL; -} - -static int -drawitem(struct item *item, int x, int y, int w) -{ - if (item == sel) - drw_setscheme(drw, scheme[SchemeSel]); - else if (item->out) - drw_setscheme(drw, scheme[SchemeOut]); - else - drw_setscheme(drw, scheme[SchemeNorm]); - - return drw_text(drw, x, y, w, bh, lrpad / 2, item->text, 0); -} - -static void -drawmenu(void) -{ - unsigned int curpos; - struct item *item; - int x = 0, y = 0, w; - char *censort; - - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, 0, 0, mw, mh, 1, 1); - - if (prompt && *prompt) { - drw_setscheme(drw, scheme[SchemeSel]); - x = drw_text(drw, x, 0, promptw, bh, lrpad / 2, prompt, 0); - } - /* draw input field */ - w = (lines > 0 || !matches) ? mw - x : inputw; - drw_setscheme(drw, scheme[SchemeNorm]); - if (passwd) { - censort = ecalloc(1, sizeof(text)); - memset(censort, '.', strlen(text)); - drw_text(drw, x, 0, w, bh, lrpad / 2, censort, 0); - free(censort); - } else drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0); - - curpos = TEXTW(text) - TEXTW(&text[cursor]); - if ((curpos += lrpad / 2 - 1) < w) { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, x + curpos, 2, 2, bh - 4, 1, 0); - } - - if (lines > 0) { - /* draw vertical list */ - for (item = curr; item != next; item = item->right) - drawitem(item, x, y += bh, mw - x); - } else if (matches) { - /* draw horizontal list */ - x += inputw; - w = TEXTW("<"); - if (curr->left) { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, "<", 0); - } - x += w; - for (item = curr; item != next; item = item->right) - x = drawitem(item, x, 0, MIN(TEXTW(item->text), mw - x - TEXTW(">"))); - if (next) { - w = TEXTW(">"); - drw_setscheme(drw, scheme[SchemeNorm]); - drw_text(drw, mw - w, 0, w, bh, lrpad / 2, ">", 0); - } - } - drw_map(drw, win, 0, 0, mw, mh); -} - -static void -grabfocus(void) -{ - struct timespec ts = { .tv_sec = 0, .tv_nsec = 10000000 }; - Window focuswin; - int i, revertwin; - - for (i = 0; i < 100; ++i) { - XGetInputFocus(dpy, &focuswin, &revertwin); - if (focuswin == win) - return; - XSetInputFocus(dpy, win, RevertToParent, CurrentTime); - nanosleep(&ts, NULL); - } - die("cannot grab focus"); -} - -static void -grabkeyboard(void) -{ - struct timespec ts = { .tv_sec = 0, .tv_nsec = 1000000 }; - int i; - - if (embed) - return; - /* try to grab keyboard, we may have to wait for another process to ungrab */ - for (i = 0; i < 1000; i++) { - if (XGrabKeyboard(dpy, DefaultRootWindow(dpy), True, GrabModeAsync, - GrabModeAsync, CurrentTime) == GrabSuccess) - return; - nanosleep(&ts, NULL); - } - die("cannot grab keyboard"); -} - -static void -match(void) -{ - static char **tokv = NULL; - static int tokn = 0; - - char buf[sizeof text], *s; - int i, tokc = 0; - size_t len, textsize; - struct item *item, *lprefix, *lsubstr, *prefixend, *substrend; - - strcpy(buf, text); - /* separate input text into tokens to be matched individually */ - for (s = strtok(buf, " "); s; tokv[tokc - 1] = s, s = strtok(NULL, " ")) - if (++tokc > tokn && !(tokv = realloc(tokv, ++tokn * sizeof *tokv))) - die("cannot realloc %u bytes:", tokn * sizeof *tokv); - len = tokc ? strlen(tokv[0]) : 0; - - matches = lprefix = lsubstr = matchend = prefixend = substrend = NULL; - textsize = strlen(text) + 1; - for (item = items; item && item->text; item++) { - for (i = 0; i < tokc; i++) - if (!fstrstr(item->text, tokv[i])) - break; - if (i != tokc) /* not all tokens match */ - continue; - /* exact matches go first, then prefixes, then substrings */ - if (!tokc || !fstrncmp(text, item->text, textsize)) - appenditem(item, &matches, &matchend); - else if (!fstrncmp(tokv[0], item->text, len)) - appenditem(item, &lprefix, &prefixend); - else - appenditem(item, &lsubstr, &substrend); - } - if (lprefix) { - if (matches) { - matchend->right = lprefix; - lprefix->left = matchend; - } else - matches = lprefix; - matchend = prefixend; - } - if (lsubstr) { - if (matches) { - matchend->right = lsubstr; - lsubstr->left = matchend; - } else - matches = lsubstr; - matchend = substrend; - } - curr = sel = matches; - calcoffsets(); -} - -static void -insert(const char *str, ssize_t n) -{ - if (strlen(text) + n > sizeof text - 1) - return; - - static char last[BUFSIZ] = ""; - if(reject_no_match) { - /* store last text value in case we need to revert it */ - memcpy(last, text, BUFSIZ); - } - - /* move existing text out of the way, insert new text, and update cursor */ - memmove(&text[cursor + n], &text[cursor], sizeof text - cursor - MAX(n, 0)); - if (n > 0) - memcpy(&text[cursor], str, n); - cursor += n; - match(); - - if(!matches && reject_no_match) { - /* revert to last text value if theres no match */ - memcpy(text, last, BUFSIZ); - cursor -= n; - match(); - } -} - -static size_t -nextrune(int inc) -{ - ssize_t n; - - /* return location of next utf8 rune in the given direction (+1 or -1) */ - for (n = cursor + inc; n + inc >= 0 && (text[n] & 0xc0) == 0x80; n += inc) - ; - return n; -} - -static void -movewordedge(int dir) -{ - if (dir < 0) { /* move cursor to the start of the word*/ - while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)])) - cursor = nextrune(-1); - while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)])) - cursor = nextrune(-1); - } else { /* move cursor to the end of the word */ - while (text[cursor] && strchr(worddelimiters, text[cursor])) - cursor = nextrune(+1); - while (text[cursor] && !strchr(worddelimiters, text[cursor])) - cursor = nextrune(+1); - } -} - -static void -keypress(XKeyEvent *ev) -{ - char buf[32]; - int len; - KeySym ksym; - Status status; - - len = XmbLookupString(xic, ev, buf, sizeof buf, &ksym, &status); - switch (status) { - default: /* XLookupNone, XBufferOverflow */ - return; - case XLookupChars: - goto insert; - case XLookupKeySym: - case XLookupBoth: - break; - } - - if (ev->state & ControlMask) { - switch(ksym) { - case XK_a: ksym = XK_Home; break; - case XK_b: ksym = XK_Left; break; - case XK_c: ksym = XK_Escape; break; - case XK_d: ksym = XK_Delete; break; - case XK_e: ksym = XK_End; break; - case XK_f: ksym = XK_Right; break; - case XK_g: ksym = XK_Escape; break; - case XK_h: ksym = XK_BackSpace; break; - case XK_i: ksym = XK_Tab; break; - case XK_j: /* fallthrough */ - case XK_J: /* fallthrough */ - case XK_m: /* fallthrough */ - case XK_M: ksym = XK_Return; ev->state &= ~ControlMask; break; - case XK_n: ksym = XK_Down; break; - case XK_p: ksym = XK_Up; break; - - case XK_k: /* delete right */ - text[cursor] = '\0'; - match(); - break; - case XK_u: /* delete left */ - insert(NULL, 0 - cursor); - break; - case XK_w: /* delete word */ - while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)])) - insert(NULL, nextrune(-1) - cursor); - while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)])) - insert(NULL, nextrune(-1) - cursor); - break; - case XK_y: /* paste selection */ - case XK_Y: - XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY, - utf8, utf8, win, CurrentTime); - return; - case XK_Left: - movewordedge(-1); - goto draw; - case XK_Right: - movewordedge(+1); - goto draw; - case XK_Return: - case XK_KP_Enter: - break; - case XK_bracketleft: - cleanup(); - exit(1); - default: - return; - } - } else if (ev->state & Mod1Mask) { - switch(ksym) { - case XK_b: - movewordedge(-1); - goto draw; - case XK_f: - movewordedge(+1); - goto draw; - case XK_g: ksym = XK_Home; break; - case XK_G: ksym = XK_End; break; - case XK_h: ksym = XK_Up; break; - case XK_j: ksym = XK_Next; break; - case XK_k: ksym = XK_Prior; break; - case XK_l: ksym = XK_Down; break; - default: - return; - } - } - - switch(ksym) { - default: -insert: - if (!iscntrl(*buf)) - insert(buf, len); - break; - case XK_Delete: - if (text[cursor] == '\0') - return; - cursor = nextrune(+1); - /* fallthrough */ - case XK_BackSpace: - if (cursor == 0) - return; - insert(NULL, nextrune(-1) - cursor); - break; - case XK_End: - if (text[cursor] != '\0') { - cursor = strlen(text); - break; - } - if (next) { - /* jump to end of list and position items in reverse */ - curr = matchend; - calcoffsets(); - curr = prev; - calcoffsets(); - while (next && (curr = curr->right)) - calcoffsets(); - } - sel = matchend; - break; - case XK_Escape: - cleanup(); - exit(1); - case XK_Home: - if (sel == matches) { - cursor = 0; - break; - } - sel = curr = matches; - calcoffsets(); - break; - case XK_Left: - if (cursor > 0 && (!sel || !sel->left || lines > 0)) { - cursor = nextrune(-1); - break; - } - if (lines > 0) - return; - /* fallthrough */ - case XK_Up: - if (sel && sel->left && (sel = sel->left)->right == curr) { - curr = prev; - calcoffsets(); - } - break; - case XK_Next: - if (!next) - return; - sel = curr = next; - calcoffsets(); - break; - case XK_Prior: - if (!prev) - return; - sel = curr = prev; - calcoffsets(); - break; - case XK_Return: - case XK_KP_Enter: - puts((sel && !(ev->state & ShiftMask)) ? sel->text : text); - if (!(ev->state & ControlMask)) { - cleanup(); - exit(0); - } - if (sel) - sel->out = 1; - break; - case XK_Right: - if (text[cursor] != '\0') { - cursor = nextrune(+1); - break; - } - if (lines > 0) - return; - /* fallthrough */ - case XK_Down: - if (sel && sel->right && (sel = sel->right) == next) { - curr = next; - calcoffsets(); - } - break; - case XK_Tab: - if (!sel) - return; - strncpy(text, sel->text, sizeof text - 1); - text[sizeof text - 1] = '\0'; - cursor = strlen(text); - match(); - break; - } - -draw: - drawmenu(); -} - -static void -buttonpress(XEvent *e) -{ - struct item *item; - XButtonPressedEvent *ev = &e->xbutton; - int x = 0, y = 0, h = bh, w; - - if (ev->window != win) - return; - - /* right-click: exit */ - if (ev->button == Button3) - exit(1); - - if (prompt && *prompt) - x += promptw; - - /* input field */ - w = (lines > 0 || !matches) ? mw - x : inputw; - - /* left-click on input: clear input, - * NOTE: if there is no left-arrow the space for < is reserved so - * add that to the input width */ - if (ev->button == Button1 && - ((lines <= 0 && ev->x >= 0 && ev->x <= x + w + - ((!prev || !curr->left) ? TEXTW("<") : 0)) || - (lines > 0 && ev->y >= y && ev->y <= y + h))) { - insert(NULL, -cursor); - drawmenu(); - return; - } - /* middle-mouse click: paste selection */ - if (ev->button == Button2) { - XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY, - utf8, utf8, win, CurrentTime); - drawmenu(); - return; - } - /* scroll up */ - if (ev->button == Button4 && prev) { - sel = curr = prev; - calcoffsets(); - drawmenu(); - return; - } - /* scroll down */ - if (ev->button == Button5 && next) { - sel = curr = next; - calcoffsets(); - drawmenu(); - return; - } - if (ev->button != Button1) - return; - if (ev->state & ~ControlMask) - return; - if (lines > 0) { - /* vertical list: (ctrl)left-click on item */ - w = mw - x; - for (item = curr; item != next; item = item->right) { - y += h; - if (ev->y >= y && ev->y <= (y + h)) { - puts(item->text); - if (!(ev->state & ControlMask)) - exit(0); - sel = item; - if (sel) { - sel->out = 1; - drawmenu(); - } - return; - } - } - } else if (matches) { - /* left-click on left arrow */ - x += inputw; - w = TEXTW("<"); - if (prev && curr->left) { - if (ev->x >= x && ev->x <= x + w) { - sel = curr = prev; - calcoffsets(); - drawmenu(); - return; - } - } - /* horizontal list: (ctrl)left-click on item */ - for (item = curr; item != next; item = item->right) { - x += w; - w = MIN(TEXTW(item->text), mw - x - TEXTW(">")); - if (ev->x >= x && ev->x <= x + w) { - puts(item->text); - if (!(ev->state & ControlMask)) - exit(0); - sel = item; - if (sel) { - sel->out = 1; - drawmenu(); - } - return; - } - } - /* left-click on right arrow */ - w = TEXTW(">"); - x = mw - w; - if (next && ev->x >= x && ev->x <= x + w) { - sel = curr = next; - calcoffsets(); - drawmenu(); - return; - } - } -} - -static void -paste(void) -{ - char *p, *q; - int di; - unsigned long dl; - Atom da; - - /* we have been given the current selection, now insert it into input */ - if (XGetWindowProperty(dpy, win, utf8, 0, (sizeof text / 4) + 1, False, - utf8, &da, &di, &dl, &dl, (unsigned char **)&p) - == Success && p) { - insert(p, (q = strchr(p, '\n')) ? q - p : (ssize_t)strlen(p)); - XFree(p); - } - drawmenu(); -} - -static void -readstdin(void) -{ - char buf[sizeof text], *p; - size_t i, imax = 0, size = 0; - unsigned int tmpmax = 0; - - if(passwd){ - inputw = lines = 0; - return; - } - - /* read each line from stdin and add it to the item list */ - for (i = 0; fgets(buf, sizeof buf, stdin); i++) { - if (i + 1 >= size / sizeof *items) - if (!(items = realloc(items, (size += BUFSIZ)))) - die("cannot realloc %u bytes:", size); - if ((p = strchr(buf, '\n'))) - *p = '\0'; - if (!(items[i].text = strdup(buf))) - die("cannot strdup %u bytes:", strlen(buf) + 1); - items[i].out = 0; - drw_font_getexts(drw->fonts, buf, strlen(buf), &tmpmax, NULL); - if (tmpmax > inputw) { - inputw = tmpmax; - imax = i; - } - } - if (items) - items[i].text = NULL; - inputw = items ? TEXTW(items[imax].text) : 0; - lines = MIN(lines, i); -} - -static void -run(void) -{ - XEvent ev; - - while (!XNextEvent(dpy, &ev)) { - if (XFilterEvent(&ev, win)) - continue; - switch(ev.type) { - case ButtonPress: - buttonpress(&ev); - break; - case DestroyNotify: - if (ev.xdestroywindow.window != win) - break; - cleanup(); - exit(1); - case Expose: - if (ev.xexpose.count == 0) - drw_map(drw, win, 0, 0, mw, mh); - break; - case FocusIn: - /* regrab focus from parent window */ - if (ev.xfocus.window != win) - grabfocus(); - break; - case KeyPress: - keypress(&ev.xkey); - break; - case SelectionNotify: - if (ev.xselection.property == utf8) - paste(); - break; - case VisibilityNotify: - if (ev.xvisibility.state != VisibilityUnobscured) - XRaiseWindow(dpy, win); - break; - } - } -} - -static void -setup(void) -{ - int x, y, i, j; - unsigned int du; - XSetWindowAttributes swa; - XIM xim; - Window w, dw, *dws; - XWindowAttributes wa; - XClassHint ch = {"dmenu", "dmenu"}; -#ifdef XINERAMA - XineramaScreenInfo *info; - Window pw; - int a, di, n, area = 0; -#endif - /* init appearance */ - for (j = 0; j < SchemeLast; j++) - scheme[j] = drw_scm_create(drw, colors[j], alphas[j], 2); - - clip = XInternAtom(dpy, "CLIPBOARD", False); - utf8 = XInternAtom(dpy, "UTF8_STRING", False); - - /* calculate menu geometry */ - bh = drw->fonts->h + 2; - lines = MAX(lines, 0); - mh = (lines + 1) * bh; -#ifdef XINERAMA - i = 0; - if (parentwin == root && (info = XineramaQueryScreens(dpy, &n))) { - XGetInputFocus(dpy, &w, &di); - if (mon >= 0 && mon < n) - i = mon; - else if (w != root && w != PointerRoot && w != None) { - /* find top-level window containing current input focus */ - do { - if (XQueryTree(dpy, (pw = w), &dw, &w, &dws, &du) && dws) - XFree(dws); - } while (w != root && w != pw); - /* find xinerama screen with which the window intersects most */ - if (XGetWindowAttributes(dpy, pw, &wa)) - for (j = 0; j < n; j++) - if ((a = INTERSECT(wa.x, wa.y, wa.width, wa.height, info[j])) > area) { - area = a; - i = j; - } - } - /* no focused window is on screen, so use pointer location instead */ - if (mon < 0 && !area && XQueryPointer(dpy, root, &dw, &dw, &x, &y, &di, &di, &du)) - for (i = 0; i < n; i++) - if (INTERSECT(x, y, 1, 1, info[i])) - break; - - x = info[i].x_org; - y = info[i].y_org + (topbar ? 0 : info[i].height - mh); - mw = info[i].width; - XFree(info); - } else -#endif - { - if (!XGetWindowAttributes(dpy, parentwin, &wa)) - die("could not get embedding window attributes: 0x%lx", - parentwin); - x = 0; - y = topbar ? 0 : wa.height - mh; - mw = wa.width; - } - promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; - inputw = MIN(inputw, mw/3); - match(); - - /* create menu window */ - swa.override_redirect = True; - swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; - swa.border_pixel = 0; - swa.colormap = cmap; - swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask | - ButtonPressMask; - win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0, - depth, InputOutput, visual, - CWOverrideRedirect | CWBackPixel | CWColormap | CWEventMask | CWBorderPixel, &swa); - XSetClassHint(dpy, win, &ch); - - - /* input methods */ - if ((xim = XOpenIM(dpy, NULL, NULL, NULL)) == NULL) - die("XOpenIM failed: could not open input device"); - - xic = XCreateIC(xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, - XNClientWindow, win, XNFocusWindow, win, NULL); - - XMapRaised(dpy, win); - if (embed) { - XSelectInput(dpy, parentwin, FocusChangeMask | SubstructureNotifyMask); - if (XQueryTree(dpy, parentwin, &dw, &w, &dws, &du) && dws) { - for (i = 0; i < du && dws[i] != win; ++i) - XSelectInput(dpy, dws[i], FocusChangeMask); - XFree(dws); - } - grabfocus(); - } - drw_resize(drw, mw, mh); - drawmenu(); -} - -static void -usage(void) -{ - fputs("usage: dmenu [-bfiPrv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" - " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr); - exit(1); -} - -void -read_Xresources(void) { - XrmInitialize(); - - char* xrm; - if ((xrm = XResourceManagerString(drw->dpy))) { - char *type; - XrmDatabase xdb = XrmGetStringDatabase(xrm); - XrmValue xval; - - if (XrmGetResource(xdb, "dmenu.font", "*", &type, &xval) == True) /* font or font set */ - fonts[0] = strdup(xval.addr); - if (XrmGetResource(xdb, "dmenu.color0", "*", &type, &xval) == True) /* normal background color */ - colors[SchemeNorm][ColBg] = strdup(xval.addr); - if (XrmGetResource(xdb, "dmenu.color4", "*", &type, &xval) == True) /* normal foreground color */ - colors[SchemeNorm][ColFg] = strdup(xval.addr); - if (XrmGetResource(xdb, "dmenu.color4", "*", &type, &xval) == True) /* selected background color */ - colors[SchemeSel][ColBg] = strdup(xval.addr); - if (XrmGetResource(xdb, "dmenu.color0", "*", &type, &xval) == True) /* selected foreground color */ - colors[SchemeSel][ColFg] = strdup(xval.addr); - - XrmDestroyDatabase(xdb); - } -} - -int -main(int argc, char *argv[]) -{ - XWindowAttributes wa; - int i, fast = 0; - - for (i = 1; i < argc; i++) - /* these options take no arguments */ - if (!strcmp(argv[i], "-v")) { /* prints version information */ - puts("dmenu-"VERSION); - exit(0); - } else if (!strcmp(argv[i], "-b")) /* appears at the bottom of the screen */ - topbar = 0; - else if (!strcmp(argv[i], "-f")) /* grabs keyboard before reading stdin */ - fast = 1; - else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ - fstrncmp = strncasecmp; - fstrstr = cistrstr; - } else if (!strcmp(argv[i], "-P")) /* is the input a password */ - passwd = 1; - else if (!strcmp(argv[i], "-r")) /* reject input which results in no match */ - reject_no_match = 1; - else if (i + 1 == argc) - usage(); - /* these options take one argument */ - else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */ - lines = atoi(argv[++i]); - else if (!strcmp(argv[i], "-m")) - mon = atoi(argv[++i]); - else if (!strcmp(argv[i], "-p")) /* adds prompt to left of input field */ - prompt = argv[++i]; - else if (!strcmp(argv[i], "-fn")) /* font or font set */ - fonts[0] = argv[++i]; - else if (!strcmp(argv[i], "-nb")) /* normal background color */ - colors[SchemeNorm][ColBg] = argv[++i]; - else if (!strcmp(argv[i], "-nf")) /* normal foreground color */ - colors[SchemeNorm][ColFg] = argv[++i]; - else if (!strcmp(argv[i], "-sb")) /* selected background color */ - colors[SchemeSel][ColBg] = argv[++i]; - else if (!strcmp(argv[i], "-sf")) /* selected foreground color */ - colors[SchemeSel][ColFg] = argv[++i]; - else if (!strcmp(argv[i], "-w")) /* embedding window id */ - embed = argv[++i]; - else - usage(); - - if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) - fputs("warning: no locale support\n", stderr); - if (!(dpy = XOpenDisplay(NULL))) - die("cannot open display"); - screen = DefaultScreen(dpy); - root = RootWindow(dpy, screen); - if (!embed || !(parentwin = strtol(embed, NULL, 0))) - parentwin = root; - if (!XGetWindowAttributes(dpy, parentwin, &wa)) - die("could not get embedding window attributes: 0x%lx", - parentwin); - xinitvisual(); - drw = drw_create(dpy, screen, root, wa.width, wa.height, visual, depth, cmap); - read_Xresources(); - if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) - die("no fonts could be loaded."); - lrpad = drw->fonts->h; - -#ifdef __OpenBSD__ - if (pledge("stdio rpath", NULL) == -1) - die("pledge"); -#endif - - if (fast && !isatty(0)) { - grabkeyboard(); - readstdin(); - } else { - readstdin(); - grabkeyboard(); - } - setup(); - run(); - - return 1; /* unreachable */ -} diff --git a/.local/src2/dmenu/dmenu.o b/.local/src2/dmenu/dmenu.o deleted file mode 100644 index 80b2309456c636b1be8a08f9a323283f793d1f5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38896 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 B+Q$F@ diff --git a/.local/src2/dmenu/dmenu_path b/.local/src2/dmenu/dmenu_path deleted file mode 100755 index 3a7cda792..000000000 --- a/.local/src2/dmenu/dmenu_path +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh - -cachedir="${XDG_CACHE_HOME:-"$HOME/.cache"}" -cache="$cachedir/dmenu_run" - -[ ! -e "$cachedir" ] && mkdir -p "$cachedir" - -IFS=: -if stest -dqr -n "$cache" $PATH; then - stest -flx $PATH | sort -u | tee "$cache" -else - cat "$cache" -fi diff --git a/.local/src2/dmenu/dmenu_run b/.local/src2/dmenu/dmenu_run deleted file mode 100755 index 834ede54f..000000000 --- a/.local/src2/dmenu/dmenu_run +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -dmenu_path | dmenu "$@" | ${SHELL:-"/bin/sh"} & diff --git a/.local/src2/dmenu/drw.c b/.local/src2/dmenu/drw.c deleted file mode 100644 index 76949555a..000000000 --- a/.local/src2/dmenu/drw.c +++ /dev/null @@ -1,424 +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, Visual *visual, unsigned int depth, Colormap cmap) -{ - Drw *drw = ecalloc(1, sizeof(Drw)); - - drw->dpy = dpy; - drw->screen = screen; - drw->root = root; - drw->w = w; - drw->h = h; - drw->visual = visual; - drw->depth = depth; - drw->cmap = cmap; - drw->drawable = XCreatePixmap(dpy, root, w, h, depth); - drw->gc = XCreateGC(dpy, drw->drawable, 0, NULL); - XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); - - return drw; -} - -void -drw_resize(Drw *drw, unsigned int w, unsigned int h) -{ - if (!drw) - return; - - drw->w = w; - drw->h = h; - if (drw->drawable) - XFreePixmap(drw->dpy, drw->drawable); - drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, drw->depth); -} - -void -drw_free(Drw *drw) -{ - XFreePixmap(drw->dpy, drw->drawable); - XFreeGC(drw->dpy, drw->gc); - drw_fontset_free(drw->fonts); - free(drw); -} - -/* This function is an implementation detail. Library users should use - * drw_fontset_create instead. - */ -static Fnt * -xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) -{ - Fnt *font; - XftFont *xfont = NULL; - FcPattern *pattern = NULL; - - if (fontname) { - /* Using the pattern found at font->xfont->pattern does not yield the - * same substitution results as using the pattern returned by - * FcNameParse; using the latter results in the desired fallback - * behaviour whereas the former just results in missing-character - * rectangles being drawn, at least with some fonts. */ - if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) { - fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname); - return NULL; - } - if (!(pattern = FcNameParse((FcChar8 *) fontname))) { - fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname); - XftFontClose(drw->dpy, xfont); - return NULL; - } - } else if (fontpattern) { - if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) { - fprintf(stderr, "error, cannot load font from pattern.\n"); - return NULL; - } - } else { - die("no font specified."); - } - - font = ecalloc(1, sizeof(Fnt)); - font->xfont = xfont; - font->pattern = pattern; - font->h = xfont->ascent + xfont->descent; - font->dpy = drw->dpy; - - return font; -} - -static void -xfont_free(Fnt *font) -{ - if (!font) - return; - if (font->pattern) - FcPatternDestroy(font->pattern); - XftFontClose(font->dpy, font->xfont); - free(font); -} - -Fnt* -drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount) -{ - Fnt *cur, *ret = NULL; - size_t i; - - if (!drw || !fonts) - return NULL; - - for (i = 1; i <= fontcount; i++) { - if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) { - cur->next = ret; - ret = cur; - } - } - return (drw->fonts = ret); -} - -void -drw_fontset_free(Fnt *font) -{ - if (font) { - drw_fontset_free(font->next); - xfont_free(font); - } -} - -void -drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha) -{ - if (!drw || !dest || !clrname) - return; - - if (!XftColorAllocName(drw->dpy, drw->visual, drw->cmap, - clrname, dest)) - die("error, cannot allocate color '%s'", clrname); - dest->pixel = (dest->pixel & 0x00FFFFFFFU) | alpha << 24; -} - -/* Wrapper to create color schemes. The caller has to call free(3) on the - * returned color scheme when done using it. */ -Clr * -drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount) -{ - size_t i; - Clr *ret; - - /* need at least two colors for a scheme */ - if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor)))) - return NULL; - - for (i = 0; i < clrcount; i++) - drw_clr_create(drw, &ret[i], clrnames[i], alphas[i]); - return ret; -} - -void -drw_setfontset(Drw *drw, Fnt *set) -{ - if (drw) - drw->fonts = set; -} - -void -drw_setscheme(Drw *drw, Clr *scm) -{ - if (drw) - drw->scheme = scm; -} - -void -drw_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, drw->visual, drw->cmap); - x += lpad; - w -= lpad; - } - - usedfont = drw->fonts; - while (1) { - utf8strlen = 0; - utf8str = text; - nextfont = NULL; - while (*text) { - utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ); - for (curfont = drw->fonts; curfont; curfont = curfont->next) { - charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint); - if (charexists) { - if (curfont == usedfont) { - utf8strlen += utf8charlen; - text += utf8charlen; - } else { - nextfont = curfont; - } - break; - } - } - - if (!charexists || nextfont) - break; - else - charexists = 0; - } - - if (utf8strlen) { - drw_font_getexts(usedfont, utf8str, utf8strlen, &ew, NULL); - /* shorten text if necessary */ - for (len = MIN(utf8strlen, sizeof(buf) - 1); len && ew > w; len--) - drw_font_getexts(usedfont, utf8str, len, &ew, NULL); - - if (len) { - memcpy(buf, utf8str, len); - buf[len] = '\0'; - if (len < utf8strlen) - for (i = len; i && i > len - 3; buf[--i] = '.') - ; /* NOP */ - - if (render) { - ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent; - XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg], - usedfont->xfont, x, ty, (XftChar8 *)buf, len); - } - x += ew; - w -= ew; - } - } - - if (!*text) { - break; - } else if (nextfont) { - charexists = 0; - usedfont = nextfont; - } else { - /* Regardless of whether or not a fallback font is found, the - * character must be drawn. */ - charexists = 1; - - fccharset = FcCharSetCreate(); - FcCharSetAddChar(fccharset, utf8codepoint); - - if (!drw->fonts->pattern) { - /* Refer to the comment in xfont_create for more information. */ - die("the first font in the cache must be loaded from a font string."); - } - - fcpattern = FcPatternDuplicate(drw->fonts->pattern); - FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset); - FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue); - FcPatternAddBool(fcpattern, FC_COLOR, FcFalse); - - FcConfigSubstitute(NULL, fcpattern, FcMatchPattern); - FcDefaultSubstitute(fcpattern); - match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result); - - FcCharSetDestroy(fccharset); - FcPatternDestroy(fcpattern); - - if (match) { - usedfont = xfont_create(drw, NULL, match); - if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) { - for (curfont = drw->fonts; curfont->next; curfont = curfont->next) - ; /* NOP */ - curfont->next = usedfont; - } else { - xfont_free(usedfont); - usedfont = drw->fonts; - } - } - } - } - if (d) - XftDrawDestroy(d); - - return x + (render ? w : 0); -} - -void -drw_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/.local/src2/dmenu/drw.h b/.local/src2/dmenu/drw.h deleted file mode 100644 index 4f66f0d68..000000000 --- a/.local/src2/dmenu/drw.h +++ /dev/null @@ -1,60 +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 }; /* Clr scheme index */ -typedef XftColor Clr; - -typedef struct { - unsigned int w, h; - Display *dpy; - int screen; - Window root; - Visual *visual; - unsigned int depth; - Colormap cmap; - Drawable drawable; - GC gc; - Clr *scheme; - Fnt *fonts; -} Drw; - -/* Drawable abstraction */ -Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap); -void drw_resize(Drw *drw, unsigned int w, unsigned int h); -void drw_free(Drw *drw); - -/* Fnt abstraction */ -Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount); -void drw_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, unsigned int alpha); -Clr *drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount); - -/* Cursor abstraction */ -Cur *drw_cur_create(Drw *drw, int shape); -void drw_cur_free(Drw *drw, Cur *cursor); - -/* Drawing context manipulation */ -void drw_setfontset(Drw *drw, Fnt *set); -void drw_setscheme(Drw *drw, Clr *scm); - -/* 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/.local/src2/dmenu/drw.o b/.local/src2/dmenu/drw.o deleted file mode 100644 index 07d5ef0f5ebc54363fd255712f7b67da72b0549f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10400 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 diff --git a/.local/src2/dmenu/stest b/.local/src2/dmenu/stest deleted file mode 100755 index 532383f49a6ef32766e3e52cb2f6c47603a0962a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17080 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 Vl+xT|X8RlNFg2Ex7?iN$KLNI8gzNwS diff --git a/.local/src2/dmenu/stest.1 b/.local/src2/dmenu/stest.1 deleted file mode 100644 index 2667d8aa7..000000000 --- a/.local/src2/dmenu/stest.1 +++ /dev/null @@ -1,90 +0,0 @@ -.TH STEST 1 dmenu\-VERSION -.SH NAME -stest \- filter a list of files by properties -.SH SYNOPSIS -.B stest -.RB [ -abcdefghlpqrsuwx ] -.RB [ -n -.IR file ] -.RB [ -o -.IR file ] -.RI [ file ...] -.SH DESCRIPTION -.B stest -takes a list of files and filters by the files' properties, analogous to -.IR test (1). -Files which pass all tests are printed to stdout. If no files are given, stest -reads files from stdin. -.SH OPTIONS -.TP -.B \-a -Test hidden files. -.TP -.B \-b -Test that files are block specials. -.TP -.B \-c -Test that files are character specials. -.TP -.B \-d -Test that files are directories. -.TP -.B \-e -Test that files exist. -.TP -.B \-f -Test that files are regular files. -.TP -.B \-g -Test that files have their set-group-ID flag set. -.TP -.B \-h -Test that files are symbolic links. -.TP -.B \-l -Test the contents of a directory given as an argument. -.TP -.BI \-n " file" -Test that files are newer than -.IR file . -.TP -.BI \-o " file" -Test that files are older than -.IR file . -.TP -.B \-p -Test that files are named pipes. -.TP -.B \-q -No files are printed, only the exit status is returned. -.TP -.B \-r -Test that files are readable. -.TP -.B \-s -Test that files are not empty. -.TP -.B \-u -Test that files have their set-user-ID flag set. -.TP -.B \-v -Invert the sense of tests, only failing files pass. -.TP -.B \-w -Test that files are writable. -.TP -.B \-x -Test that files are executable. -.SH EXIT STATUS -.TP -.B 0 -At least one file passed all tests. -.TP -.B 1 -No files passed all tests. -.TP -.B 2 -An error occurred. -.SH SEE ALSO -.IR dmenu (1), -.IR test (1) diff --git a/.local/src2/dmenu/stest.c b/.local/src2/dmenu/stest.c deleted file mode 100644 index 7a7b0bcfc..000000000 --- a/.local/src2/dmenu/stest.c +++ /dev/null @@ -1,109 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include - -#include -#include -#include -#include -#include -#include - -#include "arg.h" -char *argv0; - -#define FLAG(x) (flag[(x)-'a']) - -static void test(const char *, const char *); -static void usage(void); - -static int match = 0; -static int flag[26]; -static struct stat old, new; - -static void -test(const char *path, const char *name) -{ - struct stat st, ln; - - if ((!stat(path, &st) && (FLAG('a') || name[0] != '.') /* hidden files */ - && (!FLAG('b') || S_ISBLK(st.st_mode)) /* block special */ - && (!FLAG('c') || S_ISCHR(st.st_mode)) /* character special */ - && (!FLAG('d') || S_ISDIR(st.st_mode)) /* directory */ - && (!FLAG('e') || access(path, F_OK) == 0) /* exists */ - && (!FLAG('f') || S_ISREG(st.st_mode)) /* regular file */ - && (!FLAG('g') || st.st_mode & S_ISGID) /* set-group-id flag */ - && (!FLAG('h') || (!lstat(path, &ln) && S_ISLNK(ln.st_mode))) /* symbolic link */ - && (!FLAG('n') || st.st_mtime > new.st_mtime) /* newer than file */ - && (!FLAG('o') || st.st_mtime < old.st_mtime) /* older than file */ - && (!FLAG('p') || S_ISFIFO(st.st_mode)) /* named pipe */ - && (!FLAG('r') || access(path, R_OK) == 0) /* readable */ - && (!FLAG('s') || st.st_size > 0) /* not empty */ - && (!FLAG('u') || st.st_mode & S_ISUID) /* set-user-id flag */ - && (!FLAG('w') || access(path, W_OK) == 0) /* writable */ - && (!FLAG('x') || access(path, X_OK) == 0)) != FLAG('v')) { /* executable */ - if (FLAG('q')) - exit(0); - match = 1; - puts(name); - } -} - -static void -usage(void) -{ - fprintf(stderr, "usage: %s [-abcdefghlpqrsuvwx] " - "[-n file] [-o file] [file...]\n", argv0); - exit(2); /* like test(1) return > 1 on error */ -} - -int -main(int argc, char *argv[]) -{ - struct dirent *d; - char path[PATH_MAX], *line = NULL, *file; - size_t linesiz = 0; - ssize_t n; - DIR *dir; - int r; - - ARGBEGIN { - case 'n': /* newer than file */ - case 'o': /* older than file */ - file = EARGF(usage()); - if (!(FLAG(ARGC()) = !stat(file, (ARGC() == 'n' ? &new : &old)))) - perror(file); - break; - default: - /* miscellaneous operators */ - if (strchr("abcdefghlpqrsuvwx", ARGC())) - FLAG(ARGC()) = 1; - else - usage(); /* unknown flag */ - } ARGEND; - - if (!argc) { - /* read list from stdin */ - while ((n = getline(&line, &linesiz, stdin)) > 0) { - if (n && line[n - 1] == '\n') - line[n - 1] = '\0'; - test(line, line); - } - free(line); - } else { - for (; argc; argc--, argv++) { - if (FLAG('l') && (dir = opendir(*argv))) { - /* test directory contents */ - while ((d = readdir(dir))) { - r = snprintf(path, sizeof path, "%s/%s", - *argv, d->d_name); - if (r >= 0 && (size_t)r < sizeof path) - test(path, d->d_name); - } - closedir(dir); - } else { - test(*argv, *argv); - } - } - } - return match ? 0 : 1; -} diff --git a/.local/src2/dmenu/stest.o b/.local/src2/dmenu/stest.o deleted file mode 100644 index 4ffa35781ceb87544318703168121b14c0b3d301..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5296 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 G$Nv|r18WKZ diff --git a/.local/src2/dmenu/util.c b/.local/src2/dmenu/util.c deleted file mode 100644 index fe044fc7b..000000000 --- a/.local/src2/dmenu/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/.local/src2/dmenu/util.h b/.local/src2/dmenu/util.h deleted file mode 100644 index f633b5173..000000000 --- a/.local/src2/dmenu/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/.local/src2/dmenu/util.o b/.local/src2/dmenu/util.o deleted file mode 100644 index 3b48c2f667e0d2c6574012f800ee0078a6ec0b61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2256 zcmbuAO-vI(6vy8dl!~RTzyX7Y9#%sW+)xuEsY(hISal->YD6xzl&v)O%k9>Hnurk( zP1A&f2M-=Ncro!{qDK=NJ$U8lNj#e10S_JwCiT7D8JKL^i@s#?-u&MG&CJfs?mnK- zCS8&Q+$0!*!ycyqu_K3Z#0n$eg)W#=EBoq`AKwtE6;mEoD{(oZRy0}FDp5J6VKl#9 zH^aVQRKD#CYI4yRd@iq{+!uT)Z&?17ylMG2@>|Qlm+O}QAaA2zQmgH!2QW}^z=2R* ztzO0s_P(mMb$O2^`qWxn_N%q1JoGs#``w7q_YSdi;5!Deb`jL-d5X+IwX#DCc3TOx ziqYDmwnn(zvlYO+MMDkC?RIW;aGA@L9d=QES$UEU@q?mCR-fsW8CQ_;@%l zFm?S#Fc1nUA%)fg?brg?Xge_lE|BWP_?}Cwe+(H}ukAp3FbmR(U+VXCxHnMThx`=F z{U$%^^*?o8_3p9UFw31}xtm@$Bh4Mn-wr<;&9ZF=t2@lvqY0OSrMl2}3wmp9$WCDM zGmYrzIht{$1;5aOkF?;?7W`TZ9z#y+=j*oi57|r$J(SH%R!M=PjSs<6Mu(EQq#Fh# zrnKp?Q7th&IXO2GPsB&Zw21`VPZy0$-b|y)$m)4W7t3Y}idaxEKwrt2pxf66$~YgH z3mfh7pN4I(38K-R>A=SMJA!CV{YM*HdO9<%{~~a@Yn<;0oNhhmy8;*WzXX0<(C-VJ z?gSsFgI#o5XPdx1jMH;bMJHF zOGz^c%3`Smicz2r$?+uxB~{4f^gK%P1yfh>6+K%rlc~F`eW@w=PUa^AHZ_jildHUBCOxd_KBw*UFgRI?O%ion14Z=jpk+rbXFAduL8Y?WM{Au zXL3T8%{nJy+=&N~)0qESAHrH1^BgwO`22jmJjdtfK7t8~t&c4ip$txn zFj1Q00ueUR-a>vBHNJ=BuaS-;8Z>H8#_vp$Q-X6L_25RK1I=TGl3 zujl9AY;LNf{|Z@*c@M@kq_dvJbe=sTh%h)$9l_Xe2Za6;&FZ(=`X3%B?Z8?87wdl# AdH?_b diff --git a/.local/src2/dwm/FUNDING.yml b/.local/src2/dwm/FUNDING.yml deleted file mode 100644 index c7c9a22ea..000000000 --- a/.local/src2/dwm/FUNDING.yml +++ /dev/null @@ -1,2 +0,0 @@ -custom: ["https://lukesmith.xyz/donate.html"] -github: lukesmithxyz diff --git a/.local/src2/dwm/LICENSE b/.local/src2/dwm/LICENSE deleted file mode 100644 index 1e1b5a431..000000000 --- a/.local/src2/dwm/LICENSE +++ /dev/null @@ -1,38 +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 -© 2019-2020 Luke Smith - -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/.local/src2/dwm/Makefile b/.local/src2/dwm/Makefile deleted file mode 100644 index ac1ca6349..000000000 --- a/.local/src2/dwm/Makefile +++ /dev/null @@ -1,52 +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 - -dwm: ${OBJ} - ${CC} -o $@ ${OBJ} ${LDFLAGS} - -clean: - rm -f dwm ${OBJ} dwm-${VERSION}.tar.gz *.orig *.rej - -dist: clean - mkdir -p dwm-${VERSION} - cp -R LICENSE Makefile README config.mk\ - dwm.1 drw.h util.h ${SRC} 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 - # mkdir -p ${DESTDIR}${PREFIX}/share/dwm - # cp -f larbs.mom ${DESTDIR}${PREFIX}/share/dwm - # chmod 644 ${DESTDIR}${PREFIX}/share/dwm/larbs.mom - -uninstall: - rm -f ${DESTDIR}${PREFIX}/bin/dwm\ - # ${DESTDIR}${PREFIX}/share/dwm/larbs.mom\ - ${DESTDIR}${MANPREFIX}/man1/dwm.1 - -.PHONY: all options clean dist install uninstall diff --git a/.local/src2/dwm/PKGBUILD b/.local/src2/dwm/PKGBUILD deleted file mode 100644 index ba894886c..000000000 --- a/.local/src2/dwm/PKGBUILD +++ /dev/null @@ -1,46 +0,0 @@ -_pkgname=dwm -pkgname=$_pkgname-larbs-git -pkgver=6.2.r1888.0ac09e0 -pkgrel=1 -pkgdesc="Luke's build of dwm" -url=https://github.com/LukeSmithxyz/dwm -arch=(i686 x86_64) -license=(MIT) -makedepends=(git) -depends=(freetype2 libx11 libxft) -optdepends=( - 'libxft-bgra: if dwm crashes when displaying emojis' - 'libxft-bgra-git: if dwm crashes when displaying emojis' - 'dmenu: program launcher' - 'st: terminal emulator') -provides=($_pkgname) -conflicts=($_pkgname) -source=(git+https://github.com/LukeSmithxyz/dwm) -sha256sums=('SKIP') - -pkgver() { - cd "$_pkgname" - echo "$(awk '/^VERSION =/ {print $3}' config.mk)".r"$(git rev-list --count HEAD)"."$(git rev-parse --short HEAD)" -} - -prepare() { - cd "$_pkgname" - echo "CPPFLAGS+=${CPPFLAGS}" >> config.mk - echo "CFLAGS+=${CFLAGS}" >> config.mk - echo "LDFLAGS+=${LDFLAGS}" >> config.mk - # to use a custom config.h, place it in the package directory - if [[ -f ${SRCDEST}/config.h ]]; then - cp "${SRCDEST}/config.h" . - fi -} - -build() { - cd "$_pkgname" - make X11INC=/usr/include/X11 X11LIB=/usr/lib/X11 -} - -package() { - cd "$_pkgname" - make PREFIX=/usr DESTDIR="$pkgdir" install - install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE" -} diff --git a/.local/src2/dwm/README.md b/.local/src2/dwm/README.md deleted file mode 100644 index 0dd4e321a..000000000 --- a/.local/src2/dwm/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# Luke's build of dwm - -## FAQ - -> What are the bindings? - -This is suckless, mmmbud, the source code is the documentation! Check out [config.h](config.h). - -Okay, okay, actually I keep a readme in `larbs.mom` for my whole system, including the binds here. -Press super+F1 to view it in dwm (zathura is required for that binding). -I haven't kept `man dwm`/`dwm.1` updated though. PRs welcome on that, lol. - -## Patches and features - -- [Clickable statusbar](https://dwm.suckless.org/patches/statuscmd/) with my build of [dwmblocks](https://github.com/lukesmithxyz/dwmblocks). -- Reads [xresources](https://dwm.suckless.org/patches/xresources/) colors/variables (i.e. works with `pywal`, etc.). -- scratchpad: Accessible with mod+shift+enter. -- New layouts: bstack, fibonacci, deck, centered master and more. All bound to keys super+(shift+)t/y/u/i. -- True fullscreen (super+f) and prevents focus shifting. -- Windows can be made sticky (super+s). -- [stacker](https://dwm.suckless.org/patches/stacker/): Move windows up the stack manually (super-K/J). -- [shiftview](https://dwm.suckless.org/patches/nextprev/): Cycle through tags (super+g/;). -- [vanitygaps](https://dwm.suckless.org/patches/vanitygaps/): Gaps allowed across all layouts. -- [swallow patch](https://dwm.suckless.org/patches/swallow/): if a program run from a terminal would make it inoperable, it temporarily takes its place to save space. - - -## Installation for newbs - -```bash -git clone https://github.com/LukeSmithxyz/dwm.git -cd dwm -sudo make install -``` - -There is also a `PKGBUILD` usable on distributions with pacman. Run `makepkg -si` instead of `sudo make install`. - -### You must also install `libxft-bgra`! - -This build of dwm does not block color emoji in the status/info bar, so you must install [libxft-bgra](https://aur.archlinux.org/packages/libxft-bgra/), which fixes a libxft color emoji rendering problem, otherwise dwm will crash upon trying to render one. Hopefully this fix will be in all libxft soon enough. diff --git a/.local/src2/dwm/compile_commands.json b/.local/src2/dwm/compile_commands.json deleted file mode 100644 index a3cccb2ed..000000000 --- a/.local/src2/dwm/compile_commands.json +++ /dev/null @@ -1,65 +0,0 @@ -[ - { - "arguments": [ - "/usr/bin/cc", - "-c", - "-std=c99", - "-pedantic", - "-Wall", - "-Wno-deprecated-declarations", - "-Os", - "-I/usr/X11R6/include", - "-I/usr/include/freetype2", - "-D_DEFAULT_SOURCE", - "-D_BSD_SOURCE", - "-D_POSIX_C_SOURCE=200809L", - "-DVERSION=\"6.2\"", - "-DXINERAMA", - "drw.c" - ], - "directory": "/home/luca/.local/src/dwm", - "file": "/home/luca/.local/src/dwm/drw.c" - }, - { - "arguments": [ - "/usr/bin/cc", - "-c", - "-std=c99", - "-pedantic", - "-Wall", - "-Wno-deprecated-declarations", - "-Os", - "-I/usr/X11R6/include", - "-I/usr/include/freetype2", - "-D_DEFAULT_SOURCE", - "-D_BSD_SOURCE", - "-D_POSIX_C_SOURCE=200809L", - "-DVERSION=\"6.2\"", - "-DXINERAMA", - "dwm.c" - ], - "directory": "/home/luca/.local/src/dwm", - "file": "/home/luca/.local/src/dwm/dwm.c" - }, - { - "arguments": [ - "/usr/bin/cc", - "-c", - "-std=c99", - "-pedantic", - "-Wall", - "-Wno-deprecated-declarations", - "-Os", - "-I/usr/X11R6/include", - "-I/usr/include/freetype2", - "-D_DEFAULT_SOURCE", - "-D_BSD_SOURCE", - "-D_POSIX_C_SOURCE=200809L", - "-DVERSION=\"6.2\"", - "-DXINERAMA", - "util.c" - ], - "directory": "/home/luca/.local/src/dwm", - "file": "/home/luca/.local/src/dwm/util.c" - } -] diff --git a/.local/src2/dwm/config.h b/.local/src2/dwm/config.h deleted file mode 100644 index 54b7b5ef7..000000000 --- a/.local/src2/dwm/config.h +++ /dev/null @@ -1,542 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -/* Constants */ -#define TERMINAL "kitty" -#define TERMCLASS "kitty" -#define BROWSER "librewolf" - -/* appearance */ -static unsigned int borderpx = 2; /* border pixel of windows */ -static unsigned int snap = 33; /* snap pixel */ -static unsigned int gappih = 10; /* horiz inner gap between windows */ -static unsigned int gappiv = 10; /* vert inner gap between windows */ -static unsigned int gappoh = - 10; /* horiz outer gap between windows and screen edge */ -static unsigned int gappov = - 10; /* vert outer gap between windows and screen edge */ -static int swallowfloating = - 0; /* 1 means swallow floating windows by default */ -static int smartgaps = - 0; /* 1 means no outer gap when there is only one window */ -static int showbar = 1; /* 0 means no bar */ -static int topbar = 1; /* 0 means bottom bar */ -static char *fonts[] = { - "FiraCode Nerd Font Mono:size=10:antialias=true:autohint=true"}; -static char normbgcolor[] = "#222222"; -static char normbordercolor[] = "#444444"; -static char normfgcolor[] = "#bbbbbb"; -static char selfgcolor[] = "#eeeeee"; -static char selbordercolor[] = "#770000"; -static char selbgcolor[] = "#005577"; -static char *colors[][3] = { - /* fg bg border */ - [SchemeNorm] = {normfgcolor, normbgcolor, normbordercolor}, - [SchemeSel] = {selfgcolor, selbgcolor, selbordercolor}, -}; - -typedef struct { - const char *name; - const void *cmd; -} Sp; -const char *spcmd1[] = {TERMINAL, - "--name", - "spterm", - "-o", - "initial_window_width=120c", - "-o", - "initial_window_height=34c", - "-o", - "remember_window_size=no", - "-o", - "background_opacity=0.8", - "-o", - "tab_bar_min_tabs=9001", - NULL}; -const char *spcmd2[] = {TERMINAL, - "--name", - "spcalc", - "-o", - "remember_window_size=no", - "-o", - "font_size=16", - "-o", - "initial_window_width=50c", - "-o", - "initial_window_height=20c", - "-o", - "background_opacity=0.8", - "-o", - "confirm_os_window_close=0", - "-o", - "tab_bar_min_tabs=9001", - "-e", - "bc", - "-lq", - NULL}; -static Sp scratchpads[] = { - /* name cmd */ - {"spterm", spcmd1}, - {"spcalc", spcmd2}, -}; - -/* tagging */ -static const char *tags[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9"}; - -static const Rule rules[] = { - /* xprop(1): - * WM_CLASS(STRING) = instance, class - * WM_NAME(STRING) = title - */ - /* class instance title tags mask isfloating - isterminal noswallow monitor */ - {"Gimp", NULL, NULL, 1 << 8, 0, 0, 0, -1}, - {TERMCLASS, NULL, NULL, 0, 0, 1, 0, -1}, - {NULL, NULL, "Event Tester", 0, 0, 0, 1, -1}, - {NULL, "bg", NULL, 0, 0, 1, 1 << 7, -1}, - {NULL, "spterm", NULL, SPTAG(0), 1, 1, 0, -1}, - {NULL, "spcalc", NULL, SPTAG(1), 1, 1, 0, -1}, -}; - -/* layout(s) */ -static float mfact = 0.6; /* factor of master area size [0.05..0.95] */ -static int nmaster = 1; /* number of clients in master area */ -static int resizehints = 0; /* 1 means respect size hints in tiled resizals */ -#define FORCE_VSPLIT \ - 1 /* nrowgrid layout: force two clients to always split vertically */ -#include "vanitygaps.c" -static const Layout layouts[] = { - /* symbol arrange function */ - {"[]=", tile}, /* Default: Master on left, slaves on right */ - {"TTT", bstack}, /* Master on top, slaves on bottom */ - - {"[@]", spiral}, /* Fibonacci spiral */ - {"[\\]", dwindle}, /* Decreasing in size right and leftward */ - - {"[D]", deck}, /* Master on left, slaves in monocle-like mode on right */ - {"[M]", monocle}, /* All windows on top of eachother */ - - {"|M|", centeredmaster}, /* Master in middle, slaves on sides */ - {">M>", centeredfloatingmaster}, /* Same but master floats */ - - {"><>", NULL}, /* no layout function means floating behavior */ - {NULL, NULL}, -}; - -/* 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}}, -#define STACKKEYS(MOD, ACTION) \ - {MOD, XK_j, ACTION##stack, {.i = INC(+1)}}, \ - {MOD, XK_k, ACTION##stack, {.i = INC(-1)}}, \ - {MOD, \ - XK_v, \ - ACTION##stack, \ - {.i = 0}}, /* { MOD, XK_grave, ACTION##stack, {.i = PREVSEL } }, \ */ - /* { MOD, XK_a, ACTION##stack, {.i = 1 } }, \ */ - /* { MOD, XK_z, ACTION##stack, {.i = 2 } }, \ */ - /* { MOD, XK_x, ACTION##stack, {.i = -1 } }, */ - -/* 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 const char *termcmd[] = {TERMINAL, - "-o", - "background_opacity=0.8", - "-o", - "confirm_os_window_close=0", - "-o", - "tab_bar_min_tabs=9001", - NULL}; - -/* - * Xresources preferences to load at startup - */ -ResourcePref resources[] = { - {"color0", STRING, &normbordercolor}, - {"color8", STRING, &selbordercolor}, - {"color8", STRING, &normbgcolor}, - {"color12", STRING, &normfgcolor}, - {"color0", STRING, &selfgcolor}, - {"color4", STRING, &selbgcolor}, - {"borderpx", INTEGER, &borderpx}, - {"snap", INTEGER, &snap}, - {"showbar", INTEGER, &showbar}, - {"topbar", INTEGER, &topbar}, - {"nmaster", INTEGER, &nmaster}, - {"resizehints", INTEGER, &resizehints}, - {"mfact", FLOAT, &mfact}, - {"gappih", INTEGER, &gappih}, - {"gappiv", INTEGER, &gappiv}, - {"gappoh", INTEGER, &gappoh}, - {"gappov", INTEGER, &gappov}, - {"swallowfloating", INTEGER, &swallowfloating}, - {"smartgaps", INTEGER, &smartgaps}, -}; - -#include "shiftview.c" -#include - -static Key keys[] = { - /* modifier key function argument */ - STACKKEYS(MODKEY, focus) STACKKEYS(MODKEY | ShiftMask, push) - /* { MODKEY|ShiftMask, XK_Escape, spawn, SHCMD("") }, */ - {MODKEY, - XK_dead_circumflex, - spawn, - {.v = (const char *[]){"dmenuunicode", NULL}}}, - /* { MODKEY|ShiftMask, XK_grave, togglescratch, - * SHCMD("") - * }, - */ - 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, XK_0, view, {.ui = ~0}}, - {MODKEY | ShiftMask, XK_0, tag, {.ui = ~0}}, - {MODKEY, XK_ssharp, spawn, - SHCMD("pamixer --allow-boost -d 5; kill -44 $(pidof dwmblocks)")}, - {MODKEY | ShiftMask, XK_ssharp, spawn, - SHCMD("pamixer --allow-boost -d 15; kill -44 $(pidof dwmblocks)")}, - {MODKEY, XK_dead_acute, spawn, - SHCMD("pamixer --allow-boost -i 5; kill -44 $(pidof dwmblocks)")}, - {MODKEY | ShiftMask, XK_dead_acute, spawn, - SHCMD("pamixer --allow-boost -i 15; kill -44 $(pidof dwmblocks)")}, - {MODKEY, XK_BackSpace, spawn, {.v = (const char *[]){"sysact", NULL}}}, - {MODKEY | ShiftMask, - XK_BackSpace, - spawn, - {.v = (const char *[]){"sysact", NULL}}}, - - {MODKEY, XK_Tab, view, {0}}, - /* { MODKEY|ShiftMask, XK_Tab, spawn, - * SHCMD("") - * }, - */ - {MODKEY, XK_q, killclient, {0}}, - {MODKEY | ShiftMask, XK_q, spawn, {.v = (const char *[]){"sysact", NULL}}}, - {MODKEY, XK_w, spawn, {.v = (const char *[]){BROWSER, NULL}}}, - {MODKEY | ShiftMask, - XK_w, - spawn, - {.v = (const char *[]){TERMINAL, "-e", "sudo", "nmtui", NULL}}}, - {MODKEY, XK_e, spawn, - SHCMD( - TERMINAL - " -e neomutt ; pkill -RTMIN+12 dwmblocks; rmdir ~/.abook")}, // REPLACE - {MODKEY | ShiftMask, XK_e, spawn, - SHCMD(TERMINAL " -e abook -C ~/.config/abook/abookrc --datafile " - "~/.config/abook/addressbook")}, // REPLACE - {MODKEY, XK_r, spawn, {.v = (const char *[]){TERMINAL, "-e", "lf", NULL}}}, - {MODKEY | ShiftMask, - XK_r, - spawn, - {.v = (const char *[]){TERMINAL, "-e", "htop", NULL}}}, - {MODKEY, XK_t, setlayout, {.v = &layouts[0]}}, /* tile */ - {MODKEY | ShiftMask, XK_t, setlayout, {.v = &layouts[1]}}, /* bstack */ - {MODKEY, XK_z, setlayout, {.v = &layouts[2]}}, /* spiral */ - {MODKEY | ShiftMask, XK_z, setlayout, {.v = &layouts[3]}}, /* dwindle */ - {MODKEY, XK_u, setlayout, {.v = &layouts[4]}}, /* deck */ - {MODKEY | ShiftMask, XK_u, setlayout, {.v = &layouts[5]}}, /* monocle */ - {MODKEY, XK_i, setlayout, {.v = &layouts[6]}}, /* centeredmaster */ - {MODKEY | ShiftMask, - XK_i, - setlayout, - {.v = &layouts[7]}}, /* centeredfloatingmaster */ - {MODKEY, XK_o, incnmaster, {.i = +1}}, - {MODKEY | ShiftMask, XK_o, incnmaster, {.i = -1}}, - {MODKEY, XK_p, spawn, {.v = (const char *[]){"mpc", "toggle", NULL}}}, - {MODKEY | ShiftMask, XK_p, spawn, SHCMD("mpc pause ; pauseallmpv")}, - {MODKEY, - XK_udiaeresis, - spawn, - {.v = (const char *[]){"mpc", "seek", "-10", NULL}}}, - {MODKEY | ShiftMask, - XK_udiaeresis, - spawn, - {.v = (const char *[]){"mpc", "seek", "-60", NULL}}}, - {MODKEY, - XK_plus, - spawn, - {.v = (const char *[]){"mpc", "seek", "+10", NULL}}}, - {MODKEY | ShiftMask, - XK_plus, - spawn, - {.v = (const char *[]){"mpc", "seek", "+60", NULL}}}, - {MODKEY, - XK_numbersign, - spawn, - {.v = (const char *[]){TERMINAL, "-e", "bc", "-l", NULL}}}, - /* { MODKEY|ShiftMask, XK_backslash, spawn, SHCMD("") - * }, - */ - - {MODKEY, XK_a, togglegaps, {0}}, - {MODKEY | ShiftMask, XK_a, defaultgaps, {0}}, - {MODKEY, XK_s, togglesticky, {0}}, - /* { MODKEY|ShiftMask, XK_s, spawn, - * SHCMD("") - * }, - */ - {MODKEY, XK_d, spawn, {.v = (const char *[]){"dmenu_run", NULL}}}, - {MODKEY | ShiftMask, - XK_d, - spawn, - {.v = (const char *[]){"passmenu", NULL}}}, - {MODKEY, XK_f, togglefullscr, {0}}, - {MODKEY | ShiftMask, XK_f, setlayout, {.v = &layouts[8]}}, - {MODKEY, XK_g, shiftview, {.i = -1}}, - {MODKEY | ShiftMask, XK_g, shifttag, {.i = -1}}, - {MODKEY, XK_h, setmfact, {.f = -0.05}}, - /* J and K are automatically bound above in STACKEYS */ - {MODKEY, XK_l, setmfact, {.f = +0.05}}, - {MODKEY, XK_odiaeresis, shiftview, {.i = 1}}, - {MODKEY | ShiftMask, XK_odiaeresis, shifttag, {.i = 1}}, - {MODKEY, XK_adiaeresis, togglescratch, {.ui = 1}}, - /* { MODKEY|ShiftMask, XK_adiaeresis, spawn, SHCMD("") - * }, - */ - {MODKEY | ShiftMask, XK_adiaeresis, togglesmartgaps, {0}}, - {MODKEY, XK_Return, spawn, {.v = termcmd}}, - {MODKEY | ShiftMask, XK_Return, togglescratch, {.ui = 0}}, - - {MODKEY, XK_y, incrgaps, {.i = +3}}, - /* { MODKEY|ShiftMask, XK_y, spawn, - * SHCMD("") - * }, - */ - {MODKEY, XK_x, incrgaps, {.i = -3}}, - /* { MODKEY|ShiftMask, XK_x, spawn, - * SHCMD("") - * }, - */ - /* { MODKEY, XK_c, spawn, - * SHCMD("") - * }, - */ - /* { MODKEY|ShiftMask, XK_c, spawn, - * SHCMD("") - * }, - */ - /* V is automatically bound above in STACKKEYS */ - {MODKEY, XK_b, togglebar, {0}}, - /* { MODKEY|ShiftMask, XK_b, spawn, - * SHCMD("") - * }, - */ - {MODKEY, - XK_n, - spawn, - {.v = (const char *[]){TERMINAL, "-e", "nvim", "-c", "VimwikiIndex", - NULL}}}, - {MODKEY | ShiftMask, XK_n, spawn, - SHCMD(TERMINAL " -e newsboat; pkill -RTMIN+6 dwmblocks")}, // TODO: replace - {MODKEY, - XK_m, - spawn, - {.v = (const char *[]){TERMINAL, "-e", "ncmpcpp", NULL}}}, - {MODKEY | ShiftMask, XK_m, spawn, - SHCMD("pamixer -t; kill -44 $(pidof dwmblocks)")}, - {MODKEY, XK_comma, spawn, {.v = (const char *[]){"mpc", "prev", NULL}}}, - {MODKEY | ShiftMask, - XK_comma, - spawn, - {.v = (const char *[]){"mpc", "seek", "0%", NULL}}}, - {MODKEY, XK_period, spawn, {.v = (const char *[]){"mpc", "next", NULL}}}, - {MODKEY | ShiftMask, - XK_period, - spawn, - {.v = (const char *[]){"mpc", "repeat", NULL}}}, - - {MODKEY, XK_Left, focusmon, {.i = -1}}, - {MODKEY | ShiftMask, XK_Left, tagmon, {.i = -1}}, - {MODKEY, XK_Right, focusmon, {.i = +1}}, - {MODKEY | ShiftMask, XK_Right, tagmon, {.i = +1}}, - - {MODKEY, XK_Page_Up, shiftview, {.i = -1}}, - {MODKEY | ShiftMask, XK_Page_Up, shifttag, {.i = -1}}, - {MODKEY, XK_Page_Down, shiftview, {.i = +1}}, - {MODKEY | ShiftMask, XK_Page_Down, shifttag, {.i = +1}}, - {MODKEY, XK_Insert, spawn, - SHCMD("xdotool type $(grep -v '^#' ~/.local/share/snippets | dmenu -i -l " - "50 | cut -d' ' -f1)")}, - - {MODKEY, XK_F1, spawn, - SHCMD("groff -mom /usr/local/share/dwm/keybinds.mom -Tpdf | zathura -")}, - {MODKEY, XK_F2, spawn, SHCMD("$TERMINAL -e deluge-gtk")}, - {MODKEY, XK_F3, spawn, SHCMD("librewolf")}, // TODO: replace - {MODKEY, XK_F4, spawn, - SHCMD(TERMINAL " -e pulsemixer; kill -44 $(pidof dwmblocks)")}, - {MODKEY, XK_F5, spawn, SHCMD("")}, - {MODKEY, XK_F6, spawn, SHCMD("")}, - {MODKEY, XK_F7, spawn, SHCMD("")}, - {MODKEY, XK_F8, spawn, SHCMD("")}, - {MODKEY, XK_F9, spawn, SHCMD("")}, - {MODKEY, XK_F10, spawn, {.v = (const char *[]){"dmenumount", NULL}}}, - {MODKEY, XK_F11, spawn, {.v = (const char *[]){"dmenuumount", NULL}}}, - {MODKEY, XK_F12, spawn, - SHCMD("remaps & notify-send \"⌨️ Keyboard remapping...\" \"Re-running " - "keyboard defaults for any newly plugged-in keyboards.\"")}, - {MODKEY, XK_space, zoom, {0}}, - {MODKEY | ShiftMask, XK_space, togglefloating, {0}}, - - {0, XK_Print, spawn, SHCMD("maim pic-full-$(date '+%y%m%d-%H%M-%S').png")}, - {ShiftMask, XK_Print, spawn, {.v = (const char *[]){"maimpick", NULL}}}, - {MODKEY, XK_Print, spawn, {.v = (const char *[]){"dmenurecord", NULL}}}, - {MODKEY | ShiftMask, - XK_Print, - spawn, - {.v = (const char *[]){"dmenurecord", "kill", NULL}}}, - {MODKEY, - XK_Delete, - spawn, - {.v = (const char *[]){"dmenurecord", "kill", NULL}}}, - {MODKEY, XK_Scroll_Lock, spawn, SHCMD("killall screenkey || screenkey &")}, - - {0, XF86XK_AudioMute, spawn, - SHCMD("pamixer -t; kill -44 $(pidof dwmblocks)")}, - {0, XF86XK_AudioRaiseVolume, spawn, - SHCMD("pamixer --allow-boost -i 3; kill -44 $(pidof dwmblocks)")}, - {0, XF86XK_AudioLowerVolume, spawn, - SHCMD("pamixer --allow-boost -d 3; kill -44 $(pidof dwmblocks)")}, - {0, XF86XK_AudioPrev, spawn, {.v = (const char *[]){"mpc", "prev", NULL}}}, - {0, XF86XK_AudioNext, spawn, {.v = (const char *[]){"mpc", "next", NULL}}}, - {0, - XF86XK_AudioPause, - spawn, - {.v = (const char *[]){"mpc", "pause", NULL}}}, - {0, XF86XK_AudioPlay, spawn, {.v = (const char *[]){"mpc", "play", NULL}}}, - {0, XF86XK_AudioStop, spawn, {.v = (const char *[]){"mpc", "stop", NULL}}}, - {0, - XF86XK_AudioRewind, - spawn, - {.v = (const char *[]){"mpc", "seek", "-10", NULL}}}, - {0, - XF86XK_AudioForward, - spawn, - {.v = (const char *[]){"mpc", "seek", "+10", NULL}}}, - {0, - XF86XK_AudioMedia, - spawn, - {.v = (const char *[]){TERMINAL, "-e", "ncmpcpp", NULL}}}, - {0, XF86XK_AudioMicMute, spawn, - SHCMD("pactl set-source-mute @DEFAULT_SOURCE@ toggle")}, - {0, XF86XK_PowerOff, spawn, {.v = (const char *[]){"sysact", NULL}}}, - {0, - XF86XK_Calculator, - spawn, - {.v = (const char *[]){TERMINAL, "-e", "bc", "-l", NULL}}}, - {0, - XF86XK_Sleep, - spawn, - {.v = (const char *[]){"sudo", "-A", "zzz", NULL}}}, - {0, XF86XK_WWW, spawn, {.v = (const char *[]){BROWSER, NULL}}}, - {0, XF86XK_DOS, spawn, {.v = termcmd}}, - {0, XF86XK_ScreenSaver, spawn, - SHCMD("slock & xset dpms force off; mpc pause; pauseallmpv")}, - {0, - XF86XK_TaskPane, - spawn, - {.v = (const char *[]){TERMINAL, "-e", "htop", NULL}}}, - {0, XF86XK_Mail, spawn, - SHCMD(TERMINAL " -e neomutt ; pkill -RTMIN+12 dwmblocks")}, - {0, - XF86XK_MyComputer, - spawn, - {.v = (const char *[]){TERMINAL, "-e", "lfub", "/", NULL}}}, - /* { 0, XF86XK_Battery, spawn, - * SHCMD("") - * }, - */ - {0, - XF86XK_Launch1, - spawn, - {.v = (const char *[]){"xset", "dpms", "force", "off", NULL}}}, - {0, XF86XK_TouchpadToggle, spawn, - SHCMD("(synclient | grep 'TouchpadOff.*1' && synclient TouchpadOff=0) || " - "synclient TouchpadOff=1")}, - {0, - XF86XK_TouchpadOff, - spawn, - {.v = (const char *[]){"synclient", "TouchpadOff=1", NULL}}}, - {0, - XF86XK_TouchpadOn, - spawn, - {.v = (const char *[]){"synclient", "TouchpadOff=0", NULL}}}, - {0, - XF86XK_MonBrightnessUp, - spawn, - {.v = (const char *[]){"xbacklight", "-inc", "15", NULL}}}, - {0, - XF86XK_MonBrightnessDown, - spawn, - {.v = (const char *[]){"xbacklight", "-dec", "15", NULL}}}, - - /* { MODKEY|Mod4Mask, XK_h, incrgaps, {.i = +1 } }, - */ - /* { MODKEY|Mod4Mask, XK_l, incrgaps, {.i = -1 } }, - */ - /* { MODKEY|Mod4Mask|ShiftMask, XK_h, incrogaps, {.i = +1 } }, - */ - /* { MODKEY|Mod4Mask|ShiftMask, XK_l, incrogaps, {.i = -1 } }, - */ - /* { MODKEY|Mod4Mask|ControlMask, XK_h, incrigaps, {.i = +1 } }, - */ - /* { MODKEY|Mod4Mask|ControlMask, XK_l, incrigaps, {.i = -1 } }, - */ - /* { MODKEY|Mod4Mask|ShiftMask, XK_0, defaultgaps, {0} }, */ - /* { MODKEY, XK_y, incrihgaps, {.i = +1 } }, - */ - /* { MODKEY, XK_o, incrihgaps, {.i = -1 } }, - */ - /* { MODKEY|ControlMask, XK_y, incrivgaps, {.i = +1 } }, - */ - /* { MODKEY|ControlMask, XK_o, incrivgaps, {.i = -1 } }, - */ - /* { MODKEY|Mod4Mask, XK_y, incrohgaps, {.i = +1 } }, - */ - /* { MODKEY|Mod4Mask, XK_o, incrohgaps, {.i = -1 } }, - */ - /* { MODKEY|ShiftMask, XK_y, incrovgaps, {.i = +1 } }, - */ - /* { MODKEY|ShiftMask, XK_o, incrovgaps, {.i = -1 } }, - */ - -}; - -/* button definitions */ -/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, - * ClkClientWin, or ClkRootWin */ -static Button buttons[] = { -/* click event mask button function argument - */ -#ifndef __OpenBSD__ - {ClkWinTitle, 0, Button2, zoom, {0}}, - {ClkStatusText, 0, Button1, sigdwmblocks, {.i = 1}}, - {ClkStatusText, 0, Button2, sigdwmblocks, {.i = 2}}, - {ClkStatusText, 0, Button3, sigdwmblocks, {.i = 3}}, - {ClkStatusText, 0, Button4, sigdwmblocks, {.i = 4}}, - {ClkStatusText, 0, Button5, sigdwmblocks, {.i = 5}}, - {ClkStatusText, ShiftMask, Button1, sigdwmblocks, {.i = 6}}, -#endif - {ClkStatusText, ShiftMask, Button3, spawn, - SHCMD(TERMINAL " -e nvim ~/.local/src/dwmblocks/config.h")}, - {ClkClientWin, MODKEY, Button1, movemouse, {0}}, - {ClkClientWin, MODKEY, Button2, defaultgaps, {0}}, - {ClkClientWin, MODKEY, Button3, resizemouse, {0}}, - {ClkClientWin, MODKEY, Button4, incrgaps, {.i = +1}}, - {ClkClientWin, MODKEY, Button5, incrgaps, {.i = -1}}, - {ClkTagBar, 0, Button1, view, {0}}, - {ClkTagBar, 0, Button3, toggleview, {0}}, - {ClkTagBar, MODKEY, Button1, tag, {0}}, - {ClkTagBar, MODKEY, Button3, toggletag, {0}}, - {ClkTagBar, 0, Button4, shiftview, {.i = -1}}, - {ClkTagBar, 0, Button5, shiftview, {.i = 1}}, - {ClkRootWin, 0, Button2, togglebar, {0}}, -}; diff --git a/.local/src2/dwm/config.mk b/.local/src2/dwm/config.mk deleted file mode 100644 index b77641d6a..000000000 --- a/.local/src2/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} -lX11-xcb -lxcb -lxcb-res - -# flags -CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} -#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS} -CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS} -LDFLAGS = ${LIBS} - -# Solaris -#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\" -#LDFLAGS = ${LIBS} - -# compiler and linker -CC = cc diff --git a/.local/src2/dwm/drw.c b/.local/src2/dwm/drw.c deleted file mode 100644 index 56175a830..000000000 --- a/.local/src2/dwm/drw.c +++ /dev/null @@ -1,424 +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."); - } - - 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, 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); - - dest->pixel |= 0xff << 24; -} - -/* Wrapper to create color schemes. The caller has to call free(3) on the - * returned color scheme when done using it. */ -Clr * -drw_scm_create(Drw *drw, char *clrnames[], 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/.local/src2/dwm/drw.h b/.local/src2/dwm/drw.h deleted file mode 100644 index 09617cf95..000000000 --- a/.local/src2/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, 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, 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/.local/src2/dwm/drw.o b/.local/src2/dwm/drw.o deleted file mode 100644 index 209fff1a3bce530b02c6e80365b467ec0741d5c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10312 zcmb_he{fXCeSgv&Z~}5C+tfa65}(OYM2$5%2W)|zL{EAr_Uscm5HbR6ljC$kDnh5Z zdj}$M!1yGR&9mH2>vY=AbjDNr54Xuo`J+wk#32GAEzi2?Os8MXdvEu%-~H})zu)hEclWd_o@}kIsxlN+8DBFdYYH`t??oreO`_Oj zgp8oUuf|R!N2U>y9Qgu$%miJrnx4; zKm9rB*}*aw_BElf`4*mz46u*}_+ar9fpABEOYcR!t=*FCH2Uw=1*5be8?_-`}w*Q?O%=cYtw4A0! zmkC;s?6EP|JliAJ_jd|)l24k)Tnp25m}@%PS?L_vGBk86bj8r2p&O{cKS}U6k|Rq_ znm-eBIN!GHT!#ODpgTp!=nj)xOgjbz6xf8jVz^4Y*dUt z{wzWKE%v!S#r7#X&;UvPndp4B7hy0Wq>B2!ItUXk71h`Y##6O;!j69djTxFX$-%fK zl{B5Te$#ggPX(Bhgt|^U1{g#?7G@luo(SVFC(17;N*4m-Gs@*M<69cfR>#h>(m`;X z@wo728IKX61EcWkxK=L1y_Y)}e>3#-C~Vapdiubs!13aP6tt~L=Ns_o3XJs;_L2Vf;kEF-bj%g5p) zE6Zr2H3Cj^{iKrw18jBOx?3Wh7Fe~~TxIejX3FHpne!ml?1wa6*$e7uZaf(cW4*)7%W2&%rG@-UA!a+~^z|fvIXPlQXA6mK!|&QPp`TmP zIVSf<+3ouS48B-Lbu}Ma zi0;M0c~Hz1!uU|M6ATs~t$C&9_zTe02o1eND$`;=MKVf{MFWtuwjnfhi0Z>9LPI|j z4Z9k_{I4j+MoTY6pGU#qe?WSwqX0u@GWlz9ehhKzXU?2zF*&4#x`eYW66aSF&dz|D z;^Xl}7csFVDGP5mPf<%E(^^Z6S{`E#L&&Gxkf(XnHIG<#87MTE>&*3st!R{z(Aj0K z%AujTLS4+Gc2eDGD8^&I#@~6f^jg{C4@aX6uP{O)(&qFxqUD5$Xsl(3hI{Y|?Q3ir zf}ooy>5bUvu_oGZrt>P+J<{_B# z9$UypN=6+t`D%HFVZ3myjNwA9r_Rp#DHUH7CPDK0m8iBk-HjAr&6sinmR1-EyV%02 zlF{0#V`m%MoGw@a?F|XXj=}*u142P{$^UiqSmuGy{DvFyzKR860F5%nO zu*zIT<1^>6Xq`3U50IwGkz}+-==SJFNNB3Eq7ie^Vd3D%X;Ey4)ng~fkT(jjjsKo( z5E%bQWPQ<*zYPz-xQ7$`pa2q1Ya=TShK*uS=5e_jiUwye?An6=r`#*C|Dd-3#gSqH zz9=vRvAd@trz?P8h`EC+%yhO%AHUBqB})$RUK>9*=`zJk_HID-D$W$+jei-t9tDW# zMA~2%3NuG+Vy*Y8eFK#6G{ZW(bC72Oz zbA=K30p>JCXq=Ced{boHh6XrEotb<&BPt&(KB;?}iO~COOQt8L|^O+zMG&;H-#M zbwzAd&eJ0GA)(H>E}`x|NU2lX3$U#raW7&e^>h+ z7G=&ovRxfov-x~3zc`Xf_xI=QNMA1973t3P+mY^kZfm4Jy*0Z$vT#9R;Y{Ot#({Lc zkaanUDPrd$18LjN=KB?Yf6i?#3}iFC-M!hadXI>7UtcbhwzH8;t}mAtqZoD%g!bkO z7@w5r?T-+WNoVlhS_Hf)D|F04OHwc`$FTFg{hRBJOb@AL8-+}|FTJTRYY5SvaXoXC zYS+(%O)F5jOa~dm*d^O3HxiYR6Wy=d?$-YI_v4C%{3wVLt6_{j{?4TOr$Ughmpqsa?6}1K31#nmg%2j@ zOFmdPQ_R=8-U;zptAT^l`80zzI9fo4nG@y(XVH-x%hGXmE!G;aN+7@9dgZyht z-a+aB8%Y0xyX3c^R8KHsDlhke#K3oxerl$JY;PW*P1ozhL#J3rM zud`Z|_SQU%uSv*T@bl*<0`cVAIXE&9#ptyrSPM@g_8t^5MRQ#u+f8a0`a|74KB4~( zr8t@>X1*zTZzo=1mv+|>RG)&#eSYHunKiCw@J+1ZNu1IQ*7yXV*6Phbs*LGIk8B~+ z5q${{;af$`%@b7oQ#>R`^%v_K7}A^Qi{A~}uS>o?{aMFX;qL;n{ zU@Cki;$bTM`{2J37InvwITY9rD#-bV3iuBz;Qv+ue+4*=J41$$$hp8?ufYFX$^WS2 zUx+%<89Yk@F1KP>r09tP$^eJXys@l1u&??6-G^DE%>74W-(lRigfPEmVYi^NY$ zT;y@+xw?X!F3JC(T;C#}gTEm00}@yH`U#1@>cMHRC4EjxT;y%Y`8(iK&6oCpsqlZV zfFF|bcljX{q}KN@D)67GfWIx}yeQ>}+zojbEAUstj#KG*6L6YuOr`>n(;;VG1^z#) zfHzjaAEiMrVttr+NpsrUz7QMT^ndp0$&`{aMq- zN!GHD7zATbm&TNQ(-W^E}$XardW+>h%*1Rr zZqC}-LAyW}UxPw?(9U889q_ubabv+wXSQt2^laJKo$l=uors&5X&BcDRBOQ+7;SrRm)#>Qk||Dl z*qxyW-D19w%TF*&hFXi;V9+^`24I`1l6ovR3+tKlD`OhovtcohGg*hh#6r#)HWDGk@^EG^_hUxS&yfp~>_F@Bemq2XcyJ}>uO&`$?!}|<*ERfZ4WAJ}1w{Nh{;Y;K zqD{&9jfOAN@bel@XG6tbmN@B8IYi;pX)+)hH;PB$H);5N8vaFzlbn!-*J=D@8zpCn z#!u%Ch2O97(?44k9@qG9(D1ej{OdIQYZ`xA!|AT7es&%AN9Lc=XhPEo`4b@4A6zEtBssp0y# z7c_i@#vi0)2O@nEc$A$t5eOpuPw*&wx0Y{pd?hi0=%cU4oQBt$`Gp=uWD_EVtNT>Sg(vXMvi`RoT-~!@@!;w{{jLXB_vQv^2Q@C;ABd73 zT-{%753cU1Kl0$}o;vEm)jjnM53cU1NjbjKN8K+6J-E6rKJUTR{Vy!@ypp5tC5;|j z-AlSWxVnEB^@SZGbX~Lkq`qHMQ2F?Wg8rZA)ugQ?)jN#f9)AVAUn~BmSsHtM)D{8bKjoG0*$Voe4Li`+T40 z`SW?1mfU;ZbLPyMGc#vq&diPL3X7)=vRW%`qI7yvzEnS%Wk!m4TAT(= z`E2wWG-&ymcejCyr#T-huZQQ8o}SALTs+PB$TrUN4b7cn2R^r4VdQJQip%AClDQ~f z!)SxQVf?_SpW9PBg*{0}`j^k`DL*|(qaP3ZZL!Gt>Ulo->Erz3NoCMa$tR&@|6j`U z^L)Yo8gk_41YUr6it^?lAKB&q=?^!jWiBr-RXg;sPGPZ#r(tc2<;v=+rPoZjvU=J0 z>Z(=Y`tkMo*Nner!WDHjR~QXOdb#kAvQM8i-!iDd5+h9Hw_2=>9tw^Iwb4}HC6&SKYJZ{70Vs!hlDl?8~0>Opykhkgj7f8vL_LlpmrhuOy{fb|l> z-A6Prgg|}w=W`F}}|Z_7vrwN`a3?yJUS&``(^HpLr?D zeLMyK81%RA)AP|3`rMcTe>a7k))e^a6m~l^g`S}l?LILDe|8EzUrB+lN`c>=qF*Ib z;5{kE(T6G8WmgJ2G^UUPb6T?SPyU&a!VaIOu>Zp;?D|IrlfJ~@TmE=hr3mO{QY1^9xhkQC)U zoua;fOu_$cigIZk{eAuO*%bO;pF+-0Qk1(lML+p-3i+R=&?hrRxzD61_unb{&%aaH z?PQAnIWtAM=ckZ!K?;2?O<{*=DfEn{;Ll58pY{~xmZi{>wqM`Z?$4#rCnJUYk`(xy z6#BRq|j$riuzuYLjD^m^uIBM{F_qfbAO6b7Etu>|I?x~;ZsX-P%x>WW%R zz*k$gW^P4!sBG13kQ$g?5t>&~AM)4M1S@JocUl6ogB7cMRdvDYG7u#dp~BkQnp&l7 z)v{{JJ+-!?EL1VAW>sivxVEkaNYN^2y2=}>S!oEXEn8JrRk12G4Y{gT^%p-S917K} zvIG{E)du}FNFZq|mzv9-S3{Jcvr&$}s(xizkknYUtZ+4iGL2xAx(Z*-npHDvmQf8* zxf?4CWs6n?!zj5tTxSW?u0-7oJNU{%WlPKIz&y1Q^{!Z0wQ5<-8gB?jS{e>jfEldc z1-;ePHEUS81_#QkT3%IAJF_epgmo><(gI|P`YP%|wKaDdqAUS0ir4-EPFuPp91Paf zhU$uI%FC!Jj5<%BYE-Gey(+3JLKUZTQFZ$b=&M*>wW>li1(h+Aj1F~;M(<~&K7kUL z9w}orDp)7&9WmR?k1j!ODGk+E8ZK|V5prHY4nc9^_ ztExg(Wz|)8L5rDXb+_}@BvAvjpH)-4vaFidVQ$6p+KReLh*(-vR=cdo+b zCU~b8J>L?T6RxPea~?Bh$(^gpNlrBe6YF=VS&T)SES+%107ll!So@HC*1b=67N%~0 zC%6$tnp#bRQ)nX8q;{Z=M->nlEL>Z*vaG1iTOO)fjdtSzlUY)Z9INUq)5_5W%fi*6 zlJL^HP*n({37Eeu#GJyiWm9Tus!s#HaIm_n91a8!RIP<|j7|@FR@ur5e_1UCDbiT~ z8z7Ri^8t1`zjxU(N&>(OJJo=*^YM59}n5v~~0DR*H# zTqzo7Ihqr`kH!%ZQ){YgYROG7^@T8@0_P@=%5@O}2%-uLdS+Ruyb>HN z=ox{jQ(%l$=wemyp7rHRmtaIJxr2J)l5*CRORARD0Ss2(nKHRQp+Cox)n(P;iY2Qs zOj0H?mj2Z56iLNap_R)*m<8%8La+gOvE{c_z)nk+RMpj#yWLBc*Oiy8S`Hea&vHI_ ztt_irWr3dz)r6}p%i*xgi7H}# zwt>7nitJv)-uciWAdi6M=tSkLllMdDEJh^Q$U7cw-Jd4Ck4GP%G#7~~r?+b?(~FCy zOkHx-6<1H_e?9$nZ9jI^6%%R2fk^Uz{|%y8GX6)u)A+l=L5Ptia(ovN90s3|B~T$} zpcEmExCTo6E@kkh_iJdDETo<;^|WMq6X~Ly)0mByZ05(po>?c|aupV3BHsVpPana` z&t{p-v5cy!5fm|>&gpX*oo1QC>G1hg2+Z_2;9%{ED1mR z8-qVb!XJFsz+Do44(HF8@L6vg{2mEEpYtmcUj07?zhA;HPg!wVj3?ocROWOW>{)xL?9WKM6>S|ILVi%fh5Tj-@7G_#h5WdL3;8_~F62842I?>5 zxFlSR-+T%0o@eCuOSs?CaKYat;VqoMN5TbvuY@;ne&-DX?OeUhn5Qx&Jd5u)ToNw$ z^CjHH`TY_u_yZE|;ru}f7yR`S?&ti?5-#{ROL!^gZ!QUm}4V=G6 z!Ucb?gg0}3r)Qx3Z{+rOrNI3XF4{LB;ibHNgAy+I>m}U7`I{wN@NbszEY9C5;ex+S z!Y!OXF5!Z|OTxS78g}WCaKYaz;W5td^bWMA;Lnus2F~x2@TwP${_mG?v91nE_!!<^ z%@Quk-7Mjyyxdj^7yNA!?&th*2@muAQICZ8_csY|5&dn-K>PHsw^7AFUh4cF*T<`}Z zyn*uvC0y{=OL!^gZ+cmwATO1R*!m+(@~-z?#Rf3t*pIDe~z3;s3<&*J=X2^aib5^mxA zJrXYXdnLSQHn;!u6!w?!ZqDzLa3Mcm!egA@FX19S7L@S!#JncqLjGn6Z{hM=C0y{g zNq95ok4w1V?~?Ea&fg>9g1=Y7OF6$&NnuY3_i%ofgbVrk5}w8R{Sq$t0}^iG{6Ps9 z{PhyvJm}U6ZOVF8J#uJjUr}2^ajECA@{x;wj=bQ+Ql`i^M;Z=-DITqrW!x@4|n`?PBMCMc_gor-Wa^Lt8}<6_bxSVbY7jkq7 z7jk+ee8e$6e))P?*k8!8OSq8Zl<-0>N37FjIXM!)kmHi@m0XV49|$==;kY94KgRJ= z2^aj85-#`~BwX-|eUd2maW20_;urSWBH^N5trEV4%ZW+2kkcXILQY)5U*~eVCH%(Y zMmzRM_(G10{jsQ*DA&&S%>ozYIwgD@ePD_ou`d_=LQamvFXXr+T*&cAxR9erxRB$Q za3QBu!iAhl2^VsL5-#L4NVt%*QNo3sW(gN^S|nV^*&^XWPOF43!i5~Cgg?dQh`5?8Cr9EJa$FLAh|3Z2NFhh~ zTSemc^cwxPRKf*+rGyKA-XP(Ef1`wpd97K(r}J`KBwWbZBH{h>f`p6q>X2|@pSXkz zKinV z!bQ0r3BQ~3i}M^&?naK6O8h_Nc!PusJvU0Y(6d>>#rklwgx839U&2Ly=#X&Hui_H^ zORi_PgbO*kgbO)665hXlv;ex+Z!nbh#N(nFK^6MphGv{xRaG`&*gg0~k%@RJ3%ikj54V=GK!WVP?n1uh6 z^LI%2GS1&6;T@d6Tf(b2e~*Me$N76D{0`1e}jaJd1|ACi}|iu!o@thS;EEq)gs|yp4uYeV*YKF@MGL= z@hgpX#7B{qk$eeAk1i8_xe4z!;S)``Zo(&-@E#K$G2t<;5B{tM`}>3GX#L~ zW~5}9@IitZ&m0quKMm6V<1*p+6CnLR`6iso7C#;nPPPy~iU}v3#E;*Ei?Kmz0TYf7 zNBe(DP57{W)MBYL;b)lepa~yt!s|^qK3whpX)xhu_M;ZdMicHZ;msyod>c#2n@#vx zCjJ%^ZvHz%TTJ+mO#H1TJi~;ynecN=c+7;KYr;EBc%})DoAC2Yc$W!3--LIY@C!`1 zZoFl_q?=0Pzf(aQ>%o zS!%rrztY6tV8UG{e4`1^GvUo9{3;W^*@Rzh!dp!E1QWi+gkNLATTS@2CcMpr=bP}D z33r?D4ikQz36Gob$tJwZgcq3bZWDgJ3D-^d4JN$DgnLYQuL<{>aLZMv`~MUZZa3jm zO}Nv9`%HMI2`@C^Stfj%3C}U%(@nU`gexXI--H*LaE}R}VZs#?exnKZoA6>29x&lE zO?asZpJl=;P55jR9yH;86JBq^=a}#Y6F%33Z#3a0CcN2%&okkhP568h-eSTRnD8wo ze4z<%HQ@mh-e$sYGT|{3zQ}}knDE6WJZ{2oHsM_+{1y}5ZNhIg;kpT5V#0e&c&Q2R zHQ{9@+;a8l{=d|O+f8`633r+f2C2gjbsId=p+}!aXK@ zg$Y+o`0Xa#Z^Elhc)*0OG~uNte3c2WG~qQSJZQp$CcNH+-(kWVOn9vc-)O??On9>i z51H`ICOmAyTTJ+B6TZcSuQB1RCcNH+x0&!eO?b?N-(|u(O!(a^YJl}+GGT|N*u9mn;^gDHa;k7gr*??Cq?YeG@+d+;{26`0cpJ zgEyjC#3|9;ho4K|A)10?i8!M>i5^6BjM4jvP9wUN(L0GwC%T2vTZy(2-OT7`h#pLI z1Ec>)G=&`!K}J78w4LZuMn6XMP@?^eeu(H{M0*&$iD)`{OSl+)AJM~!&SLakMAK1Q z!pZ1bqUne&VPW(NqUmTY(eo{UOP3N&M{0>~MlT|oj?xlwM$aXhj?fY@M$aIcj?NOT zjGjU?9hoIs7=0blbTpf2X7p7=)6rR?fze}$rX#aNkkOYAO-E&kQbwOoG#!y8{ER-E zXgV58co;p5XgU&0xEMW%XgUf@WHI{WcF?1Vb~5@1(H9bJVe}!QFCx0<6xIJDqO*wZ zX7oEmUrcnI(VawJLUfGL`-vVybStBG5}i$S3!}FZeJRn+jDCjb9~0fc=syyD8PP#T zKS6X3(WQ)jjObjV{fvHy=&?k57`=(;%ZYX|`aYt^5uL^8yNITvsf3f!wM5gARKmjO z6-3ifRHEm8L5u!053=(-Bi5$mmOmrlX}qDWlIPnvRqbeny{7G#w=+Jd7Sj^dzEP zj2=WZ9VsQU7=7{|pbLn0GWrP7*As1F^dX{eAiC!p*8W6$i0)?eJ4Abljx)NG=qW_U z7`>n9sYJIjdMD97qFWffmFPmEn;HEK(bI@-VDuk}o=$X-(N7Sq5M9dX$A~T>+Rx~R zh@L^ThtZpezL97bqwgcSnCL7<-$gVXdIW zMlT|oj%pHdM$aXhj%X4wM$aIcj%E_AjGjU?9mynG7=0blbQF_lX7p7=(-BOffze}$ zrlXfckkOYAO-C+?QbwOoG##}h{ER-EXgXp^co;p5XgXR+xEMW%XgX3!WHI{Wi=b~I z+R5l6MBhrZh0%wIUP5%w3D*8ZmlEC0=y!-NBRbCLPNJ6*9b@!ml55< z=&eLo5Z%n^XNX=-bOWRRNc3$)2O0eY(KG=iN*Vna(N#qI8T}B^D~R?mdK1yN6YXO3 zeMDCioyF+8h^C{Agp<*=MAH#Q!ouhkMAOklqNkU&Khbn#k?3ahBBJT2A`xfwT%zfS zA`xTs45I01BGJm|DMZteM52Y!*AY!e5s79-Uqv(>K_nU&J(g%XdPoEreF@QYB(Zh(QqlJWv(SwM-hv+OupWFueUZS0hK0@?bqAiR*MD#kM zdycdAC%S>?ZbrXD^m?M>jP4}*KB8lc-cNLd=vGGWB)XC47DjI+x{2s!Mn6OJ{X{o_ z_Ac};@Xq(no3E%}mniE$+i0~|mML2Lr8EO5YGZaifV^0wZ%}x&qOGF1)silYT%Vb{FAV)a|S5px|DKjD#zHgU@b5FIV3 zB{?_42PB8;zeQKT(&(eSKK(AdDymKEW~-&}aBwao&RyseidIkuT)zgIgXdZk&rQVB zLOjueOX0rtCosE!e=2yk(%-KK|8e3k-+fAC2fOFuUgQlhoA?zMPE^jP+H82}Av?@M z1wgj_eLU2?FwmLc)7K0IiKZgUkHJ9DXJB+<{rV-bX`Xz|V^?j@fin^tq}raPEMd}G zD|ibWd7Y3rn6lkLX3z?D3h)#<1KH{(1OKDIj{ry6SCOCsBkd<5Ef<22M*8a)8)>y7 z?PVk1FiNu-X$wT!Ka8|vp!I}du_Z!*$Ij((?+wqK-eFw%xm+AT)fUqo7?k#-EU?lsaL5^47sX@@B7QX_4( zNW0redy~?J8fkO!z8$@U?6rsRPo1n$t|J^~BzzX(uNwFzgwr|+`1OQ84}3eig@yhb zmxQ_qod#EpR{ZKc^p`ZkqZ7BFV=HPqI6eoekD&gd6?B?7e$6=26m9fBi6aTAiaHg} zWAp<=kH+#(|G9^GvO$KUfO6nX6tYPEu{w_)OAdKJ2Bq@eRT z)GT~%q~J@Sme3SMyBDVVTwnYpCcFv7(I>Opn2`#eKzgzIsXhoz56ir&lsB@ZBF(p( z#S5Or^w1Yi{;3VMM=|$gV-mS1+eJ;3lNX~$zTS-mKKjk|kfr(ODeAA{%}n~}2|$#l zcS9E_+THb3fuYc_8Oy!o=Zf~r1~4VN6>Y?+F3MkU4!E~kfP(2hC<^E(r6AuB{R>zl zc{uM~B|3gEN!3FCqCD>qLtnezHXP5$H)-KdG3?)9@+Rr0n2@{e`d92_V$>+-FL>y4 z468jx@9)9oK-MF8N70wDQBbgvsC{gf+D`63|KKQ7DF_^cX&-w`oPvkG+fa4^y$@w_ zjg`wX<#J;wgNCz`)b+b)g_9Rse2e#H?=9Y2y-V7cU*Wi@5#lKTW1)CW-r*wkz^#h< zkrMg1$3L$yF9rt{EjWPD)Hm{izgR3^oz6n|n@}fe+fNU7ZwMJ!9aLhn+*qlMVDQ}$eLgLS)o;{m6>UwHx-ea7Iu?SnUuV|?tQ+2KSIVb4ed>qmA=ER|w4lVI zD_?(>n4ks8Zf`ftvnGq>&lLH!x*UBQtisIG`MGH|UV@k*+0xN?K6FLVj>fa-Mg68o zeZ4q3;Z5&9SRD?}bbsc!uLspB(iZe8O`V}y*c@ZsuBh|i!N;?4fj9KVB6V;0d~}lB z*C8l6aXI#ESgB8fGKt?nfTF%-h?EvXUA9!N zM?NJ}QSqqEQqvbdQQC|m^%NC2rAR%d zs9$Wys>`BxlLR=7@tEE)8QiF4e2SeyQQt0Q$EWGcN^lPP^{7jc`!kx^?6qB}J;d(H z$D zA&JHaIK7KbH&P-UUIDi1cfw?m3B1wlbLM*Ic-4JgzgLZ8--I!X1xsC){u;U)>)Tj6 zq^-^> zR8JIXYwcdYnkdZu0u`I!_u+TGegCh6m;OW6g?aDde}}!1*ZO?w&Dq%ser2LdWX;r8 z&b$V z6V_0XcN^(Md7wKaQATCQzX#JAH-Cy_`{YdhEQnzehPIRDeoJ^x5nKZV=NCo3Ne|hI z-EW6?VoHA;^N`{m)v;~@h`F4&=Q1T4vE)FLg1#XZOWUbFFgd1mB{R0sE8D;%F=M^W z$eG&meCl9RP-Pc}Rwf*Fc&cJ8&URW~NxEig%U}hhyNa|>HX2|p95?hJ_4F3qsBS)n z=$pwsefz`1@;VdmA(8?w(RA3+_+M629|kot+p$i;RHW{p5CgT5{t;p{-WU3?YxB8Z z@i}I_GP8W2Z_+*4p1N^VSr^OYQ}-hy@)T3K`d^Tzm|3E4U$`^z7%w59lpp5om__#< zeR9ek-|&E?$epOWq$qMCttdLjs+_k^iF|lUiR?&Ma`*S`Q>;5%ufVKw^p7xdwk0&J zNSp6OlZ?wd=Doboen3wfBzm#O@$)_8>59@;yXJW3Q2Dgb&GALk?W8H~Nh%dCmHf=2F|2y0lZ{_qCon8kWqafEdb-PaLpqh)5w^X zuSDuIEn$jVeY%XzhD&axnG^|HeWsrE2`wl-!dy87GZf|@$fEk zyP>#84+j<)fciN$UWX2$6~QzY1I??g=52h4_F6uDG@2M|lbPygMw9&+8Hw2j1Q2OavZ$P|iq)lAi4Zh^w)!xv zgsEdEXpu=nDAN)eMh%v!k3xQUCu(q?!`F+(%JNxz*;J)HoK3C|4mE>0X)MWCQ4e3g zi(IE^F2J+~$DON0;O{~gk^es5kJTGnhp#|0FTfUIEp2%*`L*Z8+A#&d|0Bz2MLmV7 zjIAeGBtzeL3$+j?#8@~z@7<&WyD+;Co2}g+A-kH!*M77t2%U%7=O}qmMY~4-gr#HA zIvITcu3^Jw=7{{2Fi54b%7>MlO0>Cw60`<-B(d|^z-V<4^8AA3(WcZZ(HZsTJR4~X zf;{wKc^Iu)7581i@I-}jKse^vjU++4!><+pH86(#g{|<}k+u*(OBhR0L%=~rof1Sa z2CKhVC@<0$pk!L98agEut(l3L;n(JE3XEZYkSjctiwSkH`SWCv`ZD?s1%b7RFZ`AT zRMu50>OuWUYGDXIOVQe>YS@PB&A^g}A_Y(Fr;-MHBmcFA2B|$>ZLZ>YI?TO3dC@#5X_bgj>;x(d~cu^#rS`-`>F&B$Nkiw-{*8_);vp7*ZTdPHg3 z7Yb-|T$(rEr+Ft><34wX*D-sC`=q1zt=#xl6lrlNJGD8Jeb${mcPG+1z3v{Lqj--m zcc+)ls9uK>cRan*-F~l4ZAaAIE74-jjPGd=dM55 zhBaLHPDPuA7TD)#ycw{f{gj#SE|_m?V9Zbbz|aaW^tXb_n(;NoJu4Xc5?;XF;b{CZ z%h<{?uJvo7?SV1u516r@86J_>$ITDF2PeiF%6c-nE4t}ixZm|BUd6oP*zilJtY~Y4 zdB@n=;58!MdqeO|tY5%7{wZ4VdfqdPh*|hdj1n%~>-c$$3-?*~B-_<5(T1dwPn(XM z_iPA^X`|ZwA9C)1g~Gd|jpxwu#-qniGHYI%aB?YHhn3nkOg z1Zo`ZG4dxJs2gTSOi5FyMM4*%lFej9^oF5|`-K*~)5h57)BjSmhggHYjM0zmvw3zb z42wT{!d%Huh8F5m8gF=n)&aP0lS^EAxyXZ+vxU_X$?%F&UnMe z-xgwe!8#(|@J}oG4()F&hx!gO{cA5W`QiI$D~DBWBJ_S=A6q7}GUh0n5dSQ3{*K%W zs#yW$Hvym`G_>xDU^v^cwcB2IA&L_PXa(yS%R4Ak{|x>pIReoFd!*Z{Hj(Oiv14gg z#C2kkyX_XN1l6Wes)_mm*4v5C{>9eW?ej|(psc@;AZ?<9JqmL0(6w%;qKzI-5aL90 z743Gkz~PWbi8fLFSg>_9QeU_j9T01(i3j$e&%8h}Vk5YT>c0<2KMQl#B1QXi19IJz z+$O?Hf1oW9R_Ab?zpx{T`V2FMX;JLU4#4Sawnrcb%MgE&+Ravc$l^qn7wEqryf;1j z92x>x(B*5tPyk~(rdcx+h=;bB^Rg9sgtD{fSB`EWD`N%cFN!-H-_uZNqS4{005qdJz;;H;iI1DXcz7zZL9z zHe@j{1HXOh270I)Xw|H3U^UPRezO}8)~R~udr(aMKtDhyWm`wN?5SnXl%X0ui_UQBJtlF9~-j2a*sOaQQSP zztH+N#I76BFV%XGWGWN10KD|eKKDVSJxx-rZ{#Mu>N^l=J?M46>vhaLN>Y8+cf9Tc zg^rmAw2@1ph}Rv5L*MB>;3(c7DY#)5%p1Na@=^d2Ea7t~!l^YH5za_G`h3$cB%rV4 zu*U`u9!DL{$1QlGriA*m2ggyOduMo(_8oBqMwBkMSdKWx?Mq&W~oBZQK^HCg0#n7C;{Vah}!Y!@o#buXpc`YfT7qD0`cbJzo_)G z_8`?k+mMgnUiZr|)60d{9X@RX{a0cN-8*2Z9dI8u_YTMG4sF9^5)lgx@w(CQvtw@7 zd&B4Z+^lzo&vLWw7#`|#vmO{4hRu5CEs2wuY$#m8kAM-0W83ITB|0y=nAWHM0b_%P zC~d`PG47-7^E{nSps}p<(H7N#MI6@ZidVZidjfiFaUm9ju0p&`_F^TQVSU-UkM@0D z>t1heM|4IX#naqJ)Gr;=uvzeF)!BaaEuY$6sP4=?ZjE8V@JjB>>WKphWEw?6^L^2x zzCyt2zjAjM=I-~ZC%nfG_%JrJypa#BzTAD32eN6DWBVtF~Y-KX|OGje zn|qnX0-EAL^h6jP9Tm;F)Cb*tsD}-MtL|*D&dVNt)Degub)1E_Budzyd!*qbYlzZr z&UPZL3u$;u;@ydJ8X)MpXW^}X`L;tpfb$6-DU*B@AzyWGVO}RT=rE(N5Dw>AI&7mg z5nU-5pus2_46ni@zU)!x@X!?EcN|3z?@4<4bzxjDGp;PgMQSmwuH^Y70mBCpvRN7_ z$kO5_{qlrhzYESY*9ppDB>Sw1Bw{eUxZ68;-S<0z5*ps*>U7=P=UkVZL~^3=gDFI!@9>BD*|(+7tUrfx`sWsUG1>OFcyaA?$%$x zxseZzI-J%OByKH9KY^+&zOzj1f08=Iie6dVR49Y3*w@^%k5y!cwY7>bq5w?2-Dw#bxslH42l&vjn+}LmssDK zgp&#?V-(sBoO=^@@(z@5UilPsu@0n|IuJV=O#BUTp1fm;zu&6IMEP5yS(ES*K z)b!9uEy9+Mkt~)yUu7hc?36@KMUAl4qj$2(NP}OSozv9m(=;j?yT0~lMy}Vo11qYv zR~9zD8yc(qjH>0`N~0l~?nj?J=|z)t(2KeQ6K6C%*U(d&Jd);rX zy@KTAaye}6Z^${J?qy<5s5^2`Oo^sj`zwYzpE9 z7|u>b^D2s(fmQpQe6};d78#3h+8Nk!grH(eRd6+AfHzBDdVu<2!5Gk(_MUr#C~2Mj z8iA2r`B)^eZ5%pP4*4d;ec&brbgfLoH`&QIrIT;U(0_xo1^AwHEWXcCq9Yq|hm{@n zAijrlx1YtSz?kA$BH1_0|e{5L{8*qu-{7Hl5uA!y+I&8w2DM!lL6}g)tS)rQeNR zDl*W2l#}i}T#lHjR+mq)yZOFo=^&qGy9awZ)DcXNfytNqDGrJBKVSnLz!q|9Wnms- z+?{lS6GOLSF)Q`e^(PTuw>S!qc!wT|w9(er5=!$9eM^J|;ByXR2~!*$y?m3!!VXA% zYU1E0zNRAU!p<9QrhOo;1IY z65d7L#p-TtYQ8VGJ6Ctx{!I+(E=TlLs!8PTAY|GGGtmWKJddh3ZbSmbxkkr{d>H#o z*g$24{u+EMP}GNgbwQN-3y|vPRP5it+F$HW7Tmr&=nZ&p;+s0Q4jTT#P$n9iwRvdV z<6pion9;a|08By%I59MgTowg42j@5mmZN_7$o96GEohoM&DomSuZk~274pBeSjhS z2KG+UJ007SQ>k_YD zTadMU{Ym>+#IW!jI>Y05c+b!tf`<3M4jXm)_2T~5q1V%^$KDg3*zoB$lzB?%a-8`( zo}Yg)>TvC|up2h76K%z)W>IHf-%acw1fe>7Zv!nC(S;x*EJ%w`QU@ox-B9gx;O-=Z z4Cn=2NG7RRJ<@#O)Em$w{GeeiTj40>=(cJ*eAq}O>hDwB)q8tGHbfAUhuA4)UkA)Q zTvzrZ-@Bm>47Bl3hGq{OUgvcdY0qWzesM1fN8ic3m{dY04+_STDj%4V#V~B2DIuT_ zLmN^1kb36!8ASN{UEP3<8!zo8k(WxT_rOr$S*I&{7Fo-;mi=7otHQ6?d_M3=0fc9Z?9w99m?jbxm zVlP8b9g0M05h|0|C^UthbfFgE;hqePRVqkvGaif@+|E)XN^&`oT`)TiX8hY*pp$X!{WUKZgCnof zj1b8ccw+dz)_?~)U`HJRtaU1CE4fJ3pP`K`Bqmh}sQyxIC>8yBq>a54QyAHAzX?Hk+tH`#Gz|A-v|pff7`qpTuIkA5 z04L$qHyYsEIR8{TFcE}5OJ1X>%?vfB8<_MZFze6kqx!QM2+*GhnoST5kvGY3YR09M z&2a`TGmF&TB08`sh=6fGbFh^r+zp1*K-YIIPwP1!gZMD42 zjGZIKnR9?#I~v(t@D;8%hI1*-hpR;Y(eJ<_1f4Du!zNvuoXu>{qRqM+lXw!xBeqWD zpk*4)TsG4b7rKnrV|Ym>$nW364n?p?u>CJ%WFzK2nw>~LyIH?djAwKP=i>JHFPskn z|V#a@!$1XqlkhILdS%Mk{g6ue1)Mq!BNIqc7+|BkaU& z%M}(}`SY)^=qvZ23R=Odz>IFaM^V|tkNO`VP;=_%Q8oKJ!f$};k5J2Sh+G>)XoR21 z#IZ>;F`cakjhdT>&{*n3>vxf%Fo*GPc}|t!uDu1Fd9LI6HS_3Z=Tli3tcF*U+~vrF zI{?M*a(np4+Q_$nX=zs%`Xl=X9q+t&XTwLQaKBBP3PZ(k;uXC+lRjB)&nk8&!!Pq& zTi6jrCq6tAGNT0_`>3(dYfVi=a~RqOcP?~0)lU6@Z+_sNck4~NX}b<^E6i!pkC92} z+Df~=7*$qB|Mn@YroOSB7yC{po@DqKV?#5#5Ss7!xBZNZA_aFKizR#p)@4g!slHgq zqZQl=4A;ZAvqFB_PH;F^-vUn*$xjPk1m0_aVbo@51y`AP7blj1nKnZ3lncBp#K0_@ zcen&6WCfptR~^yvC#Zfm8@h;Ee@!vMkG%&!(bBx`U3FJEp59Hj7`Ly(rUhBHA&bx2 zt;T$tCJ)koi(KCPz2PA~b^J{bgJbpN-oD+DQ}*!R0^|}-uS6e%ChQU)eWQir%A+uJ zmTYK!F6z<7dbt*D!4t;a(M@ZgsVJ9S>1G~Wvn5G&jDbkUAUrbk%h46EXuQ(g@gU zrk;`UJ1%U61veU3kTw4NM<&y%|B1^hiu^Y{yjyg#=f1O#_0dQ`xxz5wk|p)?OpIaC z!N12gOh-Krs}N=&Q9ov$5$R9_`i!Or`3KFmAFpNu-L(@Xqe9?1{s%PpA!yPV3r)^D z>~lQdt^LS*M#f+KxKl#wqY-}thtjv(*n%L(ZqUa0x;_XsU38NYIh7vXFY5XG@6_{V z42%Kwq`5~w7DJD{JI5Lxyf~4DmWGF9`$0$V zw8?~bq)nS(gnNvrjS<0t4%Gip_kCMnt$SV~>+#(PZD~#)+l3JP34qlS8XwtKNiX4S zO>Ms$it#8@k`G> zs1;lXb-aPwJHN%L_@~>AQ*q3h1=o3KCebVM(Stks7QurSsXg0iQD#J>)i)5l@qr1( zep!i*IC=wWxBfF)HJV0YBb$A&o}|eLx9Rj}Q3SiT{voaBv2+?a7&34_eNSWdxyWnL z%h1%txc}#*YirPOLN>JdH>B$uFy!HsCL_!mIwx{!P$(Nw+ADA`81~S~A0#hkeiN|{ z%+W7Ej+&M{)1Z<&`uec2!Sw_~CG%9#M_qaSE>hhXN9}Xr#Br^o@1?Uyql+jVE|M<9 zl|d1hW!AOiOK@@1nDs}4qbauTZ~#lA5%J$)McTI(A3XfD0okz{rrS#+cK}Y}hM}zu zFSrg9#{LiUKU)*f3h7H+!#WKh{Y&hK+O>t*+VpXeb)^<<#FF1*2ritUPM;jg%0&9JMA zy>G7)**QGFB3EnW}>g9W8gp@v$<2{}4KHyyQ>EFVA4FJ8^G@ zdu>+O;hvQp9_C(<6SldhjSG!c*Sd^P4Aiw*ihA6q&dOA0O;BfLs|)hg1v%=p$?CLm z`g9CCu7kI4M^Pj;Jh`#hJ>u_AVk{3SR&9U5OR@SIz7Bc@A7{A#6}qh$>p*}|aVD)9 zi&b1h++pqA=s2j)v zc&$%vrE#(TA9Q8?aQMc&SR#t*<71giQM4sITz`mSrmF2+kmwUmJhYKV=(kPBZ}&p7 z!t`;WJ?g@Ibzu%VpgMgV{}9;r5k8hcrkClV+Wv`${wGup?=ifyDJFTb?m`JgYEuKs z>uXP34Lj+hjY6LQR}!&DY4KZ5jxw?FT!1H45Hhi zLM4@*+=_hBg4}me!qb>0fct?Xq+gUx>x6XqXCE^Ljz^19$$O+x%qtt&s0p-!c zcCFs2|K|mWeFnc24Sors`91nPQk$rP$Nm?b(TUDUR9h!T>>sH7Xu+8P^jq+bJG9fl zjf;Ee7D0TLlXr~Gdw%^BoTQ_yN-C>=+L_BJ0RAlfRhR&GneYkE#0wZ)FaZw{+-OGK z;IG!Rl!+%v53S%wpl-qxQHQK_bBRT=KBqKX&J=@d2ho z=}24X!RCvCb9w|QdLHTZ%+QD+x79a9&2fb^)-ed-z|;idVNu9fzM7NgLQTA;;3 zOyLi|bvmv&1?SY*M>|J^reYU$Wyk6vIIf=VOs3P>^bv=1qz^bQ#B?loTzOzk27ZsY z4#=8en4+dT6YpbOu-&M(q0)-U1fC6gBh2Awx&}0Ma_^y39u8Vzh1Yaz+6e7H4E3ub9bj^@wS z-+jBUZ^`L?b@FjqKP*nX^LOgxj>exuve1nD8PkXsw<9y5O}}dG$fh5IYtM^mKchoG zw7bew(+st=EP&dxnfR@;b&twa#EOTV^hHQZl`V@@wiGhXD1FBHpMDLL#3E=jm=@i% zI1xR?28w2zfMSL7I2#lAOJocSMM)D6kkJ?5kd%$)f4m6+7^vt1dvSi2qfD{|kT+a_ zfwhE$xV;|i0VjEtFxuXm&-Oz2=)xKr2{Y3P^N0cBZ%T}Vd`KBfQm_ND{o&Unr9K$S zh`huOZNg_TA&U}gP&Tb33hpNsZ8}_CEOc&OC%?dovjw#|1icf_Bht>UIBNxq!J5~p zS*+7DwCNdW2xX@_JtOfjI283HJXC=j960Kt;M^!hJDZ*vm}4eA{2KM!kTcR_Rj1EO z+WGSg;#D7JCt{~h$QtbKo+?t0a}afJ2o7&7N(v<2W@i|-SN`X;nJc)F!#9gV zjiHg3C>m!8T{Bl>SFq4c_HLjaN~p$eXKC!R7Or-&_3b!Jaj3#-h`lN4!2K1*4P+UR z#M9rv3~&+!d7v!hBy2f^(_d5|_}euC{u*zIDS+9HE@i-~C||_$u)XgL55eq+<%MO> zAXM;6BbLGrN{2x*Zh$N5A^jK6QltXVyjG42q^^ZtX*Ea%%qz2cMh{ zUE{w3&>t431HjdPBLVeek#D$V?HC33FPw@NhEF|)&^V$1BttKy83Ie^t~PwS8X*Xs zf<7v^?AiX!EiQkWLq_Alidhr)0mx5Je1u9SU;9!EER3DM{$F%POi5668;7=EMrC~r zykU|hj0oZfn0+>0k0o*921ug_saA0KmsEw(-$EYaCsBW;ejP111iQc(LlCmeJC-~j znX4y2U>fo!FK9S%(dzV#!}|7M8NCUg6TYcfPd4rg>ttQ6;BiP@ocQ%eq%)nUj+_Pg z=o5ys7|=)vo>0&gyK6eOru``LuOY3}11knm2-fM>A4i$kQX;52;LJA@9tuXuL03_2 zH?GFV!K@GewvLFO3998hw9xHpqZ$rNElB5=fj-yZ*pbp5MmSQ!-R z#iWQvqGt(0}q%J zT8`g7bmU0ynD9~>3PW(jq@SP&X$jxshH=OzHpZdRD*`D zEdwu+ZN?pfVQjsiC+L6-cAR1ygVL00^ft|pYW!>?XhjXw>ouQ|MB9;HP!AAo`W~Y^ z7y(#zE~FsIL<*|*%)C~89ANhn1P1b7pjZAz^3}}3Y@f6;vfU1qwlegku?4d z&@cR`3w+oZ7SG2dFg$M`x4Glz*wdcO?cmq4k};&7Dca+0d=sp`r60zyfaf@XnE9f_ zTj*l}><|1f#_X){;K;gpgK#7_X~Z9q9KIbf%hyU4=nLr_kqw>Dd5X4$Yzq@U2o@MD zsJM5B&q-dcFZ&O1(S|%sDem2LmQWvLt)PF)wjJXaBPD55+y_Hv;M08sN)xw29kxEjA*ouY4GVQ6$_+ia}e6n8s5u_7Y?7>sPZt?PsO!zhW4|3-fS zKE02vEJj~|_r>_s?DXHuLX4exammGS&kYByKa9Z&Cq|{f+uK?oqS)O{s}fPETvk-E zdMPa@b+(AnZ1s4@)u1e8QX4J(9Zf&MZ~QrsY`PXh!bTZ4VvPGR;X!C*L|0%^+=WSg zK)xM+n56tRz8S@>mh^+&zNX&raJm=i_m1&B7YL2P_olC)lme<3-F&g@O^8XSjeeIE z4%*u8)50FF`+diKh=?MpxdR{A4h=t*po0_rehd=ti#AH2+mf-+Sp7{bHz089!%*bK zbYj}}K0{(a@;ceo82z570Yyjeu7N3xu(8iQCVV~pbu8+=6Scy5?y2_hc+EBiiXfDH z^?W}<)%e>J@hzw5UgXE&Ga`3qVsgguVkljqvxx&DocdhiITX7I6>ftyFtdJqu$!jN zWHfE`5Qy`>NHD8XJ)3Q8BcK{|K8GIBi4JrF?~7^R@oAO$dI%9)FRq%qzjj0v@RMC9 zCc&zXeg(hta7TUnsKK}xmscFEw>Erp(VDAgMzaS)-kzUP+~e3x>$l!L>Dd;2EJ@lp zD%)$_?VGgHQ@h>!;vkfgI09c>toA0K|IQpfkL)zyN(wseh+837I~QLBuK$R>J)Si0 zuYu5y@fSoE(puK*$4WO{owq)K9di-eIu?vahCpJ?m$ZClL9&q-06~<0z?4t3BL8yg zT#bEacx?CJFs@d?4H#cseXLFKYu9S??h7=0dZOvr+N)n03jGn1I&%Qp$qfk3-bC@2I}-j3eiFt z$l(nnZs{S*Xf_)Y08a!HW@|$(CF_PRn1fvRktqFSFU$4*Pc4>P6FDps%&Fag71ehw zY5P0a)NktVvc+Y0u*f#VtVg}euM*wZLBh9Q2c}{ zqv!QuR>C*q8CqzQ9dlKMyC-yBUJtbJZL;h4Vc~<;S`H!lUlE)V%ZTs4M0zbvy0cjp zb7u)(2@zvRj|dKz6PLcz*Eh6>j723(Jxo%~?C4u>KENb+DBB-|C;kUjFQL*F*{T4iEwFuvX2;)Y|GI0}r zL!aM3s{Rw~cyz~yq`~M-R1A!Ci}(WXvdBN!OpdF+H|A(1_!|gc;E!P7SbCi9!J!@h z(k}Tr4ykc6jim@p7IbQj(9me3kZDwi`UhhEWdl-^zlLkL;uv-fm^a6u=3?F)L4`-! zh{qDTx)X|-Q^ZFJiKESdD6C)U7KuXxhS%DzJ zMEsQd$l;&JZhQ9I%4#a^iEhvz;6D6#aYx zj3orN5g+KcvCPK84#Ny9G-AUlsZuXyD=iijS)8~F>Y^Rpf2UGHWmu4W&8B)<&HD8% z2*8oF^B_%E@JlQ7E9z6ki=OFg3aIQb4NGp65Md=~g;);WLZq=Iyro`$7Xe^0X&ll{ zFA?bef)0bCwSS8Mv}wQ?x3h3sq}>+8=?_jPFm}B7YY42t9Zg?=)bD+ZtYdouS@DIA z_9slqaNXK-*>pIzz&K(w&K4=^H1Rs{y-Lu<@d zNR070{b6y%Yz{ssi55J)gg73?w^~eTJ7idQ_U)hRO>4xTt03bZ$vf89K^Gl%Z7~G1 zJtE3`?*Xi!iW_j_hpu12XV(z}?!RS5dWVP3UpFk$J2;e;m?q9bDbgOu zrZ&UpbJ0pG3wUaGx_k(4!h$)_&H9BFoTvF+-aa7D^W|&Fw6qvD%Lz0JF(EE zpl6YI;l48ba9_9ln^snPu|?R!{?7LIj!Flzeb1;=v?W*w;EK=&j2M12?P$7-#$@6k zwa!!2=5&GhS*oia3fLg&J0o(7Y95hWL1ExrK<4Bl@-m2|!^jM_n$^=WG0|+{1e|vm zsxuKode3HX~%-rOEjTJ2S7 zb0%xsNSs$ap#6;c6aMhaUHGIB(p0ozuJ2j@FH8#m-uav} zXKrUM@4PefHgI=Q-M#&9rZ(5)CNIFCDS4_{M8Hc1=)jXVxN1I+_WjWMZSS6GCer`* zk6-0gKfic?Z2Y!^XX>KdCQ!VXhC!%~lio&`fE$$Y?`}YPt1)+V-F_V)Z30T%BE8m) zwcGy0^{__Iuq^!v3)oCsQ>-PQILyswm=jQzIZmqY~;3m z{VOp@rRq`84o3f#df;pBe2Jfu&Tdc$M!fGe+33$g|x%icuysEvG zGk=erBzTMdehv0|Lf`w<*a%M3)zy`Y{}ji*&sk5?X4c-h z<7*fPs?7#TY>(?-V`6dWK^k-xRm^<9a^}l;8Maoz>o}a?HMwFNzXLA&>`B{`TC={t0_!gDJFs7= zoO!UKd+mhEnFruPW?@_OMN=nKQdr-EQIsuyDQ`2DR8X2`y@Eqp=ndhzGw4lV{>3;# zVEIdUH8^cCfPtSb#!Bc5UZm_rK3?$Dl{1mG2XKc>x#+-qv;`je&kE7TtY}Pp=gE6Cl?QTbRoU(`#ca-iO zhmpkWL!YMJ7BMT>J)N=%^9tRkOeGF{g=pmtHaAk1&%gj2yJ&C@%+yn08I;$^a4`FC z&=X?V%e8S2#(^-fyzA&hg6_Hr-Me+Ow)p2eCM-bwej2~5a@$eLm3;{CgmV!f>;!9~ zsd+sM+e2yJG41$$3V~#A`z_{H(2>*hzu9S=H+z5os3)jS5dt;OA+1PR_g38)@1*tx z+l~bN)~{voU^d%PX~fGNC(u_RM{ii{HV{+A>soK-rF$X8vLTM-F{&-^_h*kHr#_#MxBo7s4YJ?B}mR zCg$gCo{CVgxP2zh5SWF70xlx+C0qU}8SGJH`CB_C%yAqzlm~BP%eMWMEDE=|p!umb z^#&Q#Sj2Baibc)GTv{XIl{f|anDE#=?j-6U-YD*^nE93&fvvfnvh{LI3I4Hv;9*LC z2;&Gcy$4b8jNQTLD$epvh_~ocCmTQRxhZ0Dbda;QH|#oZ{4v7M-G&9*&q5S?+hKJT z*#9cW-!a@9|QVzYu7E;!IaZy=!auGF&IMW2J zq633Ew1(KHkA+xeXyPDpcA4XOG>iY3`Lo3bw!N5FwSRyPns{#J3p=U@a1sISWG3hH zWKZZXmo9!Pz8E2uqJHMD)wZ(!bWHx>To9^_$J)uS%63fnwBrEsdhDUx3NpDedM7EZ z4pxU1|3x=C$k$0JHbTc3*3b@8g_k!Mf|(7!x!MH&MvX8vKYOTMpw{PHD%ZHLY}>2a z7ARUL^qwZRfC3uc`al^@-%VHfZ^V>Erpk{t>re|daK|(<+lI9<%XPrq#!#HoG%}}u zY&f}WLFiDO55j;(q%)xWFaO_ZK(FA9rx?&dV?c{w9VKPmSDuZ`Kil!L15fEmbg=%Z zr89p?#-okMab(-S*l-+2*mQnoOy?q)PWQ!FlLzy8f94A?rBnl|7&4%V?*Ghya*Y9D z81bJN&;d*YX#;u^@2kXs#%crlyBN?;V?gn?L9;n-+o@tUVlzLHQz{1A59+>j8-g|d z(s}7NWCfb)VdgW~hWs8UWn>=;ZF^U&$DD>Sd*<_JCAf1s&V`^&Sf-i5F&TUk2OZil ztgFUCEIBl;2Ev%Td^XGA}{?HD7{Ybvk|0W()KkWZ9CyfokZ zL=;wmw>7lLXY&&wa$v40?|OPh#5vuUYxlpf8v6-7m5_J+`x^Oc|5q{B-~Sv<_;>%P z2f}!0c>N7>$;-v7;kQ5bMS^&~>x(3(9~Qp7Q{P>0M)ACP^A^Lto=E>6ehb6ZPixo< z&l|u+^E7Bi^z-{0J`W+iXnOdr`(YdMF+~61GH6_=qmpwN_d}6GJ0txrwe1( zcl&#h&v^JLrU=dG-%GES;XJ*X4~XolhsT<2`b{y^kgNFDZ@q|Y!o%+$JK(~ed>o*{ zC)qX7#*c#6YsimYk6X9nVTv4`@_|gd0vjQ*{{h}Ax9LSpAf&SYhe$rnMO0&T-?)=W z{%K5s*5p;bPR9c0SL387yfXiFbza4*2sZ%*l&zC$y0KOV&tKz^QT<1tL$_0JqYS~p zv+a?@cuH4(|7*f~-tf>P!WUU!uW%j$r>wiujW!y`p58!J70y%2w%r!hw`(T>rAk^h zO1~=adUHgg30ZYfnK=$dA0So7$E%gV?+y77b{sCt`T-RK4w1qZ|1xX|!yO)^%Cbs} zppXi6+hICkY9DymLNS2HldMuqi0ICmg3yzB0V=;p_?4|+9a-sb!X z8|rqFlH^}7OGaVP==pbL-8a*H+2Wrk!g#CoA|@8_`nC<@+H>+?Rx}bXePRIK%n30a zNP#X(yh81Nj8bP_G24AT6pgNwg_ViVuU_qtF(XQEojW}@Nj4cO?i0G ztRFhAuKVt(T?j&dr4kXMevJ#RvioK#8=MSQ(|z;pxWnvIe)pyB?#>xFb zHM(Nvvt`?!)D^RHD$d@V4PRqPN7ijr=4FnfWsVndG}~39F_?m_Yo0mraPh&s+V{%L znSy6^o|1H%hf;b3#la!RH1c=aPEuptK-Y>icinPC1ve9x@QECW84doGeL=@{f^|RC%J`H8lB}p<6I3 zM)>OQQ2FZDB-+3c3zJFu3`W`_R5io#)3U6aDZMifz<#r;+-%p~RkLSea}YH-FD06dgg{6j`CT@5yb?JB8m*HmO8`B38a&dB7aF@R zc)@K)Ep`yVxm7z)*a9ga9W^^{=mBzxqrQJ0nselcHh>fMkz!N+9Di5?WlN=L3e1k9 z{c$8{40653tVcBKSRB+JcIVszCcRL@UU^j8lX&fDVw~g*7G@sl|J_SkwiU89i*+NL z#G6z77VfVHwBFkhXzjMEqy4wMs7sHci$bWQpo^&L;Em!Ke5!%kzlwj*tYUv5%DuYV zbe*Z)@b5_cn!O#+kn&iLZJq@SW4!ol+uK-RyJ-djcn47bz|FctIeqie?Qp6jmiAme zqkqG;_MeS+vPt7|Q>_&4hr)XM zQgY!BRjUP&MT{uorjSoT6p__W>#{a6eeVU5v4%eF)OulEB(|E;8P-_3idC7l-S<+l z9+N?vb-t+t7FDOJ$-BN7(pn2q%^!}5{s(2);KfCn+q;#X!-**GCy4hsE47~V=-ksThtM;Vx6Sd%lS4eJY zrxxfRO@*;z>0_8n=zl^t{!2aJ^k0i~Q3P*9$x^p??en?_N)h$`e^WjT%QSS9f1^U9 zyr(6jydHi=|99>MieA{gxszUIKAXTsXnmG&@sSJOszgkRk6ifHD&%qF)2IupFtB=| zzmxpvJ_@g^;hx1hurgNXxweT5-GKDX$4kwEw$k^lx@WR(j|E_ zv41^pX6@8y-pnsd?LtQ9&AemkPEGHg+N0_HQ+I3n(9~W{AD?;v^cchGUOGRF62g4q zj_al#hJ+qb(Rf$SL=|B)oSzFAbV3oc-Te-fB9=&_9sNf;TI$)zT)iNQUg+*+u7Z4|A9 ziu=4FZ*wT1v}!9{D~%lOLh2N(YhWN>BUdv{3lixXpvOT?4d1vv`L|0%s6W#e#wNIW zyZR0v?NYschd(pTf3fm!YG2}R@g}?>w=SI}?pWZ`WB{r6Mf`!K)BLjyF3!>9Lq&uB zNQ=85?uMfoIlCcl6nRmuZGo73Q!wn0Y;w1I!`@angK@Vv6bpF$o$gpN97gu3Y4O5o zaWzY=(YdK$5@%2m#1WB@dri&q^6J_Ocbhlt4+UaNjPgK7z_&5#hBrhw7z+3aE?7`F zS5>&D`PH0gEaICpEjb4|5^CD4q?xcZaVTITH>Ce2HKrJX*0K z#sMZn{viu0RBIcm7J1e*tgczPT&=J3)URIEu&R7j?HY1aRMu8DRC?CetgKkIo`8n3 z6_uWUnSyyLYRYO?EjQxjwKbJ18$7i&YZ}ys zU?@aISa2!jw6Tq|hHl-{)tu&Fcuu@c75E^WNOZaj0`Bm}V7vROIfc3$=EP&ZIfI_( zAbVSat%Yr>quJ}*5DK>9o8|@nfKL_AR|UbaPsKaKzECg_PN;@R($^OC`d78IEG<$q z1{v-v+^w-d)O|*ZK;f+7Gu+dsyN85Qm`jUhy05q*1Fu+hP`&p@+vBPw67vOAq@~5A zMHK{8s3qB~=A@)85NS^)67I9yQOX>5!Rm&(nw4i3&mGDYe5O4TRdK3F?&)sQ?k4SM zZ=l@`?Ps~$qdqix$#?*2h#-&KqZ?Hy*c=ONiiBEJJn4_9f--g4WtXXDpDG9;U*cY0 zLPhZtazkf9Jd%XI0>mcZF0H7nDqCCI;90Y3?dtN%QZ%Zqt!Tu;K7Y!CPfUoXGV}Xruw+A~=!3zqgf!$Ql9EqUiDDb=Io#i%(Eh%wNone}b z!6KcR$zSk4_Lum0{bGf2Un~#^ZwPei(j0V5SN`@uI2jB0A~8QoDil)f-e7w)=-Z%g z+_)=fNrplNn4hO!bxv!a<}a95J*}=_+L|+F7DmyC#RBc#XdFd`W-r*%Sr89| z{qEC$zkSzV_uTAW5$J4=cw>GvsE~?MpHWzNy8HCifdXy>-H4bG@dsMG$xuR9oO38;b1fxK)SDR>x8%qg6@KldwvlB zUy>~84EGuCf|lZ$$m?hT?RwF))S9&^j{Jiy469iSQYscTENWe_eN%8luqNyebinlD zaVmV1a~>3hI&%R`9RGuLjOuDiB^%6GFYJ4RyP%wsVVb2m8Zy5zAL;?j#oL0;=~xlJ zKNg51zL5>7Dfq;;;VgHo-5-pRJ{^_{wK-3hAJC$|L^?y-T%t~{ht(| zHi%?6NaGNt$5us#EHb2cuAwEW8MQbNi*~4Z*o$VgEwZWE8&hbnh=kj{aSRnW5HAl3~9m zg4Q*d=v-PIlI;vO^p@%TcKcmO?7!rSaYTs-Z;um|_?rHhM-iZQpiR5dg- zsLzyMtUhxQ{wwfbcd@#n?h18I-8t%(JHCRjp*Fm4H%Rm9nFYL6gTZ47_|7* zJhf0QRs{t#G^Q3Q(B2$~Nen2>OT!WLQ{jY1JBk;mU^tivdP5?!DdTH+J1*af%sm(Rsiiv9}WPkHYe5xuK^OmCk-75oV39D$FT^9*QmYAp%E%AmaCP8m} zX(E;kEb%525h^0>Qq8f*h5+VkQm(#pzx*Y-?mM?dU+#P!NzPld2cgF_?=+k;dR}2h{Jqf2jTt6^S5BFkB#_R-*gWe6=1KJB(is_nM zZ0WlVbP?zipbel|m{IEiJr$I;{9On7N6>$Po-#tI9L&5Gf#!i$fbIc(9P~ZVe$Y!W z?K27E`n`Asuod+0pu0d9U`qWJ(6yk4LAQZsW88iebQ0)Xysw)LdJkwL=oGxxNq|0x zceYzW-vhk^bQ)eq?*^R#x)=0wpdW!w!u!smQAiJ{A9NO8!CnFSSI|2^=V5)we$elK zZD3#mo=x8C85n2+{RkAJVU=|k!U1i>I@^apPsY^e>!6jOAA#21J20>v@0_<{c9Fgu zw+r+Y&~xv@Q_WbVW`7I$0eTx~2=qswU7)Akk9-Gx9Q0Mtm3Z-T7<4aa{&7gpcai^~ z`#>8()o$cJ=p~@9g1!T)T=4h(fdMz@LC`kPw;n)xKwrd5_6hWE473Ea@L_}xx(xI> z&^eEwyg`GYuYx`b`VQz{K@}di_G9VI*`VuxI52P#Xb0#Ops$184!Rmsudjga1U(G; zFz8rJ=Q**Mc`E2C&_$pRg4TlOJb`=yodMcIIOtx`UxU61`Vr_mprI$B=Xj-l4>}d} zL(oN_`MuBs`cKdVX!(x^2EG7#FX(R2F9KC3U?afKVXvSin0amk?F8KpItdf(_k-dTwSiYb|A4nTO%s)x{PMs+2dMKP zaL@-pkAf;pS&zlL*XKd2L4Wuf>=pF4uOq)fPkjS+H3{>)ze9O|KKXm(C+PWa!yYCp z^%c+t&_@qJKj@;rz%D>TpznZw9rSjz2VZ#?b`44wlA$lhWvi8=Bj0iI*pa#Pc7X6x z@ZaAxFfg4YDn_Ejm70qG68x7&VAH5;%9UT`nsi>?m`%A|>fDpgnl*1K7QLbD@Q+;# z>aJ@B29^+j3sF^3{67n2mML zu5``Vo>Sv0+A^ZXwP^FmGFPcH>{?XeDk^i$Smtssb4`MWWv<-W@cIh=i>@6QSWkME zyYja?D_oPdWR<(zo3rV*OiPwMz3({_r);EmJ><_Ic`y+tiju0vzZ<+}@G5CKLB|O} z-IRqOcVsW4IF(VH$|z11uKKK*j&zZNS4w*bIzF=*Hi~adB~99{tTJ5g>KWzyhHKZT^IW?}T?M)fKvttu-|ZfC5oj49 zzeG77n-Hj{vTeXl@)Gos#kf}uu6&dvY;T3ODN1Vs{7Uf4h>twp?nHFAWa;>KO2ok; zo9Th=XROTiQ zh~<{7^K>1l(UDj~5vDjy#TcRL#({w=Np=O*59g)Cqwq?>yB9oaGw33$0oau70|OYO z=!-BKkE{eXF9o{-SUWI8MPHN-8lPMQEJ%pX8(nu%4^VeuRj>)F=445Hi@FZc{qVN~ z{%#~*NkL9;j5=JYtSnzPdzBkAgct}kM|R7T+r z)#oAGPu11s$U5DbUKf?&Y>eq{ymfdRQVOgK7>05BqO>*uivwFrVGflAwU0HtMc297R=}}lw6K=JwaV32<%;@UZE%G2echM_5{%Yq zzut7YMS0MO4B7J)jHjqx=yYk@I?uJ!nN{GBl$rW<9c1_4fj%6fB)i%9S*l)Y5&nC? zdk(zYh_`aku8}Th2zI^vX;|1kS8f&62bdMI1N|CA$-ZBQ-!r~CFz^@hYt^OYt}dtZ z7cO_XjtXiNM5f}O-Us)=&j#|N;}UUALM>?4a;6Of+g*#QT%}d6>M~b7 zh7uQ0qRF2GKRI1noEY+K&RXu;?Qm{)?QvAP zdL8Gv_B(1^2OJfyR~^e-eU5r!BI}@zOjM7VLeSIr^?`v)C>)f>4(hwNQyaAf{nm`l zIn}Nr=W5+|qckCaVxcm*8~$#DziY`K6mEf8B7ExVHb@ARj^`lvN60m^9NOs%b$%cQ zl#X}6pZ*PuZHcez2-?V-vQWCIW0`UpU%|GI9ba7puO%2nv_KDi36Jy~GX{aT%_C5v z&X}ta6=xY$9~5c*CRbyntEonuZF+!!s;~9H9|10PZU>Fyw$nInOZItG#^<{ZIMFZA0Bx|4;g9stGiB>N z+)qPi2Xs0`ZDkXjw)}}GIxNe~_Dz!OH&flfBIi--h>bqEi$Z{xmlQ&2Y zm0uJ1_ky2d7rJwEgLegZe+93F{G!dcoZII`sNd8$Q`~wWQ~W&~+(I(Aitzssu<5{V zB0$^PdRM7m_aSA{hv){UG@|4G0G`9Wi|-HGQ59&@A3rFL3(f~243P#%Wt zQZ9QQOCp9>khyY;;Cxr^DW28v^91H+Fs-03O8Z5?XoJbkq(}EpS=Ty{E-Jqc@QN^R zqsNg@>FgdVKdLjggZ~ZiugAT*aIoK}@$7nPmOie|yaK=Pz^~48j2TcS4KyyOhN{Eh zm0*78a&9ATratJH=h+JLJlmAz$uJz$?G?=x`7pPn$N3kz@-If(sO~iYzY+MaDDG5e zUUAVhiwXf>@d!Wn1YG&+SpGWT3E=Zd9%)_6_#MDM2Ye6Vq~}4S=ON(5KNuJ|i*TejcDy z(gOzWEB&jWaVbvoC&b~#tNcH@5!wD#h^2U7yOoEHPD2eyo{ ztlbWvbtz~)dEb_9OiSfA8*^-zV{T9PInAzo8Vz0qyaM=_fWP&zHibw3%_DXE&O@kc zt@vfFOmAtFmv=+|=}%(L5BF5A&Rvp|rv2Ir{sZ8zBt9-G-&cXX1MGPM^cV&8o##m~ z*4l!;5Mv1E1H)%Z(0@aG0xI!Uy_hrm*z|B6+3Co-&f&V<(d5G2?6lJYq_Yh=Cq9jN z#*fv>d9>5vdLiYWiV62a47b-WN0~~se)3&bX z09UzoXJsWuxb|QK-J9jSP~Ys%a^8~8ev6>)9q69<;=sUpxFLVW;@%}VJiyr3((hwIpPxBQ#}3J+{*`zp6bLN$aFwP*G0&L2f3I_1E1!bPie;73U!=1 zA2YV|%aMComuI{7XVtq7U?%ZZ{P$&{;mE>6O%}$hSr-AT2Id1+3v3OrwT#8dcW0Js zQTZ{`eF#~P)BF=LUx&DUNC4ux8H2II$SV|w>H_Z#@Gw2CdF#=p{P+5A4*dTu2YRkG zDXM3B{J)I*=3g5+k=-lxpb77w*d4;D<8*zR-OcPio!zs3Y53FGy$l;OI7-531RxYuxgY-9X0O#7IBF}scQvA=`yZZt8K zc$Kb~m=E_8y??m-0LG!ISBTwzekv7JYUI7c-Qs%o5xM(#`ubajzl*6z|M*S0Gqm?7 zhQ`@`hjWj0C7(PNONZS4LxYy-!QqgEuzr$_*ETj2k11t8fPGa{Y=2M?fm+=4oZ}W<$m!1i5VVYlG z^!}YLOo!{MpZS;u(^o4iz*LdGCNafuVc5mq@Q`Zahiap*U7RrLyXoTWQZkIwOVLBql;WM4ibOF;UrnGaDt`?>nnQmcvE7NIwOVLBqg;WM4ibOF;U zrt6rtFx|*>3)5Sf-ox|}ruWcnu4BTPpmIeezmnJ!>j#dICh7N#4SZee;W(|edc z!gL?ggG}FKdW7kSjT}DH=}Z?etzx>4X$#YhOt&z-mFYc9A7Q$W=|QG%GCjg{#3l}( z>2#(Gm{u`e$Fzm%My6Ys-pceIrjIb)$Mhi6H<=z`I--NaXF8qf0;W|=*D-Bjx{>J? zrnfRR+K&BgD>3a1{nG!Jzcl$=lA2OfG=KiWg=)&eg+;j3lz_g}lxBUYDJA++Q|9VR z`z8O>Po(~z1~)aS#7n)Te~{+(t)HfHjUPh9-$masd~u6Ep~4rpPzgu);ub!JXZjMp zxP>qMqVUB{e2R<2NBGij3SYwOf5e2-M8_55qHs#_FaEc^07uFte2K^DFQ+hZD}2%a z{?F3$B|Wh{hA-iXe@TzH|Z^F`dBFpr&l-{t^Zno-#Kt@_?n3aXtTvd*Q!e z@wqt}dsH9K$5`L+r ze-nEXevuVFo3AYY0n2~i8iz(Ce4F3P{8IK8v;6m1{%wAjj;%fHRvY5CWa7SOSR({FNr$i8j9T|c56 zzLbBHmH#%s)XM*lEdOrHzs*;c|1&NBeR@I6Q2cFvFY`;;-xSM#m&NxoKlnJ`FcJF@ zzCC^}Ww|)hDV)FT9IStS1_txbioeaTx8m2r{*ylx&4x<+gfI5pW0ij^dz104l&|;~ z{;!@jg2FFle{D>k++%LA=j%swS8ALp#59G!l%P_^k1&<+9qg9yg)iX?U;O`(<)7Pc zZiFxXg}>S=KkJWwB%zXR#LHJ?j zi+#8)`>^@SvX6Glf8Y5gha`PAznA$E{%p&CkLBOycUk@mE&olHf16)w`9Gh_=Wc#} z7yFa=3x5qi-wI#izsB-!Qa{u_2w(gQU;M9S|6-q_U&0r@*r)Kt|2oUR=okOO7yrT+ z|33CVSpHW2=;J9B){ja5ZSkM9{P)$H5JZ2k#qYKFKeqTi7XK-WuMcZQd_@1#7Qe~z zzt`fITKs1$zT4vOv-ry5KWp(1uNt2I{T9E^;{U|r_gZ{6(n^;-za-`B)?BO)x7vS( zmDkeW!}`SzZ2nFwe4F3JdPtk_@x%V(Biu-{)HA_`cEn10-JC7zuMyW(V2}Y*JO*| zYw_n<{4R@MX7Nic{(TnTZSlWv@s-8jZSnh743EFl;`dtoEQ{a6{AC}QOsHeJnyF-s z@YiPGU&y%M@+ba<|3n79J%1Uqqi%btPech6i@N6pUG2UePx0t^BANsfBci8f0 z>;Kf>hsVJ7f4aqAXSs*_#=3Fl2bi{5@^<(k=0_|!(HpaHJAR!O-`0Px#s40=A7r}c z6Zns3;P+a%#8>qH_&q^}Q{g}J3I2cf3H$>Y_;&vM!jiN3$H{{PN7Lq4egePU;@`yX zFI%|e!hgya`8zE=cKmjI0{<0@zv3UF+0gZt+txq(@NoJ6xAB`lA^vuKwc~%wC;0#N zC-C34_+sCsM~CN|xP<>n_AT{uxur+^|EKnE+wUi}4|e{XXN7P3-^hGn>2(|TpQu`?Wgi8KM{(Z#?&*pzp`*-Ij__y0fJO93s!GDj{E=m0D^xOTD&A-^v zV~78k6~4_M`=NwvsI6c6vl>fIeA)HO?yo+{Eqa97@mpnuYxB2$0>AeY_#ayQ;(tm^ z($jM+eou)R*Hv2h)(rSA#%nG4+Zng@?_|8elJ8>tGmOjV@;S!+7QUbHpoKrg_@x%U zoAC|{PcYtP;ae{-G1$(yle4dbtdr`}-MFasS?Of5dLlC-ukkFN4VXSMlG%xVW#f+})P@Zp;0j#z)4_(tbX{ zdL*8is2zV<&nxkL%8JkHmfKFB9bY@Y?085$ka{BZOX`8xz0|KG9RBk1@+IyW%U7PSrf7!SgJdf1a+E`>*EMojf=>c>KK>nDFChgaHvukJ z8Gb%R_$vHgjQ=c0?lZ`>Eayl!Ca$xxN7j)mcVsmY$B1V^a$4}?n114?N!*$9Ed-Wx zCw?3=PMHQMrw1M#GbhkIe_nPD4vSMcml1o`L@JW3+?*vw*Yl+7>kxLHG`OlJgqwvrjwz`?${^oBiADQS>%7_jUNp?#p)R7Y(`Z zk?VKHm7RMLLdgETapkIUqmcaUKV)ao>TaZ~9I~Uf;GVwUKAP4}WKk67Q&h6EKcbLx zvmYQ=e$L&RWPb-F=TZ7OMJIU71gOj(@d$m6WW+-VZN#1&efZLdN#uBRG=1&bsj_Jv zRtL2MH#(@}l!HJg0VAKFc;1FP2mLrH14e#|BKvK^=*RgmVe?3izE$9$ALma9TSeH* zgwc=lH~1OzKfv-w{(S}_I^qQq`Ul7AHZVpW&3g>QIpS8ZM}9crE>bY!WpaEp{%nMr ztFr%0`sl}50Q~qr;pdc**^b=pxXE>rk`WH0GWTuLKhj}z=3Y;(T!)JaDLdCilA|0a zoK9MEe@wj5hBrxNFN7`!{Ww2|pOG8D&Hf5u^yB;{VGj}ZJ;Lb6Nf|%#vxGfO82vbZ zPS{NRWdD*d`f>h_uvw@B*p98@ zg^=zW<3vu6{VCAjjX55-YSfqTL!dUgJT;2^6Gyv8s!>!>R6K0|WAflPf8?*p4n}-{ zB#-?4sAmB|6V>@zksPTe90WWvo9gwb$s;ZW<2WaxppJ{;*Kr)>fD_Gz^IY7V;Lcs< zx{p-;2`Y0dTzVbEh&v&fTbX-2u(2b~1RE#Ad>15NWp{v#+5vS>;D+Ni@qMVuU7kgX zvPWgz0hhk$6(Y52=R%L8431CD#2vM2zsA3_2;z8fTv?`d$}SCysL*pO@u2*)`2Io*HXMo*HvnZq0Z^ zW1%9FHC2rnbIzD77m_etBRLaQmTSqFv&JkQLjog?OL5Y<9V5pBID0Zu&YT<)B+e*@ zqh`DVeny`LO>=;Z8Slt)jTxi0ot8_ivD(vVBSrmjGobAhh`Po(5XUiDr=EOj{)uR< zIbP^O^2a;03WP%%#&P^~u&|xMAecY?L?e#)llX*eMB$tQE~&KjF&b2^~sG6<7$T3M1- z`6#l(HvDhG|MmDMqy7T^AHx4${QnI9I^fY2xO4oLoNwYM>jV19LL9S4;Rm~T5z?pd zGlJwsQlFJO7k3o;EYP%}J1BIMEUFVq|M=L~f0`jh@afP$$Pj%dA{1nu>!__wE}erq zkGve^lp#*mOUkhV4UWU{+5f{}XsxnC|3ICLfU?ejHp*yVG78E%ld;0WIXFk%ABe{1 zbSzrnSx`cs7lr1NQMJTTLa-hEQsTyTipe#=Hj~w3IEd8a1y=>T0j>q#tGn|U^oD0 zI8qP|;b82RK!-07rH>B8;Xs^x8wz|OZ@jGlpFv2N&k=y(Ye{i0r6bJ&wg+N3=^N+d z7U0NYc*T*(K=pyfIO`ZOOtcN^WNnccA{C2-5kZQAFVfx~36mW{kPizFk3p_ZB z8OJKOq{!juZX;B@fP~uc=>|8A2ZyxMnb71n?!#9cJV8IXJS{l1KGdlyLoEwRJnQKM z_;8y)W(4W;4^T>el1iWctX8k7Jl|8k##2>Ww%oIFm1lJ&zOAsj!Lw>5KH^YWSy$iS zSyt096lgfELX=VZhoUp&N`~XX)-b*&LNKDfz(a}0iOeP$i;#+s2@PMxz*+4kFeHP# zDt+iP#WztrcaaInA4$^JNa9{jD3lI{OW!Qfd2m@E7Exgjd5>Q<6nCT>s6P<*5o&@k znQ!t;-|K*(o{l=_TptWzSoZrv%Cih7!7Gj}6_ONqAQDDMbVU5eCAqF<`D%Q}Vt593 z%$={(Fj!W`NDv4i6o@2!C^(!PKbYV1<|=%+$s;#L+q>=HQOrN5|a%T|Bm z)d@o~G>&tCBSS?uv*@`zojk=b9XzRm5p8{ah4I@Nm-VOg z5JK_XZ^h?6mUnz!dsjCYqJF^mR>rSpd_O4ZQ5TwsQ$Esl0RM#Vvh@D~IK^}1EhMEB z6ZHn}3I8$!&uA{r4;pW9&le1!&qKxSJNPI4Jshr-%U>D4!@}QV{B{ecX?)Tn^QfYS zMyC`XIS)aftqR$E#!sV+#ih?l1wDyzId5UK=9-BO(j(_GjAWdKfrQKcc766KcuN?U za~Ymy`DKiE_ZWceo-SIxL3$qU(N3k$GsP`!`=NC8TKWH-;|+em!rx&#@70IyKmq*I zMPd#dTHbf20i=9s4uJIUwDObA@+ABV7TyM&;`#VDjNY@2Iu&L7=-mc)8=^WHpG1a= z>o!AF7jRu(tY7L^H_LyI<^RI+Uu5|vmUlC*XBrTnJMJ;S2FAb1dPd%B0GY4+4&w!k z>oZFs@*~DSx68=0S*U%C&!!56i>r-F>U^H8WIkW)Z9d~NZ!h=(=%M^~^E%-ktqte( zXneAg_Xr~2$GE&l5L{0up?#D2f5G2nd71wg{O^p*{J-EdCr9n1%>N6Xg-19l-zPY| z8#$gX#!J3s059W{8UG^VcQJlC;|soRfF%fzu4QbWcUyKvlVfBLeQeM497|UT>ydLV zE-|p$rsXHAE_%$t<(^;|?X0KE(!Z4Tymr5lyVej@$GGeRZDyS2fG9q@EIq9(|HOBU z;8vFJWW4IT1{lxjy;AF$topb=>VliD>skJS?-_T$A?hZ^d*SX-z0bIuFLIg@SN~*O*4g?Q#{{yDPc3y=xWo=~8GnlLa|~OZ$hg{L zfN6}M%DAipuVZ{BOnKBO;N{?|hH=>^FopH6XI#!H>1I42 zdLA>t48~)O%YG5bpDP)ceFjmMzkzXC|0?-&E90^*U+m`|#$~^S;NNGwi`VhL&H8`B z_$5CwKn>%+0PeuF;=GRxApPL$EdL6!4PQQ&1gG#g8}oHMhOD6quegRsV|zjCq2*f8u!ht=R(#a`-*QdY!zT!&f&S9ahmNVJ#tQupK%(eP`Le# zMsY6V*Ri~u^P|u61h0qj75j{!j5Fz6ebO)c_{vxhh7TH-{dx5EimorSyzCo1%fRZJ zjLUwF4;X(CIQ46#vrRnRj6ccpa{kXB8GnIs*>_OM_^XV|dha_K{|)0?X>t#j^zVOS zT=vg5p*-mN8*qwGlf;M1mo$|rL14hdpb{t zg0p>DzaDS`+sgPgEI+f~09UjA8yS~#q)J%+R>tL=DJhq`wf@O!w^c8`#dsIvMXcxh z8prd6m0tR;6{Sngb#Sx%ON`5Y`+Ua#%y?hJa6A8q@m>obH^S)evGD1PcUkyZj5jeZ z;np)Q`%eWAFkWiOU&grX7Zv%N8CNVngVS|4<9%y}r|XA|_geS?#(OOMO~$({{3FJj z7?*L~@#r`x|4S|T8H~Fv{2a!Wg*PzX#~rei<0XvuT6h=ZU5raU+{$`AOep zAiT?xU&(lrCGTgv)WR=g+->RE$+)ucdl>JlA0B`DMgzsC*TP?7yvM@(8Sk?2e>2`> z;S(@0ApNBlK8ta;g_km}EPNf~vVTd+m%iCR`ulj_jo{ZZ-pja@*X@k=Son7tm;FVe zXD{Pjmj2fmZ(>}^_b}t77CvIMiKp8N_Y}sJh0kTYkN49^{Hq!7weZg}-ov=WhrXAm z?ajh(WW343dl)aZ@JASTTljN~E5;?Bzh}IUCQNV%ew6WE3wMn%@$9kisf^3M9x0b4 zj5o3T3>}L3zJs>`XxU5qX zd^6*+j!p2J8JBfzf`6HDS=T1`H-V>{f8Gt8#!-FOa0Hn=zEf9w|F6<|j#p=&C^^Of zfTYv29r9Q?p`!e}DbjapJ+RiI;d&m{_(Wx&!}#JjrQERpCbmz}^91DSS;)R#$bk1{ z!2g~BAL&Z3|F{hJ*@^h zJ2T+l(zr`~aJ>m|6Nmd~2KnbR;2&hb$L6Jv=cEkyEZ}aALn>LUw!-{|UI8Wl{;2b)}8xMBrH8g%86RY00-~8RX|@ zz{@k>Yct?28h5Ga%O>3CIkJ%q@>gZRw*nuB_S{V`$Z+j9M14Mk{MR$!4+D2=4a0w4 z0G^+wzj!@^p1)+k|D6Fp4#tzteooGS7i!$4X53)nDgFKe#tW}AxLz`i+Zy1f4^NVI z`7`K`XTYz`fZv<}|Ek9EUYO%^2FKwZ#*2XfHFXMJbJkHSaF7+Chi~iOun8g|NRAj){XTUE3PT{s$bg_#ZRiM}SkkE?sXb^e&Fi|74IK zhZkPy%JJk3_{%?HTaTXTZOj0pFDY ze>wwB-!o5_Z+#i?_ce}n4m?gfh4Ud>j{`9-I%EJmVd`rv{hH>NE40w44 zd|d{-H3PmW1HM(`E+yv>{fguH`3&+s8Sn=);QKP*uK_1J>Ai?ME)MsN4DyFE;Q!8m zA3rgD`MNXU^D^KS8SwfHctGPWwZUrV6O7-?_7mXrZU#={w_a{n<@x>A4EpcOfIpf6 ze<}n1at8d34ESN-)GjHGXO!drj|}o-@q#s7{c>l(i!$KnX292Gz}tY+xW#UNA{peb z%z$srfIBmcXKvNtAH0sl(|oIYroE}zF^Y9Jl{X^p$o@o$?5 ze#r4WJ%fB<27E~dyeb18(6~$WbeI73_qlL;3E@sm8i_%1e4-ijY|VhHl*O<^D|=}b zIu?)mH?`Am0L$mwnCPYSDjeuYB!VHV;B5^gTD{S@3WU8_R;_PiSYDrqU;(^}2SP;f zAE&jrz71GItKyrmw4T~2I)AvjHggAoCOAtF_XbwGJzF>kmvKneB7 zyqlV_gxnw7q_995E8SyJuU|EXHc^n20U{DtCZ$X|uuB5z4f_Kdb&g=)0MddCXo>ie zaixE;$lBxqrO3n`nGdar09N@1Kqv|!Z)YTl48n4M9hF2RN-;vgM1yUHY}6!TT#=0m ziSUM#QSuFil!4Ji%#;dYCQvAeD_=4ekHpl5KxY)`iIX@?q&bA8$jBwyKF~VoCgU+2 zpsXaEY$sV{^#;`%^ENjpVJNT-x`)!ZYNu$1Td_Dh*a8DU8rp*X0A~`CirohYIFgL{ z0-jI=Sqt61wvb=>gE3=rgRv!3Gmh2(@^V8k6k;<7bbv?Y>fMCYVao(%F_&Utlva!v ziBlyat*xN|ovm^t^Q!;Jr9*BEe1I&vjg1!x% zq$teB1`VdX#5dA}CE~5(0h?h=?K08O!6VNTsD0RY5-rsGQ}kUCr!^5wz$BYvkqw9v zn+q%i3503Fz&mubP3*Mk6b9olFA|K5g!!ZXB*S5f0fHeL)XG`JsH0jD*`#+S5Hk=< zbV_jrTicRRW9cX;ov+5|broZ&c9d--Jm?4`Y-0w-q)bX_cY(Rv7!05;=~6&OdlP7g zn4)IEBBiFYLLDes?PU>Nfx>=rnEKux!JY%v=A~MVZ60B7lqxCl+anuMd59ZL#@kGs z{ec#5GGww}+6cYl1-Zk;=MSJlHyd$k4W(%lG1Y3Kti z3u&{=F=$abus9t!Hyt=H9axeMoSzO%8>NNmBx!TWF_B-K4lGWeq_k-&PMfIWw5cji zo2=rr>CzjMj)`t@+LRTiOO0}8nGcMjox`_(>5<{+UBKA+q|@Co0m3i*r}K<4r$X? zk~VE6Y13AcHf<$o(^ir;Z6#^bR+2VtC27-Ek~VE6Y11}8ZQACiP22pmX`7!mZS&Kn zZGPIc%}<-Q`DxQOKW*CPr%l^}v}s$AHf;;irfosmv@J-RwgqX^wjgcV7Nkwvg0yK{ zkTz`#)23}<+O#c9o3@2%)3z{e+7`}N;Yh6A^m)49!eA+s>eTF3!=n2ZzK2-KZ8M|T zy%tX-TUzwPNG#Bb0e>LoNwj->*gT5P)#LF;JguQfvp3}NC(uiJyvYu9nC;O}AQA9m zh>=#p(}L$54~_gfJs6_II`LIG?D+JU#}AJu#f2@T!Nf38jPVhjWTIseh5^{R+uVt9 zIGlQL3##26)OABoz_4ftPZAvMA{zD=R!6xUe(YQ(4Vmb;WAsSzfzp z8FsadWFXeLMh{ivsqBi&_4`nY)R-)LNwwYid-@p3i{~5r4jngqZ$W` z&AQmxxOlOrCGPWvhx9L`hbnATMw#ol(|{GvVadR-;5vNG9t`$8;KVv%9W)5XzUH|3 zry&xoLp81rph)6vD*~O(5pT?2XP!EcWITtg3B)#Hcu2`#U$+vb=?zuuM^2B2#){az zia|LF3wwIagRG*h+8d+8;(-v%Q%ap4+r`!-kXx;g3?_!lq3FsfZz>|2!ga7B#LXLw zOBrYb)d|-_z(B%-Vfm(@KhdTd*M{k-sXl_ZNpy9=)$^d-6c=;`TY?xNV6ZEhGng%& zjowf)V16-Nj|RfSBiE9sz*B>X`&t;f!p2rSWeyjjJR6LKi4^ixHR_ak<8jJ7F*q*c zL8~=ps2baw8}MWzF>i>FtCpVXsm!^&*=E-SsZz6|7Gy_!SajlT!IlI)Jv6RDaw>xH zC?2q|>$sr~+qR|UXsAP;hXV~XW1%*-q_Jdcn{wltWRx~f$7>@#FZ{r&skT*iAdYxC zk0ukoVX>eJKMX)T>5&mN&*bS~?JSQ(JIi3ugO9ZksR&T3CAoo#lUT?q8J(WAsX;r3 zZRf^Fbs3nPTBe^qv{9$#G=-%fG&nySjV*GnMbWy(ho^(egG`C2m?W1EhDROPSRM>} zLztf!mU^;B2Oo(6s$DtGX)tD^gQ13rZm4y^qfa}0 zP-C^cTh^yCR;4(5hTN9XbA11~T?gBBi-`opw)Jk9Yq zo9AG6fX+*wgV4C9Gwefg4JC06ro>EYJ>Bx+HBJ6aR9;mTVQ zREaA)66oFHx?!f?N}76@1Ue_<7%GS(al4Bu!9<^mPl;FFwNTXi%m<2dD}RR5YRU1UaHE6tfxtz z)L?bhLa3Ocj)cS{q|p9q-QT02OxMY|C>4s^ zR%zPoo|~rOrAsl@7Gp>{aEC`J?cU%}^~0la^q4*#29Ss(hia2Cq-}ZJ`E=1|v5-6d%0o*wCIY7c{ZjJ>u z3WttKl6z#O+!73%8Fa_cGwZPpzg7C*lat|<-c)0`oxbQ$M!JN`dH{nOS-B@V1^*-Q zFa8&?f1#z|rC#zLSg-}SN%h~s{)J8zL8h{vP2d{Kzno(t)GdNcZU5_mAHlcgCH}n} zzEBB&1pBw+?*)#f`Ge`F;|A#xT95U^bWs{9pT$33_vtH$U-Ba1FT#6Rx`eih2Lo#z ze5=W&_{BGr2IJqu3pIqELV@Cv_)9oKuLAGiDgJwLR0v%{>y7i6_%p1}YNI?AefeZi zxP&$>Hf{-Dk|XKA4Q%qi%!sLIgSip93$IY=BLC#a_J0>JN}}i=eBa9NT{$|CFqd8a zcK}ZH?`D5OyCgvNpKsB7E&uW!Sm<>z_F(xF^gEV+S>G#^%}2y_UJW{M^C0_|{Fil~ zLZh62;>RsFOdkWK^oxI4k1w>u$}r2Req#CG#TF{`cC4dFy{zn1FN29C-ntHuTt4qp z%|D4^HB{c(k>VCTv<((Zln4FG{)|cgp?_N5L?Lmt9X!Xw&HkH&0U5g7`giE(C~nF2 zL`?Q4bkRA4xav7$ss7U?@fJIxb8J$>KQPDmJ8-I@GmN*vU-2(=gyny5--O%vueS%y~T z$t`V<$PnGd{twJFD4F4C2#eiH|1k=<*q)Izza7__knRvcX4>IXcbm@tgs&LM&6Wqt Gss1n0iU2$S diff --git a/.local/src2/dwm/dwm.1 b/.local/src2/dwm/dwm.1 deleted file mode 100644 index 94dbd945d..000000000 --- a/.local/src2/dwm/dwm.1 +++ /dev/null @@ -1,214 +0,0 @@ -.TH DWM 1 dwm\-VERSION -.SH NAME -dwm \- dynamic window manager (Luke Smith 's build) -.SH SYNOPSIS -.B dwm -.RB [ \-v ] -.SH DESCRIPTION -dwm is a dynamic window manager for X. -.P -dwm "orders" windows based on recency and primacy, while dwm layouts may -change, the most recent "master" window is shown in the most prominent -position. There are bindings for cycling through and promoting windows to the -master position. -.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. -.P -.I -libxft-bgra -should be installed for this build of dwm. Arch users may install it via the -AUR. Color characters and emoji are enabled, but these will cause crashes -without the fix -.I -libxft-bgra -offers. -.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 Left click -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 Right click -click on a tag label adds/removes all windows with that tag to/from the view. -.TP -.B Super\-Left click -click on a tag label applies that tag to the focused window. -.TP -.B Super\-Right click -click on a tag label adds/removes that tag to/from the focused window. -.SS Keyboard commands -.TP -.B Super\-Return -Start terminal, -.BR st(1). -.TP -.B Super\-d -Spawn -.BR dmenu(1) -for launching other programs. -.TP -.B Super\-b -Toggles bar on and off. -.TP -.B Super\-q -Close focused window. -.TP -.B Super\-t/T -Sets tiled/bstack layouts. -.TP -.B Super\-f -Toggle fullscreen window. -.TP -.B Super\-F -Toggle floating layout. -.TP -.B Super\-y/Y -Sets Fibonacci spiral/dwinde layouts. -.TP -.B Super\-u/U -Sets centered master layout. -.TP -.B Super\-i/I -Sets centered master or floating master layouts. -.TP -.B Super\-space -Zooms/cycles focused window to/from master area. -.TP -.B Super\-j/k -Focus next/previous window. -.TP -.B Super\-Shift\-j/k -Move selected window down/up in stack. -.TP -.B Super\-o/O -Increase/decrease number of windows in master area. -.TP -.B Super\-l -Increase master area size. -.TP -.B Super\-h -Decrease master area size. -.TP -.B Super\-Shift\-space -Toggle focused window between tiled and floating state. -.TP -.B Super\-Tab -Toggles to the previously selected tags. -.TP -.B Super\-g -Moves to the previous tag. -.TP -.B Super\-Shift\-g -Moves selected window to the previous tag. -.TP -.B Super\-; -Moves to the next tag. -.TP -.B Super\-Shift\-; -Moves selected window to the next tag. -.TP -.B Super\-PageUp -Moves to the previous tag. -.TP -.B Super\-Shift\-PageUp -Moves selected window to the previous tag. -.TP -.B Super\-Pagedown -Moves to the next tag. -.TP -.B Super\-Shift\-PageDown -Moves selected window to the next tag. -.TP -.B Super\-a -Toggle gaps. -.TP -.B Super\-z -Increase gaps between windows. -.TP -.B Super\-x -Decrease gaps between windows. -.TP -.B Super\-Shift\-[1..n] -Apply nth tag to focused window. -.TP -.B Super\-Shift\-0 -Apply all tags to focused window. -.TP -.B Super\-Control\-Shift\-[1..n] -Add/remove nth tag to/from focused window. -.TP -.B Super\-[1..n] -View all windows with nth tag. -.TP -.B Super\-0 -View all windows with any tag. -.TP -.B Super\-Control\-[1..n] -Add/remove all windows with nth tag to/from the view. -.TP -.B Super\-Shift\-q -Quit dwm. -.TP -.B Mod1\-Control\-Shift\-q -Menu to refresh/quit/reboot/shutdown. -.SS Mouse commands -.TP -.B Super\-Left click -Move focused window while dragging. Tiled windows will be toggled to the floating state. -.TP -.B Super\-Middle click -Toggles focused window between floating and tiled state. -.TP -.B Super\-Right click -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 SIGNALS -.TP -.B SIGHUP - 1 -Restart the dwm process. -.TP -.B SIGTERM - 15 -Cleanly terminate the dwm process. -.SH SEE ALSO -.BR dmenu (1), -.BR st (1) -.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/.local/src2/dwm/dwm.c b/.local/src2/dwm/dwm.c deleted file mode 100644 index 4f3faff34..000000000 --- a/.local/src2/dwm/dwm.c +++ /dev/null @@ -1,2690 +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 -#include -#include -#ifdef XINERAMA -#include -#endif /* XINERAMA */ -#include -#include -#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 GETINC(X) ((X) - 2000) -#define INC(X) ((X) + 2000) -#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 ISINC(X) ((X) > 1000 && (X) < 3000) -#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags]) || C->issticky) -#define PREVSEL 3000 -#define LENGTH(X) (sizeof X / sizeof X[0]) -#define MOUSEMASK (BUTTONMASK|PointerMotionMask) -#define MOD(N,M) ((N)%(M) < 0 ? (N)%(M) + (M) : (N)%(M)) -#define WIDTH(X) ((X)->w + 2 * (X)->bw) -#define HEIGHT(X) ((X)->h + 2 * (X)->bw) -#define NUMTAGS (LENGTH(tags) + LENGTH(scratchpads)) -#define TAGMASK ((1 << NUMTAGS) - 1) -#define SPTAG(i) ((1 << LENGTH(tags)) << (i)) -#define SPTAGMASK (((1 << LENGTH(scratchpads))-1) << LENGTH(tags)) -#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) -#define XRDB_LOAD_COLOR(R,V) if (XrmGetResource(xrdb, R, NULL, &type, &value) == True) { \ - if (value.addr != NULL && strnlen(value.addr, 8) == 7 && value.addr[0] == '#') { \ - int i = 1; \ - for (; i <= 6; i++) { \ - if (value.addr[i] < 48) break; \ - if (value.addr[i] > 57 && value.addr[i] < 65) break; \ - if (value.addr[i] > 70 && value.addr[i] < 97) break; \ - if (value.addr[i] > 102) break; \ - } \ - if (i == 7) { \ - strncpy(V, value.addr, 7); \ - V[7] = '\0'; \ - } \ - } \ - } -#define TRUNC(X,A,B) (MAX((A), MIN((X), (B)))) - -/* 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, ClkWinTitle, - 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, isterminal, noswallow, issticky; - pid_t pid; - Client *next; - Client *snext; - Client *swallowing; - Monitor *mon; - Window win; -}; - -typedef struct { - unsigned int mod; - KeySym keysym; - void (*func)(const Arg *); - const Arg arg; -} Key; - -typedef struct { - const char *symbol; - void (*arrange)(Monitor *); -} Layout; - -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 gappih; /* horizontal gap between windows */ - int gappiv; /* vertical gap between windows */ - int gappoh; /* horizontal outer gaps */ - int gappov; /* vertical outer gaps */ - unsigned int seltags; - unsigned int sellt; - unsigned int tagset[2]; - int showbar; - int topbar; - Client *clients; - Client *sel; - Client *stack; - Monitor *next; - Window barwin; - const Layout *lt[2]; -}; - -typedef struct { - const char *class; - const char *instance; - const char *title; - unsigned int tags; - int isfloating; - int isterminal; - int noswallow; - int monitor; -} Rule; - -/* Xresources preferences */ -enum resource_type { - STRING = 0, - INTEGER = 1, - FLOAT = 2 -}; - -typedef struct { - char *name; - enum resource_type type; - void *dst; -} ResourcePref; - -/* 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 void copyvalidchars(char *text, char *rawtext); -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 Atom getatomprop(Client *c, Atom prop); -static int getrootptr(int *x, int *y); -static long getstate(Window w); -static int gettextprop(Window w, Atom atom, char *text, unsigned int size); -static void grabbuttons(Client *c, int focused); -static void grabkeys(void); -static void incnmaster(const Arg *arg); -static void keypress(XEvent *e); -static void killclient(const Arg *arg); -static void loadxrdb(void); -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 pushstack(const Arg *arg); -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 runAutostart(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 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); -#ifndef __OpenBSD__ -static int getdwmblockspid(); -static void sigdwmblocks(const Arg *arg); -#endif -static void sighup(int unused); -static void sigterm(int unused); -static void spawn(const Arg *arg); -static int stackpos(const Arg *arg); -static void tag(const Arg *arg); -static void tagmon(const Arg *arg); -static void togglebar(const Arg *arg); -static void togglefloating(const Arg *arg); -static void togglescratch(const Arg *arg); -static void togglesticky(const Arg *arg); -static void togglefullscr(const Arg *arg); -static void toggletag(const Arg *arg); -static void toggleview(const Arg *arg); -static void unfocus(Client *c, int setfocus); -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 xrdb(const Arg *arg); -static void zoom(const Arg *arg); -static void load_xresources(void); -static void resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst); - -static pid_t getparentprocess(pid_t p); -static int isdescprocess(pid_t p, pid_t c); -static Client *swallowingclient(Window w); -static Client *termforwin(const Client *c); -static pid_t winpid(Window w); - - -/* variables */ -static const char broken[] = "broken"; -static char stext[256]; -static char rawstext[256]; -static int dwmblockssig; -pid_t dwmblockspid = 0; -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 restart = 0; -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; - -static xcb_connection_t *xcon; - -/* configuration, allows nested code to access above variables */ -#include "config.h" - -/* 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->isterminal = r->isterminal; - c->isfloating = r->isfloating; - c->noswallow = r->noswallow; - c->tags |= r->tags; - if ((r->tags & SPTAGMASK) && r->isfloating) { - c->x = c->mon->wx + (c->mon->ww / 2 - WIDTH(c) / 2); - c->y = c->mon->wy + (c->mon->wh / 2 - HEIGHT(c) / 2); - } - - 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] & ~SPTAGMASK); -} - -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 -swallow(Client *p, Client *c) -{ - if (c->noswallow || c->isterminal) - return; - if (!swallowfloating && c->isfloating) - return; - - detach(c); - detachstack(c); - - setclientstate(c, WithdrawnState); - XUnmapWindow(dpy, p->win); - - p->swallowing = c; - c->mon = p->mon; - - Window w = p->win; - p->win = c->win; - c->win = w; - updatetitle(p); - - XWindowChanges wc; - wc.border_width = p->bw; - XConfigureWindow(dpy, p->win, CWBorderWidth, &wc); - XMoveResizeWindow(dpy, p->win, p->x, p->y, p->w, p->h); - XSetWindowBorder(dpy, p->win, scheme[SchemeNorm][ColBorder].pixel); - - arrange(p->mon); - configure(p); - updateclientlist(); -} - -void -unswallow(Client *c) -{ - c->win = c->swallowing->win; - - free(c->swallowing); - c->swallowing = NULL; - - /* unfullscreen the client */ - setfullscreen(c, 0); - updatetitle(c); - arrange(c->mon); - XMapWindow(dpy, c->win); - - XWindowChanges wc; - wc.border_width = c->bw; - XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); - XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); - XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); - - setclientstate(c, NormalState); - focus(NULL); - arrange(c->mon); -} - -void -buttonpress(XEvent *e) -{ - unsigned int i, x, click, occ = 0; - 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; - for (c = m->clients; c; c = c->next) - occ |= c->tags == 255 ? 0 : c->tags; - do { - /* do not reserve space for vacant tags */ - if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) - continue; - 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 if (ev->x > (x = selmon->ww - TEXTW(stext) + lrpad)) { - click = ClkStatusText; - - char *text = rawstext; - int i = -1; - char ch; - dwmblockssig = 0; - while (text[++i]) { - if ((unsigned char)text[i] < ' ') { - ch = text[i]; - text[i] = '\0'; - x += TEXTW(text) - lrpad; - text[i] = ch; - text += i+1; - i = -1; - if (x >= ev->x) break; - dwmblockssig = ch; - } - } - } else - click = ClkWinTitle; - } 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); -} - -void -copyvalidchars(char *text, char *rawtext) -{ - int i = -1, j = 0; - - while(rawtext[++i]) { - if ((unsigned char)rawtext[i] >= ' ') { - text[j++] = rawtext[i]; - } - } - text[j] = '\0'; -} - -Monitor * -createmon(void) -{ - Monitor *m; - - 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->gappih = gappih; - m->gappiv = gappiv; - m->gappoh = gappoh; - m->gappov = gappov; - m->lt[0] = &layouts[0]; - m->lt[1] = &layouts[1 % LENGTH(layouts)]; - strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); - return m; -} - -void -destroynotify(XEvent *e) -{ - Client *c; - XDestroyWindowEvent *ev = &e->xdestroywindow; - - if ((c = wintoclient(ev->window))) - unmanage(c, 1); - - else if ((c = swallowingclient(ev->window))) - unmanage(c->swallowing, 1); -} - -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, tw = 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]); - tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ - drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); - } - - for (c = m->clients; c; c = c->next) { - occ |= c->tags == 255 ? 0 : c->tags; - if (c->isurgent) - urg |= c->tags; - } - x = 0; - for (i = 0; i < LENGTH(tags); i++) { - /* do not draw vacant tags */ - if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) - continue; - - w = TEXTW(tags[i]); - drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); - 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 - tw - 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); -} - -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->issticky && !selmon->sel->issticky)); c = c->snext); - - if (!c) /* No windows found; check for available stickies */ - 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) -{ - int i = stackpos(arg); - Client *c, *p; - - if (i < 0 || !selmon->sel || selmon->sel->isfullscreen) - return; - - for(p = NULL, c = selmon->clients; c && (i || !ISVISIBLE(c)); - i -= ISVISIBLE(c) ? 1 : 0, p = c, c = c->next); - focus(c ? c : p); - 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; -} - -#ifndef __OpenBSD__ -int -getdwmblockspid() -{ - char buf[16]; - FILE *fp = popen("pidof -s dwmblocks", "r"); - fgets(buf, sizeof(buf), fp); - pid_t pid = strtoul(buf, NULL, 10); - pclose(fp); - dwmblockspid = pid; - return pid != 0 ? 0 : -1; -} -#endif - -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 = 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 -loadxrdb() -{ - Display *display; - char * resm; - XrmDatabase xrdb; - char *type; - XrmValue value; - - display = XOpenDisplay(NULL); - - if (display != NULL) { - resm = XResourceManagerString(display); - - if (resm != NULL) { - xrdb = XrmGetStringDatabase(resm); - - if (xrdb != NULL) { - XRDB_LOAD_COLOR("dwm.color0", normbordercolor); - XRDB_LOAD_COLOR("dwm.color0", normbgcolor); - XRDB_LOAD_COLOR("dwm.color4", normfgcolor); - XRDB_LOAD_COLOR("dwm.color8", selbordercolor); - XRDB_LOAD_COLOR("dwm.color4", selbgcolor); - XRDB_LOAD_COLOR("dwm.color0", selfgcolor); - } - } - } - - XCloseDisplay(display); -} - -void -manage(Window w, XWindowAttributes *wa) -{ - Client *c, *t = NULL, *term = NULL; - Window trans = None; - XWindowChanges wc; - - c = ecalloc(1, sizeof(Client)); - c->win = w; - c->pid = winpid(w); - /* geometry */ - c->x = c->oldx = wa->x; - c->y = c->oldy = wa->y; - c->w = c->oldw = wa->width; - c->h = c->oldh = wa->height; - c->oldbw = wa->border_width; - - updatetitle(c); - if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) { - c->mon = t->mon; - c->tags = t->tags; - } else { - c->mon = selmon; - applyrules(c); - term = termforwin(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); - c->x = c->mon->mx + (c->mon->mw - WIDTH(c)) / 2; - c->y = c->mon->my + (c->mon->mh - HEIGHT(c)) / 2; - 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(selmon->sel && selmon->sel->isfullscreen && !c->isfloating) - setfullscreen(selmon->sel, 0); - if (c->mon == selmon) - unfocus(selmon->sel, 0); - c->mon->sel = c; - arrange(c->mon); - XMapWindow(dpy, c->win); - if (term) - swallow(term, c); - 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; - int oh, ov, ih, iv; - Client *c; - - getgaps(m, &oh, &ov, &ih, &iv, &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 + ov, m->wy + oh, m->ww - 2 * c->bw - 2 * ov, m->wh - 2 * c->bw - 2 * oh, 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 -pushstack(const Arg *arg) { - int i = stackpos(arg); - Client *sel = selmon->sel, *c, *p; - - if(i < 0 || !sel) - return; - else if(i == 0) { - detach(sel); - attach(sel); - } - else { - for(p = NULL, c = selmon->clients; c; p = c, c = c->next) - if(!(i -= (ISVISIBLE(c) && c != sel))) - break; - c = c ? c : p; - detach(sel); - sel->next = c->next; - c->next = sel; - } - arrange(selmon); -} - -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 (c == c->mon->sel) - drawbar(c->mon); - } - if (ev->atom == netatom[NetWMWindowType]) - updatewindowtype(c); - } -} - -void -quit(const Arg *arg) -{ - if(arg->i) restart = 1; - running = 0; -} - -Monitor * -recttomon(int x, int y, int w, int h) -{ - Monitor *m, *r = selmon; - int a, area = 0; - - for (m = mons; m; m = m->next) - if ((a = INTERSECT(x, y, w, h, m)) > area) { - area = a; - r = m; - } - return r; -} - -void -resize(Client *c, int x, int y, int w, int h, int interact) -{ - if (applysizehints(c, &x, &y, &w, &h, interact)) - resizeclient(c, x, y, w, h); -} - -void -resizeclient(Client *c, int x, int y, int w, int h) -{ - XWindowChanges wc; - - c->oldx = c->x; c->x = wc.x = x; - c->oldy = c->y; c->y = wc.y = y; - c->oldw = c->w; c->w = wc.width = w; - c->oldh = c->h; c->h = wc.height = h; - wc.border_width = c->bw; - XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); - configure(c); - XSync(dpy, False); -} - -void -resizemouse(const Arg *arg) -{ - int ocx, ocy, nw, nh; - 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 -runAutostart(void) { - system("killall -q dwmblocks; dwmblocks &"); -} - -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); - } -} - -int -stackpos(const Arg *arg) { - int n, i; - Client *c, *l; - - if(!selmon->clients) - return -1; - - if(arg->i == PREVSEL) { - for(l = selmon->stack; l && (!ISVISIBLE(l) || l == selmon->sel); l = l->snext); - if(!l) - return -1; - for(i = 0, c = selmon->clients; c != l; i += ISVISIBLE(c) ? 1 : 0, c = c->next); - return i; - } - else if(ISINC(arg->i)) { - if(!selmon->sel) - return -1; - for(i = 0, c = selmon->clients; c != selmon->sel; i += ISVISIBLE(c) ? 1 : 0, c = c->next); - for(n = i; c; n += ISVISIBLE(c) ? 1 : 0, c = c->next); - return MOD(i + GETINC(arg->i), n); - } - else if(arg->i < 0) { - for(i = 0, c = selmon->clients; c; i += ISVISIBLE(c) ? 1 : 0, c = c->next); - return MAX(i + arg->i, 0); - } - else - return arg->i; -} - -void -setlayout(const Arg *arg) -{ - if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) - selmon->sellt ^= 1; - if (arg && arg->v) - selmon->lt[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.05 || f > 0.95) - return; - selmon->mfact = f; - arrange(selmon); -} - -void -setup(void) -{ - int i; - XSetWindowAttributes wa; - Atom utf8string; - - /* clean up any zombies immediately */ - sigchld(0); - - signal(SIGHUP, sighup); - signal(SIGTERM, sigterm); - - /* 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)) { - if ((c->tags & SPTAGMASK) && c->isfloating) { - c->x = c->mon->wx + (c->mon->ww / 2 - WIDTH(c) / 2); - c->y = c->mon->wy + (c->mon->wh / 2 - HEIGHT(c) / 2); - } - /* 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 -sighup(int unused) -{ - Arg a = {.i = 1}; - quit(&a); -} - -void -sigterm(int unused) -{ - Arg a = {.i = 0}; - quit(&a); -} - -#ifndef __OpenBSD__ -void -sigdwmblocks(const Arg *arg) -{ - union sigval sv; - sv.sival_int = 0 | (dwmblockssig << 8) | arg->i; - if (!dwmblockspid) - if (getdwmblockspid() == -1) - return; - - if (sigqueue(dwmblockspid, SIGUSR1, sv) == -1) { - if (errno == ESRCH) { - if (!getdwmblockspid()) - sigqueue(dwmblockspid, SIGUSR1, sv); - } - } -} -#endif - -void -spawn(const Arg *arg) -{ - 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 -togglebar(const Arg *arg) -{ - selmon->showbar = !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 -togglefullscr(const Arg *arg) -{ - if(selmon->sel) - setfullscreen(selmon->sel, !selmon->sel->isfullscreen); -} - -void -togglesticky(const Arg *arg) -{ - if (!selmon->sel) - return; - selmon->sel->issticky = !selmon->sel->issticky; - arrange(selmon); -} - -void -togglescratch(const Arg *arg) -{ - Client *c; - unsigned int found = 0; - unsigned int scratchtag = SPTAG(arg->ui); - Arg sparg = {.v = scratchpads[arg->ui].cmd}; - - for (c = selmon->clients; c && !(found = c->tags & scratchtag); c = c->next); - if (found) { - unsigned int newtagset = selmon->tagset[selmon->seltags] ^ scratchtag; - if (newtagset) { - selmon->tagset[selmon->seltags] = newtagset; - focus(NULL); - arrange(selmon); - } - if (ISVISIBLE(c)) { - focus(c); - restack(selmon); - } - } else { - selmon->tagset[selmon->seltags] |= scratchtag; - spawn(&sparg); - } -} - -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); - - if (newtagset) { - selmon->tagset[selmon->seltags] = newtagset; - 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; - - if (c->swallowing) { - unswallow(c); - return; - } - - Client *s = swallowingclient(c->win); - if (s) { - free(s->swallowing); - s->swallowing = NULL; - arrange(m); - focus(NULL); - return; - } - - detach(c); - detachstack(c); - if (!destroyed) { - wc.border_width = c->oldbw; - XGrabServer(dpy); /* avoid race conditions */ - XSetErrorHandler(xerrordummy); - XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */ - XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - setclientstate(c, WithdrawnState); - XSync(dpy, False); - XSetErrorHandler(xerror); - XUngrabServer(dpy); - } - free(c); - - if (!s) { - arrange(m); - focus(NULL); - updateclientlist(); - } -} - -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, rawstext, sizeof(rawstext))) - strcpy(stext, "dwm-"VERSION); - else - copyvalidchars(stext, rawstext); - 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) -{ - 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; - focus(NULL); - arrange(selmon); -} - -pid_t -winpid(Window w) -{ - pid_t result = 0; - - xcb_res_client_id_spec_t spec = {0}; - spec.client = w; - spec.mask = XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID; - - xcb_generic_error_t *e = NULL; - xcb_res_query_client_ids_cookie_t c = xcb_res_query_client_ids(xcon, 1, &spec); - xcb_res_query_client_ids_reply_t *r = xcb_res_query_client_ids_reply(xcon, c, &e); - - if (!r) - return (pid_t)0; - - xcb_res_client_id_value_iterator_t i = xcb_res_query_client_ids_ids_iterator(r); - for (; i.rem; xcb_res_client_id_value_next(&i)) { - spec = i.data->spec; - if (spec.mask & XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID) { - uint32_t *t = xcb_res_client_id_value_value(i.data); - result = *t; - break; - } - } - - free(r); - - if (result == (pid_t)-1) - result = 0; - return result; -} - -pid_t -getparentprocess(pid_t p) -{ - unsigned int v = 0; - -#if defined(__linux__) - FILE *f; - char buf[256]; - snprintf(buf, sizeof(buf) - 1, "/proc/%u/stat", (unsigned)p); - - if (!(f = fopen(buf, "r"))) - return (pid_t)0; - - if (fscanf(f, "%*u %*s %*c %u", (unsigned *)&v) != 1) - v = (pid_t)0; - fclose(f); -#elif defined(__FreeBSD__) - struct kinfo_proc *proc = kinfo_getproc(p); - if (!proc) - return (pid_t)0; - - v = proc->ki_ppid; - free(proc); -#endif - return (pid_t)v; -} - -int -isdescprocess(pid_t p, pid_t c) -{ - while (p != c && c != 0) - c = getparentprocess(c); - - return (int)c; -} - -Client * -termforwin(const Client *w) -{ - Client *c; - Monitor *m; - - if (!w->pid || w->isterminal) - return NULL; - - for (m = mons; m; m = m->next) { - for (c = m->clients; c; c = c->next) { - if (c->isterminal && !c->swallowing && c->pid && isdescprocess(c->pid, w->pid)) - return c; - } - } - - return NULL; -} - -Client * -swallowingclient(Window w) -{ - Client *c; - Monitor *m; - - for (m = mons; m; m = m->next) { - for (c = m->clients; c; c = c->next) { - if (c->swallowing && c->swallowing->win == w) - return c; - } - } - - return NULL; -} - -Client * -wintoclient(Window w) -{ - 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 -xrdb(const Arg *arg) -{ - loadxrdb(); - int i; - for (i = 0; i < LENGTH(colors); i++) - scheme[i] = drw_scm_create(drw, colors[i], 3); - focus(NULL); - arrange(NULL); -} - -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); -} - -void -resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst) -{ - char *sdst = NULL; - int *idst = NULL; - float *fdst = NULL; - - sdst = dst; - idst = dst; - fdst = dst; - - char fullname[256]; - char *type; - XrmValue ret; - - snprintf(fullname, sizeof(fullname), "%s.%s", "dwm", name); - fullname[sizeof(fullname) - 1] = '\0'; - - XrmGetResource(db, fullname, "*", &type, &ret); - if (!(ret.addr == NULL || strncmp("String", type, 64))) - { - switch (rtype) { - case STRING: - strcpy(sdst, ret.addr); - break; - case INTEGER: - *idst = strtoul(ret.addr, NULL, 10); - break; - case FLOAT: - *fdst = strtof(ret.addr, NULL); - break; - } - } -} - -void -load_xresources(void) -{ - Display *display; - char *resm; - XrmDatabase db; - ResourcePref *p; - - display = XOpenDisplay(NULL); - resm = XResourceManagerString(display); - if (!resm) - return; - - db = XrmGetStringDatabase(resm); - for (p = resources; p < resources + LENGTH(resources); p++) - resource_load(db, p->name, p->type, p->dst); - XCloseDisplay(display); -} - -int -main(int argc, char *argv[]) -{ - if (argc == 2 && !strcmp("-v", argv[1])) - die("dwm-"VERSION); - else if (argc != 1) - die("usage: dwm [-v]"); - if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) - fputs("warning: no locale support\n", stderr); - if (!(dpy = XOpenDisplay(NULL))) - die("dwm: cannot open display"); - if (!(xcon = XGetXCBConnection(dpy))) - die("dwm: cannot get xcb connection\n"); - checkotherwm(); - XrmInitialize(); - load_xresources(); - setup(); -#ifdef __OpenBSD__ - if (pledge("stdio rpath proc exec", NULL) == -1) - die("pledge"); -#endif /* __OpenBSD__ */ - scan(); - runAutostart(); - run(); - if(restart) execvp(argv[0], argv); - cleanup(); - XCloseDisplay(dpy); - return EXIT_SUCCESS; -} - diff --git a/.local/src2/dwm/dwm.o b/.local/src2/dwm/dwm.o deleted file mode 100644 index 86866f27a802ac59989efc90e00fe1cc6233d29f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98504 zcmeFa3wTsTnm>Fx9Wh+&j!x9*FxpC^2@*&vYFbcppc_uKfdE0mO$bRKk&wi6Hv}&b zr-^VpM%__Yo!Qx8|KsksI~SeNbx<4(guAx@UQl-wUB~U%UJz!u=xBexx9Y7AxXz_Bgh-;c2U zy8m#%9oiWv+@^1$aNTWmyC2`?@4EdIvkOHtEVB)8;^!gr;C$4KC}M1H(y%7ip>XbX zD^W7*>^r{LG!&9uZCKM#1AE--763M^e-Prk1>$?Qa>PGyEj*K|1yj_*D~5ksbL4a1 ze#5`pz3w8B@ClJ{O}Q1>QaR!YO87kfY0=YsNfv*p`@vmYQI0PX+dJ+$`>)C59VcHt z6=hui6T~&FHO;)!v zy3Ef}hs09Anu3(Kt*;!hiI^H7+9`WLziu_88XR zSIUz_ZLec5YAE4E6`0+qk26s;&1l~rDTeY>jYQ5vA@2ikqz!`&|1%qLAIVcX{YS(4 zQ5%vZUhs9MC-kk^+{yDJAa|Rpoa+1O_#`HhGF$fzE+hT zSy-suo0_9u_p^s`!sj77m4Rf*Kt85ZFqSyY*m@!-cF1A26YIXtV@^k8FzWr*9L@be zr`f)kN@Bh{Z~j8TN9Fv5U9)H1pz@OH--l`07LE3|BQp(aIcngONU71$PUXAF!Rem4 z07WY2#-l%zg(rQJ2Y=Hk%`>cDw;|Qs#Ad_#NgF~F|4!K(v5#RoAId=x>5LFYjbUYv zEFc1Az+35quAYJi%?x?V%gjTDS>c5`Jd}$h&uChfwkz9vmWW*8EwLUl02}5mN}7+D zrD%A#7<7qvJ@ltQR-y&kHO3_}r^qQ1jBT&$nq`<@g012{Y!q1QiAVGI;_o;plwcL4 zv%yzR0ND*Q*XJXOwSE{ye2D%&dp_~Kez<^%Ve?-4Ynbnu>pcR@!{30po-XEkuYg1e zWZi;lu4K%7H@@#{SX_zwj-|>_&`%kP=XbU5nXQ}qp9Mi}mi03t>7KSX*xng%Pus@5 zR!83VgJ?yw0@BFp{?BjE4Ol-T1_S2Hy5m5g@Er~d`uB-2Vl!y&MOd)#tw6_cU(mM) z4^ujZ=fbppPPp6HmjKDi;(%q81RZaJ?Ap^(R2>J1rZLW{gq40F;6H${$BC-rwZepM zz6Fww1G@ih-97avQ4KiW(*65_?y38vEztelFzDO-``n?u+|NYMk3C-r3R?6mtGvRn z)^*=U+7N4n&bJRi0Cc55T-KN3a@3vsGYwail+b{6?`R72Z;K9b&*^lJJ-8}2(SW-^ z;hVw2-FRMEgCzH6Ba#T;y|V16d(_sWx_eZ&yWr4K_l@tn$G*4ntfTI^dyl&3?K$GE z6n)ka_vk%|^AOza9(!QrnF#Jea3_L=G9L-JM|V=LgJee5&x(-)+S#e*?njP)S-8*o z**FOd4w#)l^uli4@q%?PmBCtHg1@@|1&HZ|pkr&mS|0!q^lycvw!%uD;@|3?zS~+q zfk<>lPSyRW`01T~p}o;_1Ad{M(bN4x9ixK-exZSpA@c*~{)IhXptC{S)aU3o=(A}U z@YmV1L__VU@P>>Iw8K7agPLeZ#A}2Q5(sq!ycO}zgfVSz;WA8Zv zg?lIsXj3cof_jVp^>8Ctsz5E~hP=74q+{hJ9eIPFC)-u{8tQik>TBy!_vmFBEnK%o81X1p)ImZ-H*^>XKX643Px9!=dot6y&!a zg@zwal%{wQv0f0dJR%mcC1M>+oJ$nYd_ch~!iYf;)}6+mPx03i!9WwT8%}I^!70?p z6DT|!EZhg#PJrEtpMtn$=FUkS*@FR%>&U(WmlCAO!L``eiND!X+mE@|-ApYBs+xyU z#vnh;dALcI1T-h8(&UOJ?T>h~Tb%AWdvxngvZ%zP*#i?8Fux9&$2;RurD?~J#6kxc5=J(NJV{*i25N8WV-$43st>UkToL`K<#ubZD2?kjEk(1AD; zOQf`rqZF8bYd8n>Czx^U7ummw)CH+*bHEHZ>COBvCv7v&NmL<=aUu(^$|BDui_xhp ziZiqLk$o1$W!9E96ehmvC@KsRM~(E{DY`M6&X-0;`a=CieUY?2=CO1GWRUGCHeiKD z_c1^v(f}2Z0rHXo8W+D7IR?=Dyg?cwzXT>w*wJKfP=HVL&D7GNJO#pjICeTZ%MiIv zhq0Le)yOIAGIu*V(H4dk?ub8gglM5<(YS)hts!#jshT>5Y5K7pj)>cgKcXN1(!YD{ zsGjcuhrtk!?t4zblio2Usrz??D=&csltE@!;!FkWmo#{bB>{6sz>LQZIb$cXqV8b( zvFJRiBga7u)5~KgoYAv@5fU8@eu{yAq&xN}rprW8^yd^>968ky*B#pu<8dk6mO%PM zLF|Mhnj?uNzE9+bQcM|7D1zf4Qb)3plfQ6hVp_2MlW4IH%NRLNN6ZrBms8k%iPV@* zwAZSi3>3-qUOw=l*P-r?p} z49M~gn8n<98Tt$ZwU8@o$FQCkx-7{0jYP;u8 z_+#BiqmB0c(I4=*)M}+s$BDF2M=PbaHa|?Un>--mh@5T3a`0%z@(I)-cvAqFa(NLU zE0S-;#JDjg28;T*0Mt()2+fY1X~o3wG3F7;OHA>Ipd1P!qhiLy=uw|wibomWnqJVp zKVVsuHD-NX9eIViV=G2fYsLoGy&V~4-A~2RpQYB&kzEd*{X$2T?4}!YD>}}O>_W+> zHGQWSjEhKmQcH7oITqKFjD3bKEV|$s6Wp&_mpy zoVVA-Cn6e6G124eme4UyHh}N#*88BPwE*?sbnK;CgFVLS+v17;cy^8|Vk* zG|VX{q966DOFoiQVlJxt!EJ#HzH&dk->}AY%i@V7v$s$aGf?aKT*gP3#__LbP(Ktf zkNNha?a4F&Z^1(5R(I^IBojNlEV-jB_SIl_`vmg5vCz$T^gj?~kxX)@c-vu$oK+oI zQutE9H)&=MCTSu9a#p3=+?}xeaPPY>wVBZq!YH(YtgQS-QD9alXOj<;;Bh%};0O&&Zm8k6agmXCXFH ztS5>001E5d{C~LFmN+<<8 zU!!BKS?DVsI3W9qTXM7rI*}OVjqyF1cG!SF8P@z(VWbk*!HGupE}dIz67@D+k^<(q z(JdSbZ(zp)c5WmV#Wq(GxrhtimJLLr{q1NX@hWor7F&CO?W-!e+4JmT5D`*BO2GUXZ#Sd=1@}<{XY* z-uB^_lz3v~68LxAPtU$U$qkcN;rA7Vm$N2xjXcGe-B1 zmC7*msZWxJCNbEDPI)ukKIV}@1qdpULC5%(NP;{Z5JY|t#jEgQ1ag0=j0b0=xP7cG zG72-R5YO~zz6q}bo&%Vi$B0WYJu4+VaoR3{pg81-vSO4cMI+Y~H0eAm#_paxv{lN; z@QXNTHSVV|m?YClg6Pldxp+Rw_-oXhzKQx1bg;1(lH>(VIfsS8>?3lFnn~M8w9w3) za{B8@`#W6RmzK|z+7jDdj7DyKE4jKD1tak`&AUj~A&em$86EzFc}*$AG*8i|N4 zeSw$>%l=0;Uqe`TluoDJPsl${ z{LL>fSGC|FWu&oSo^Z1Fy1olkJIn1;%{i!KzsN3HNPfO-!~CE4&1jZTx_mU7Y-@s7 z$X;3o{|7YqR$~Li!J5m%8^C|$Vj7R(CecH7f8mETyu~0vR-$Y%KcwD?_{-^szufs< zv!6K^1jq(c1#(xC#_c*UquI0^p{45%nHcj>^9NoHVb_bDvUq5 z=q26jo^cbw zeHi&s^5Ruo{&EgeF4ikG)lsZh#O>wD6W_srBxC2VW^)4Y^R|LJo$lj z-a*pTFp@FfeHP+mv6-J4W|s&te?Z}}FCFJ}+A6V_(1>_j|2t>s`D&G5D8^+=AgN?$ zq?D`Ed}~W8lVoSKP-GD+aYoNa+$)5FNAvo|l`WDcLa>xK=)%PyB<&k zNRmtLkW&y&A=lSMN$1TqVqaxP_o{OKV&HO8-y_n-ZY^*`2hHzsqNZUX#e9$g^%=sP z6`|5$RmiYf!nb1GP;TxTaoayuMo(iW3ml}V;$zzfMW(5FLr{7g;NO%^7RPR<@VPv4 z{42QICzs#~SHt9D=^dgqtFO$h*5nC4#J8vND z7mN;B#dmyMfCy==aGmIVFrK8&C}e&n3LY~52ks{t&tvE$h72L|)1B+QXCtjNdLgUE zn>!Wz3c%qwFLNW(Vkj{IZq~?Iv9GcsUU+H8gv<{i4-uHSK-f+AI?zXhmS#E=uHGjM z7qLA-veZvkL9DY8p9v$5Z5_$yPgfinFp;jlV(}e|y^`#m543l#{iG5@BO!_QmEmG%FMqQ*3(k* z$D*J2P(zpsUCTzp0X-4#&!7|Z?{(jkz>V&Hz6Af^I&nW=o{c}HgLHq-?Row+o~YYD z%^Mx!zo8&{ihuIx$S8A7u`WDl<{FP-9uJt)^37@E%xPZph7$9J0(0^NbMol;6fw0E zJm|@-WwFj-i47sYP>krQA?cY4nXe?f;=lWIGU@+gWLZcG8!S$xF=NQ=EQ1u&l%vdA zjr}Ld$R=!GXhVr47iFei7ytKzSnR|8yO1fjV3tHZ| z-q+dFf#Mr#j4&+zBl4Ll$C53XI zi1_hep>Rx2bTNqw;>F0J%xtIHNp|&I206ul(3@!jzQ_ItzxmuSQyI02+436fAi5m1 zwD`QwXha@e&blnL2FiJ3`dS66Ip zi55K)*N)<54_Rq*PMviIlL2ct=c_y_sUbTTs zkxgsUN8GuhGr)$J-AmnL_pQpqUtt_p4M7(*CAa4tv1Y3$6{8V_m|5(K5lQ@yHM1IA*>4Q>U0-`pDK>$L8t zML*QLDOj^4Tb2i)^<+MAA;vwXU=br8vCrjeoJ|I@adRNHS z@d{b7v{bQHtb>@l$l#4aPL(}x!u_GjW=S#EvXG+-)S|}V*z@F#(;`>Qw8R!HsL8JN zq@jdbVt1A$Hfv#Pml)rUMi<9Ln4558|B8ssNYCT&p~Fkf{TLYuA>5w1!25wG0v0>E zj6S0xY@?9=JWTKRM^8oX_^;q*XBG>CjB5J6;e)dMSLRlThePeUx1pP3YVqtSmInxEKC3Wwv*?t%-%30 zxf8?ayK;=`*A2%P>-I$BBwa~$e$PL@4?47xEG-3eLK=%cl?3MrRT5^`v}{cicEy#s z@1`tr!RAU&AEuOWs`k6)3ssQ{LME1$zeQF#C_Yvf-UbWBOtVkUDR*x^<&v-5iu8ab z2K+58zbRYRm2~x@Q$!_EH-S0w`7-2N{k%F1iKr^Mz$PmzUMZ(@qLySZ#@g|TKtukK zvSN2cPm|^c+O`w>kqmzk1w@DRT6G#er55WkDOlUrRYFeA@uGI47a6hJ3oeeHPvRpt zWVX;Lcl%*bgzpXmv7RHarm@>g9PV{50F3`=AF?!QrQW@c&LJ39umBdYAhHyH15o7H zi4oBy)D%wLk8#vV@{rErIc^k-d}32Wsv6%Hl7c3o7AAP(mlJVNeo%Vx$w*+^fVAxK zr?F=y0Zn)}{wBFoWxf|i(kIeJQb+#!n01~^zC_hPIeHSSa9 zUe_=R-L*@^r`DEIAJ$YkjG^V5wV3A=+wKGqJ*XfTCm6 zBBNVm&#h)8dP401Ijwz9^fX?-Ozg)p%C)iQDV7%bDB+js-RpiY94~|CfjJ+qVw1}`hV>W?S5hJ@Z#MipqGu&8iP!uO z#Y#=c{X1wap|x4mLi}qn?GOzF#&6mH+}(Z;{+6N1(zX~P zHeBwAk^5nyS*T=8pdnK1g-N_iwml@b;)p&IyIQgj9166bhz_HDk>&b`z*Cix5oK27 zCDehaMcVlyms6dhoV0-@$I%tAqNTe39rq9a1Nj@ttw!wR;OH-VXyGJ&CmMVT z9HOo>(ILyFKL;UULp_SrDta5)uviFkIYWQWi8ukPu0-&vW2?FUFYcIu_#{`+e5Gdi zut$B%@IlxZ=L>bTI@-QGf7NAEJG_Hf1|jpG zX!*702yAi4Jdt?XwhveSZtRq0kDGNiP6XcZeiCQI##j8dGIEh&9-c#ES-l)1-E6bs zj!Mj!%f!@C)NW}g^_`mzfYG>y&@mHI@=QG43F&?6vfsmm;rf;@B?dN zxpk#g@x#it4^OrqTXWg-gTX&sQpe4c2jb@E2i_ly6H+H}@+5M-j`7xHa~lFaLcpQH z+vxDr$wb^dZg$6Z4nF?wHzuY;QbER91R7oz`Wgn!RNR16T|J z-9ZLU%E;dxInUR9gD+_cFkVdK23g~JWzWLHBpKD@V2L0?uXXB3l5XVtGmz?sL@NFT zP26Rw8+!^wB8bzv79*-}N>XT*`L$JE9sI)M z9y>WC`e1&?#yy;!Wk{?z#(Jnd)XMK55Z`KHezz8HV;0%wtI^F3aNxHH` z$8yzSSeHA$XXIPS2g}l<Yrg6#=vVv zM*~NoZ?4LU{^)GTp0 ztFjqxB3|jC?Qd&Q`!v#St&7j7FZGQ5{l>V5;Hf_ zl=!&>$RPyQ)!&UT6N$x$5Q8qbfA6Pg7@^h0Lt>;QM#A%ZZUMWfNB{3Bmq-;l?!Snx zo<_6f@yFnRBWmY>THL@ND_CxrzofX(%s_jkDHhW(HV{idp;88jReXh1DW!Su<9DusVUZqsN}}iVAnPe}>2S?Qf8DgfYPh z9qU)dmfW4%=pfdCF-PPAZV9zv#}944 zg3Ts&X#ZP&?8LChxod~SP7I28dS-%3>_i@x{!X0jZV!ljCV2H^-mac2#lr&H#&*ys zjAJsD>%Q|sfQo0F0ww(pco*OZ4lb2}!gyh~+t?Z`JX~ho?WH=y@wtvVhj4gWtBV70 zZ?Xg(pIOZnR(Y|W1oG5j;lZ?4=J?-m-+e#GI?GFNdoQ&hYxOv*9Q*RI?fte}o#hk! zZ>)__)l`DK7OjWNB6=YSiE2SdZBVV4Jy>v%H4?AiiKc&(`H_Cf143xLoYj5&AY4`c ztu1E-%xx4#LN*l|_WN)qi#7xP0+-shPMk!*^^aUFtIq5`qa~F@x5SMzWv` zWxn#tVZIh(p%^E|Fh$teqam}ur&Su(A`AquMQA-*3@=T)+i#&Z*>iwu=a*FHw1N0Z zDr-42@b|aKi$RhWBlE;)HlB@+iF%7%z`jqoJ+jzC9W~y3(ZE8c^c-Y1uJe0t2Q$5m zs|in}mDIMX=^jhX+7HdCz!aNc5a$FM0n&M9?FINf|LXm;a>LRy0GARO2Xn6Ftg z#_1GxI4!K@Qs;~b)@CB7oBOQ$NuL58*|*?GA*dA>eqp|G{9U*4g?YrkD?A7&-t%DH zT*2LiVcq??Y|Ujk(YY8jMbDR;2zbkY*yqbl^JUog#2oX}OQa+H^W$&2jhFqqTfS$$ zeu=0`Q$b-L4TI1e^FKnDfE(2s4fw9s?G_o*(c{Sds@J+JWd4cUVVUr-h}OdGM;>Ic z?k8bMrLi`X4#kf?m)1OXM9x81M5|-dFi555A!fVr+r_}=Z*3kk;@|%RbYE6w83x7V zD4+odWaD0UH*PT4_F!5bAGw*D-5q2%We@rfvIjNl5{t^vrNS+O;V>4@en(L(ev!rR z%JG1MJI_XNr5BB0+?bu*4UdcYI=y58XaeW*U#A?po~0b_lw|LamwV_!O|$0^+#{7; zs)u7mH}`?xvfUDG@5H*4yR4hz9K$m$UhR~<9eOaVS&3Dw!?a*^ALwCQka++{N7Q*j z!+Z(;+_iP)(fFIh3^wG!W}KcnZn`bL4RGS4AX-Nr*4TsoSIgX!w+9Q~$4L^bq8}~8 zSx?YAYTzI^xvPz!|4(6@`yACphgsjjmfdYw^6HYuV9zE@1iU5p_{xB8LmrUC@woUb z$wlHx8gv#13XcX04`4BDwuYpq=ji4+0TW(0c@Cl1Xz}TzO4|55fwr8Nri~`B2OJYP z*pZUd$;d!_B=Ujcdg*BP?Jy|Rr%bSJ$9a8hL$;#ha9Hb9YwCocqceb_2h40Q5LXaq zv}w=!?f~{(VCHNEOE3iq;@oq`#3W8;2hDeI0{hiq;p+iwc3!Zs8&41xjzur<<^?IQ z$DtIuf4@8SZ@3|Gyo#5!s1-t77vdEHQ}$zNa3sRD)s=-zP{Ma)i|N4+gL6OD}yljd5(y%d5}4YYFyhZ{-c1sH(i z6b;@3;~fsoAX!7;2$W+TI?J_k6UKp1F!wroBY`zF&w4_bHUCQ;c~^kHz2RGe<_VI@ zPGl%14A2woi6-+p9>+uJ+%cW_-G)rE&3E8iK}SyRe|gf_J$iS1@D^%Qgn-P8C@V^4 zZ4k!zKC&-3c8r`zDQS;6PGZw_^ufe3(f}Og9EDwfA`|30TA1~Z3ipo3xlVEDn0XQm z45KYc{cx}z_C;`zk!`^7zJtaI{Gy;8@nyeHCVOaW7RAOQ6#Lj!&mP;3>4!RT)2r*k z%^dp}x(+oL3O|sp`;iZ6F-`$vEd3;j9?is>RBVOE1+3+Hc!>~tw^D0)2_%^VUP|aF zFcw$xtnh@wok9P{I9aQs*#pXU>@R#RiB}FizO!&Ao`+!zNn`>w`YVwT8}@T&L5Olo zI&>wc5bqEeg%<@ZAoV3(-b)I50wV9}$Q$eEPPmb5m~MVX8im^&TyxWP>RnQ(Vc;(> zL!&CeS7bO2Q>kgU`K}M|tLW(+fnhfST!J6OlmAKOZ@@T$RPRZ&E2(!-y1@AAyzo*{ z>!jntD=SqlFuq3W8%~{9Zbkk%CN^yELR6e>ht>tmk9rjkMe2;-EBXs)o~n21sl_Sx zBf8_Y#3)j*?0|U^v~od7P!S}cWhi4_e3~MV(vj`)N#MOFz%GlwO-IViudvCPc76RF zI&voR0e@bS(09i)PtPXaE`92Xw2Xf8N(2+8-I@(jPIta{0+8m(*pF;(7GC!Nh zE|B%Pmg+TJt(ymhE)ZLN%}-zJ17ZPMGW@3bx$7DG#t)m7SV{)&8%D;ow=u+XKlxnv zt@-4z2BAaEdJ+mW=>L5Mdi8g`3iP^Epb}`uINiE^0)#)oalnCDdK4XOjkmP$4N@MV zM2=(Tm#jFBW2`zaNYz;Y)v*?0Paf3gXyGeRrE~=f{QU})BNYh4h`&pLp8svH0u2)i z^cST-_eli`*QL}Z&4ehO*`wZ4k+L7ueF++(d3=OBCy}+xOPU$HCWGI^K`(9S(^ZPx{`mB_<%U7M=&GPZe|Q2)l=U|% zkuW{jhS2xT09&?cYQmIiu&ugTp`b41><0hbeYV{Z|z1b6#U5#zJ?PalWx z=|%i8tUqi-WK0_V>s@+EUohrD2K&1nqT7$%6v#EXgw-kF$;I_a>4Gid&T zN)4vgllyU}cKjzXM{oInfNsMV}@V^Y$ z%UlC*dcuQ^n(O-F&E7+|JGiN{v(>ESAdKJ{%NT3{fr6ru26g|#?6_B^Q^DHcU@uge2HfFua`iNwr|mpa|;C$PLOeAJ)erVO=1 zOF8a!ze3d5W|4xHrsQhQpKze=J|YtR1YR=AgGSHq>DIk;ulrw$G-6e29~=uR&~*_e-+1VM-5olj%XbQn zUp+kPk&{xIg5t#`j>G=$+fH-NDDijSK1jA0@I}eRGQ2d{=BNG>?hrO;iWbcpBU>dN zs4S3*+z_T34L5%HztW5{HJ;|*kZTmS_$_(86J9ZTp80F4U$IOg6dYVgA&GY|(h;G_ z1&+PC^Ij@%VK?;GIoX5Ug-j-oF2vy=Wpcpu63saov&T=FS5YT)LM0g=i^VG_TP3Jy zkuy{FM3hWKOI%GG3=6bKzP@WcZQZ4qxTO?yORxO|feO0EektTYk#M01(ciGT^O8tE zZ>oIe0wg4l7mQsSlHj&AgcAgK+#nvs$QVd#S;zW~KyGqK(Ly4kup%5fM3uz+LmNme zL1_wlPaKH?mB}q`avzI>`a@ZDw4jEw@@Tf_^4`(N=}I!#n0YMz9`=!O+%ms7^bp0$ zsaS>ktea}<`G=8d$XweTzaRU@`jI8tYGi1Lwh&7DN9%v6cf*oh=Qq0HJGQriV%oGE z$2^6R7qfEnBW$o;RggXopdLgWtiaZuTMOdL|3h>vQQDvLDHg>Fu#!ycj6AQ$>eTaO zBhtEYj0b23f{-o*|IT=a7?+hi z94tcAU81hVLS+01Z7;JK`ru8TVn!?9NE)(!LDl*V0mX#evXrCvN+bFx zELY=s6w|=YSRr$v6Z3k`5vjmF3M~Hp_>pt2rQ(bzF24NoE3ec>TzO?Ne%gpy@zX{u z5kGCjIPud)Tq=I4^mME_{oe(6rco`?PyfvyS+h{9S+(LS&(f+$RfDItrKPFmDo;!8 z&C%L$#8cf=Q+xHun$Z$hk3%Sh)}l4n*EB8l6oox_T++}~y*w;QRW&w6>S|j&tLhtT znpSyMR5eyD!()BeQ`OK?TUE2#(-LiLtZ!VVjSP<&8P-N=vm!0@SY6e4al}*K7zQg1 zo>^s6CK;iCr>?58rlGdwDoMPywYGX?vj@q*a(zQ>4Z%fMjJZ?`ct+M}W1Cx=s>hCu zjs=Z~HgZ(dGjdcI|EfJBqgv5QEgA+dR}sga`9&)iYTBx*7GmWpPh*n@WvFVX^@O9% z%}p&4QOv76U<&2&G&R>YdTQ#!%?(wnB_|xPtTy6ltzH7*G&a^&N9vmzhiIU+w5c%? z1{iIq@hqtY>8hIAnlak!ipeF5W>w5An>Iz8Gj&n<%;^==CruB{qK7~*6s!m?no~9{ zFntaIvnuq8Al+2x*9R9(o<3>zEN#)WV8tSRQbpMfsh9$qHM_ig`pk-8K*m6#Y5LS) z>Oqo9j|mPIA=V@#IO+Pn(H2df9SY5wG&2~SmI{zeEvlGX-b*tLTNEhML(`|o=#xTa z!D$tXLS?fmwB_{;4OE#$HjFvf5Kr>uFqBzrwR- z>=;oYW5X@gV^fL8Le5L;myM~@T9;H+FK?({Ru|EVYHF)B-{o3SePgv2Ufo#TP+!{^ z(JGpv)pgBPHPe?ay}G#1lTRy1Mf2R|S=Lh9?728C`j}C^i#-=zS zY{Gn6Yq&O|)ikdNYfGD2s%y2TrAuYWw4z$AVQF-UHa4xKwM{Fck%(u!r+p#8))0)EerS zwA8L@YFMg;qcu%hk*?ix%PrcHYOSaNQVLg9N3>@AY4Ct%QMf4zdPU%-)>9e?PS$6K zDi+O}K6~b*V5uk4v}{>Jt=3qLoSK_8{MEv>wac|je8pN3{)LG}(KJNS}1vR#ermXs)kbE^a)yD_Rz&UN3IxIQ#8^TIkjlytcwfBG{dB|)UK#%4x`>+L+Y2VE(+H+)_5*_|L(^=+jOtz z`r6e?nyOlAU~dtt8D?nAm@yZ6E}U6g#1_&6#$=S5+ND*|2AC97yQivgwWqOmRl{me zb3=65vf3Ibeky8s%!QKq=!&K&T7f8tyiGN*=4eB>R#eQlOUYXioC$r@L)0p3YLQuO z(Xz;LZCMNS&Qr9aX@zHOG~6&C@?rqh zQPQM~Jr{e5mih`I>*iV*{o;}7&1+Q{@`En)XPwJx$X+70z9R@E=BFKeu+ZH4NE z!&LcFa*I$E+9g*&&+#wS(5S(twKQ%YXlW@CS3%R4dx|DefuzkEDortEi~Z=9ezi<}bj%0RBx~sNFX8Htm|J*J#&FxJH`-`=kX| zqUZBeVDyG^ECDmkxLJVYt1mCE&J3ulrC#~!OA%7kaC2s;Oy;A| z41%2QvT@bg72>wW+b`D#=RmRaK3|NqtrL>PSnp_NuCAq=~9a zJZb8^^|Ygtwp!BMJ#Egk&Py{{9E(h5(K~!sVj(|mqM*+4MF%BLOTL0Pw@HAHpYz@; zAN(R;%Si_I%-}s2m(!>^olat~2*!NjeatmPsN4aJDMS>n1x(9PPGG)0&Nt)ZoEc3+ zq_4et{UOS~_l;DB)y%W4%;^!aBJ=7KBA^tfyXb@+#gvnm$W`(|9?yUaJk;^zZpe@h zXIQh~Yy1ocEwI@$92fCI{-e){1{vob0?QAy-?-3mVpfBAdy#2)G}aZ3zfH6jhZj|1GUH__z#wOAY|xxa^1evvjB@#Tbr~ez9hoWzy0!v=7QD>s%|%9M@^IT{k{2&A z;1bD{Tv!oN89>_iElW)=cq^tCY{^5~%CBj@`K)G;;ShYNxbQ>coqU)w%!9#M=Y2TE zKHU1PedCH;#UC~-C><8#3h)Mtz7gr@T0xnK<$#daLz^SufWdm5NZO9A9;cx)u*@c$ zKeXc|FT6TP@7@)L8K=6hv&Knl1`|F9ySyI*Q{Wp}MGXq$n8=q&MzMT`P(-Dzlv&qV z6XH>ZOKOi@gW%aj5FaJB2y(f$s=-3 z=kfn4_rwPBG0UYP?vr@wPI4)8V&9r_=AO+rk%@RsIVw!9A120yIv(}X2K$s`K4iY5 zFB{eCL=es@?x2;n$dl+ElHG}4Z9?hcfWtay2n&P7R7K?R#YLX7W4)oh?&d$qb0fV6 zV!lr=U7-RDW)2fr()dXmSV$aFuUwNQ;8(k)7mCuIDuBc%IP)%j*?4ck9~J)wUQPs3 z@OFObjDD!j;aKCD$gNV9`YK&|2I=?8JIV5t@6eSFVUdNzl?9NEBRxIe%aKbzu6Y{a z(3^@=d*+BLeq`L}N4~%QehMeUl>SrCDqLMv9QCZODjyZDo>e#<`b__+XB94tZdwHO zOyR_f;zvcH*MHMbg{%A|+WVLCDaF6c^eTo5S9~a3T~+u%^i_FOI+dSFugassN$b@; zT~+*aEdAate~MFzf8Um#!oMv&g0)QkGx^KpU*)H8JNXgqZ~K*U;7u8k_Tls){Yu4O zO|FVqymA-!5F`e??l}bnD?~Rerm0mA_rM%HJ-$l=Hcg zuj-<3mA_rM%HJ+rUUdkC3r!tl|%DyZ5cHt^Lt@`%&Q|ax(OF7XD8~doz+l8z2IemJ|UQSecyKt3$ zuuXaueseF$K6i?~UARiWs!yuk2bJC~T&1t=P15I1rMC-L>0A1w>U~h@?ZQ?1NN-(hYeNgG`!d3dF-X!AA!OtpvX1HoU zDt&WCdiAK%+l8z2e^m)Gt}4ABllN0r_#T%{ka5@cLedb@CyeoRI>^{CR@g{$;4GU_K&KkdR* z`dJz29n65r-!5FGpPi9DGk?2qmHvi|^qKkFg{$<{8R?n*RQnQpgcX=}Rq3A}AbsZm z;adj?-!?#a*8t($2MFIWK={r9!gmc2zI%Z1Jp+V$(qx`~tMtn*T*a-jp|AABF1(Zp z*oCY7?ZQ?1zTOzcRj>Wdv*Az0JR_NttM2=|es6&A(+3DYYk=^x2MG5K5S}+c_?ZKQ zUo$}XLj#0gIzagE1_&QDK==;^2p>B@_?Q90=M4~EG(h;;0m9E2ApEic!u0{d|9yb) z-wqJ|!~o%01B5#V2=A{=eTRJ~f$t>nodmvRvQnO+7@zdU)-9JkEW9Id&I?+-gQhmK^E zlW{nQsXZrzaWx^nN%y3Unp1T1biLk{8_UYNnZk(nM#AtTp6Ex|Q{qn3APn&%Y&YMl{W*mF7h`ITh{|!8 zF|kf7_zDnT0m0YIA%d}quAJadUERtu7jXXTDLt6KGYjcrPTl3nS}9ZMy{T|pjA-K1 zF1W5ur2$cqrqxw2)m6OMRbaS0A(0W1h`Lbayr0qpT+LbcxN@i-9^?FXFs)eD6jy21 zW>+o}lDz4V1pNXuK$t}QLC7(ub9B}aS8hPEMsW=U|C!^iA;o|U?#-I$%D=}s(dFsL zp6DvL`;>sI_|8GPt0Z=6z_rogT$1f7(Ot#5s{m0D6-gi>>{mtdQXY`#bnT@T?3Y%X z!+Bv=|Fo#S?q*tao}7M!ZDfqM;b~OXrx=?}*WS7axXPVnSt)61nis)`IBpm2`@}8H z`n`%u^37o-8O8BpS+zr4ITN7DpV){$w`AwKyy2s+;6$u5#7sczDiL zx4_kWgRAa(Jj@!Rf+pf=x~p!otGUKihld7nKXqsYMQolb(pL2+Et0_|=4S%crI3Np zt?OL(WjTu+s${Z#eZX-&h)Qu|SvOMk;ZzoWqyzXpM1Q8G^cv;LYJgr(>4JvsbmdH@ z_5ihlIP|Wah)ViBfzy6MX(5xlsZDTOn&N89%6iS^nIu>d>LTi+nbU}Ukb;*cS3X+7 z5)tou!57v0!yNA-qK%&i|9-_7y=q04V~VTUInN>30z^D@bDW>xUdFk>Rl3||Om>w| zc2!PxEuKtrZ7y?_wup9-hiKVkEb;ph{Q*x|_sKRlobi=}8^SIvf>H#B;?awL6F9tz z!qH|{xJo9wN+-Jv-Bn)ZDxOP)A>FFsc>hB2M46{RyblSs1Ax|X_*Go4JF_NJ+nwTi z!jW~iYm+1B>U3P^+U+QFbvpvCgN})=LymF^gy=wyR1_!eH0?#EBle)8K02sf-%U2^ z&g_7zAa;u3D$bheDgc1mL&MAXS*4xik&ZebstqaA2q0a1UdyAf3> z`hkZz9qA|0ory}O_WA_ls?Bv!zj`@$rNWL|U3EuHM z0smSVqpwlOeCtUWJk+Mkp%bF`GhF!?FlF5;8(~T!L~|3TAAx)NdGPN=#w-Ger@0~t zb!1d_!QWwyQ$TU>6ZOv>u8=)2s*ilenkf>LG^eEH_WIed2rRHfJNpE8}>uIZ`$#57l2Mho|X<=-fOA`!5b#N@-y; zZe{ySgBdc;#G6LO96uI|=tJ@tyN3dVPRwzY)`&htSAB>uIHgUZ4pl#fp zWl&!Tge2mk4kLcq^Wq*#bdx?(d zpPWB*pj=dc2RTfPBS{ym-uk09bArR$aj(rw_50vAYYv&EZ)-E-hEXEuHT}Vu0d-PA z;{pSZFXX^CXmb^Y!^k+w8b<|gznzkZ=H$x zz!cZUtgP9t$Fiomp1{9NpxTLl8_}6RmbDOAIk1V0IiGL9_ot?p-b6WqJMr|eAjX(H3L4T;NJfU_X3*E6wx!r%AfLooUWb*;DRI%AGSE%7`LfCH@`exIdz?kkECE6~1Ag%E&%V zcRk^BMh3Yy!HRb}v*wALC!AUL_g4qSAQw6vfAG7G{y>lJB%PpfyoaVz-yG?A5Uq{V zoX5P2dA&2wp=?PAaUSJ3Ybg$RzMJ|=?pvm~%2y8&<9TF=9ws<6s|?SnX&0W~Obga1 z&p$K0akwWwYlON_N-4eQ|IeU64R7zj4{;h(p%|+HD&cS^b(}(uwsw9Br02Xf+qK(S z?&`)U{viGxa>8&pF{yE4yy{#4%m7vmECg&8u-S}-DfMcnt7OtQ<_g4`-H$|-t$m*C zFWi~(hV>0~+MHf=s!4KMbW$Jq)>4R&C7#Gs5w4z_IL5h*|D2zduZ+e*6#tKmNBBA# zS4SE@*^IZrMmxaIulQNvSK^uI%wU#;FAbQEe-yu)C-`Id+JP&@SH6bz zjMMy{@Gcg>TElXgd`D z$2^A={x*b>e2IQ1=d0@F0OQYP;IA_--qe756`#g5MCUPF>8J2N;hyq+hXo^icfkJ4 z_yX?lg{=lg$Dk4D+|1jgikA^Tma4PR1j>pB*MxY@PemDaseG>7h|DYez(~ri| z4!nu7lb;O%hj5)l41+|rwV3BQadHXf$GknvfJKg76v zXE5rK>8om8*^8EBf?I@!!ao5yf~8wi+@zMf(J9Zs-(;NnN%|@JhZt9Spz!|zPVzj-B}T(zU0GyaxW##jC9FB#7pDRHGow3a~m)-W!{JBYHC@gFlTd|tp`WIS9T z>D((X+8c~#6-t1Mt-Zte2*ztT{s)Y&XI$wa%?XH~uNW78DWv(5@$qa>nJvu;eWUn` z8K27ZPhqUZ&_2Nr1(q z-N5*rj4Sz6G5!n2o0-mX#?Kxj0VSVX81GCat^KbnC*$oOW)KVtg7X8d2rN}!DK zXMj7jVf>_Ns(t8wkR*ruU<8DNtdY|r-Ko#R2#-CtZ_?Qqjmhn$6l@Y(k@vi_*b|9bm#-sRs z$ohtt_=%tJG2!kSrgQH&iL3Ea8RHiUCksCCD1)`xjQ@i18pf9Zr+k&=P}e$+Ka?Ay z@FOA3I>zrTkp!+~IuXYI*)IW|@mm;wmvPQsqj3|-?L{^W<2k;`_^Ay1nem5!Q@`ec zJm}{Ue>Lsr9REv>{{iDqGXCxa2?QB`j&bkR68IV8TN&?ST=nmJ7$3t1U@`Q7ey;&1 zeo7TTTyK9AxHGlxjz{r(pXuDgf>HLZhw<%<3*QP-9A*610h#^@dC|UNd?6QT8smdc zk@8$USpveRfm;vbwcN0TUjq0@#?9+xd^KJj&G=q6V8TCuC_dn%CyEcSA%4p^{!KIF zvzX80R_FMeB%IQ($pRmuZDicTatjIEDf~Js-^e(d z3GG3FV?M$(RD61Lrli7wxNKxPZAz~==xN419tq?!{sQAl5FD%>V*C(~9~Ax<#yd0c zAtI<1~do z#dv21zL)Wh8TcW_+Zb2lz+;Rr&WJw@9T3Td$ zT*=`U#@iTI^1qMq<_!Gb824N#1z9RD+HV*y<@icJx2yP!D}LT$T+6@@Gk%E2;VS+h zC^pHblW`@_;f!z0h<_>LZ5i z1Ame6jT!j+jJIXrCm3Ixfx9rk5c-pWdl~m+;8!u8%ebm{TGu2xS_Zz9@k2bXROPyj z@y-nVM~pwgxT60U;~O*ZEsVD@uIl$y#usPcA2D9axZ;PVro_J|13!y#Edw9T_#vK0 zD>@Sy?_^x@Q_1+o3>@ER5c#%c;OiJ)oPqzC@zMg7Df+ZZp<06 zhw+V!D}FXHzBmJaneoyLIv+6ZVVtwqzF=I-z;iJr5b``rmS6F65#ya1_ymDFQ~M>+ za>OshxXMrA^BFJUcnV*}xGJZ@!;E_};;&&`)t`z_(VS`i8BQiH&b0ZC!cEYDS5Q5s zuJ;Jsm3me;_X`}Ie8%r##xp~H%J`KT@&6Cw<1_GIFn)Cg{wv1IGw|OszBU7Yn(_7w z{5i(gXW-iySMx3vyqob~D}b*rGyYr#{;I%FBMaK+_ZH)-zEt2Lrn6lEeEm@1uGBbH z1%J$RlwK+P2-A5{0en5d_`VGMYsTNrz_W!aoT7c2fe&H)^9)>m=J^!O!Q*Tdd=|&g z%D{&+F4n(18H3Pqq#{B|3>-3EWq2B*Cn{mJcV8+?xqzRw1K#|Hlc99;e7`-x5b zFKzI_SP$!u&e=Bjg*JGx4X)eZQ*7|5Hu!8Cocu1Qr}Y-fzp=n3eyt6@(gwfF2LFi- z{wo{&SsQ$(4ZhC?f6E3xVuOEegJ+@A`>XfUZSZ^>{CpeyA{)HO2EW_}pKOEAx51a$ z;H@_JT{ieX+Tf4c;4`r9i=c1({@o`26E^toZSXBNc$W?Sstx`p8$4-)yHD@GTwWX8 z2mB1oBzEvX|4o+2c*gUtlE5a$12%M~+u#dq@Om3OVuQzk6Q92fN=9C0e(pp)67DXS zfY@_|+q-S({HqPV-3I^22G6n4pOH5BWj6R#Hh8HGUT%ZWvB7I>@Fp949dMH894&u_*ff!q76RH2484{H`w59Hu%Ff_|I+d|FFUT(+1yWgTDZr3aLe#RGH zD1pZq*YMH2G1Xd4ZKSHYjxYFvDLytxUs8;S@0{X8qvE4twT)Fv8fwKYK2I2lG_7cA z#Mc-b=z@P?e2ftZo11VWKTL*ilJN&I@u{&$6W`;bjQG}TO?1VI)kqzQwk)GhX4W*X z)}qbyMZ;AqJiH2@R@0W$_4$%o zH8QAesjcCUtSzly($rX0U0sjD<6D9Fykxi;U;S$6rOBV6rBZ?GTCJ+3rK)jREfut; zrAmCbt)^uazL>TwtTnXYL!a7`hEWhA$AnQw|Rv+t= z+4g?2Pd^TMzP^XA86i{2olu=I z_2HH(6c~aOpX5^?K}I&DgCZM_BFV`Q1JXA#@hMe&f4C*GT2&XmuNQ5WnvRMRaz!36 z7ov%AtQGj=C_YLoK0Hco2zg62kSZlhipIktSy^9;wj^o+g070d5b+f)3mPfDyNj02 z1VyH#wYM~((y2w!gZy$LzBY<#=MOi_FD)V;3SZH*5{-vKo1@`6$uoc2RLES}2=y^V zwiWok?{aO4j84{2nKl(oYXy5+OSGXj-1~(`sJOBqtE$HMpn&pI)Z(U@i%|n>(bA*@ zE56!{qT&ORVc3T1I^>IL&=xJKMh%ItI5yOy_Np4jTzN%*XmNj_uRrk8{=m!n1IP6T zUfv(rFH2YU7qg^4(BB`3ulx2>dSAa~!e=)7i`#FheEk*+A93!FLcay`^;&FgHm&V=2XNB7%-D`z|fhXmw-CWWD^D>$9B059qN5It-GkKR#}pf zF4Lq^?^S+tCf)a{l~iOaEtgR(T;9vjmf7tRwEOcupZ9CLcyXP7zMluXu5+H(>%2bi z&-;AN?{hdsn>Mp(+h!GQ+pMB(n>8!3#dg*D)x{#5RkV$>inei9(KgO1+QwN$+c>Le z8)p@5Wwrx() zw#_NpwmC)H7T%;>WGSCpv~6>Xwry_Fw#_Ztwz);yHn(Wo<`!+++@fupTeNNSineWD z(YDPi+O~N`+cvLg+vd$lnp;}e$F~}%+pVxEZsO7O=e6-C8(!nXK}LgDJDss)(aa=# z%(9Q!_EBLUbL?ZTeay3uO8Yp|KEl?)KGSK!+TVuLslwXbhSTZ7n}cmQoiePQZ8)7a ztbN09SlilXI&D~s+Hg8;SWDV)I&D}B+Hg8;Sj&asuvW9rblR}ivf*^vuvW6+blR}i zvEg*uuvW3*blR}i2*Y75VV~)=VJ%?86-n)R4eggLtw~?}T)Uix&kb*hPim_hni|?0 z^1d^c)Gi9UIBRKqdDsg|U%(u?ce=B(a#iCsE7#PoYYJNIKV23Mc3Q4aYL{YchDGu4r*>(5A#K3wG?+zA;mzz;by9ml!$y18_llM<(6(`X zQV9FU&B>aO5j*}3M<^Sbl0y1QZQI|zc0Y;Ynxlb;moS=qVBN2Xf0aWvU=T` zbq%edrh>h^+nj@8YMj1Jyw+wtRB1{tX||)Nh3OGh@Sx%NOK^xd9az?|ChQb9hT-rc z`qtIs_1KK}Mz3BM`c~`u5KZU_=^>Z3VO4mWw|#{!khUoFh;?h5!}0O;_3PU07_c@Z zs)A=!6JL{cy-J5 z&7qOOR5znaHawAk1ZJEf53czJv1_iN*LNX3e9tlwr~oEyST=lO!rv#w8j zt{rr*ThpE%v7|$G6chWt9kRzZk9V-k>RSurBl~*4w+_FAu48X{52p)OT^*L8ww0mN zv~CQqWw#hst_w#%Sw94Ip=o3G&tck?=|Mw#$Q4Y+eOF#r-?X72erEn^XMxg$?pp*x zp9ufLv7dGPl`Ge^wX8bx%#~}}R@FDJN!G-!ALdC@SR14Zaah&tTOdPzJhGsus6wVEVL!L0FZ9xggT5G~8z}5yE3Wb)|_O>OF)?O4Uu3pzx2*=fFXtj$L zhIL$Xs4rc%TGyW+Ul*Uw5OnON_08chy*18j@APq`x<0(^zCIinhTNyiK&UcyO|Qe| zZ#?_5-%8L??fJGgXs(ee{zmedO+Mcs{mWrGEH6(Jw^)&f-Q>gZyeRtnLmgK32#3!RN5|h0 zC-QcJbIs35qKE%H;mE@|!cp&X^5;CPBt7ThCgPljkCG4Pp-c3L^LF8g=Pu!Re*G)L zk)H>hYknRQJ?iZfj{N*oIN}*3f6mWt(ZgqgKR>VYu|zohCke-LG|joT>lD$WU6sNS z&qCp-_agG=cHK#wm&bd>2mafH!~c8aQ$fquZ$uBDA>r_OpWk1Od=AIOBx!MO`I$@p zn=PgVG{@-5->BTjxG+;785o)Eso^?wvz4`kONJn}zp#y$_O){ogOh^JBz$ z{{AJy=Xihq5bZ*H&lQe-zSg<5m;G-MJ$$}F{M9fG;(U&{c_BZ46W$lvX5}b<&J%HB zJ94~m;FXHF8-s-F& z|7FC_Ctgqd-Nc)SUqHOoxz)Rb_^qVp{MW_MW944r=CdcBF8bFa!qMIzk^fSv z_vgefB>txipEs4I)sG*KV7^Qej{G0z++x3o{HsL|pJk-alm05v!+)D_`0Nl4{Z8^< zM*gpf9zKUnNz!8RFDLz5oZEc7JNzNf%ZS@F@Oe*$&j*O}e7}o)%pc3eZ;6|KfB3Vq zOE~I%UO4jbs&n&LF=1c)B~w$o1Lp4$&P~trJ8_;bBgEfJ`j?y^6xutH z_#V=8KHqRs%;&`LbrtC+IZu7UZ`fYX5RUEgybN9tj_vGy!iQrR$u{Q}&q|8try2UE zNMA?#KZ+i49`ue_k@@p}=^Em^f7|ICd4Nyu7j`Yps z!{;S7kpA_gzk&4cBYrdSYlz=PK9-B!-cKG7jyya`KfUDJVicy{^9qc zuMTxs`IB(??-maK38%*CFdwmeoshv-3rD~05)S{{g=2kwm-C6CdcLml716{0TN(Uy zr|lm<^wWs*b)U0{A42nGDe)5GHxjp4=X;(%DSW!~F9}B;zT(_G_&m?+rtcp=^k)c% z|9s)lFL18@-xB?fSY7g0;qV_5j`q$ueg8Po-_8~e|N0DmYX*NXgTLzB+Qrw2-Zo?Z zcu?=P8TTOV=jP4(&o!jC-_TDk7k;bPyGi)4$GMsOdHMZM;+&stJj(W#3_{6#U#}A+Lgu`c5 z25-sW4-vQP7u&o)?<8(@?)3Pdb#9EWgYOpo{qA%6yf`89k2uc}KJ5M%I5&U$zkaYj zUq<@7!*Adlh}$$fc73*GnG}AGGT`8GJ_u|LmDD0IQe%zvLWo!vBd3zAJ+t`p)RDKDiA3 z1Lqpg&olIUGWcOxc8b zAHGc7rh(5<=fpUTT}M9CoTI(aSCIaC(*L*Uk)Ly_qQCjre#?qDnsijf0r*4zBjKp` zFU~d27c=y)lD>oDELo7G1@*%J&CboA?>|{6dc^sj4BkOLyng#shW<;!(GLfOqu!|t z_mBVZ32}U$@cxLC#lq3vCC;tA+1&;vKkIjA@MY%*VJPOq zc{}>uDNe87u}`aWt@jqvTVF<;w~?N&Tm6*u?0?+_v0ja*$`h;Y`kZr(=cx>RerfS` zJ?vcTz4^l8`lp<0y+>YDT>p^_zSp_dTkRbT%hA`PZPF=x*!h1rHy^&==IIRmGo+tR z^XssS_r-5s@Go_4jJLm&M87*uo}45cJ~PRuiRxWRocrN@#Q8ecgW~^?*ZW)2-$?$u zGW0Ky{wC6wEQ^NLUi&{o(VyoK|99fm#O?q7hyFt1d|m82&M|+HpT|hg=Oqqa9^-+2 zhqw1w;fBf-#d$gD$HH%j|3>0A4Yq5aBA=Vd=Yb6VSO&k-cO=Z4 z&m%pM!AG4V4~XYw;;&KsS6mWCLNWaj6laTbtC!bHHxa*u^tY4Gk;J!<{sY8&h<}iH z)1?;8zWea8-+Qa@;V4T!Pu#XUwa&ll+~Viuw}6gWdkZ0(t zotyW6P`lP-=&vC?-=Ewo`uAic_iw_l40T(X=n1iS`26RaoFjf5zswU3|M}#@ z>$er6$8y)1!M`aS{tuJ?hbV845x;@>v&4CQm|UJVJMGWb=HudMa+Gk?JK4EuKTQ5p zMgJN1X(v6euf8gJ_&-Q`Zr4vT^iPnU`|X|#eR4$%%;M+ya)@)xU-a{1gd@%=G}Hm z=ZSNi-5EajlD>i3`v7sy+pmdpo@ZOaLa{Gi|38|+|9(s=PxW)C-g;jUY%;F*?(^ElIi(+(CjErm+LoD zJeAH(&-Z2dVS1|P>rK8}mvX!2fbF=iKGVF_62FS-eG~CUs`sPB+eu$Z{6^w$Cf-Rt zA0z%@;;9P`4GkH^7Q%dAn?V$%^LfEu`o5!11KFX)cp=lglYyGXx+_@{{5GG)c$`809cx3^;4 z{{HOw|A=#o=QE_Yx~xF|>l5Sn?ZW>&EAlUq58ubQRrC+#qW+s1`bS7_F%3s~@?+tB zKK`ume%J37j{Tp%3-9&uG5@wYZwteiFB2^Rq1e~m;ctiM?MUJ_&Cc*=GW;JGJ^byxt5)pmSn{{`u3E7#^S3^2t6IXdrvFtt!^vFI@kE8iXQ%_ z5q~@R&mwMKC%XT<4F9u55C8LspFsW>5;y6Q4r^kF6E!*5-4i`}~%CY@3L7?GinFUJ$<5Ohfs5hR-XahtKORh)@vE zM33h%=k~?%94Gq2T|b5Nd|t6!^r*Lj_}!t7Ez>ND_&!|wMm#tUT}1wyDL?Nf9~*@K zrNqtuA@{E%ZiDb|aBg4hUl9Ga@Vk`_#4XnK$EP^4_vBhJW`EE5@yX4^ZLmN5S^22& z;fRxaoZHvuslAVg9?R)Zgb%yVFN7ohUpu!i+vh}ov-jRwvDjY?f8fs&w?VAmUJwrd zJ;H~>G*({!y7+BBbG=79w|eb2wCi}`{c-XnCmjBBGW_R@9_#gZjfSL=T@q z;qdt#`S5YmF49{rx~9ZH|15m3@BhC-d}5HI-U;&m3!&cQotyRx6#v;7`gfC_&*L>_ z=nJGTkpE`VTf5fy^^d!RZ+}~C@6U)^tcd@Y1nwQ9`&9^-0JxYG;H@-8wOG1h~2!9OP){(0f>$8iUI;NK;B z`1c5h|A27#j|zu>sqc58Uif2w8yx<5(ZjzW9R6Lx;ol=1{sY3{KPnvlrM_Q;IN_fY z4*$Gx_+x($KJf1nJ^Xuw!+$_H{6~euzts01P%r#*!r`A64*!C1_;(41e~)nZ4+w|< zsBrj~`gZ4l_=UqKFC5EnEpc0Zld`y66^PsN3w;N1(+~OftBW}6HxoB~pX+;wv%Z(O z>APJ&K%Di1#7*Dn`cdMnA0ux1g6m5U4I`l(kWb-l~IP1rVo4)VuR!P`TctiX~K9Qfv z#7*Dr`W$idzt5jjtt4*8K`43Rtgj_*`cj{uK%Dg*#7$r3`Yz(E-%Q-}IoJ0PXMHbm z(^t8EfH><1iJLy}`cdMnA0ux1I@gyT76*`jj#Llevr87%UnN7ob_YGO`o{F^l%&5w|+qU zlZl&t$j?vah_insanpCZK2O~A_xN+p1>xAQ?h<~L&#xZgh_jct)!XUy4iM)!2Z@`$ z;QCSGrtg^^K0+xyB7Psx--ug(>x{A_N1XSo^TgZC%u9SP{J#9Za%%jci}V%`cn@** zA0W>Dqr}bUkh7wH>5=gp?fSUSmz;3qxstf$t!!$XK2Mze3&O{bgEDxJa2$6G2uD1F z#4VmG%tzuD5A+_CT{w~_4eLyE2^&~Zu+6)QdyEG&hgX|H+`S$ z3&dI9LEQA+uJ0nw`pv{m-|6}u;;io_Zu&ac4-hx~ALfUTP)3D+VnO7kzF|Uspw9`1 zK2MzcbAdSb=Pu%`?;+0m0pi@=LE_flDsS&7an_F!H+`AwOWzdRjrNZBAL6D@T%RM( z{*}Z{Kji1%^2AwROWgE*t}hU0eFt&Vce}oeIO{hPH+`q;dx*2Xm$>QcTt7gZ^@GGs zU*-By;;bJdZu&CUm%cfSgmOUsiJQLE^*Q3~UrF5biR<&kSzk-s^h17rzChgcI6u}U ze9{c7By4AdqyO|0H~&8OA0W>03=%hekLyQ?vwn=Y>APKDdQ=z*<$!z=H+`q;bHv#n z|4+X8n7+>S`3!w6ano11zCfJ)JBXXU%=KNwS-+XM=@ZxY5NCZaanldI)g}t(sfe?F zkhtmlTt7;j^<%_M-|hO+qpg-A`6q7rPS@v%vwtOV)7QB^Pn`9$r2`T}v*cMvyy znd`fVvwkyi(d4sowp2h_k+zxakwu4-jYl zAaTs+5B&i<9eO<(2uJaN|75;uLB>kGtL z-$C5;iR-(Fvwkyi(+~N04{_G_5;uLHkK^0=)rsM6n@tqTcG4TieR~7Kceoz)tIvq& zfA0EG;qXDb;q#>HOFSRoxc?7%1&6*|^t;`sN;s}N)Ck9QhrDpy7g#5Jg`a$H+h8Eb-+V9C4Nk zzt`g|6OMSwg(IGv@UOWK)^n)$_s;7?KjOSmINn=U5RU6Box;)HO~TRMF5xeEy_Fpa$YLD$~m_4 z(8H%(^zg|EuXdj*;qa*uUgP>Y;m|h%7!lBFyKGdpD_F8Bl+2&GCmd}@TlCodd6b;9A(C>%Zo z;qd7c4j;VF1@XhDOZ4#R77m}S!r{{+96o)*;j>*hd#$qBD?pDN+-sSysJyzuMYr%pK5w~fMae`Kd{ z=r;++`n+2>^jn2vyVfK8NsqHnIDEDXAKxwrM}9_xBR`|Uu^z_xY0NL|CzSYkYjEr* zlnTdw0?vy=k9f*Ok9cyzpTc|>j(BQ>Bc8nQgZ=)1TH&a-PI!syaXkm|ALG1J^lx|G zEgW%f6^=N2gk%4(S2*?$hlHa)j0i`+8WmpdapHO%+6A8yzm5kEpHkuD`)|VGQ!X4n zIpNbi9$cS9z3{0KJ$&-Qu^(6`9R00PIOcmncnWbn=m-Ypz?*eV=(=n?*`$Jr+wKHG)EXF&J~eqYXz zaQKV}htH^R+&`U^rMqS6`LPqjAbd)M!>3d@?q@0!zTM-j68Ji(<-|>2<@y|P)4$R6Rm4p{(e*XNO+U%?wZu)k)%A76O+U@`1>)xKX-GPV zoBkBnZz68`72(ecp8J^)hE1PyeYfcICJtpQansLpeJ^qIUt;1=`iPtUY}XGEH+_wX zLm4D)`o*pvAwDti9utQ$O5F69xIUSh{+#v`)88LQ$It6e2;-(7Uk{Vs_)7Q53BTHT zrEuu0gl}|xjd1Am!aw8sI^l@3QTRcAUspl+pWUZJIO^>beyICw5)OTr@F}j}EFAi7 z;WJ#nRXFrL!q0PkuW;!5gk!#J7Y_Y^aLkuM;m{8W$9x$Pj_viRaO}s939t8dl}(Es z@_>FQ9P>9Pd>8tmaKv9Fyus_O5e|J``1@U7D;)Yd;pjh&!l5q+$NcIL4t=L^kdc^fu zPs6|A{3y(e{=2Tnb{P7D{XU60(SOhNjl?aU-+RIe#4Vm5y1s+B={KGmK__w3|Je22 z!hhy`KseU7r51Q7$lEVnUn%?#&KreeIkjil*$3V&qG<>_BtOE{cFzCP8@Xhv*{D8-)v@t0**YC6Yq9U)8&Yp5AuWm567fm zB7L6pHu!ZveybCH*xc}ACgg^71 zs2>u(*B6vg;d{=C`Z3`T`f^%!aQxj;W0IbkalA(O6Mp|~UieK@qrNPDr5;{YN-Bh7 z9P0to+TWL5hy8T$-#Opp-{2Sfyu3&Fg<$ zVieX1|AF({gfH~-%=ZibmGd3K@9^_@SdLIH)^F7YLIJE&Nm6a*3UoUxjEE} z^;L=Y3-Dw7JVj18p6AUA|EKHq|2??5%(9jwW1_!pO61jkJ_hw-J+NB%XQoE|7U92{ z7WqTMpLdSu(cu5|iBVtT+jH=vPm26F;j5kJgx}%3NjRRjx>Y#V&-V+ThV{1a4?Cae z+c(7ds`E18XPp}3pD!Hu+piFg`}P}!<9URegkN=9^xq~N&r{&}EX0ZRJoXE~@!Us= zZ=b>O{LXR0@f^^6;keIsg>XFY&?p?wr`#m`QNLgJ9^v<%5!>4@`~~Mj!k77u?L>bb z2kq*0K3VwpoG%f6k#9FUgkyVpzwqa0#W?$fC$l5pDICvb?-h>y4Lt9I__2So;_&DP zj{TW#;dpKo&+kD0!^${4p5Fn-^PwZ+gXcgK-~K><^gE-^WZ`%&H76X;#b7%IAMDR; z7CoM8*d`qJd+!wfgLlPvO8hw#_~ZW#=n{_SBen|1|4UHf`&012^Y7)t@m$q>;a^`I z}sEzd!afKPdd%%cE|q z@YPpDj^_msC-!5H^Zf;I?Dx(merL3ZpEKGvu5YiuI+@Yd-WtCfG1S`7R6nD=p`$&S zvAVv!KACZKTU#=twZ%qEK6A#*FbYv1^{wq23XW1y_;E&4%c}Y&g{>{)JhdCQUDeiJ z$s-lXj8!e`*EckWAevj+8)lq$;U%YsnpR!o<7=BY%qXlI<2F@3v=lqoKJL4j<2u`Iv0b04aS{g_pN-$Wemrq>7`17A^EZAy z;T_I>cP>s8KD)f$)#D@%V0z%`VZfM9pS(9JhUAB`h{r!?h9Qf~SFht7)BoDn|M&sz z$G0tpHmv#k_1ZYa!M+{U=`mgv28!jc%>RSn$-cj9`LjCEe&0<^uRB=%(#&M25MU^S z)8aQi%P`>I%folE`YY$f77qIM#p<`Zwf^;i6|2ARw(vtJbrM)vO80#mtGU= z$Nsj}Z?i({?+nb8wm#rewmFXZ?&A1Q(RF+@*%Sti`RZf*hjO33Y@Eaa)Q|7a23&0V z8lN6I*jQVw;QQ_{Y}4lqQpx-D{+P-5FNh!CUk|@vcw7_)R{8YIY*@9A24*?Z{5AUY z8ke@`3HQ|LH~aK`l31Po@i2X{`QO(PBgOum&407P^pnG|6;o;5#%nDxq2x}E-?kW? q6vR5cEuPXv(+M{HGEVm!nE{$V+k6$9zT93u5em*nq$A-&r~f~p2=X2P diff --git a/.local/src2/dwm/shiftview.c b/.local/src2/dwm/shiftview.c deleted file mode 100644 index 3d2706b84..000000000 --- a/.local/src2/dwm/shiftview.c +++ /dev/null @@ -1,64 +0,0 @@ -/** Function to shift the current view to the left/right - * - * @param: "arg->i" stores the number of tags to shift right (positive value) - * or left (negative value) - */ -void -shiftview(const Arg *arg) -{ - Arg shifted; - Client *c; - unsigned int tagmask = 0; - - for (c = selmon->clients; c; c = c->next) - if (!(c->tags & SPTAGMASK)) - tagmask = tagmask | c->tags; - - shifted.ui = selmon->tagset[selmon->seltags] & ~SPTAGMASK; - if (arg->i > 0) /* left circular shift */ - do { - shifted.ui = (shifted.ui << arg->i) - | (shifted.ui >> (LENGTH(tags) - arg->i)); - shifted.ui &= ~SPTAGMASK; - } while (tagmask && !(shifted.ui & tagmask)); - else /* right circular shift */ - do { - shifted.ui = (shifted.ui >> (- arg->i) - | shifted.ui << (LENGTH(tags) + arg->i)); - shifted.ui &= ~SPTAGMASK; - } while (tagmask && !(shifted.ui & tagmask)); - - view(&shifted); -} - -void -shifttag(const Arg *arg) -{ - Arg a; - Client *c; - unsigned visible = 0; - int i = arg->i; - int count = 0; - int nextseltags, curseltags = selmon->tagset[selmon->seltags]; - - do { - if(i > 0) // left circular shift - nextseltags = (curseltags << i) | (curseltags >> (LENGTH(tags) - i)); - - else // right circular shift - nextseltags = curseltags >> (- i) | (curseltags << (LENGTH(tags) + i)); - - // Check if tag is visible - for (c = selmon->clients; c && !visible; c = c->next) - if (nextseltags & c->tags) { - visible = 1; - break; - } - i += arg->i; - } while (!visible && ++count < 10); - - if (count < 10) { - a.i = nextseltags; - tag(&a); - } -} diff --git a/.local/src2/dwm/transient.c b/.local/src2/dwm/transient.c deleted file mode 100644 index 040adb5b3..000000000 --- a/.local/src2/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/.local/src2/dwm/util.c b/.local/src2/dwm/util.c deleted file mode 100644 index fe044fc7b..000000000 --- a/.local/src2/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/.local/src2/dwm/util.h b/.local/src2/dwm/util.h deleted file mode 100644 index f633b5173..000000000 --- a/.local/src2/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/.local/src2/dwm/util.o b/.local/src2/dwm/util.o deleted file mode 100644 index b1b45c326835f724632a67a3815c8745f2d7da1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2216 zcmbtVJ!n%=6h5!5Hr6zWZHG!7B3vbb`e+J5NmZha_9;PXRn#t;CNDOaKVNPnRl$mN z2qnHbf`g!=(4d2>qmy+M>QDy{=7Uon>yE} zX&_C5Q?NUeEI?$>uAi{o1O%WTE*p()zCXB`vmM|JAW~3TPHj_f{`f`iM zgV7|r6^y1>B^Z6imQWsyK4+^ozF=!MzGiQ1e8*ZgzGt5iv&Kr#kq9~l7L3GN#>z>Y z;Owi>TxMG$Fl;ohu#nMAvawG|7V;sDI5Z~0;qU0c(j*uw$I0WPMq`5-_Sper1-+$* z-R*d7a6OE1n~k+?*z8;Hlhiuxjm=(i5}&qeexqr3WD|2AGwDL1oQVTWPff+ck?D(9 zqv6=N9@D88=)n=jLEDKT=mM=poZNFw%=aNjHskd>ivSJ-$g_6Vf4vJPea-X z;YePd59rm!B2UjFa?8O5=~-qWt#h-^LC>an8ua;U6?Cgi6OzaD80eXDv1pc1QYv#( z$ESC!%F~%UVt%_+(<@dP&y6o)Dit&rZsx3X(UhJ2ABHiVwt~)9wS<@qh<%bV*AzxD zK>L@F0)Z9UY&4%p*pEKB&iiz}6BIuxcp)dswpsT=f_KxS$WzUK&5vO&)f~s6np|J@ zD`Rqfi3tplZ+}Fk2yspb1{IE6nJ4kQ!l}}t6sV+!_6BnF&eXd~DHW0L?#umq?xL2Y z?)){8KSRY7bLST@=5_vcBGKgfbpG_dWj=jh$-LGkp8hY$CIr%(rjqV_s_8y^q#z>5 ZGc-|5l-ptG`|p+iQuO~|N9j23{J$Ja3UB}b diff --git a/.local/src2/dwm/vanitygaps.c b/.local/src2/dwm/vanitygaps.c deleted file mode 100644 index 4c98e6944..000000000 --- a/.local/src2/dwm/vanitygaps.c +++ /dev/null @@ -1,550 +0,0 @@ -/* Key binding functions */ -static void defaultgaps(const Arg *arg); -static void incrgaps(const Arg *arg); -/* static void incrigaps(const Arg *arg); */ -/* static void incrogaps(const Arg *arg); */ -/* static void incrohgaps(const Arg *arg); */ -/* static void incrovgaps(const Arg *arg); */ -/* static void incrihgaps(const Arg *arg); */ -/* static void incrivgaps(const Arg *arg); */ -static void togglegaps(const Arg *arg); -static void togglesmartgaps(const Arg *arg); - -/* Layouts */ -static void bstack(Monitor *m); -static void centeredmaster(Monitor *m); -static void centeredfloatingmaster(Monitor *m); -static void deck(Monitor *m); -static void dwindle(Monitor *m); -static void fibonacci(Monitor *m, int s); -static void spiral(Monitor *m); -static void tile(Monitor *); - -/* Internals */ -static void getgaps(Monitor *m, int *oh, int *ov, int *ih, int *iv, unsigned int *nc); -static void setgaps(int oh, int ov, int ih, int iv); - -/* Settings */ -static int enablegaps = 1; - -static void -setgaps(int oh, int ov, int ih, int iv) -{ - if (oh < 0) oh = 0; - if (ov < 0) ov = 0; - if (ih < 0) ih = 0; - if (iv < 0) iv = 0; - - selmon->gappoh = oh; - selmon->gappov = ov; - selmon->gappih = ih; - selmon->gappiv = iv; - arrange(selmon); -} - -static void -togglegaps(const Arg *arg) -{ - enablegaps = !enablegaps; - arrange(NULL); -} - -static void -togglesmartgaps(const Arg *arg) -{ - smartgaps = !smartgaps; - arrange(NULL); -} - -static void -defaultgaps(const Arg *arg) -{ - setgaps(gappoh, gappov, gappih, gappiv); -} - -static void -incrgaps(const Arg *arg) -{ - setgaps( - selmon->gappoh + arg->i, - selmon->gappov + arg->i, - selmon->gappih + arg->i, - selmon->gappiv + arg->i - ); -} - -/* static void */ -/* incrigaps(const Arg *arg) */ -/* { */ -/* setgaps( */ -/* selmon->gappoh, */ -/* selmon->gappov, */ -/* selmon->gappih + arg->i, */ -/* selmon->gappiv + arg->i */ -/* ); */ -/* } */ - -/* static void */ -/* incrogaps(const Arg *arg) */ -/* { */ -/* setgaps( */ -/* selmon->gappoh + arg->i, */ -/* selmon->gappov + arg->i, */ -/* selmon->gappih, */ -/* selmon->gappiv */ -/* ); */ -/* } */ - -/* static void */ -/* incrohgaps(const Arg *arg) */ -/* { */ -/* setgaps( */ -/* selmon->gappoh + arg->i, */ -/* selmon->gappov, */ -/* selmon->gappih, */ -/* selmon->gappiv */ -/* ); */ -/* } */ - -/* static void */ -/* incrovgaps(const Arg *arg) */ -/* { */ -/* setgaps( */ -/* selmon->gappoh, */ -/* selmon->gappov + arg->i, */ -/* selmon->gappih, */ -/* selmon->gappiv */ -/* ); */ -/* } */ - -/* static void */ -/* incrihgaps(const Arg *arg) */ -/* { */ -/* setgaps( */ -/* selmon->gappoh, */ -/* selmon->gappov, */ -/* selmon->gappih + arg->i, */ -/* selmon->gappiv */ -/* ); */ -/* } */ - -/* static void */ -/* incrivgaps(const Arg *arg) */ -/* { */ -/* setgaps( */ -/* selmon->gappoh, */ -/* selmon->gappov, */ -/* selmon->gappih, */ -/* selmon->gappiv + arg->i */ -/* ); */ -/* } */ - -static void -getgaps(Monitor *m, int *oh, int *ov, int *ih, int *iv, unsigned int *nc) -{ - unsigned int n, oe, ie; - oe = ie = enablegaps; - Client *c; - - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); - if (smartgaps && n == 1) { - oe = 0; // outer gaps disabled when only one client - } - - *oh = m->gappoh*oe; // outer horizontal gap - *ov = m->gappov*oe; // outer vertical gap - *ih = m->gappih*ie; // inner horizontal gap - *iv = m->gappiv*ie; // inner vertical gap - *nc = n; // number of clients -} - -void -getfacts(Monitor *m, int msize, int ssize, float *mf, float *sf, int *mr, int *sr) -{ - unsigned int n; - float mfacts, sfacts; - int mtotal = 0, stotal = 0; - Client *c; - - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); - mfacts = MIN(n, m->nmaster); - sfacts = n - m->nmaster; - - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) - if (n < m->nmaster) - mtotal += msize / mfacts; - else - stotal += ssize / sfacts; - - *mf = mfacts; // total factor of master area - *sf = sfacts; // total factor of stack area - *mr = msize - mtotal; // the remainder (rest) of pixels after an even master split - *sr = ssize - stotal; // the remainder (rest) of pixels after an even stack split -} - -/*** - * Layouts - */ - -/* - * Bottomstack layout + gaps - * https://dwm.suckless.org/patches/bottomstack/ - */ - -static void -bstack(Monitor *m) -{ - unsigned int i, n; - int mx = 0, my = 0, mh = 0, mw = 0; - int sx = 0, sy = 0, sh = 0, sw = 0; - float mfacts, sfacts; - int mrest, srest; - Client *c; - - int oh, ov, ih, iv; - getgaps(m, &oh, &ov, &ih, &iv, &n); - - if (n == 0) - return; - - sx = mx = m->wx + ov; - sy = my = m->wy + oh; - sh = mh = m->wh - 2*oh; - mw = m->ww - 2*ov - iv * (MIN(n, m->nmaster) - 1); - sw = m->ww - 2*ov - iv * (n - m->nmaster - 1); - - if (m->nmaster && n > m->nmaster) { - sh = (mh - ih) * (1 - m->mfact); - mh = (mh - ih) * m->mfact; - sx = mx; - sy = my + mh + ih; - } - - getfacts(m, mw, sw, &mfacts, &sfacts, &mrest, &srest); - - for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) { - if (i < m->nmaster) { - resize(c, mx, my, (mw / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0); - mx += WIDTH(c) + iv; - } else { - resize(c, sx, sy, (sw / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*c->bw), sh - (2*c->bw), 0); - sx += WIDTH(c) + iv; - } - } -} - -/* - * Centred master layout + gaps - * https://dwm.suckless.org/patches/centeredmaster/ - */ - -void -centeredmaster(Monitor *m) -{ - unsigned int i, n; - int mx = 0, my = 0, mh = 0, mw = 0; - int lx = 0, ly = 0, lw = 0, lh = 0; - int rx = 0, ry = 0, rw = 0, rh = 0; - float mfacts = 0, lfacts = 0, rfacts = 0; - int mtotal = 0, ltotal = 0, rtotal = 0; - int mrest = 0, lrest = 0, rrest = 0; - Client *c; - - int oh, ov, ih, iv; - getgaps(m, &oh, &ov, &ih, &iv, &n); - - if (n == 0) - return; - - /* initialize areas */ - mx = m->wx + ov; - my = m->wy + oh; - mh = m->wh - 2*oh - ih * ((!m->nmaster ? n : MIN(n, m->nmaster)) - 1); - mw = m->ww - 2*ov; - lh = m->wh - 2*oh - ih * (((n - m->nmaster) / 2) - 1); - rh = m->wh - 2*oh - ih * (((n - m->nmaster) / 2) - ((n - m->nmaster) % 2 ? 0 : 1)); - - if (m->nmaster && n > m->nmaster) { - /* go mfact box in the center if more than nmaster clients */ - if (n - m->nmaster > 1) { - /* ||<-S->|<---M--->|<-S->|| */ - mw = (m->ww - 2*ov - 2*iv) * m->mfact; - lw = (m->ww - mw - 2*ov - 2*iv) / 2; - mx += lw + iv; - } else { - /* ||<---M--->|<-S->|| */ - mw = (mw - iv) * m->mfact; - lw = m->ww - mw - iv - 2*ov; - } - rw = lw; - lx = m->wx + ov; - ly = m->wy + oh; - rx = mx + mw + iv; - ry = m->wy + oh; - } - - /* calculate facts */ - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) { - if (!m->nmaster || n < m->nmaster) - mfacts += 1; - else if ((n - m->nmaster) % 2) - lfacts += 1; // total factor of left hand stack area - else - rfacts += 1; // total factor of right hand stack area - } - - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) - if (!m->nmaster || n < m->nmaster) - mtotal += mh / mfacts; - else if ((n - m->nmaster) % 2) - ltotal += lh / lfacts; - else - rtotal += rh / rfacts; - - mrest = mh - mtotal; - lrest = lh - ltotal; - rrest = rh - rtotal; - - for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) { - if (!m->nmaster || i < m->nmaster) { - /* nmaster clients are stacked vertically, in the center of the screen */ - resize(c, mx, my, mw - (2*c->bw), (mh / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), 0); - my += HEIGHT(c) + ih; - } else { - /* stack clients are stacked vertically */ - if ((i - m->nmaster) % 2 ) { - resize(c, lx, ly, lw - (2*c->bw), (lh / lfacts) + ((i - 2*m->nmaster) < 2*lrest ? 1 : 0) - (2*c->bw), 0); - ly += HEIGHT(c) + ih; - } else { - resize(c, rx, ry, rw - (2*c->bw), (rh / rfacts) + ((i - 2*m->nmaster) < 2*rrest ? 1 : 0) - (2*c->bw), 0); - ry += HEIGHT(c) + ih; - } - } - } -} - -void -centeredfloatingmaster(Monitor *m) -{ - unsigned int i, n; - float mfacts, sfacts; - int mrest, srest; - int mx = 0, my = 0, mh = 0, mw = 0; - int sx = 0, sy = 0, sh = 0, sw = 0; - Client *c; - - float mivf = 1.0; // master inner vertical gap factor - int oh, ov, ih, iv; - getgaps(m, &oh, &ov, &ih, &iv, &n); - - if (n == 0) - return; - - sx = mx = m->wx + ov; - sy = my = m->wy + oh; - sh = mh = m->wh - 2*oh; - mw = m->ww - 2*ov - iv*(n - 1); - sw = m->ww - 2*ov - iv*(n - m->nmaster - 1); - - if (m->nmaster && n > m->nmaster) { - mivf = 0.8; - /* go mfact box in the center if more than nmaster clients */ - if (m->ww > m->wh) { - mw = m->ww * m->mfact - iv*mivf*(MIN(n, m->nmaster) - 1); - mh = m->wh * 0.9 - 2*oh; - } else { - mw = m->ww * 0.9 - iv*mivf*(MIN(n, m->nmaster) - 1); - mh = m->wh * m->mfact; - } - mx = m->wx + (m->ww - mw) / 2; - my = m->wy + (m->wh - mh) / 2; - - sx = m->wx + ov; - sy = m->wy + oh; - sh = m->wh - 2*oh; - } - - getfacts(m, mw, sw, &mfacts, &sfacts, &mrest, &srest); - - for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) - if (i < m->nmaster) { - /* nmaster clients are stacked horizontally, in the center of the screen */ - resize(c, mx, my, (mw / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0); - mx += WIDTH(c) + iv*mivf; - } else { - /* stack clients are stacked horizontally */ - resize(c, sx, sy, (sw / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*c->bw), sh - (2*c->bw), 0); - sx += WIDTH(c) + iv; - } -} - -/* - * Deck layout + gaps - * https://dwm.suckless.org/patches/deck/ - */ - -static void -deck(Monitor *m) -{ - unsigned int i, n; - int mx = 0, my = 0, mh = 0, mw = 0; - int sx = 0, sy = 0, sh = 0, sw = 0; - float mfacts, sfacts; - int mrest, srest; - Client *c; - - int oh, ov, ih, iv; - getgaps(m, &oh, &ov, &ih, &iv, &n); - - if (n == 0) - return; - - sx = mx = m->wx + ov; - sy = my = m->wy + oh; - sh = mh = m->wh - 2*oh - ih * (MIN(n, m->nmaster) - 1); - sw = mw = m->ww - 2*ov; - - if (m->nmaster && n > m->nmaster) { - sw = (mw - iv) * (1 - m->mfact); - mw = (mw - iv) * m->mfact; - sx = mx + mw + iv; - sh = m->wh - 2*oh; - } - - getfacts(m, mh, sh, &mfacts, &sfacts, &mrest, &srest); - - if (n - m->nmaster > 0) /* override layout symbol */ - snprintf(m->ltsymbol, sizeof m->ltsymbol, "D %d", n - m->nmaster); - - for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) - if (i < m->nmaster) { - resize(c, mx, my, mw - (2*c->bw), (mh / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), 0); - my += HEIGHT(c) + ih; - } else { - resize(c, sx, sy, sw - (2*c->bw), sh - (2*c->bw), 0); - } -} - -/* - * Fibonacci layout + gaps - * https://dwm.suckless.org/patches/fibonacci/ - */ - -static void -fibonacci(Monitor *m, int s) -{ - unsigned int i, n; - int nx, ny, nw, nh; - int oh, ov, ih, iv; - Client *c; - - getgaps(m, &oh, &ov, &ih, &iv, &n); - - if (n == 0) - return; - - nx = m->wx + ov; - ny = oh; - nw = m->ww - 2*ov; - nh = m->wh - 2*oh; - - for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next)) { - if ((i % 2 && nh / 2 > 2*c->bw) - || (!(i % 2) && nw / 2 > 2*c->bw)) { - if (i < n - 1) { - if (i % 2) - nh = (nh - ih) / 2; - else - nw = (nw - iv) / 2; - - if ((i % 4) == 2 && !s) - nx += nw + iv; - else if ((i % 4) == 3 && !s) - ny += nh + ih; - } - if ((i % 4) == 0) { - if (s) - ny += nh + ih; - else - ny -= nh + ih; - } - else if ((i % 4) == 1) - nx += nw + iv; - else if ((i % 4) == 2) - ny += nh + ih; - else if ((i % 4) == 3) { - if (s) - nx += nw + iv; - else - nx -= nw + iv; - } - if (i == 0) { - if (n != 1) - nw = (m->ww - 2*ov - iv) * m->mfact; - ny = m->wy + oh; - } - else if (i == 1) - nw = m->ww - nw - iv - 2*ov; - i++; - } - - resize(c, nx, ny, nw - (2*c->bw), nh - (2*c->bw), False); - } -} - -static void -dwindle(Monitor *m) -{ - fibonacci(m, 1); -} - -static void -spiral(Monitor *m) -{ - fibonacci(m, 0); -} - -/* - * Default tile layout + gaps - */ - -static void -tile(Monitor *m) -{ - unsigned int i, n; - int mx = 0, my = 0, mh = 0, mw = 0; - int sx = 0, sy = 0, sh = 0, sw = 0; - float mfacts, sfacts; - int mrest, srest; - Client *c; - - - int oh, ov, ih, iv; - getgaps(m, &oh, &ov, &ih, &iv, &n); - - if (n == 0) - return; - - sx = mx = m->wx + ov; - sy = my = m->wy + oh; - mh = m->wh - 2*oh - ih * (MIN(n, m->nmaster) - 1); - sh = m->wh - 2*oh - ih * (n - m->nmaster - 1); - sw = mw = m->ww - 2*ov; - - if (m->nmaster && n > m->nmaster) { - sw = (mw - iv) * (1 - m->mfact); - mw = (mw - iv) * m->mfact; - sx = mx + mw + iv; - } - - getfacts(m, mh, sh, &mfacts, &sfacts, &mrest, &srest); - - for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) - if (i < m->nmaster) { - resize(c, mx, my, mw - (2*c->bw), (mh / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), 0); - my += HEIGHT(c) + ih; - } else { - resize(c, sx, sy, sw - (2*c->bw), (sh / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*c->bw), 0); - sy += HEIGHT(c) + ih; - } -} diff --git a/.local/src2/dwmblocks/.gitignore b/.local/src2/dwmblocks/.gitignore deleted file mode 100644 index c4bb9708b..000000000 --- a/.local/src2/dwmblocks/.gitignore +++ /dev/null @@ -1,53 +0,0 @@ -# Prerequisites -*.d - -# Object files -*.o -*.ko -*.obj -*.elf - -# Linker output -*.ilk -*.map -*.exp - -# Precompiled Headers -*.gch -*.pch - -# Libraries -*.lib -*.a -*.la -*.lo - -# Shared objects (inc. Windows DLLs) -*.dll -*.so -*.so.* -*.dylib - -# Executables -*.exe -*.out -*.app -*.i*86 -*.x86_64 -*.hex -dwmblocks - -# Debug files -*.dSYM/ -*.su -*.idb -*.pdb - -# Kernel Module Compile Results -*.mod* -*.cmd -.tmp_versions/ -modules.order -Module.symvers -Mkfile.old -dkms.conf diff --git a/.local/src2/dwmblocks/FUNDING.yml b/.local/src2/dwmblocks/FUNDING.yml deleted file mode 100644 index f8e607676..000000000 --- a/.local/src2/dwmblocks/FUNDING.yml +++ /dev/null @@ -1,3 +0,0 @@ -github: lukesmithxyz -custom: ["https://lukesmith.xyz/donate", "https://paypal.me/lukemsmith", "https://lukesmith.xyz/crypto"] -patreon: lukesmith diff --git a/.local/src2/dwmblocks/LICENSE b/.local/src2/dwmblocks/LICENSE deleted file mode 100644 index d159169d1..000000000 --- a/.local/src2/dwmblocks/LICENSE +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/.local/src2/dwmblocks/Makefile b/.local/src2/dwmblocks/Makefile deleted file mode 100644 index 5cfbb5a83..000000000 --- a/.local/src2/dwmblocks/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -.POSIX: - -PREFIX = /usr/local -CC = gcc - -dwmblocks: dwmblocks.o - $(CC) dwmblocks.o -lX11 -o dwmblocks -dwmblocks.o: dwmblocks.c config.h - $(CC) -c dwmblocks.c -clean: - rm -f *.o *.gch dwmblocks -install: dwmblocks - mkdir -p $(DESTDIR)$(PREFIX)/bin - cp -f dwmblocks $(DESTDIR)$(PREFIX)/bin - chmod 755 $(DESTDIR)$(PREFIX)/bin/dwmblocks -uninstall: - rm -f $(DESTDIR)$(PREFIX)/bin/dwmblocks - -.PHONY: clean install uninstall diff --git a/.local/src2/dwmblocks/README.md b/.local/src2/dwmblocks/README.md deleted file mode 100644 index 7d21e3098..000000000 --- a/.local/src2/dwmblocks/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# dwmblocks - -Modular status bar for dwm written in c. - -# Modifying blocks - -The statusbar is made from text output from commandline programs. Blocks are -added and removed by editing the config.h file. - -# Luke's build - -I have dwmblocks read my preexisting scripts -[here in my dotfiles repo](https://github.com/LukeSmithxyz/voidrice/tree/master/.local/bin/statusbar). -So if you want my build out of the box, download those and put them in your -`$PATH`. I do this to avoid redundancy in LARBS, both i3 and dwm use the same -statusbar scripts. - -# Signaling changes - -Most statusbars constantly rerun every script every several seconds to update. -This is an option here, but a superior choice is giving your module a signal -that you can signal to it to update on a relevant event, rather than having it -rerun idly. - -For example, the audio module has the update signal 10 by default. Thus, -running `pkill -RTMIN+10 dwmblocks` will update it. - -You can also run `kill -44 $(pidof dwmblocks)` which will have the same effect, -but is faster. Just add 34 to your typical signal number. - -My volume module *never* updates on its own, instead I have this command run -along side my volume shortcuts in dwm to only update it when relevant. - -Note that all modules must have different signal numbers. - -# Clickable modules - -Like i3blocks, this build allows you to build in additional actions into your -scripts in response to click events. See the above linked scripts for examples -of this using the `$BLOCK_BUTTON` variable. - -For this feature to work, you need the appropriate patch in dwm as well. See -[here](https://dwm.suckless.org/patches/statuscmd/). -Credit for those patches goes to Daniel Bylinka (daniel.bylinka@gmail.com). diff --git a/.local/src2/dwmblocks/config.h b/.local/src2/dwmblocks/config.h deleted file mode 100644 index 5287e7897..000000000 --- a/.local/src2/dwmblocks/config.h +++ /dev/null @@ -1,32 +0,0 @@ -//Modify this file to change what commands output to your statusbar, and recompile using the make command. -static const Block blocks[] = { - /*Icon*//*Command*/ /*Update Interval*/ /*Update Signal*/ - // {"⌨","sb-kbselect", 0, 30}, - {"", "cat /tmp/recordingicon 2>/dev/null", 0, 9}, - {"", "sb-tasks", 10, 26}, - {"", "sb-music", 0, 11}, - {"", "sb-pacpackages", 0, 8}, - {"", "sb-news", 0, 6}, - // {"", "sb-price btc Bitcoin ", 9000, 21}, - {"", "sb-torrent", 20, 7}, - // {"", "sb-memory", 10, 14}, - // {"", "sb-cpu", 10, 18}, - // {"", "sb-moonphase", 21600, 17}, - {"", "sb-mailbox", 180, 12}, - {"", "sb-forecast", 3600, 5}, - // {"", "sb-nettraf", 1, 16}, - // {"", "sb-battery", 5, 3}, - {"", "sb-volume", 0, 10}, - {"", "sb-clock", 60, 1}, - {"", "sb-internet", 5, 4}, - // {"", "sb-help-icon", 0, 15}, -}; - -//Sets delimiter between status commands. NULL character ('\0') means no delimiter. -static char *delim = " │ "; - -// Have dwmblocks automatically recompile and run when you edit this file in -// vim with the following line in your vimrc/init.vim: - -// autocmd BufWritePost ~/.local/src/dwmblocks/config.h !cd ~/.local/src/dwmblocks/; sudo make install && { killall -q dwmblocks;setsid dwmblocks & } - diff --git a/.local/src2/dwmblocks/dwmblocks.c b/.local/src2/dwmblocks/dwmblocks.c deleted file mode 100644 index 0969ed7a0..000000000 --- a/.local/src2/dwmblocks/dwmblocks.c +++ /dev/null @@ -1,294 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#define LENGTH(X) (sizeof(X) / sizeof (X[0])) -#define CMDLENGTH 50 - -typedef struct { - char* icon; - char* command; - unsigned int interval; - unsigned int signal; -} Block; -void sighandler(int num); -void buttonhandler(int sig, siginfo_t *si, void *ucontext); -void replace(char *str, char old, char new); -void remove_all(char *str, char to_remove); -void getcmds(int time); -#ifndef __OpenBSD__ -void getsigcmds(int signal); -void setupsignals(); -void sighandler(int signum); -#endif -int getstatus(char *str, char *last); -void setroot(); -void statusloop(); -void termhandler(int signum); - - -#include "config.h" - -static Display *dpy; -static int screen; -static Window root; -static char statusbar[LENGTH(blocks)][CMDLENGTH] = {0}; -static char statusstr[2][256]; -static int statusContinue = 1; -static void (*writestatus) () = setroot; - -void replace(char *str, char old, char new) -{ - for(char * c = str; *c; c++) - if(*c == old) - *c = new; -} - -// the previous function looked nice but unfortunately it didnt work if to_remove was in any position other than the last character -// theres probably still a better way of doing this -void remove_all(char *str, char to_remove) { - char *read = str; - char *write = str; - while (*read) { - if (*read != to_remove) { - *write++ = *read; - } - ++read; - } - *write = '\0'; -} - -int gcd(int a, int b) -{ - int temp; - while (b > 0){ - temp = a % b; - - a = b; - b = temp; - } - return a; -} - - -//opens process *cmd and stores output in *output -void getcmd(const Block *block, char *output) -{ - if (block->signal) - { - output[0] = block->signal; - output++; - } - char *cmd = block->command; - FILE *cmdf = popen(cmd,"r"); - if (!cmdf){ - //printf("failed to run: %s, %d\n", block->command, errno); - return; - } - char tmpstr[CMDLENGTH] = ""; - // TODO decide whether its better to use the last value till next time or just keep trying while the error was the interrupt - // this keeps trying to read if it got nothing and the error was an interrupt - // could also just read to a separate buffer and not move the data over if interrupted - // this way will take longer trying to complete 1 thing but will get it done - // the other way will move on to keep going with everything and the part that failed to read will be wrong till its updated again - // either way you have to save the data to a temp buffer because when it fails it writes nothing and then then it gets displayed before this finishes - char * s; - int e; - do { - errno = 0; - s = fgets(tmpstr, CMDLENGTH-(strlen(delim)+1), cmdf); - e = errno; - } while (!s && e == EINTR); - pclose(cmdf); - int i = strlen(block->icon); - strcpy(output, block->icon); - strcpy(output+i, tmpstr); - remove_all(output, '\n'); - i = strlen(output); - if ((i > 0 && block != &blocks[LENGTH(blocks) - 1])){ - strcat(output, delim); - } - i+=strlen(delim); - output[i++] = '\0'; -} - -void getcmds(int time) -{ - const Block* current; - for(int i = 0; i < LENGTH(blocks); i++) - { - current = blocks + i; - if ((current->interval != 0 && time % current->interval == 0) || time == -1){ - getcmd(current,statusbar[i]); - } - } -} - -#ifndef __OpenBSD__ -void getsigcmds(int signal) -{ - const Block *current; - for (int i = 0; i < LENGTH(blocks); i++) - { - current = blocks + i; - if (current->signal == signal){ - getcmd(current,statusbar[i]); - } - } -} - -void setupsignals() -{ - struct sigaction sa; - - for(int i = SIGRTMIN; i <= SIGRTMAX; i++) - signal(i, SIG_IGN); - - for(int i = 0; i < LENGTH(blocks); i++) - { - if (blocks[i].signal > 0) - { - signal(SIGRTMIN+blocks[i].signal, sighandler); - sigaddset(&sa.sa_mask, SIGRTMIN+blocks[i].signal); - } - } - sa.sa_sigaction = buttonhandler; - sa.sa_flags = SA_SIGINFO; - sigaction(SIGUSR1, &sa, NULL); - struct sigaction sigchld_action = { - .sa_handler = SIG_DFL, - .sa_flags = SA_NOCLDWAIT - }; - sigaction(SIGCHLD, &sigchld_action, NULL); - -} -#endif - -int getstatus(char *str, char *last) -{ - strcpy(last, str); - str[0] = '\0'; - for(int i = 0; i < LENGTH(blocks); i++) { - strcat(str, statusbar[i]); - if (i == LENGTH(blocks) - 1) - strcat(str, " "); - } - str[strlen(str)-1] = '\0'; - return strcmp(str, last);//0 if they are the same -} - -void setroot() -{ - if (!getstatus(statusstr[0], statusstr[1]))//Only set root if text has changed. - return; - Display *d = XOpenDisplay(NULL); - if (d) { - dpy = d; - } - screen = DefaultScreen(dpy); - root = RootWindow(dpy, screen); - XStoreName(dpy, root, statusstr[0]); - XCloseDisplay(dpy); -} - -void pstdout() -{ - if (!getstatus(statusstr[0], statusstr[1]))//Only write out if text has changed. - return; - printf("%s\n",statusstr[0]); - fflush(stdout); -} - - -void statusloop() -{ -#ifndef __OpenBSD__ - setupsignals(); -#endif - // first figure out the default wait interval by finding the - // greatest common denominator of the intervals - unsigned int interval = -1; - for(int i = 0; i < LENGTH(blocks); i++){ - if(blocks[i].interval){ - interval = gcd(blocks[i].interval, interval); - } - } - unsigned int i = 0; - int interrupted = 0; - const struct timespec sleeptime = {interval, 0}; - struct timespec tosleep = sleeptime; - getcmds(-1); - while(statusContinue) - { - // sleep for tosleep (should be a sleeptime of interval seconds) and put what was left if interrupted back into tosleep - interrupted = nanosleep(&tosleep, &tosleep); - // if interrupted then just go sleep again for the remaining time - if(interrupted == -1){ - continue; - } - // if not interrupted then do the calling and writing - getcmds(i); - writestatus(); - // then increment since its actually been a second (plus the time it took the commands to run) - i += interval; - // set the time to sleep back to the sleeptime of 1s - tosleep = sleeptime; - } -} - -#ifndef __OpenBSD__ -void sighandler(int signum) -{ - getsigcmds(signum-SIGRTMIN); - writestatus(); -} - -void buttonhandler(int sig, siginfo_t *si, void *ucontext) -{ - char button[2] = {'0' + si->si_value.sival_int & 0xff, '\0'}; - pid_t process_id = getpid(); - sig = si->si_value.sival_int >> 8; - if (fork() == 0) - { - const Block *current; - for (int i = 0; i < LENGTH(blocks); i++) - { - current = blocks + i; - if (current->signal == sig) - break; - } - char shcmd[1024]; - sprintf(shcmd,"%s && kill -%d %d",current->command, current->signal+34,process_id); - char *command[] = { "/bin/sh", "-c", shcmd, NULL }; - setenv("BLOCK_BUTTON", button, 1); - setsid(); - execvp(command[0], command); - exit(EXIT_SUCCESS); - } -} - -#endif - -void termhandler(int signum) -{ - statusContinue = 0; - exit(0); -} - -int main(int argc, char** argv) -{ - for(int i = 0; i < argc; i++) - { - if (!strcmp("-d",argv[i])) - delim = argv[++i]; - else if(!strcmp("-p",argv[i])) - writestatus = pstdout; - } - signal(SIGTERM, termhandler); - signal(SIGINT, termhandler); - statusloop(); -} diff --git a/.local/src2/dwmblocks/patches/dwmblocks-statuscmd-fork.diff b/.local/src2/dwmblocks/patches/dwmblocks-statuscmd-fork.diff deleted file mode 100644 index 1ae7d7a1e..000000000 --- a/.local/src2/dwmblocks/patches/dwmblocks-statuscmd-fork.diff +++ /dev/null @@ -1,77 +0,0 @@ -diff --git a/dwmblocks.c b/dwmblocks.c -index 7d7a564..e2c5dd0 100644 ---- a/dwmblocks.c -+++ b/dwmblocks.c -@@ -34,8 +34,6 @@ static int screen; - static Window root; - static char statusbar[LENGTH(blocks)][CMDLENGTH] = {0}; - static char statusstr[2][256]; --static char exportstring[CMDLENGTH + 22] = "export BLOCK_BUTTON=-;"; --static int button = 0; - static int statusContinue = 1; - static void (*writestatus) () = setroot; - -@@ -55,21 +53,8 @@ void getcmd(const Block *block, char *output) - output[0] = block->signal; - output++; - } -- char* cmd; -- FILE *cmdf; -- if (button) -- { -- cmd = strcat(exportstring, block->command); -- cmd[20] = '0' + button; -- button = 0; -- cmdf = popen(cmd,"r"); -- cmd[22] = '\0'; -- } -- else -- { -- cmd = block->command; -- cmdf = popen(cmd,"r"); -- } -+ char *cmd = block->command; -+ FILE *cmdf = popen(cmd,"r"); - if (!cmdf) - return; - fgets(output, CMDLENGTH, cmdf); -@@ -117,6 +102,7 @@ void setupsignals() - sa.sa_sigaction = buttonhandler; - sa.sa_flags = SA_SIGINFO; - sigaction(SIGUSR1, &sa, NULL); -+ signal(SIGCHLD, SIG_IGN); - - } - #endif -@@ -179,9 +165,29 @@ void sighandler(int signum) - - void buttonhandler(int sig, siginfo_t *si, void *ucontext) - { -- button = si->si_value.sival_int & 0xff; -- getsigcmds(si->si_value.sival_int >> 8); -+ int button = si->si_value.sival_int & 0xff; -+ sig = si->si_value.sival_int >> 8; -+ getsigcmds(sig); - writestatus(); -+ if (fork() == 0) -+ { -+ static char exportstring[CMDLENGTH + 22] = "export BLOCK_BUTTON=-;"; -+ const Block *current; -+ int i; -+ for (i = 0; i < LENGTH(blocks); i++) -+ { -+ current = blocks + i; -+ if (current->signal == sig) -+ break; -+ } -+ char *cmd = strcat(exportstring, blocks[i].command); -+ cmd[20] = '0' + button; -+ char *command[] = { "/bin/sh", "-c", cmd, NULL }; -+ setsid(); -+ execvp(command[0], command); -+ exit(EXIT_SUCCESS); -+ cmd[22] = '\0'; -+ } - } - - #endif diff --git a/.local/src2/dwmblocks/patches/dwmblocks-statuscmd-signal.diff b/.local/src2/dwmblocks/patches/dwmblocks-statuscmd-signal.diff deleted file mode 100644 index c2092e77e..000000000 --- a/.local/src2/dwmblocks/patches/dwmblocks-statuscmd-signal.diff +++ /dev/null @@ -1,93 +0,0 @@ -diff --git a/dwmblocks.c b/dwmblocks.c -index 88bdfb0..7bd14df 100644 ---- a/dwmblocks.c -+++ b/dwmblocks.c -@@ -14,6 +14,7 @@ typedef struct { - unsigned int signal; - } Block; - void sighandler(int num); -+void buttonhandler(int sig, siginfo_t *si, void *ucontext); - void replace(char *str, char old, char new); - void getcmds(int time); - #ifndef __OpenBSD__ -@@ -34,6 +35,8 @@ static int screen; - static Window root; - static char statusbar[LENGTH(blocks)][CMDLENGTH] = {0}; - static char statusstr[2][256]; -+static char exportstring[CMDLENGTH + 16] = "export BUTTON=-;"; -+static int button = 0; - static int statusContinue = 1; - static void (*writestatus) () = setroot; - -@@ -48,16 +51,34 @@ void replace(char *str, char old, char new) - //opens process *cmd and stores output in *output - void getcmd(const Block *block, char *output) - { -+ if (block->signal) -+ { -+ output[0] = block->signal; -+ output++; -+ } - strcpy(output, block->icon); -- char *cmd = block->command; -- FILE *cmdf = popen(cmd,"r"); -+ char* cmd; -+ FILE *cmdf; -+ if (button) -+ { -+ cmd = strcat(exportstring, block->command); -+ cmd[14] = '0' + button; -+ button = 0; -+ cmdf = popen(cmd,"r"); -+ cmd[16] = '\0'; -+ } -+ else -+ { -+ cmd = block->command; -+ cmdf = popen(cmd,"r"); -+ } - if (!cmdf) - return; - char c; - int i = strlen(block->icon); - fgets(output+i, CMDLENGTH-i, cmdf); - i = strlen(output); -- if (delim != '\0' && --i) -+ if (delim != '\0' && i) - output[i++] = delim; - output[i++] = '\0'; - pclose(cmdf); -@@ -88,11 +106,18 @@ void getsigcmds(int signal) - - void setupsignals() - { -+ struct sigaction sa; - for(int i = 0; i < LENGTH(blocks); i++) - { - if (blocks[i].signal > 0) -+ { - signal(SIGRTMIN+blocks[i].signal, sighandler); -+ sigaddset(&sa.sa_mask, SIGRTMIN+blocks[i].signal); -+ } - } -+ sa.sa_sigaction = buttonhandler; -+ sa.sa_flags = SA_SIGINFO; -+ sigaction(SIGUSR1, &sa, NULL); - - } - #endif -@@ -152,6 +177,14 @@ void sighandler(int signum) - getsigcmds(signum-SIGRTMIN); - writestatus(); - } -+ -+void buttonhandler(int sig, siginfo_t *si, void *ucontext) -+{ -+ button = si->si_value.sival_int & 0xff; -+ getsigcmds(si->si_value.sival_int >> 8); -+ writestatus(); -+} -+ - #endif - - void termhandler(int signum) diff --git a/.local/src2/slock/LICENSE b/.local/src2/slock/LICENSE deleted file mode 100644 index 2e4419b7d..000000000 --- a/.local/src2/slock/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -MIT/X Consortium License - -© 2015-2016 Markus Teich -© 2014 Dimitris Papastamos -© 2006-2014 Anselm R Garbe -© 2014-2016 Laslo Hunhold - -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/.local/src2/slock/Makefile b/.local/src2/slock/Makefile deleted file mode 100644 index 0d211fb84..000000000 --- a/.local/src2/slock/Makefile +++ /dev/null @@ -1,60 +0,0 @@ -# slock - simple screen locker -# See LICENSE file for copyright and license details. - -include config.mk - -SRC = slock.c ${COMPATSRC} -OBJ = ${SRC:.c=.o} - -all: options slock - -options: - @echo slock build options: - @echo "CFLAGS = ${CFLAGS}" - @echo "LDFLAGS = ${LDFLAGS}" - @echo "CC = ${CC}" - -.c.o: - @echo CC $< - @${CC} -c ${CFLAGS} $< - -${OBJ}: config.h config.mk arg.h util.h - -config.h: - @echo creating $@ from config.def.h - @cp config.def.h $@ - -slock: ${OBJ} - @echo CC -o $@ - @${CC} -o $@ ${OBJ} ${LDFLAGS} - -clean: - @echo cleaning - @rm -f slock ${OBJ} slock-${VERSION}.tar.gz - -dist: clean - @echo creating dist tarball - @mkdir -p slock-${VERSION} - @cp -R LICENSE Makefile README slock.1 config.mk \ - ${SRC} explicit_bzero.c config.def.h arg.h util.h slock-${VERSION} - @tar -cf slock-${VERSION}.tar slock-${VERSION} - @gzip slock-${VERSION}.tar - @rm -rf slock-${VERSION} - -install: all - @echo installing executable file to ${DESTDIR}${PREFIX}/bin - @mkdir -p ${DESTDIR}${PREFIX}/bin - @cp -f slock ${DESTDIR}${PREFIX}/bin - @chmod 755 ${DESTDIR}${PREFIX}/bin/slock - @echo installing manual page to ${DESTDIR}${MANPREFIX}/man1 - @mkdir -p ${DESTDIR}${MANPREFIX}/man1 - @sed "s/VERSION/${VERSION}/g" ${DESTDIR}${MANPREFIX}/man1/slock.1 - @chmod 644 ${DESTDIR}${MANPREFIX}/man1/slock.1 - -uninstall: - @echo removing executable file from ${DESTDIR}${PREFIX}/bin - @rm -f ${DESTDIR}${PREFIX}/bin/slock - @echo removing manual page from ${DESTDIR}${MANPREFIX}/man1 - @rm -f ${DESTDIR}${MANPREFIX}/man1/slock.1 - -.PHONY: all options clean dist install uninstall diff --git a/.local/src2/slock/README b/.local/src2/slock/README deleted file mode 100644 index dcacd01bc..000000000 --- a/.local/src2/slock/README +++ /dev/null @@ -1,24 +0,0 @@ -slock - simple screen locker -============================ -simple screen locker utility for X. - - -Requirements ------------- -In order to build slock you need the Xlib header files. - - -Installation ------------- -Edit config.mk to match your local setup (slock is installed into -the /usr/local namespace by default). - -Afterwards enter the following command to build and install slock -(if necessary as root): - - make clean install - - -Running slock -------------- -Simply invoke the 'slock' command. To get out of it, enter your password. diff --git a/.local/src2/slock/arg.h b/.local/src2/slock/arg.h deleted file mode 100644 index 0b23c53a9..000000000 --- a/.local/src2/slock/arg.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copy me if you can. - * by 20h - */ - -#ifndef ARG_H__ -#define ARG_H__ - -extern char *argv0; - -/* use main(int argc, char *argv[]) */ -#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\ - argv[0] && argv[0][0] == '-'\ - && argv[0][1];\ - argc--, argv++) {\ - char argc_;\ - char **argv_;\ - int brk_;\ - if (argv[0][1] == '-' && argv[0][2] == '\0') {\ - argv++;\ - argc--;\ - break;\ - }\ - for (brk_ = 0, argv[0]++, argv_ = argv;\ - argv[0][0] && !brk_;\ - argv[0]++) {\ - if (argv_ != argv)\ - break;\ - argc_ = argv[0][0];\ - switch (argc_) - -/* Handles obsolete -NUM syntax */ -#define ARGNUM case '0':\ - case '1':\ - case '2':\ - case '3':\ - case '4':\ - case '5':\ - case '6':\ - case '7':\ - case '8':\ - case '9' - -#define ARGEND }\ - } - -#define ARGC() argc_ - -#define ARGNUMF() (brk_ = 1, estrtonum(argv[0], 0, INT_MAX)) - -#define EARGF(x) ((argv[0][1] == '\0' && argv[1] == NULL)?\ - ((x), abort(), (char *)0) :\ - (brk_ = 1, (argv[0][1] != '\0')?\ - (&argv[0][1]) :\ - (argc--, argv++, argv[0]))) - -#define ARGF() ((argv[0][1] == '\0' && argv[1] == NULL)?\ - (char *)0 :\ - (brk_ = 1, (argv[0][1] != '\0')?\ - (&argv[0][1]) :\ - (argc--, argv++, argv[0]))) - -#define LNGARG() &argv[0][0] - -#endif diff --git a/.local/src2/slock/config.h b/.local/src2/slock/config.h deleted file mode 100644 index fd902409a..000000000 --- a/.local/src2/slock/config.h +++ /dev/null @@ -1,38 +0,0 @@ -/* user and group to drop privileges to */ -static const char *user = "nobody"; -static const char *group = "nogroup"; - -static const char *colorname[NUMCOLS] = { - [INIT] = "black", /* after initialization */ - [INPUT] = "#005577", /* during input */ - [FAILED] = "#CC3333", /* wrong password */ - [PAM] = "#9400D3", /* waiting for PAM */ -}; - -/* Xresources preferences to load at startup */ -ResourcePref resources[] = { - { "color0", STRING, &colorname[INIT] }, - { "color4", STRING, &colorname[INPUT] }, - { "color1", STRING, &colorname[FAILED] }, - { "color5", STRING, &colorname[PAM] }, -}; - -/* treat a cleared input like a wrong password (color) */ -static const int failonclear = 1; - -/* Offset for the lockscreen message in pixels */ -static const int xoffset = 1920; -static const int yoffset = 0; - -/* PAM service that's used for authentication */ -static const char * pam_service = "login"; - -/* default message */ -static const char * message = "Check your xsidle.sh and xinitrc to make sure you're properly running slock"; - -/* text color */ -static const char * text_color = "#ffffff"; - -/* text size (must be a valid size) */ -static const char * font_name = "6x13"; - diff --git a/.local/src2/slock/config.mk b/.local/src2/slock/config.mk deleted file mode 100644 index 0524807b3..000000000 --- a/.local/src2/slock/config.mk +++ /dev/null @@ -1,32 +0,0 @@ -# slock version -VERSION = 1.4 - -# Customize below to fit your system - -# paths -PREFIX = /usr/local -MANPREFIX = ${PREFIX}/share/man - -X11INC = /usr/X11R6/include -X11LIB = /usr/X11R6/lib - -# includes and libs -INCS = -I. -I/usr/include -I${X11INC} -LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -lXinerama -lpam - -# flags -CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H -CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS} -LDFLAGS = -s ${LIBS} -COMPATSRC = explicit_bzero.c - -# On OpenBSD and Darwin remove -lcrypt from LIBS -#LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lXext -lXrandr -# On *BSD remove -DHAVE_SHADOW_H from CPPFLAGS -# On NetBSD add -D_NETBSD_SOURCE to CPPFLAGS -#CPPFLAGS = -DVERSION=\"${VERSION}\" -D_BSD_SOURCE -D_NETBSD_SOURCE -# On OpenBSD set COMPATSRC to empty -#COMPATSRC = - -# compiler and linker -CC = cc diff --git a/.local/src2/slock/explicit_bzero.c b/.local/src2/slock/explicit_bzero.c deleted file mode 100644 index 3e33ca85b..000000000 --- a/.local/src2/slock/explicit_bzero.c +++ /dev/null @@ -1,19 +0,0 @@ -/* $OpenBSD: explicit_bzero.c,v 1.3 2014/06/21 02:34:26 matthew Exp $ */ -/* - * Public domain. - * Written by Matthew Dempsky. - */ - -#include - -__attribute__((weak)) void -__explicit_bzero_hook(void *buf, size_t len) -{ -} - -void -explicit_bzero(void *buf, size_t len) -{ - memset(buf, 0, len); - __explicit_bzero_hook(buf, len); -} diff --git a/.local/src2/slock/explicit_bzero.o b/.local/src2/slock/explicit_bzero.o deleted file mode 100644 index 64dc4a35482b6bcdcfc25b29e231f01c27eae845..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1408 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 diff --git a/.local/src2/slock/slock-colormessage-20200210-35633d4.diff b/.local/src2/slock/slock-colormessage-20200210-35633d4.diff deleted file mode 100644 index 0ef08474a..000000000 --- a/.local/src2/slock/slock-colormessage-20200210-35633d4.diff +++ /dev/null @@ -1,284 +0,0 @@ -From 53ba5a8d3608ca9c9c406b12c51c2bfdfb3e01d3 Mon Sep 17 00:00:00 2001 -From: Guy Shefy -Date: Wed, 10 Feb 2021 00:17:46 +0200 -Subject: [PATCH] Add a message command with 24 bit color support - ---- - config.def.h | 9 +++ - config.mk | 2 +- - slock.1 | 7 +++ - slock.c | 154 +++++++++++++++++++++++++++++++++++++++++++++++++-- - 4 files changed, 167 insertions(+), 5 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 9855e21..c2a0ab2 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -10,3 +10,12 @@ static const char *colorname[NUMCOLS] = { - - /* treat a cleared input like a wrong password (color) */ - static const int failonclear = 1; -+ -+/* default message */ -+static const char * message = "Suckless: Software that sucks less."; -+ -+/* text color */ -+static const char * text_color = "#ffffff"; -+ -+/* text size (must be a valid size) */ -+static const char * font_name = "6x10"; -diff --git a/config.mk b/config.mk -index 74429ae..c4ccf66 100644 ---- a/config.mk -+++ b/config.mk -@@ -12,7 +12,7 @@ X11LIB = /usr/X11R6/lib - - # includes and libs - INCS = -I. -I/usr/include -I${X11INC} --LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -+LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -lXinerama - - # flags - CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H -diff --git a/slock.1 b/slock.1 -index 82cdcd6..946165f 100644 ---- a/slock.1 -+++ b/slock.1 -@@ -6,6 +6,8 @@ - .Sh SYNOPSIS - .Nm - .Op Fl v -+.Op Fl f -+.Op Fl m Ar message - .Op Ar cmd Op Ar arg ... - .Sh DESCRIPTION - .Nm -@@ -16,6 +18,11 @@ is executed after the screen has been locked. - .Bl -tag -width Ds - .It Fl v - Print version information to stdout and exit. -+.It Fl f -+List all valid X fonts and exit. -+.It Fl m Ar message -+Overrides default slock lock message. -+.TP - .El - .Sh SECURITY CONSIDERATIONS - To make sure a locked screen can not be bypassed by switching VTs -diff --git a/slock.c b/slock.c -index 5ae738c..b8b7fe4 100644 ---- a/slock.c -+++ b/slock.c -@@ -15,6 +15,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -24,6 +25,9 @@ - - char *argv0; - -+/* global count to prevent repeated error messages */ -+int count_error = 0; -+ - enum { - INIT, - INPUT, -@@ -83,6 +87,132 @@ dontkillme(void) - } - #endif - -+static int -+readescapedint(const char *str, int *i) { -+ int n = 0; -+ if (str[*i]) -+ ++*i; -+ while(str[*i] && str[*i] != ';' && str[*i] != 'm') { -+ n = 10 * n + str[*i] - '0'; -+ ++*i; -+ } -+ return n; -+} -+ -+static void -+writemessage(Display *dpy, Window win, int screen) -+{ -+ int len, line_len, width, height, s_width, s_height, i, k, tab_size, r, g, b, escaped_int, curr_line_len; -+ XGCValues gr_values; -+ XFontStruct *fontinfo; -+ XColor color, dummy; -+ XineramaScreenInfo *xsi; -+ GC gc; -+ fontinfo = XLoadQueryFont(dpy, font_name); -+ -+ if (fontinfo == NULL) { -+ if (count_error == 0) { -+ fprintf(stderr, "slock: Unable to load font \"%s\"\n", font_name); -+ fprintf(stderr, "slock: Try listing fonts with 'slock -f'\n"); -+ count_error++; -+ } -+ return; -+ } -+ -+ tab_size = 8 * XTextWidth(fontinfo, " ", 1); -+ -+ XAllocNamedColor(dpy, DefaultColormap(dpy, screen), -+ text_color, &color, &dummy); -+ -+ gr_values.font = fontinfo->fid; -+ gr_values.foreground = color.pixel; -+ gc=XCreateGC(dpy,win,GCFont+GCForeground, &gr_values); -+ -+ /* To prevent "Uninitialized" warnings. */ -+ xsi = NULL; -+ -+ /* -+ * Start formatting and drawing text -+ */ -+ -+ len = strlen(message); -+ -+ /* Max max line length (cut at '\n') */ -+ line_len = curr_line_len = 0; -+ k = 0; -+ for (i = 0; i < len; i++) { -+ if (message[i] == '\n') { -+ curr_line_len = 0; -+ k++; -+ } else if (message[i] == 0x1b) { -+ while (i < len && message[i] != 'm') { -+ i++; -+ } -+ if (i == len) -+ die("slock: unclosed escape sequence\n"); -+ } else { -+ curr_line_len += XTextWidth(fontinfo, message + i, 1); -+ if (curr_line_len > line_len) -+ line_len = curr_line_len; -+ } -+ } -+ /* If there is only one line */ -+ if (line_len == 0) -+ line_len = len; -+ -+ if (XineramaIsActive(dpy)) { -+ xsi = XineramaQueryScreens(dpy, &i); -+ s_width = xsi[0].width; -+ s_height = xsi[0].height; -+ } else { -+ s_width = DisplayWidth(dpy, screen); -+ s_height = DisplayHeight(dpy, screen); -+ } -+ height = s_height*3/7 - (k*20)/3; -+ width = (s_width - line_len)/2; -+ -+ line_len = 0; -+ /* print the text while parsing 24 bit color ANSI escape codes*/ -+ for (i = k = 0; i < len; i++) { -+ switch (message[i]) { -+ case '\n': -+ line_len = 0; -+ while (message[i + 1] == '\t') { -+ line_len += tab_size; -+ i++; -+ } -+ k++; -+ break; -+ case 0x1b: -+ i++; -+ if (message[i] == '[') { -+ escaped_int = readescapedint(message, &i); -+ if (escaped_int == 39) -+ continue; -+ if (escaped_int != 38) -+ die("slock: unknown escape sequence%d\n", escaped_int); -+ if (readescapedint(message, &i) != 2) -+ die("slock: only 24 bit color supported\n"); -+ r = readescapedint(message, &i) & 0xff; -+ g = readescapedint(message, &i) & 0xff; -+ b = readescapedint(message, &i) & 0xff; -+ XSetForeground(dpy, gc, r << 16 | g << 8 | b); -+ } else -+ die("slock: unknown escape sequence\n"); -+ break; -+ default: -+ XDrawString(dpy, win, gc, width + line_len, height + 20 * k, message + i, 1); -+ line_len += XTextWidth(fontinfo, message + i, 1); -+ } -+ } -+ -+ /* xsi should not be NULL anyway if Xinerama is active, but to be safe */ -+ if (XineramaIsActive(dpy) && xsi != NULL) -+ XFree(xsi); -+} -+ -+ -+ - static const char * - gethash(void) - { -@@ -194,6 +324,7 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, - locks[screen]->win, - locks[screen]->colors[color]); - XClearWindow(dpy, locks[screen]->win); -+ writemessage(dpy, locks[screen]->win, screen); - } - oldc = color; - } -@@ -300,7 +431,7 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) - static void - usage(void) - { -- die("usage: slock [-v] [cmd [arg ...]]\n"); -+ die("usage: slock [-v] [-f] [-m message] [cmd [arg ...]]\n"); - } - - int -@@ -313,12 +444,25 @@ main(int argc, char **argv) { - gid_t dgid; - const char *hash; - Display *dpy; -- int s, nlocks, nscreens; -+ int i, s, nlocks, nscreens; -+ int count_fonts; -+ char **font_names; - - ARGBEGIN { - case 'v': - fprintf(stderr, "slock-"VERSION"\n"); - return 0; -+ case 'm': -+ message = EARGF(usage()); -+ break; -+ case 'f': -+ if (!(dpy = XOpenDisplay(NULL))) -+ die("slock: cannot open display\n"); -+ font_names = XListFonts(dpy, "*", 10000 /* list 10000 fonts*/, &count_fonts); -+ for (i=0; iwin, s); - nlocks++; -- else -+ } else { - break; -+ } - } - XSync(dpy, 0); - --- -2.30.0 - diff --git a/.local/src2/slock/slock-pam_auth-20190207-35633d4.diff b/.local/src2/slock/slock-pam_auth-20190207-35633d4.diff deleted file mode 100644 index 136f4b57a..000000000 --- a/.local/src2/slock/slock-pam_auth-20190207-35633d4.diff +++ /dev/null @@ -1,154 +0,0 @@ -diff --git a/config.def.h b/config.def.h -index 9855e21..19e7f62 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -6,7 +6,11 @@ static const char *colorname[NUMCOLS] = { - [INIT] = "black", /* after initialization */ - [INPUT] = "#005577", /* during input */ - [FAILED] = "#CC3333", /* wrong password */ -+ [PAM] = "#9400D3", /* waiting for PAM */ - }; - - /* treat a cleared input like a wrong password (color) */ - static const int failonclear = 1; -+ -+/* PAM service that's used for authentication */ -+static const char* pam_service = "login"; -diff --git a/config.mk b/config.mk -index 74429ae..6e82074 100644 ---- a/config.mk -+++ b/config.mk -@@ -12,7 +12,7 @@ X11LIB = /usr/X11R6/lib - - # includes and libs - INCS = -I. -I/usr/include -I${X11INC} --LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -+LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -lpam - - # flags - CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H -diff --git a/slock.c b/slock.c -index 5ae738c..3a8da42 100644 ---- a/slock.c -+++ b/slock.c -@@ -18,16 +18,22 @@ - #include - #include - #include -+#include -+#include - - #include "arg.h" - #include "util.h" - - char *argv0; -+static int pam_conv(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr); -+struct pam_conv pamc = {pam_conv, NULL}; -+char passwd[256]; - - enum { - INIT, - INPUT, - FAILED, -+ PAM, - NUMCOLS - }; - -@@ -57,6 +63,31 @@ die(const char *errstr, ...) - exit(1); - } - -+static int -+pam_conv(int num_msg, const struct pam_message **msg, -+ struct pam_response **resp, void *appdata_ptr) -+{ -+ int retval = PAM_CONV_ERR; -+ for(int i=0; imsg_style == PAM_PROMPT_ECHO_OFF && -+ strncmp(msg[i]->msg, "Password: ", 10) == 0) { -+ struct pam_response *resp_msg = malloc(sizeof(struct pam_response)); -+ if (!resp_msg) -+ die("malloc failed\n"); -+ char *password = malloc(strlen(passwd) + 1); -+ if (!password) -+ die("malloc failed\n"); -+ memset(password, 0, strlen(passwd) + 1); -+ strcpy(password, passwd); -+ resp_msg->resp_retcode = 0; -+ resp_msg->resp = password; -+ resp[i] = resp_msg; -+ retval = PAM_SUCCESS; -+ } -+ } -+ return retval; -+} -+ - #ifdef __linux__ - #include - #include -@@ -121,6 +152,8 @@ gethash(void) - } - #endif /* HAVE_SHADOW_H */ - -+ /* pam, store user name */ -+ hash = pw->pw_name; - return hash; - } - -@@ -129,11 +162,12 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, - const char *hash) - { - XRRScreenChangeNotifyEvent *rre; -- char buf[32], passwd[256], *inputhash; -- int num, screen, running, failure, oldc; -+ char buf[32]; -+ int num, screen, running, failure, oldc, retval; - unsigned int len, color; - KeySym ksym; - XEvent ev; -+ pam_handle_t *pamh; - - len = 0; - running = 1; -@@ -160,10 +194,26 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, - case XK_Return: - passwd[len] = '\0'; - errno = 0; -- if (!(inputhash = crypt(passwd, hash))) -- fprintf(stderr, "slock: crypt: %s\n", strerror(errno)); -+ retval = pam_start(pam_service, hash, &pamc, &pamh); -+ color = PAM; -+ for (screen = 0; screen < nscreens; screen++) { -+ XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[color]); -+ XClearWindow(dpy, locks[screen]->win); -+ XRaiseWindow(dpy, locks[screen]->win); -+ } -+ XSync(dpy, False); -+ -+ if (retval == PAM_SUCCESS) -+ retval = pam_authenticate(pamh, 0); -+ if (retval == PAM_SUCCESS) -+ retval = pam_acct_mgmt(pamh, 0); -+ -+ running = 1; -+ if (retval == PAM_SUCCESS) -+ running = 0; - else -- running = !!strcmp(inputhash, hash); -+ fprintf(stderr, "slock: %s\n", pam_strerror(pamh, retval)); -+ pam_end(pamh, retval); - if (running) { - XBell(dpy, 100); - failure = 1; -@@ -339,10 +389,9 @@ main(int argc, char **argv) { - dontkillme(); - #endif - -+ /* the contents of hash are used to transport the current user name */ - hash = gethash(); - errno = 0; -- if (!crypt("", hash)) -- die("slock: crypt: %s\n", strerror(errno)); - - if (!(dpy = XOpenDisplay(NULL))) - die("slock: cannot open display\n"); diff --git a/.local/src2/slock/slock-xresources-20191126-53e56c7.diff b/.local/src2/slock/slock-xresources-20191126-53e56c7.diff deleted file mode 100644 index d49d39b05..000000000 --- a/.local/src2/slock/slock-xresources-20191126-53e56c7.diff +++ /dev/null @@ -1,158 +0,0 @@ -From 53e56c751b3f2be4154760788850c51dbffc0add Mon Sep 17 00:00:00 2001 -From: Arnas Udovicius -Date: Tue, 26 Nov 2019 16:16:15 +0200 -Subject: [PATCH] Read colors from Xresources - ---- - config.def.h | 14 +++++++++-- - slock.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++ - util.h | 3 +++ - 3 files changed, 83 insertions(+), 2 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 6288856..bfc1ba0 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -3,11 +3,21 @@ static const char *user = "nobody"; - static const char *group = "nogroup"; - - static const char *colorname[NUMCOLS] = { -- [INIT] = "black", /* after initialization */ -- [INPUT] = "#005577", /* during input */ -+ [INIT] = "black", /* after initialization */ -+ [INPUT] = "#005577", /* during input */ - [FAILED] = "#CC3333", /* wrong password */ - [CAPS] = "red", /* CapsLock on */ - }; - -+/* -+ * Xresources preferences to load at startup -+ */ -+ResourcePref resources[] = { -+ { "color0", STRING, &colorname[INIT] }, -+ { "color4", STRING, &colorname[INPUT] }, -+ { "color1", STRING, &colorname[FAILED] }, -+ { "color3", STRING, &colorname[CAPS] }, -+}; -+ - /* treat a cleared input like a wrong password (color) */ - static const int failonclear = 1; -diff --git a/slock.c b/slock.c -index 5f4fb7a..2395547 100644 ---- a/slock.c -+++ b/slock.c -@@ -6,6 +6,7 @@ - - #include - #include -+#include - #include - #include - #include -@@ -19,6 +20,7 @@ - #include - #include - #include -+#include - - #include "arg.h" - #include "util.h" -@@ -46,6 +48,19 @@ struct xrandr { - int errbase; - }; - -+/* Xresources preferences */ -+enum resource_type { -+ STRING = 0, -+ INTEGER = 1, -+ FLOAT = 2 -+}; -+ -+typedef struct { -+ char *name; -+ enum resource_type type; -+ void *dst; -+} ResourcePref; -+ - #include "config.h" - - static void -@@ -306,6 +321,57 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) - return NULL; - } - -+int -+resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst) -+{ -+ char **sdst = dst; -+ int *idst = dst; -+ float *fdst = dst; -+ -+ char fullname[256]; -+ char fullclass[256]; -+ char *type; -+ XrmValue ret; -+ -+ snprintf(fullname, sizeof(fullname), "%s.%s", "slock", name); -+ snprintf(fullclass, sizeof(fullclass), "%s.%s", "Slock", name); -+ fullname[sizeof(fullname) - 1] = fullclass[sizeof(fullclass) - 1] = '\0'; -+ -+ XrmGetResource(db, fullname, fullclass, &type, &ret); -+ if (ret.addr == NULL || strncmp("String", type, 64)) -+ return 1; -+ -+ switch (rtype) { -+ case STRING: -+ *sdst = ret.addr; -+ break; -+ case INTEGER: -+ *idst = strtoul(ret.addr, NULL, 10); -+ break; -+ case FLOAT: -+ *fdst = strtof(ret.addr, NULL); -+ break; -+ } -+ return 0; -+} -+ -+void -+config_init(Display *dpy) -+{ -+ char *resm; -+ XrmDatabase db; -+ ResourcePref *p; -+ -+ XrmInitialize(); -+ resm = XResourceManagerString(dpy); -+ if (!resm) -+ return; -+ -+ db = XrmGetStringDatabase(resm); -+ for (p = resources; p < resources + LEN(resources); p++) -+ resource_load(db, p->name, p->type, p->dst); -+} -+ - static void - usage(void) - { -@@ -364,6 +430,8 @@ main(int argc, char **argv) { - if (setuid(duid) < 0) - die("slock: setuid: %s\n", strerror(errno)); - -+ config_init(dpy); -+ - /* check for Xrandr support */ - rr.active = XRRQueryExtension(dpy, &rr.evbase, &rr.errbase); - -diff --git a/util.h b/util.h -index 6f748b8..148dbc1 100644 ---- a/util.h -+++ b/util.h -@@ -1,2 +1,5 @@ -+/* macros */ -+#define LEN(a) (sizeof(a) / sizeof(a)[0]) -+ - #undef explicit_bzero - void explicit_bzero(void *, size_t); --- -2.24.0 diff --git a/.local/src2/slock/slock.1 b/.local/src2/slock/slock.1 deleted file mode 100644 index 946165fa0..000000000 --- a/.local/src2/slock/slock.1 +++ /dev/null @@ -1,46 +0,0 @@ -.Dd 2016-08-23 -.Dt SLOCK 1 -.Sh NAME -.Nm slock -.Nd simple X screen locker -.Sh SYNOPSIS -.Nm -.Op Fl v -.Op Fl f -.Op Fl m Ar message -.Op Ar cmd Op Ar arg ... -.Sh DESCRIPTION -.Nm -is a simple X screen locker. If provided, -.Ar cmd Op Ar arg ... -is executed after the screen has been locked. -.Sh OPTIONS -.Bl -tag -width Ds -.It Fl v -Print version information to stdout and exit. -.It Fl f -List all valid X fonts and exit. -.It Fl m Ar message -Overrides default slock lock message. -.TP -.El -.Sh SECURITY CONSIDERATIONS -To make sure a locked screen can not be bypassed by switching VTs -or killing the X server with Ctrl+Alt+Backspace, it is recommended -to disable both in -.Xr xorg.conf 5 -for maximum security: -.Bd -literal -offset left -Section "ServerFlags" - Option "DontVTSwitch" "True" - Option "DontZap" "True" -EndSection -.Ed -.Sh EXAMPLES -$ -.Nm -/usr/sbin/s2ram -.Sh CUSTOMIZATION -.Nm -can be customized by creating a custom config.h from config.def.h and -(re)compiling the source code. This keeps it fast, secure and simple. diff --git a/.local/src2/slock/slock.c b/.local/src2/slock/slock.c deleted file mode 100644 index 04f32ebe6..000000000 --- a/.local/src2/slock/slock.c +++ /dev/null @@ -1,579 +0,0 @@ -/* See LICENSE file for license details. */ -#define _XOPEN_SOURCE 500 -#if HAVE_SHADOW_H -#include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "arg.h" -#include "util.h" - -char *argv0; -static int pam_conv(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr); -struct pam_conv pamc = {pam_conv, NULL}; -char passwd[256]; - -/* global count to prevent repeated error messages */ -int count_error = 0; - -enum { - INIT, - INPUT, - FAILED, - PAM, - NUMCOLS -}; - -struct lock { - int screen; - Window root, win; - Pixmap pmap; - unsigned long colors[NUMCOLS]; -}; - -struct xrandr { - int active; - int evbase; - int errbase; -}; - -/* Xresources preferences */ -enum resource_type { - STRING = 0, - INTEGER = 1, - FLOAT = 2 -}; - -typedef struct { - char *name; - enum resource_type type; - void *dst; -} ResourcePref; - -#include "config.h" - -static void -die(const char *errstr, ...) -{ - va_list ap; - - va_start(ap, errstr); - vfprintf(stderr, errstr, ap); - va_end(ap); - exit(1); -} - -static int -pam_conv(int num_msg, const struct pam_message **msg, - struct pam_response **resp, void *appdata_ptr) -{ - int retval = PAM_CONV_ERR; - for(int i=0; imsg_style == PAM_PROMPT_ECHO_OFF && - strncmp(msg[i]->msg, "Password: ", 10) == 0) { - struct pam_response *resp_msg = malloc(sizeof(struct pam_response)); - if (!resp_msg) - die("malloc failed\n"); - char *password = malloc(strlen(passwd) + 1); - if (!password) - die("malloc failed\n"); - memset(password, 0, strlen(passwd) + 1); - strcpy(password, passwd); - resp_msg->resp_retcode = 0; - resp_msg->resp = password; - resp[i] = resp_msg; - retval = PAM_SUCCESS; - } - } - return retval; -} - -static int -readescapedint(const char *str, int *i) { - int n = 0; - if (str[*i]) - ++*i; - while(str[*i] && str[*i] != ';' && str[*i] != 'm') { - n = 10 * n + str[*i] - '0'; - ++*i; - } - return n; -} - -static void -writemessage(Display *dpy, Window win, int screen) -{ - int len, line_len, width, height, s_width, s_height, i, k, tab_size, r, g, b, escaped_int, curr_line_len; - XGCValues gr_values; - XFontStruct *fontinfo; - XColor color, dummy; - XineramaScreenInfo *xsi; - GC gc; - fontinfo = XLoadQueryFont(dpy, font_name); - - if (fontinfo == NULL) { - if (count_error == 0) { - fprintf(stderr, "slock: Unable to load font \"%s\"\n", font_name); - fprintf(stderr, "slock: Try listing fonts with 'slock -f'\n"); - count_error++; - } - return; - } - - tab_size = 8 * XTextWidth(fontinfo, " ", 1); - - XAllocNamedColor(dpy, DefaultColormap(dpy, screen), - text_color, &color, &dummy); - - gr_values.font = fontinfo->fid; - gr_values.foreground = color.pixel; - gc=XCreateGC(dpy,win,GCFont+GCForeground, &gr_values); - - /* To prevent "Uninitialized" warnings. */ - xsi = NULL; - - /* - * Start formatting and drawing text - */ - - len = strlen(message); - - /* Max max line length (cut at '\n') */ - line_len = curr_line_len = 0; - k = 0; - for (i = 0; i < len; i++) { - if (message[i] == '\n') { - curr_line_len = 0; - k++; - } else if (message[i] == 0x1b) { - while (i < len && message[i] != 'm') { - i++; - } - if (i == len) - die("slock: unclosed escape sequence\n"); - } else { - curr_line_len += XTextWidth(fontinfo, message + i, 1); - if (curr_line_len > line_len) - line_len = curr_line_len; - } - } - /* If there is only one line */ - if (line_len == 0) - line_len = len; - - if (XineramaIsActive(dpy)) { - xsi = XineramaQueryScreens(dpy, &i); - s_width = xsi[0].width; - s_height = xsi[0].height; - } else { - s_width = DisplayWidth(dpy, screen); - s_height = DisplayHeight(dpy, screen); - } - height = s_height*3/7 - (k*20)/3; - width = (s_width - line_len)/2; - - line_len = 0; - /* print the text while parsing 24 bit color ANSI escape codes*/ - for (i = k = 0; i < len; i++) { - switch (message[i]) { - case '\n': - line_len = 0; - while (message[i + 1] == '\t') { - line_len += tab_size; - i++; - } - k++; - break; - case 0x1b: - i++; - if (message[i] == '[') { - escaped_int = readescapedint(message, &i); - if (escaped_int == 39) - continue; - if (escaped_int != 38) - die("slock: unknown escape sequence%d\n", escaped_int); - if (readescapedint(message, &i) != 2) - die("slock: only 24 bit color supported\n"); - r = readescapedint(message, &i) & 0xff; - g = readescapedint(message, &i) & 0xff; - b = readescapedint(message, &i) & 0xff; - XSetForeground(dpy, gc, r << 16 | g << 8 | b); - } else - die("slock: unknown escape sequence\n"); - break; - default: - XDrawString(dpy, win, gc, width + line_len + xoffset, height + 20 * k + yoffset, message + i, 1); - line_len += XTextWidth(fontinfo, message + i, 1); - } - } - - /* xsi should not be NULL anyway if Xinerama is active, but to be safe */ - if (XineramaIsActive(dpy) && xsi != NULL) - XFree(xsi); -} - -static const char * -gethash(void) -{ - struct passwd *pw; - - /* Check if the current user has a password entry */ - errno = 0; - if (!(pw = getpwuid(getuid()))) { - if (errno) - die("slock: getpwuid: %s\n", strerror(errno)); - else - die("slock: cannot retrieve password entry\n"); - } - return pw->pw_name; -} - -static void -readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, - const char *hash) -{ - XRRScreenChangeNotifyEvent *rre; - char buf[32]; - int num, screen, running, failure, oldc, retval; - - unsigned int len, color; - KeySym ksym; - XEvent ev; - pam_handle_t *pamh; - - len = 0; - running = 1; - failure = 0; - oldc = INIT; - - while (running && !XNextEvent(dpy, &ev)) { - if (ev.type == KeyPress) { - explicit_bzero(&buf, sizeof(buf)); - num = XLookupString(&ev.xkey, buf, sizeof(buf), &ksym, 0); - if (IsKeypadKey(ksym)) { - if (ksym == XK_KP_Enter) - ksym = XK_Return; - else if (ksym >= XK_KP_0 && ksym <= XK_KP_9) - ksym = (ksym - XK_KP_0) + XK_0; - } - if (IsFunctionKey(ksym) || - IsKeypadKey(ksym) || - IsMiscFunctionKey(ksym) || - IsPFKey(ksym) || - IsPrivateKeypadKey(ksym)) - continue; - switch (ksym) { - case XK_Return: - passwd[len] = '\0'; - errno = 0; - retval = pam_start(pam_service, hash, &pamc, &pamh); - color = PAM; - for (screen = 0; screen < nscreens; screen++) { - XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[color]); - XClearWindow(dpy, locks[screen]->win); - XRaiseWindow(dpy, locks[screen]->win); - } - XSync(dpy, False); - - if (retval == PAM_SUCCESS) - retval = pam_authenticate(pamh, 0); - if (retval == PAM_SUCCESS) - retval = pam_acct_mgmt(pamh, 0); - - running = 1; - if (retval == PAM_SUCCESS) - running = 0; - else - fprintf(stderr, "slock: %s\n", pam_strerror(pamh, retval)); - pam_end(pamh, retval); - if (running) { - XBell(dpy, 100); - failure = 1; - } - explicit_bzero(&passwd, sizeof(passwd)); - len = 0; - break; - case XK_Escape: - explicit_bzero(&passwd, sizeof(passwd)); - len = 0; - break; - case XK_BackSpace: - if (len) - passwd[--len] = '\0'; - break; - default: - if (num && !iscntrl((int)buf[0]) && - (len + num < sizeof(passwd))) { - memcpy(passwd + len, buf, num); - len += num; - } - break; - } - color = len ? INPUT : ((failure || failonclear) ? FAILED : INIT); - if (running && oldc != color) { - for (screen = 0; screen < nscreens; screen++) { - XSetWindowBackground(dpy, - locks[screen]->win, - locks[screen]->colors[color]); - XClearWindow(dpy, locks[screen]->win); - writemessage(dpy, locks[screen]->win, screen); - } - oldc = color; - } - } else if (rr->active && ev.type == rr->evbase + RRScreenChangeNotify) { - rre = (XRRScreenChangeNotifyEvent*)&ev; - for (screen = 0; screen < nscreens; screen++) { - if (locks[screen]->win == rre->window) { - if (rre->rotation == RR_Rotate_90 || - rre->rotation == RR_Rotate_270) - XResizeWindow(dpy, locks[screen]->win, - rre->height, rre->width); - else - XResizeWindow(dpy, locks[screen]->win, - rre->width, rre->height); - XClearWindow(dpy, locks[screen]->win); - break; - } - } - } else { - for (screen = 0; screen < nscreens; screen++) - XRaiseWindow(dpy, locks[screen]->win); - } - } -} - -static struct lock * -lockscreen(Display *dpy, struct xrandr *rr, int screen) -{ - char curs[] = {0, 0, 0, 0, 0, 0, 0, 0}; - int i, ptgrab, kbgrab; - struct lock *lock; - XColor color, dummy; - XSetWindowAttributes wa; - Cursor invisible; - - if (dpy == NULL || screen < 0 || !(lock = malloc(sizeof(struct lock)))) - return NULL; - - lock->screen = screen; - lock->root = RootWindow(dpy, lock->screen); - - for (i = 0; i < NUMCOLS; i++) { - XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen), - colorname[i], &color, &dummy); - lock->colors[i] = color.pixel; - } - - /* init */ - wa.override_redirect = 1; - wa.background_pixel = lock->colors[INIT]; - lock->win = XCreateWindow(dpy, lock->root, 0, 0, - DisplayWidth(dpy, lock->screen), - DisplayHeight(dpy, lock->screen), - 0, DefaultDepth(dpy, lock->screen), - CopyFromParent, - DefaultVisual(dpy, lock->screen), - CWOverrideRedirect | CWBackPixel, &wa); - lock->pmap = XCreateBitmapFromData(dpy, lock->win, curs, 8, 8); - invisible = XCreatePixmapCursor(dpy, lock->pmap, lock->pmap, - &color, &color, 0, 0); - XDefineCursor(dpy, lock->win, invisible); - - /* Try to grab mouse pointer *and* keyboard for 600ms, else fail the lock */ - for (i = 0, ptgrab = kbgrab = -1; i < 6; i++) { - if (ptgrab != GrabSuccess) { - ptgrab = XGrabPointer(dpy, lock->root, False, - ButtonPressMask | ButtonReleaseMask | - PointerMotionMask, GrabModeAsync, - GrabModeAsync, None, invisible, CurrentTime); - } - if (kbgrab != GrabSuccess) { - kbgrab = XGrabKeyboard(dpy, lock->root, True, - GrabModeAsync, GrabModeAsync, CurrentTime); - } - - /* input is grabbed: we can lock the screen */ - if (ptgrab == GrabSuccess && kbgrab == GrabSuccess) { - XMapRaised(dpy, lock->win); - if (rr->active) - XRRSelectInput(dpy, lock->win, RRScreenChangeNotifyMask); - - XSelectInput(dpy, lock->root, SubstructureNotifyMask); - return lock; - } - - /* retry on AlreadyGrabbed but fail on other errors */ - if ((ptgrab != AlreadyGrabbed && ptgrab != GrabSuccess) || - (kbgrab != AlreadyGrabbed && kbgrab != GrabSuccess)) - break; - - usleep(100000); - } - - /* we couldn't grab all input: fail out */ - if (ptgrab != GrabSuccess) - fprintf(stderr, "slock: unable to grab mouse pointer for screen %d\n", - screen); - if (kbgrab != GrabSuccess) - fprintf(stderr, "slock: unable to grab keyboard for screen %d\n", - screen); - return NULL; -} - -int -resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst) -{ - char **sdst = dst; - int *idst = dst; - float *fdst = dst; - - char fullname[256]; - char fullclass[256]; - char *type; - XrmValue ret; - - snprintf(fullname, sizeof(fullname), "%s.%s", "slock", name); - snprintf(fullclass, sizeof(fullclass), "%s.%s", "Slock", name); - fullname[sizeof(fullname) - 1] = fullclass[sizeof(fullclass) - 1] = '\0'; - - XrmGetResource(db, fullname, fullclass, &type, &ret); - if (ret.addr == NULL || strncmp("String", type, 64)) - return 1; - - switch (rtype) { - case STRING: - *sdst = ret.addr; - break; - case INTEGER: - *idst = strtoul(ret.addr, NULL, 10); - break; - case FLOAT: - *fdst = strtof(ret.addr, NULL); - break; - } - return 0; -} - -void -config_init(Display *dpy) -{ - char *resm; - XrmDatabase db; - ResourcePref *p; - - XrmInitialize(); - resm = XResourceManagerString(dpy); - if (!resm) - return; - - db = XrmGetStringDatabase(resm); - for (p = resources; p < resources + LEN(resources); p++) - resource_load(db, p->name, p->type, p->dst); -} - -static void -usage(void) -{ - die("usage: slock [-v] [-f] [-m message] [cmd [arg ...]]\n"); -} - -int -main(int argc, char **argv) { - struct xrandr rr; - struct lock **locks; - struct passwd *pwd; - struct group *grp; - uid_t duid; - gid_t dgid; - const char *hash; - Display *dpy; - int i, s, nlocks, nscreens; - int count_fonts; - char **font_names; - - ARGBEGIN { - case 'v': - fprintf(stderr, "slock-"VERSION"\n"); - return 0; - case 'm': - message = EARGF(usage()); - break; - case 'f': - if (!(dpy = XOpenDisplay(NULL))) - die("slock: cannot open display\n"); - font_names = XListFonts(dpy, "*", 10000 /* list 10000 fonts*/, &count_fonts); - for (i=0; iwin, s); - nlocks++; - } else { - break; - } - } - XSync(dpy, 0); - - /* did we manage to lock everything? */ - if (nlocks != nscreens) - return 1; - - /* run post-lock command */ - if (argc > 0) { - switch (fork()) { - case -1: - die("slock: fork failed: %s\n", strerror(errno)); - case 0: - if (close(ConnectionNumber(dpy)) < 0) - die("slock: close: %s\n", strerror(errno)); - execvp(argv[0], argv); - fprintf(stderr, "slock: execvp %s: %s\n", argv[0], strerror(errno)); - _exit(1); - } - } - - /* everything is now blank. Wait for the correct password */ - readpw(dpy, &rr, locks, nscreens, hash); - - return 0; -} - diff --git a/.local/src2/slock/slock.o b/.local/src2/slock/slock.o deleted file mode 100644 index 771d94b4ec2f72fc8c4169a3dd810afa6c7b8945..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15352 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