Update README.md
[herbe.git] / README.md
1 # 🌱 herbe
2 > Daemon-less notifications without D-Bus. Minimal and lightweight.
3
4 ![herbe](https://raw.githubusercontent.com/dudik/herbe/master/herbe.png)
5
6 ## Usage
7 ```shell
8 $ herbe "herbe notifications" " " "Daemon-less notifications without D-Bus. Minimal and lightweight."
9 ```
10 will display the notification shown above
11
12 * [Dismiss a notification](#dismiss-a-notification)
13 * [Actions](#actions)
14 * [Newlines](#newlines)
15 * [Multiple notifications](#multiple-notifications)
16 * [Notifications don't show up](#notifications-dont-show-up)
17
18 ### Dismiss a notification
19 A notification can be dismissed either by clicking on it with `DISMISS_BUTTON` (set in config.h, defaults to left mouse button) or sending a `SIGUSR1` signal to it:
20 ```shell
21 $ pkill -SIGUSR1 herbe
22 ```
23 Dismissed notifications return exit code 2.
24
25 ### Actions
26 Action is a piece of shell code that runs when a notification gets accepted. Accepting a notification is the same as dismissing it, but you have to use either `ACTION_BUTTON` (defaults to right mouse button) or the `SIGUSR2` signal.
27 An accepted notification always returns exit code 0. To specify an action:
28 ```shell
29 $ herbe "Notification body" && echo "This is an action"
30 ```
31 Where everything after `&&` is the action and will get executed after the notification gets accepted.
32
33 ### Newlines
34 Every command line argument gets printed on a separate line by default e.g.:
35 ```shell
36 $ herbe "First line" "Second line" "Third line" ...
37 ```
38 You can also use `\n` e.g. in `bash`:
39 ```shell
40 $ herbe $'First line\nSecond line\nThird line'
41 ```
42 But by default `herbe` prints `\n` literally:
43 ```shell
44 $ herbe "First line\nStill the first line"
45 ```
46 Output of other programs will get printed correctly, just make sure to escape it (so you don't end up with every word on a separate line):
47 ```shell
48 $ herbe "$(ps axch -o cmd:15,%cpu --sort=-%cpu | head)"
49 ```
50
51 ### Multiple notifications
52 Notifications are put in a queue and shown one after another in order of creation (first in, first out). They don't overlap and each one is shown for its entire duration.
53
54 ### Notifications don't show up
55 Most likely a running notification got terminated forcefully (SIGKILL or any uncaught signal) which caused the semaphore not getting unlocked. First, kill any `herbe` instance that is stuck:
56 ```shell
57 $ pkill -SIGKILL herbe
58 ```
59 Then just call `herbe` without any arguments:
60 ```shell
61 $ herbe
62 ```
63 Notifications should now show up as expected.
64
65 Don't ever send any signals to `herbe` except these:
66 ```shell
67 # same as pkill -SIGTERM herbe, terminates every running herbe process
68 $ pkill herbe
69
70 $ pkill -SIGUSR1 herbe
71 $ pkill -SIGUSR2 herbe
72 ```
73 And you should be fine. That's all you really need to interact with `herbe`.
74
75 ## Installation
76 ### Dependencies
77 * X11 (Xlib)
78 * Xft
79 * freetype2
80
81 The names of packages are different depending on which distribution you use.
82 For example, if you use [Void Linux](https://voidlinux.org/) you will have to install these dependencies:
83 ```shell
84 sudo xbps-install base-devel libX11-devel libXft-devel
85 ```
86
87 ### Build
88 ```shell
89 git clone https://github.com/dudik/herbe
90 cd herbe
91 sudo make install
92 ```
93 `make install` requires root privileges because it copies the resulting binary to `/usr/local/bin`. This makes `herbe` accessible globally.
94
95 You can also use `make clean` to remove the binary from the build folder, `sudo make uninstall` to remove the binary from `/usr/local/bin` or just `make` to build the binary locally.
96
97 ## Configuration
98 herbe is configured at compile-time by editing `config.h`. Every option should be self-explanatory. There is no `height` option because height is determined by font size and text padding.
99
100 ## Contribute
101 If you want to report a bug or you have a feature request, feel free to [open an issue](https://github.com/dudik/herbe/issues).