Blame


1 be5b89f6 2018-05-18 omar.polo # MyMenu
2 be5b89f6 2018-05-18 omar.polo
3 eccc9e7a 2018-05-20 omar.polo > A replacement for dmenu, 'cause I was bored
4 be5b89f6 2018-05-18 omar.polo
5 be5b89f6 2018-05-18 omar.polo ![MyMenu works!](screen.png)
6 be5b89f6 2018-05-18 omar.polo
7 36a15a9f 2018-05-19 omar.polo ![MyMenu alternate layout](screen-alt.png)
8 36a15a9f 2018-05-19 omar.polo
9 be5b89f6 2018-05-18 omar.polo ---
10 be5b89f6 2018-05-18 omar.polo
11 be5b89f6 2018-05-18 omar.polo ## What?
12 be5b89f6 2018-05-18 omar.polo
13 eccc9e7a 2018-05-20 omar.polo This is a replacement for `dmenu(1)`.
14 be5b89f6 2018-05-18 omar.polo
15 be5b89f6 2018-05-18 omar.polo ## Why?
16 be5b89f6 2018-05-18 omar.polo
17 be5b89f6 2018-05-18 omar.polo This was the perfect excuse to learn how to make window with Xlib.
18 be5b89f6 2018-05-18 omar.polo
19 be5b89f6 2018-05-18 omar.polo ## How?
20 be5b89f6 2018-05-18 omar.polo
21 b3f35c85 2018-05-18 omar.polo Check out the [manpage](mymenu.1) for further documentation. Check out
22 b3f35c85 2018-05-18 omar.polo also the [template](Xexample) for the resources.
23 be5b89f6 2018-05-18 omar.polo
24 be5b89f6 2018-05-18 omar.polo ---
25 be5b89f6 2018-05-18 omar.polo
26 be5b89f6 2018-05-18 omar.polo ## Dependencies
27 be5b89f6 2018-05-18 omar.polo
28 be5b89f6 2018-05-18 omar.polo - Xlib
29 be5b89f6 2018-05-18 omar.polo - Xinerama (optional)
30 be5b89f6 2018-05-18 omar.polo For multi-monitor support
31 be5b89f6 2018-05-18 omar.polo - pkg-config (optional)
32 be5b89f6 2018-05-18 omar.polo used in the makefile to generate `LIBS` and `CFLAGS` correctly
33 be5b89f6 2018-05-18 omar.polo
34 be5b89f6 2018-05-18 omar.polo ## Build
35 be5b89f6 2018-05-18 omar.polo
36 be5b89f6 2018-05-18 omar.polo As simple as `make`. If you want to disable Xinerama support just
37 be5b89f6 2018-05-18 omar.polo delete `-DUSE_XINERAMA` from the `CFLAGS` and `xinerama` from the
38 be5b89f6 2018-05-18 omar.polo `pkg-config` call from the Makefile.
39 be5b89f6 2018-05-18 omar.polo
40 be5b89f6 2018-05-18 omar.polo ---
41 be5b89f6 2018-05-18 omar.polo
42 be5b89f6 2018-05-18 omar.polo ## TODO
43 be5b89f6 2018-05-18 omar.polo
44 be5b89f6 2018-05-18 omar.polo - Command line flags
45 be5b89f6 2018-05-18 omar.polo
46 be5b89f6 2018-05-18 omar.polo At the moment the X Resource Database is the only way to interact
47 be5b89f6 2018-05-18 omar.polo with the graphic appearance of MyMenu.
48 be5b89f6 2018-05-18 omar.polo
49 be5b89f6 2018-05-18 omar.polo - Optional TrueType support
50 be5b89f6 2018-05-18 omar.polo
51 be5b89f6 2018-05-18 omar.polo - Opacity support
52 b836b1ec 2018-05-18 omar.polo
53 b836b1ec 2018-05-18 omar.polo ## Scripts
54 b836b1ec 2018-05-18 omar.polo
55 8880d5e3 2018-05-19 omar.polo I'm using this script to launch MyMenu with custom item
56 b836b1ec 2018-05-18 omar.polo
57 b836b1ec 2018-05-18 omar.polo ``` shell
58 b836b1ec 2018-05-18 omar.polo #!/bin/sh
59 b836b1ec 2018-05-18 omar.polo
60 b836b1ec 2018-05-18 omar.polo cat <<EOF | /bin/sh -c "$(mymenu "$@")"
61 b836b1ec 2018-05-18 omar.polo sct 4500
62 b836b1ec 2018-05-18 omar.polo lock
63 b836b1ec 2018-05-18 omar.polo connect ethernet
64 b836b1ec 2018-05-18 omar.polo connect home
65 b836b1ec 2018-05-18 omar.polo connect phone
66 8880d5e3 2018-05-19 omar.polo ZZZ
67 b836b1ec 2018-05-18 omar.polo zzz
68 b836b1ec 2018-05-18 omar.polo ...
69 b836b1ec 2018-05-18 omar.polo EOF
70 b836b1ec 2018-05-18 omar.polo ```
71 b836b1ec 2018-05-18 omar.polo
72 8880d5e3 2018-05-19 omar.polo You can generate a menu from the `.desktop` file with something like
73 8880d5e3 2018-05-19 omar.polo this:
74 8880d5e3 2018-05-19 omar.polo
75 8880d5e3 2018-05-19 omar.polo ``` shell
76 8880d5e3 2018-05-19 omar.polo #!/bin/sh
77 8880d5e3 2018-05-19 omar.polo
78 8880d5e3 2018-05-19 omar.polo getname() {
79 8880d5e3 2018-05-19 omar.polo cat $1 | grep '^Name=' | sed 's/^.*=//'
80 8880d5e3 2018-05-19 omar.polo }
81 8880d5e3 2018-05-19 omar.polo
82 8880d5e3 2018-05-19 omar.polo getexec() {
83 8880d5e3 2018-05-19 omar.polo cat $1 | grep '^Exec=' | sed 's/^.*=//'
84 8880d5e3 2018-05-19 omar.polo }
85 8880d5e3 2018-05-19 omar.polo
86 8880d5e3 2018-05-19 omar.polo desktop_files=`ls /usr/local/share/applications/*.desktop`
87 8880d5e3 2018-05-19 omar.polo
88 8880d5e3 2018-05-19 omar.polo {
89 8880d5e3 2018-05-19 omar.polo for i in $desktop_files; do
90 8880d5e3 2018-05-19 omar.polo getname $i
91 8880d5e3 2018-05-19 omar.polo done
92 8880d5e3 2018-05-19 omar.polo } | mymenu "$@" | {
93 8880d5e3 2018-05-19 omar.polo read prgname
94 8880d5e3 2018-05-19 omar.polo for i in $desktop_files; do
95 8880d5e3 2018-05-19 omar.polo name=`getname $i`
96 8880d5e3 2018-05-19 omar.polo if [ "x$prgname" = "x$name" ]; then
97 8880d5e3 2018-05-19 omar.polo exec `getexec $i`
98 8880d5e3 2018-05-19 omar.polo fi
99 8880d5e3 2018-05-19 omar.polo done
100 8880d5e3 2018-05-19 omar.polo }
101 8880d5e3 2018-05-19 omar.polo ```
102 8880d5e3 2018-05-19 omar.polo
103 8880d5e3 2018-05-19 omar.polo or generate a list of executables from `$PATH` like this:
104 8880d5e3 2018-05-19 omar.polo
105 8880d5e3 2018-05-19 omar.polo ``` shell
106 8880d5e3 2018-05-19 omar.polo #!/bin/sh
107 8880d5e3 2018-05-19 omar.polo
108 8880d5e3 2018-05-19 omar.polo path=`echo $PATH | sed 's/:/ /g'`
109 8880d5e3 2018-05-19 omar.polo
110 8880d5e3 2018-05-19 omar.polo {
111 8880d5e3 2018-05-19 omar.polo for i in $path; do
112 8880d5e3 2018-05-19 omar.polo ls -F $i | grep '.*\*$' | sed 's/\*//'
113 8880d5e3 2018-05-19 omar.polo done
114 8880d5e3 2018-05-19 omar.polo } | sort | /bin/sh -c "$(mymenu "$@")"
115 8880d5e3 2018-05-19 omar.polo ```
116 8880d5e3 2018-05-19 omar.polo
117 b836b1ec 2018-05-18 omar.polo Of course you can as well use the `dmenu_path` and `dmenu_run` scripts
118 b836b1ec 2018-05-18 omar.polo that (usually) comes with `dmenu`.