luravoid

dynamicscratch

Mar 30th, 2024
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 2.80 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. STORE_FILE="/tmp/.dm_scratch"
  4.  
  5. if [ ! -f "$STORE_FILE" ]; then
  6.     touch "$STORE_FILE"
  7. fi
  8.  
  9. # Add / remove scratchpad
  10. toggle_dynamic() {
  11.     workspace_name="$1"
  12.     active_window=$(hyprctl -j activewindow | jq -r '.address')
  13.     active_workspace=$(hyprctl -j activeworkspace | jq -r '.name')
  14.  
  15.     if [ "$active_window" != "null" ]; then
  16.         window_workspace=$(hyprctl -j clients | jq --arg ADDRESS "$active_window" '.[] | select(.address == $ADDRESS)' | jq -r '.workspace.name')
  17.         if grep -q "SCRATCHPAD: $active_window" "$STORE_FILE"; then
  18.             sed -i "/SCRATCHPAD: $active_window/d" "$STORE_FILE"
  19.             hyprctl notify -1 1500 "rgb(98971a)" Dynamic Window - Removed
  20.         elif [ "$window_workspace" != "$workspace_name" ]; then
  21.             echo "SCRATCHPAD: $active_window $workspace_name" >>"$STORE_FILE"
  22.             hyprctl dispatch movetoworkspacesilent "$workspace_name","address:$active_window"
  23.             hyprctl notify -1 1500 "rgb(98971a)" Dynamic Window - Added
  24.         fi
  25.     else
  26.         hyprctl notify -1 1500 "rgb(98971a)" No active window
  27.     fi
  28. }
  29.  
  30. # View / hide scratchpad
  31. view_dynamic() {
  32.     workspace_name="$1"
  33.     active_workspace=$(hyprctl activeworkspace -j | jq -r '.name')
  34.  
  35.     any_windows_moved=0
  36.     while IFS= read -r line; do
  37.         prefix=$(echo "$line" | cut -d ' ' -f 1)
  38.         if [ "$prefix" == "SCRATCHPAD:" ]; then
  39.             window_address=$(echo "$line" | cut -d ' ' -f 2)
  40.             original_workspace=$(echo "$line" | cut -d ' ' -f 3)
  41.             window_workspace=$(hyprctl -j clients | jq --arg ADDRESS "$window_address" '.[] | select(.address == $ADDRESS)' | jq -r '.workspace.name')
  42.             if [ "$window_workspace" == "$active_workspace" ] && [ "$original_workspace" == "$workspace_name" ]; then
  43.                 hyprctl dispatch movetoworkspacesilent "$original_workspace","address:$window_address"
  44.                 sed -i "/^$window_address /d" "$STORE_FILE"
  45.                 any_windows_moved=1
  46.             fi
  47.         fi
  48.     done <"$STORE_FILE"
  49.  
  50.     if [ "$any_windows_moved" -eq 0 ]; then
  51.         while IFS= read -r line; do
  52.             prefix=$(echo "$line" | cut -d ' ' -f 1)
  53.             if [ "$prefix" == "SCRATCHPAD:" ]; then
  54.                 window_address=$(echo "$line" | cut -d ' ' -f 2)
  55.                 original_workspace=$(echo "$line" | cut -d ' ' -f 3)
  56.                 window_workspace=$(hyprctl -j clients | jq --arg ADDRESS "$window_address" '.[] | select(.address == $ADDRESS)' | jq -r '.workspace.name')
  57.                 if [ "$original_workspace" == "$workspace_name" ]; then
  58.                     if [ "$window_workspace" != "$active_workspace" ]; then
  59.                         hyprctl dispatch movetoworkspace "$active_workspace","address:$window_address"
  60.                     else
  61.                         hyprctl dispatch movetoworkspacesilent "$workspace_name","address:$window_address"
  62.                     fi
  63.                 fi
  64.             fi
  65.         done <"$STORE_FILE"
  66.     fi
  67. }
  68.  
  69. while getopts "t:v:" opt; do
  70.     case ${opt} in
  71.         t)
  72.             toggle_dynamic "$OPTARG"
  73.             ;;
  74.         v)
  75.             view_dynamic "$OPTARG"
  76.             ;;
  77.         *)
  78.             echo "Invalid option: -$OPTARG" 1>&2
  79.             exit 1
  80.             ;;
  81.     esac
  82. done
Advertisement
Add Comment
Please, Sign In to add comment