Compare commits

..

229 Commits
3.6 ... 4.5

Author SHA1 Message Date
89fc26e7f0 prepare 4.5 release 2012-01-08 13:14:24 +01:00
7f45b3f7aa update version 4.5-hg 2012-01-08 13:13:00 +01:00
0f91dd1c74 config.mk cleanup 2012-01-04 13:30:47 +01:00
3402a8d53a align M-[hjkl] closer to vi keys 2012-01-02 19:48:11 +01:00
d3e9bd152e happy new year! 2012-01-01 20:33:56 +01:00
b95fb20269 add Mod1Mask keybindings 2012-01-01 20:32:40 +01:00
6664e4233f merge stest -> default 2011-12-19 16:52:48 +01:00
26c78cd952 comment xdg fallback behaviour 2011-12-19 16:05:55 +01:00
6b1d658d12 stest: restore stream testing 2011-12-09 11:49:44 +01:00
56a0d1fa14 fork dmenu_run to disown child shell 2011-12-09 11:36:26 +01:00
32ef0f5662 stest: cleanup 2011-11-27 23:40:48 +01:00
dcd6e771a1 stest: remove unneeded lstat 2011-11-27 23:37:01 +01:00
8cc28cb426 simplify stest 2011-11-27 23:35:09 +01:00
942199ccd0 dmenu_run: use $SHELL 2011-11-23 15:17:32 +01:00
3f9b10c86a set window background_pixel 2011-11-23 14:40:21 +01:00
5162d1b37a fix dmenu_path exec sh 2011-11-19 21:31:18 +01:00
a02a1a6623 faster dmenu_run -f 2011-11-19 21:24:07 +01:00
bb4424df07 replace lsx with stest 2011-11-19 19:54:55 +01:00
8ac44eb75a update manpage 2011-11-16 11:26:15 +01:00
ebd94a6c00 limit direction keys in vline 2011-11-15 20:32:39 +01:00
2b31952731 fix C-n / C-p directions (thanks bastien) 2011-11-14 20:02:16 +01:00
c01f36a1f3 new default colour scheme 2011-11-14 00:46:56 +01:00
168221b2f8 makefile: *.o depend on draw.h 2011-10-26 14:16:12 +01:00
dc77337ef3 add paste from clipboard 2011-10-26 13:28:15 +01:00
7b1493a631 add lots of comments 2011-10-26 13:20:14 +01:00
dd29c5d480 input focus: calculate areas of intersection 2011-10-26 12:14:50 +01:00
70b3418e3e simplify dmenu_run 2011-10-17 10:22:23 +01:00
cf641ae496 merge xim -> default 2011-10-17 10:11:48 +01:00
5e0156c072 merge lsx -> default 2011-10-17 10:08:04 +01:00
ca7ef6d2c9 use ~/.dmenu_cache if no xdg cache 2011-10-17 02:12:33 +01:00
7bbd4c56eb lsx: detect read errors 2011-10-17 01:44:07 +01:00
24565608cb xim: check for corner cases 2011-10-17 01:18:57 +01:00
05026fb5ce fix extra warning 2011-10-16 18:26:11 +01:00
c71abdc65c lsx: return failure on error 2011-10-16 18:14:51 +01:00
4126b1e323 merge default -> lsx 2011-10-16 18:13:29 +01:00
c8f0a37638 add xim support 2011-10-16 17:21:33 +01:00
1cf3864464 limit lines to input 2011-10-13 20:43:59 +01:00
8e302717cb input focus: fix for reparenting wms 2011-10-04 21:39:56 +01:00
e30ad490b2 fix monitor select when no focus 2011-09-30 21:08:37 +01:00
5020734408 merge token -> default 2011-09-20 00:11:01 +01:00
4c8d43ab73 tweak match 2011-09-20 00:09:20 +01:00
0582480801 update manpage 2011-09-20 00:06:13 +01:00
f1848a3ef0 detect active monitor using input focus 2011-09-19 18:15:03 +01:00
b26d3f54ee add token matching 2011-09-19 10:40:56 +01:00
3af80cd7d8 change version to 'hg' 2011-09-19 10:40:07 +01:00
4692f84ff0 dmenu_run: sh -c 2011-07-24 20:04:58 +01:00
c805dcbeaf fix loadfont 2011-07-22 18:16:57 +01:00
a6cbc6c9a7 Added tag 4.4 for changeset 2b105eaae831 2011-07-19 21:30:14 +01:00
bae58f61cf add lsx.1 to dist 2011-07-19 21:30:09 +01:00
1636e12210 tweaks 2011-07-17 14:06:53 +01:00
2b92c95230 efficiency tweaks 2011-07-14 20:03:08 +01:00
16a0c0d52a fix extra warning 2011-07-14 20:03:00 +01:00
5867c53390 simpler vline 2011-07-06 13:40:36 +01:00
34a816f87d rebind ^N ^P 2011-07-04 16:55:09 +01:00
0288b576ca include limits.h 2011-06-25 17:02:14 +01:00
59dafc4ad6 make clean lsx 2011-06-23 22:39:20 +01:00
49672e9d05 merge lsx -> default 2011-06-23 20:27:28 +01:00
07d452e0c8 close lsx branch 2011-06-23 20:26:57 +01:00
88d44169e9 lsx: check snprintf 2011-06-23 20:04:50 +01:00
f7cbe710a2 update draw.c 2011-06-18 22:11:19 +01:00
86e9e6f1ec simpler lsx 2011-06-18 07:50:46 +01:00
eadf090413 new dmenu_run 2011-06-13 21:50:31 +01:00
8ec1b41cac add lsx.1 2011-06-13 19:32:45 +01:00
ab3bcac0bf new lsx branch 2011-06-13 19:28:30 +01:00
723cbabc12 add ^M 2011-06-13 19:25:40 +01:00
86775cc44b Added tag 4.3.1 for changeset 34a2d77049a9 2011-05-18 17:01:59 +01:00
2103ae2891 bugfix 2011-05-18 17:01:44 +01:00
b028ec0e07 Added tag 4.3 for changeset 14c79f054bdf 2011-05-18 16:21:45 +01:00
bb3e33def3 no -m, cleanup 2011-05-18 16:20:03 +01:00
3a60b19514 fix possible overflow 2011-05-16 23:35:14 +01:00
dd2f298252 fixed extra warnings 2011-05-16 12:59:31 +01:00
11ea52d170 portability 2011-05-15 21:54:26 +01:00
4354074607 efficient incremental search 2011-05-15 16:05:32 +01:00
4776d6dc61 match first 2011-05-15 14:21:00 +01:00
d0051e7bb8 faster grab 2011-05-15 14:13:31 +01:00
fb67bd666e cleanup 2011-05-15 13:58:54 +01:00
f5bd1eed8d fast but inexact 2011-05-15 13:02:33 +01:00
1654d6cd62 cleanup 2011-05-15 02:37:49 +01:00
6cc0b0dc08 increment version 2011-05-14 23:26:41 +01:00
b2bb6ebec9 only match links 2011-05-14 23:21:38 +01:00
a662fc6e0a follow symlinks 2011-05-14 23:14:31 +01:00
d066975e78 cleanup 2011-05-14 22:43:42 +01:00
26236a4900 whoops, wrong dmenu_path version 2011-05-14 22:12:28 +01:00
15505bd711 fast dmenu_path script 2011-05-14 20:43:11 +01:00
86468aafe5 instant ^E 2011-05-14 18:39:27 +01:00
be9afce035 fix typo 2011-05-14 17:47:12 +01:00
3c067598fc use array for items 2011-05-14 17:46:20 +01:00
86019c5855 fixed xinerama corner case 2011-05-12 13:17:41 +01:00
0291c722fb fixed -m bug (thanks Rob) 2011-05-11 12:25:50 +01:00
e0e6b071c6 fast grab patch (thanks Rob) 2011-05-08 15:15:24 +01:00
cd3b4915c3 helpful errors 2011-05-06 21:13:02 +01:00
210b303941 paring 2011-05-05 15:46:48 +01:00
47e3e8be7b update license 2011-01-07 18:55:00 +00:00
d515d2758f cache option in config.mk 2011-01-07 18:54:40 +00:00
a8ea79715f gmake spews 2010-12-01 20:25:10 +00:00
3e0a141016 posix makefile 2010-12-01 20:23:16 +00:00
cbd8257914 Added tag 4.2.1 for changeset abb6579a324f 2010-11-20 09:25:08 +00:00
22cf9626c7 fixed dist target bug 2010-11-20 09:25:04 +00:00
9e13ecabe8 Added tag 4.2 for changeset 379813a051f0 2010-11-19 11:51:01 +00:00
266f3dd311 removed unnecessary defines 2010-11-17 04:51:30 +00:00
8d9ade36de moved main, updated args 2010-11-17 04:33:34 +00:00
da81f57f6d fixed config.mk dep 2010-11-12 00:30:03 +00:00
c1241bcba3 updated manpage 2010-11-12 00:01:54 +00:00
eeba6221b1 rebound paste to ^Y 2010-11-12 00:00:32 +00:00
a0a99d10e1 removed libdc dependence 2010-11-11 23:56:39 +00:00
7cf66b443a -m flag to fix dwm selmon bug 2010-11-02 12:15:15 +00:00
038a78a3f4 updated manpage 2010-10-08 23:40:11 +01:00
e0add428d2 cleaned up 2010-10-08 23:36:45 +01:00
bf7b8e37ee dmenu_path.c (shell is a bottleneck) 2010-10-08 23:24:22 +01:00
610a0a8d12 fixed linking bug (thanks Jacob Nixdorf) & iscntrl corner case 2010-09-13 14:22:02 +01:00
f0818217b3 simplification 2010-09-11 19:48:10 +01:00
3c366bd73d update to libdc, fixed utf8 bug 2010-09-11 13:37:01 +01:00
75a19c35bd arrow offset 2010-08-20 19:57:13 +01:00
a5f31f5707 fixed width bug 2010-08-20 19:42:58 +01:00
b81c1e88cd rebound paste, removed useless max widths 2010-08-20 13:50:44 +01:00
5376113039 new libdraw 2010-08-19 16:43:39 +01:00
c7a8f17bd2 new libdraw 2010-08-19 16:17:57 +01:00
128d4cf376 resorted globals 2010-08-18 17:35:23 +01:00
e4fdaba88d signed ints, ignore negative -l value 2010-08-18 17:33:34 +01:00
849f1dd7a3 fixed insert segfault, added nextrune 2010-08-12 15:35:51 +01:00
402dc2bc95 fixed paste 2010-08-11 15:02:03 +01:00
00a60cb7b2 new libdraw, replaced cistrstr with fstrstr, simpler readstdin 2010-08-11 14:24:25 +01:00
e149c531b8 more efficient initfont 2010-08-10 18:09:02 +01:00
605e9b6c03 reverted calcoffsets 2010-08-10 14:14:37 +01:00
caf5246268 simplifications 2010-08-10 13:38:49 +01:00
93af72e116 cursor fix + style 2010-08-09 11:54:46 +01:00
0b8072a5a9 added ^D, removed ^M 2010-08-06 14:16:08 +01:00
31ffcd3b9a new libdraw, typo fixes 2010-08-05 15:41:56 +01:00
9cf07b4b9b another typo fix (thanks, Gene Auyeung) 2010-08-03 18:19:59 +01:00
7a2782d02d typo fix 2010-08-03 17:29:53 +01:00
1c91c2a99c cleaned up 2010-08-03 17:18:24 +01:00
b7695fa98c merged *{h,v} functions 2010-08-03 17:10:29 +01:00
b54c179d58 retyped promptw 2010-08-02 15:13:33 +01:00
06c18808b6 replaced promptw 2010-08-02 14:49:14 +01:00
a7aee433cc fixed bugs, no more config.h, updated manpage, new libdraw 2010-08-02 14:22:54 +01:00
a3606ecb0e updated manpage, added paste, cleaned up, new libdraw 2010-07-31 14:56:27 +01:00
7d5fe17391 merged dmenu & dinput (clunky interface) 2010-07-30 13:40:56 +01:00
7f36736d11 underline match 2010-07-30 10:26:12 +01:00
115c01b74e new libdraw 2010-07-30 10:25:55 +01:00
d77340ed53 fixed vlist select 2010-07-30 09:18:35 +01:00
da7a799121 updated to libdraw tip 2010-07-27 13:40:32 +01:00
855a566319 added dmenu.h, common.c 2010-07-02 06:49:05 +01:00
29e8faed6c updated to new libdraw 2010-07-02 05:50:19 +01:00
d9c24564d2 atexit cleanup 2010-07-02 03:44:01 +01:00
6ba5103df4 removed -e flag (too buggy), cleaned up 2010-06-30 22:42:15 +01:00
309d071df5 fixed no-input invisible text bug 2010-06-30 10:45:24 +01:00
26b9f3de0f libdraw now has own repo 2010-06-30 01:36:15 +01:00
7afd296c40 resizing vlist, new dinput binding 2010-06-30 00:52:14 +01:00
cc8b3b999b cleaned up 2010-06-30 00:05:32 +01:00
f2abaf8b30 decosmetics 2010-06-29 19:19:20 +01:00
340b176de6 dinput with dmenu flags, fixed usage & -v, cosmetics 2010-06-29 16:07:31 +01:00
18dcf73896 extended libdraw 2010-06-28 06:09:34 +01:00
9f3b0c6ea8 cleaned up 2010-06-25 04:33:41 +01:00
4508fd2c4e moved draw.c to libdraw.a 2010-06-24 17:44:35 +01:00
723361fa12 removed colors from dc 2010-06-24 16:24:04 +01:00
96c65400cc decoupled draw.c from dmenu & dinput 2010-06-24 16:18:18 +01:00
6c1d0e4d60 fixed offsets, updated eprint, cleaned up 2010-06-24 14:22:34 +01:00
6efe1932be fixed static symbols in config.def.h 2010-06-24 11:30:30 +01:00
8f7b62e2b6 fixed makefile 2010-06-23 14:29:32 +01:00
2ec16d9cb2 cleaned up 2010-06-23 13:49:24 +01:00
146bc23c11 cleaned up 2010-06-23 13:31:11 +01:00
595e797660 added draw.h 2010-06-23 13:29:15 +01:00
bba30e2686 overlapping code 2010-06-23 12:42:08 +01:00
08b264393d typo fixes 2010-06-23 12:15:07 +01:00
b4e63454e5 initial dmenu / dinput separation 2010-06-23 12:04:54 +01:00
bff1526d31 fixed vlist cursor 2010-06-22 10:45:07 +01:00
9a33a72c6a updated manpage, changed keybinds
M- binds tend to be wm level, and there were up to 3 binds for the same action
M-{hjkl} also no longer made sense in vlist mode
2010-06-20 15:04:15 +01:00
97797d90a6 cleaned up 2010-06-20 01:19:17 +01:00
4983707c70 added ^K, optimisations 2010-06-20 00:44:26 +01:00
4229fb7b78 added sselp requirement to readme 2010-06-19 21:44:32 +01:00
b27ffbd78b cleaned up 2010-06-16 15:36:17 +01:00
6366f94e36 fixed vlist paging, cleaned up 2010-06-11 09:24:33 +01:00
645f1d0dfc updated manpage 2010-06-09 10:13:26 +01:00
d7d14e53da Added tag 4.1.1 for changeset 72749a826cab 2010-05-29 12:56:37 +01:00
851672cadc prepared bugfix release 4.1.1 2010-05-29 12:56:33 +01:00
504b797be8 applied Ramils patch 2010-05-29 12:55:38 +01:00
503ca75af4 Added tag 4.1 for changeset 844587572673 2010-05-28 11:42:54 +01:00
8623bf5d19 prepared dmenu-4.1 release 2010-05-28 11:42:49 +01:00
5bc288b2b1 fixed vlist alignment 2010-05-05 11:42:39 +01:00
a6835349df cleaning up 2010-05-02 23:17:02 +01:00
518c9b72d1 fixed bad parenting, simpler vlist 2010-04-14 17:35:19 +00:00
09db46f54f fixed ^U cursor support 2010-04-13 20:14:45 +00:00
e3623cd7f2 fixed 3 bugs and some inconsistency 2010-04-07 16:15:34 +00:00
0ba3bae981 applied Troels' patch, thanks Troels! 2010-04-01 21:40:11 +01:00
ebeb4e4752 added Connor to LICENSE file 2010-04-01 21:32:06 +01:00
3472085f59 commited Connor's sanity patch 2010-04-01 21:31:09 +01:00
7ffe519816 apply nibble patch removing per-item length limit 2010-04-01 19:30:21 +02:00
29686bd1b8 add ^a and ^e keybindings 2010-04-01 19:10:41 +02:00
052ffae192 applied Connor's subwindow patch 2010-03-31 22:43:49 +01:00
eededaa76f applied Connor's next nice patch, thanks a lot! 2010-03-31 22:37:41 +01:00
8e3e61170b applied cls' patch, thanks Connor! 2010-03-22 07:50:26 +00:00
37236f8840 applied Connor's patch, thanks! 2010-03-07 08:32:16 +00:00
7082ba1e10 this is only a temporary workaround, the command executed by -p must be configurable through some switch, that was the initial idea, just using sselp is too limited, I'll look into the other issues soon 2009-12-05 16:52:53 +00:00
569a1f925a applied cursor, vertical and paste patches for upcoming 4.1 dmenu version (due to the fact that surf is using dmenu as well) 2009-11-28 12:28:15 +00:00
0f4d3ffdb5 Added tag 4.0 for changeset 78f9f72cc9c6 2009-04-18 12:50:12 +01:00
a1ad9c2a1c applied Matthias Christian Ott's sanity fixes (thanks a lot!) 2009-02-21 19:21:54 +00:00
51224dcb79 next release will be 4.0 2008-12-12 19:58:52 +00:00
4e74263ba0 minor modification 2008-12-09 21:55:47 +00:00
bab59a9807 Added tag 3.9 for changeset 21a1ed9a69b9 2008-09-09 20:45:07 +01:00
ef00902fd9 simplified initfont 2008-08-29 10:09:40 +01:00
3e60c5d836 reverted setlocale() call 2008-08-25 09:38:19 +01:00
c24f22a36b removed artifact from wmii menu 2008-08-23 09:33:56 +01:00
44e372bb31 fixed a problem when backporting dwm's drawtext() 2008-08-18 19:24:29 +01:00
17232f493b abc... 2008-08-18 10:20:53 +01:00
b95e61c9b7 removed the i = textnw... as remarked by Martin Hurton 2008-08-18 10:17:15 +01:00
cf7e4c15a9 backported drawtext() simplifications to dmenu 2008-08-18 10:03:28 +01:00
c43c692a4d getting rid of setlocale(), it doesn't seem to make sense with Xmb, artifact of Xutf8 times 2008-08-18 09:31:01 +01:00
abd9fbb79a Added tag 3.8 for changeset 644b0798fccc 2008-07-29 19:20:53 +01:00
698ec259af similiar change as in dwm 2008-07-18 20:20:19 +01:00
88efbf3dd1 removed compiler warning if XINERAMA is disabled 2008-07-17 17:40:42 +01:00
4d8a646958 got rid of compile time xidx, grabbing the mouse pointer instead, falling back to screen 0 if no pointer available 2008-07-16 18:38:53 +01:00
b89a9501c7 reverted uint/ulong introduction 2008-07-16 18:18:38 +01:00
65d655b371 minor update regarding locale support 2008-06-30 10:00:00 +01:00
2cef0ddb01 removed emalloc, used only once so obsolete 2008-06-21 16:43:12 +01:00
3f244b1d52 minor fix 2008-06-19 09:18:17 +01:00
a6945d5094 Added tag 3.7 for changeset 0508a3a6ee10 2008-06-18 18:21:45 +01:00
8911aa1060 minor fix 2008-06-18 18:20:21 +01:00
d2305e4b13 reusing config.h's color values, note we have to use const char *, instead of const char [] here, because the pointer might change 2008-06-14 10:55:13 +01:00
fcf26a38f1 using xidx 2008-06-13 12:04:04 +01:00
4fc6cbe608 yet another cosmetic change 2008-06-13 11:53:53 +01:00
a45f106d3c cosmetic fixes 2008-06-13 11:46:50 +01:00
596033b781 s/unsigned int/uint/, s/unsigned long/ulong/ 2008-05-22 11:15:11 +01:00
357558798c foo 2008-05-20 15:07:42 +01:00
1f6af5e78f added Xinerama support to dmenu, reverted -b behavior, removed -x, -y, -w 2008-05-19 20:29:32 +01:00
f3617bd7ca no exe should be unquoted, agreed to Peter Hartlich 2008-04-10 18:12:00 +01:00
096fb3723b fixed unquoted dmenu_run $exe-use reported by Jukka 2008-04-10 16:46:32 +01:00
6423288394 though sticking to |uniq 2008-04-09 23:32:46 +01:00
7195e941c1 re-applied Peter Hartlich's and Jukkas dmenu-related patches, for odd reasons they disappeared 2008-04-09 23:31:49 +01:00
12805b69ac Added tag 3.6 for changeset 0bc2751d06e8 2008-04-03 21:56:42 +01:00
14 changed files with 1061 additions and 765 deletions

12
.hgtags
View File

@ -35,3 +35,15 @@ e4c81a78ffbad6ba4d1ad119cc654da6eca63a4c 3.2
709df5a4bad7015a346b2b44b1b3b573ea3088ff 3.3 709df5a4bad7015a346b2b44b1b3b573ea3088ff 3.3
9ab649b3b3e5bfccf1c8f352c59e5361e070a25f 3.4 9ab649b3b3e5bfccf1c8f352c59e5361e070a25f 3.4
05e5bd706b3b3e61399d57c4bb43df296a20112d 3.5 05e5bd706b3b3e61399d57c4bb43df296a20112d 3.5
0bc2751d06e8b95e0138854c7815e154c5c3d990 3.6
0508a3a6ee106f36d9b8ff07bb5b28584edfa89c 3.7
644b0798fcccd570fd519899e1601c6857496b91 3.8
21a1ed9a69b9541a355758a57103e294fb722c33 3.9
78f9f72cc9c6bdb022ff8908486b61ef5e242aad 4.0
844587572673cf6326c3f61737264a46b728fc0a 4.1
72749a826cab0baa805620e44a22e54486c97a4e 4.1.1
379813a051f03a1b20bdbfdc2d2d1d2d794ace48 4.2
abb6579a324fffdf6a23c2fa4c32911277da594a 4.2.1
14c79f054bdf43ff3213af8e60a783192e92a018 4.3
34a2d77049a95b02f3332a0b88f9370965ebcfad 4.3.1
2b105eaae8315b076da93056da9ecd60de5a7ac9 4.4

24
LICENSE
View File

@ -1,6 +1,10 @@
MIT/X Consortium License MIT/X Consortium License
© 2006-2008 Anselm R. Garbe <garbeam at gmail dot com> © 2010-2012 Connor Lane Smith <cls@lubutu.com>
© 2006-2012 Anselm R Garbe <anselm@garbe.us>
© 2009 Gottox <gottox@s01.de>
© 2009 Markus Schnalke <meillo@marmaro.de>
© 2009 Evan Gates <evan.gates@gmail.com>
© 2006-2008 Sander van Dijk <a dot h dot vandijk at gmail dot com> © 2006-2008 Sander van Dijk <a dot h dot vandijk at gmail dot com>
© 2006-2007 Michał Janeczek <janeczek at gmail dot com> © 2006-2007 Michał Janeczek <janeczek at gmail dot com>
@ -8,16 +12,16 @@ Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"), copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense, the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the 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: Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software. all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 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 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE. DEALINGS IN THE SOFTWARE.

View File

@ -3,10 +3,10 @@
include config.mk include config.mk
SRC = dmenu.c SRC = dmenu.c draw.c stest.c
OBJ = ${SRC:.c=.o} OBJ = ${SRC:.c=.o}
all: options dmenu all: options dmenu stest
options: options:
@echo dmenu build options: @echo dmenu build options:
@ -15,44 +15,52 @@ options:
@echo "CC = ${CC}" @echo "CC = ${CC}"
.c.o: .c.o:
@echo CC $< @echo CC -c $<
@${CC} -c ${CFLAGS} $< @${CC} -c $< ${CFLAGS}
${OBJ}: config.h config.mk ${OBJ}: config.mk draw.h
dmenu: ${OBJ} dmenu: dmenu.o draw.o
@echo CC -o $@ @echo CC -o $@
@${CC} -o $@ ${OBJ} ${LDFLAGS} @${CC} -o $@ dmenu.o draw.o ${LDFLAGS}
stest: stest.o
@echo CC -o $@
@${CC} -o $@ stest.o ${LDFLAGS}
clean: clean:
@echo cleaning @echo cleaning
@rm -f dmenu ${OBJ} dmenu-${VERSION}.tar.gz @rm -f dmenu stest ${OBJ} dmenu-${VERSION}.tar.gz
dist: clean dist: clean
@echo creating dist tarball @echo creating dist tarball
@mkdir -p dmenu-${VERSION} @mkdir -p dmenu-${VERSION}
@cp -R LICENSE Makefile README config.mk dmenu.1 config.h dmenu_path dmenu_run ${SRC} dmenu-${VERSION} @cp LICENSE Makefile README config.mk dmenu.1 draw.h dmenu_run stest.1 ${SRC} dmenu-${VERSION}
@tar -cf dmenu-${VERSION}.tar dmenu-${VERSION} @tar -cf dmenu-${VERSION}.tar dmenu-${VERSION}
@gzip dmenu-${VERSION}.tar @gzip dmenu-${VERSION}.tar
@rm -rf dmenu-${VERSION} @rm -rf dmenu-${VERSION}
install: all install: all
@echo installing executable file to ${DESTDIR}${PREFIX}/bin @echo installing executables to ${DESTDIR}${PREFIX}/bin
@mkdir -p ${DESTDIR}${PREFIX}/bin @mkdir -p ${DESTDIR}${PREFIX}/bin
@cp -f dmenu dmenu_path dmenu_run ${DESTDIR}${PREFIX}/bin @cp -f dmenu dmenu_run stest ${DESTDIR}${PREFIX}/bin
@chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu @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/dmenu_run
@echo installing manual page to ${DESTDIR}${MANPREFIX}/man1 @chmod 755 ${DESTDIR}${PREFIX}/bin/stest
@echo installing manual pages to ${DESTDIR}${MANPREFIX}/man1
@mkdir -p ${DESTDIR}${MANPREFIX}/man1 @mkdir -p ${DESTDIR}${MANPREFIX}/man1
@sed "s/VERSION/${VERSION}/g" < dmenu.1 > ${DESTDIR}${MANPREFIX}/man1/dmenu.1 @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/dmenu.1
@chmod 644 ${DESTDIR}${MANPREFIX}/man1/stest.1
uninstall: uninstall:
@echo removing executable file from ${DESTDIR}${PREFIX}/bin @echo removing executables from ${DESTDIR}${PREFIX}/bin
@rm -f ${DESTDIR}${PREFIX}/bin/dmenu ${DESTDIR}${PREFIX}/bin/dmenu_path @rm -f ${DESTDIR}${PREFIX}/bin/dmenu
@rm -f ${DESTDIR}${PREFIX}/bin/dmenu ${DESTDIR}${PREFIX}/bin/dmenu_run @rm -f ${DESTDIR}${PREFIX}/bin/dmenu_run
@rm -f ${DESTDIR}${PREFIX}/bin/stest
@echo removing manual page from ${DESTDIR}${MANPREFIX}/man1 @echo removing manual page from ${DESTDIR}${MANPREFIX}/man1
@rm -f ${DESTDIR}${MANPREFIX}/man1/dmenu.1 @rm -f ${DESTDIR}${MANPREFIX}/man1/dmenu.1
@rm -f ${DESTDIR}${MANPREFIX}/man1/stest.1
.PHONY: all options clean dist install uninstall .PHONY: all options clean dist install uninstall

6
README
View File

@ -1,6 +1,6 @@
dmenu - dynamic menu dmenu - dynamic menu
==================== ====================
dmenu is a generic and efficient menu for X. dmenu is an efficient dynamic menu for X.
Requirements Requirements
@ -13,8 +13,8 @@ Installation
Edit config.mk to match your local setup (dmenu is installed into Edit config.mk to match your local setup (dmenu is installed into
the /usr/local namespace by default). the /usr/local namespace by default).
Afterwards enter the following command to build and install dmenu (if Afterwards enter the following command to build and install dmenu
necessary as root): (if necessary as root):
make clean install make clean install

View File

@ -1,10 +0,0 @@
/* See LICENSE file for copyright and license details. */
/* appearance */
#define FONT "-*-terminus-medium-r-normal-*-14-*-*-*-*-*-*-*"
#define NORMBGCOLOR "#cccccc"
#define NORMFGCOLOR "#000000"
#define SELBGCOLOR "#0066ff"
#define SELFGCOLOR "#ffffff"
/* next macro defines the space between menu items */
#define SPACE 30 /* px */

View File

@ -1,7 +1,5 @@
# dmenu version # dmenu version
VERSION = 3.6 VERSION = 4.5
# Customize below to fit your system
# paths # paths
PREFIX = /usr/local PREFIX = /usr/local
@ -10,20 +8,19 @@ MANPREFIX = ${PREFIX}/share/man
X11INC = /usr/X11R6/include X11INC = /usr/X11R6/include
X11LIB = /usr/X11R6/lib X11LIB = /usr/X11R6/lib
# Xinerama, comment if you don't want it
XINERAMALIBS = -lXinerama
XINERAMAFLAGS = -DXINERAMA
# includes and libs # includes and libs
INCS = -I. -I/usr/include -I${X11INC} INCS = -I${X11INC}
LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS}
# flags # flags
CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\" CPPFLAGS = -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
LDFLAGS = -s ${LIBS} #CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}
#CFLAGS = -g -std=c99 -pedantic -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\" CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS}
#LDFLAGS = -g ${LIBS} LDFLAGS = -s ${LIBS}
# Solaris
#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
#LDFLAGS = ${LIBS}
#CFLAGS += -xtarget=ultra
# compiler and linker # compiler and linker
CC = cc CC = cc

213
dmenu.1
View File

@ -3,106 +3,163 @@
dmenu \- dynamic menu dmenu \- dynamic menu
.SH SYNOPSIS .SH SYNOPSIS
.B dmenu .B dmenu
.RB [ \-b ]
.RB [ \-f ]
.RB [ \-i ] .RB [ \-i ]
.RB [ \-x " <x>"] .RB [ \-l
.RB [ \-y " <y>"] .IR lines ]
.RB [ \-w " <width>"] .RB [ \-p
.RB [ \-fn " <font>"] .IR prompt ]
.RB [ \-nb " <color>"] .RB [ \-fn
.RB [ \-nf " <color>"] .IR font ]
.RB [ \-p " <prompt>"] .RB [ \-nb
.RB [ \-sb " <color>"] .IR color ]
.RB [ \-sf " <color>"] .RB [ \-nf
.IR color ]
.RB [ \-sb
.IR color ]
.RB [ \-sf
.IR color ]
.RB [ \-v ] .RB [ \-v ]
.P
.BR dmenu_run " ..."
.SH DESCRIPTION .SH DESCRIPTION
.SS Overview .B dmenu
dmenu is a generic menu for X, originally designed for is a dynamic menu for X, which reads a list of newline\-separated items from
.BR dwm (1). stdin. When the user selects an item and presses Return, their choice is printed
It manages huge amounts (up to 10.000 and more) of user defined menu items to stdout and dmenu terminates. Entering text will narrow the items to those
efficiently. matching the tokens in the input.
.SS Options .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 .TP
.B \-x .B \-b
defines the x coordinate dmenu appears at (0 by default). dmenu appears at the bottom of the screen.
.TP .TP
.B \-y .B \-f
defines the y coordinate dmenu appears at (0 by default). If it is negative, dmenu grabs the keyboard before reading stdin. This is faster, but will lock up
dmenu will appear with the bottom at the given positive coordinate. If it is X until stdin reaches end\-of\-file.
-0, dmenu appears at the screen bottom.
.TP
.B \-w
defines the width of the dmenu window (screen width by default).
.TP .TP
.B \-i .B \-i
makes dmenu match menu entries case insensitively. dmenu matches menu items case insensitively.
.TP .TP
.B \-fn <font> .BI \-l " lines"
defines the font. dmenu lists items vertically, with the given number of lines.
.TP .TP
.B \-nb <color> .BI \-p " prompt"
defines the normal background color (#RGB, #RRGGBB, and color names are supported). defines the prompt to be displayed to the left of the input field.
.TP .TP
.B \-nf <color> .BI \-fn " font"
defines the normal foreground color (#RGB, #RRGGBB, and color names are supported). defines the font or font set used.
.TP .TP
.B \-p <prompt> .BI \-nb " color"
defines a prompt to be displayed before the input area. defines the normal background color.
.IR #RGB ,
.IR #RRGGBB ,
and X color names are supported.
.TP .TP
.B \-sb <color> .BI \-nf " color"
defines the selected background color (#RGB, #RRGGBB, and color names are supported). defines the normal foreground color.
.TP .TP
.B \-sf <color> .BI \-sb " color"
defines the selected foreground color (#RGB, #RRGGBB, and color names are supported). defines the selected background color.
.TP
.BI \-sf " color"
defines the selected foreground color.
.TP .TP
.B \-v .B \-v
prints version information to standard output, then exits. prints version information to stdout, then exits.
.SH USAGE .SH USAGE
dmenu reads a list of newline-separated items from standard input and creates a dmenu is completely controlled by the keyboard. Items are selected using the
menu. When the user selects an item or enters any text and presses Return, his/her arrow keys, page up, page down, home, and end.
choice is printed to standard output and dmenu terminates.
.P
dmenu is completely controlled by the keyboard. The following keys are recognized:
.TP .TP
.B Any printable character .B Tab
Appends the character to the text in the input field. This works as a filter:
only items containing this text will be displayed.
.TP
.B Left/Right (Mod1\-h/Mod1\-l)
Select the previous/next item.
.TP
.B PageUp/PageDown (Mod1\-k/Mod1\-j)
Select the first item of the previous/next 'page' of items.
.TP
.B Home/End (Mod1\-g/Mod1\-G)
Select the first/last item.
.TP
.B Tab (Control\-i)
Copy the selected item to the input field. Copy the selected item to the input field.
.TP .TP
.B Return (Control\-j) .B Return
Confirm selection and quit (print the selected item to standard output). Returns Confirm selection. Prints the selected item to stdout and exits, returning
.B 0 success.
on termination.
.TP .TP
.B Shift\-Return (Control\-Shift\-j) .B Shift\-Return
Confirm selection and quit (print the text in the input field to standard output). Confirm input. Prints the input text to stdout and exits, returning success.
Returns
.B 0
on termination.
.TP .TP
.B Escape (Control\-bracketleft) .B Escape
Quit without selecting an item. Returns Exit without selecting an item, returning failure.
.B 1
on termination.
.TP .TP
.B Backspace (Control\-h) C\-a
Remove a character from the input field. Home
.TP .TP
.B Control\-u C\-b
Remove all characters from the input field. Left
.TP .TP
.B Control\-w C\-c
Remove all characters of current word from the input field. Escape
.TP
C\-d
Delete
.TP
C\-e
End
.TP
C\-f
Right
.TP
C\-h
Backspace
.TP
C\-i
Tab
.TP
C\-j
Return
.TP
C\-J
Shift-Return
.TP
C\-k
Delete line right
.TP
C\-m
Return
.TP
C\-n
Down
.TP
C\-p
Up
.TP
C\-u
Delete line left
.TP
C\-w
Delete word left
.TP
C\-y
Paste from primary X selection
.TP
C\-Y
Paste from X clipboard
.TP
M\-g
Home
.TP
M\-G
End
.TP
M\-h
Up
.TP
M\-j
Page down
.TP
M\-k
Page up
.TP
M\-l
Down
.SH SEE ALSO .SH SEE ALSO
.BR dwm (1), .IR dwm (1),
.BR wmii (1) . .IR stest (1)

1072
dmenu.c

File diff suppressed because it is too large Load Diff

View File

@ -1,26 +0,0 @@
#!/bin/sh
CACHE=$HOME/.dmenu_cache
IFS=:
uptodate() {
test ! -f $CACHE && return 1
for dir in $PATH
do
test $dir -nt $CACHE && return 1
done
return 0
}
if ! uptodate
then
for dir in $PATH
do
for file in "$dir"/*
do
test -x "$file" && echo "${file##*/}"
done
done | sort | uniq > $CACHE.$$
mv $CACHE.$$ $CACHE
fi
cat $CACHE

View File

@ -1,2 +1,15 @@
#!/bin/sh #!/bin/sh
exe=`dmenu_path | dmenu $*` && exec $exe cachedir=${XDG_CACHE_HOME:-"$HOME/.cache"}
if [ -d "$cachedir" ]; then
cache=$cachedir/dmenu_run
else
cache=$HOME/.dmenu_cache # if no xdg dir, fall back to dotfile in ~
fi
(
IFS=:
if stest -dqr -n "$cache" $PATH; then
stest -flx $PATH | sort -u | tee "$cache" | dmenu "$@"
else
dmenu "$@" < "$cache"
fi
) | ${SHELL:-"/bin/sh"} &

177
draw.c Normal file
View File

@ -0,0 +1,177 @@
/* See LICENSE file for copyright and license details. */
#include <locale.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <X11/Xlib.h>
#include "draw.h"
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define DEFAULTFN "fixed"
static Bool loadfont(DC *dc, const char *fontstr);
void
drawrect(DC *dc, int x, int y, unsigned int w, unsigned int h, Bool fill, unsigned long color) {
XSetForeground(dc->dpy, dc->gc, color);
if(fill)
XFillRectangle(dc->dpy, dc->canvas, dc->gc, dc->x + x, dc->y + y, w, h);
else
XDrawRectangle(dc->dpy, dc->canvas, dc->gc, dc->x + x, dc->y + y, w-1, h-1);
}
void
drawtext(DC *dc, const char *text, unsigned long col[ColLast]) {
char buf[BUFSIZ];
size_t mn, n = strlen(text);
/* shorten text if necessary */
for(mn = MIN(n, sizeof buf); textnw(dc, text, mn) + dc->font.height/2 > dc->w; mn--)
if(mn == 0)
return;
memcpy(buf, text, mn);
if(mn < n)
for(n = MAX(mn-3, 0); n < mn; buf[n++] = '.');
drawrect(dc, 0, 0, dc->w, dc->h, True, BG(dc, col));
drawtextn(dc, buf, mn, col);
}
void
drawtextn(DC *dc, const char *text, size_t n, unsigned long col[ColLast]) {
int x = dc->x + dc->font.height/2;
int y = dc->y + dc->font.ascent+1;
XSetForeground(dc->dpy, dc->gc, FG(dc, col));
if(dc->font.set)
XmbDrawString(dc->dpy, dc->canvas, dc->font.set, dc->gc, x, y, text, n);
else {
XSetFont(dc->dpy, dc->gc, dc->font.xfont->fid);
XDrawString(dc->dpy, dc->canvas, dc->gc, x, y, text, n);
}
}
void
eprintf(const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
if(fmt[0] != '\0' && fmt[strlen(fmt)-1] == ':') {
fputc(' ', stderr);
perror(NULL);
}
exit(EXIT_FAILURE);
}
void
freedc(DC *dc) {
if(dc->font.set)
XFreeFontSet(dc->dpy, dc->font.set);
if(dc->font.xfont)
XFreeFont(dc->dpy, dc->font.xfont);
if(dc->canvas)
XFreePixmap(dc->dpy, dc->canvas);
XFreeGC(dc->dpy, dc->gc);
XCloseDisplay(dc->dpy);
free(dc);
}
unsigned long
getcolor(DC *dc, const char *colstr) {
Colormap cmap = DefaultColormap(dc->dpy, DefaultScreen(dc->dpy));
XColor color;
if(!XAllocNamedColor(dc->dpy, cmap, colstr, &color, &color))
eprintf("cannot allocate color '%s'\n", colstr);
return color.pixel;
}
DC *
initdc(void) {
DC *dc;
if(!setlocale(LC_CTYPE, "") || !XSupportsLocale())
fputs("no locale support\n", stderr);
if(!(dc = calloc(1, sizeof *dc)))
eprintf("cannot malloc %u bytes:", sizeof *dc);
if(!(dc->dpy = XOpenDisplay(NULL)))
eprintf("cannot open display\n");
dc->gc = XCreateGC(dc->dpy, DefaultRootWindow(dc->dpy), 0, NULL);
XSetLineAttributes(dc->dpy, dc->gc, 1, LineSolid, CapButt, JoinMiter);
return dc;
}
void
initfont(DC *dc, const char *fontstr) {
if(!loadfont(dc, fontstr ? fontstr : DEFAULTFN)) {
if(fontstr != NULL)
fprintf(stderr, "cannot load font '%s'\n", fontstr);
if(fontstr == NULL || !loadfont(dc, DEFAULTFN))
eprintf("cannot load font '%s'\n", DEFAULTFN);
}
dc->font.height = dc->font.ascent + dc->font.descent;
}
Bool
loadfont(DC *dc, const char *fontstr) {
char *def, **missing, **names;
int i, n;
XFontStruct **xfonts;
if(!*fontstr)
return False;
if((dc->font.set = XCreateFontSet(dc->dpy, fontstr, &missing, &n, &def))) {
n = XFontsOfFontSet(dc->font.set, &xfonts, &names);
for(i = 0; i < n; i++) {
dc->font.ascent = MAX(dc->font.ascent, xfonts[i]->ascent);
dc->font.descent = MAX(dc->font.descent, xfonts[i]->descent);
dc->font.width = MAX(dc->font.width, xfonts[i]->max_bounds.width);
}
}
else if((dc->font.xfont = XLoadQueryFont(dc->dpy, fontstr))) {
dc->font.ascent = dc->font.xfont->ascent;
dc->font.descent = dc->font.xfont->descent;
dc->font.width = dc->font.xfont->max_bounds.width;
}
if(missing)
XFreeStringList(missing);
return dc->font.set || dc->font.xfont;
}
void
mapdc(DC *dc, Window win, unsigned int w, unsigned int h) {
XCopyArea(dc->dpy, dc->canvas, win, dc->gc, 0, 0, w, h, 0, 0);
}
void
resizedc(DC *dc, unsigned int w, unsigned int h) {
if(dc->canvas)
XFreePixmap(dc->dpy, dc->canvas);
dc->w = w;
dc->h = h;
dc->canvas = XCreatePixmap(dc->dpy, DefaultRootWindow(dc->dpy), w, h,
DefaultDepth(dc->dpy, DefaultScreen(dc->dpy)));
}
int
textnw(DC *dc, const char *text, size_t len) {
if(dc->font.set) {
XRectangle r;
XmbTextExtents(dc->font.set, text, len, NULL, &r);
return r.width;
}
return XTextWidth(dc->font.xfont, text, len);
}
int
textw(DC *dc, const char *text) {
return textnw(dc, text, strlen(text)) + dc->font.height;
}

35
draw.h Normal file
View File

@ -0,0 +1,35 @@
/* See LICENSE file for copyright and license details. */
#define FG(dc, col) ((col)[(dc)->invert ? ColBG : ColFG])
#define BG(dc, col) ((col)[(dc)->invert ? ColFG : ColBG])
enum { ColBG, ColFG, ColBorder, ColLast };
typedef struct {
int x, y, w, h;
Bool invert;
Display *dpy;
GC gc;
Pixmap canvas;
struct {
int ascent;
int descent;
int height;
int width;
XFontSet set;
XFontStruct *xfont;
} font;
} DC; /* draw context */
void drawrect(DC *dc, int x, int y, unsigned int w, unsigned int h, Bool fill, unsigned long color);
void drawtext(DC *dc, const char *text, unsigned long col[ColLast]);
void drawtextn(DC *dc, const char *text, size_t n, unsigned long col[ColLast]);
void eprintf(const char *fmt, ...);
void freedc(DC *dc);
unsigned long getcolor(DC *dc, const char *colstr);
DC *initdc(void);
void initfont(DC *dc, const char *fontstr);
void mapdc(DC *dc, Window win, unsigned int w, unsigned int h);
void resizedc(DC *dc, unsigned int w, unsigned int h);
int textnw(DC *dc, const char *text, size_t len);
int textw(DC *dc, const char *text);

87
stest.1 Normal file
View File

@ -0,0 +1,87 @@
.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 \-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)

84
stest.c Normal file
View File

@ -0,0 +1,84 @@
/* See LICENSE file for copyright and license details. */
#include <dirent.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#define FLAG(x) (flag[(x)-'a'])
static void test(const char *, const char *);
static bool match = false;
static bool flag[26];
static struct stat old, new;
int
main(int argc, char *argv[]) {
struct dirent *d;
char buf[BUFSIZ], *p;
DIR *dir;
int opt;
while((opt = getopt(argc, argv, "abcdefghln:o:pqrsuwx")) != -1)
switch(opt) {
case 'n': /* newer than file */
case 'o': /* older than file */
if(!(FLAG(opt) = !stat(optarg, (opt == 'n' ? &new : &old))))
perror(optarg);
break;
default: /* miscellaneous operators */
FLAG(opt) = true;
break;
case '?': /* error: unknown flag */
fprintf(stderr, "usage: %s [-abcdefghlpqrsuwx] [-n file] [-o file] [file...]\n", argv[0]);
exit(2);
}
if(optind == argc)
while(fgets(buf, sizeof buf, stdin)) {
if((p = strchr(buf, '\n')))
*p = '\0';
test(buf, buf);
}
for(; optind < argc; optind++)
if(FLAG('l') && (dir = opendir(argv[optind]))) {
/* test directory contents */
while((d = readdir(dir)))
if(snprintf(buf, sizeof buf, "%s/%s", argv[optind], d->d_name) < sizeof buf)
test(buf, d->d_name);
closedir(dir);
}
else
test(argv[optind], argv[optind]);
return match ? 0 : 1;
}
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)) { /* executable */
if(FLAG('q'))
exit(0);
match = true;
puts(name);
}
}