aboutsummaryrefslogtreecommitdiff
path: root/README.md
blob: fbf610c1e5e71e3648796e4502bacc4903b97215 (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
er_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/er_xdg_pipe_menu.sock` (falling back to
`/tmp/er_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(er_xdg_pipe_menu)."

To have it start automatically with your session, add a systemd
user unit, e.g. `~/.config/systemd/user/er-xdg-pipe-menu.service`:

    [Unit]
    Description=XDG pipe menu daemon

    [Service]
    WorkingDirectory=/path/to/er-xdg-pipe-menu
    ExecStart=/usr/bin/rebar3 shell --eval "application:ensure_all_started(er_xdg_pipe_menu)."
    Restart=on-failure

    [Install]
    WantedBy=default.target

then enable it with `systemctl --user enable --now er-xdg-pipe-menu`.

Openbox itself doesn't talk to the socket directly -- it invokes
`bin/er_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/er-xdg-pipe-menu/bin/er_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.