# Swayest Workstyle
[![AUR version](https://img.shields.io/aur/version/sworkstyle)](https://aur.archlinux.org/packages/sworkstyle)
[![Crates.io](https://img.shields.io/crates/v/sworkstyle)](https://crates.io/crates/sworkstyle)
Map workspace name to icons defined depending on the windows inside of the workspace.
An executable similar to [workstyle](https://github.com/pierrechevalier83/workstyle).
**Differences between `sworkstyle` and `workstyle`:**
- Plug-and-play solution, build-in matching config, you can extend this config by creating/modifying `.config/sworkstyle/config.toml` or you can make a PR for your package manager or this repository with new matchers.
- Way better matching: using regex, exact app names and generic app titles.
- Specifically meant for Sway and Wayland
- Fallback Icon
- Deduplication
Your workspace shall never contain an empty icon again!
**An example of what it does (using waybar which also hides the workspace index):**
## Installation
### Cargo
```bash
cargo install sworkstyle
```
### Arch Linux
You can install it manually or use a aur helper like Yay.
```bash
yay -S sworkstyle
```
## Usage
```bash
sworkstyle
```
## Sway Configuration
Add the follow line to your sway config file (`~/.config/sway/config`).
```bash
exec sworkstyle &> /tmp/sworkstyle.log
```
> **_NOTE:_** When using the cargo install make sure to add the `.cargo/bin` to the `PATH` environment variable before executing sway. You can do this by adding `export PATH="$HOME/.cargo/bin:$PATH"` to `.zprofile` or `.profile`
You should configure anything mentioning a workspace (assign, keybinding) to use numbered workspaces. This is because sworkstyle will rename your workspaces many times so it needs a constant number that doesn't change in order to work correctly.
Prefer
```bash
assign [class="^Steam$"] number 1
bindsym $mod+1 workspace number 1
```
over
```bash
assign [class="^Steam$"] 1
bindsym $mod+1 workspace 1
```
## Sworkstyle Configuration
The main configuration consists of deciding which icons to use for which applications.
The config file is located at `${XDG_CONFIG_HOME}/sworkstyle/config.toml`. Its values will take precedence over the defaults. The syntax is in TOML and should be pretty self-explanatory.
When an app isn't recognized in the config, `sworkstyle` will log the application name as a warning.
Simply add that string to your config file, with an icon of your choice.
Note that the crate [find_unicode](https://github.com/pierrechevalier83/find_unicode/) can help find a unicode character directly from the command line. It now supports all of nerdfonts unicode space.
For a reference to the regex syntax see the [regex](https://docs.rs/regex/1.5.4/regex/#syntax) crate
### Matching
#### Standard
```toml
'{pattern}' = '{icon}'
# pattern: Can either be the exact "app_name" (app_id/class) of the window or a regex string in the format of `"/{regex}/"` which will match the window "title".
# icon: Your beautiful icon
```
#### Verbose
```toml
'{pattern}' = { type = 'generic' | 'exact', value = '{icon}' }
```
_**Note:**_ You'll only have to use the verbose format when matching generic with a case insensitive text. `'case insensitive title' = { type = 'generic', value = 'A' }`
#### Troubleshooting
If it couldn't match something it will print:
```
WARN [sworkstyle:config] No match for '{app_name}' with title '{title}'
```
You can use {title} to do a generic matching
You can use {app_name} to do an exact match
### Default Config
The default config uses [font-awesome](https://fontawesome.com/) for icon mappinigs.
The default config is always appended to whatever custom config you define.
You can overwrite any matching or make a PR if you feel like a matching should be a default.
```toml
fallback = ''
separator = ' '
[matching]
'discord' = ''
'balena-etcher' = ''
'Chia Blockchain' = ''
'Steam' = ''
'vlc' = ''
'org.qbittorrent.qBittorrent' = ''
'Thunderbird' = ''
'thunderbird' = ''
'Postman' = ''
'Insomnia' = ''
'Bitwarden' = ''
'Google-chrome' = ''
'Chromium' = ''
'Slack' = ''
'Code' = ''
'code-oss' = ''
'jetbrains-studio' = ''
'Spotify' = ''
'GitHub Desktop' = ''
'/(?i)Github.*Firefox/' = ''
'firefox' = ''
'Nightly' = ''
'firefoxdeveloperedition' = ''
'/nvim ?\w*/' = ''
'/npm/' = ''
'/node/' = ''
'/yarn/' = ''
'Alacritty' = ''
```
## Package Maintainers
If you want to change the build-in config, change `src/default_config.toml` with your config and install the project.
You might also want [font-awesome](https://fontawesome.com/) as a dependency depending on your config.
You can also make a PR to add a badge and add your install method under #Installation or to add matchers to the build-in config.
See [aur](https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=sworkstyle) for an example build.
## Roadmap
- An `--unique` param where you only have a single icon per workspace based on the matching with biggest priority.
- Add hyprland support
## Known Issues
- Using sway's alt-tab behavior can cause a workspace to be not named