Compare commits

..
325 Commits
Author SHA1 Message Date
Connor Lane Smith 91dc06d0b8 prepare 4.4.1 release 2011-09-19 10:41:30 +01:00
Connor Lane Smith 3af80cd7d8 change version to 'hg' 2011-09-19 10:40:07 +01:00
Connor Lane Smith 4692f84ff0 dmenu_run: sh -c 2011-07-24 20:04:58 +01:00
Connor Lane Smith c805dcbeaf fix loadfont 2011-07-22 18:16:57 +01:00
Connor Lane Smith a6cbc6c9a7 Added tag 4.4 for changeset 2b105eaae831 2011-07-19 21:30:14 +01:00
Connor Lane Smith bae58f61cf add lsx.1 to dist 2011-07-19 21:30:09 +01:00
Connor Lane Smith 1636e12210 tweaks 2011-07-17 14:06:53 +01:00
Connor Lane Smith 2b92c95230 efficiency tweaks 2011-07-14 20:03:08 +01:00
Connor Lane Smith 16a0c0d52a fix extra warning 2011-07-14 20:03:00 +01:00
Connor Lane Smith 5867c53390 simpler vline 2011-07-06 13:40:36 +01:00
Connor Lane Smith 34a816f87d rebind ^N ^P 2011-07-04 16:55:09 +01:00
Connor Lane Smith 0288b576ca include limits.h 2011-06-25 17:02:14 +01:00
Connor Lane Smith 59dafc4ad6 make clean lsx 2011-06-23 22:39:20 +01:00
Connor Lane Smith 49672e9d05 merge lsx -> default 2011-06-23 20:27:28 +01:00
Connor Lane Smith 07d452e0c8 close lsx branch 2011-06-23 20:26:57 +01:00
Connor Lane Smith 88d44169e9 lsx: check snprintf 2011-06-23 20:04:50 +01:00
Connor Lane Smith f7cbe710a2 update draw.c 2011-06-18 22:11:19 +01:00
Connor Lane Smith 86e9e6f1ec simpler lsx 2011-06-18 07:50:46 +01:00
Connor Lane Smith eadf090413 new dmenu_run 2011-06-13 21:50:31 +01:00
Connor Lane Smith 8ec1b41cac add lsx.1 2011-06-13 19:32:45 +01:00
Connor Lane Smith ab3bcac0bf new lsx branch 2011-06-13 19:28:30 +01:00
Connor Lane Smith 723cbabc12 add ^M 2011-06-13 19:25:40 +01:00
Connor Lane Smith 86775cc44b Added tag 4.3.1 for changeset 34a2d77049a9 2011-05-18 17:01:59 +01:00
Connor Lane Smith 2103ae2891 bugfix 2011-05-18 17:01:44 +01:00
Connor Lane Smith b028ec0e07 Added tag 4.3 for changeset 14c79f054bdf 2011-05-18 16:21:45 +01:00
Connor Lane Smith bb3e33def3 no -m, cleanup 2011-05-18 16:20:03 +01:00
Connor Lane Smith 3a60b19514 fix possible overflow 2011-05-16 23:35:14 +01:00
Connor Lane Smith dd2f298252 fixed extra warnings 2011-05-16 12:59:31 +01:00
Connor Lane Smith 11ea52d170 portability 2011-05-15 21:54:26 +01:00
Connor Lane Smith 4354074607 efficient incremental search 2011-05-15 16:05:32 +01:00
Connor Lane Smith 4776d6dc61 match first 2011-05-15 14:21:00 +01:00
Connor Lane Smith d0051e7bb8 faster grab 2011-05-15 14:13:31 +01:00
Connor Lane Smith fb67bd666e cleanup 2011-05-15 13:58:54 +01:00
Connor Lane Smith f5bd1eed8d fast but inexact 2011-05-15 13:02:33 +01:00
Connor Lane Smith 1654d6cd62 cleanup 2011-05-15 02:37:49 +01:00
Connor Lane Smith 6cc0b0dc08 increment version 2011-05-14 23:26:41 +01:00
Connor Lane Smith b2bb6ebec9 only match links 2011-05-14 23:21:38 +01:00
Connor Lane Smith a662fc6e0a follow symlinks 2011-05-14 23:14:31 +01:00
Connor Lane Smith d066975e78 cleanup 2011-05-14 22:43:42 +01:00
Connor Lane Smith 26236a4900 whoops, wrong dmenu_path version 2011-05-14 22:12:28 +01:00
Connor Lane Smith 15505bd711 fast dmenu_path script 2011-05-14 20:43:11 +01:00
Connor Lane Smith 86468aafe5 instant ^E 2011-05-14 18:39:27 +01:00
Connor Lane Smith be9afce035 fix typo 2011-05-14 17:47:12 +01:00
Connor Lane Smith 3c067598fc use array for items 2011-05-14 17:46:20 +01:00
Connor Lane Smith 86019c5855 fixed xinerama corner case 2011-05-12 13:17:41 +01:00
Connor Lane Smith 0291c722fb fixed -m bug (thanks Rob) 2011-05-11 12:25:50 +01:00
Connor Lane Smith e0e6b071c6 fast grab patch (thanks Rob) 2011-05-08 15:15:24 +01:00
Connor Lane Smith cd3b4915c3 helpful errors 2011-05-06 21:13:02 +01:00
Connor Lane Smith 210b303941 paring 2011-05-05 15:46:48 +01:00
Connor Lane Smith 47e3e8be7b update license 2011-01-07 18:55:00 +00:00
Connor Lane Smith d515d2758f cache option in config.mk 2011-01-07 18:54:40 +00:00
Connor Lane Smith a8ea79715f gmake spews 2010-12-01 20:25:10 +00:00
Connor Lane Smith 3e0a141016 posix makefile 2010-12-01 20:23:16 +00:00
Anselm R Garbe cbd8257914 Added tag 4.2.1 for changeset abb6579a324f 2010-11-20 09:25:08 +00:00
Anselm R Garbe 22cf9626c7 fixed dist target bug 2010-11-20 09:25:04 +00:00
Anselm R Garbe 9e13ecabe8 Added tag 4.2 for changeset 379813a051f0 2010-11-19 11:51:01 +00:00
Connor Lane Smith 266f3dd311 removed unnecessary defines 2010-11-17 04:51:30 +00:00
Connor Lane Smith 8d9ade36de moved main, updated args 2010-11-17 04:33:34 +00:00
Connor Lane Smith da81f57f6d fixed config.mk dep 2010-11-12 00:30:03 +00:00
Connor Lane Smith c1241bcba3 updated manpage 2010-11-12 00:01:54 +00:00
Connor Lane Smith eeba6221b1 rebound paste to ^Y 2010-11-12 00:00:32 +00:00
Connor Lane Smith a0a99d10e1 removed libdc dependence 2010-11-11 23:56:39 +00:00
Connor Lane Smith 7cf66b443a -m flag to fix dwm selmon bug 2010-11-02 12:15:15 +00:00
Connor Lane Smith 038a78a3f4 updated manpage 2010-10-08 23:40:11 +01:00
Connor Lane Smith e0add428d2 cleaned up 2010-10-08 23:36:45 +01:00
Connor Lane Smith bf7b8e37ee dmenu_path.c (shell is a bottleneck) 2010-10-08 23:24:22 +01:00
Connor Lane Smith 610a0a8d12 fixed linking bug (thanks Jacob Nixdorf) & iscntrl corner case 2010-09-13 14:22:02 +01:00
Connor Lane Smith f0818217b3 simplification 2010-09-11 19:48:10 +01:00
Connor Lane Smith 3c366bd73d update to libdc, fixed utf8 bug 2010-09-11 13:37:01 +01:00
Connor Lane Smith 75a19c35bd arrow offset 2010-08-20 19:57:13 +01:00
Connor Lane Smith a5f31f5707 fixed width bug 2010-08-20 19:42:58 +01:00
Connor Lane Smith b81c1e88cd rebound paste, removed useless max widths 2010-08-20 13:50:44 +01:00
Connor Lane Smith 5376113039 new libdraw 2010-08-19 16:43:39 +01:00
Connor Lane Smith c7a8f17bd2 new libdraw 2010-08-19 16:17:57 +01:00
Connor Lane Smith 128d4cf376 resorted globals 2010-08-18 17:35:23 +01:00
Connor Lane Smith e4fdaba88d signed ints, ignore negative -l value 2010-08-18 17:33:34 +01:00
Connor Lane Smith 849f1dd7a3 fixed insert segfault, added nextrune 2010-08-12 15:35:51 +01:00
Connor Lane Smith 402dc2bc95 fixed paste 2010-08-11 15:02:03 +01:00
Connor Lane Smith 00a60cb7b2 new libdraw, replaced cistrstr with fstrstr, simpler readstdin 2010-08-11 14:24:25 +01:00
Connor Lane Smith e149c531b8 more efficient initfont 2010-08-10 18:09:02 +01:00
Connor Lane Smith 605e9b6c03 reverted calcoffsets 2010-08-10 14:14:37 +01:00
Connor Lane Smith caf5246268 simplifications 2010-08-10 13:38:49 +01:00
Connor Lane Smith 93af72e116 cursor fix + style 2010-08-09 11:54:46 +01:00
Connor Lane Smith 0b8072a5a9 added ^D, removed ^M 2010-08-06 14:16:08 +01:00
Connor Lane Smith 31ffcd3b9a new libdraw, typo fixes 2010-08-05 15:41:56 +01:00
Connor Lane Smith 9cf07b4b9b another typo fix (thanks, Gene Auyeung) 2010-08-03 18:19:59 +01:00
Connor Lane Smith 7a2782d02d typo fix 2010-08-03 17:29:53 +01:00
Connor Lane Smith 1c91c2a99c cleaned up 2010-08-03 17:18:24 +01:00
Connor Lane Smith b7695fa98c merged *{h,v} functions 2010-08-03 17:10:29 +01:00
Connor Lane Smith b54c179d58 retyped promptw 2010-08-02 15:13:33 +01:00
Connor Lane Smith 06c18808b6 replaced promptw 2010-08-02 14:49:14 +01:00
Connor Lane Smith a7aee433cc fixed bugs, no more config.h, updated manpage, new libdraw 2010-08-02 14:22:54 +01:00
Connor Lane Smith a3606ecb0e updated manpage, added paste, cleaned up, new libdraw 2010-07-31 14:56:27 +01:00
Connor Lane Smith 7d5fe17391 merged dmenu & dinput (clunky interface) 2010-07-30 13:40:56 +01:00
Connor Lane Smith 7f36736d11 underline match 2010-07-30 10:26:12 +01:00
Connor Lane Smith 115c01b74e new libdraw 2010-07-30 10:25:55 +01:00
Connor Lane Smith d77340ed53 fixed vlist select 2010-07-30 09:18:35 +01:00
Connor Lane Smith da7a799121 updated to libdraw tip 2010-07-27 13:40:32 +01:00
Connor Lane Smith 855a566319 added dmenu.h, common.c 2010-07-02 06:49:05 +01:00
Connor Lane Smith 29e8faed6c updated to new libdraw 2010-07-02 05:50:19 +01:00
Connor Lane Smith d9c24564d2 atexit cleanup 2010-07-02 03:44:01 +01:00
Connor Lane Smith 6ba5103df4 removed -e flag (too buggy), cleaned up 2010-06-30 22:42:15 +01:00
Connor Lane Smith 309d071df5 fixed no-input invisible text bug 2010-06-30 10:45:24 +01:00
Connor Lane Smith 26b9f3de0f libdraw now has own repo 2010-06-30 01:36:15 +01:00
Connor Lane Smith 7afd296c40 resizing vlist, new dinput binding 2010-06-30 00:52:14 +01:00
Connor Lane Smith cc8b3b999b cleaned up 2010-06-30 00:05:32 +01:00
Connor Lane Smith f2abaf8b30 decosmetics 2010-06-29 19:19:20 +01:00
Connor Lane Smith 340b176de6 dinput with dmenu flags, fixed usage & -v, cosmetics 2010-06-29 16:07:31 +01:00
Connor Lane Smith 18dcf73896 extended libdraw 2010-06-28 06:09:34 +01:00
Connor Lane Smith 9f3b0c6ea8 cleaned up 2010-06-25 04:33:41 +01:00
Connor Lane Smith 4508fd2c4e moved draw.c to libdraw.a 2010-06-24 17:44:35 +01:00
Connor Lane Smith 723361fa12 removed colors from dc 2010-06-24 16:24:04 +01:00
Connor Lane Smith 96c65400cc decoupled draw.c from dmenu & dinput 2010-06-24 16:18:18 +01:00
Connor Lane Smith 6c1d0e4d60 fixed offsets, updated eprint, cleaned up 2010-06-24 14:22:34 +01:00
Connor Lane Smith 6efe1932be fixed static symbols in config.def.h 2010-06-24 11:30:30 +01:00
Connor Lane Smith 8f7b62e2b6 fixed makefile 2010-06-23 14:29:32 +01:00
Connor Lane Smith 2ec16d9cb2 cleaned up 2010-06-23 13:49:24 +01:00
Connor Lane Smith 146bc23c11 cleaned up 2010-06-23 13:31:11 +01:00
Connor Lane Smith 595e797660 added draw.h 2010-06-23 13:29:15 +01:00
Connor Lane Smith bba30e2686 overlapping code 2010-06-23 12:42:08 +01:00
Connor Lane Smith 08b264393d typo fixes 2010-06-23 12:15:07 +01:00
Connor Lane Smith b4e63454e5 initial dmenu / dinput separation 2010-06-23 12:04:54 +01:00
Connor Lane Smith bff1526d31 fixed vlist cursor 2010-06-22 10:45:07 +01:00
Connor Lane Smith 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
Connor Lane Smith 97797d90a6 cleaned up 2010-06-20 01:19:17 +01:00
Connor Lane Smith 4983707c70 added ^K, optimisations 2010-06-20 00:44:26 +01:00
Connor Lane Smith 4229fb7b78 added sselp requirement to readme 2010-06-19 21:44:32 +01:00
Connor Lane Smith b27ffbd78b cleaned up 2010-06-16 15:36:17 +01:00
Connor Lane Smith 6366f94e36 fixed vlist paging, cleaned up 2010-06-11 09:24:33 +01:00
Connor Lane Smith 645f1d0dfc updated manpage 2010-06-09 10:13:26 +01:00
Anselm R Garbe d7d14e53da Added tag 4.1.1 for changeset 72749a826cab 2010-05-29 12:56:37 +01:00
Anselm R Garbe 851672cadc prepared bugfix release 4.1.1 2010-05-29 12:56:33 +01:00
Anselm R Garbe 504b797be8 applied Ramils patch 2010-05-29 12:55:38 +01:00
Anselm R Garbe 503ca75af4 Added tag 4.1 for changeset 844587572673 2010-05-28 11:42:54 +01:00
Anselm R Garbe 8623bf5d19 prepared dmenu-4.1 release 2010-05-28 11:42:49 +01:00
Connor Lane Smith 5bc288b2b1 fixed vlist alignment 2010-05-05 11:42:39 +01:00
Connor Lane Smith a6835349df cleaning up 2010-05-02 23:17:02 +01:00
Connor Lane Smith 518c9b72d1 fixed bad parenting, simpler vlist 2010-04-14 17:35:19 +00:00
Connor Lane Smith 09db46f54f fixed ^U cursor support 2010-04-13 20:14:45 +00:00
Connor Lane Smith e3623cd7f2 fixed 3 bugs and some inconsistency 2010-04-07 16:15:34 +00:00
Anselm R Garbe 0ba3bae981 applied Troels' patch, thanks Troels! 2010-04-01 21:40:11 +01:00
Anselm R Garbe ebeb4e4752 added Connor to LICENSE file 2010-04-01 21:32:06 +01:00
Anselm R Garbe 3472085f59 commited Connor's sanity patch 2010-04-01 21:31:09 +01:00
pancake 7ffe519816 apply nibble patch removing per-item length limit 2010-04-01 19:30:21 +02:00
pancake 29686bd1b8 add ^a and ^e keybindings 2010-04-01 19:10:41 +02:00
Anselm R Garbe 052ffae192 applied Connor's subwindow patch 2010-03-31 22:43:49 +01:00
Anselm R Garbe eededaa76f applied Connor's next nice patch, thanks a lot! 2010-03-31 22:37:41 +01:00
anselm@garbe.us 8e3e61170b applied cls' patch, thanks Connor! 2010-03-22 07:50:26 +00:00
Anselm R Garbe 37236f8840 applied Connor's patch, thanks! 2010-03-07 08:32:16 +00:00
Anselm R Garbe 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
Anselm R Garbe 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
Anselm R Garbe 0f4d3ffdb5 Added tag 4.0 for changeset 78f9f72cc9c6 2009-04-18 12:50:12 +01:00
Anselm R Garbe a1ad9c2a1c applied Matthias Christian Ott's sanity fixes (thanks a lot!) 2009-02-21 19:21:54 +00:00
a@null 51224dcb79 next release will be 4.0 2008-12-12 19:58:52 +00:00
a@null 4e74263ba0 minor modification 2008-12-09 21:55:47 +00:00
Anselm R Garbe bab59a9807 Added tag 3.9 for changeset 21a1ed9a69b9 2008-09-09 20:45:07 +01:00
Anselm R Garbe ef00902fd9 simplified initfont 2008-08-29 10:09:40 +01:00
Anselm R Garbe 3e60c5d836 reverted setlocale() call 2008-08-25 09:38:19 +01:00
Anselm R Garbe c24f22a36b removed artifact from wmii menu 2008-08-23 09:33:56 +01:00
Anselm R Garbe 44e372bb31 fixed a problem when backporting dwm's drawtext() 2008-08-18 19:24:29 +01:00
Anselm R Garbe 17232f493b abc... 2008-08-18 10:20:53 +01:00
Anselm R Garbe b95e61c9b7 removed the i = textnw... as remarked by Martin Hurton 2008-08-18 10:17:15 +01:00
Anselm R Garbe cf7e4c15a9 backported drawtext() simplifications to dmenu 2008-08-18 10:03:28 +01:00
Anselm R Garbe 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
Anselm R Garbe abd9fbb79a Added tag 3.8 for changeset 644b0798fccc 2008-07-29 19:20:53 +01:00
Anselm R Garbe 698ec259af similiar change as in dwm 2008-07-18 20:20:19 +01:00
Anselm R Garbe 88efbf3dd1 removed compiler warning if XINERAMA is disabled 2008-07-17 17:40:42 +01:00
Anselm R Garbe 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
Anselm R Garbe b89a9501c7 reverted uint/ulong introduction 2008-07-16 18:18:38 +01:00
Anselm R Garbe 65d655b371 minor update regarding locale support 2008-06-30 10:00:00 +01:00
Anselm R Garbe 2cef0ddb01 removed emalloc, used only once so obsolete 2008-06-21 16:43:12 +01:00
Anselm R Garbe 3f244b1d52 minor fix 2008-06-19 09:18:17 +01:00
Anselm R Garbe a6945d5094 Added tag 3.7 for changeset 0508a3a6ee10 2008-06-18 18:21:45 +01:00
Anselm R Garbe 8911aa1060 minor fix 2008-06-18 18:20:21 +01:00
Anselm R Garbe 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
Anselm R Garbe fcf26a38f1 using xidx 2008-06-13 12:04:04 +01:00
Anselm R Garbe 4fc6cbe608 yet another cosmetic change 2008-06-13 11:53:53 +01:00
Anselm R Garbe a45f106d3c cosmetic fixes 2008-06-13 11:46:50 +01:00
Anselm R Garbe 596033b781 s/unsigned int/uint/, s/unsigned long/ulong/ 2008-05-22 11:15:11 +01:00
Anselm R Garbe 357558798c foo 2008-05-20 15:07:42 +01:00
anselm@anselm1 1f6af5e78f added Xinerama support to dmenu, reverted -b behavior, removed -x, -y, -w 2008-05-19 20:29:32 +01:00
Anselm R Garbe f3617bd7ca no exe should be unquoted, agreed to Peter Hartlich 2008-04-10 18:12:00 +01:00
Anselm R Garbe 096fb3723b fixed unquoted dmenu_run $exe-use reported by Jukka 2008-04-10 16:46:32 +01:00
Anselm R Garbe 6423288394 though sticking to |uniq 2008-04-09 23:32:46 +01:00
Anselm R Garbe 7195e941c1 re-applied Peter Hartlich's and Jukkas dmenu-related patches, for odd reasons they disappeared 2008-04-09 23:31:49 +01:00
anselm@anselm1 12805b69ac Added tag 3.6 for changeset 0bc2751d06e8 2008-04-03 21:56:42 +01:00
Sander van Dijk 1538bb7426 fix typo 2008-03-25 19:18:16 +01:00
Anselm R Garbe cbe5e88e4f using limits.h 2008-03-25 10:18:17 +00:00
Anselm R Garbe 2fe3ccdf58 bugfix of the -0 case in dmenu (thanks to Sander for his hint) 2008-03-25 09:43:34 +00:00
Anselm R Garbe 07d82c0c2a applied Jukkas hotfix 2008-03-24 15:56:41 +00:00
Sander van Dijk e7423f8fc6 more cosmetics 2008-03-23 22:06:09 +01:00
Sander van Dijk 61976c292b cosmetics 2008-03-23 21:17:35 +01:00
Sander van Dijk 63c9e30a76 made some whitespacing consistent. 2008-03-23 21:11:42 +01:00
sander@localhost 015f51ac46 removed unused variable nitem. 2008-03-23 12:09:29 +01:00
anselm@anselm1 542c58d8d0 several performance tweaks 2008-03-22 14:52:00 +00:00
Anselm R Garbe 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
Anselm R Garbe d058e83570 Added tag 3.5 for changeset 05e5bd706b3b 2008-03-13 16:53:25 +00:00
Anselm R Garbe 301b4e5591 applied next patch of Sander 2008-03-13 12:02:29 +00:00
anselm@anselm1 38b866ba34 applied Sanders patch 2008-03-12 21:37:43 +00:00
Anselm R Garbe 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
Anselm R Garbe 7804354106 removed set 2008-02-12 09:42:48 +00:00
anselm@aab 6d8e68dcfd updated 2008-02-11 11:22:38 +00:00
anselm@anselm1 d8688f7a4f added dmenu run 2007-12-22 12:20:20 +00:00
Anselm R. Garbe 09d0926bb9 Added tag 3.4 for changeset 9ab649b3b3e5 2007-10-25 20:26:17 +02:00
Anselm R. Garbe adc4ec02c0 adapted c99 for pedantic checks, even if those checks are somewhat broken 2007-10-10 18:57:51 +02:00
Anselm R. Garbe 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
Anselm R. Garbe 1c488e6dac fixed font definition 2007-10-01 11:44:25 +02:00
Anselm R. Garbe 03c546c6b3 fixed dmenu 2007-09-30 19:20:31 +02:00
Anselm R. Garbe fdc1dba7ce using saner defaults 2007-09-30 12:47:40 +02:00
Anselm R. Garbe 3439470a47 applied new color nuance 2007-09-27 18:55:05 +02:00
Anselm R. Garbe 6674bac1d3 applied my favorite color scheme 2007-09-26 19:15:47 +02:00
arg@suckless.org 72a8eb412f casting char to int when using tolower (thanks to Jukkas careful cosmetic checking!) 2007-09-24 15:04:31 +02:00
Anselm R. Garbe 975dfb4163 switching to white 2007-09-23 18:49:24 +02:00
Anselm R. Garbe 2e898a308f yet another cosmetic fix 2007-09-23 18:32:08 +02:00
Anselm R. Garbe 6514b07ad2 small cosmetic fix 2007-09-23 18:31:19 +02:00
Anselm R. Garbe 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
Anselm R. Garbe 70cb32b021 Added tag 3.3 for changeset 709df5a4bad7 2007-09-22 09:12:50 +02:00
arg@suckless.org 56f9e26b72 applied yiyus initfont fix 2007-09-19 17:33:35 +02:00
Anselm R. Garbe d094ebea96 reorganized 2007-09-17 20:53:14 +02:00
arg@suckless.org ccf4d7166f next version is 3.3 2007-09-17 09:13:21 +02:00
Anselm R. Garbe 06ae894434 micromizing dmenu step 1 2007-09-16 20:14:09 +02:00
Anselm R. Garbe b97783b07f fixed fallback 2007-09-15 20:28:20 +02:00
arg@f00b4r 11cb2e7dcc applied ido-matching to dmenu 2007-07-24 18:19:09 +02:00
Anselm R. Garbe 07239bbddd foooooo 2007-06-01 12:28:30 +02:00
Anselm R. Garbe 124bfd4a08 Added tag 3.2 for changeset e4c81a78ffba 2007-05-30 12:22:38 +02:00
Anselm R. Garbe d27e3c1092 referred to LICENSE file 2007-05-30 12:19:06 +02:00
Anselm R. Garbe 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
Kris Maglione 53e92b5c17 Fix the uptodate logic (uptodate if !find newer dirs than the cache). 2007-05-23 19:38:23 -04:00
Kris Maglione d50ff5ca11 Silence the first find in dmenu_path. 2007-05-23 18:35:05 -04:00
Kris Maglione 383e40dc21 Fix grouping in dmenu_path. 2007-05-23 16:59:38 -04:00
Kris Maglione 8369e1736b Merge. 2007-05-23 16:44:15 -04:00
Kris Maglione 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
Anselm R. Garbe 4ebd7c4a21 removed some superflous strncmp's 2007-05-23 22:32:43 +02:00
Anselm R. Garbe dfe95cb546 made dmenu_path the way anydot proposed in response to Jukka 2007-05-23 22:13:46 +02:00
Anselm R. Garbe 8b633bf17d applied Jukka's fix 2007-05-23 13:22:27 +02:00
Anselm R. Garbe 64697cdd0c Added tag 3.1 for changeset 8f0f917ac988 2007-05-21 14:36:03 +02:00
Anselm R. Garbe 5a3dfb1c40 removed strip, added -s to LDFLAGs 2007-05-15 13:44:41 +02:00
Anselm R. Garbe 4042a11e51 applied anydot's dmenu_path caching patch, thank you! 2007-05-14 11:56:41 +02:00
Anselm R. Garbe aa2f73fc88 fixed a small bug in dmenu when an empty font is supplied 2007-05-02 15:25:52 +02:00
Anselm R. Garbe f189781bbd Added tag 3.0 for changeset 59b3024854db 2007-04-19 09:27:08 +02:00
Anselm R. Garbe 0e19146d5f making copyright notice more compact 2007-04-13 11:36:44 +02:00
Anselm R. Garbe 85a151c6a4 next version is 2.9 2007-03-28 08:17:57 +02:00
Anselm R. Garbe 1fa4fa386a allowing numpad keys as inpyt 2007-03-27 16:52:50 +02:00
Anselm R. Garbe e1515a2fdc Added tag 2.8 for changeset dd3d02b07cac 2007-03-07 13:30:57 +01:00
Anselm R. Garbe f555908cef attempt to grab the keyboard only 1000 times, not forever. 2007-03-07 11:01:14 +01:00
Anselm R. Garbe 73120414e2 reverting keyboard grab to root window - invoking several dmenu's now works again... 2007-03-07 10:54:21 +01:00
Kris Maglione 9911455f5b Wait for an Expose and draw the menu immediately after mapping the window. 2007-03-06 03:24:40 -05:00
Anselm R. Garbe 2772c51e79 Added tag 2.7 for changeset fbd9e9d63f20 2007-03-05 11:25:18 +01:00
Anselm R. Garbe 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
Anselm R. Garbe 724f72142f also, don't set the font all the time 2007-03-02 15:16:36 +01:00
Anselm R. Garbe 5b8dce15d3 Added tag 2.6 for changeset 775f761a5647 2007-03-01 15:47:54 +01:00
Anselm R. Garbe 063c3d26e9 useless var declaration prev_nitem 2007-02-27 14:44:21 +01:00
Anselm R. Garbe 03c2b05bb2 changed Backspace/C-w behavior (now it only removes a single character) 2007-02-26 14:07:19 +01:00
Anselm R. Garbe 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
Anselm R. Garbe 6c0e05eb0d next is 2.6, but not yet ;) 2007-02-26 10:47:52 +01:00
Kris Maglione 900d34347b Escape -s in dmenu.1 2007-02-25 16:41:05 -05:00
Anselm R. Garbe 4d0cc17794 Added tag 2.5 for changeset 041143e9fc54 2007-02-24 15:38:26 +01:00
Anselm R. Garbe 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
Anselm R. Garbe 598d72fba9 removed superfluous externs as well 2007-02-24 14:07:40 +01:00
Anselm R. Garbe 007be12f2b using the old-style fashion we uses earlier 2007-02-23 15:28:25 +01:00
Anselm R. Garbe 6b5b580aff fixed a bug when dmenu is run with -v 2007-02-23 14:39:54 +01:00
Anselm R. Garbe d8b48d64e1 Added tag 2.4.2 for changeset 1ca5d430524e 2007-02-23 13:51:23 +01:00
Anselm R. Garbe a71424ac0e ok 2.4.2 2007-02-23 13:51:06 +01:00
Anselm R. Garbe f1ab687c62 Added tag 2.4.1 for changeset 03e83e2788c8 2007-02-23 13:28:43 +01:00
Anselm R. Garbe 68a24f5535 hotfix 2007-02-23 13:28:38 +01:00
Anselm R. Garbe 47b37834c4 Added tag 2.4 for changeset 9e9036cbfb4b 2007-02-23 10:42:00 +01:00
Anselm R. Garbe 5f436fdcb7 added dmenu_path convenience script 2007-02-23 10:16:43 +01:00
Anselm R. Garbe de34639883 made Fnt an anonymous struct 2007-02-22 18:16:35 +01:00
Anselm R. Garbe 18592825d2 Added tag 2.3 for changeset b6e09682c8adcb6569656bee73c311f9ab457715 2007-02-21 11:05:19 +01:00
Anselm R. Garbe 3bc1f99e3c applied the fix inspired by a recent wmii commit 2007-02-21 10:59:36 +01:00
Anselm R. Garbe 8a10b35c64 renamed getcolor to initcolor 2007-02-20 13:57:05 +01:00
Anselm R. Garbe e4fc905317 s/setfont/initfont/ 2007-02-20 13:54:37 +01:00
Anselm R. Garbe a1913a6af7 readded draw.c again (except getcolor and setfont) 2007-02-20 13:54:00 +01:00
Anselm R. Garbe 66b2e8379f removed -t, now using isatty() instead of select() to prevent execution from an interactive shell 2007-02-19 21:18:36 +01:00
Anselm R. Garbe 665488a6ee removed draw.c, implemented C-w handling (backward word deletion) 2007-02-19 15:49:50 +01:00
Anselm R. Garbe 1e01ca0317 Added tag 2.2 for changeset 90f0e34e7f11 2007-02-14 09:42:02 +01:00
Anselm R. Garbe f3c12a7bff fixed Copyright notice in Makefile 2007-02-08 14:10:17 +01:00
Anselm R. Garbe 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
Anselm R. Garbe 2bac5599b3 letting dmenu appear at the bottom by default 2007-02-08 11:10:29 +01:00
Anselm R. Garbe dbccf6fbff got rid of LD, inspired by JGs patch to wmii 2007-02-05 11:10:41 +01:00
Anselm R. Garbe aea9bfec5e Added tag 2.1 for changeset 7656557298c9 2007-01-17 11:10:31 +01:00
Anselm R. Garbe 6175a39e8e hotfix changes 2007-01-17 11:10:26 +01:00
Anselm R. Garbe 2c7ff85f24 Added tag 2.1 for changeset d91c79020430 2007-01-17 11:10:09 +01:00
Anselm R. Garbe 447046f7ae Added tag 2.0 for changeset 1fce5c464fcd 2007-01-16 11:42:09 +01:00
Anselm R. Garbe b76632b9e3 small fix 2007-01-16 11:39:26 +01:00
Anselm R. Garbe f8f5b27036 removed useless mx, my 2007-01-16 11:38:31 +01:00
Anselm R. Garbe d6bf35caad applied new default colors 2007-01-16 11:24:51 +01:00
Anselm R. Garbe 507c030b5b small fix of Control-j in dmenu.1 2007-01-16 11:07:30 +01:00
Anselm R. Garbe 0245394e4d Added tag 1.9 for changeset c7f5f4d54317 2007-01-12 12:43:44 +01:00
Anselm R. Garbe b6cd6ed266 added evil key support to dmenu 2007-01-11 15:52:37 +01:00
Anselm R. Garbe 09813fcf2c s/Mod1-Shift-g/Mod1-G/ in fact Sander is right 2007-01-11 13:51:15 +01:00
Anselm R. Garbe 64d68b7de9 documenting undocumented vi-alike shortcuts of dmenu 2007-01-11 11:41:16 +01:00
Anselm R. Garbe eaf8909378 commented recent Control-shortcut additions 2007-01-11 10:17:01 +01:00
Anselm R. Garbe c0fcfb7827 applied Sanders dmenu_ctrlchars.patch (thanks!) 2007-01-10 23:07:03 +01:00
Anselm R. Garbe a45d6983ab applied Alexis Hildebrandts patches 2007-01-10 18:06:16 +01:00
arg@mig29 08420a935b corrections 2007-01-02 15:44:32 +01:00
arg@mig29 deea1fb5ab corrected 2007-01-02 15:41:13 +01:00
arg@mig29 771c0cb607 next version will contain updated copyright notice 2007-01-02 15:38:44 +01:00
arg@mig29 43a19425af Added tag 1.8 for changeset d3e6fa22ae45b38b1bdb0d813390365e5930360b 2006-12-19 11:49:38 +01:00
arg@mig29 bbfd5391ac fixed a typo in dmenu.1 2006-12-19 11:49:28 +01:00
arg@mig29 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
arg@mig29 989649b5a5 added wmii reference to dmenu(1) 2006-12-18 13:46:44 +01:00
arg@mig29 f8d2a29a20 agreed with Sander 2006-12-18 13:25:11 +01:00
arg@mig29 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
arg@mig29 201b056e39 hotfix 2006-12-14 14:41:53 +01:00
arg@mig29 3dcdbe2a57 added vi-like key-bindings for keyboards without cursor keys (they are undocumented features) 2006-12-14 14:40:58 +01:00
arg@mig29 5336608a86 Added tag 1.7.1 for changeset 3696d77aaf02f5d15728dde3b9e35abcaf291496 2006-12-14 09:45:11 +01:00
arg@mig29 d398a2e318 foo 2006-12-14 09:45:06 +01:00
arg@mig29 2829009138 silent hotfix 2006-12-14 09:34:24 +01:00
arg@mig29 cae2fbdf38 Added tag 1.7.1 for changeset 8e0b9b09bf83c429c73e60a23997f32877a645bf 2006-12-14 09:30:31 +01:00
arg@mig29 225cd764c3 applied hotfix of sander 2006-12-14 09:30:23 +01:00
arg@mig29 279966a16f Added tag 1.7 for changeset 58dbef4aef3d45c7a3da6945e53c9667c0f02d5b 2006-12-14 08:51:21 +01:00
arg@mig29 9bd80b3968 changed text in dmenu manpage 2006-12-13 14:36:09 +01:00
arg@mig29 65912f2a96 added prompt option (-p 'prompt text'), documented in man page as well 2006-12-13 14:14:41 +01:00
arg@mig29 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
arg@mig29 e19e42adbb fixed diagnostic error message 2006-12-08 11:12:11 +01:00
arg@mig29 796c4fb9e5 removed hardcoded 'fixed' fallback, useless and misleading 2006-12-08 10:41:16 +01:00
arg@mig29 93c3f930c5 Added tag 1.6 for changeset dcc5427f99f51a978386a0dd770467cd911ac84b 2006-12-07 14:54:47 +01:00
arg@mig29 c69f397bb9 found compromise 2006-12-07 14:38:31 +01:00
arg@mig29 b9fbd59c8a people should define fixed being compatible with their locale 2006-12-07 12:03:47 +01:00
arg@mig29 da2b90ddd1 using -*-fixed-*-*-*-*-*-*-*-*-*-*-iso10646-* fixed by default 2006-12-07 11:55:46 +01:00
arg@mig29 dd7ee0dae1 also fixing dmenu accordingly 2006-12-07 10:06:06 +01:00
arg@mig29 250aa199bb only setting LC_CTYPE 2006-12-05 13:30:37 +01:00
arg@mig29 5d43e9243c enforcing using imcomplete fonsets anyways 2006-12-05 10:31:20 +01:00
arg@mig29 1026eb8308 Added tag 1.5 for changeset e071fb045bd9e8574947acff7196360bc0270e68 2006-11-30 09:21:14 +01:00
15 changed files with 942 additions and 681 deletions

No files matched your search

+35
View File
@@ -12,3 +12,38 @@ e8c1e9733752db12f2dbd1fa93c46f5806242ba9 1.1
bee7fe6d1189174d0204ca3195b83cdc1bb4f82e 1.2 bee7fe6d1189174d0204ca3195b83cdc1bb4f82e 1.2
2eb9997be51cb1b11a8900728ccc0904f9371157 1.3 2eb9997be51cb1b11a8900728ccc0904f9371157 1.3
df3fbb050004c544d14e43c36f6a94cca6ed4a69 1.4 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
379813a051f03a1b20bdbfdc2d2d1d2d794ace48 4.2
abb6579a324fffdf6a23c2fa4c32911277da594a 4.2.1
14c79f054bdf43ff3213af8e60a783192e92a018 4.3
34a2d77049a95b02f3332a0b88f9370965ebcfad 4.3.1
2b105eaae8315b076da93056da9ecd60de5a7ac9 4.4
+7 -2
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-2011 Connor Lane Smith <cls@lubutu.com>
(C)opyright MMVI Sander van Dijk <a dot h dot vandijk at gmail dot com> © 2006-2011 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"),
+27 -18
View File
@@ -1,57 +1,66 @@
# 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 SRC = dmenu.c draw.c lsx.c
OBJ = ${SRC:.c=.o} OBJ = ${SRC:.c=.o}
all: options dmenu all: options dmenu lsx
options: options:
@echo dmenu build options: @echo dmenu build options:
@echo "CFLAGS = ${CFLAGS}" @echo "CFLAGS = ${CFLAGS}"
@echo "LDFLAGS = ${LDFLAGS}" @echo "LDFLAGS = ${LDFLAGS}"
@echo "CC = ${CC}" @echo "CC = ${CC}"
@echo "LD = ${LD}"
.c.o: .c.o:
@echo CC $< @echo CC -c $<
@${CC} -c ${CFLAGS} $< @${CC} -c $< ${CFLAGS}
${OBJ}: dmenu.h config.mk ${OBJ}: config.mk
dmenu: ${OBJ} dmenu: dmenu.o draw.o
@echo LD $@ @echo CC -o $@
@${LD} -o $@ ${OBJ} ${LDFLAGS} @${CC} -o $@ dmenu.o draw.o ${LDFLAGS}
@strip $@
lsx: lsx.o
@echo CC -o $@
@${CC} -o $@ lsx.o ${LDFLAGS}
clean: clean:
@echo cleaning @echo cleaning
@rm -f dmenu ${OBJ} dmenu-${VERSION}.tar.gz @rm -f dmenu lsx ${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 dmenu.h ${SRC} dmenu-${VERSION} @cp LICENSE Makefile README config.mk dmenu.1 draw.h dmenu_run lsx.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 ${DESTDIR}${PREFIX}/bin @cp -f dmenu dmenu_run lsx ${DESTDIR}${PREFIX}/bin
@chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu @chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu
@echo installing manual page to ${DESTDIR}${MANPREFIX}/man1 @chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu_run
@chmod 755 ${DESTDIR}${PREFIX}/bin/lsx
@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" < lsx.1 > ${DESTDIR}${MANPREFIX}/man1/lsx.1
@chmod 644 ${DESTDIR}${MANPREFIX}/man1/dmenu.1 @chmod 644 ${DESTDIR}${MANPREFIX}/man1/dmenu.1
@chmod 644 ${DESTDIR}${MANPREFIX}/man1/lsx.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_run
@rm -f ${DESTDIR}${PREFIX}/bin/lsx
@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/lsx.1
.PHONY: all options clean dist install uninstall .PHONY: all options clean dist install uninstall
+3 -3
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
+10 -10
View File
@@ -1,7 +1,5 @@
# dmenu version # dmenu version
VERSION = 1.5 VERSION = 4.4.1
# Customize below to fit your system
# paths # paths
PREFIX = /usr/local PREFIX = /usr/local
@@ -10,16 +8,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. -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 -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
LDFLAGS = ${LIBS} CFLAGS = -ansi -pedantic -Wall -Os ${INCS} ${CPPFLAGS}
#CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\" LDFLAGS = -s ${LIBS}
#LDFLAGS = -g ${LIBS}
# compiler and linker # compiler and linker
CC = cc CC = cc
LD = ${CC}
+77 -58
View File
@@ -1,80 +1,99 @@
.TH DMENU 1 dmenu-VERSION .TH DMENU 1 dmenu\-VERSION
.SH NAME .SH NAME
dmenu \- dynamic menu dmenu \- dynamic menu
.SH SYNOPSIS .SH SYNOPSIS
.B dmenu .B dmenu
.RB [ \-font " <name>"] .RB [ \-b ]
.RB [ \-normbg " <color>"] .RB [ \-f ]
.RB [ \-normfg " <color>"] .RB [ \-i ]
.RB [ \-selbg " <color>"] .RB [ \-l
.RB [ \-selfg " <color>"] .IR lines ]
.RB [ \-t " <seconds>"] .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 ]
.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, originally designed for
.BR dwm (1). .IR dwm (1).
It manages huge amounts (up to 10.000 and more) of user defined menu items It manages huge numbers of user\-defined menu items efficiently.
efficiently. .P
.SS Options dmenu reads a list of newline\-separated items from stdin and creates a menu.
When the user selects an item or enters any text and presses Return, their
choice is printed to stdout 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.
.SH OPTIONS
.TP .TP
.B \-font <name> .B \-b
defines the font. dmenu appears at the bottom of the screen.
.TP .TP
.B \-normbg <color> .B \-f
defines the normal background color (#RGB, #RRGGBB, and color names are supported). dmenu grabs the keyboard before reading stdin. This is faster, but may lock up
X if stdin is from a terminal.
.TP .TP
.B \-normfg <color> .B \-i
defines the normal foreground color (#RGB, #RRGGBB, and color names are supported). dmenu matches menu items case insensitively.
.TP .TP
.B \-selbg <color> .BI \-l " lines"
defines the selected background color (#RGB, #RRGGBB, and color names are supported). dmenu lists items vertically, with the given number of lines.
.TP .TP
.B \-selfg <color> .BI \-p " prompt"
defines the selected foreground color (#RGB, #RRGGBB, and color names are supported). defines the prompt to be displayed to the left of the input field.
.TP .TP
.B \-t <seconds> .BI \-fn " font"
defines the seconds to wait for standard input, before exiting (default is 3). defines the font or font set used.
.TP
.BI \-nb " color"
defines the normal background color.
.IR #RGB ,
.IR #RRGGBB ,
and X color names are supported.
.TP
.BI \-nf " color"
defines the normal foreground color.
.TP
.BI \-sb " color"
defines the selected background color.
.TP
.BI \-sf " color"
defines the selected foreground color.
.TP .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. Besides standard Unix line
menu. When the user selects an item or enters any text and presses Return, his editing and item selection (arrow keys, page up/down, home and end), the
choice is printed to standard output and dmenu terminates. following keys are recognized:
.P
dmenu is completely controlled by the keyboard. The following keys are recognized:
.TP .TP
.B Any printable character .B Tab (Ctrl\-i)
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
Select the previous/next item.
.TP
.B Tab
Copy the selected item to the input field. Copy the selected item to the input field.
.TP .TP
.B Return .B Return (Ctrl\-j)
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 .B Shift\-Return (Ctrl\-Shift\-j)
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 .B Escape (Ctrl\-c)
Quit without selecting an item. Returns Exit without selecting an item, returning failure.
.B 1
on termination.
.TP .TP
.B Backspace (Control-h) .B Ctrl\-y
Remove enough characters from the input field to change its filtering effect. Paste the current X selection into the input field.
.TP
.B Control-u
Remove all characters from the input field.
.SH SEE ALSO .SH SEE ALSO
.BR dwm (1) .IR dwm (1),
.IR lsx (1)
+538
View File
@@ -0,0 +1,538 @@
/* See LICENSE file for copyright and license details. */
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.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 *left, *right;
};
static void appenditem(Item *item, Item **list, Item **last);
static void calcoffsets(void);
static char *cistrstr(const char *s, const char *sub);
static void drawmenu(void);
static void grabkeyboard(void);
static void insert(const char *str, ssize_t n);
static void keypress(XKeyEvent *ev);
static void match(Bool sub);
static size_t nextrune(int inc);
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, promptw;
static int lines = 0;
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, *matchend;
static Item *prev, *curr, *next, *sel;
static Window win;
static int (*fstrncmp)(const char *, const char *, size_t) = strncmp;
static char *(*fstrstr)(const char *, const char *) = strstr;
int
main(int argc, char *argv[]) {
Bool fast = False;
int i;
for(i = 1; i < argc; i++)
/* single flags */
if(!strcmp(argv[i], "-v")) {
puts("dmenu-"VERSION", © 2006-2011 dmenu engineers, see LICENSE for details");
exit(EXIT_SUCCESS);
}
else if(!strcmp(argv[i], "-b"))
topbar = False;
else if(!strcmp(argv[i], "-f"))
fast = True;
else if(!strcmp(argv[i], "-i")) {
fstrncmp = strncasecmp;
fstrstr = cistrstr;
}
else if(i+1 == argc)
usage();
/* double flags */
else if(!strcmp(argv[i], "-l"))
lines = 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);
if(fast) {
grabkeyboard();
readstdin();
}
else {
readstdin();
grabkeyboard();
}
setup();
run();
return EXIT_FAILURE; /* unreachable */
}
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) {
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;
}
char *
cistrstr(const char *s, const char *sub) {
size_t len;
for(len = strlen(sub); *s; s++)
if(!strncasecmp(s, sub, len))
return (char *)s;
return NULL;
}
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);
}
void
grabkeyboard(void) {
int i;
for(i = 0; i < 1000; i++) {
if(XGrabKeyboard(dc->dpy, DefaultRootWindow(dc->dpy), True,
GrabModeAsync, GrabModeAsync, CurrentTime) == GrabSuccess)
return;
usleep(1000);
}
eprintf("cannot grab keyboard\n");
}
void
insert(const char *str, 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], str, n);
cursor += n;
match(n > 0 && text[cursor] == '\0');
}
void
keypress(XKeyEvent *ev) {
char buf[32];
KeySym ksym;
XLookupString(ev, buf, sizeof buf, &ksym, NULL);
if(ev->state & ControlMask) {
KeySym lower, upper;
XConvertCase(ksym, &lower, &upper);
switch(lower) {
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_m: ksym = XK_Return; break;
case XK_n: ksym = XK_Up; break;
case XK_p: ksym = XK_Down; break;
case XK_k: /* delete right */
text[cursor] = '\0';
match(False);
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;
default:
return;
}
}
switch(ksym) {
default:
if(!iscntrl(*buf))
insert(buf, strlen(buf));
break;
case XK_Delete:
if(text[cursor] == '\0')
return;
cursor = nextrune(+1);
/* fallthrough */
case XK_BackSpace:
if(cursor == 0)
return;
insert(NULL, nextrune(-1) - cursor);
break;
case XK_End:
if(text[cursor] != '\0') {
cursor = strlen(text);
break;
}
if(next) {
curr = matchend;
calcoffsets();
curr = prev;
calcoffsets();
while(next && (curr = curr->right))
calcoffsets();
}
sel = matchend;
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;
}
/* fallthrough */
case XK_Up:
if(sel && sel->left && (sel = sel->left)->right == curr) {
curr = prev;
calcoffsets();
}
break;
case XK_Next:
if(!next)
return;
sel = curr = next;
calcoffsets();
break;
case XK_Prior:
if(!prev)
return;
sel = curr = prev;
calcoffsets();
break;
case XK_Return:
case XK_KP_Enter:
puts((sel && !(ev->state & ShiftMask)) ? sel->text : text);
exit(EXIT_SUCCESS);
case XK_Right:
if(text[cursor] != '\0') {
cursor = nextrune(+1);
break;
}
/* fallthrough */
case XK_Down:
if(sel && sel->right && (sel = sel->right) == next) {
curr = next;
calcoffsets();
}
break;
case XK_Tab:
if(!sel)
return;
strncpy(text, sel->text, sizeof text);
cursor = strlen(text);
match(True);
break;
}
drawmenu();
}
void
match(Bool sub) {
size_t len = strlen(text);
Item *lexact, *lprefix, *lsubstr, *exactend, *prefixend, *substrend;
Item *item, *lnext;
lexact = lprefix = lsubstr = exactend = prefixend = substrend = NULL;
for(item = sub ? matches : items; item && item->text; item = lnext) {
lnext = sub ? item->right : item + 1;
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);
}
matches = lexact;
matchend = exactend;
if(lprefix) {
if(matchend) {
matchend->right = lprefix;
lprefix->left = matchend;
}
else
matches = lprefix;
matchend = prefixend;
}
if(lsubstr) {
if(matchend) {
matchend->right = lsubstr;
lsubstr->left = matchend;
}
else
matches = lsubstr;
matchend = substrend;
}
curr = sel = matches;
calcoffsets();
}
size_t
nextrune(int inc) {
ssize_t n;
for(n = cursor + inc; n + inc >= 0 && (text[n] & 0xc0) == 0x80; n += inc);
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 : (ssize_t)strlen(p));
XFree(p);
drawmenu();
}
void
readstdin(void) {
char buf[sizeof text], *p, *maxstr = NULL;
size_t i, max = 0, size = 0;
for(i = 0; fgets(buf, sizeof buf, stdin); i++) {
if(i+1 >= size / sizeof *items)
if(!(items = realloc(items, (size += BUFSIZ))))
eprintf("cannot realloc %u bytes:", size);
if((p = strchr(buf, '\n')))
*p = '\0';
if(!(items[i].text = strdup(buf)))
eprintf("cannot strdup %u bytes:", strlen(buf)+1);
if(strlen(items[i].text) > max)
max = strlen(maxstr = items[i].text);
}
if(items)
items[i].text = NULL;
inputw = maxstr ? textw(dc, maxstr) : 0;
}
void
run(void) {
XEvent ev;
while(!XNextEvent(dc->dpy, &ev))
switch(ev.type) {
case Expose:
if(ev.xexpose.count == 0)
mapdc(dc, win, mw, mh);
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 = DefaultScreen(dc->dpy);
Window root = RootWindow(dc->dpy, screen);
XSetWindowAttributes wa;
#ifdef XINERAMA
int n;
XineramaScreenInfo *info;
#endif
normcol[ColBG] = getcolor(dc, normbgcolor);
normcol[ColFG] = getcolor(dc, normfgcolor);
selcol[ColBG] = getcolor(dc, selbgcolor);
selcol[ColFG] = getcolor(dc, selfgcolor);
utf8 = XInternAtom(dc->dpy, "UTF8_STRING", False);
/* 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-1; i++)
if(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);
}
promptw = prompt ? textw(dc, prompt) : 0;
inputw = MIN(inputw, mw/3);
match(False);
/* 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);
XMapRaised(dc->dpy, win);
resizedc(dc, mw, mh);
drawmenu();
}
void
usage(void) {
fputs("usage: dmenu [-b] [-f] [-i] [-l lines] [-p prompt] [-fn font]\n"
" [-nb color] [-nf color] [-sb color] [-sf color] [-v]\n", stderr);
exit(EXIT_FAILURE);
}
-52
View File
@@ -1,52 +0,0 @@
/* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include <X11/Xlib.h>
#include <X11/Xlocale.h>
#define FONT "fixed"
#define NORMBGCOLOR "#333366"
#define NORMFGCOLOR "#cccccc"
#define SELBGCOLOR "#666699"
#define SELFGCOLOR "#eeeeee"
#define SPACE 30 /* px */
/* color */
enum { ColFG, ColBG, ColLast };
typedef struct DC DC;
typedef struct Fnt Fnt;
struct Fnt {
XFontStruct *xfont;
XFontSet set;
int ascent;
int descent;
int height;
};
struct DC {
int x, y, w, h;
unsigned long norm[ColLast];
unsigned long sel[ColLast];
Drawable drawable;
Fnt font;
GC gc;
}; /* draw context */
extern int screen;
extern Display *dpy;
extern DC dc; /* global drawing context */
/* draw.c */
extern void drawtext(const char *text,
unsigned long col[ColLast]); /* draws text with the defined color tuple */
extern unsigned long getcolor(const char *colstr); /* returns color of colstr */
extern void setfont(const char *fontstr); /* sets global font */
extern unsigned int textw(const char *text); /* returns width of text in px */
/* util.c */
extern void *emalloc(unsigned int size); /* allocates memory, exits on error */
extern void eprint(const char *errstr, ...); /* prints errstr and exits with 1 */
extern char *estrdup(const char *str); /* duplicates str, exits on allocation error */
Executable
+9
View File
@@ -0,0 +1,9 @@
#!/bin/sh
CACHE=${XDG_CACHE_HOME:-"$HOME/.cache"}/dmenu_run
(
IFS=:
if test "`ls -dt $PATH "$CACHE" 2> /dev/null | sed 1q`" != "$CACHE"; then
mkdir -p "`dirname "$CACHE"`" && lsx $PATH | sort -u > "$CACHE"
fi
)
cmd=`dmenu "$@" < "$CACHE"` && exec sh -c "$cmd"
+152 -106
View File
@@ -1,131 +1,177 @@
/* (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com> /* See LICENSE file for copyright and license details. */
* See LICENSE file for license details. #include <locale.h>
*/ #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 DEFAULTFN "fixed"
static unsigned int static Bool loadfont(DC *dc, const char *fontstr);
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, unsigned long col[ColLast]) { drawrect(DC *dc, int x, int y, unsigned int w, unsigned int h, Bool fill, unsigned long color) {
int x, y, w, h; XSetForeground(dc->dpy, dc->gc, color);
static char buf[256]; if(fill)
unsigned int len, olen; XFillRectangle(dc->dpy, dc->canvas, dc->gc, dc->x + x, dc->y + y, w, h);
XGCValues gcv; else
XRectangle r = { dc.x, dc.y, dc.w, dc.h }; 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);
XSetForeground(dpy, dc.gc, col[ColBG]);
XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
if(!text)
return;
w = 0;
olen = len = strlen(text);
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) for(mn = MIN(n, sizeof buf); textnw(dc, text, mn) + dc->font.height/2 > dc->w; mn--)
buf[--len] = 0; if(mn == 0)
if(len < olen) { return;
if(len > 1) memcpy(buf, text, mn);
buf[len - 1] = '.'; if(mn < n)
if(len > 2) for(n = MAX(mn-3, 0); n < mn; buf[n++] = '.');
buf[len - 2] = '.';
if(len > 3) drawrect(dc, 0, 0, dc->w, dc->h, True, BG(dc, col));
buf[len - 3] = '.'; drawtextn(dc, buf, mn, col);
} }
if(w > dc.w)
return; /* too long */ void
gcv.foreground = col[ColFG]; drawtextn(DC *dc, const char *text, size_t n, unsigned long col[ColLast]) {
if(dc.font.set) { int x = dc->x + dc->font.height/2;
XChangeGC(dpy, dc.gc, GCForeground, &gcv); int y = dc->y + dc->font.ascent+1;
XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc,
x, y, buf, len); 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 | GCFont, &gcv); XDrawString(dc->dpy, dc->canvas, dc->gc, x, y, text, n);
XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
} }
} }
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 unsigned long
getcolor(const char *colstr) { getcolor(DC *dc, const char *colstr) {
Colormap cmap = DefaultColormap(dpy, screen); Colormap cmap = DefaultColormap(dc->dpy, DefaultScreen(dc->dpy));
XColor color; XColor color;
if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color)) if(!XAllocNamedColor(dc->dpy, cmap, colstr, &color, &color))
eprint("error, cannot allocate color '%s'\n", colstr); eprintf("cannot allocate color '%s'\n", colstr);
return color.pixel; 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 void
setfont(const char *fontstr) { initfont(DC *dc, const char *fontstr) {
char **missing, *def; 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; int i, n;
XFontStruct **xfonts;
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); n = XFontsOfFontSet(dc->font.set, &xfonts, &names);
dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def); for(i = 0; i < n; i++) {
if(missing) { 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); XFreeStringList(missing);
if(dc.font.set) { return dc->font.set || dc->font.xfont;
XFreeFontSet(dpy, dc.font.set);
dc.font.set = NULL;
}
}
if(dc.font.set) {
XFontSetExtents *font_extents;
XFontStruct **xfonts;
char **font_names;
dc.font.ascent = dc.font.descent = 0;
font_extents = XExtentsOfFontSet(dc.font.set);
n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);
for(i = 0, dc.font.ascent = 0, dc.font.descent = 0; i < n; i++) {
if(dc.font.ascent < (*xfonts)->ascent)
dc.font.ascent = (*xfonts)->ascent;
if(dc.font.descent < (*xfonts)->descent)
dc.font.descent = (*xfonts)->descent;
xfonts++;
}
}
else {
if(dc.font.xfont)
XFreeFont(dpy, dc.font.xfont);
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;
} }
unsigned int void
textw(const char *text) { mapdc(DC *dc, Window win, unsigned int w, unsigned int h) {
return textnw(text, strlen(text)) + dc.font.height; 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
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);
+11
View File
@@ -0,0 +1,11 @@
.TH LSX 1 dmenu\-VERSION
.SH NAME
lsx \- list executables
.SH SYNOPSIS
.B lsx
.RI [ directory ...]
.SH DESCRIPTION
.B lsx
lists the executables in each
.IR directory .
If none are given the current working directory is used.
+38
View File
@@ -0,0 +1,38 @@
/* See LICENSE file for copyright and license details. */
#include <dirent.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
static void lsx(const char *dir);
int
main(int argc, char *argv[]) {
int i;
if(argc < 2)
lsx(".");
else for(i = 1; i < argc; i++)
lsx(argv[i]);
return EXIT_SUCCESS;
}
void
lsx(const char *dir) {
char buf[PATH_MAX];
struct dirent *d;
struct stat st;
DIR *dp;
if(!(dp = opendir(dir))) {
perror(dir);
return;
}
while((d = readdir(dp)))
if(snprintf(buf, sizeof buf, "%s/%s", dir, d->d_name) < (int)sizeof buf
&& !stat(buf, &st) && S_ISREG(st.st_mode) && access(buf, X_OK) == 0)
puts(d->d_name);
closedir(dp);
}
-394
View File
@@ -1,394 +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 <sys/select.h>
#include <sys/time.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 text[4096];
static int mx, my, mw, mh;
static int ret = 0;
static int nitem = 0;
static unsigned int cmdw = 0;
static Bool running = True;
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(void) {
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(void) {
Item *i;
dc.x = 0;
dc.y = 0;
dc.w = mw;
dc.h = mh;
drawtext(NULL, dc.norm);
/* print command */
if(cmdw && item)
dc.w = cmdw;
drawtext(text[0] ? text : NULL, dc.norm);
dc.x += cmdw;
if(curr) {
dc.w = SPACE;
drawtext((curr && curr->left) ? "<" : NULL, dc.norm);
dc.x += dc.w;
/* determine maximum items */
for(i = curr; i != next; i=i->right) {
dc.w = textw(i->text);
if(dc.w > mw / 3)
dc.w = mw / 3;
drawtext(i->text, (sel == i) ? dc.sel : dc.norm);
dc.x += dc.w;
}
dc.x = mw - SPACE;
dc.w = SPACE;
drawtext(next ? ">" : NULL, dc.norm);
}
XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, mw, mh, 0, 0);
XFlush(dpy);
}
static void
match(char *pattern) {
unsigned int plen;
Item *i, *j;
if(!pattern)
return;
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:
case XK_H:
ksym = XK_BackSpace;
break;
case XK_u:
case XK_U:
text[0] = 0;
match(text);
drawmenu();
return;
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);
match(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) && text)
fprintf(stdout, "%s", text);
else if(sel)
fprintf(stdout, "%s", sel->text);
else if(text)
fprintf(stdout, "%s", text);
fflush(stdout);
running = False;
break;
case XK_Escape:
ret = 1;
running = False;
break;
case XK_BackSpace:
if((i = len)) {
prev_nitem = nitem;
do {
text[--i] = 0;
match(text);
} while(i && nitem && prev_nitem == nitem);
match(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);
match(text);
}
}
drawmenu();
}
static char *
readstdin(void) {
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 *font = FONT;
char *maxname;
char *normbg = NORMBGCOLOR;
char *normfg = NORMFGCOLOR;
char *selbg = SELBGCOLOR;
char *selfg = SELFGCOLOR;
fd_set rd;
int i;
struct timeval timeout;
Item *itm;
XEvent ev;
XSetWindowAttributes wa;
timeout.tv_usec = 0;
timeout.tv_sec = 3;
/* command line args */
for(i = 1; i < argc; i++)
if(!strncmp(argv[i], "-font", 6)) {
if(++i < argc) font = argv[i];
}
else if(!strncmp(argv[i], "-normbg", 8)) {
if(++i < argc) normbg = argv[i];
}
else if(!strncmp(argv[i], "-normfg", 8)) {
if(++i < argc) normfg = argv[i];
}
else if(!strncmp(argv[i], "-selbg", 7)) {
if(++i < argc) selbg = argv[i];
}
else if(!strncmp(argv[i], "-selfg", 7)) {
if(++i < argc) selfg = argv[i];
}
else if(!strncmp(argv[i], "-t", 3)) {
if(++i < argc) timeout.tv_sec = atoi(argv[i]);
}
else if(!strncmp(argv[i], "-v", 3)) {
fputs("dmenu-"VERSION", (C)opyright MMVI Anselm R. Garbe\n", stdout);
exit(EXIT_SUCCESS);
}
else
eprint("usage: dmenu [-font <name>] [-{norm,sel}{bg,fg} <color>] [-t <seconds>] [-v]\n", stdout);
dpy = XOpenDisplay(0);
if(!dpy)
eprint("dmenu: cannot open display\n");
screen = DefaultScreen(dpy);
root = RootWindow(dpy, screen);
/* Note, the select() construction allows to grab all keypresses as
* early as possible, to not loose them. But if there is no standard
* input supplied, we will make sure to exit after MAX_WAIT_STDIN
* seconds. This is convenience behavior for rapid typers.
*/
while(XGrabKeyboard(dpy, root, True, GrabModeAsync,
GrabModeAsync, CurrentTime) != GrabSuccess)
usleep(1000);
FD_ZERO(&rd);
FD_SET(STDIN_FILENO, &rd);
if(select(ConnectionNumber(dpy) + 1, &rd, NULL, NULL, &timeout) < 1)
goto UninitializedEnd;
maxname = readstdin();
/* style */
dc.norm[ColBG] = getcolor(normbg);
dc.norm[ColFG] = getcolor(normfg);
dc.sel[ColBG] = getcolor(selbg);
dc.sel[ColFG] = getcolor(selfg);
setfont(font);
/* menu window */
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 + 2;
win = XCreateWindow(dpy, root, mx, my, mw, mh, 0,
DefaultDepth(dpy, screen), CopyFromParent,
DefaultVisual(dpy, screen),
CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
/* pixmap */
dc.drawable = XCreatePixmap(dpy, root, mw, mh, DefaultDepth(dpy, screen));
dc.gc = XCreateGC(dpy, root, 0, 0);
XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
if(maxname)
cmdw = textw(maxname);
if(cmdw > mw / 3)
cmdw = mw / 3;
text[0] = 0;
match(text);
XMapRaised(dpy, win);
drawmenu();
XSync(dpy, False);
/* main event loop */
while(running && !XNextEvent(dpy, &ev))
switch (ev.type) {
default: /* ignore all crap */
break;
case KeyPress:
kpress(&ev.xkey);
break;
case Expose:
if(ev.xexpose.count == 0)
drawmenu();
break;
}
/* cleanup */
while(allitems) {
itm = allitems->next;
free(allitems->text);
free(allitems);
allitems = itm;
}
if(dc.font.set)
XFreeFontSet(dpy, dc.font.set);
else
XFreeFont(dpy, dc.font.xfont);
XFreePixmap(dpy, dc.drawable);
XFreeGC(dpy, dc.gc);
XDestroyWindow(dpy, win);
UninitializedEnd:
XUngrabKeyboard(dpy, CurrentTime);
XCloseDisplay(dpy);
return ret;
}
-38
View File
@@ -1,38 +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>
void *
emalloc(unsigned int size) {
void *res = malloc(size);
if(!res)
eprint("fatal: could not malloc() %u bytes\n", 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)
eprint("fatal: could not malloc() %u bytes\n", strlen(str));
return res;
}