From dda6b5b9e1741c04b9da7b2ac4070b6c6bb1cfa5 Mon Sep 17 00:00:00 2001 From: RinRi Date: Wed, 2 Aug 2023 23:41:20 +0300 Subject: [PATCH] 2023-08-02 --- LICENSE | 0 Makefile | 0 README | 0 arg.h | 0 config.def.h | 6 +- config.def.h.orig | 24 ++ config.h | 6 +- config.mk | 0 dmenu | Bin 43992 -> 43392 bytes dmenu-lineheight-4.9.diff | 94 +++++ dmenu-xyw-5.0.diff | 116 ++++++ dmenu.1 | 27 ++ dmenu.1.orig | 197 ++++++++++ dmenu.c | 29 +- dmenu.c.orig | 777 ++++++++++++++++++++++++++++++++++++++ dmenu.c.rej | 10 + dmenu.o | Bin 32376 -> 33320 bytes drw.c | 0 drw.h | 0 drw.o | Bin 10624 -> 10536 bytes stest | Bin 17744 -> 16928 bytes stest.1 | 0 stest.c | 0 stest.o | Bin 5280 -> 5248 bytes util.c | 0 util.h | 0 util.o | Bin 2264 -> 2216 bytes 27 files changed, 1276 insertions(+), 10 deletions(-) mode change 100644 => 100755 LICENSE mode change 100644 => 100755 Makefile mode change 100644 => 100755 README mode change 100644 => 100755 arg.h mode change 100644 => 100755 config.def.h create mode 100755 config.def.h.orig mode change 100644 => 100755 config.h mode change 100644 => 100755 config.mk create mode 100644 dmenu-lineheight-4.9.diff create mode 100644 dmenu-xyw-5.0.diff mode change 100644 => 100755 dmenu.1 create mode 100755 dmenu.1.orig mode change 100644 => 100755 dmenu.c create mode 100755 dmenu.c.orig create mode 100644 dmenu.c.rej mode change 100644 => 100755 drw.c mode change 100644 => 100755 drw.h mode change 100644 => 100755 stest.1 mode change 100644 => 100755 stest.c mode change 100644 => 100755 util.c mode change 100644 => 100755 util.h diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/Makefile b/Makefile old mode 100644 new mode 100755 diff --git a/README b/README old mode 100644 new mode 100755 diff --git a/arg.h b/arg.h old mode 100644 new mode 100755 diff --git a/config.def.h b/config.def.h old mode 100644 new mode 100755 index df629df..343c0d8 --- a/config.def.h +++ b/config.def.h @@ -11,11 +11,15 @@ static const char *prompt = NULL; /* -p option; prompt to the left of static const char *colors[SchemeLast][2] = { /* fg bg */ [SchemeNorm] = { "#bbbbbb", "#222222" }, - [SchemeSel] = { "#eeeeee", "#41008c" }, + [SchemeSel] = { "#eeeeee", "#630fe8" }, [SchemeOut] = { "#000000", "#00ffff" }, }; /* -l option; if nonzero, dmenu uses vertical list with given number of lines */ static unsigned int lines = 0; +static unsigned int lineheight = 37; /* -h option; minimum height of a menu line */ +static int dmx = 10; /* put dmenu at this x offset */ +static int dmy = 10; /* put dmenu at this y offset (measured from the bottom if topbar is 0) */ +static unsigned int dmw = 1900; /* make dmenu this wide */ /* * Characters not considered part of a word while deleting words diff --git a/config.def.h.orig b/config.def.h.orig new file mode 100755 index 0000000..0349a9a --- /dev/null +++ b/config.def.h.orig @@ -0,0 +1,24 @@ +/* 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=13", + "fontawesome:size=15" +}; +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", "#630fe8" }, + [SchemeOut] = { "#000000", "#00ffff" }, +}; +/* -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/config.h b/config.h old mode 100644 new mode 100755 index df629df..343c0d8 --- a/config.h +++ b/config.h @@ -11,11 +11,15 @@ static const char *prompt = NULL; /* -p option; prompt to the left of static const char *colors[SchemeLast][2] = { /* fg bg */ [SchemeNorm] = { "#bbbbbb", "#222222" }, - [SchemeSel] = { "#eeeeee", "#41008c" }, + [SchemeSel] = { "#eeeeee", "#630fe8" }, [SchemeOut] = { "#000000", "#00ffff" }, }; /* -l option; if nonzero, dmenu uses vertical list with given number of lines */ static unsigned int lines = 0; +static unsigned int lineheight = 37; /* -h option; minimum height of a menu line */ +static int dmx = 10; /* put dmenu at this x offset */ +static int dmy = 10; /* put dmenu at this y offset (measured from the bottom if topbar is 0) */ +static unsigned int dmw = 1900; /* make dmenu this wide */ /* * Characters not considered part of a word while deleting words diff --git a/config.mk b/config.mk old mode 100644 new mode 100755 diff --git a/dmenu b/dmenu index 17e1f023250aa421b143116726e847ee29f42125..40d0dfcbc0a66ad199267380de2866747386571a 100755 GIT binary patch literal 43392 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 Hg%$oM;qHtP literal 43992 zcmeHwdwf$>w*ToPSP+t;p!I=7DB23Gt%9~lv}x0Ff+-Z*O2tP=(-b0Ul1WaW_$;PH zjxi3Sj-xZqT*m8oxz3B3aTH%r-Z1J+Wt5BJXvNowRlyhFi~PQ8pMA<{?76@Dx&Qor ze{djKdwuuXYp=cb+WYLY&pGKGwXVACtSmu0a)c`d;tpS?B2_%2s${8JDUO=NlzA8!OOq8_J z7Y-}?9;7=iQF)E(%dz?vbNLL~U{-OB>dTRD*4?J&uS;f7W{e>8UZCPyIdTV;+rZ0h z;N>)G<^IyB=1;PbKHGVICUqc>4vms59S!eGZIu45jj=zVE^-_WjcVoQqa4}!KRtLi z2n%?9Mt)h$?bj%;Ubr~mZ@p~##euexfIk@PEa|MctmLxkrO{C7C9K`!Uv`4L{*`T?~zb=S_VdJFDf1mf5iZwWPsle zUBl@)-JsrU4e-n1jN$Zj7}QHnA5MM(?6KmLc@!JSKVnet3&FyP#gM;*)tK4D=j=;BfvaHfZl813ffyhST$a zf&4WF`X4j!&o~1;(@?J!pUmSd13je%daeULDN_mfmkjjWZGew5=*L#*8qPlt8|YbM z;Gc60>|bG^r^rD5YXklB4CLz!>~|RGxye9JlL4MK(7)NBT^kML2Mp}F-k@KeG0^{# zfu2qSJYvwUKN{5gQv*E*4D9*bK>k?+{4|4l#~9do#6W(nfuEl+z_%ON^Ql3*d%@U}v>~{>u&I|7B3`uMP0O7~qc>*!ix3J@**+{~QDTe=yLq)}UQi8{h{G@XujS zzHpYX_(?QGcf8H;0-@@D9f;)nuyZWrHC$U~e!%r;xK^shpuMwzlb*#~zotiUJDcj= zZN7+ai9ag&B2D!*fl$!b;ujC0XfzFnBVPDYUkA?%Dl|oBR#OINGb)leC6N^Mc5uwEy zM9H9C3Uz3?4gSs!PgrP~9r3hY?OWLz@;YK(zxI}1ynGsKihZSw~qV8Z+sPj5}?VeabYK*l;CBFoJ18eX|)Om1w zbtn`#0odExh60XQIN-0-P)F(kJ#VXLC zw<9bdk|P)?K~FFg4fuRvH3RZ)8mZo8Ztv1%?sktqAi$+$5(L`(K@w|=F=;8Zj5rB> zOD~(+2)Z#egeEp zBP87Eaku+}o`C;mpU~m!=m;%m%^*p)8&{HEKDTsuVBhlgFal0$7uqSlk=s&UP8XJ! zu{4iD0?G+!hx@%OJO&}SS-lV?&1y-vugxQQP+4mr_whaCsHam^jnouzjFr5kc@h*OQkiL6B;QO6E({rRFxT;Pcn4q zHK+)EXW?Hq`>3U|a7FzZJ6EVOjeZ?|woYEr;e|ThNq01TE6xSh5Tr zWjdT9TRSRrI1e?JRi(rA`&yz7C!4gRL5FKGM|mwe905IeEY{(p22nv+s>4U?@URZY zz!^L`bvWO8WO-dW+%hPQeJmZGufx~s@Y8kpLpq%H)U;!r4j-?9pzC$`89ID}4nI?e zZ`9!hI=okhpQXch>+o}Qc%Kf}Z@}%>;j|Z}9sN4|JPia@bofLaeprWFb@(wIe!dPD zexfoIBa?J^o(`X^!}E3c6dhim!!OX`RvliX!;5ryu?{cO;TP%f3LQRGhga!v+H27c zQHPgkAZUXQzgUO2=+q#I{1P1=*5Q}x@J<~*U59t+aQ$g?jSlCxG+3#% zI-H+E82*qBuh8jVr^73C_<9{aQ-^QR;aBMJjXHdm4)4|BHXXiOhhM3~`*iqKI()wl zuhQZDI^3?q6&+r!!w>858XbO2hdXq*z~_I8|5_cMr^9J)Njvg&_-qXXEzsej4!7!X zrw%XD;d69&nGU~NhgaxumkzJe;q^LP)Zue=c!Lg~r^8!xc!LgKti$K)@TEF@fesJr z@J1cpsl%Iec$W^RJzDKpqrFd|^578!`TIo|rIg2?>JO(<^1C`^5P6ylu?L^o)am(^KBVw`F1#Qp7K% zyi|W0$CNjSr=@zTkMVnnrzLu-m+^lio|fjR4UFGPJT1vn>lptm@w60At!4b5iKiua zs*CYY5KpI-RG9IP5>HF+)MCc}oOoJlry3Z4AMv!rPE|4fZsO_EDOJY!JBg>IcFM~5 zn~A3-b}FCo5#niSoe~&-6Y&<}4<83GrIq-6;`>28W?{X z@pS2zs$%>o;%VueDr0;$@w8-4SsDLL5IilFQ~8YloOoIyrv%1-L_95xQ-{B&_8%nP zN_;=#-yoir!l^#S?axjK7(9 zTH2=a86P3Olz4&hHxYj^@rS=-{ZBkCZBzY>UqpO4@qLV6K>Q`d_cDGC@w9|ZZD4#g z@w9YJtz-O5;%Uj6TFdxLh^M7$s*CX#5l>6hRG9ITh^M7#YBA%_CZ3k0sRqWMMm#M= zQ&o%~MLaD*Q)P_LCZ3j_DJ$c@=>Shl&Qw0*KPR4+nkj+t9}!PW%+%p;S^pDXMSMTw z-yoirl&L<(?$k zEfG^;#y?6tEe%tP8UJ(QX-SxBVElc=(^4>1#rV64rzK#jjPZ98PfNd)mGL(dUr&5K z<0Hh+C0=0sO~lV5{_r=f|B0uiU8vPNAq5ZSFQF6?{aj)>ldyDmsqjl2cB=)?#>wM%emo;2+j^it zlufHaQuL^aJ-x$G2{U6R<j-kWZ;^ur zaJdOg?i`Z)26jT9lgs^6l^Z)J;h3BU6aGRn`&5}CF7w9>nTtv0&#Fuwmq}#Eyt@oC z_o^}qh8a0*i7I2(>UtV71068tMJ`a6A@Bzha6#Y?TwqFuKo1E_g}_g^KrR!o^z6VK ztW~of<_?UoZ-Rr!v8iw2!tyik4GyR8*myB9V>Q&F$7e&C@;CJOz)0mUUy~oD zgXL*u4U+KCJ0yexqaj&Il4oHS6%!?U2v68%qBhan(~rtz)60Zy=|4rx=~2iRiI#j( zp71lKAsriubR6k{@#TBVk0?t~BlQ1><)TU$$ zmG6bc{wU(M`CrYqT2Smc64nM*$Cl8-1a z9!sYa6P{Tr2t5ZnN0%SD;`+jAmV3^mL78wAmZ5@QqnLE6n7qEQP>dhTS~0c!Ncn-( zSJWGcTMMhip0s3A3aL6?AWQ`=c2@3?E^;LT(2;B^tZ>S&yX4Pc;v!~+qp->)f2#Zv zEk~5@7BX+Y(a*{6o^T8ak390@e6{D_#W&vhgoC~N^#o-RL7TmFdyfzrez z9x1#Yv^HyNZPts9%A>c5}Sc0}&5Cx<#l)*3vMggy&Nq%7f!TN zo5~M35^#QP`Cdn|F3XXemj$EGhlRPKycwxjaEZ8et7RU^m}N0#EK+zperI4Tc0 zEcJ&R#R^Q`>c~3Cnl}%P{Q&p}j^cyB_o68n{JH6E1M5Za0dd)Z(PGwsWphogWpm>Q z#Pzx5y>Z*`+R>QUD8Qqpn$ATdvidN5k!uBnfiwn?Qt>5b7%v)o2ONRMt|7wvO*sdx zLp?Oo7c<=U4i-Pk@38`;3a+LKcA+*9AvOj*OZ_#~v;neI4FKv_+4S#B_l!3oU*0QX z?3Q+2DM-br?lVBj-?74chOR2?a&N-a4&jH7ew`S90}{nstCP9evZ)#AXXrwNV!kC| zny(2}AyL_fFpy0%kW>O#jbq%cg5F)-g&R-;79iTjoP%6P!c+i)sU#mwNq?F}9l2t1OaT%3ki7v@ z&ROL1s?SO7j8}ZX6SjjyWYcpX$`Mi@x79(B(6Y$V-2)2AKdO=&L7v5}7C||Vo)!_g z>JX;(s}c`_P(&9}L{};Q1$BsKTloPoju}CaE@d-AC1#A}lf}gJx5e}}@roHDN=XO| z+d{PhtDyXnLTRt^!Ds2Tve}FYfBb(SFEQgc_{JRk2O*aT#)s=j*@FC2muB198J!6IET=M72 zV`vD1U^J${miV!3OLrBOS8_06TJE|L>qtykMQj>Y3m(~;Yw6ws8BD1wEvsiz%GQ|1 zywW`dF>ATY!;mqA^f)LDgJ}{JZ3_vzYb~Ti+dP(TWa*Kt^h+k>uBN$3w5g?=DK}xt zW)66pP6$0Y5K^`rPN$D_GplkfJtGME4r?}?BA-SMN<8F6!OHGJ+@^&Q4`XGb9Do2l zx+e_05r4ig9~sEG134HipFrG^Fnt6*R#d4yBw$N2;NMVjY9j#{+vH`EOUYyo z2hJg&QwO98SOTEyU>?GTa^lBkTY8qGv{s0EDpjK^L>-*ELO^*7uIZpY zj34|~R>LRtmCnc}l6_AHEFj>Y1SCvXw+h0}+#Er<7fYMeCI-&93?NpJN8eH|##$$} z9%%d@X{C=GnzS{*SC&oFbDZ)nx0)C|fnh8h}P(on1CgPPP2nTAgt@E9`siK{gI3B=O#8;Fa$O#8vm zkvfkmi`!l#UMht2-6V}j!XmjdPmo5&Z8num zrG5@sKKo@^dJeIwD^ee-ChUU*D@b#}uBrlj3n_ILHj%N^lhPS#FWyfLmQ4pp>G=?h z+a@E4<}9U3(SA)=F0&NN2(suXnRO|)!n!7`$|Fbta;7AX5Zg68=4GK7F##FAdb3?N;;39B90 zaY%WZRlE}olT4T@22LgL(E+js%bY{XR-D;sMIb8Qr!d!liAYP$ff+c3(76SJViv85 z6EiL#OB1%sL6mCLnJQ$sx&zWCPF1%=aJlhUs&UnJ+AY~gopap{_Ur98*l)DEx3!mA zCUygY+KE*H?RS@d;*?*xQIrpg@%IilU@2~T{2bJi9CI-vwxw`mdi=93g7D>9OoL}# zPno9Eh*TbvaD8oh9C_5bk?DTR#4ggkjZ?^{t|R#w2ZsqbTOCv0Z`PmiwvqnSbHa2A2%QkCx{t*EjtVbE3BZRJ4Z@O@#lNZ~ zcDkx$m8xV9#0L6WuDfBIeWCptdo!+6?M-k;b0gNtt3EEW3c`?Gz5)Q{y|^|ShnAoN z0)++W#Kg5o%ZD}z$W{LEA9bG|@ywrd)ZdoW1JDZxnk*rGE=0dNS3}@j&W%C(GCQO@E+pBju$_ij9)*_Is#pN6> z9mZibEy`OVbv{WYIxCdgHZ8<=!t_(XV(GJBhBT0;z$(gjxX z{)q{tja;y5J9Ua~F2VjRc4ikOCd@~%o&(ZI%O5A0p>%*|Oh2hg&InCGB@?~`<48<- zpGeM>H$arB?6T5Ut%}Wom?Kg0JUDrWVnLoGr{oVLUOeC^ez$m_cpH2{^F;Y4=(Fpo zRAPKHk)FNM+_>%Kg=lHQ^kX2gN-=Q>Ecg(RvK`?fZ_OFsiVS&wP~U zqBO_!Fpz;?VBFA@z711N{Np0sKyefnAcEpH8Ddy@ASyvwBEPEIBE;O!DYO{G@PSU- z$Jelv9L{VIqL+e%XX#7y-qlZpZE@bEP%;tDSI$FxVjP@{O(w*3?+2JlUW`41*uHl% zjZNi47)ZNZ1^Un_h8RwcMHuMKjnB1_uK33lLo6<$n8&s_nOgt>X0EmC!H1yD=7fo~ zX9vfBq|ACB$`Ugs5LO9HDu={{;L7)~-A3gW2+$tbt%U{3MAg9OU|_atU>!FQ4m%Os zYe;8&dj-uz&35@^>_^G3Hp^e(mczFVV&w#-8I>h$4>L03P7rBa{FVY>Gj0PDqvd!T z63PpwQV@KNySjGy~T`%AMaNs4liK4eYhO^0t;a|wLo=e60N@WMpvSw2x3|PawVtiL$<53BwsD| z42oI0SHVJOA|@#JU@IvxVHWb}w3x8{9N9UhbHT&y#REzJ`BNv1R?FUo%;IhK%D1AY zv%>R`nPWNxRNgXhc4ER;NYNSha^S@S^6OK_{F6#-!H$u9sC=)|jVr?XL`S~7Bee{Z zNl%sFaq-0x6>0i9f($`b^$7;HT(s4E2#PAVJdl+fl9{ReUm1qUGDD?=$ z>n<4fV%(D@pLbh#HHZ@OZS%~7rz3r`Vmry?aEhgpNe|6 z%%gg)5alLX7*6j?k3WSW#HP1WGhR#m5hWaz2Q591BT?J)UW`ulMN|W=aYeZ$e_)b` zU1{uPUrI|h0Q@om-=TeL$- zF(#2N)FMb@QD2Dalb7PeSeu6ndby+>fJ-h}2vX11f^pk|L1{b7?96w{vmuR}(-jPu zQ49iQ7ZJfdXP69<3r?B9Zd$1!raxgWq@G!|okB5lF(}I4!*6GxG~KYDuRQ-IM6>pb zHo7KXaUJT}OBEz-Uw}L-Km+d1SBS-1UCC)V=-!QJ8=G(}&TX!&L&#A4|ALC11Gggx zKV*yI*S~lSjl3HQ7OB;z{)Xv8TM&u6FuE}Be2weaGiZWKju{6cCe9G!-{h{a+V9TI zx651Y=l`vC=D4x3yrX^RAG18wyNzN*K4aj&%6n-QfD5@V=_>A9tW~g@NvK!WEPOH8 z&|fzuRv<|3$irWL~!FhBhjrQpP~P(=Cq018Mn1=z}nZ^b-M z2Gc^ya;liPt$^;bx(ah)&?FLAiW)E)&cwZlTmkz|iCeHj{S=k_+w0JD(WW94RIk+X zX{peho6{`FSn4Jk(b}a2qKtr}pu;H&qgfvqS5j|dK_kkFwx&TC7By2;BeeA(@-VOmN%rlZ=}<>5UiDVVb+uXZf|zVuVK>fMIvmo%U@D}$d`+W6;^p+E=9#i z>Mvy>xq-aut;ttcdtxG5pj%8kaN}KBMN)E&^*XkW-=?kisERt$WvA$qUvnj=?^B5E^D4Z;%IyCc9E08|LNDbhbEt2lgC6k=HB_U}F8m z@<4Ci)>t*^x49DY(C*ooWe$sSirVbVS*7;KKXAc>GibOmF$ zxK%n&4ir|^%AeVDAC(d7BpKq6OW8igrgI(^Uy8~7fWnmfLZY@7@U8)QHxQ!MT@U?Zw z97k7>&|Bri6A6gK3MfTiLHAWo`6ZXU19uy+1&aGie^Umaq`v1pT>5Xu)`VToEu^)^ zhy?D2*TPk}p3_ed6DV|0J&U-3 z5>FPc2k1bbPGcRbGZ}ZqkyYM{`ie##9=X-h{bRLC$IrV(rfK zE@wQQ8{4}Pt`Y{YTs-EYy=!c)t+)z%sW+dA4X4U!$L^Q~ri3%MUMwbigd!-ir7_NN zD-kwX>Xd4GSjv^~R#0p?YO$0&-~Jr+T7BjFvFWv0$2sT4e%X7j ztXm872hMZiX%RI2mOShey!TJ6qvdUwWOmml+6t`$PdnuO@xxj1{w!#;{B$c^nAd0N z-iyhPO_b9h_Tq?JZdhy0CJTKNgeIn$U0Q6~0Eip?dctfk(Is6u@>sbSUr#bebw z9kW`{(BsR`fODP6h2M*nTce}UV>=zWEv2!~Sb$2E&O~!QbWO8Qt<56^Wv?hX**?&F!|UfuymKgz3>V-9IIlW z_451F>^$~hvQmwr@~3uk#V#lAxSjS2g>p>=E>H^u_7uh^mh~v z|5$pM$J1WrcDgP(icx^YoOI!pO23zXc3mzG!yEU z*J^280NjB+oryFppWT2}3xc$K4>of4UV}@?C+PMZPHfw-h{eo~p@GRA6Zuq3-tt#$ zpl`zIQcx~OAMw^(*ogU5iTr~cl3U0ZJUAB~k6RTA3=aE7&gMQ+xT?d z4{ahQ=nA^*suE>aq3A-Z8(c`WboWX#EyZ~B$5QMn3|opHDC~l`rTCG;wTwPixQ@}^ zv4@H*#ZMOYGX8n?RHJTs$2^GUCv2PSRNGr(vb*pwB&p8}=+Ux#8nk6_Y(BLPbX*zF zwkprU?5-;iku$nbTEeO0Z88|oBeDQNs_WLA^i15Gu%e9e9K;cEuc8kIMs3DYQ&83e zV!l&0{XLzYuP7AxhzWX7ly2KAhcSsP!W}P%!0xBn=^5t6E9m;&Det3|>{ql}{EqJK zH~=@gioeGxH&6NT%TToC`y6Rv`2l{v3}Xe$REPYbJw5JiT>52U)e`#%eVV5W1>HR@ zx<9rJMh?EW0!iXe9w$9;(gPO3d2262GfC zQ_E0)P*8`@!XGW*h3IE6t;@7u>(qno>?cC4LdkN0wX|eqBW}ir01Z$_^HpJwT=J6s5cY~v_V+1 z;uj9BzK&L38-5FM32&wqKYqx6Ep(=}taD1BQ-EG_YZShslC3^e<7xA?m8#YXH7;jE z^*s9mhtS+qSK)4KTHu^JTl=j|EB)-EuWcqTOw}@L{Pf$X);8aAzt<-)2k;-=^alL+ z1xn5^sYYofe(P~^D?5bAm#{;a>|=*8d3t$SS%p`aT*eNf?KlMVe<&LEczrXY_^m}- z`K72OD0x=+qM;5An?Vt1$DTsyCH13EYuJBBFTlnH-c<+ zj~Vq5KM}MHAFA_qe5gF7ujlCwPW5{4=h!|@ss4XM`j0Q3_&f&w6?}e=ItV|A^cVO% z0)8y*0pc@&&pFsvc@Q*-PY3i^1@%H=S=H`Q=%7+$`B0G zPm`*WBxIFB*0B1sr^CxAkscqXu{b8@Z_kzIsz;dANq ztw>9~>GWfu-Jol*A^9cxtquGq=*Q|m*BogH|Sq+ z@2MBG6*o5&&>Y+W%*O_L7ia_MB;23f54r~QFz8kN=`{UT@=nm{c-DU;J&*$0bP)PL z?*v^3I{97b1HB!z05|^oL7PCo0}X>tdoP{72ecdXcc8~W-viCYGk?cGM}v-rkN*nV z4f+-62GB4b9qb4F6`s;>fbaeR8U{7v!TLu)OF*9oy#UX0?+0~&ehK;{=qx-~gdJ>l zWZk?#$m-0`I%o7Ld28Vx!q3HL4PyUdl5m{DI=m3c>G-UB2KAvmf;qp=TrkIS>WaKB z;i|K*xaiWtNkCb7JghG4-jq(Gy1|2#Nca?^e=g@JVQcWAv4{=_zbAXPxnOmU-E58LhRp?#sy35uvS~LyOCkF;s8D0hU!5(Q3*tGV*_!<>6SbT3 zL}VStrxG#2o~MJ(A7@va3+~OSHd~XqwdSIGOb&C|>JfHxMf?<}xxXssr&;C-ySdD6 zE`kU|QG``m0X?(er^gXTaZs`^NxJSK`&Q?oK-`3aIk7Br5fJ-{qRie-l=%d)_j?qj z_O8x`L_Eh~uF8H)vzOYn4ssFPP5AXtIj6ZH`+iMs7V>sOZUAz(ksPz7mTYm5Ej45d z+SO^UaGI;UKd`48Me-2qMHmB*BBq4~bN;>5mL&P*9%{>KYD;{C(_C>iX&{&Q%oX+K zs#bGFwYe;NuDOCt7a4b(xuVfrb+wxFb8|&2V^AdfZF7ZBV?=Y&q9HD2F+;zbUX8KV zPVInSvKOoUwjTIe;7@~6`+l759PBqI^&8X=_S@mAoJ98U{YEkHC3Jj?M+ferIx_n0 zYVND-#iNG$srFR3VQ5FLNAW87>r2c*tz%VP+^$-RC$vy+*Bo=#h@59k<~1W0n%9n~ zHa~>Vx)F_p?#%*Pt3#{J>yf)*#C+st&qL-SWQIWPB>v?oNX-Q@4@&Bw#0hab#GNGm zfVraX2N6qS>|@w^H`-l;G#wPfLM|Rj1a>vzN9PL`H!Ox{o2zol5yL?AF-#Bb(7d-B z4~LYJo;r%*)}1sU9boA;_Z!G#am)G(@px|z^9vhitiKRXG|sBBLli%mqih=V(Czh0 zG1uY^4*UTi8e>{q$8#wO)fkWVZ7;p7wx z@2Tx+VC|v2BA!=9d2GDi#O5B7bs+B{lxv|p2l*kpev~ zaH#QCg*YD)UDRKXpxo%U(rLQ6LkD3SfMx42(zzYjG3ftK5@Nna!}N37iLqgaudf}& zoQ<0GQ(En*3xGosy*?DjWcWk42vyC(d8rt-R8hU?|9EyIO-XQTk!UV!H0RfBV?LsO zq+bTJLG~7sg^l;ne8=Z*4ZH@CIFb4A;0bUcjxDLOR% zHyQj>8T_6Mp8hr$9ivqu2v#*QhVvWoUN9YO{{U3`dtB!*6#E>U;#DSgXn&WB?Rf#w z^1nKs4v|0}?FZw~_6jx|7p=oPNOR5l%-;;`MWS0jHO7 zTF2=%oVIhioYU2uKFI0goIb_rPEPl6`T?g$I2|#W*U#w%oL<^bVMPqpVJFCy^Pa3POss#ozvxMYHEN7hB8AN-rs8`}#(eaXbgJHrlIA%Mm z9#PXdIQv+K#m5NYVfr~oFbiG7;ub+WU+HVfp`+JT<<W*ymOX_k}0Ve|8%ge&*q2d7**UqbRal$8j zF~_yIpofG=kF`RTXZP=s#Op&0zmntZ9zHM!$LYt}>0tLjK=CUg(4Q}ay@XO(^;pc( zX8cr^%Cr0SNZy1G*;AHbXPDy~?^oqD`z4NxTs~LL7U+Hy>8Z-VS8@Cvu1Ax<3plm6 zlp2VG-TMb6G1AkNq31!4H)P-sbKH@E|C;0Z9M|lBoa1>J_-{F0kb!RiPImrj77{qv za|WO<;6rw{WXNyhcz=f9b^#|nH`J>8T z{mP``>$o0mz4jK@b1M%V_FMw654j!}*Q52zM;u?9Vb5nAFUqKw;*RV*uNny)+Vqjd z+qFMK&j{co-_7Np<^ejI%dg?`nmwm;yemV`*&MfK*fW{o1;TzlZ)p8KmE-*x_;lc8 z&lR<*{S=pUT*2l0xV&ahHOF7g!0R}!{e4@^yzFpsoCP+JGLAPg{4C*EMtc`=yf34@ z^b8jD`{4}S&v7LK4|2RW1CIb7Za%yXIQhY&4J2>8uf#1h*?YfMM3+sWColAMW zVA=5`!+&_bIKcI2*Lj+r51ITA&pRU!FT>eC8aUa%mG@%}S9A_=nh%vW6~HiI$7GIw zl7UazNN>t3zezc4*NJil+lc`cj%LbFwq zROyXyxD|KgGtcACL(geLMH#o#0RJxooX+3F>G|FOx8w{jKi&X8pW$XeMZC~#@;A3%qtjahqTMWkUnFja;26(vvekJg+*#(33 zYHgmwlfvUjA z_3SZ_KfvYlc$~0j`cQ_R1s^Uxzc9c}rwlJoe`IAiJ*5VCg#lh`fYY;YH2;jE3pyO^ z88}dnfqV>jzAmmcZ?`ZR|X4!KF@_P*MUmKiHUuE)U;YGe)x{6ouu7RG<4Dj!`o?<=^ z(DgPua6%bw{u#~i6Z?ehd3qEWYal<#02e&1{t~=L=PUIJZZ{aW;PvB$C;Z3Dam#%xLJ_>gx5OtGulWh!mA#_^BWG*B9|Effs!dx76YG210lZ6}`|F zaxV#lT0H@G8{RpMx;?Q@=K(v8O9Z8!%1@`({ckNt<+YJtP4&1dO2SvvM!9CkGuiEZ%&#S9ztZi~P*{fan<2LT0wzUlf zqLK%GcRQ|~Yp-|K2rV_t7NqLDHF)Q)(I?s4+9(B}L49e^;X|*5Rthb6#TWkY%#ZmZ zD;rr4MKuL=XjhFI*)4U{BKFM@w>#i(^}4;$81t~u(k?OiKq%_dRTB#b{9bYlT6eBIv@G!WqdxxDDk)^~<&)fa z#}=;+<8Ljt)P#b|5rmDtfX^%W5rQqVef&Mwh6vt?jYum69ow)D^-+g8pll zC<X{!Yl3QPx5HMm*FvHy*7@A z*p89xkvwWY!&?+FT9c_$J3L|LC9QM0x7=>8v@+~-x4Hu%o!OTnY`mQw3PMi+?;vMb zjGn0r!HP&IhAE5M7g&JE@C28@A1s6@uvu`TGcW^o_|O`7FhdW;|7;8`3W5^~TIS*m zpn8kPe?3j3FbNIjW1MtL5F;nye}-Pz=fV)Q555nMvTf0jd#NYb#x0Ea=-q18T^Z2= zby6rWRHJTO(sU+xq>z881Q`^857^Lf(mAJ&y&6x^LGSF_>HXNbm?MP_Uk9DTh89Pq z-ldt%P=lKsq>enMmW>Nt1ynIkTbOd;a;RyGg@>wkyIZ4C9v6c%6{fE0P$&RpD}!Dt z7W8_eKAdkd%VOwym$|)5m$~U}_!GI)wYiDL7HbzZA+tOgr$rny(5JpAJQ#{J$)Fpf zCni;G9FV$j#$47yl{xFlUYs{i7(?@1(1Vxe13q6y3tBo_U7^sjSh$f*GIZ`A66sVF zebhuD*C}CyM%8)98N`qc+NDqjdQ_c}T0@>lo9e3{7{+G$h7cwXUqtU2eqzu~n7W`O z??inPcM$W5HxSV#a|{@~)jqV5nD;`#cK?#bSZh@BOEH`R*y*Fe-$?_!&g<~Cdtw1e zmyem`hb=~}@B(J9q3SV{M?x7@x_vaSX!9?xsHNT$W~Yrd)oR2apHSdS8qI3x3N6ep zO>8#s(;18+rGZ{p$BGB1@xge+`Gm#eAi&S97|DWA8eQ2Td0Iiy?~E?hQq19Dp_DBu zmjq*_tucR~t;FBPA$zs6gw~j)l(*CqT`H8etqek+O0k|~IXJsT>Aa?A+{lag0v;;B zQ{jLll(Gq+6v@&hSj?5OS*VoOLl6ovUzPfn@)gk1HYm|JwWzuj5?Bc>jT$^1Sgnyp z(hTFs=cO39LMawwSXF9UxO}1hza!_MSQb9GOk{`lyo5%z>t>$KWVJNW$@t(>d$7Fr zT!lspNl16#GG@p@+t>Q?+I@13T8Bu}J&mD<11x@VHKf_EJ^!XremiyWc{p5t4msw6 z!`*~I`?cpeG+Ku1B08{b!`iNu*Y0~>0~}k*gXOj7J~VnJ_Tlsg`C5P62!@_z)9lxt z57Fp$F0851$7W`g{3< z$aEf}xlU`hHh<9ctl7>A@~?u2)x>4kchVnPy&5(aiQ&r6{dZO3l#BuytnhyT@oa@A diff --git a/dmenu-lineheight-4.9.diff b/dmenu-lineheight-4.9.diff new file mode 100644 index 0000000..d12c77a --- /dev/null +++ b/dmenu-lineheight-4.9.diff @@ -0,0 +1,94 @@ +From 87f92a561c31246f6f9effc0e89ef92677c87746 Mon Sep 17 00:00:00 2001 +From: astier +Date: Wed, 27 Feb 2019 21:44:55 +0100 +Subject: [PATCH] Add an option which defines the lineheight + +Despite both the panel and dmenu using the same font (a Terminus 12), +dmenu is shorter and the panel is visible from under the dmenu bar. +The appearance can be even more distracting when using similar colors +for background and selections. With the option added by this patch, +dmenu can be launched with a '-h 24', thus completely covering the panel. +--- + config.def.h | 1 + + dmenu.1 | 3 +++ + dmenu.c | 10 ++++++++-- + 3 files changed, 12 insertions(+), 2 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 1edb647..317fa2f 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -15,6 +15,7 @@ static const char *colors[SchemeLast][2] = { + }; + /* -l option; if nonzero, dmenu uses vertical list with given number of lines */ + static unsigned int lines = 0; ++static unsigned int lineheight = 0; /* -h option; minimum height of a menu line */ + + /* + * Characters not considered part of a word while deleting words +diff --git a/dmenu.1 b/dmenu.1 +index 323f93c..7ef34d2 100644 +--- a/dmenu.1 ++++ b/dmenu.1 +@@ -50,6 +50,9 @@ dmenu matches menu items case insensitively. + .BI \-l " lines" + dmenu lists items vertically, with the given number of lines. + .TP ++.BI \-h " height" ++dmenu uses a menu line of at least 'height' pixels tall, but no less than 8. ++.TP + .BI \-m " monitor" + dmenu is displayed on the monitor number supplied. Monitor numbers are starting + from 0. +diff --git a/dmenu.c b/dmenu.c +index 6b8f51b..45d1946 100644 +--- a/dmenu.c ++++ b/dmenu.c +@@ -131,7 +131,7 @@ drawmenu(void) + { + unsigned int curpos; + struct item *item; +- int x = 0, y = 0, w; ++ int x = 0, y = 0, fh = drw->fonts->h, w; + + drw_setscheme(drw, scheme[SchemeNorm]); + drw_rect(drw, 0, 0, mw, mh, 1, 1); +@@ -148,7 +148,7 @@ drawmenu(void) + 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); ++ drw_rect(drw, x + curpos, 2 + (bh-fh)/2, 2, fh - 4, 1, 0); + } + + if (lines > 0) { +@@ -604,6 +604,7 @@ setup(void) + + /* 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; + #ifdef XINERAMA +@@ -683,6 +684,7 @@ 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); + } +@@ -716,6 +718,10 @@ main(int argc, char *argv[]) + 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 */ +-- +2.21.0 + diff --git a/dmenu-xyw-5.0.diff b/dmenu-xyw-5.0.diff new file mode 100644 index 0000000..ddf9cfb --- /dev/null +++ b/dmenu-xyw-5.0.diff @@ -0,0 +1,116 @@ +From 7dc7cb96cdda9ad66e33109223c4cc297a7721d1 Mon Sep 17 00:00:00 2001 +From: Alex Cole +Date: Tue, 6 Oct 2020 10:42:07 +1300 +Subject: [PATCH] Updated xyw for 5.0 properly + +--- + dmenu.1 | 24 ++++++++++++++++++++++++ + dmenu.c | 22 ++++++++++++++++------ + 2 files changed, 40 insertions(+), 6 deletions(-) + +diff --git a/dmenu.1 b/dmenu.1 +index 323f93c..a4ecbbb 100644 +--- a/dmenu.1 ++++ b/dmenu.1 +@@ -8,6 +8,12 @@ dmenu \- dynamic menu + .IR lines ] + .RB [ \-m + .IR monitor ] ++.RB [ \-x ++.IR xoffset ] ++.RB [ \-y ++.IR yoffset ] ++.RB [ \-z ++.IR width ] + .RB [ \-p + .IR prompt ] + .RB [ \-fn +@@ -54,6 +60,24 @@ dmenu lists items vertically, with the given number of lines. + dmenu is displayed on the monitor number supplied. Monitor numbers are starting + from 0. + .TP ++.BI \-x " xoffset" ++dmenu is placed at this offset measured from the left side of the monitor. ++Can be negative. ++If option ++.B \-m ++is present, the measurement will use the given monitor. ++.TP ++.BI \-y " yoffset" ++dmenu is placed at this offset measured from the top of the monitor. If the ++.B \-b ++option is used, the offset is measured from the bottom. Can be negative. ++If option ++.B \-m ++is present, the measurement will use the given monitor. ++.TP ++.BI \-z " width" ++sets the width of the dmenu window. ++.TP + .BI \-p " prompt" + defines the prompt to be displayed to the left of the input field. + .TP +diff --git a/dmenu.c b/dmenu.c +index 65f25ce..7be19ae 100644 +--- a/dmenu.c ++++ b/dmenu.c +@@ -37,6 +37,9 @@ struct item { + static char text[BUFSIZ] = ""; + static char *embed; + static int bh, mw, mh; ++static int dmx = 0; /* put dmenu at this x offset */ ++static int dmy = 0; /* put dmenu at this y offset (measured from the bottom if topbar is 0) */ ++static unsigned int dmw = 0; /* make dmenu this wide */ + static int inputw = 0, promptw; + static int lrpad; /* sum of left and right padding */ + static size_t cursor; +@@ -637,9 +640,9 @@ setup(void) + 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; ++ x = info[i].x_org + dmx; ++ y = info[i].y_org + (topbar ? dmy : info[i].height - mh - dmy); ++ mw = (dmw>0 ? dmw : info[i].width); + XFree(info); + } else + #endif +@@ -647,9 +650,9 @@ setup(void) + 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; ++ x = dmx; ++ y = topbar ? dmy : wa.height - mh - dmy; ++ mw = (dmw>0 ? dmw : wa.width); + } + promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; + inputw = MIN(inputw, mw/3); +@@ -690,6 +693,7 @@ static void + usage(void) + { + fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" ++ " [-x xoffset] [-y yoffset] [-z width]\n" + " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr); + exit(1); + } +@@ -717,6 +721,12 @@ main(int argc, char *argv[]) + /* 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], "-x")) /* window x offset */ ++ dmx = atoi(argv[++i]); ++ else if (!strcmp(argv[i], "-y")) /* window y offset (from bottom up if -b) */ ++ dmy = atoi(argv[++i]); ++ else if (!strcmp(argv[i], "-z")) /* make dmenu this wide */ ++ dmw = 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 */ +-- +2.28.0 + diff --git a/dmenu.1 b/dmenu.1 old mode 100644 new mode 100755 index 323f93c..eb554aa --- a/dmenu.1 +++ b/dmenu.1 @@ -8,6 +8,12 @@ dmenu \- dynamic menu .IR lines ] .RB [ \-m .IR monitor ] +.RB [ \-x +.IR xoffset ] +.RB [ \-y +.IR yoffset ] +.RB [ \-z +.IR width ] .RB [ \-p .IR prompt ] .RB [ \-fn @@ -50,10 +56,31 @@ dmenu matches menu items case insensitively. .BI \-l " lines" dmenu lists items vertically, with the given number of lines. .TP +.BI \-h " height" +dmenu uses a menu line of at least 'height' pixels tall, but no less than 8. +.TP .BI \-m " monitor" dmenu is displayed on the monitor number supplied. Monitor numbers are starting from 0. .TP +.BI \-x " xoffset" +dmenu is placed at this offset measured from the left side of the monitor. +Can be negative. +If option +.B \-m +is present, the measurement will use the given monitor. +.TP +.BI \-y " yoffset" +dmenu is placed at this offset measured from the top of the monitor. If the +.B \-b +option is used, the offset is measured from the bottom. Can be negative. +If option +.B \-m +is present, the measurement will use the given monitor. +.TP +.BI \-z " width" +sets the width of the dmenu window. +.TP .BI \-p " prompt" defines the prompt to be displayed to the left of the input field. .TP diff --git a/dmenu.1.orig b/dmenu.1.orig new file mode 100755 index 0000000..7ef34d2 --- /dev/null +++ b/dmenu.1.orig @@ -0,0 +1,197 @@ +.TH DMENU 1 dmenu\-VERSION +.SH NAME +dmenu \- dynamic menu +.SH SYNOPSIS +.B dmenu +.RB [ \-bfiv ] +.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 +.BI \-l " lines" +dmenu lists items vertically, with the given number of lines. +.TP +.BI \-h " height" +dmenu uses a menu line of at least 'height' pixels tall, but no less than 8. +.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/dmenu.c b/dmenu.c old mode 100644 new mode 100755 index 65f25ce..5a11376 --- a/dmenu.c +++ b/dmenu.c @@ -131,7 +131,7 @@ drawmenu(void) { unsigned int curpos; struct item *item; - int x = 0, y = 0, w; + int x = 0, y = 0, fh = drw->fonts->h, w; drw_setscheme(drw, scheme[SchemeNorm]); drw_rect(drw, 0, 0, mw, mh, 1, 1); @@ -148,7 +148,7 @@ drawmenu(void) 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); + drw_rect(drw, x + curpos, 2 + (bh-fh)/2, 2, fh - 4, 1, 0); } if (lines > 0) { @@ -609,6 +609,7 @@ setup(void) /* 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; #ifdef XINERAMA @@ -637,9 +638,9 @@ setup(void) 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; + x = info[i].x_org + dmx; + y = info[i].y_org + (topbar ? dmy : info[i].height - mh - dmy); + mw = (dmw>0 ? dmw : info[i].width); XFree(info); } else #endif @@ -647,9 +648,9 @@ setup(void) 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; + x = dmx; + y = topbar ? dmy : wa.height - mh - dmy; + mw = (dmw>0 ? dmw : wa.width); } promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; inputw = MIN(inputw, mw/3); @@ -690,6 +691,8 @@ static void usage(void) { fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" + " [-x xoffset] [-y yoffset] [-z width]\n" + " [-h height]\n" " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr); exit(1); } @@ -717,12 +720,22 @@ main(int argc, char *argv[]) /* 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], "-x")) /* window x offset */ + dmx = atoi(argv[++i]); + else if (!strcmp(argv[i], "-y")) /* window y offset (from bottom up if -b) */ + dmy = atoi(argv[++i]); + else if (!strcmp(argv[i], "-z")) /* make dmenu this wide */ + dmw = 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 */ diff --git a/dmenu.c.orig b/dmenu.c.orig new file mode 100755 index 0000000..a7919a3 --- /dev/null +++ b/dmenu.c.orig @@ -0,0 +1,777 @@ +/* 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 "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) + +/* 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; +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 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, 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); + } + + 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; + /* 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, win)) + continue; + switch(ev.type) { + 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], 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; +#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.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; + win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0, + CopyFromParent, CopyFromParent, CopyFromParent, + CWOverrideRedirect | CWBackPixel | CWEventMask, &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 [-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], "-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 + 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); + 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.c.rej b/dmenu.c.rej new file mode 100644 index 0000000..97162ec --- /dev/null +++ b/dmenu.c.rej @@ -0,0 +1,10 @@ +--- dmenu.c ++++ dmenu.c +@@ -693,6 +696,7 @@ static void + usage(void) + { + fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" ++ " [-x xoffset] [-y yoffset] [-z width]\n" + " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr); + exit(1); + } diff --git a/dmenu.o b/dmenu.o index 95de8707de4fd5e6e6b51b1099acb06179941548..fc7467638367cd88186bd4e5f2178c02ee34818b 100644 GIT binary patch literal 33320 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 diff --git a/drw.c b/drw.c old mode 100644 new mode 100755 diff --git a/drw.h b/drw.h old mode 100644 new mode 100755 diff --git a/drw.o b/drw.o index 941460bd62bca873538fd2390d633e6978db77e9..769ec788f1a0bd7c34ebe2f1e6bd6ac9069cf045 100644 GIT binary patch delta 4350 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 QdP94HtKPf$N9Fnd1)4PdYXATM diff --git a/stest b/stest index c93eed0aabd6b4ee4f747c9cb34b7bb157cf0469..0f932d707d0120e10af1595096abfe3c9fb87dbf 100755 GIT binary patch delta 3772 zcmZuze{9po6~A+w#0mN3{IU&%{D2aEI&oqkO`60erWoWf7-i5>FrMRpNg9Gst_g{_3HeD~gc?>ubv zNq6tw=e>LP?(X}2?=Jj+k3GweF0za@vn07#6U%2VHjh<|wpTa&$)IZ#H%Y?`>iV{N$;xjH(LJ9^okJCmhLGg(l~?YVy)<9I>o1Vp zJYy@IFj}EM!^)q7@eB+9HT7@-bmT5mcrGv*L8b% zEpsb$W?5nb(MWJlg!%ow;qM0h1JOVv>VGT{?ql8kk#JwMn+1FK4TQSF5!QboI>5Rk zp%CjuvnU&gcA?oopR_|U6p65X{h>Z#jl#YN3k`;&ED{QI5#}fV!5)8bPmjMl5bkAx zpfMO47=Tx@cE=i>Y^`tI>JEQ{y|FPl{6E-WUqO4oTg9gL`iP_qff?|cNXkTxUjvTx zW@HuOH1sq0#psXl$H-*u5}OqAd?Q;gfzog|pFWc3(U>Q%inbmS^%Ah`Vj5E z2Q7l95q%2LgZH4tlP7ZqGJjq)$6&m1SJR-fcwXU~IGC>Vjxfs79r^A10?z~qhJo%#y*=^ZY+wH(=q!2UY*<=2{~8yrr=&P~0H z;`EbK<5zs~FW#pg%@^0E@^N0PR>;`*PWs~iBBTccnjXW+6x~h|PB;=nt=q|E z;fo3H@QVwqIJwKawDi73h($A}nrQJuXBQ#7eTVx|_YU_?xBpCcVWo#T*v-OucO0Lu zi(lO7jsL?t^v~-XA6nx`IL_lS9m089+2&=8-Ria%Rz8c~7=wwDa$XJ}mbmy|z*M@p z^qr-MdgGr)^S#5Z-$7%o>;$YS?c{p_N>>^?{)?yoap^%GgAHX58JoXC@%6Ij`KwS@ z?z3*XqiKf|76Vv7I8-%NCQ_TS7>*t=H5pg%+CNbwTa)^ujFx+Xj4 zSk*3jJx-ylclMg5brHX=X&)h9a8uKK$SZDX+7aX)Q53@L5$YkAu0ogdd0ds^{l>5j~FWIy!#@wp7>hdU(2e4!rHio2;)HoCQ~M-hdO! zt?s|05fO$e=yS=Hd^b%tONG)`0Jm2fu9icMeS;$*s|an2Xb=57NRqMJQZEY{>w$5* zzt}5(JNkc!wwa)~uC3Z6lOA5>K7!SXcuYdRG`YX7g=aeK4fc9W$(5L|jj*h7w$aFr zXTbVK4=;ch8ZEX0Hbw;k$w#+@L?_Rg4Njxh#+X}x?5NJz{Zf0a(ZX$z?W{u&6D3k9 z*+%3BRsi2}lK(2{U)el?1M(k3Z7G{*Rk+UIKt^-lbXs@`eCVt*7PDwI+;J}3Zf1{G zr5fKxkuwWpu2j4LPlK~E_I8@{cM-2*R(3Sa-U8;87Tamm7PA6&P;N(jOXzqRI96GB z3)yg=u-rkGhC+6=Jaye5S=wT#HPfG7rE9U63i_e&@S3ps71|ViLnI%NP3C3P>V@>* zBnNWvYQCx9%^}=iO%_7A5UZ8=%PxiJ+$sHBk+>?H%@Dx2J5ftTcPwqz!=&X=Ve`DS zNiWPJLi=OXQk;o2|8EHo=S2T!(O-p4O%{GrjI-esj?dG0$pZWb=nksPdc=>QN20}q z8}js*ia;j!-e1Nydmi54?p)WAEXgiaPpNeJ{ktFA*Cz|SUlj8cJr(K{z~3G23xlJ@ z0l}7**{QCAg8@J*s64EA51eYRjO|AYO0LT4l1#vgQ)MAi*<0Bu{tW8y zVUnD$61L)$B#F|))KL~=BRHbep&V|L8&Ukav{V74?UT_fndYyScB+slzK0G6iRNPp zO*<#n(Pl7lDE71&@;Q9lvon88Ze%VlVuSZQOLMlZ6f3eixZzoq^Bk2qq;mQc{s(DH B+N%Hn literal 17744 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 diff --git a/stest.1 b/stest.1 old mode 100644 new mode 100755 diff --git a/stest.c b/stest.c old mode 100644 new mode 100755 diff --git a/stest.o b/stest.o index 9408acc32b22a0b093552dc7cacd070a1e9a4780..72f9ebeeb0579223651d08393c2846ea5302263b 100644 GIT binary patch delta 1524 zcmY*ZZAep57`|8c;XdwmKc;u9)Pai1Xt^L1V`&t4qgfV6VhCD|kV;J^Y9w>44~I>J z*NBS1updSU8AO5<3lWSG^iThSgoTfb%OdFmn96oT+;k{@?K@r^OD!umGqKJ{YLl$dVxVMakz6Xs zt;SlCVZ4=5#t+77vn!EwrxZzFFZU|rj!>pK^*NII^#)~OBB>mS5ze_8W^gW&`ld12 zY2>S<{t-Dl8_FcZ9um?$l~Km0%Du?@f)en+Npqk+6x<)IAu3}+lOGK;8cio!nLLKg zV2(ut8*5xc+#F@w;j6iltpU!`4HFg-7A&(cX;om$s<6l5r&VU#2(}PBL$HJ3IgIeU zz*HzQ7BvCF_B{3H5ZMzac#Gg2f>Q+V6MRhYDZv*QVa;{~s_i2cxN2-TmtlDMxV0Usp!ZGChJp8rGJ^?YBPm4|!VXs5>AFTdWfnA>oqQ z6_|I)p^v&`_+z+D*EwBKzs^^Hb+^oxV5~4)4cfCreU9qdUIZN9#M+^i9};?cW6|Kn zo`GOre{Wy3KQ;{S`P1MR+Jrhga!01%5|D9_61LGJk`QZ!QQR|RS~d>eiTl_-_$@Z% zCC#wG7r~mq!?a{#t*{|UwlR9KHIR@>*&EO$$?O6QOO(wURniyB3!_E0=6NWx_J=}dunZ4G{OYD6-xgDFQiWo delta 1510 zcmY*ZTSyd97@lc&XD`m)cb(nV&9*d^#aj;@^$v-?Py7?&Cy9Sa{2cKM#D64y1>)vTZ>(8qZHOqb)~2RYjqS1a zNQ2TCgLmd@B^;-x6>tGO{?@i?c?@ocZj0piFsz@lSe*}P#7Yd?#;`tEL@bW$;#D|7 zSzJ*M>y$l1*{K{hn5SwlPrQL^HBrzrXcA~p$zM3J1rD~f*4(M-^c3mQt_H_qdSRm8G$mQq%o zOy1IQ3fAE zw097sb#UiTT{;#gY% z6ZU3agdg@H7;v<~qNB?>Z9xPwS*NZdlsPxig2)PUIy7i!Udc62C!*B?v+l6Bl-@bhv@R~?hIMz? V{MoDqe}Ryv#@s_QT!FZ=@IPoeTHXKv diff --git a/util.c b/util.c old mode 100644 new mode 100755 diff --git a/util.h b/util.h old mode 100644 new mode 100755 diff --git a/util.o b/util.o index 4607dbd27ccff1daf63334f1a4c614aad4f343e1..c0e1b2e540a7db2dd2bbe25ad82a49373d5cbbfb 100644 GIT binary patch delta 520 zcmca1xI%D(hPVbR0~|PjSq=<*47?ldH5g3|^^EikKw>OFtN_FyweEhQ3``7+2S8$s zKnwzmP(CM+JvoPQ&g2FriOCz7JQx)xKV%YT)BuwDjHY0=)#O5EaYkzpd-4KiiOJ`f zwY0%zFqA?lpy3dU{``l4l~8ezg=~{$S;Qql&Vb1tLXu^l>Hk@ z$gZxN0~7*z*#TJ!$gThh0s%N;fHXG{b53UE&=&mwwbBAggFM4B*_A_^Qv>QKr^%HZ Q=3FbFCR8&_{>3T>0J>ai7ytkO delta 498 zcmZ1>ctdc4hWHFt1~_m4vm6+B8F)6@YcR4J=o#r5OrFCyXR-nl8zb}NkBp+s%nU40 zniWd3Luro5>P(tom28vknIb2jV3J@opWMhK&S(cFUBIL_h?EQf+9brl$nX`l>6snF1NOMoFWfqs@1+xD9hk(r} zvTK2|d`Pl4pt3ALnt$?LpsWCr>}wQRUKVjlK_uDVNV39{ZGo~JNU}VP5NVLfT$6KI zrcM@R^_!f*8X@?D86v|0Rl&9SB5OD!YaCFNak4JE^yCh91>Hy>52V!rh*1DEY7C%) vTtJ#*@>O