diff --git a/home/toph/common/optional/hyprland/binds.nix b/home/toph/common/optional/hyprland/binds.nix index e5c524e..2b81e6d 100644 --- a/home/toph/common/optional/hyprland/binds.nix +++ b/home/toph/common/optional/hyprland/binds.nix @@ -26,7 +26,7 @@ let editor = "code"; launcher = "${pkgs.walker}/bin/walker --modules applications,ssh"; pactl = lib.getExe' pkgs.pulseaudio "pactl"; - terminal = exec ./scripts/terminal.fish; + terminal = exec (import ./scripts/terminal.nix { inherit pkgs; }); ## Long ass keys ## lowerVol = "XF86AudioLowerVolume"; @@ -148,47 +148,8 @@ let }; }; + submaps-script = import ./scripts/submaps.nix { inherit pkgs; }; submaps-json = pkgs.writeText "submaps.json" (builtins.toJSON submaps); - submaps-script = pkgs.writeScript "submap-script" '' - #!/usr/bin/env fish - - # Usage: ./parse_submaps.fish path/to/file.json - if test (count $argv) -lt 1 - echo "Usage: $argv[0] path/to/file.json" - exit 1 - end - - set json_file $argv[1] - - # Iterate over submaps preserving order - for entry in (${pkgs.jq}/bin/jq -c '.| to_entries[]' $json_file) - set submap_name (echo $entry | ${pkgs.jq}/bin/jq -r '.key') - echo "submap=$submap_name" - - # Process each binds entry within the submap - for bind_entry in (echo $entry | ${pkgs.jq}/bin/jq -c '.value.binds | to_entries[]') - set bind_key (echo $bind_entry | ${pkgs.jq}/bin/jq -r '.key') - - if test "$bind_key" = "" - set prefix "bind=" - else if test "$bind_key" = "unbind" - set prefix "unbind=" - else - set prefix "bind$bind_key=" - end - - # Process each binding's value in the array - for binding in (echo $bind_entry | ${pkgs.jq}/bin/jq -r '.value[]') - echo "$prefix$binding" - end - end - - # Append submap reset except for default "" submap - if not test "$submap_name" = "" - echo "submap=reset" - end - end - ''; submaps-run = pkgs.runCommand "submaps-run" { inherit submaps-json submaps-script; } '' mkdir -p $out ${pkgs.fish}/bin/fish ${submaps-script} ${submaps-json} > $out/submaps-out diff --git a/home/toph/common/optional/hyprland/plugins.nix b/home/toph/common/optional/hyprland/plugins.nix index 2e84108..e018858 100644 --- a/home/toph/common/optional/hyprland/plugins.nix +++ b/home/toph/common/optional/hyprland/plugins.nix @@ -33,6 +33,7 @@ showSpecialWorkspaces = true; }; scroller = { + mode = "row"; center_active_column = true; center_active_window = false; focus_wrap = true; @@ -59,7 +60,7 @@ # window_heights = seveneighths onehalf onethird twothirds # ), # )''; - monitor_options = "(DP-3 = (mode = row;column_default_width = onehalf;column_widths = threequarters twothirds onehalf onethird;window_default_height = one;window_heights = one seveneighths twothirds onehalf onethird),HDMI-A-2 = (mode = col; column_default_width = one;column_widths = one onehalf;window_default_height = twothirds;window_heights = seveneighths twothirds onehalf onethird),)"; + monitor_options = "(DP-3 = (mode = row;column_default_width = onehalf;column_widths = seveneighths threequarters twothirds onehalf onethird;window_default_height = one;window_heights = one seveneighths twothirds onehalf onethird),HDMI-A-2 = (mode = col; column_default_width = one;column_widths = one onehalf;window_default_height = twothirds;window_heights = seveneighths twothirds onehalf onethird),)"; }; }; }; diff --git a/home/toph/common/optional/hyprland/rules.nix b/home/toph/common/optional/hyprland/rules.nix index 943ace0..7425169 100644 --- a/home/toph/common/optional/hyprland/rules.nix +++ b/home/toph/common/optional/hyprland/rules.nix @@ -1,7 +1,29 @@ +{ pkgs, ... }: +let + # Zen extensions to float + zen-script = import ./scripts/zen-float.nix { inherit pkgs; }; + zen-json = pkgs.writeText "zen-extensions.json" (builtins.toJSON zen-extensions); + zen-extensions = { + bitwarden = { + regex = "'*(Bitwarden Password Manager) - Bitwarden*'"; + x = 500; + y = 900; + }; + authenticator = { + regex = "'*(Authenticator) - Authenticator*'"; + x = 335; + y = 525; + }; + }; +in { - wayland.windowManager.hyprland.settings = { + # Floats zen extensions + exec-once = [ + "${pkgs.fish}/bin/fish ${zen-script} ${zen-json}" + ]; + ## Layers Rules ## layer = [ @@ -23,7 +45,7 @@ "float, title:^(Accounts)(.*)$" "float, title:^(Media viewer)$" - ## Zen ## + # Zen "suppressevent maximize, class:^(zen)$" "float, title:^(Picture-in-Picture)$" "pin, title:^(Picture-in-Picture)$" @@ -31,6 +53,22 @@ "workspace special silent, title:^(Zen — Sharing Indicator)$" "workspace special silent, title:^(.*is sharing (your screen|a window)\.)$" + # Foot + "plugin:scroller:modemodifier col after focus, class:^(foot)$" + "plugin:scroller:windowheight onethird, class:^(foot)$" + + # Vesktop + "workspace 1, class:^(vesktop)$" + "plugin:scroller:group vesktop, class:^(vesktop)$" + "opaque, initialTitle:^(Discord Popout)$" + "plugin:scroller:modemodifier row before focus, initialTitle:^(Discord Popout)$" + "plugin:scroller:windowheight onethird, initialTitle:^(Discord Popout)$" + + # VsCode + "plugin:scroller:group code, class:^(code)$" + "plugin:scroller:alignwindow center, class:^(code)$" + "plugin:scroller:windowheight seveneighths, class:^(code)$" + # Float Apps "float, class:^(galculator)$" "float, class:^(waypaper)$" @@ -44,7 +82,6 @@ # Always opaque "opaque, class:^([Gg]imp)$" "opaque, class:^([Ff]lameshot)$" - "opaque, class:^([Ii]nkscape)$" "opaque, class:^([Bb]lender)$" "opaque, class:^([Oo][Bb][Ss])$" @@ -78,7 +115,6 @@ # "monitor:DP-1, ${flameshot}" ## Workspace Assignments ## - "workspace 1, initialClass:^(vesktop)$" "workspace 1, initialClass:^(spotify)$" "workspace 1, initialClass:^(org.telegram.desktop)$" # "workspace name:4, initialClass:^(virt-manager)$" diff --git a/home/toph/common/optional/hyprland/scripts/default.nix b/home/toph/common/optional/hyprland/scripts/default.nix index b23287b..af99a4f 100644 --- a/home/toph/common/optional/hyprland/scripts/default.nix +++ b/home/toph/common/optional/hyprland/scripts/default.nix @@ -1,4 +1,3 @@ -{ lib, ... }: { - imports = lib.custom.scanPaths ./.; + # :D } diff --git a/home/toph/common/optional/hyprland/scripts/submaps.nix b/home/toph/common/optional/hyprland/scripts/submaps.nix new file mode 100644 index 0000000..60ef94a --- /dev/null +++ b/home/toph/common/optional/hyprland/scripts/submaps.nix @@ -0,0 +1,44 @@ +{ + pkgs, + ... +}: +pkgs.writeScript "submap-script" '' + #!/usr/bin/env fish + + # Usage: ./parse_submaps.fish path/to/file.json + if test (count $argv) -lt 1 + echo "Usage: $argv[0] path/to/file.json" + exit 1 + end + + set json_file $argv[1] + + # Iterate over submaps preserving order + for entry in (${pkgs.jq}/bin/jq -c '.| to_entries[]' $json_file) + set submap_name (echo $entry | ${pkgs.jq}/bin/jq -r '.key') + echo "submap=$submap_name" + + # Process each binds entry within the submap + for bind_entry in (echo $entry | ${pkgs.jq}/bin/jq -c '.value.binds | to_entries[]') + set bind_key (echo $bind_entry | ${pkgs.jq}/bin/jq -r '.key') + + if test "$bind_key" = "" + set prefix "bind=" + else if test "$bind_key" = "unbind" + set prefix "unbind=" + else + set prefix "bind$bind_key=" + end + + # Process each binding's value in the array + for binding in (echo $bind_entry | ${pkgs.jq}/bin/jq -r '.value[]') + echo "$prefix$binding" + end + end + + # Append submap reset except for default "" submap + if not test "$submap_name" = "" + echo "submap=reset" + end + end +'' diff --git a/home/toph/common/optional/hyprland/scripts/terminal.fish b/home/toph/common/optional/hyprland/scripts/terminal.fish deleted file mode 100644 index 17c3fb8..0000000 --- a/home/toph/common/optional/hyprland/scripts/terminal.fish +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env fish - -foot \ No newline at end of file diff --git a/home/toph/common/optional/hyprland/scripts/terminal.nix b/home/toph/common/optional/hyprland/scripts/terminal.nix new file mode 100644 index 0000000..7605062 --- /dev/null +++ b/home/toph/common/optional/hyprland/scripts/terminal.nix @@ -0,0 +1,10 @@ +{ + pkgs, + ... +}: +# TODO: obviously lol +# Handle float terminal and grim select terminal +pkgs.writeScript "terminal-launch" '' + #!/usr/bin/env fish + foot +'' diff --git a/home/toph/common/optional/hyprland/scripts/zen-float.nix b/home/toph/common/optional/hyprland/scripts/zen-float.nix index 921e6b0..31605bb 100644 --- a/home/toph/common/optional/hyprland/scripts/zen-float.nix +++ b/home/toph/common/optional/hyprland/scripts/zen-float.nix @@ -1,78 +1,60 @@ -{ pkgs, lib, ... }: -let - zen-extensions = { - bitwarden = { - regex = "'*(Bitwarden Password Manager) - Bitwarden*'"; - x = 500; - y = 900; - }; - authenticator = { - regex = "'*(Authenticator) - Authenticator*'"; - x = 335; - y = 525; - }; - }; - - zen-json = pkgs.writeText "zen-extensions.json" (builtins.toJSON zen-extensions); - zen-script = pkgs.writeScript "zen-script" '' - #!/usr/bin/env fish - - function handle - set -l line $argv[1] - switch $line - case "windowtitlev2*" - # Expected format: windowtitlev2>>, - set -l payload (string replace -r '^windowtitlev2>>' "" $line) - set -l parts (string split "," $payload) - set -l window_id (string trim $parts[1]) - set -l title (string join "," $parts[2..-1]) - - # Debug output - echo "Extracted window_id: [$window_id]" - echo "Extracted title: [$title]" - - # Loop over the extensions defined in the JSON file. - for ext in ( ${pkgs.jq}/bin/jq -r 'keys[]' ${zen-json} ) - echo "Processing extension: [$ext]" - # Get regex, x and y for the current extension. - set -l reg ( ${pkgs.jq}/bin/jq -r --arg k $ext '.[$k].regex' ${zen-json} ) - set -l ext_x ( ${pkgs.jq}/bin/jq -r --arg k $ext '.[$k].x' ${zen-json} ) - set -l ext_y ( ${pkgs.jq}/bin/jq -r --arg k $ext '.[$k].y' ${zen-json} ) - - # Remove any extra surrounding single quotes. - set -l reg (string trim -c "'" $reg) - - # Debug: show the extension and regex being used. - echo "Checking extension [$ext] with regex [$reg] against title [$title]" - - # If the title matches the regex, dispatch floating commands. - if string match -q -- "*$reg*" "$title" - echo "$ext window id: $window_id -- setting float mode with size $ext_x x $ext_y" - hyprctl --batch "dispatch togglefloating address:0x$window_id; dispatch resizewindowpixel exact $ext_x $ext_y,address:0x$window_id; dispatch movewindowpixel exact 64% 3%,address:0x$window_id" - return - end - end - ;; - case "*" - # Do nothing for other events. - ;; - end - end - - ${pkgs.socat}/bin/socat -U - UNIX-CONNECT:/run/user/1000/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock | while read -l line - handle "$line" - end - ''; -in { - wayland.windowManager.hyprland.settings = { - exec-once = [ - "${pkgs.fish}/bin/fish ${zen-script}" - ]; + pkgs, + ... +}: +pkgs.writeScript "zen-script" '' + #!/usr/bin/env fish - windowrulev2 = [ - # Zen Extensions - "suppressevent maximize, class:^(zen)$" - ]; - }; -} + if test (count $argv) -lt 1 + echo "Usage: $argv[0] path/to/your.json" + exit 1 + end + + set json_file $argv[1] + + function handle + set -l line $argv[1] + set -l file_path $argv[2] + switch $line + case "windowtitlev2*" + # Expected format: windowtitlev2>><id>,<title> + set -l payload (string replace -r '^windowtitlev2>>' "" $line) + set -l parts (string split "," $payload) + set -l window_id (string trim $parts[1]) + set -l title (string join "," $parts[2..-1]) + + # Debug output + echo "Extracted window_id: [$window_id]" + echo "Extracted title: [$title]" + + # Loop over the extensions defined in the JSON file. + for ext in ( ${pkgs.jq}/bin/jq -r 'keys[]' $file_path ) + echo "Processing extension: [$ext]" + # Get regex, x and y for the current extension. + set -l reg ( ${pkgs.jq}/bin/jq -r --arg k $ext '.[$k].regex' $file_path ) + set -l ext_x ( ${pkgs.jq}/bin/jq -r --arg k $ext '.[$k].x' $file_path ) + set -l ext_y ( ${pkgs.jq}/bin/jq -r --arg k $ext '.[$k].y' $file_path ) + + # Remove any extra surrounding single quotes. + set -l reg (string trim -c "'" $reg) + + # Debug: show the extension and regex being used. + echo "Checking extension [$ext] with regex [$reg] against title [$title]" + + # If the title matches the regex, dispatch floating commands. + if string match -q -- "*$reg*" "$title" + echo "$ext window id: $window_id -- setting float mode with size $ext_x x $ext_y" + hyprctl --batch "dispatch togglefloating address:0x$window_id; dispatch resizewindowpixel exact $ext_x $ext_y,address:0x$window_id;" + return + end + end + + case "*" + # Do nothing for other events. + end + end + + ${pkgs.socat}/bin/socat -U - UNIX-CONNECT:/run/user/1000/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock | while read -l line + handle "$line" "$json_file" + end +'' diff --git a/hosts/common/optional/hyprland/default.nix b/hosts/common/optional/hyprland/default.nix index 058e8a1..1b2072d 100644 --- a/hosts/common/optional/hyprland/default.nix +++ b/hosts/common/optional/hyprland/default.nix @@ -15,5 +15,6 @@ environment.systemPackages = [ inputs.rose-pine-hyprcursor.packages.${pkgs.system}.default + inputs.better-control.packages.${pkgs.system}.better-control ]; }