From 5726dddc110030c487db0a9dd245fd0c790ac96d Mon Sep 17 00:00:00 2001 From: Derek Taylor Date: Fri, 27 Mar 2020 19:46:02 -0500 Subject: [PATCH] Deleting some stuff. --- dmenu/LICENSE | 30 -- dmenu/Makefile | 64 ---- dmenu/README | 24 -- dmenu/arg.h | 49 --- dmenu/config.def.h | 39 -- dmenu/config.h | 38 -- dmenu/config.mk | 31 -- dmenu/dmenu | Bin 44264 -> 0 bytes dmenu/dmenu.1 | 200 ----------- dmenu/dmenu.c | 862 --------------------------------------------- dmenu/dmenu.o | Bin 37160 -> 0 bytes dmenu/dmenu_path | 13 - dmenu/dmenu_run | 2 - dmenu/drw.c | 435 ----------------------- dmenu/drw.h | 57 --- dmenu/drw.o | Bin 10472 -> 0 bytes dmenu/stest | Bin 17688 -> 0 bytes dmenu/stest.1 | 90 ----- dmenu/stest.c | 109 ------ dmenu/stest.o | Bin 5296 -> 0 bytes dmenu/util.c | 35 -- dmenu/util.h | 8 - dmenu/util.o | Bin 2224 -> 0 bytes 23 files changed, 2086 deletions(-) delete mode 100644 dmenu/LICENSE delete mode 100644 dmenu/Makefile delete mode 100644 dmenu/README delete mode 100644 dmenu/arg.h delete mode 100644 dmenu/config.def.h delete mode 100644 dmenu/config.h delete mode 100644 dmenu/config.mk delete mode 100755 dmenu/dmenu delete mode 100644 dmenu/dmenu.1 delete mode 100644 dmenu/dmenu.c delete mode 100644 dmenu/dmenu.o delete mode 100644 dmenu/dmenu_path delete mode 100755 dmenu/dmenu_run delete mode 100644 dmenu/drw.c delete mode 100644 dmenu/drw.h delete mode 100644 dmenu/drw.o delete mode 100755 dmenu/stest delete mode 100644 dmenu/stest.1 delete mode 100644 dmenu/stest.c delete mode 100644 dmenu/stest.o delete mode 100644 dmenu/util.c delete mode 100644 dmenu/util.h delete mode 100644 dmenu/util.o diff --git a/dmenu/LICENSE b/dmenu/LICENSE deleted file mode 100644 index 6ed8ad3..0000000 --- a/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-2019 Hiltjo Posthuma -© 2015-2018 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/dmenu/Makefile b/dmenu/Makefile deleted file mode 100644 index a03a95c..0000000 --- a/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 - -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/dmenu/README b/dmenu/README deleted file mode 100644 index a8fcdfe..0000000 --- a/dmenu/README +++ /dev/null @@ -1,24 +0,0 @@ -dmenu - dynamic menu -==================== -dmenu is an efficient dynamic menu for X. - - -Requirements ------------- -In order to build dmenu you need the Xlib header files. - - -Installation ------------- -Edit config.mk to match your local setup (dmenu is installed into -the /usr/local namespace by default). - -Afterwards enter the following command to build and install dmenu -(if necessary as root): - - make clean install - - -Running dmenu -------------- -See the man page for details. diff --git a/dmenu/arg.h b/dmenu/arg.h deleted file mode 100644 index e94e02b..0000000 --- a/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/dmenu/config.def.h b/dmenu/config.def.h deleted file mode 100644 index e7b0a0d..0000000 --- a/dmenu/config.def.h +++ /dev/null @@ -1,39 +0,0 @@ -/* ____ _____ */ -/* | _ \_ _| Derek Taylor (DistroTube) */ -/* | | | || | http://www.youtube.com/c/DistroTube */ -/* | |_| || | http://www.gitlab.com/dwt1/ */ -/* |____/ |_| */ - -/* 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 */ -static int centered = 0; /* -c option; centers dmenu on screen */ -static int min_width = 600; /* minimum width when centered */ -/* -fn option overrides fonts[0]; default X11 font or font set */ -static const char *fonts[] = { - "Mononoki Nerd Font:size=9" -}; -static const char *prompt = NULL; /* -p option; prompt to the left of input field */ -static const char *colors[SchemeLast][2] = { - /* fg bg */ - [SchemeNorm] = { "#cccccc", "#282a36" }, - [SchemeSel] = { "#ffffff", "#924441" }, - [SchemeSelHighlight] = { "#d7d7d7", "#000000" }, - [SchemeNormHighlight] = { "#e78481", "#000000" }, - [SchemeOut] = { "#000000", "#00ffff" }, - [SchemeMid] = { "#d7d7d7", "#1f2026" }, -}; -/* -l option; if nonzero, dmenu uses vertical list with given number of lines */ -static unsigned int lines = 0; -static unsigned int lineheight = 22; /* -h option; minimum height of a menu line */ - -/* - * Characters not considered part of a word while deleting words - * for example: " /?\"&[]" - */ -static const char worddelimiters[] = " "; - -/* Size of the window border */ -static unsigned int border_width = 0; /* -bw option; to add border width */ - diff --git a/dmenu/config.h b/dmenu/config.h deleted file mode 100644 index d59cd10..0000000 --- a/dmenu/config.h +++ /dev/null @@ -1,38 +0,0 @@ -/* ____ _____ */ -/* | _ \_ _| Derek Taylor (DistroTube) */ -/* | | | || | http://www.youtube.com/c/DistroTube */ -/* | |_| || | http://www.gitlab.com/dwt1/ */ -/* |____/ |_| */ - -/* 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 */ -static int centered = 0; /* -c option; centers dmenu on screen */ -static int min_width = 600; /* minimum width when centered */ -/* -fn option overrides fonts[0]; default X11 font or font set */ -static const char *fonts[] = { - "Mononoki Nerd Font:size=9" -}; -static const char *prompt = NULL; /* -p option; prompt to the left of input field */ -static const char *colors[SchemeLast][2] = { - /* fg bg */ - [SchemeNorm] = { "#cccccc", "#282a36" }, - [SchemeSel] = { "#ffffff", "#924441" }, - [SchemeSelHighlight] = { "#d7d7d7", "#000000" }, - [SchemeNormHighlight] = { "#e78481", "#000000" }, - [SchemeOut] = { "#000000", "#00ffff" }, - [SchemeMid] = { "#d7d7d7", "#1f2026" }, -}; -/* -l option; if nonzero, dmenu uses vertical list with given number of lines */ -static unsigned int lines = 0; -static unsigned int lineheight = 22; /* -h option; minimum height of a menu line */ - -/* - * Characters not considered part of a word while deleting words - * for example: " /?\"&[]" - */ -static const char worddelimiters[] = " "; - -/* Size of the window border */ -static unsigned int border_width = 0; /* -bw option; to add border width */ diff --git a/dmenu/config.mk b/dmenu/config.mk deleted file mode 100644 index 0929b4a..0000000 --- a/dmenu/config.mk +++ /dev/null @@ -1,31 +0,0 @@ -# dmenu version -VERSION = 4.9 - -# paths -PREFIX = /usr/local -MANPREFIX = $(PREFIX)/share/man - -X11INC = /usr/X11R6/include -X11LIB = /usr/X11R6/lib - -# Xinerama, comment if you don't want it -XINERAMALIBS = -lXinerama -XINERAMAFLAGS = -DXINERAMA - -# freetype -FREETYPELIBS = -lfontconfig -lXft -FREETYPEINC = /usr/include/freetype2 -# OpenBSD (uncomment) -#FREETYPEINC = $(X11INC)/freetype2 - -# includes and libs -INCS = -I$(X11INC) -I$(FREETYPEINC) -LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) - -# flags -CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_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/dmenu/dmenu b/dmenu/dmenu deleted file mode 100755 index 987e48ca223fc072c3e76ddbecba545a903bea3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44264 zcmeHwdwf$>_V4K zkzI)D@a=&YzeadO*x%YnV zU%x*%kgUDFd+oK?Ui-bzIq5A`?&|ckG(o#Egv$ittYs=v&LdX+o(Dk6g;L=Re4i&w z6|%r*GE9vxR|#U(YgPJin$7VHP)fIz$EVUMTu!5!g+wWx(bYaxjnSx(qwgMoE^g+K;6s3Ksv8)|FO1hOh>F z=z8+QyVqA%{p+*lrM{fkf9#pE^&f*zm3J@*;dv&+DqH3oX}VW$s@i_-X?`1P$_?V}KVJ`0ZZ?c-X)m8XiU}*Erx-d{VE&2711S;7EFIHz@B$13f+i zJ!u%{M$-Q`1O5Lp@LMVLTk%P~_87>|Fu?CNuzv^e^HY_B|G_}d9}VyY2K5+(u95uk zgn^!ffq!l>u>a=KI_rhz<7S|j;?tbv`^8OYBtz$*>(bQs7lH?Z@513y1zfX_0} zKh40NeFphD4C>`&gM7a<(BEjF=MDpT(ZK$(2Kadf_*MfuCmQ5CXrO1kfq&jJDA&gZ z`nMS1ml)_j8{>A4aJF#ZuPBJ_%3^q~u<55d5W!m5e+;P3b!;yr2xzr0&Bye_CQ!dhIP^Q_E1=gxI=y)S)&@Tuu==T5ULIbD5f?&J*k%-trMFOWPs0lT-G`9r8$ZUzPB@$3=P*rGlFAc6#EmvW!pp~KETG&(< zXoYWDLP1q)OE91>0UX(?^WCCAhs3=K6V%KqLSa-N>+ zNipTYDv0G$9YQUJL(w4oNY&x05j-`%c2)vFEPZVVC1rY973m8`-fC-fheB(j?RD^W za3yO|Fg@&R^HH-Z7Cf9|y6XHeCKw^9W>mF56l`u;smfLRoq=Xwv{kB$Hb$ft2^A+) z`)hp?wF1;%MJUvI5^yv%4F{aj_SP0Znh<0vSNXzJP0U{Ki+pW?T3M*l%ipoT|GWvDe2cC@yJSWz@(nmJsW>W|x{DIkanukkfL$-jzB^{ZVT z1@^ah3W1ImNr(g_=%=m#H0W<@7tm3{=!ijIFcfJG1lrXI$a`rZ@UQXuSFQ0j`&wEB zIGT)uKvPSQ#G0Z^S_-WpPD0JKL{O8RLi5T1%7<)J@i1bAW(*g8_8oz0ztq_t@HTq6 zKG>k<>x%@)D4!H+A;7;XOu`*LZ*xn~*V=MJKxhlJwT0F)`$^L4rGoM?tIY?));71J zjY`czB*+8J)Hl3=CZFVkd}Ab{iUUHASm<_DRC;F@&K(NP84ArVEEzsjgTrLNzte|y zz$Zgm+;BOTgneZUrBN}`MyWNeD%DbBKxZ+Ul!l+Asuto;>d-LSk*5Kt4{1olPW=ex zEbTmDVoM9QJek6IY@QK>35?GW@;Dzor)4y0o(-NZ?Hop%pK|7__*Q<-qTzk~JV?1) zjn{CEx2DWbvl~^pycB#s$BR<%3XYei;8$?GJOy9EaWMs7!SUJ@ypiLc6kOBOkbd1#kaho@^GXr2y7 zGatH&bU5`W?JCvbyos}@aviQerxSHJ*`!^yI$Ue(6z9?5=tx6XgAN}vgbKnc9e#!m zZ`a{;Mxk9DI^3**pj|rLqQf`o@Eje!S%;sg!|&7KbVjIMTXgs&4Fuh)!zb(TZ94oc z9salu&(-05I{a)MzF&u*qr(sAaQ%Ve>pGktZL?JUI{ZAH9z};w)8T_U+^WNm>F^)v zaN#E^Lv7@I9iFYjr|a+>9X>;c=j!kabhuTAU#P?LbU2+EYFCjCzeoc?OLh3gI=ozm z&(z_f4lmH*wK}{|hkJB*kq&Rr;l(<9l@6b+!`pTE939@F!{_SoE*-9)zc=adc{=&c zI{XqHexDAfGc@hmqQm)A$D+3Ca6UCMe47qmpeX@;T!&w(!~1l&U5D@2;g{*~13LV2 z9sarwFW2GyI^3bd6&+ro!v}SEr4B!)!<{-@;PXDU|0*4xt;4Hzc#aNVsKax0xTwRe zI^3nh^K|$XI=o1SU#Y`Ob+}uHm+SBv9WLtdMLN7zhcDLQ9vxn*!y9z?RXTi?4qu|f z+jV%I4)4(6^*X#uhcDIPn{@ax9llwIFW2Gs>2Qw@-=f2>*5O-q_zE4qO^08j!ynh- z*Xr;-9e$k-KOH>nf&WP!_}X&bak2ZeY%ylq84?7sw@*q>9uT|tWbbBXCQCj5oSg9y zzAe+r5h8vS#U=WaxMsXbJS}Y#2N-{lcv{jX`WXK#@wAjpY-9W`;%Nz+*uwZHiKnG& zVl(3(CZ3k8i7v+fk$4)06YY%uE%CHOO*An6m&DW3G*Qd=yNRbIX`-C*w-ZlG(L@pB zZzZ0#9tkVsZy=tQq=_8Hhl!`9XhLB8YT_-#51s%pqmlR=;`1jc_#JS`;? zgFjIDKOo*pd_UvgB%YRzi35y3NIWeW6Mc+-mUvn!Cbltt7xA=ZOKf5Mlf=`KF|nEP z4--#I#Y7k5|42M75fkl<|1I%(#5XYhm&DUjF;UC-yNRbIVxpY!w-ZlG!$c9|ZzZ0V zgb6F-Zy=tQf{7f)hlwvFUSRxc;%5;*_-|JK#M4qR(a-o5#1|8PfbmO+pG|xpPw#Q1dLX{na5GX8iQcv_+*av1*=@w7Bc2#o)fcv_Mr2ES+Z zPkcG?{fvK;cv^xb4lw>8@wD_x^fCTf;%Uj1*v9x>#M4qMv4!zZ5>HF4#Ae1nOgt^E z5?ze{Bk{DPO0+Znx5U#@D$&6BUlLDCs6;K}?PKk2H-%dO&nG!{ezm<4eDkZFp zzk&D~;&T`uCVmm|0^?T`znJ*J4lF^&BXL#Cu$#nMqiB z=x#aS=QzB0DB({~NHRR}zAEu2E>WOLoP+6Sb&DXlW&0XrAxJk`p5tn;rnA`v=RW|*w26FT)3H0T2 zx!F=PS1u3Z;%Pas!TSQxhX})PBPnSC{U!ip{Wwo@L5kWtN#-$C<~}Zyo+8soGPKHso(?YaE;55l%vuqaL1y5`5V(d5 z{3Au6fCOqGa2Xf4KSkhq6mVb`1n7Z4Djk)lx6jfW#N?os@E2$@vgtobQQq4 zypP1q5HC(DuN_0QYr6U=H+)ESAiQm0U{U_&v7$lo)PkQvE~*{)k1{ zuOQo zE7d&Gc_Gtj`Yj^GSb1rzJR9vCI;(n*NN2$tqmQymAFJGsVM2K~2gMkpyau9l0ubY- zG0-B$rxvq(oHkL67tDY%cii6~%1&D?Y^);X^1Dx>TMJ_M?i{guZ?+O7OXR9!uClkI zZ$U_eQ1L-nyaUsbl8(9nI7b5?1&A^buN)!=#_WfYV{DSVibae^L~QDMG9tFH6n^WZ z*z)Y|zVxyKmWo~Rx-{8zHH0jG*#+N|+CC9Q%YDJtw?u(hu zLf{uizsuh(zwS)ylTBxU$4GJ?p z?6^+@Z#3ER+>j`8%OAMqBg#RzH8%B?m4eXwR>#=lXBJ#*n`yb@TzJX6d{>( zh8VxrW)r)QrLDWT_?hCj65o*vW9x0@VsBD1Dd$plJV6qkkY>5c_DUDIW3A8;ueX)D z%m#`v%Sa;lMD|gFZD37W=V(-AChlKQ<_{twoaL~HyQ|VpRF%D2Wm)`HRoT;37Wc8L{1a6c@oR_WFZ;^& z-<&D$l)p~y6T5ef9r%5>{kP31zeWB#zI&gs^gc@7pkiKy8c)KRC=P8OMENBVWt~~; zsCU%6<8G81?4`=v@H%!MRupf2OtMXZBdub*2E}p4PytoN2c7ZiG-rHqnzQV!o30k+ zXJKbPKE8CZd*@gxk!8n{EN7bHEbBvo`W$87qCj6b^A(4@7iNFzO#8rD_N;tBE$zP% z`H3^X9|hfo0`0|cl9}8+@LSRUR?PGs$|A0LYpj?yK&@pH%A#Cu!Goiw-=HM&uE#xS zKO2tI_swT0Gg!=Rh_URb%P!k>vrQS#APLZuBxGlj1pV+lvE~u%6`VvZ7;D>2Z)&#YneoN&`{h~f5)Shgx#^U>!_uOKJ#!ENM&1NuhG~xaRq0~{VKw_#8*|%gWA!$-lK7G}@uF_~YO)_==4+s$yiYm{S^t#6G5gz$ z)aEERqSoB;R*c%QlE0{NeIRc6Q)M$LirF6mi{4KYm-!nA$4s{YS&dSTn~8l0O)c?p zcuZP&GCPw7RR_)Y7lT)34U&Qq55%FTg@|mb08vbA)GE0Q;o@fySAzhX9F%jvChP5w z01!MYEIqwcgjmTG@Q|B9a)MwLln-IIh<>dOa*#OgXA&8Zp#E-SL!I(GEJk0q7r!NT zW6Tt!Ic)4K!Doxm<4~*_UHrmqjGgPWO{&(B!ppa>Yj9WgTbitprw0Uk6 zN`1sFCzb7R5JrTT(U3^C``B1Zj}-ySUH?Y0yN{(u|AO>6NM9qr4;AkCqqh6dnceXo zHZnh9g_v9ZO8GsEMZ*}2iNJ$omL5B)Q!+4ZSZ@0(PPBh9N*_CPOp|uny zmQKsYODJToOCslW@u`-S`Mq znq5u(5zE#TYXl@8rfISFTnH(yS z7WrbDrRNn0C4Ps6VfWu{IZzAReg+QxrW1nBm}xBtHB~f+4}D~`{do{&9*!FlYaogC z{~Y0EJ+@;gl%;1GK*c*2(Qb;iXR|^agKp(kRJ>@}eh+iF7!!_U)}~u}55WY{FWJVr z<)eu~$iaaw%SJP$?pCe606II>4ap_$AQc=qmw+2}K$3vf0J=WNw)FTYru*1JOYc2MttFyrN>u9-QSBy5 zbO4n#VbcLrgNX?`fGV*2gYRXv?Ie!rjI1ZwPjtW%0$wE`W_qnb5cWB#Mqj`Rk)6|^ zMs@iO8Yl8?HqmDKdNahy)I-hl-{hSxAXM75*H)3>w`3mW>0tpfo&_? zu}S|#SQ-UmpGN@A=dU1D#m~6qm)!C} z2P`EZOh5rO5~$3w+?Gz29-lN}m`dKZdPvqz&BfA71xDR0@Z#q8dic%Kb2W@%Mk=99 z=#Wj*5Qnno66rl+=_!Q(xtSimq-q$%B%$cwuF@ZK)rr#rkjBW-={D-RJZWX!_MENCpI;7UA&?q79ETkaD&o>7iK*UwVm6^^5vGo2P;^NaL7Z|z{g{-UEFC|{GLHhga zSXv2Nk&bLZ8r^L#2O>z5P~gN4gu3ms2(a|dW*ZUHvuXlM&xcefY%JIc|5ajS)1N6a zHuW(gWu6>MFB@B93{Uhy4RZVmA_vg6O!sM;URU>lUBt_#7Lde$K$ee+X_nsCSk|S9 z7gZA$Y6%;V>(k}A_!bhh{)SRN;#j>(lhrz9?v+hflGY-~blbhxLf+Eb$Tm-=Cz;&& zN3aEFEfrBiCdJz^P#jf0MW?0JfvD{J1bz6YqhVeNEWvEUo(;3~Tu284v69=af%WGj z+r(rBs3&4g;vDse47;+QQKlRA(COLZuu{0@I>)t+>m1iRyt|tVEz^1c!L!rK1-d^{ z{JBeh>3UKAK&<>Jm`8DiQ#@ud^eL@2Ox1=-2| zX3I3^$@FAjm;DE%6{2&Nq9dLINwkKKrEwS@vw$ZjWdlB_jf`PA|z zRzg;cP1;6=`7s`vUZqglaSVqp`2YeP6D`}b#k6A^-tR+h8@}tpxAc))?%R#SgpyTM zlDPf%Gm!1Is0FpX-+Bmbrk(~Nm;CSIzNMmkRFuE1LnR-@R`BYiqw7+efF-c}rYL{m zmOoLxL><9r*{h+hU??Tsx=?ziV2Yv!4c*E!Xq;5p8T)8icmlQOr6lrU*Um#GSN9iI zcNzw2r!8A~k0h}tz-ePTQbf;%5IG1wiQDs_Sd?E7kG`tRfO@FORn=6XgUDZyT*cGQ zqFm&Pf+9)GbPJU()=|nldKFuKPgKsve1K)=#0927M6Vq!n-ox&{El1xK9Qi+1kNe) zMfr8t&W}wvA~T6kXJP>?2v@}B&VqX`g0wR6T-vDpF9c=NAMhPBJ+d5mmAx)ns$Z9< zK1d9fuDMpKg_GT^kP5hA4^@t?hp~FA!-2rmYN*0;L9&anIds-jg8ZI@F6Du9D8EY( z?JVnGi<-l>z`liIZf7x55#x~e;Hb(vu-z&5uegR9#!@;LUlN;o76hSnwB;{TvmrQ8 zkHmg5F<$cNbQnMN3oy>ujQ5CS%ylv{dnJJ4&(S89QL5Oa#YB1!N=v%!Kc#LMGs!@rDBWzRexJJGb7updbUk34 zV9~MFuCg~HQ=n@CQ(^x*gv3~p@;k_7nC1aY+gmnp(|AaHhbWfYF$4w{0(p-Kv#ItK z1QVUC-_~O0J1BK@+bzIgg9%Ec3rNj+KN3BuCZZGWzp$WbD-krmJp+}hrI!Fue#9(& z6hWP(Pe4H@OJyI=2&P$B`)w{+y9vm^&pm2Q@5UX9?$7dcebQ;mrJ>#40Wr+|=m4NB zkW*e^5u)Cw6k4XCr$VRwt)*;c!K?xydP|O;RV=GFWt=tHuh|G4Pa>thK44(@FI*n;TbXVvpjtCAYV|& zJFo`d<+)lcdu^>5Zu|q52gS+6UopnI(=ge6k=RAU?Fi#!)(5~(9VeGLS(e&jCI9om2i2K5@u9l^P4x262#wXW-l^3f=dE zZ>LZ%;wvbvrD7zeGaWM5{t0f6BIj+4EG%`#8nTtUaP;R`h77MqM#TqLr^Uv35OT1t zj(&o3Er=^&h@rqW2s^whXj-l7Dix$fP}joL*>5K?2gG8gQBbfNM>lG5N^%i{3`{_& zL_V-M^BeauXz@WRQzyJ|o#Q%rcenk+TC@t>2JN>00ntcSvI{gi27#RjIP%{`j)x%x zMWom957vz01y6xdcHx8~X4-@xx%11V$n`ET^1GC80;wEFe^9f`LYBb(MVfGu|Mv;R zmQ+I+=nj&^ab4OM%I^^2SmC&a-RGEv=wCpEBi=eH>CE5jDEnfq3-Wg{drCYY%H_<2 zvmsf91^B>*i?|(y#NzpWrS^UfZ7LRNL zC1oae4tx!X`yoLK4^)6f>_!cYb|f*F_gM!%qakwA4q5>{Lp>{Q-`Wm)D&NM!+!_fYQWE?g_%bY(&POlK&wM z>&lKC(z66|=(Gp1qKcbp)K%DHNaU2?uXSQ*pMq9FGq>^_7TBH@s8o7d1DbyVqKGVa zGjwRVPge7dsQFIO<;ya?0+}LlJ)$#Auc|^v+sI3MVpEA%@*r{X)Ta=n&iuZNo^PK4 z4kqq{iO)hYF3iFS=g&z3N1N#Sn-PSWX^hxEb%SH83~h^JSoumDReh4@nFp9&l5mY^4XhzLQth)#>nXD9RaU!x(j13gjRtxTfi=-YH7{0WE- zJdecv2q5X!lSx0JI}UNXU!U|%vJArpCB2y?g#onsi%G*`BiR1O z?bDH7`K_8xnxJkE?;zE(=~AWvnI~CGFwN8@wbI&d4bP4zTdF2AQL+P+v12(}+XY~0 zljx2Y>^}=Zbu!xUS*bN;mzW2D#;^6ZJY^?o#zF`QXz_E9Sb48}Emj`ApGzyTU-;V< zf)KAvbCm75=@LhB5B&WrAWnJ4uR&`3AGvmZltDYi+sK=;sS7B1<_uuyXUg?vs$5eG z!SRw9^1-2 zxMP7m)mKP>M}@F8#`)SyVCX{d1s+s4+*mx}Km?y#S-wrwA1vEUUL=-h44K z-sM6>Y=MZ|i^ge(PZs24JQQE3pkG!ZkO%-KN z&H##0kKAH&U|@36-Oz%lHwLDl!PrSquFMvnu0*e+@YM4G4S1l$!3>}UBklf5lao9w zWpo;yA7#1Z>vIM&MB2tivR&w;T*JUrj9wId9imnIiOsy1%O*F`3Xo(??=)_kiLUSQxR`ukqtR6s)>P7Zh6L! z8B)*)f_Og>*)&%rb`a%SYO7fN)J=}!3OcT$ zQxkOwN)5qz1|1(`nYnHmvJ@cjqyQ~gh2j~nB6oad2I}~66i{%**O#C$heV5OH=>n^ zuaOJhx*2Wr6FNPm72bsSfiMXh9O?lYb$BME%-6pZJf*P?coP zpdFm$3^8_7Ej4y9d{E6Qjz)Nrr>fjjhDxS6lQ5#4(rqHtHzaZ4Us%g1iXRi6=g`XGd2 zH^Ihej&csN#6Wjl;;L7YNepLI^3xc~Xd~dFjR2)&rqqf4cej_ruv+C?l+P(+vHlgF z4uK^w{;*5lgT5#3{1A^k{Yrrt8S0ExmOAAkr`(aLjEDc2_~GJbs1aMS4mb~vQy)u` z4`Xjca30QP)lGQuGs?{{X$3!r(ze=ZuWuHq{ES!#^%H{WzIkdFI@PiK9V1C#!;+R%)%-v4un25ybq-W9E2`MYC_QO1QB6$V8)LFIF0 zY*4-bq8O{i>1cbovI$0`wV}OyffoAEL~KG571{XSO>-70rlS+IjU$vn_YY~7dnpH( z3;RD9<#5S#%CVgWOyxMzQF&%!vn9XlicNeMGY#D{-+3sLO%ganR%*!jvUgbHT=)7w zI(i10B-$fRyjeLRx~_C6RHW_USbM9h!{}X(j4eI4B1b&DRYZdT@?48eDH^5|&(+8; zqHAWMgfu3{(19X(RNczwFC~*zy{P&+#sjxX=gFx6j)&moxLYsfOzts zRq;hhMA6y{k`6u|(cygJpAg_<5<9FXf6T9Qq2b58XsO>*!=vVM)e^^54jK0a-*D7A zcGJoLzP1h<&*+#6ddppSEDJ5T6iQK7(0#c}e%_5G z!Atb)0`4$Bt9%Y6G&hX4?7$JLL(a6(ypk2eb2n9R6_%~~!C)Hob7W5=0rzp0{7*i} z%g^C3$CF7O?y+qK#l)NEly}LJ%{uy7XADmk0Hh`KOjfZvlY4CRvo*zi$S-g7;OJeJ zo(oLGvr3zVpxAv=5oUNBf;hjj;lzewG1_GVHLC)p2xcG%)J8jD?ZoTo%d`X4Mb%1=k6j4#DgM1E4=HjT7M6p(O+DfsIFH#P_NMh*2 z{wg$)s8!eh#h8fBQCqJ37kuPQqle>Y@IlrS9am!`+$^UQg$BF6 z>!;9DKP0hAWW#Fr`^UPz8?^MEkE9OzRWRX^V*}Hxij$A@4NOr*9_bnw@7O{6|3~@< zvK>2cYAHN2c=Tm+K_4IXK!ubBK<9$*I3l4T2@0aEvxC51ftwr|-$GVOWMvItD4<8$tR-Ame zZ{TcZ^ut{PIn1Dk`v*obdmbJ++$DZzr zvMDESnTJj9Uon_~Ilew$jQ>=~gTRL4N!$f^k{p9G{x=6E>3lSRmDEwjyJLY;YX1u` z986(HwKZiQM+@9(r~*7U$Pf&x1LwL>L#UaXvgJ1w@tgl7U?NUrmDXpei&d542qagCnlZmbuQx5wVV3Wgn#QSQ1*nJ&46LNE@CXqjzFCrahK?D`J!yR24Ax)NeWgmonfGo;FJ= z?JuxMWfLe?E>yd0k>|EK73cF5heJ=Shm_^2mKymp(xZam$U?fhTDV`QQ=chsHSYCmPmr z1!)YqH&>a0l&oIZD%es5*TSSsc-NW%IxtZk>&MZsh*l;fJ~~bY-p@u_>sHNT&f>UC6QdM@@}=#4R`yn?|$6Iki|g;iRni89LNhhOPMo(unzXcX8itOgQKc zm~$|{Tue))Z(0A{j#*q#3Q^O%^mw@H#%!Dq{&PP$B-5td`=lJs#tPwEn&iaTJmq-^ zu+`#pRH?dR+VI%{>Ms}yF(c9tiPlo;Mybo)2#Gy?(j}IBJoatLciS2)`SrGTOaA?~ zE~K&KKVaL;=$~v`7=4sI18K?syR8qrZpy*ThO)=(>laW~Saf1>-(%~C(9@ah#ty4_ z>a7otPh;u)~T3$}GsDoq6E; zfiXL<$Q6_+fSAja*(mu{%C)FpY6|oYfM+ZOzQf3|VmEG*_dr}=_wU&|G>^=sBLSEE zDy^fxr33YU(*el?fa~1(bg-VS9Nq_IJAcTKrWL=%@6V%`V3F*UKXD`{zK6|Y8rD(K zPf?xOx>lgOhfeq7ck_HnCrJ{2`a11_(;hhOfzuv1?ScPE9-!Y&D>6_=3TZWaYo%XPptXHg@7i zGv{j&>d*P<@JsR640s~?Jxl8v?WZ{PU^DyuPpdGaX%=2zC|D~nM-h{Q`R1rg8)=sJk66V~~{LHxSpd}}adRez<>8c~10 zbIeF_ZQ74l@2Sn#v zi#lesb_mFwYAFH_Q_98wjPW%EnhMp@36*YFZN*~85~r}VzPi*~SHHxyXraJd!GAW> z-`axTgyc*M{ZMM1)Y%#kru*3?OrKpk+c#&PFuj>w!t}D)bLY-27N!@mizr11(*u{3 z&MgJrbP4?vrWZHQE}A`0s0jt}Z%vDJQ6Su8r5}-;AHi=U+RKC=;iM*jJq3OAVGa8~ z(a|_Qp!h~kQ)TZ0{&SpGY{lmZeBQz53(hA&bC5UXc|Es*!k6-J4X1jY62~6rl=8n7 z;ooD+qkZlG{~|td=qIcn;V0SdaMHbS<9JL-Xf?5 zS*==|(HpHn{9NXI>xDBS7mi60Y^PrkRV7KtDut}=>aUZIET5v7%NCB&T9Gx<9`Ms| z#-jPK-kXvi`;AQepsCuOnMs1Q3Kq2BS2I;RT7p(W{60Uv+oFJnnxtA9pDKqgjCPG| z@Dro>olha+_qDR$^)(nYQDZFT79LNB7Ie`w^(s~4Rqp@(-KB}pj*MN{l;MII=*{zm zv~x2S(7R|C0ULZWncR$ULtipUJK1*7Rvgw0qW(I-Cs3aUK&?1c{|NLl&|{$8pf(&I zIdKBt4thT*y)|?ZZuq_e`WooJK|63y(1z2DRy<141$zEF$z&g>3r`DOi+$*Sf%bsr z;W4d0f&K>c70}gquGI=VjuORP;tB=wpzWX?pl2qa2ecJ*5cH>@W8t??L7kvkc<{CX z^m@=P(1W0lgT4*=Jm?|Ne$cxHa2N|ey$IR^dIg??eiYR573>}@2<4zo&|5&;L4OUp z8T8JtVK3-5(EXs+Z%~W0yTgUUaCW8LutZ4f$VoeQ?5J$=G2wXTLufykOwJ++=O|XO zHUzPS6Fg5K4>~9_=Tw_>udtl4F1t&({G0_B&9R*il%>BGbj$W+a;R#-lM)G^Gf`)k zfYL?SCVb`sJC6W|IVTU~eta$iRz+BaIp>b_E6lkYGZvby-I+miE~F~Vq+7&iKR(ML zORp1=>|N;<=G;3oD$Le+W|cYb4wKVdv@y$JF6|!WGWVBf{3^{{>M$2M%y|%jD3UN` zRKAJO@jTj+2Vpf|r#ZJf!(q0j*J#<6BI;7e{Tp(3@;u{|=N%-sF%ycrO~@dlE6tn- z#BnkUf%2gCx(K&e{!DqGBpcHq(VgKmm#06#@^F~5Np1_|UWVLnhReCkwdp_ACYe)sV5FQoEUrkR!U3iDujx`==S&`l#c{(`R zSi-pUpxNUwH$+A(8~Im2|Na>Lyph7J9?-_RGb)Gbn%6@fXxHk2 z^wmO6f?Vg29IICm`dT$PYOfuT+Y7m8;2YH^uA%no8txMpYANGa=_3|_wf#NNRq;ON zJIWLOji;l%@^*;&={8+yE=q42GrS#Eoq;AgykTxb@|;YxX^gXBJP)U{3w0gO6o=b& zg}Ey$r$2vHSUd3If@559B4tUr6$-P5Rh4N8|1` z#NC3pjp=GRYgsvo&%~TWaUP0uk`K~r#+b9Ig=ABn zHpIV*cpA4U&pTu=tYhN^KH4JY}G^W!WI39B(pK91R-wrHWhmp=6U?-se4_yB# zWB1AN!GWBv9>W}sob`^bI%5fNNTyT(m0|=q4|)9?`ObnZ<&-b#zB|2+x~LUnl4vff zGv`$9W`3tS%)|U!3E3M-7CyLx#_NsbgKmt0CeeVz8eX%C$Cz-bSh_P}Wmoc6$J51jVEX%C$Cz-bSh_Q3y-2eiLWrTslBI#Qx5 zmDbU@oeu9z;jhG*oIalZh8A68RU!yhH876zo~zXW+czVq{oSl{c|5kf?7~}G?9%>z z7CX-YqQ!rEB8fK5%__u; zE#z$zYr_G$M<#Z#b_j39mr;l;EkJDE(^ok?#OV=Ev!?U>IlX|>d7M^rx{T9iPS575LK~ll<5_|>jt|F23EFr! z9M2ZCadJ35TF}Pd;rJLq8>ffkm=&ygL=9(PHnWb1j}tbJ&`vT0v#@1E+#+c6pFWoi zI_+)HBWgGUfBCp5FcLmq*xWo4K4EA+)yHPwF10p~4#y`6BaPD;!el}Fdy2#5&l;K! zhvT_IKko;_@soeIc{r}k?k7>|JDI|lr}Q0~3`fFgo=bKOh7alApOP=# zhakK*1+V0IKgTn{({%+tB>#E}Ud!=8`uPN0n*1_^$sXxa1`8gQu;xVg^BiaQ?h!}# zY)JoSDf($~LAa8FhdKUs3Vs8}w{l$b^DP|Tl7jbed|L`G11CFIT!sLyKdVHz7nJN7 zOp(8z;~gpZ7T~036geE%Z&V^Yf`&zU8dBu{he3!L=d?@$%6X9^H}f#XXmRQy7dN?!vZ{U34tTK&Gs@nb3a-{*K= ziaiOAKc0er#c|=U2;h1~CBkt~va@rc3N&(@eqEI8X;0BJ3OLEX#pT&^0!Tx@U!R6? z?0&zhK$`|G;_~#4JzbqD5h^+U635x|0f=)kJ!pq1?YxfT{V9I9j^Vk2_IFh^|2K2} zzr+t2(4{R$+qnEUe7w^9EOGrpivQ_vex%`!-?0?=4IJ-EvFA3952nc9&2cN2Z(vs8 zw@Vm~{+LqU2RXhu#hyQNd{s)l{Eg$AQt-cXyekE#af|BLlY;LBKGJwg&zn)b*U~_z zyAE=^D+T|U39`y08Q z3*D*)_6!ArA&!S@RGd8@f#3~HKV}&||K_RD!Um4hZ>7_v;hTVul&_IL?_zq!3-#Kr zPgTdhN7C~v$m40UQ`Q69n4VMT<$X+k!YT9qYaG}1-CDMvGCilR2gZ#e|DU=p`Z>le zEBZz1y#F=yjMtRv=nn?CIb&q`X$JUQ1H9S*cN^dyhNC@Sts2RPVfGj0Mza5A13mwN zgyYdZt-Sry`hc#Of&8y|zIQHGRZc3EawM^yD4PQzO|)zeqh2{(%ABNO=0G z>(awa-Yi_cT+Nj|Z-HPY2F#K4Pd32w4e-kh@aqh4`lafT^1Zwk!`YdmXLdJSs$d;`450IxK_YYp&5 z1N_GZ_>I7=rLR9 zpQqK6GY$F?J>NW1{mx=I)^$AJ3%RmVj??eO(WRX?Rs%m1^WBz|b;8vK`h5mCJx?~0 zJvSQQn}DC0o-1tP`KngonL8$L7H+soMc8v&2>!}I&qD_I9(5_PJm;T1cNbTfp1N;L6{CflZEG)1`(tn`=zJTFo z;T%5SY3KNEj&JAndp0j`J;#&09@%q$+)LUR~z26~&KZEc-MqT{^Ol7@+*aloPuDxntzz>9vIX+~+t`Zkn=h_3^rr4_b>=j3U?I=4$Hi0I1rIg zp@P?W^&&@&t5Wb(GFuR;_E+L{!McFtXlkMmfLir^M`r*{E7U1?@Fp_~?7J!&2zS=8 zT8L;0=+)CowU>CRsYL9XBVKQ7OQYZGk3^XZg-Ea+FDOdQ<>d?Au8K{5k$^7qXnSjmpWFoxdLw?+qw2ku2(0TIuEOhGiDu+wWrWKD9WByu0nZX&OC-SG z$0dcV#RViU-UwD(m!~omT#NQu7ibOmr4}?w&%ywIgSQrK98sMD{6S55xNcrbHS;!K zOK^BJiswX+tYhzHE~VD$SsJ8{eq{izh2JY%eUXR=zi2+?W)4-1T2;&s+y~7tJCc&k zV!ZO~&iTUycIs@9@|pnC)YDbcDEhFVl*sJ+vH`V^R@T5la@C;F>T z@~L&o{G__2f(;396*U*Fyi}uYzINs!t!BBayk5W5*&gsVdhrVCNu#K%`#XHpE`6JZEdhoTrQJt$o35;O~6a3!3<+7GpL)-q8O7+c!{XdG}~iXQ3`3(?!C z1)NmiS%hgpbro;?H8eoOBzS;#d(us_2emo;PtgneaHlii7P{bu2Px`)JdV%;Tm;al|~W4Cxu#uOOQcf_<;2b7fpB7?A?EA8uX(C4tmFT5ynNK zEzm~u#PH=S9Euukrd^#&I zX@o&FMox~iS|=cN?I{D9hca{3kiD2ehkG#S3x*=Cfj~;>J#CHdP-soGy^f7A{AKIm zNl{1j)Z{uObkB%72)Stf4LYPy8){S?jv7P0aFgn*Qw(E+e{BfER3NPP44*4lrKy8O zjrOYyx)D^@P|0JFfW)1~{N!&9Yoj|l5#HM$ZaoIVP_VgWWnHu}BDF|S%n59kscq?? zPG9YJ2AX}*R!J9+p@o{`a6QNs7>2XqFoyPUC?!j8fCe9JK;{{FYJBZ%9%)joMw{e= z4E#$yTy4&Rhxw|WjSwv~rBUmtrC0K?Ou}qG)J8GEur@jb@F^I*TM!B(oo$k@5fp8K z(N$WARYJQ^h@Z3w6s`A}asBjfXzLf%tTjh(a5(=9-gV3i^EMZv; zrn?ADbb7{%xNxA=M+tbSy;Twl*`QE}VBt!v6bsqNR7mS02!)uh3InV7N@!IRlxUoq zR9zAYEQJQcLUd-K5bH9mVYP!}Z6o>rN$I(}G<>i8g1thTK=i!@8RhyxI*o@8jWhtOH%r?@JUU7CopP%WFNb%!>RUMC`XyCT9~Me zk3PNCN~kdOyiU7jxC&#huU;CZ+n@UM+Veab)$HZThV0kyU!|ni_S+i$>l`hmO0|47 z^mi%gwdaF0I!+VhG`0Qzfv4B%PiWwRoED{&-^!yk@(==4el5NBypcxfH%atYYW_PA zsZXyxm!#4CnxnXq6qY@QU`8DEA-c5tl3VzL1*!5HuhD-YjRhYqz4n~b*8j)!?;|a> zJuSWVJk&Ox-pU=LwNEWytsd_~S}MPmUVCopz%2lA6{%$CTT8FePZ6U}uRU)pbg4=9 zYZb#aXz4WibxL~eer*4(YJ#miokpx$fYa|lNtb57cAsKXw<=I{J{RP~I-C_wfG7J? z%c-SLl_y!c^faZ2EPgA`-#VGG?0xMv1hsN&<1Y=*n(eBj`n~@bD!m8iTKY@NSHtM> T>5 -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#ifdef XINERAMA -#include -#endif -#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 NUMBERSMAXDIGITS 100 -#define NUMBERSBUFSIZE (NUMBERSMAXDIGITS * 2) + 1 - -/* enums */ -enum { SchemeNorm, SchemeSel, SchemeOut, SchemeNormHighlight, SchemeSelHighlight, SchemeMid, SchemeLast }; /* color schemes */ - -struct item { - char *text; - struct item *left, *right; - int out; -}; - -static char numbers[NUMBERSBUFSIZE] = ""; -static char text[BUFSIZ] = ""; -static char *embed; -static int bh, mw, mh; -static int inputw = 0, promptw; -static int lrpad; /* sum of left and right padding */ -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 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 -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 int -max_textw(void) -{ - int len = 0; - for (struct item *item = items; item && item->text; item++) - len = MAX(TEXTW(item->text), len); - return len; -} - -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 void -drawhighlights(struct item *item, int x, int y, int maxw) -{ - char restorechar, tokens[sizeof text], *highlight, *token; - int indentx, highlightlen; - - drw_setscheme(drw, scheme[item == sel ? SchemeSelHighlight : SchemeNormHighlight]); - strcpy(tokens, text); - for (token = strtok(tokens, " "); token; token = strtok(NULL, " ")) { - highlight = fstrstr(item->text, token); - while (highlight) { - // Move item str end, calc width for highlight indent, & restore - highlightlen = highlight - item->text; - restorechar = *highlight; - item->text[highlightlen] = '\0'; - indentx = TEXTW(item->text); - item->text[highlightlen] = restorechar; - - // Move highlight str end, draw highlight, & restore - restorechar = highlight[strlen(token)]; - highlight[strlen(token)] = '\0'; - drw_text( - drw, - x + indentx - (lrpad / 2) - 1, - y, - MIN(maxw - indentx, TEXTW(highlight) - lrpad), - bh, 0, highlight, 0 - ); - highlight[strlen(token)] = restorechar; - - if (strlen(highlight) - strlen(token) < strlen(token)) break; - highlight = fstrstr(highlight + strlen(token), token); - } - } -} - -static int -drawitem(struct item *item, int x, int y, int w) -{ - if (item == sel) - drw_setscheme(drw, scheme[SchemeSel]); - else if (item->left == sel || item->right == sel) - drw_setscheme(drw, scheme[SchemeMid]); - else if (item->out) - drw_setscheme(drw, scheme[SchemeOut]); - else - drw_setscheme(drw, scheme[SchemeNorm]); - - int r = drw_text(drw, x, y, w, bh, lrpad / 2, item->text, 0); - drawhighlights(item, x, y, w); - return r; -} - -static void -recalculatenumbers() -{ - unsigned int numer = 0, denom = 0; - struct item *item; - if (matchend) { - numer++; - for (item = matchend; item && item->left; item = item->left) - numer++; - } - for (item = items; item && item->text; item++) - denom++; - snprintf(numbers, NUMBERSBUFSIZE, "%d/%d", numer, denom); -} - -static void -drawmenu(void) -{ - unsigned int curpos; - struct item *item; - int x = 0, y = 0, fh = drw->fonts->h, w; - - 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]); - 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 + (bh-fh)/2, 2, fh - 4, 1, 0); - } - - recalculatenumbers(); - 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(">") - TEXTW(numbers))); - if (next) { - w = TEXTW(">"); - drw_setscheme(drw, scheme[SchemeNorm]); - drw_text(drw, mw - w - TEXTW(numbers), 0, w, bh, lrpad / 2, ">", 0); - } - } - drw_setscheme(drw, scheme[SchemeNorm]); - drw_text(drw, mw - TEXTW(numbers), 0, TEXTW(numbers), bh, lrpad / 2, numbers, 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; - /* 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(); -} - -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 -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; - - /* 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, None)) - continue; - switch(ev.type) { - 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], 2); - - clip = XInternAtom(dpy, "CLIPBOARD", False); - utf8 = XInternAtom(dpy, "UTF8_STRING", False); - - /* calculate menu geometry */ - bh = drw->fonts->h + 2; - bh = MAX(bh,lineheight); /* make a menu line AT LEAST 'lineheight' tall */ - lines = MAX(lines, 0); - mh = (lines + 1) * bh; - promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; -#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; - - if (centered) { - mw = MIN(MAX(max_textw() + promptw, min_width), info[i].width); - x = info[i].x_org + ((info[i].width - mw) / 2); - y = info[i].y_org + ((info[i].height - mh) / 2); - } else { - 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); - - if (centered) { - mw = MIN(MAX(max_textw() + promptw, min_width), wa.width); - x = (wa.width - mw) / 2; - y = (wa.height - mh) / 2; - } else { - x = 0; - y = topbar ? 0 : wa.height - mh; - mw = wa.width; - } - } - inputw = MIN(inputw, mw/3); - match(); - - /* create menu window */ - swa.override_redirect = True; - swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; - swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; - win = XCreateWindow(dpy, parentwin, x, y, mw, mh, border_width, - CopyFromParent, CopyFromParent, CopyFromParent, - CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); - if (border_width) - XSetWindowBorder(dpy, win, scheme[SchemeSel][ColBg].pixel); - XSetClassHint(dpy, win, &ch); - - /* open input methods */ - xim = XOpenIM(dpy, NULL, NULL, NULL); - xic = XCreateIC(xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, - XNClientWindow, win, XNFocusWindow, win, NULL); - - XMapRaised(dpy, win); - XSetInputFocus(dpy, win, RevertToParent, CurrentTime); - if (embed) { - XSelectInput(dpy, parentwin, FocusChangeMask); - 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 [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" - " [-h height]\n" - " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr); - exit(1); -} - -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], "-c")) /* centers dmenu on screen */ - centered = 1; - else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ - fstrncmp = strncasecmp; - fstrstr = cistrstr; - } 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], "-h")) { /* minimum height of one menu line */ - lineheight = atoi(argv[++i]); - lineheight = MAX(lineheight,8); /* reasonable default in case of value too small/negative */ - } - 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 if (!strcmp(argv[i], "-bw")) - border_width = atoi(argv[++i]); /* border width */ - else - usage(); - - if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) - fputs("warning: no locale support\n", stderr); - if (!XSetLocaleModifiers("")) - fputs("warning: no locale modifiers 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); - drw = drw_create(dpy, screen, root, wa.width, wa.height); - 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/dmenu/dmenu.o b/dmenu/dmenu.o deleted file mode 100644 index 53cac242688dbb9b427aaf39e507862ceba596c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37160 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 diff --git a/dmenu/dmenu_path b/dmenu/dmenu_path deleted file mode 100644 index 3a7cda7..0000000 --- a/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/dmenu/dmenu_run b/dmenu/dmenu_run deleted file mode 100755 index 834ede5..0000000 --- a/dmenu/dmenu_run +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -dmenu_path | dmenu "$@" | ${SHELL:-"/bin/sh"} & diff --git a/dmenu/drw.c b/dmenu/drw.c deleted file mode 100644 index 8fd1ca4..0000000 --- a/dmenu/drw.c +++ /dev/null @@ -1,435 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include -#include -#include -#include -#include - -#include "drw.h" -#include "util.h" - -#define UTF_INVALID 0xFFFD -#define UTF_SIZ 4 - -static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; -static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; -static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; -static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; - -static long -utf8decodebyte(const char c, size_t *i) -{ - for (*i = 0; *i < (UTF_SIZ + 1); ++(*i)) - if (((unsigned char)c & utfmask[*i]) == utfbyte[*i]) - return (unsigned char)c & ~utfmask[*i]; - return 0; -} - -static size_t -utf8validate(long *u, size_t i) -{ - if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF)) - *u = UTF_INVALID; - for (i = 1; *u > utfmax[i]; ++i) - ; - return i; -} - -static size_t -utf8decode(const char *c, long *u, size_t clen) -{ - size_t i, j, len, type; - long udecoded; - - *u = UTF_INVALID; - if (!clen) - return 0; - udecoded = utf8decodebyte(c[0], &len); - if (!BETWEEN(len, 1, UTF_SIZ)) - return 1; - for (i = 1, j = 1; i < clen && j < len; ++i, ++j) { - udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type); - if (type) - return j; - } - if (j < len) - return 0; - *u = udecoded; - utf8validate(u, len); - - return len; -} - -Drw * -drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) -{ - Drw *drw = ecalloc(1, sizeof(Drw)); - - drw->dpy = dpy; - drw->screen = screen; - drw->root = root; - drw->w = w; - drw->h = h; - drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); - drw->gc = XCreateGC(dpy, root, 0, NULL); - XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); - - return drw; -} - -void -drw_resize(Drw *drw, unsigned int w, unsigned int h) -{ - if (!drw) - return; - - drw->w = w; - drw->h = h; - if (drw->drawable) - XFreePixmap(drw->dpy, drw->drawable); - drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen)); -} - -void -drw_free(Drw *drw) -{ - XFreePixmap(drw->dpy, drw->drawable); - XFreeGC(drw->dpy, drw->gc); - free(drw); -} - -/* This function is an implementation detail. Library users should use - * drw_fontset_create instead. - */ -static Fnt * -xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) -{ - Fnt *font; - XftFont *xfont = NULL; - FcPattern *pattern = NULL; - - if (fontname) { - /* Using the pattern found at font->xfont->pattern does not yield the - * same substitution results as using the pattern returned by - * FcNameParse; using the latter results in the desired fallback - * behaviour whereas the former just results in missing-character - * rectangles being drawn, at least with some fonts. */ - if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) { - fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname); - return NULL; - } - if (!(pattern = FcNameParse((FcChar8 *) fontname))) { - fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname); - XftFontClose(drw->dpy, xfont); - return NULL; - } - } else if (fontpattern) { - if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) { - fprintf(stderr, "error, cannot load font from pattern.\n"); - return NULL; - } - } else { - die("no font specified."); - } - - /* Do not allow using color fonts. This is a workaround for a BadLength - * error from Xft with color glyphs. Modelled on the Xterm workaround. See - * https://bugzilla.redhat.com/show_bug.cgi?id=1498269 - * https://lists.suckless.org/dev/1701/30932.html - * https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=916349 - * and lots more all over the internet. - */ - FcBool iscol; - if(FcPatternGetBool(xfont->pattern, FC_COLOR, 0, &iscol) == FcResultMatch && iscol) { - XftFontClose(drw->dpy, xfont); - return NULL; - } - - font = ecalloc(1, sizeof(Fnt)); - font->xfont = xfont; - font->pattern = pattern; - font->h = xfont->ascent + xfont->descent; - font->dpy = drw->dpy; - - return font; -} - -static void -xfont_free(Fnt *font) -{ - if (!font) - return; - if (font->pattern) - FcPatternDestroy(font->pattern); - XftFontClose(font->dpy, font->xfont); - free(font); -} - -Fnt* -drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount) -{ - Fnt *cur, *ret = NULL; - size_t i; - - if (!drw || !fonts) - return NULL; - - for (i = 1; i <= fontcount; i++) { - if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) { - cur->next = ret; - ret = cur; - } - } - return (drw->fonts = ret); -} - -void -drw_fontset_free(Fnt *font) -{ - if (font) { - drw_fontset_free(font->next); - xfont_free(font); - } -} - -void -drw_clr_create(Drw *drw, Clr *dest, const char *clrname) -{ - if (!drw || !dest || !clrname) - return; - - if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen), - clrname, dest)) - die("error, cannot allocate color '%s'", clrname); -} - -/* Wrapper to create color schemes. The caller has to call free(3) on the - * returned color scheme when done using it. */ -Clr * -drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) -{ - size_t i; - Clr *ret; - - /* need at least two colors for a scheme */ - if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor)))) - return NULL; - - for (i = 0; i < clrcount; i++) - drw_clr_create(drw, &ret[i], clrnames[i]); - return ret; -} - -void -drw_setfontset(Drw *drw, Fnt *set) -{ - if (drw) - drw->fonts = set; -} - -void -drw_setscheme(Drw *drw, Clr *scm) -{ - if (drw) - drw->scheme = scm; -} - -void -drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert) -{ - if (!drw || !drw->scheme) - return; - XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg].pixel); - if (filled) - XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); - else - XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1); -} - -int -drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert) -{ - char buf[1024]; - int ty; - unsigned int ew; - XftDraw *d = NULL; - Fnt *usedfont, *curfont, *nextfont; - size_t i, len; - int utf8strlen, utf8charlen, render = x || y || w || h; - long utf8codepoint = 0; - const char *utf8str; - FcCharSet *fccharset; - FcPattern *fcpattern; - FcPattern *match; - XftResult result; - int charexists = 0; - - if (!drw || (render && !drw->scheme) || !text || !drw->fonts) - return 0; - - if (!render) { - w = ~w; - } else { - XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); - XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); - d = XftDrawCreate(drw->dpy, drw->drawable, - DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen)); - x += lpad; - w -= lpad; - } - - usedfont = drw->fonts; - while (1) { - utf8strlen = 0; - utf8str = text; - nextfont = NULL; - while (*text) { - utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ); - for (curfont = drw->fonts; curfont; curfont = curfont->next) { - charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint); - if (charexists) { - if (curfont == usedfont) { - utf8strlen += utf8charlen; - text += utf8charlen; - } else { - nextfont = curfont; - } - break; - } - } - - if (!charexists || nextfont) - break; - else - charexists = 0; - } - - if (utf8strlen) { - drw_font_getexts(usedfont, utf8str, utf8strlen, &ew, NULL); - /* shorten text if necessary */ - for (len = MIN(utf8strlen, sizeof(buf) - 1); len && ew > w; len--) - drw_font_getexts(usedfont, utf8str, len, &ew, NULL); - - if (len) { - memcpy(buf, utf8str, len); - buf[len] = '\0'; - if (len < utf8strlen) - for (i = len; i && i > len - 3; buf[--i] = '.') - ; /* NOP */ - - if (render) { - ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent; - XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg], - usedfont->xfont, x, ty, (XftChar8 *)buf, len); - } - x += ew; - w -= ew; - } - } - - if (!*text) { - break; - } else if (nextfont) { - charexists = 0; - usedfont = nextfont; - } else { - /* Regardless of whether or not a fallback font is found, the - * character must be drawn. */ - charexists = 1; - - fccharset = FcCharSetCreate(); - FcCharSetAddChar(fccharset, utf8codepoint); - - if (!drw->fonts->pattern) { - /* Refer to the comment in xfont_create for more information. */ - die("the first font in the cache must be loaded from a font string."); - } - - fcpattern = FcPatternDuplicate(drw->fonts->pattern); - FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset); - FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue); - FcPatternAddBool(fcpattern, FC_COLOR, FcFalse); - - FcConfigSubstitute(NULL, fcpattern, FcMatchPattern); - FcDefaultSubstitute(fcpattern); - match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result); - - FcCharSetDestroy(fccharset); - FcPatternDestroy(fcpattern); - - if (match) { - usedfont = xfont_create(drw, NULL, match); - if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) { - for (curfont = drw->fonts; curfont->next; curfont = curfont->next) - ; /* NOP */ - curfont->next = usedfont; - } else { - xfont_free(usedfont); - usedfont = drw->fonts; - } - } - } - } - if (d) - XftDrawDestroy(d); - - return x + (render ? w : 0); -} - -void -drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) -{ - if (!drw) - return; - - XCopyArea(drw->dpy, drw->drawable, win, drw->gc, x, y, w, h, x, y); - XSync(drw->dpy, False); -} - -unsigned int -drw_fontset_getwidth(Drw *drw, const char *text) -{ - if (!drw || !drw->fonts || !text) - return 0; - return drw_text(drw, 0, 0, 0, 0, 0, text, 0); -} - -void -drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h) -{ - XGlyphInfo ext; - - if (!font || !text) - return; - - XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext); - if (w) - *w = ext.xOff; - if (h) - *h = font->h; -} - -Cur * -drw_cur_create(Drw *drw, int shape) -{ - Cur *cur; - - if (!drw || !(cur = ecalloc(1, sizeof(Cur)))) - return NULL; - - cur->cursor = XCreateFontCursor(drw->dpy, shape); - - return cur; -} - -void -drw_cur_free(Drw *drw, Cur *cursor) -{ - if (!cursor) - return; - - XFreeCursor(drw->dpy, cursor->cursor); - free(cursor); -} diff --git a/dmenu/drw.h b/dmenu/drw.h deleted file mode 100644 index 4c67419..0000000 --- a/dmenu/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 }; /* Clr scheme index */ -typedef XftColor Clr; - -typedef struct { - unsigned int w, h; - Display *dpy; - int screen; - Window root; - Drawable drawable; - GC gc; - Clr *scheme; - Fnt *fonts; -} Drw; - -/* Drawable abstraction */ -Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h); -void drw_resize(Drw *drw, unsigned int w, unsigned int h); -void drw_free(Drw *drw); - -/* Fnt abstraction */ -Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount); -void drw_fontset_free(Fnt* set); -unsigned int drw_fontset_getwidth(Drw *drw, const char *text); -void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h); - -/* Colorscheme abstraction */ -void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); -Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); - -/* Cursor abstraction */ -Cur *drw_cur_create(Drw *drw, int shape); -void drw_cur_free(Drw *drw, Cur *cursor); - -/* Drawing context manipulation */ -void drw_setfontset(Drw *drw, Fnt *set); -void drw_setscheme(Drw *drw, Clr *scm); - -/* Drawing functions */ -void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert); -int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert); - -/* Map functions */ -void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h); diff --git a/dmenu/drw.o b/dmenu/drw.o deleted file mode 100644 index db93e5e92a628b3c0d2ed4735a7dbec3d34f07f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10472 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 G+y4(;tavd1 diff --git a/dmenu/stest b/dmenu/stest deleted file mode 100755 index 60c69a1991d444747aeebf013d5a8cf003844789..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17688 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 YkVyH8R9qXB*8kaULc(HDFtF_Z0EGRqDF6Tf diff --git a/dmenu/stest.1 b/dmenu/stest.1 deleted file mode 100644 index 2667d8a..0000000 --- a/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/dmenu/stest.c b/dmenu/stest.c deleted file mode 100644 index 7a7b0bc..0000000 --- a/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/dmenu/stest.o b/dmenu/stest.o deleted file mode 100644 index f3d919245e6349c6d04b5a070963273e6939475b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5296 zcmbW5Z){sv6~M3Uv@uEXOV`q+6qwV!utZu++`*J~E#&1-`@A`{khBw8GS{`A6Kjs0 z+0RYJhMEz3lHLBbIyJD z#5b>gUpUpvz2|q&IrrRq&->$^7!B`tyIhRK#Xip(8d1hpI~x5#-W_BL^RYvEc^|5J z<#X5st9tok*tv;+UUgGXn+TQOJFJ)ft3Ug<0f-;h%PrkKFshddY7YQ#teC2oyA`Wu zYp}X<74Q-d&ho9=;$Agit_a=iD37TAZnnzUK6aF`{Pku7ei*pWY+w)uUZT+LWYJsO z61=6C-lZJgUYW1g>(WGvj48z!F!E@>HKKO4D20O!mR}1uS_|rxpR3?Xjq%X)bOaHj7bQI9I8KDgbO>aKM|l|M;CTcs4?l$2t%G1y2)t!=y5 zg0a_fG2dGGCRplA&!_`TIknvIGWo*1O5u2e<-5hIU%~P)`z~VB2&SB=D!;749C+jn zZ2o3t7sS}jmu2pxjcX0o`7U4O93zEGZ*!u<-e5h%^#`m1F*jKJ*~?frQ`+Puux>~` z7o9ft_`7rd$NHkjVsRreJ(HSyGMmdEpI?{)nD!@LCaO0#j}54iDCy`%HI^ zX^)00yz;ao+F@r0os_19N^i_Z0GsPyJ2mZWE_e7~wK z-EwKmqpVO>UVKd}{81@<53EAF-&Bfcprc$|tsHq_q;mZGOCP%Cr?kbdxmaEqE2mWN zSn-{F8{frH{Yq_P{q@k&W$)g!xMjnocgJG4^oo_LGP=qwgKt2_XI>jFZM~rJqc(fN zkPp@F(XGwl8m!Db2LXn!wp_r2goH!&7Ih^A1r0M*CROjszo7&mhgKc5j#^h3?)1)D zO0SHx))xob@}6JAYRk{4UcGeNifKJV^a^Kx77UeQ^~5zRiKq1PL%bI%UBMhCDLqi~ zJJuAwpJtc}@4?!&aOLP0z1)ru9R8#lE8V!r;JCu2_j$a1b%n9{pN30+B~tq#%tg7? zUJh18G^lyKd{V^%fO6f$pJ$D7#X@-u>Q$T49@iq5*n#2UJ^mgo8=LWmlj;0|e|O-4 zK!0Db*XqF5p=`Ap=KAWFnQNiLwPRDO_cZJ)1Y@5NWA|aJ`8s-_=@%@F_uY`Mx|J=qA-@sDq zBfcAcPp{iI07&!ofXR@r6TI1Nu+*G6Hz zzVR^3_D=DzwmYDe_nqs#pIdH#xAl4n3Vvuk=9-5=A=uvS@e?;&rHhxg>KM0Pw;2J6a_igs$ z!oFR!l;@*D-)iF-q4$aw<9}R=|0SFKgqZJ`jpu}(vhnwXJ$$`zp?v0r{v8`XA@p-L zz9jTth}OOj*KPJ?p}%G0-w^scHvTQrF+mV}{Ou0BM{rsfzS~jyZTxA$_egQ%Ivljw zpB47>e#3lrz(waCm*U`e1aW$^;4u2^6>%PhJ_>UAexbTTju*wb34IibL;Rl>UgP-O zM7eD>d`|g3+AikDTs{RC#n~x1#>e*$@%tqEdn8W#M|sly{BSc{oG+-JFCJV%) zW|Rev!8;|8&7gwj!2rCT){KBevu1vd1!9@mStAWz>5ORv4t()&AAk111!+Get3-1vWJagp2 z3=x-~+2$oK%7s*h-;Eg4?q3!DFWVgaYo1mIzc0~bmyMJE5gVs))Q$>&`~Gbc3DNf$ zg&{xE2cgq!|KPu(xX|+z_Ydc=@838ujM)#DEJ^Vo?2;k$X?|)aB_^9L3xAnmpZtj9 z_W&~cah(?a=gCmClt1AVbegRne{G`ZR>N@pSW@Iq_0w!_bQur_a$cOnM}gsYmE9kI ix!7w55W69M() -#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/dmenu/util.h b/dmenu/util.h deleted file mode 100644 index f633b51..0000000 --- a/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/dmenu/util.o b/dmenu/util.o deleted file mode 100644 index 59a07457a785bae0ce4bed63b5ac76e960595509..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2224 zcmbVM&rcIU6n>>u3Iav+fWbpeM$;y;X*C8UYFa3;kd1(r7(G}^yM)G;HruVKMk7Wv zX$T2_fCm#j8sfpD2~9kpC-q`H5>6x%e{k`l;CtJdbh2(Qyk`2n`QG>5%)Z&#hr`-P zlgkCdTyP2MGr>W7ug2R);-K?kul~~mt)Mo9%G&mXF9jgfrST{v~-SKGoU{Hu!p58KXz8t z-=7!mx9<*=j;#4HW@*EF7JO@6YZcTQwZvkltbg@MwbZ6ATYIsH8}CxdY&M@702mz_ z8t@0AMrzKlW#&s||9R!C66y^HYYrA7J6Z#9-Ma#=a;K}Ot=YSRt8^oOoX36=Mmsv6 zHjQ^|@K`^O9pkZU9bV2j18v*`zxJG>ZpV`baO2O(+*rxU+#tOilE4kk(yZ>f;r~6? zm_~ID)|0u{j@Tvb-|7`|hjDarjSSRRCthj5_ch?@$errM8t`Mt(>}%itaC$dyn!A{ zW+tnoK+%Rmkk05(G}F3aKw?yz7>sI(iII`3!|_BsI;agN;LdEp$jqCwFk2{@DJY;a zZ-8FTn4s5QNL1hbNz#YMha{;AzH)kei5KW_obHX$9 zY*I1xvI$B$X(mCLDHcI7@-!iNSP6rY%I9+WJWA&Crml=$p6)H0$<%GsQMNvpm^G3) zU2J3D=*LWYWc!VXAV=21`%#;E-*LUwP3F>LryDHY4GALcdBAj&4z7yA`4vA)0v2FMQy0mmsWIAP;OokG?9X!@V@~Jyl}I%4Ty%bvEAqwp(K7b6k%ISpeS!3i5H%<+@>|fi epB=?lI5|ZV$?R>R@3T|Bmw)=_q+D|C`TqcZ6$B~(