Compare commits

...

376 Commits
0.1 ... 4.2

Author SHA1 Message Date
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
1538bb7426 fix typo 2008-03-25 19:18:16 +01:00
cbe5e88e4f using limits.h 2008-03-25 10:18:17 +00:00
2fe3ccdf58 bugfix of the -0 case in dmenu (thanks to Sander for his hint) 2008-03-25 09:43:34 +00:00
07d82c0c2a applied Jukkas hotfix 2008-03-24 15:56:41 +00:00
e7423f8fc6 more cosmetics 2008-03-23 22:06:09 +01:00
61976c292b cosmetics 2008-03-23 21:17:35 +01:00
63c9e30a76 made some whitespacing consistent. 2008-03-23 21:11:42 +01:00
015f51ac46 removed unused variable nitem. 2008-03-23 12:09:29 +01:00
542c58d8d0 several performance tweaks 2008-03-22 14:52:00 +00:00
745c46d8fa fixed match() to prefer prefix-matches to strstr-matches in the match list, extended the -y handling, next version is 3.6 2008-03-18 16:52:51 +00:00
d058e83570 Added tag 3.5 for changeset 05e5bd706b3b 2008-03-13 16:53:25 +00:00
301b4e5591 applied next patch of Sander 2008-03-13 12:02:29 +00:00
38b866ba34 applied Sanders patch 2008-03-12 21:37:43 +00:00
540a78761b removed ido-matching, changed behavior of -i meaning case insensitive matching now, commented -x, -y, -w arguments in dmenu.1 2008-03-12 15:41:19 +00:00
7804354106 removed set 2008-02-12 09:42:48 +00:00
6d8e68dcfd updated 2008-02-11 11:22:38 +00:00
d8688f7a4f added dmenu run 2007-12-22 12:20:20 +00:00
09d0926bb9 Added tag 3.4 for changeset 9ab649b3b3e5 2007-10-25 20:26:17 +02:00
adc4ec02c0 adapted c99 for pedantic checks, even if those checks are somewhat broken 2007-10-10 18:57:51 +02:00
8b2f132973 implemented strcasestr for dmenu (I call it cistrstr) for portability issues (cygwin has no strcasestr, oh dear) 2007-10-01 15:28:42 +02:00
1c488e6dac fixed font definition 2007-10-01 11:44:25 +02:00
03c546c6b3 fixed dmenu 2007-09-30 19:20:31 +02:00
fdc1dba7ce using saner defaults 2007-09-30 12:47:40 +02:00
3439470a47 applied new color nuance 2007-09-27 18:55:05 +02:00
6674bac1d3 applied my favorite color scheme 2007-09-26 19:15:47 +02:00
72a8eb412f casting char to int when using tolower (thanks to Jukkas careful cosmetic checking!) 2007-09-24 15:04:31 +02:00
975dfb4163 switching to white 2007-09-23 18:49:24 +02:00
2e898a308f yet another cosmetic fix 2007-09-23 18:32:08 +02:00
6514b07ad2 small cosmetic fix 2007-09-23 18:31:19 +02:00
724fe3cf7f applied Michał Janeczek dmenu patch, made dmenu match case-insensitive by default, added -i command line option to enable ido matching, added Michał to Copyright holders 2007-09-23 18:26:41 +02:00
70cb32b021 Added tag 3.3 for changeset 709df5a4bad7 2007-09-22 09:12:50 +02:00
56f9e26b72 applied yiyus initfont fix 2007-09-19 17:33:35 +02:00
d094ebea96 reorganized 2007-09-17 20:53:14 +02:00
ccf4d7166f next version is 3.3 2007-09-17 09:13:21 +02:00
06ae894434 micromizing dmenu step 1 2007-09-16 20:14:09 +02:00
b97783b07f fixed fallback 2007-09-15 20:28:20 +02:00
11cb2e7dcc applied ido-matching to dmenu 2007-07-24 18:19:09 +02:00
07239bbddd foooooo 2007-06-01 12:28:30 +02:00
124bfd4a08 Added tag 3.2 for changeset e4c81a78ffba 2007-05-30 12:22:38 +02:00
d27e3c1092 referred to LICENSE file 2007-05-30 12:19:06 +02:00
3a9f3a51ce I agree with the race fix of JG, but I dislike the SUSV3-breaking find, and I don't care about PATH changes, keep it simple, stupid 2007-05-24 10:34:44 +02:00
53e92b5c17 Fix the uptodate logic (uptodate if !find newer dirs than the cache). 2007-05-23 19:38:23 -04:00
d50ff5ca11 Silence the first find in dmenu_path. 2007-05-23 18:35:05 -04:00
383e40dc21 Fix grouping in dmenu_path. 2007-05-23 16:59:38 -04:00
8369e1736b Merge. 2007-05-23 16:44:15 -04:00
c04b688cc0 Changed dmenu_path (fixed race, improved speed, check that $PATH is the same as the last run). 2007-05-23 16:42:51 -04:00
4ebd7c4a21 removed some superflous strncmp's 2007-05-23 22:32:43 +02:00
dfe95cb546 made dmenu_path the way anydot proposed in response to Jukka 2007-05-23 22:13:46 +02:00
8b633bf17d applied Jukka's fix 2007-05-23 13:22:27 +02:00
64697cdd0c Added tag 3.1 for changeset 8f0f917ac988 2007-05-21 14:36:03 +02:00
5a3dfb1c40 removed strip, added -s to LDFLAGs 2007-05-15 13:44:41 +02:00
4042a11e51 applied anydot's dmenu_path caching patch, thank you! 2007-05-14 11:56:41 +02:00
aa2f73fc88 fixed a small bug in dmenu when an empty font is supplied 2007-05-02 15:25:52 +02:00
f189781bbd Added tag 3.0 for changeset 59b3024854db 2007-04-19 09:27:08 +02:00
0e19146d5f making copyright notice more compact 2007-04-13 11:36:44 +02:00
85a151c6a4 next version is 2.9 2007-03-28 08:17:57 +02:00
1fa4fa386a allowing numpad keys as inpyt 2007-03-27 16:52:50 +02:00
e1515a2fdc Added tag 2.8 for changeset dd3d02b07cac 2007-03-07 13:30:57 +01:00
f555908cef attempt to grab the keyboard only 1000 times, not forever. 2007-03-07 11:01:14 +01:00
73120414e2 reverting keyboard grab to root window - invoking several dmenu's now works again... 2007-03-07 10:54:21 +01:00
9911455f5b Wait for an Expose and draw the menu immediately after mapping the window. 2007-03-06 03:24:40 -05:00
2772c51e79 Added tag 2.7 for changeset fbd9e9d63f20 2007-03-05 11:25:18 +01:00
d57c873f10 keyboard grab works on the dmenu window now (not on the root window) - thx for Kris for this hint 2007-03-02 21:48:48 +01:00
724f72142f also, don't set the font all the time 2007-03-02 15:16:36 +01:00
5b8dce15d3 Added tag 2.6 for changeset 775f761a5647 2007-03-01 15:47:54 +01:00
063c3d26e9 useless var declaration prev_nitem 2007-02-27 14:44:21 +01:00
03c2b05bb2 changed Backspace/C-w behavior (now it only removes a single character) 2007-02-26 14:07:19 +01:00
8a066fabd9 if isatty() first read from stdin and then grab the keyboard, otherwise first grab the keyboard and then read from stdin 2007-02-26 11:44:41 +01:00
6c0e05eb0d next is 2.6, but not yet ;) 2007-02-26 10:47:52 +01:00
900d34347b Escape -s in dmenu.1 2007-02-25 16:41:05 -05:00
4d0cc17794 Added tag 2.5 for changeset 041143e9fc54 2007-02-24 15:38:26 +01:00
28b6ea0f67 I also dislike sort -u, I support that each Unix tool does one job and does it right ;) 2007-02-24 15:38:10 +01:00
598d72fba9 removed superfluous externs as well 2007-02-24 14:07:40 +01:00
007be12f2b using the old-style fashion we uses earlier 2007-02-23 15:28:25 +01:00
6b5b580aff fixed a bug when dmenu is run with -v 2007-02-23 14:39:54 +01:00
d8b48d64e1 Added tag 2.4.2 for changeset 1ca5d430524e 2007-02-23 13:51:23 +01:00
a71424ac0e ok 2.4.2 2007-02-23 13:51:06 +01:00
f1ab687c62 Added tag 2.4.1 for changeset 03e83e2788c8 2007-02-23 13:28:43 +01:00
68a24f5535 hotfix 2007-02-23 13:28:38 +01:00
47b37834c4 Added tag 2.4 for changeset 9e9036cbfb4b 2007-02-23 10:42:00 +01:00
5f436fdcb7 added dmenu_path convenience script 2007-02-23 10:16:43 +01:00
de34639883 made Fnt an anonymous struct 2007-02-22 18:16:35 +01:00
18592825d2 Added tag 2.3 for changeset b6e09682c8adcb6569656bee73c311f9ab457715 2007-02-21 11:05:19 +01:00
3bc1f99e3c applied the fix inspired by a recent wmii commit 2007-02-21 10:59:36 +01:00
8a10b35c64 renamed getcolor to initcolor 2007-02-20 13:57:05 +01:00
e4fc905317 s/setfont/initfont/ 2007-02-20 13:54:37 +01:00
a1913a6af7 readded draw.c again (except getcolor and setfont) 2007-02-20 13:54:00 +01:00
66b2e8379f removed -t, now using isatty() instead of select() to prevent execution from an interactive shell 2007-02-19 21:18:36 +01:00
665488a6ee removed draw.c, implemented C-w handling (backward word deletion) 2007-02-19 15:49:50 +01:00
1e01ca0317 Added tag 2.2 for changeset 90f0e34e7f11 2007-02-14 09:42:02 +01:00
f3c12a7bff fixed Copyright notice in Makefile 2007-02-08 14:10:17 +01:00
3ba8b71aba nah nah nah, I can't get used to the bottom bar, pushing the conditional dmenu again 2007-02-08 11:17:11 +01:00
2bac5599b3 letting dmenu appear at the bottom by default 2007-02-08 11:10:29 +01:00
dbccf6fbff got rid of LD, inspired by JGs patch to wmii 2007-02-05 11:10:41 +01:00
aea9bfec5e Added tag 2.1 for changeset 7656557298c9 2007-01-17 11:10:31 +01:00
6175a39e8e hotfix changes 2007-01-17 11:10:26 +01:00
2c7ff85f24 Added tag 2.1 for changeset d91c79020430 2007-01-17 11:10:09 +01:00
447046f7ae Added tag 2.0 for changeset 1fce5c464fcd 2007-01-16 11:42:09 +01:00
b76632b9e3 small fix 2007-01-16 11:39:26 +01:00
f8f5b27036 removed useless mx, my 2007-01-16 11:38:31 +01:00
d6bf35caad applied new default colors 2007-01-16 11:24:51 +01:00
507c030b5b small fix of Control-j in dmenu.1 2007-01-16 11:07:30 +01:00
0245394e4d Added tag 1.9 for changeset c7f5f4d54317 2007-01-12 12:43:44 +01:00
b6cd6ed266 added evil key support to dmenu 2007-01-11 15:52:37 +01:00
09813fcf2c s/Mod1-Shift-g/Mod1-G/ in fact Sander is right 2007-01-11 13:51:15 +01:00
64d68b7de9 documenting undocumented vi-alike shortcuts of dmenu 2007-01-11 11:41:16 +01:00
eaf8909378 commented recent Control-shortcut additions 2007-01-11 10:17:01 +01:00
c0fcfb7827 applied Sanders dmenu_ctrlchars.patch (thanks!) 2007-01-10 23:07:03 +01:00
a45d6983ab applied Alexis Hildebrandts patches 2007-01-10 18:06:16 +01:00
08420a935b corrections 2007-01-02 15:44:32 +01:00
deea1fb5ab corrected 2007-01-02 15:41:13 +01:00
771c0cb607 next version will contain updated copyright notice 2007-01-02 15:38:44 +01:00
43a19425af Added tag 1.8 for changeset d3e6fa22ae45b38b1bdb0d813390365e5930360b 2006-12-19 11:49:38 +01:00
bbfd5391ac fixed a typo in dmenu.1 2006-12-19 11:49:28 +01:00
0e96ae6f48 prepared dmenu-1.8, shortened command line options (-font is -fn, -selbg is -sb, -selfg is -sf, -normbg is -nb, -normfg is -nf now) 2006-12-19 11:39:07 +01:00
989649b5a5 added wmii reference to dmenu(1) 2006-12-18 13:46:44 +01:00
f8d2a29a20 agreed with Sander 2006-12-18 13:25:11 +01:00
3438af001a applied Stefan Tibus' sun patch, added -bottom option to dmenu which makes it appear in the bottom (for wmii compliance), slightly modified version than the patch proposed by Stefan Tibus 2006-12-18 12:52:58 +01:00
201b056e39 hotfix 2006-12-14 14:41:53 +01:00
3dcdbe2a57 added vi-like key-bindings for keyboards without cursor keys (they are undocumented features) 2006-12-14 14:40:58 +01:00
5336608a86 Added tag 1.7.1 for changeset 3696d77aaf02f5d15728dde3b9e35abcaf291496 2006-12-14 09:45:11 +01:00
d398a2e318 foo 2006-12-14 09:45:06 +01:00
2829009138 silent hotfix 2006-12-14 09:34:24 +01:00
cae2fbdf38 Added tag 1.7.1 for changeset 8e0b9b09bf83c429c73e60a23997f32877a645bf 2006-12-14 09:30:31 +01:00
225cd764c3 applied hotfix of sander 2006-12-14 09:30:23 +01:00
279966a16f Added tag 1.7 for changeset 58dbef4aef3d45c7a3da6945e53c9667c0f02d5b 2006-12-14 08:51:21 +01:00
9bd80b3968 changed text in dmenu manpage 2006-12-13 14:36:09 +01:00
65912f2a96 added prompt option (-p 'prompt text'), documented in man page as well 2006-12-13 14:14:41 +01:00
4bd3466215 ordered switch branches in kpress alphabetically, applied Sanders patch for PgUp/Dn and Home/End scrolling 2006-12-12 09:57:42 +01:00
e19e42adbb fixed diagnostic error message 2006-12-08 11:12:11 +01:00
796c4fb9e5 removed hardcoded 'fixed' fallback, useless and misleading 2006-12-08 10:41:16 +01:00
93c3f930c5 Added tag 1.6 for changeset dcc5427f99f51a978386a0dd770467cd911ac84b 2006-12-07 14:54:47 +01:00
c69f397bb9 found compromise 2006-12-07 14:38:31 +01:00
b9fbd59c8a people should define fixed being compatible with their locale 2006-12-07 12:03:47 +01:00
da2b90ddd1 using -*-fixed-*-*-*-*-*-*-*-*-*-*-iso10646-* fixed by default 2006-12-07 11:55:46 +01:00
dd7ee0dae1 also fixing dmenu accordingly 2006-12-07 10:06:06 +01:00
250aa199bb only setting LC_CTYPE 2006-12-05 13:30:37 +01:00
5d43e9243c enforcing using imcomplete fonsets anyways 2006-12-05 10:31:20 +01:00
1026eb8308 Added tag 1.5 for changeset e071fb045bd9e8574947acff7196360bc0270e68 2006-11-30 09:21:14 +01:00
c65fdd6252 next version will be 1.5 2006-11-26 15:49:47 +01:00
8c20e5dbd3 fixing sizeof stuff 2006-11-26 15:49:33 +01:00
26fbf124fa Added tag 1.4 for changeset df3fbb050004c544d14e43c36f6a94cca6ed4a69 2006-10-26 12:14:03 +02:00
194d890517 removed misleading input cursor 2006-10-23 12:53:35 +02:00
f633276774 fixing arg handling in dmenu (thanks to Sander for his report) 2006-10-23 10:12:09 +02:00
bb480fb4b0 Added tag 1.3 for changeset 2eb9997be51cb1b11a8900728ccc0904f9371157 2006-10-13 11:08:35 +02:00
95b19f75cc changing order 2006-10-12 12:59:37 +02:00
3d25a327aa simplified util.c 2006-10-12 12:58:34 +02:00
d78bcf247f simplified main event loop 2006-10-10 19:15:06 +02:00
afaf66dc99 Added tag 1.2 for changeset bee7fe6d1189174d0204ca3195b83cdc1bb4f82e 2006-10-06 13:44:22 +02:00
63be0ee22a small change 2006-10-06 12:40:49 +02:00
ca973eb64e changing version info 2006-10-06 12:39:06 +02:00
5fd7af18c6 removed useless newlines 2006-10-06 11:52:57 +02:00
02238725f6 small update to man page (backported) 2006-09-26 17:51:22 +02:00
2d5afd7c01 Added tag 1.1 for changeset e8c1e9733752db12f2dbd1fa93c46f5806242ba9 2006-09-26 17:39:04 +02:00
f7615e220e updated README 2006-09-26 14:31:42 +02:00
e7ecae0d58 removed crap from Makefile 2006-09-26 14:30:48 +02:00
b661ca75de error handling 2006-09-26 13:45:41 +02:00
c02da9f87e foo 2006-09-26 13:41:51 +02:00
14133be5bd reverting 2006-09-26 13:39:00 +02:00
3b590beda2 added fallback to color initialization 2006-09-26 13:37:36 +02:00
5c0d28e4ff removed config.h stuff, made dwm configurable due to command line options 2006-09-26 13:20:47 +02:00
e0fe9f2fca uriel didn't understood dmenu code, he broke nearly everything 2006-09-26 08:47:10 +02:00
c9465859a6 applied a change made by Uriel to dmenu (though I didn't applied everything) 2006-09-26 08:43:41 +02:00
1716159e05 applied something similiar to Jukkas patch 2006-09-25 08:29:20 +02:00
11b6401668 Added tag 1.0 for changeset 9e11140d4cc3eecac3b0ab752f91528fd5e04be8 2006-09-16 11:20:54 +02:00
81bcf078f6 made function signatures more consistent to my coding style 2006-09-12 10:59:00 +02:00
0e5f467aa8 commented dmenu 2006-09-11 13:18:09 +02:00
c51406b279 Added tag 0.9 for changeset d046c818ea467555cc338751c9bf3024609f1f12 2006-09-08 08:31:19 +02:00
32f7fe4835 implemented early keyboard grab for dmenu with a timeout for stdin data writers to prevent endless grabbings of the keyboard 2006-09-08 07:33:20 +02:00
0fa5a339ff new version of dmenu 2006-09-07 19:12:04 +02:00
358f078c0b another fix 2006-09-07 09:40:09 +02:00
1f207893e6 made dmenu.1 also concise 2006-09-07 09:36:53 +02:00
1c5be1c553 Added tag 0.8 for changeset 409667a57221f7e50ba8b5248f638915cd61b366 2006-09-06 10:53:15 +02:00
32ea45084b fixed man page 2006-09-04 19:47:09 +02:00
cc7d863b6e Added tag 0.7 for changeset 5fc20d7158bd16b4d5f8d1c25e177680b6d54252 2006-09-04 17:17:08 +02:00
04eade6a76 small change of main event loop 2006-09-04 07:28:03 +02:00
49ce444d32 updated version 2006-08-28 12:26:25 +02:00
2e9515ee27 Added tag 0.6 for changeset 25f679fb19686140a907684ffcb423b9e9d44b53 2006-08-28 10:20:10 +02:00
d4a4cc1ab8 updated man page 2006-08-28 07:22:38 +02:00
11bda99968 fixed 2006-08-25 18:15:24 +02:00
82b0bc83f8 switching back to a dark color scheme with larger font 2006-08-25 18:03:30 +02:00
bd1172e689 small color fixes 2006-08-25 17:44:40 +02:00
13ef97e65e updated dmenu to borderless drawing as well 2006-08-25 14:45:17 +02:00
65be999a3f back to 3 colors 2006-08-25 07:54:20 +02:00
37faefb1aa removed useless call 2006-08-24 12:04:41 +02:00
18ec376aa9 fixed minor bug 2006-08-24 12:03:40 +02:00
6c1e46654d small color change 2006-08-24 11:57:58 +02:00
e980c7ff18 migrated dmenu to use 4 instead of 3 colors 2006-08-24 11:47:08 +02:00
7848b53dc3 Added tag 0.5 for changeset 4a0ecd881c4fc15de4a0bebd79308b064be020ef 2006-08-24 10:22:51 +02:00
865c938856 prepared dmenu-0.5 2006-08-24 10:22:30 +02:00
30d72e5f87 removed unnecessary Xlib call 2006-08-24 09:27:01 +02:00
0ffd139f2c sanitizing my colorscheme 2006-08-23 19:05:20 +02:00
86512ce930 back to terminus font 2006-08-23 18:55:48 +02:00
d3206194c1 font fix 2006-08-22 10:01:45 +02:00
8148b515a1 fixed 2006-08-22 09:49:56 +02:00
35210e3998 applied OpenBSD changes.. 2006-08-21 17:45:46 +02:00
df85dd743c renamed bad_malloc into badmalloc as well 2006-08-21 07:34:16 +02:00
d9f6fa426b small changes in dmenu.1 2006-08-21 07:31:33 +02:00
bbb2cc2a72 fixed a typo in config.mk, fixed cleanup code in dmenu (now frees all allocated stuff) 2006-08-16 19:25:04 +02:00
02ddc93c94 applied sanders patch 2006-08-16 12:37:01 +02:00
0faf441367 applied sanders Makefile patch 2006-08-16 08:57:10 +02:00
be6b534520 fixed the same issue in dmenu 2006-08-15 16:56:55 +02:00
db76b0f9a5 Added tag 0.4 for changeset 7acf0dde1120542917bae12e0e42293f9d2cc899 2006-08-15 10:39:26 +02:00
26fc52fcf6 removed finished message 2006-08-14 16:11:38 +02:00
6a26e97f74 fixed string cutting 2006-08-14 10:56:57 +02:00
0e21ef5f37 fixed string cutting 2006-08-14 08:52:28 +02:00
2f3068fb77 added comment 2006-08-14 08:44:54 +02:00
b7f8911455 applied Sanders LD patch 2006-08-14 08:42:23 +02:00
35a06ccd2e applied my new color scheme 2006-08-11 18:12:07 +02:00
67649463c8 simplified drawborder 2006-08-11 11:52:34 +02:00
d1415ea497 Added tag 0.3 for changeset d352e9dc112ee96aa5cad961a0ed880ae9ce7276 2006-08-10 15:19:03 +02:00
c6113a3b27 readded border colors, this sucks least 2006-08-10 11:13:21 +02:00
dd902868df drawing border around sel item 2006-08-10 11:07:06 +02:00
4318bf2905 removed unnecessary border color 2006-08-10 10:28:58 +02:00
25f71b3829 swapping my default colors 2006-08-10 10:21:50 +02:00
0af369ba65 added uppercase chars for C-u and C-h as well 2006-08-10 10:10:32 +02:00
e4fbc43253 removed C-[ from source and man page 2006-08-10 10:09:44 +02:00
66f2a93eaa removed control sequences which actually aren't implemented anymore (only the real unix control sequences are implemented) 2006-08-09 18:45:32 +02:00
a381b3a819 fixes to README 2006-08-08 17:14:35 +02:00
2a4b146fc4 default colors are best 2006-08-08 12:47:58 +02:00
84d7f7bccf noborder 2006-08-08 11:47:58 +02:00
00dce8cc39 dito 2006-08-08 11:18:23 +02:00
170b977288 using a better colorscheme 2006-08-08 11:07:12 +02:00
366b2afd6c removed unnecessary typedef 2006-08-07 17:17:27 +02:00
4e009770d6 made dmenu(1) more dwm(1) alike 2006-08-07 14:07:04 +02:00
b24aa8312b font size changed as well 2006-08-07 12:21:31 +02:00
5146c3f27f appliead Sanders manpage/Makefile pacth 2006-08-07 11:58:23 +02:00
6a332a043a fixed dmenu.1 version info 2006-08-07 11:11:17 +02:00
9d574f5ebe settle with grey 2006-08-07 11:10:05 +02:00
1fb8a6b898 next version is 0.3 2006-08-07 10:32:18 +02:00
7fb4c2b818 also made my colors tasting better with my overall colorscheme 2006-08-07 10:28:42 +02:00
f3a60b583f next attempt for bright background switch 2006-08-07 09:40:28 +02:00
48e2ce8709 Added tag 0.2 for changeset 656be0f47df545dfdd2e1e0663663b8b1b26f031 2006-08-07 08:52:37 +02:00
4c7866ec55 added stripping to dmenu target 2006-08-07 08:45:47 +02:00
fe94aeb468 fixed a bad mistake setting the dmenu border to False; 2006-08-07 08:40:26 +02:00
d32fd15ea4 renamed some functions to make it more readable 2006-08-07 07:39:31 +02:00
bb393554fd updated man page 2006-08-07 07:37:32 +02:00
38bc664ef6 updated man page 2006-08-07 07:36:18 +02:00
ee03052e73 removed -t title crap from dmenu 2006-08-07 07:30:13 +02:00
62a7d40746 menu now also uses -Os 2006-08-05 14:57:51 +02:00
2535072fd8 small change 2006-08-05 14:05:04 +02:00
d8d17f369e yet another fix 2006-08-04 17:17:03 +02:00
f1495a11b6 fixed README of dmenu 2006-08-04 17:15:07 +02:00
84b56075f4 fixed dist target 2006-08-04 10:34:44 +02:00
7aae7fac9c removed config.h 2006-08-04 10:32:15 +02:00
b862ed5a54 Added tag 0.1 for changeset fcc8a282cb52c6a9343b461026b386825590cd31 2006-08-04 10:31:51 +02:00
17 changed files with 1033 additions and 794 deletions

44
.hgtags Normal file
View File

@ -0,0 +1,44 @@
fcc8a282cb52c6a9343b461026b386825590cd31 0.1
656be0f47df545dfdd2e1e0663663b8b1b26f031 0.2
d352e9dc112ee96aa5cad961a0ed880ae9ce7276 0.3
7acf0dde1120542917bae12e0e42293f9d2cc899 0.4
4a0ecd881c4fc15de4a0bebd79308b064be020ef 0.5
25f679fb19686140a907684ffcb423b9e9d44b53 0.6
5fc20d7158bd16b4d5f8d1c25e177680b6d54252 0.7
409667a57221f7e50ba8b5248f638915cd61b366 0.8
d046c818ea467555cc338751c9bf3024609f1f12 0.9
9e11140d4cc3eecac3b0ab752f91528fd5e04be8 1.0
e8c1e9733752db12f2dbd1fa93c46f5806242ba9 1.1
bee7fe6d1189174d0204ca3195b83cdc1bb4f82e 1.2
2eb9997be51cb1b11a8900728ccc0904f9371157 1.3
df3fbb050004c544d14e43c36f6a94cca6ed4a69 1.4
e071fb045bd9e8574947acff7196360bc0270e68 1.5
dcc5427f99f51a978386a0dd770467cd911ac84b 1.6
58dbef4aef3d45c7a3da6945e53c9667c0f02d5b 1.7
3696d77aaf02f5d15728dde3b9e35abcaf291496 1.7.1
d3e6fa22ae45b38b1bdb0d813390365e5930360b 1.8
c7f5f4d543170f03d70468e98a3a0ec8d2c4161b 1.9
1fce5c464fcd870b9f024aa1853d5cf3a3eb371b 2.0
7656557298c954469a6a9564e6649b1fb5db663e 2.1
90f0e34e7f118c9ad3227a1606211ee825942b1c 2.2
b6e09682c8adcb6569656bee73c311f9ab457715 2.3
9e9036cbfb4b7306c6fb366249e81dc0e65bdfde 2.4
03e83e2788c83ddd63b45a667939d7ec783c98cb 2.4.1
1ca5d430524e838c52ede912533cb90108c5cd66 2.4.2
041143e9fc544c62edc58af52cae9ac5237e5945 2.5
775f761a5647a05038e091d1c99fc35d3034cd68 2.6
fbd9e9d63f202afe6834ccfdf890904f1897ec0b 2.7
dd3d02b07cac44fbafc074a361c1002cebe7aae4 2.8
59b3024854db49739c6d237fa9077f04a2da847a 3.0
8f0f917ac988164e1b4446236e3a6ab6cfcb8c67 3.1
e4c81a78ffbad6ba4d1ad119cc654da6eca63a4c 3.2
709df5a4bad7015a346b2b44b1b3b573ea3088ff 3.3
9ab649b3b3e5bfccf1c8f352c59e5361e070a25f 3.4
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

View File

@ -1,7 +1,12 @@
MIT/X Consortium License MIT/X Consortium License
(C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com> © 2010 Connor Lane Smith <cls@lubutu.com>
(C)opyright MMVI Sander van Dijk <a dot h dot vandijk at gmail dot com> © 2006-2010 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-2007 Michał Janeczek <janeczek at gmail dot com>
Permission is hereby granted, free of charge, to any person obtaining a 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"),

View File

@ -1,13 +1,9 @@
# dmenu - dynamic menu # dmenu - dynamic menu
# (C)opyright MMVI Anselm R. Garbe # See LICENSE file for copyright and license details.
include config.mk include config.mk
SRC = draw.c main.c util.c all: options dmenu dmenu_path
OBJ = ${SRC:.c=.o}
all: options dmenu
@echo finished
options: options:
@echo dmenu build options: @echo dmenu build options:
@ -15,46 +11,46 @@ options:
@echo "LDFLAGS = ${LDFLAGS}" @echo "LDFLAGS = ${LDFLAGS}"
@echo "CC = ${CC}" @echo "CC = ${CC}"
.c.o: dmenu: dmenu.o draw.o
@echo CC $< dmenu_path: dmenu_path.o
@${CC} -c ${CFLAGS} $<
${OBJ}: dmenu.h config.h .c.o: config.mk
@echo CC -c $<
@${CC} -c $< ${CFLAGS}
config.h: dmenu dmenu_path:
@echo creating $@ from config.default.h @echo CC -o $@
@cp config.default.h $@ @${CC} -o $@ $+ ${LDFLAGS}
dmenu: ${OBJ}
@echo LD $@
@${CC} -o $@ ${OBJ} ${LDFLAGS}
clean: clean:
@echo cleaning @echo cleaning
@rm -f dmenu ${OBJ} dmenu-${VERSION}.tar.gz @rm -f dmenu dmenu.o draw.o dmenu_path dmenu_path.o 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 \ @cp LICENSE Makefile README config.mk dmenu.1 dmenu.c dmenu_path.c dmenu_run dmenu-${VERSION}
dmenu.1 dmenu.h ${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 ${DESTDIR}${PREFIX}/bin @cp -f dmenu dmenu_path dmenu_run ${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
@echo installing manual page to ${DESTDIR}${MANPREFIX}/man1 @echo installing manual page to ${DESTDIR}${MANPREFIX}/man1
@mkdir -p ${DESTDIR}${MANPREFIX}/man1 @mkdir -p ${DESTDIR}${MANPREFIX}/man1
@cp -f dmenu.1 ${DESTDIR}${MANPREFIX}/man1 @sed "s/VERSION/${VERSION}/g" < dmenu.1 > ${DESTDIR}${MANPREFIX}/man1/dmenu.1
@chmod 644 ${DESTDIR}${MANPREFIX}/man1/dmenu.1 @chmod 644 ${DESTDIR}${MANPREFIX}/man1/dmenu.1
uninstall: uninstall:
@echo removing executable file from ${DESTDIR}${PREFIX}/bin @echo removing executables from ${DESTDIR}${PREFIX}/bin
@rm -f ${DESTDIR}${PREFIX}/bin/dmenu @rm -f ${DESTDIR}${PREFIX}/bin/dmenu
@rm -f ${DESTDIR}${PREFIX}/bin/dmenu_path
@rm -f ${DESTDIR}${PREFIX}/bin/dmenu_run
@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

42
README
View File

@ -1,48 +1,24 @@
dwm - dynamic window manager dmenu - dynamic menu
---------------------------- ====================
dwm is an extremely fast, small, and dynamic X11 window manager. dmenu is an efficient dynamic menu for X.
Requirements Requirements
------------ ------------
In order to build dwm you need the Xlib header files. In order to build dmenu you need the Xlib header files.
Installation Installation
------------ ------------
Edit config.mk to match your local setup (dwm 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 dwm (if Afterwards enter the following command to build and install dmenu
necessary as root): (if necessary as root):
make clean install make clean install
Running dwm Running dmenu
-----------
Add the following line to your .xinitrc to start dwm using startx:
exec dwm
In order to connect dwm to a specific display, make sure that
the DISPLAY environment variable is set correctly, e.g.:
DISPLAY=foo.bar:1 exec dwm
(This will start dwm on display :1 of the host foo.bar.)
In order to display status info in the bar, you can do something
like this in your .xinitrc:
while true
do
echo `date` `uptime | sed 's/.*://; s/,//g'`
sleep 1
done | dwm
Configuration
------------- -------------
The configuration of dwm is done by creating a custom config.h See the man page for details.
and (re)compiling the source code.

View File

@ -1,9 +0,0 @@
/*
* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#define FONT "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*"
#define BGCOLOR "#0a2c2d"
#define FGCOLOR "#ddeeee"
#define BORDERCOLOR "#176164"

View File

@ -1,9 +0,0 @@
/*
* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#define FONT "fixed"
#define BGCOLOR "#666699"
#define FGCOLOR "#eeeeee"
#define BORDERCOLOR "#9999CC"

View File

@ -1,9 +0,0 @@
/*
* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#define FONT "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*"
#define BGCOLOR "#0a2c2d"
#define FGCOLOR "#ddeeee"
#define BORDERCOLOR "#176164"

View File

@ -1,5 +1,5 @@
# dmenu version # dmenu version
VERSION = 0.1 VERSION = 4.2
# Customize below to fit your system # Customize below to fit your system
@ -10,15 +10,18 @@ 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/usr/lib -I${X11INC} INCS = -I${X11INC}
LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS}
# flags # flags
CFLAGS = -O3 ${INCS} -DVERSION=\"${VERSION}\" CPPFLAGS = -D_BSD_SOURCE -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
LDFLAGS = ${LIBS} CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS}
#CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\" LDFLAGS = -s ${LIBS}
#LDFLAGS = -g ${LIBS}
# compiler # compiler and linker
CC = cc CC = cc

146
dmenu.1
View File

@ -1,68 +1,104 @@
.TH DMENU 1 d-0.0 .TH DMENU 1 dmenu\-VERSION
.SH NAME .SH NAME
dmenu \- dynamic menu dmenu \- dynamic menu
.SH SYNOPSIS .SH SYNOPSIS
.B dmenu .B dmenu
.RB [ \-b ]
.RB [ \-i ]
.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 [ \-v ] .RB [ \-v ]
.RB [ \-t .P
.IR title ] .BR dmenu_run " ..."
.P
.B dmenu_path
.SH DESCRIPTION .SH DESCRIPTION
.SS Overview
.B dmenu .B dmenu
is a generic, highly customizable, and efficient menu for the X Window System, is a dynamic menu for X, originally designed for
originally designed for
.BR dwm (1). .BR dwm (1).
It supports arbitrary, user defined menu contents. It manages huge numbers of user-defined menu items efficiently.
.SS Options .P
dmenu reads a list of newline-separated items from standard input and creates a
menu. When the user selects an item or enters any text and presses Return,
their choice is printed to standard output and dmenu terminates.
.P
.B dmenu_run
is a dmenu script used by dwm which lists programs in the user's PATH and
executes the selected item.
.P
.B dmenu_path
is a program used by dmenu_run to find and cache a list of executables.
.SH OPTIONS
.TP
.B \-b
dmenu appears at the bottom of the screen.
.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 \-m " monitor"
dmenu appears on the given Xinerama screen.
.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 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 .TP
.B \-v .B \-v
prints version information to stdout, then exits. prints version information to standard output, then exits.
.SH USAGE
dmenu is completely controlled by the keyboard. Besides standard Unix line
editing and item selection (Up/Down/Left/Right, PageUp/PageDown, Home/End), the
following keys are recognized:
.TP .TP
.BI \-t " title" .B Tab (Control\-i)
displays Copy the selected item to the input field.
.I title .TP
above the menu. .B Return (Control\-j)
.SS Usage Confirm selection. Prints the selected item to standard output and exits,
.B dmenu returning success.
reads a list of newline-separated items from stdin and creates a menu. .TP
When the user selects an item or enters any text and presses Enter, his choice .B Shift\-Return (Control\-Shift\-j)
is printed to stdout and Confirm input. Prints the input text to standard output and exits, returning
.B dmenu success.
terminates. .TP
.SS Keyboard Control .B Escape (Control\-c)
.B dmenu Exit without selecting an item, returning failure.
is completely controlled by the keyboard. The following keys are recognized: .TP
.TP 2 .B Control\-y
Any printable character Paste the current X selection into the input field.
appends the character to the text in the input field. This works as a filter:
only items containing this text will be displayed.
.TP 2
Left/Right (Control-p/Control-n)
select the previous/next item.
.TP 2
Tab (Control-i)
copy the selected item to the input field.
.TP 2
Enter (Control-j)
confirm selection and quit (print the selected item to stdout).
.TP 2
Shift-Enter (Shift-Control-j)
confirm selection and quit (print the text in the input field to stdout).
.TP 2
Escape (Control-[)
quit without selecting an item.
.TP 2
Backspace (Control-h)
remove enough characters from the input field to change its filtering effect.
.TP 2
Control-u
remove all characters from the input field.
.SS Exit codes
.B dmenu
returns
.B 0
if Enter is pressed on termination,
.B 1
if Escape is pressed.
.SH SEE ALSO .SH SEE ALSO
.BR dwm (1) .BR dwm (1)

542
dmenu.c Normal file
View File

@ -0,0 +1,542 @@
/* See LICENSE file for copyright and license details. */
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <X11/Xutil.h>
#ifdef XINERAMA
#include <X11/extensions/Xinerama.h>
#endif
#include "draw.h"
#define INRECT(x,y,rx,ry,rw,rh) ((x) >= (rx) && (x) < (rx)+(rw) && (y) >= (ry) && (y) < (ry)+(rh))
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#define MAX(a,b) ((a) > (b) ? (a) : (b))
typedef struct Item Item;
struct Item {
char *text;
Item *next; /* traverses all items */
Item *left, *right; /* traverses matching items */
};
static void appenditem(Item *item, Item **list, Item **last);
static void calcoffsets(void);
static void drawmenu(void);
static char *fstrstr(const char *s, const char *sub);
static void grabkeyboard(void);
static void insert(const char *s, ssize_t n);
static void keypress(XKeyEvent *ev);
static void match(void);
static size_t nextrune(int incr);
static void paste(void);
static void readstdin(void);
static void run(void);
static void setup(void);
static void usage(void);
static char text[BUFSIZ];
static int bh, mw, mh;
static int inputw = 0;
static int lines = 0;
static int monitor = -1;
static int promptw;
static size_t cursor = 0;
static const char *font = NULL;
static const char *prompt = NULL;
static const char *normbgcolor = "#cccccc";
static const char *normfgcolor = "#000000";
static const char *selbgcolor = "#0066ff";
static const char *selfgcolor = "#ffffff";
static unsigned long normcol[ColLast];
static unsigned long selcol[ColLast];
static Atom utf8;
static Bool topbar = True;
static DC *dc;
static Item *items = NULL;
static Item *matches, *sel;
static Item *prev, *curr, *next;
static Window root, win;
static int (*fstrncmp)(const char *, const char *, size_t) = strncmp;
int
main(int argc, char *argv[]) {
int i;
progname = "dmenu";
for(i = 1; i < argc; i++)
/* single flags */
if(!strcmp(argv[i], "-v")) {
fputs("dmenu-"VERSION", © 2006-2010 dmenu engineers, see LICENSE for details\n", stdout);
exit(EXIT_SUCCESS);
}
else if(!strcmp(argv[i], "-b"))
topbar = False;
else if(!strcmp(argv[i], "-i"))
fstrncmp = strncasecmp;
else if(i == argc-1)
usage();
/* double flags */
else if(!strcmp(argv[i], "-l"))
lines = atoi(argv[++i]);
else if(!strcmp(argv[i], "-m"))
monitor = atoi(argv[++i]);
else if(!strcmp(argv[i], "-p"))
prompt = argv[++i];
else if(!strcmp(argv[i], "-fn"))
font = argv[++i];
else if(!strcmp(argv[i], "-nb"))
normbgcolor = argv[++i];
else if(!strcmp(argv[i], "-nf"))
normfgcolor = argv[++i];
else if(!strcmp(argv[i], "-sb"))
selbgcolor = argv[++i];
else if(!strcmp(argv[i], "-sf"))
selfgcolor = argv[++i];
else
usage();
dc = initdc();
initfont(dc, font);
readstdin();
setup();
run();
return EXIT_FAILURE; /* should not reach */
}
void
appenditem(Item *item, Item **list, Item **last) {
if(!*last)
*list = item;
else
(*last)->right = item;
item->left = *last;
item->right = NULL;
*last = item;
}
void
calcoffsets(void) {
unsigned int i, n;
if(lines > 0)
n = lines * bh;
else
n = mw - (promptw + inputw + textw(dc, "<") + textw(dc, ">"));
for(i = 0, next = curr; next; next = next->right)
if((i += (lines > 0) ? bh : MIN(textw(dc, next->text), n)) > n)
break;
for(i = 0, prev = curr; prev && prev->left; prev = prev->left)
if((i += (lines > 0) ? bh : MIN(textw(dc, prev->left->text), n)) > n)
break;
}
void
drawmenu(void) {
int curpos;
Item *item;
dc->x = 0;
dc->y = 0;
dc->h = bh;
drawrect(dc, 0, 0, mw, mh, True, BG(dc, normcol));
if(prompt) {
dc->w = promptw;
drawtext(dc, prompt, selcol);
dc->x = dc->w;
}
dc->w = (lines > 0 || !matches) ? mw - dc->x : inputw;
drawtext(dc, text, normcol);
if((curpos = textnw(dc, text, cursor) + dc->h/2 - 2) < dc->w)
drawrect(dc, curpos, 2, 1, dc->h - 4, True, FG(dc, normcol));
if(lines > 0) {
dc->w = mw - dc->x;
for(item = curr; item != next; item = item->right) {
dc->y += dc->h;
drawtext(dc, item->text, (item == sel) ? selcol : normcol);
}
}
else if(matches) {
dc->x += inputw;
dc->w = textw(dc, "<");
if(curr->left)
drawtext(dc, "<", normcol);
for(item = curr; item != next; item = item->right) {
dc->x += dc->w;
dc->w = MIN(textw(dc, item->text), mw - dc->x - textw(dc, ">"));
drawtext(dc, item->text, (item == sel) ? selcol : normcol);
}
dc->w = textw(dc, ">");
dc->x = mw - dc->w;
if(next)
drawtext(dc, ">", normcol);
}
mapdc(dc, win, mw, mh);
}
char *
fstrstr(const char *s, const char *sub) {
size_t len;
for(len = strlen(sub); *s; s++)
if(!fstrncmp(s, sub, len))
return (char *)s;
return NULL;
}
void
grabkeyboard(void) {
int i;
for(i = 0; i < 1000; i++) {
if(!XGrabKeyboard(dc->dpy, root, True, GrabModeAsync, GrabModeAsync, CurrentTime))
return;
usleep(1000);
}
eprintf("cannot grab keyboard\n");
}
void
insert(const char *s, ssize_t n) {
if(strlen(text) + n > sizeof text - 1)
return;
memmove(text + cursor + n, text + cursor, sizeof text - cursor - MAX(n, 0));
if(n > 0)
memcpy(text + cursor, s, n);
cursor += n;
match();
}
void
keypress(XKeyEvent *ev) {
char buf[32];
size_t len;
KeySym ksym;
len = strlen(text);
XLookupString(ev, buf, sizeof buf, &ksym, NULL);
if(ev->state & ControlMask) {
switch(tolower(ksym)) {
default:
return;
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_h:
ksym = XK_BackSpace;
break;
case XK_i:
ksym = XK_Tab;
break;
case XK_j:
ksym = XK_Return;
break;
case XK_k: /* delete right */
text[cursor] = '\0';
match();
break;
case XK_n:
ksym = XK_Down;
break;
case XK_p:
ksym = XK_Up;
break;
case XK_u: /* delete left */
insert(NULL, 0 - cursor);
break;
case XK_w: /* delete word */
while(cursor > 0 && text[nextrune(-1)] == ' ')
insert(NULL, nextrune(-1) - cursor);
while(cursor > 0 && text[nextrune(-1)] != ' ')
insert(NULL, nextrune(-1) - cursor);
break;
case XK_y: /* paste selection */
XConvertSelection(dc->dpy, XA_PRIMARY, utf8, utf8, win, CurrentTime);
return;
}
}
switch(ksym) {
default:
if(!iscntrl(*buf))
insert(buf, strlen(buf));
break;
case XK_Delete:
if(cursor == len)
return;
cursor = nextrune(+1);
case XK_BackSpace:
if(cursor > 0)
insert(NULL, nextrune(-1) - cursor);
break;
case XK_End:
if(cursor < len) {
cursor = len;
break;
}
while(next) {
sel = curr = next;
calcoffsets();
}
while(sel && sel->right)
sel = sel->right;
break;
case XK_Escape:
exit(EXIT_FAILURE);
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;
}
else if(lines > 0)
return;
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:
fputs((sel && !(ev->state & ShiftMask)) ? sel->text : text, stdout);
fflush(stdout);
exit(EXIT_SUCCESS);
case XK_Right:
if(cursor < len) {
cursor = nextrune(+1);
break;
}
else if(lines > 0)
return;
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);
cursor = strlen(text);
match();
break;
}
drawmenu();
}
void
match(void) {
size_t len;
Item *item, *itemend, *lexact, *lprefix, *lsubstr, *exactend, *prefixend, *substrend;
len = strlen(text);
matches = lexact = lprefix = lsubstr = itemend = exactend = prefixend = substrend = NULL;
for(item = items; item; item = item->next)
if(!fstrncmp(text, item->text, len + 1))
appenditem(item, &lexact, &exactend);
else if(!fstrncmp(text, item->text, len))
appenditem(item, &lprefix, &prefixend);
else if(fstrstr(item->text, text))
appenditem(item, &lsubstr, &substrend);
if(lexact) {
matches = lexact;
itemend = exactend;
}
if(lprefix) {
if(itemend) {
itemend->right = lprefix;
lprefix->left = itemend;
}
else
matches = lprefix;
itemend = prefixend;
}
if(lsubstr) {
if(itemend) {
itemend->right = lsubstr;
lsubstr->left = itemend;
}
else
matches = lsubstr;
}
curr = prev = next = sel = matches;
calcoffsets();
}
size_t
nextrune(int incr) {
size_t n, len;
len = strlen(text);
for(n = cursor + incr; n >= 0 && n < len && (text[n] & 0xc0) == 0x80; n += incr);
return n;
}
void
paste(void) {
char *p, *q;
int di;
unsigned long dl;
Atom da;
XGetWindowProperty(dc->dpy, win, utf8, 0, (sizeof text / 4) + 1, False,
utf8, &da, &di, &dl, &dl, (unsigned char **)&p);
insert(p, (q = strchr(p, '\n')) ? q-p : strlen(p));
XFree(p);
drawmenu();
}
void
readstdin(void) {
char buf[sizeof text], *p;
Item *item, **end;
for(end = &items; fgets(buf, sizeof buf, stdin); *end = item, end = &item->next) {
if((p = strchr(buf, '\n')))
*p = '\0';
if(!(item = malloc(sizeof *item)))
eprintf("cannot malloc %u bytes\n", sizeof *item);
if(!(item->text = strdup(buf)))
eprintf("cannot strdup %u bytes\n", strlen(buf)+1);
item->next = item->left = item->right = NULL;
inputw = MAX(inputw, textw(dc, item->text));
}
}
void
run(void) {
XEvent ev;
while(!XNextEvent(dc->dpy, &ev))
switch(ev.type) {
case Expose:
if(ev.xexpose.count == 0)
drawmenu();
break;
case KeyPress:
keypress(&ev.xkey);
break;
case SelectionNotify:
if(ev.xselection.property == utf8)
paste();
break;
case VisibilityNotify:
if(ev.xvisibility.state != VisibilityUnobscured)
XRaiseWindow(dc->dpy, win);
break;
}
}
void
setup(void) {
int x, y, screen;
XSetWindowAttributes wa;
#ifdef XINERAMA
int n;
XineramaScreenInfo *info;
#endif
screen = DefaultScreen(dc->dpy);
root = RootWindow(dc->dpy, screen);
utf8 = XInternAtom(dc->dpy, "UTF8_STRING", False);
normcol[ColBG] = getcolor(dc, normbgcolor);
normcol[ColFG] = getcolor(dc, normfgcolor);
selcol[ColBG] = getcolor(dc, selbgcolor);
selcol[ColFG] = getcolor(dc, selfgcolor);
/* menu geometry */
bh = dc->font.height + 2;
lines = MAX(lines, 0);
mh = (lines + 1) * bh;
#ifdef XINERAMA
if((info = XineramaQueryScreens(dc->dpy, &n))) {
int i, di;
unsigned int du;
Window dw;
XQueryPointer(dc->dpy, root, &dw, &dw, &x, &y, &di, &di, &du);
for(i = 0; i < n; i++)
if((monitor == info[i].screen_number)
|| (monitor < 0 && INRECT(x, y, info[i].x_org, info[i].y_org, info[i].width, info[i].height)))
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
{
x = 0;
y = topbar ? 0 : DisplayHeight(dc->dpy, screen) - mh;
mw = DisplayWidth(dc->dpy, screen);
}
/* menu window */
wa.override_redirect = True;
wa.background_pixmap = ParentRelative;
wa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask;
win = XCreateWindow(dc->dpy, root, x, y, mw, mh, 0,
DefaultDepth(dc->dpy, screen), CopyFromParent,
DefaultVisual(dc->dpy, screen),
CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
grabkeyboard();
resizedc(dc, mw, mh);
inputw = MIN(inputw, mw/3);
promptw = prompt ? textw(dc, prompt) : 0;
XMapRaised(dc->dpy, win);
text[0] = '\0';
match();
}
void
usage(void) {
fputs("usage: dmenu [-b] [-i] [-l lines] [-m monitor] [-p prompt] [-fn font]\n"
" [-nb color] [-nf color] [-sb color] [-sf color] [-v]\n", stderr);
exit(EXIT_FAILURE);
}

47
dmenu.h
View File

@ -1,47 +0,0 @@
/*
* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include "config.h"
#include <X11/Xlib.h>
#include <X11/Xlocale.h>
#define SPACE 30 /* px */
typedef struct Brush Brush;
typedef struct DC DC;
typedef struct Fnt Fnt;
struct Fnt {
XFontStruct *xfont;
XFontSet set;
int ascent;
int descent;
int height;
};
struct DC { /* draw context */
int x, y, w, h;
unsigned long bg;
unsigned long fg;
unsigned long border;
Drawable drawable;
Fnt font;
GC gc;
};
extern int screen;
extern Display *dpy;
extern DC dc;
/* draw.c */
extern void drawtext(const char *text, Bool invert, Bool border);
extern unsigned long getcolor(const char *colstr);
extern void setfont(const char *fontstr);
extern unsigned int textw(const char *text);
/* util.c */
extern void *emalloc(unsigned int size);
extern void eprint(const char *errstr, ...);
extern char *estrdup(const char *str);

101
dmenu_path.c Normal file
View File

@ -0,0 +1,101 @@
/* See LICENSE file for copyright and license details. */
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#define CACHE ".dmenu_cache"
static void die(const char *s);
static int qstrcmp(const void *a, const void *b);
static void scan(void);
static int uptodate(void);
static char **items = NULL;
static const char *home, *path;
int
main(void) {
if(!(home = getenv("HOME")))
die("no $HOME");
if(!(path = getenv("PATH")))
die("no $PATH");
if(chdir(home) < 0)
die("chdir failed");
if(uptodate()) {
execlp("cat", "cat", CACHE, NULL);
die("exec failed");
}
scan();
return EXIT_SUCCESS;
}
void
die(const char *s) {
fprintf(stderr, "dmenu_path: %s\n", s);
exit(EXIT_FAILURE);
}
int
qstrcmp(const void *a, const void *b) {
return strcmp(*(const char **)a, *(const char **)b);
}
void
scan(void) {
char buf[PATH_MAX];
char *dir, *p;
size_t i, count;
struct dirent *ent;
DIR *dp;
FILE *cache;
count = 0;
if(!(p = strdup(path)))
die("strdup failed");
for(dir = strtok(p, ":"); dir; dir = strtok(NULL, ":")) {
if(!(dp = opendir(dir)))
continue;
while((ent = readdir(dp))) {
snprintf(buf, sizeof buf, "%s/%s", dir, ent->d_name);
if(ent->d_name[0] == '.' || access(buf, X_OK) < 0)
continue;
if(!(items = realloc(items, ++count * sizeof *items)))
die("malloc failed");
if(!(items[count-1] = strdup(ent->d_name)))
die("strdup failed");
}
closedir(dp);
}
qsort(items, count, sizeof *items, qstrcmp);
if(!(cache = fopen(CACHE, "w")))
die("open failed");
for(i = 0; i < count; i++) {
if(i > 0 && !strcmp(items[i], items[i-1]))
continue;
fprintf(cache, "%s\n", items[i]);
fprintf(stdout, "%s\n", items[i]);
}
fclose(cache);
free(p);
}
int
uptodate(void) {
char *dir, *p;
time_t mtime;
struct stat st;
if(stat(CACHE, &st) < 0)
return 0;
mtime = st.st_mtime;
if(!(p = strdup(path)))
die("strdup failed");
for(dir = strtok(p, ":"); dir; dir = strtok(NULL, ":"))
if(!stat(dir, &st) && st.st_mtime > mtime)
return 0;
free(p);
return 1;
}

2
dmenu_run Executable file
View File

@ -0,0 +1,2 @@
#!/bin/sh
exe=`dmenu_path | dmenu ${1+"$@"}` && exec $exe

285
draw.c
View File

@ -1,159 +1,194 @@
/* /* See LICENSE file for copyright and license details. */
* (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com> #include <locale.h>
* See LICENSE file for license details. #include <stdarg.h>
*/
#include "dmenu.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include <X11/Xlocale.h> #include <X11/Xlib.h>
#include "draw.h"
/* static */ #define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define DEFFONT "fixed"
static void static Bool loadfont(DC *dc, const char *fontstr);
drawborder(void)
{
XPoint points[5];
XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
XSetForeground(dpy, dc.gc, dc.border);
points[0].x = dc.x;
points[0].y = dc.y;
points[1].x = dc.w - 1;
points[1].y = 0;
points[2].x = 0;
points[2].y = dc.h - 1;
points[3].x = -(dc.w - 1);
points[3].y = 0;
points[4].x = 0;
points[4].y = -(dc.h - 1);
XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious);
}
static unsigned int
textnw(const char *text, unsigned int len)
{
XRectangle r;
if(dc.font.set) {
XmbTextExtents(dc.font.set, text, len, NULL, &r);
return r.width;
}
return XTextWidth(dc.font.xfont, text, len);
}
/* extern */
void void
drawtext(const char *text, Bool invert, Bool border) drawrect(DC *dc, int x, int y, unsigned int w, unsigned int h, Bool fill, unsigned long color) {
{ XRectangle r = { dc->x + x, dc->y + y, w, h };
int x, y, w, h;
static char buf[256];
unsigned int len;
XGCValues gcv;
XRectangle r = { dc.x, dc.y, dc.w, dc.h };
XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg); if(!fill) {
XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); r.width -= 1;
r.height -= 1;
}
XSetForeground(dc->dpy, dc->gc, color);
(fill ? XFillRectangles : XDrawRectangles)(dc->dpy, dc->canvas, dc->gc, &r, 1);
}
w = 0;
if(border)
drawborder();
if(!text) void
return; drawtext(DC *dc, const char *text, unsigned long col[ColLast]) {
char buf[256];
len = strlen(text); size_t n, mn;
if(len >= sizeof(buf))
len = sizeof(buf) - 1;
memcpy(buf, text, len);
buf[len] = 0;
h = dc.font.ascent + dc.font.descent;
y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
x = dc.x + (h / 2);
/* shorten text if necessary */ /* shorten text if necessary */
while(len && (w = textnw(buf, len)) > dc.w - h) n = strlen(text);
buf[--len] = 0; for(mn = MIN(n, sizeof buf); textnw(dc, text, mn) > dc->w - dc->font.height/2; mn--)
if(mn == 0)
return;
memcpy(buf, text, mn);
if(mn < n)
for(n = MAX(mn-3, 0); n < mn; buf[n++] = '.');
if(w > dc.w) drawrect(dc, 0, 0, dc->w, dc->h, True, BG(dc, col));
return; /* too long */ drawtextn(dc, buf, mn, col);
}
gcv.foreground = invert ? dc.bg : dc.fg; void
gcv.background = invert ? dc.fg : dc.bg; drawtextn(DC *dc, const char *text, size_t n, unsigned long col[ColLast]) {
if(dc.font.set) { int x, y;
XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv);
XmbDrawImageString(dpy, dc.drawable, dc.font.set, dc.gc, x = dc->x + dc->font.height/2;
x, y, buf, len); 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 { else {
gcv.font = dc.font.xfont->fid; XSetFont(dc->dpy, dc->gc, dc->font.xfont->fid);
XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv); XDrawString(dc->dpy, dc->canvas, dc->gc, x, y, text, n);
XDrawImageString(dpy, dc.drawable, dc.gc, x, y, buf, len);
} }
} }
void
eprintf(const char *fmt, ...) {
va_list ap;
fprintf(stderr, "%s: ", progname);
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
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 unsigned long
getcolor(const char *colstr) getcolor(DC *dc, const char *colstr) {
{ Colormap cmap = DefaultColormap(dc->dpy, DefaultScreen(dc->dpy));
Colormap cmap = DefaultColormap(dpy, screen);
XColor color; XColor color;
XAllocNamedColor(dpy, cmap, colstr, &color, &color); if(!XAllocNamedColor(dc->dpy, cmap, colstr, &color, &color))
eprintf("cannot allocate color '%s'\n", colstr);
return color.pixel; return color.pixel;
} }
DC *
initdc(void) {
DC *dc;
if(!setlocale(LC_CTYPE, "") || !XSupportsLocale())
weprintf("no locale support\n");
if(!(dc = malloc(sizeof *dc)))
eprintf("cannot malloc %u bytes\n", 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);
dc->font.xfont = NULL;
dc->font.set = NULL;
dc->canvas = None;
return dc;
}
void void
setfont(const char *fontstr) initfont(DC *dc, const char *fontstr) {
{ if(!loadfont(dc, fontstr ? fontstr : DEFFONT)) {
char **missing, *def; if(fontstr != NULL)
weprintf("cannot load font '%s'\n", fontstr);
if(fontstr == NULL || !loadfont(dc, DEFFONT))
eprintf("cannot load font '%s'\n", DEFFONT);
}
dc->font.height = dc->font.ascent + dc->font.descent;
}
Bool
loadfont(DC *dc, const char *fontstr) {
char *def, **missing;
int i, n; int i, n;
missing = NULL; if(!*fontstr)
setlocale(LC_ALL, ""); return False;
if(dc.font.set) if((dc->font.set = XCreateFontSet(dc->dpy, fontstr, &missing, &n, &def))) {
XFreeFontSet(dpy, dc.font.set); char **names;
dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
if(missing) {
XFreeStringList(missing);
if(dc.font.set) {
XFreeFontSet(dpy, dc.font.set);
dc.font.set = NULL;
}
}
if(dc.font.set) {
XFontSetExtents *font_extents;
XFontStruct **xfonts; XFontStruct **xfonts;
char **font_names;
dc.font.ascent = dc.font.descent = 0; n = XFontsOfFontSet(dc->font.set, &xfonts, &names);
font_extents = XExtentsOfFontSet(dc.font.set); for(i = dc->font.ascent = dc->font.descent = 0; i < n; i++) {
n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names); dc->font.ascent = MAX(dc->font.ascent, xfonts[i]->ascent);
for(i = 0, dc.font.ascent = 0, dc.font.descent = 0; i < n; i++) { dc->font.descent = MAX(dc->font.descent, xfonts[i]->descent);
if(dc.font.ascent < (*xfonts)->ascent)
dc.font.ascent = (*xfonts)->ascent;
if(dc.font.descent < (*xfonts)->descent)
dc.font.descent = (*xfonts)->descent;
xfonts++;
} }
} }
else { else if((dc->font.xfont = XLoadQueryFont(dc->dpy, fontstr))) {
if(dc.font.xfont) dc->font.ascent = dc->font.xfont->ascent;
XFreeFont(dpy, dc.font.xfont); dc->font.descent = dc->font.xfont->descent;
dc.font.xfont = NULL;
dc.font.xfont = XLoadQueryFont(dpy, fontstr);
if (!dc.font.xfont)
dc.font.xfont = XLoadQueryFont(dpy, "fixed");
if (!dc.font.xfont)
eprint("error, cannot init 'fixed' font\n");
dc.font.ascent = dc.font.xfont->ascent;
dc.font.descent = dc.font.xfont->descent;
} }
dc.font.height = dc.font.ascent + dc.font.descent; if(missing)
XFreeStringList(missing);
return (dc->font.set || dc->font.xfont);
} }
unsigned int void
textw(const char *text) 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);
return textnw(text, strlen(text)) + dc.font.height; }
void
resizedc(DC *dc, unsigned int w, unsigned int h) {
if(dc->canvas)
XFreePixmap(dc->dpy, dc->canvas);
dc->canvas = XCreatePixmap(dc->dpy, DefaultRootWindow(dc->dpy), w, h,
DefaultDepth(dc->dpy, DefaultScreen(dc->dpy)));
dc->x = dc->y = 0;
dc->w = w;
dc->h = h;
dc->invert = False;
}
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;
}
void
weprintf(const char *fmt, ...) {
va_list ap;
fprintf(stderr, "%s: warning: ", progname);
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
} }

37
draw.h Normal file
View File

@ -0,0 +1,37 @@
/* 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;
XFontSet set;
XFontStruct *xfont;
} font;
} DC; /* draw context */
unsigned long getcolor(DC *dc, const char *colstr);
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 initfont(DC *dc, const char *fontstr);
void freedc(DC *dc);
DC *initdc(void);
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);
void eprintf(const char *fmt, ...);
void weprintf(const char *fmt, ...);
const char *progname;

414
main.c
View File

@ -1,414 +0,0 @@
/*
* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* (C)opyright MMVI Sander van Dijk <a dot h dot vandijk at gmail dot com>
* See LICENSE file for license details.
*/
#include "dmenu.h"
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <X11/cursorfont.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
typedef struct Item Item;
struct Item {
Item *next; /* traverses all items */
Item *left, *right; /* traverses items matching current search pattern */
char *text;
};
/* static */
static char *title, text[4096];
static int mx, my, mw, mh;
static int ret = 0;
static int nitem = 0;
static unsigned int cmdw = 0;
static unsigned int tw = 0;
static unsigned int cw = 0;
static Bool done = False;
static Item *allitems = NULL; /* first of all items */
static Item *item = NULL; /* first of pattern matching items */
static Item *sel = NULL;
static Item *next = NULL;
static Item *prev = NULL;
static Item *curr = NULL;
static Window root;
static Window win;
static void
calcoffsets()
{
unsigned int tw, w;
if(!curr)
return;
w = cmdw + 2 * SPACE;
for(next = curr; next; next=next->right) {
tw = textw(next->text);
if(tw > mw / 3)
tw = mw / 3;
w += tw;
if(w > mw)
break;
}
w = cmdw + 2 * SPACE;
for(prev = curr; prev && prev->left; prev=prev->left) {
tw = textw(prev->left->text);
if(tw > mw / 3)
tw = mw / 3;
w += tw;
if(w > mw)
break;
}
}
static void
drawmenu()
{
Item *i;
dc.x = 0;
dc.y = 0;
dc.w = mw;
dc.h = mh;
drawtext(NULL, False, False);
/* print command */
if(!title || text[0]) {
cmdw = cw;
if(cmdw && item)
dc.w = cmdw;
drawtext(text, False, False);
}
else {
cmdw = tw;
dc.w = cmdw;
drawtext(title, False, False);
}
dc.x += dc.w;
if(curr) {
dc.w = SPACE;
drawtext((curr && curr->left) ? "<" : NULL, False, False);
dc.x += dc.w;
/* determine maximum items */
for(i = curr; i != next; i=i->right) {
dc.border = False;
dc.w = textw(i->text);
if(dc.w > mw / 3)
dc.w = mw / 3;
drawtext(i->text, sel == i, sel == i);
dc.x += dc.w;
}
dc.x = mw - SPACE;
dc.w = SPACE;
drawtext(next ? ">" : NULL, False, False);
}
XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, mw, mh, 0, 0);
XFlush(dpy);
}
static void
input(char *pattern)
{
unsigned int plen;
Item *i, *j;
if(!pattern)
return;
if(!title || *pattern)
cmdw = cw;
else
cmdw = tw;
plen = strlen(pattern);
item = j = NULL;
nitem = 0;
for(i = allitems; i; i=i->next)
if(!plen || !strncmp(pattern, i->text, plen)) {
if(!j)
item = i;
else
j->right = i;
i->left = j;
i->right = NULL;
j = i;
nitem++;
}
for(i = allitems; i; i=i->next)
if(plen && strncmp(pattern, i->text, plen)
&& strstr(i->text, pattern)) {
if(!j)
item = i;
else
j->right = i;
i->left = j;
i->right = NULL;
j = i;
nitem++;
}
curr = prev = next = sel = item;
calcoffsets();
}
static void
kpress(XKeyEvent * e)
{
char buf[32];
int num, prev_nitem;
unsigned int i, len;
KeySym ksym;
len = strlen(text);
buf[0] = 0;
num = XLookupString(e, buf, sizeof(buf), &ksym, 0);
if(IsFunctionKey(ksym) || IsKeypadKey(ksym)
|| IsMiscFunctionKey(ksym) || IsPFKey(ksym)
|| IsPrivateKeypadKey(ksym))
return;
/* first check if a control mask is omitted */
if(e->state & ControlMask) {
switch (ksym) {
default: /* ignore other control sequences */
return;
break;
case XK_h:
ksym = XK_BackSpace;
break;
case XK_U:
case XK_u:
text[0] = 0;
input(text);
drawmenu();
return;
break;
case XK_bracketleft:
ksym = XK_Escape;
break;
}
}
switch(ksym) {
case XK_Left:
if(!(sel && sel->left))
return;
sel=sel->left;
if(sel->right == curr) {
curr = prev;
calcoffsets();
}
break;
case XK_Tab:
if(!sel)
return;
strncpy(text, sel->text, sizeof(text));
input(text);
break;
case XK_Right:
if(!(sel && sel->right))
return;
sel=sel->right;
if(sel == next) {
curr = next;
calcoffsets();
}
break;
case XK_Return:
if(e->state & ShiftMask) {
if(text)
fprintf(stdout, "%s", text);
}
else if(sel)
fprintf(stdout, "%s", sel->text);
else if(text)
fprintf(stdout, "%s", text);
fflush(stdout);
done = True;
break;
case XK_Escape:
ret = 1;
done = True;
break;
case XK_BackSpace:
if((i = len)) {
prev_nitem = nitem;
do {
text[--i] = 0;
input(text);
} while(i && nitem && prev_nitem == nitem);
input(text);
}
break;
default:
if(num && !iscntrl((int) buf[0])) {
buf[num] = 0;
if(len > 0)
strncat(text, buf, sizeof(text));
else
strncpy(text, buf, sizeof(text));
input(text);
}
}
drawmenu();
}
static char *
readinput()
{
static char *maxname = NULL;
char *p, buf[1024];
unsigned int len = 0, max = 0;
Item *i, *new;
i = 0;
while(fgets(buf, sizeof(buf), stdin)) {
len = strlen(buf);
if (buf[len - 1] == '\n')
buf[len - 1] = 0;
p = estrdup(buf);
if(max < len) {
maxname = p;
max = len;
}
new = emalloc(sizeof(Item));
new->next = new->left = new->right = NULL;
new->text = p;
if(!i)
allitems = new;
else
i->next = new;
i = new;
}
return maxname;
}
/* extern */
int screen;
Display *dpy;
DC dc = {0};
int
main(int argc, char *argv[])
{
char *maxname;
int i;
XEvent ev;
XSetWindowAttributes wa;
/* command line args */
for(i = 1; i < argc; i++) {
if (argv[i][0] == '-')
switch (argv[i][1]) {
case 'v':
fputs("dmenu-"VERSION", (C)opyright MMVI Anselm R. Garbe\n", stdout);
exit(EXIT_SUCCESS);
break;
case 't':
if(++i < argc) {
title = argv[i];
break;
}
default:
eprint("usage: dmenu [-v] [-t <title>]\n");
break;
}
else
eprint("usage: dmenu [-v] [-t <title>]\n");
}
dpy = XOpenDisplay(0);
if(!dpy)
eprint("dmenu: cannot open dpy\n");
screen = DefaultScreen(dpy);
root = RootWindow(dpy, screen);
maxname = readinput();
/* grab as early as possible, but after reading all items!!! */
while(XGrabKeyboard(dpy, root, True, GrabModeAsync,
GrabModeAsync, CurrentTime) != GrabSuccess)
usleep(1000);
/* style */
dc.bg = getcolor(BGCOLOR);
dc.fg = getcolor(FGCOLOR);
dc.border = getcolor(BORDERCOLOR);
setfont(FONT);
wa.override_redirect = 1;
wa.background_pixmap = ParentRelative;
wa.event_mask = ExposureMask | ButtonPressMask | KeyPressMask;
mx = my = 0;
mw = DisplayWidth(dpy, screen);
mh = dc.font.height + 4;
win = XCreateWindow(dpy, root, mx, my, mw, mh, 0,
DefaultDepth(dpy, screen), CopyFromParent,
DefaultVisual(dpy, screen),
CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
XDefineCursor(dpy, win, XCreateFontCursor(dpy, XC_xterm));
/* pixmap */
dc.drawable = XCreatePixmap(dpy, root, mw, mh, DefaultDepth(dpy, screen));
dc.gc = XCreateGC(dpy, root, 0, 0);
if(maxname)
cw = textw(maxname);
if(cw > mw / 3)
cw = mw / 3;
if(title) {
tw = textw(title);
if(tw > mw / 3)
tw = mw / 3;
}
cmdw = title ? tw : cw;
text[0] = 0;
input(text);
XMapRaised(dpy, win);
drawmenu();
XSync(dpy, False);
/* main event loop */
while(!done && !XNextEvent(dpy, &ev)) {
switch (ev.type) {
case KeyPress:
kpress(&ev.xkey);
break;
case Expose:
if(ev.xexpose.count == 0)
drawmenu();
break;
default:
break;
}
}
XUngrabKeyboard(dpy, CurrentTime);
XFreePixmap(dpy, dc.drawable);
XFreeGC(dpy, dc.gc);
XDestroyWindow(dpy, win);
XCloseDisplay(dpy);
return ret;
}

50
util.c
View File

@ -1,50 +0,0 @@
/*
* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include "dmenu.h"
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>
/* static */
static void
bad_malloc(unsigned int size)
{
eprint("fatal: could not malloc() %u bytes\n", size);
}
/* extern */
void *
emalloc(unsigned int size)
{
void *res = malloc(size);
if(!res)
bad_malloc(size);
return res;
}
void
eprint(const char *errstr, ...)
{
va_list ap;
va_start(ap, errstr);
vfprintf(stderr, errstr, ap);
va_end(ap);
exit(EXIT_FAILURE);
}
char *
estrdup(const char *str)
{
void *res = strdup(str);
if(!res)
bad_malloc(strlen(str));
return res;
}