After a long time I begrudgingly setup window rules for hyprland. What I wanted was the ability to log out and jump back into work with a freshened work space. Right now I'm running on low ram and disk on hyprland and sometimes I need to just quit everything and get back to work quick. So I setup exec-once to start my terminal, browser, and chat. These are my main applications that run on my power fingers 456 (which are on a layer that present under jkl). I use them every time I log in and will need them no matter what I do. When I exec once them, they just dump onto one workspace, you can pick it but no matter the timing, you end up with race conditions that end up with you on different workspaces.

So I setup window rules. I avoided this for a long time, because of my workflow on awesomewm, I thought this manual workspace selection was superior. What I really think happened was that awesomewm was a little trickier for me to figure out what things were named and to actually get the rules setup correctly.

hyprland makes this pretty simple with its great cli.


hyprctl clients -j | jq | grep class

Now that I can see attributes of these windows as I open them I can set up rules for them to go onto the correct workspace, or to float them. I have a couple of things like a file picker coming from a browser showing up in the tiled layout, when a file picker like this shows up, just cover everything up its temporary, no need to squeeze it into the tiled layout.

the file picker float also fixed an issue I had where they would not show up, and lock up brave when its in full screen mode and I don't realize it.


windowrulev2 = workspace 1, class:^(steam)$
windowrulev2 = workspace 4, class:^(kitty)$
windowrulev2 = workspace 5, class:^(firefox)$
windowrulev2 = workspace 5, class:^(brave-browser)$
windowrulev2 = workspace 5, class:^(google-chrome)$
windowrulev2 = workspace 6, class:^(Signal)$
windowrulev2 = workspace 2, class:^(krita)$
windowrulev2 = workspace 8, class:^(brave-chat.openai.com__-Default)$
windowrulev2 = workspace 8, class:^(brave-youtube.com__-Default)$
windowrulev2 = float, class:^(org.pulseaudio.pavucontrol)$
windowrulev2 = workspace 9, class:^(org.prismlauncher.PrismLauncher)$
windowrulev2 = float, class:^(org.prismlauncher.PrismLauncher)$, title:^(Console window.*)
windowrulev2 = float, class:^(xdg-desktop-portal-gtk)$