From 9fa75cd52254d79997054bbc8373f00c133eddf6 Mon Sep 17 00:00:00 2001 From: Tigor Hutasuhut Date: Thu, 17 Oct 2024 08:47:40 +0700 Subject: [PATCH] hyprland: moved select-window script to rofi.nix --- home/modules/hyprland/hyprland.nix | 6 --- home/modules/hyprland/rofi.nix | 43 ++++++++++++++++++- .../modules/hyprland/scripts/search-window.sh | 39 ----------------- 3 files changed, 41 insertions(+), 47 deletions(-) delete mode 100644 home/modules/hyprland/scripts/search-window.sh diff --git a/home/modules/hyprland/hyprland.nix b/home/modules/hyprland/hyprland.nix index c8de06d..95cbdc6 100644 --- a/home/modules/hyprland/hyprland.nix +++ b/home/modules/hyprland/hyprland.nix @@ -1,11 +1,6 @@ { lib, pkgs, config, ... }: let cfg = config.profile.hyprland; - select-window = rec { - filename = "select-window.sh"; - script = pkgs.writeScriptBin filename (builtins.readFile (./scripts/search-window.sh)); - path = "${script}/bin/${filename}"; - }; in { config = lib.mkIf cfg.enable { @@ -85,7 +80,6 @@ in "$mod, E, exec, thunar" "$mod, B, exec, microsoft-edge" "$mod, BackSpace, exec, wlogout" - ''$mod, F, exec, ${select-window.path}'' "$mod, S, exec, foot ssh homeserver@vpn.tigor.web.id" # Workspaces diff --git a/home/modules/hyprland/rofi.nix b/home/modules/hyprland/rofi.nix index 127bc1b..f513434 100644 --- a/home/modules/hyprland/rofi.nix +++ b/home/modules/hyprland/rofi.nix @@ -1,11 +1,49 @@ { config, lib, pkgs, ... }: let cfg = config.profile.hyprland; + inherit (lib.meta) getExe; + selectWindowScript = pkgs.writeShellScriptBin ''select-window.sh'' /*sh*/ '' + 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)"' | + grep -v "scratch_term" | + sed "s|$current_addr|focused ->|" | + sort -r | + rofi -dmenu -i -matching fuzzy)" + + 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 + ''; in { config = lib.mkIf cfg.enable { - home.packages = [ - pkgs.rofi-wayland + home.packages = with pkgs; [ + rofi-wayland + gojq ]; home.file.".config/rofi" = { @@ -15,6 +53,7 @@ in wayland.windowManager.hyprland.settings.bind = [ "$mod, D, exec, rofi -show drun -replace -i" + "$mod, F, exec, ${getExe selectWindowScript}" ]; }; } diff --git a/home/modules/hyprland/scripts/search-window.sh b/home/modules/hyprland/scripts/search-window.sh deleted file mode 100644 index b445f37..0000000 --- a/home/modules/hyprland/scripts/search-window.sh +++ /dev/null @@ -1,39 +0,0 @@ -#/usr/bin/env bash -# rofi -show window for Hyprland, basically -# -# Requires gojq and rofi to be on PATH. - -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)"' | - grep -v "scratch_term" | - sed "s|$current_addr|focused ->|" | - sort -r | - rofi -dmenu -i -matching fuzzy)" - -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