diff --git a/modules/home/hyprland/config.nix b/modules/home/hyprland/config.nix index 814012c..e454057 100644 --- a/modules/home/hyprland/config.nix +++ b/modules/home/hyprland/config.nix @@ -138,7 +138,7 @@ }; dwindle = { - no_gaps_when_only = true; + # no_gaps_when_only = true; # Returns errors for some reason force_split = 0; special_scale_factor = 1.0; split_width_multiplier = 1.0; @@ -149,7 +149,7 @@ master = { special_scale_factor = 1; - no_gaps_when_only = true; + # no_gaps_when_only = true; # Returns errors for some reason }; decoration = { diff --git a/modules/home/hyprland/default.nix b/modules/home/hyprland/default.nix index e7206ca..e294c7e 100644 --- a/modules/home/hyprland/default.nix +++ b/modules/home/hyprland/default.nix @@ -2,6 +2,7 @@ { imports = [ (import ./hyprland.nix) ] ++ [ (import ./config.nix) ] + ++ [ (import ./scripts.nix) ] ++ [ (import ./variables.nix) ] ++ [ (import ./hyprlock.nix) ] ++ [ inputs.hyprland.homeManagerModules.default ]; diff --git a/modules/home/hyprland/scripts.nix b/modules/home/hyprland/scripts.nix new file mode 100644 index 0000000..c28025c --- /dev/null +++ b/modules/home/hyprland/scripts.nix @@ -0,0 +1,132 @@ +{ pkgs, username, ... }: + +{ + home.file = { + "/home/${username}/.local/bin/hyprland-smart-borders" = { + executable = true; + text = '' + #!/usr/bin/env bash + + function handle { + if [[ ''${1:0:10} == "openwindow" ]] + then + window_id=$(echo $1 | cut --delimiter ">" --fields=3 | cut --delimiter "," --fields=1) + workspace_id=$(echo $1 | cut --delimiter ">" --fields=3 | cut --delimiter "," --fields=2) + if [[ $workspace_id == "special" ]] + then + workspace_id=-99 + fi + windows=$(hyprctl workspaces -j | jq ".[] | select(.id == $workspace_id) | .windows") + + if [[ $windows -eq 1 ]] + then + floating_status=$(hyprctl clients -j | jq ".[] | select(.address == \"0x$window_id\" ) | .floating" ) + if [[ $floating_status == "false" ]] + then + hyprctl setprop address:0x$window_id forcenoborder 1 lock + else + hyprctl setprop address:0x$window_id forcenoborder 0 lock + return + fi + + elif [[ $windows -eq 2 ]] + then + addresses=$(hyprctl clients -j | jq -r --arg foo "$foo" ".[] | select(.workspace.id == $workspace_id) | .address") + for address in $addresses + do + if [[ "$address" != "$window_id" ]]; then + hyprctl setprop address:$(echo $address | xargs) forcenoborder 0 lock + fi + done + fi + + elif [[ ''${1:0:10} == "movewindow" ]] + then + window_id=$(echo $1 | cut --delimiter ">" --fields=3 | cut --delimiter "," --fields=1) + workspace_id=$(echo $1 | cut --delimiter ">" --fields=3 | cut --delimiter "," --fields=2) + + # Sepcial workspaces have an id of -99, they need to be handled separately + if [[ $workspace_id == "special" ]] + then + workspace_id=-99 + fi + + windows=$(hyprctl workspaces -j | jq ".[] | select(.id == $workspace_id) | .windows") + + if [[ $windows -eq 1 ]] + then + # Check if the current window is floating and then set the border accordingly + floating_status=$(hyprctl clients -j | jq ".[] | select(.address == \"0x$window_id\" ) | .floating" ) + if [[ $floating_status == "false" ]] + then + hyprctl setprop address:0x$window_id forcenoborder 1 lock + else + hyprctl setprop address:0x$window_id forcenoborder 0 lock + return + fi + elif [[ $windows -eq 2 ]] + then + addresses=$(hyprctl clients -j | jq -r --arg foo "$foo" ".[] | select(.workspace.id == $workspace_id) | .address") + for address in $addresses + do + if [[ "$address" != "$window_id" ]]; then + hyprctl setprop address:$(echo $address | xargs) forcenoborder 0 lock + fi + done + fi + + # Handle all the other workspaces with only one window + single_window_workspaces=$(hyprctl workspaces -j | jq '.[] | select(.windows == 1)' | jq ".id") + for workspace in $single_window_workspaces + do + window=$(hyprctl clients -j | jq ".[] | select(.workspace.id == $workspace) | .address") + hyprctl setprop address:$(echo $window | xargs) forcenoborder 1 lock + done + + elif [[ ''${1:0:11} == "closewindow" ]] + then + workspace_id=$(hyprctl activewindow -j | jq ".workspace.id") + windows=$(hyprctl workspaces -j | jq ".[] | select(.id == $workspace_id) | .windows") + + if [[ $windows -eq 1 ]] + then + window_id=$(hyprctl activewindow -j | jq -r ".address") + floating_status=$(hyprctl activewindow -j | jq ".floating") + if [[ $floating_status == "false" ]] + then + hyprctl setprop address:$window_id forcenoborder 1 lock + else + hyprctl setprop address:$window_id forcenoborder 0 lock + return + fi + + fi + + elif [[ ''${1:0:18} == "changefloatingmode" ]] + then + floating_status=$(echo $1 | cut --delimiter ">" --fields 3 | cut --delimiter "," --fields 2) + address="0x$(echo $1 | cut --delimiter ">" --fields 3 | cut --delimiter "," --fields 1)" + workspace_id=$(hyprctl clients -j | jq --arg address "$address" '.[] | select(.address == $address) | .workspace.id') + if [[ $floating_status -eq 1 ]] + then + hyprctl setprop address:$address forcenoborder 0 lock + else + no_windows=$(hyprctl workspaces -j | jq ".[] | select(.id == $workspace_id) | .windows") + if [[ $no_windows -eq 1 ]] + then + hyprctl setprop address:$address forcenoborder 1 lock + else + hyprctl setprop address:$address forcenoborder 0 lock + fi + fi + fi + } + + # Socket directory has changed in Hyprland v0.40.0 + # socat - UNIX-CONNECT:/tmp/hypr/$(echo $HYPRLAND_INSTANCE_SIGNATURE)/.socket2.sock | while read line; do handle $line; done + socat - UNIX-CONNECT:$(echo $XDG_RUNTIME_DIR)/hypr/$(echo $HYPRLAND_INSTANCE_SIGNATURE)/.socket2.sock | while read line; do handle $line; done + ''; + }; + }; + +}