## About
`bzmenu` (**B**lue**Z** **Menu**) manages Bluetooth through your launcher of choice.
## Dependencies
### Build
- [`Rust`](https://www.rust-lang.org) (includes `cargo`)
- [`pkg-config`](https://www.freedesktop.org/wiki/Software/pkg-config) – For detecting required libraries
- [`dbus`](https://www.freedesktop.org/wiki/Software/dbus) – For D-Bus integration headers
### Runtime
- [`bluetoothd`](http://www.bluez.org) – BlueZ daemon
- [`dbus`](https://www.freedesktop.org/wiki/Software/dbus) – For communicating with `bluetoothd`
- A launcher with `stdin` mode support
- [Notification daemon](https://specifications.freedesktop.org/notification-spec/latest) – For pairing confirmations and other system notifications (e.g. `dunst`, `fnott`, included with DEs or can be installed manually)
#### Optional
- [NerdFonts](https://www.nerdfonts.com) – For font-based icons (default mode)
- [XDG icon theme](https://specifications.freedesktop.org/icon-theme-spec/latest) – For image-based icons (used with `-i xdg`, included with DEs or can be installed manually)
## Compatibility
| Launcher | Font Icons | XDG Icons | Notes |
| ------------------------------------------- | :--------: | :-------: | ------------------------------------------------------------------------------------- |
| [Fuzzel](https://codeberg.org/dnkl/fuzzel) | ✓ | ✓ | XDG icons supported since v1.13.0 |
| [Rofi](https://github.com/davatorium/rofi) | ✓ | ⧖ | XDG icon support pending via [PR #2122](https://github.com/davatorium/rofi/pull/2122) |
| [dmenu](https://tools.suckless.org/dmenu) | ✓ | ✗ | No XDG icon support |
| [bemenu](https://github.com/Cloudef/bemenu) | ✓ | ✗ | No XDG icon support |
| Custom (stdin) | ✓ | ? | Depends on launcher implementation |
> [!TIP]
> If your preferred launcher isn't directly supported, use `custom` mode with appropriate command flags.
## Installation
### Build from source
Run the following commands:
```shell
git clone https://github.com/e-tho/bzmenu
cd bzmenu
cargo build --release
```
An executable file will be generated at `target/release/bzmenu`, which you can then copy to a directory in your `$PATH`.
### Nix
Install from nixpkgs:
```nix
{ pkgs, ... }:
{
environment.systemPackages = [ pkgs.bzmenu ];
}
```
Alternative: Install from flake
Add flake as an input:
```nix
inputs.bzmenu.url = "github:e-tho/bzmenu";
```
Install from flake:
```nix
{ inputs, ... }:
{
environment.systemPackages = [ inputs.bzmenu.packages.${pkgs.system}.default ];
}
```
### Alpine Linux
Install from the testing repository:
```shell
apk add bzmenu
```
### Arch Linux
Install from AUR with your favorite helper:
```shell
paru -S bzmenu # or bzmenu-git
```
## Usage
### Supported launchers
Specify an application using `-l` or `--launcher` flag.
```shell
bzmenu -l fuzzel
```
### Custom launchers
Specify `custom` as the launcher and set your command using the `--launcher-command` flag. Ensure your launcher supports `stdin` mode, and that it is properly configured in the command.
```shell
bzmenu -l custom --launcher-command "my_custom_launcher --flag"
```
#### Prompt and Placeholder support
Use `{hint}` as the value for the relevant flag in your command; it will be substituted with the appropriate text as needed.
```shell
bzmenu -l custom --launcher-command "my_custom_launcher --placeholder-flag '{hint}'" # or --prompt-flag '{hint}:'
```
#### Example to enable all features
This example demonstrates enabling all available features in custom mode with `fuzzel`.
```shell
bzmenu -l custom --launcher-command "fuzzel -d --placeholder '{hint}'"
```
### Available Options
| Flag | Description | Supported Values | Default Value |
| -------------------- | ------------------------------------------------------------------ | --------------------------------------------- | ------------- |
| `-l`, `--launcher` | Specify the launcher to use (**required**). | `dmenu`, `rofi`, `fuzzel`, `bemenu`, `custom` | `None` |
| `--launcher-command` | Specify the command to use when `custom` launcher is set. | Any valid shell command | `None` |
| `-i`, `--icon` | Specify the icon type to use. | `font`, `xdg` | `font` |
| `-s`, `--spaces` | Specify icon to text space count (font icons only). | Any positive integer | `1` |
| `--scan-duration` | Specify the duration of device discovery in seconds. | Any positive integer | `10` |
| `--interactive` | Stay in menus after actions and return to previous menu on escape. | N/A | `false` |
## Contributing
Please see [CONTRIBUTING.md](CONTRIBUTING.md) for contribution guidelines.
## License
This project is licensed under the terms of the GNU General Public License version 3, or (at your option) any later version.
## Support this project
If you find this project useful and would like to help me dedicate more time to its development, consider supporting my work.
[](https://ko-fi.com/e_tho)
[](https://liberapay.com/e-tho)