i3wsr
is a small program that uses I3's IPC Interface
to change the name of a workspace based on its contents.
The chosen name for a workspace is a composite of the WM_CLASS
X11 window
property for each window in a workspace. In action it would look something like this:
Rust, and Cargo is
required, and i3wsr
can be installed using cargo like so:
sh
cargo install i3wsr
Or alternatively, you can build a release binary,
sh
cargo build --release
Then place the built binary, located at target/release/i3wsr
, somewhere on your $path
.
If you're running Arch you can install either stable, or latest from AUR thanks to reddit user u/OniTux.
Just launch the program and it'll listen for events if you are running I3. Another option is to put something like this in your i3 config
exec_always --no-startup-id exec $HOME/.cargo/bin/i3wsr
You can configure icons for the respective classes, a very basic preset for font-awesome is configured, to enable it use the option --icons awesome
(requires font-awesome to be installed).
If you have icons and don't want the names to be displayed, you can use the --no-names
flag.
For further customization, use the --config path_to_file.toml
option. The toml
file has to fields, icons
to assign icons to classes, and aliases
to assign alternative names to be displayed.
Example config can be found in assets/example_config.toml
```toml [icons]
TelegramDesktop = "" Firefox = "" Alacritty = "" Thunderbird = ""
MyNiceProgram = "😛"
[aliases] TelegramDesktop = "Telegram" "Org.gnome.Nautilus" = "Nautilus" ```
For an overview of available options
```shell $ i3wsr -h i3wsr - i3 workspace renamer 1.2.0 Daniel Berg mail@roosta.sh
USAGE: i3wsr [FLAGS] [OPTIONS]
FLAGS: -h, --help Prints help information --no-names Set to no to display only icons (if available) -V, --version Prints version information
OPTIONS:
-c, --config
```
This program depends on numbered workspaces, since we're constantly changing the workspace name. So your I3 configuration need to reflect this:
bindsym $mod+1 workspace number 1
If you're like me and don't necessarily bind your workspaces to only numbers, or you want to keep a part of the name constant you can do like this:
bindsym $mod+q workspace number 1:[Q]
This way the workspace would look something like this when it gets changed:
1:[Q] Emacs|Firefox
You can take this a bit further by using a bar that trims the workspace number and be left with only
[Q] Emacs|Firefox
To run the tests Xvfb
needs to be installed and run:
shell
Xvfb :99.0
This sets up a headless x server running on DISPLAY :99.0, then some apps needs to be run in this new server:
shell
env DISPLAY=:99.0 gpick
env DISPLAY=:99.0 i3 -c /etc/i3/config
refer to .travis.yml for a CI example
This program would not be possible without i3ipc-rs, a rust library for controlling i3-wm through its IPC interface and rust-xcb, a set of rust bindings and wrappers for XCB.