diff --git a/hypr/hyprland.conf b/hypr/hyprland.conf index 69d988d..3525800 100644 --- a/hypr/hyprland.conf +++ b/hypr/hyprland.conf @@ -32,7 +32,7 @@ gsettings set org.gnome.desktop.interface cursor-size 24 # Set programs that you use $terminal = kitty $fileManager = nemo -$menu = wofi -a --show drun --allow-images +$menu = tofi-drun --drun-launch=true # Some default env vars. env = XCURSOR_SIZE,24 @@ -152,6 +152,7 @@ bind = $mainMod, M, exit, bind = $mainMod, E, exec, $fileManager bind = $mainMod, V, togglefloating, bind = ALT, SPACE , exec, $menu +bind = ALT, B, exec, $HOME/dotfiles/scripts/third-party/tofi_window_switch.sh bind = $mainMod, P, pseudo, # dwindle bind = $mainMod, T, togglesplit, # dwindle bind = $mainMod, F, fullscreen, 1 diff --git a/scripts/third-party/tofi_window_switch.sh b/scripts/third-party/tofi_window_switch.sh new file mode 100755 index 0000000..6d8aa81 --- /dev/null +++ b/scripts/third-party/tofi_window_switch.sh @@ -0,0 +1,37 @@ +# Source = https://github.com/hyprwm/Hyprland/discussions/830 +#!/usr/bin/env bash +# rofi -show window for Hyprland, basically + +state="$(hyprctl -j clients)" +active_window="$(hyprctl -j activewindow)" + +current_addr="$(echo "$active_window" | gojq -r '.address')" + +window="$(echo "$state" | + gojq -r '.[] | select(.monitor != -1 ) | "\(.address) \(.workspace.name) \(.title)"' | + sed "s|$current_addr|focused ->|" | + sort -r | + tofi --fuzzy-match true)" + +addr="$(echo "$window" | awk '{print $1}')" +ws="$(echo "$window" | awk '{print $2}')" + +if [[ "$addr" =~ focused* ]]; then + echo 'already focused, exiting' + exit 0 +fi + +fullscreen_on_same_ws="$(echo "$state" | gojq -r ".[] | select(.fullscreen == true) | select(.workspace.name == \"$ws\") | .address")" + +if [[ "$window" != "" ]]; then + if [[ "$fullscreen_on_same_ws" == "" ]]; then + hyprctl dispatch focuswindow address:${addr} + else + # If we want to focus app_A and app_B is fullscreen on the same workspace, + # app_A will get focus, but app_B will remain on top. + # This monstrosity is to make sure app_A will end up on top instead. + # XXX: doesn't handle fullscreen 0, but I don't care. + notify-send 'Complex switch' "$window" + hyprctl --batch "dispatch focuswindow address:${fullscreen_on_same_ws}; dispatch fullscreen 1; dispatch focuswindow address:${addr}; dispatch fullscreen 1" + fi +fi