--- Title: Rofi's keyboard shortcut for passwordstore on Wayland Date: 2023-07-09 15:00 Author: Fabrice Category: Tips Tags: pass, rofi, tessen Slug: tessen-shortcut Header_Cover: ../images/covers/keyboards.jpg Summary: How to configure keyboard inputs for rofi menu on wayland for pass Lang: en --- I recently switched from [xorg](https://x.org/) to [wayland](https://wayland.freedesktop.org/) with [sway](https://swaywm.org/). One of the several roadblocks to this change lies in that some tools that heavily rely on graphical environment are not fully compatible with wayland, such as [barrier](https://github.com/debauchee/barrier), a keyboard, mouse and clipboard sharing system between multiple computers. However, the most annoying hindrance was that alternative tools that have been built with wayland in mind actually alter my habits too much for my comfort. One of such tools I used is [rofi-pass](https://github.com/carnager/rofi-pass), a wrapper around [pass]({filename}../software/pass.md) using [rofi](https://github.com/davatorium/rofi) as a user interface. While using it to type passwords outside software that can integrate [`pass`](https://passwordstore.org), I developed some habits with the default keyboard shortcuts of `rofi-pass` such as `Alt+c` to copy the password (for a short time) or `Alt+Return` to evaluate the `autotype` field in a password file. At first, we can notice that `rofi-pass` is not much more than a bash script which gather its data from _pass/gopass_, the X11 clipboard manager and `xdotools` to automate some actions. As such, one solution can be to directly modify the bash script, even if it's not [very elegant](https://git.epheme.re/fmouhart/my-pkgs/src/branch/master/rofi-pass/rofi-pass.patch). Now, looking more closely into the wayland tooling ecosystem, I found [tessen] [tessen](https://github.com/ayushnix/tessen), that supports multiple dmenu-like interfaces, including `rofi` but also a wayland-native menu system called [fuzzel](https://codeberg.org/dnkl/fuzzel). _Tessen_ thus gather the output of these programs to enact the corresponding request using `wl-copy/wl-paste` for the clipboard and `wtype` for typing. I first tried to use _fuzzel_, however, their [fuzzy search](https://en.wikipedia.org/wiki/Approximate_string_matching) algorithm was too different from the one used by [fzf](https://github.com/junegunn/fzf), which is integrated in many of the everyday tools I used (such as completing commands in my shell), and some usual shortcuts such as `Ctrl+u` to clear my search don't seem to work natively. I thus decided to use `rofi` which was doing a tremendous job so far, even if it launched through xwayland and is not considered _pure enough_ by some people. However the `rofi-pass`-specific shortcuts don't seem to work out of the box. Fortunately (?), the `man tessen` whispers in my ears that it is possible: > If the dmenu program of your choice supports custom keybindings with exit > codes greater than or equal to 10, tessen can execute custom operations on a > selected file in the first menu. At the very least, fuzzel(1), bemenu(1), and > rofi(1) support this feature. In particular, it integrates some way to directly type and copy [OTP](https://en.wikipedia.org/wiki/Time-based_one-time_password) codes for two factor authentication, which is a feature that I manually patched in my `rofi-pass` file to have “`Alt+o`” typing an OTP code. We now have everything we need to put it in action. First, we have to find a way to tell rofi to send [exit code](https://en.wikipedia.org/wiki/Exit_status) 10 on some password description, which is nice because some configuration options in _rofi_ just do that: [`kb-custom-`](https://github.com/davatorium/rofi/blob/next/doc/rofi-keys.5.markdown#kb-custom-1) allows associating some keyboard inputs to the “_9+n_” exit code. `kb-custom-1` then sends the signal 10 and `kb-custom-9` sends 20. It seems obvious now, but it was not written clearly in the documentation, and I first used `kb-custom-10` hoping it will send signal 10… I don't have to tell you that it didn't work as intended. Luckily I found a [reddit comment](https://www.reddit.com/r/linuxquestions/comments/tw8x5j/comment/i3edajm/) that explained it to me. Putting everything togethere, it leads to the following configuration file `$HOME/.config/rofi/tessen.rasi`: ```rasi configuration { /* Tessen */ kb-custom-1: "Alt+Return"; /* autotype */ kb-custom-2: "Alt+u"; /* autotype user */ kb-custom-3: "Alt+p"; /* autotype password */ kb-custom-5: "Alt+t"; /* copy user */ kb-custom-6: "Alt+c"; /* copy password */ kb-custom-8: "Alt+o"; /* autotype otp */ } @import "config" /* import default config */ ``` I initially tried to add it to rofi general-purpose configuration file, `$XDG_CONFIG_HOME/rofi/config.rasi`, but it conflicted with `rofimoji` shortcuts which didn't hesitate to explain the situation. The final step is to integrate this to tessen, which can be done in the configuration file `$XDG_CONFIG_HOME/tessen/config`: ```sh dmenu_backend="rofi" rofi_config_file="$HOME/.config/rofi/tessen.rasi" ``` For some unknown reason that I didn't look deep inside, `$XDG_CONFIG_HOME` does not work unlike what is hinted in the [tessen example configuration file](https://github.com/ayushnix/tessen/blob/master/config#L23) on my computer. I'll look into it [someday](https://en.wikipedia.org/wiki/Procrastination) to have a clean configuration files setup… maybe.