#mode #rofi #plugin #api-bindings #cargo-build #events

rofi-mode

High-level library for creating Rofi plugins and custom modes

10 releases

0.4.0 Feb 26, 2024
0.3.1 Jul 10, 2023
0.3.0 May 5, 2023
0.2.4 Jul 27, 2022
0.1.1 Apr 11, 2022

#590 in Text processing

Download history 17/week @ 2024-07-14 18/week @ 2024-07-21 26/week @ 2024-07-28 21/week @ 2024-08-04 22/week @ 2024-08-11 16/week @ 2024-08-18 17/week @ 2024-08-25 23/week @ 2024-09-01 24/week @ 2024-09-08 23/week @ 2024-09-15 45/week @ 2024-09-22 43/week @ 2024-09-29 22/week @ 2024-10-06 18/week @ 2024-10-13 19/week @ 2024-10-20 30/week @ 2024-10-27

92 downloads per month
Used in rofi-faye

MIT license

55KB
1K SLoC

rofi-mode

crates.io License

A high-level Rust library for creating Rofi plugins and custom modes

Getting started

First of all, create a new library with cargo new --lib my_awesome_plugin and add these lines to the Cargo.toml:

[lib]
crate-type = ["cdylib"]

That will force Cargo to generate your library as a .so file, which is what Rofi loads its plugins from.

Then, add this crate as a dependency using the following command:

cargo add rofi-mode

Now in your lib.rs, create a struct and implement the Mode trait for it. For example, here is a no-op mode with no entries:

struct Mode;

impl rofi_mode::Mode<'_> for Mode {
    const NAME: &'static str = "an-example-mode\0";
    fn init(_api: rofi_mode::Api<'_>) -> Result<Self, ()> {
        Ok(Self)
    }
    fn entries(&mut self) -> usize { 0 }
    fn entry_content(&self, _line: usize) -> rofi_mode::String { unreachable!() }
    fn react(
        &mut self,
        _event: rofi_mode::Event,
        _input: &mut rofi_mode::String,
    ) -> rofi_mode::Action {
        rofi_mode::Action::Exit
    }
    fn matches(&self, _line: usize, _matcher: rofi_mode::Matcher<'_>) -> bool {
        unreachable!()
    }
}

You then need to export your mode to Rofi via the export_mode! macro:

rofi_mode::export_mode!(Mode);

Build your library using cargo build then copy the resulting dylib file (e.g. /target/debug/libmy_awesome_plugin.so) into /lib/rofi so that Rofi will pick up on it when it starts up (alternatively, you can set the ROFI_PLUGIN_PATH environment variable to the directory your .so file is in). You can then run your mode from Rofi's command line:

rofi -modi an-example-mode -show an-example-mode

Build with RUSTFLAGS="--cfg rofi_next" to support unreleased Rofi versions, and drop support for released Rofi versions. This will turn on semver-exempt features, so use with caution.

Examples

  • See examples/basic for a basic example of a non-trivial Rofi mode, which allows the user to add to the list of entries by writing in the Rofi box.
  • See examples/file-browser for a Rofi mode implementing a simple file browser.

License: MIT

Dependencies

~8–15MB
~240K SLoC