blob: c39385d0a02907809e5e2eb3e845e41206472010 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
xdg_pipe_menu
=====
Openbox pipemenu generator from XDG .desktop files
Build
-----
$ rebar3 compile
Live-reload (rebuilding the menu when `.desktop` files change) uses
the `fs` library, which on Linux shells out to `inotifywait`. Install
the `inotify-tools` package for this to work; without it the daemon
still serves the menu it built at startup, it just won't notice
later changes until restarted.
Running locally
----------------
The app is a long-running daemon: it scans your XDG application
directories once at startup, caches the rendered menu in memory, and
serves it over a Unix domain socket at
`$XDG_RUNTIME_DIR/xdg_pipe_menu.sock` (falling back to
`/tmp/xdg_pipe_menu-$USER.sock` if `XDG_RUNTIME_DIR` isn't set),
rebuilding the cache whenever a watched `.desktop` file changes.
For a quick manual run (e.g. while developing):
$ rebar3 shell --eval "application:ensure_all_started(xdg_pipe_menu)."
To have it start automatically with your session, add a systemd
user unit, e.g. `~/.config/systemd/user/xdg-pipe-menu.service`:
[Unit]
Description=XDG pipe menu daemon
[Service]
WorkingDirectory=/path/to/xdg-pipe-menu
ExecStart=/usr/bin/rebar3 shell --eval "application:ensure_all_started(xdg_pipe_menu)."
Restart=on-failure
[Install]
WantedBy=default.target
then enable it with `systemctl --user enable --now xdg-pipe-menu`.
Openbox itself doesn't talk to the socket directly -- it invokes
`bin/xdg_pipe_menu_menu` as the pipe menu command, which connects
to the daemon's socket and prints whatever comes back (or, if the
daemon isn't running, falls back to scanning/rendering inline so the
menu still works). Point a pipe menu at it in `~/.config/openbox/menu.xml`:
<menu id="apps" label="Applications" execute="/path/to/xdg-pipe-menu/bin/xdg_pipe_menu_menu" />
The script resolves its own location to find the compiled code, so
it works from an absolute path as long as the repo's `_build`
directory (from `rebar3 compile`) is alongside it.
|