Advertisement
luravoid

togglewindow

Mar 30th, 2024 (edited)
22
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 5.94 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. STORE_FILE="/tmp/.win_store"
  4. IGNORE_SPECIAL=true
  5.  
  6. if [ ! -f "$STORE_FILE" ]; then
  7.     touch "$STORE_FILE"
  8. fi
  9.  
  10. send_back() {
  11.     active_window_address=$(hyprctl -j activewindow | jq -r '.address')
  12.     found_in_store=$(grep "$active_window_address" "$STORE_FILE")
  13.  
  14.     if [ ! -z "$found_in_store" ]; then
  15.         original_workspace=$(echo "$found_in_store" | cut -d ' ' -f 2)
  16.         hyprctl dispatch movetoworkspacesilent "$original_workspace","address:$active_window_address"
  17.         sed -i "/$active_window_address/d" "$STORE_FILE"
  18.     else
  19.         hyprctl notify -1 1500 "rgb(98971a)" The active window has no origin.
  20.     fi
  21. }
  22.  
  23. toggle_class() {
  24.     window_class="$1"
  25.     active_workspace=$(hyprctl activeworkspace -j | jq -r '.name')
  26.  
  27.     any_windows_moved=0
  28.     while IFS= read -r line; do
  29.         window_address=$(echo "$line" | cut -d ' ' -f 1)
  30.         original_workspace=$(echo "$line" | cut -d ' ' -f 2)
  31.         if hyprctl -j clients | jq --arg ADDRESS "$window_address" --arg CLASS "$window_class" '.[] | select(.address == $ADDRESS and .class == $CLASS) | .workspace.name' | grep -q "$active_workspace"; then
  32.             hyprctl dispatch movetoworkspacesilent "$original_workspace","address:$window_address"
  33.             sed -i "/^$window_address /d" "$STORE_FILE"
  34.             any_windows_moved=1
  35.         fi
  36.     done <"$STORE_FILE"
  37.  
  38.     if [ "$any_windows_moved" -eq 0 ]; then
  39.         windows_info=$(hyprctl -j clients | jq --arg CLASS "$window_class" -c '.[] | select(.class == $CLASS)')
  40.  
  41.         echo "$windows_info" | while IFS= read -r window; do
  42.             window_address=$(echo "$window" | jq -r '.address')
  43.             window_workspace=$(echo "$window" | jq -r '.workspace.name')
  44.  
  45.             if $IGNORE_SPECIAL && [[ $window_workspace == *"special"* ]]; then
  46.                 continue
  47.             fi
  48.  
  49.             if grep -q "^$window_address " "$STORE_FILE"; then
  50.                 original_workspace=$(grep "^$window_address " "$STORE_FILE" | cut -d ' ' -f 2)
  51.                 sed -i "/^$window_address /d" "$STORE_FILE"
  52.                 echo "$window_address $window_workspace" >>"$STORE_FILE"
  53.                 hyprctl dispatch movetoworkspace "$active_workspace","address:$window_address"
  54.             else
  55.                 original_workspace_name=$(hyprctl -j clients | jq --arg ADDRESS "$window_address" '.[] | select(.address == $ADDRESS)' | jq -r '.workspace.name')
  56.                 if [ "$original_workspace_name" != "$active_workspace" ]; then
  57.                     echo "$window_address $window_workspace" >>"$STORE_FILE"
  58.                     hyprctl dispatch movetoworkspace "$active_workspace","address:$window_address"
  59.                 fi
  60.             fi
  61.         done
  62.     fi
  63. }
  64.  
  65. toggle_workspace() {
  66.     workspace_name="$1"
  67.     active_workspace=$(hyprctl activeworkspace -j | jq -r '.name')
  68.  
  69.     any_windows_moved=0
  70.     while IFS= read -r line; do
  71.         window_address=$(echo "$line" | cut -d ' ' -f 1)
  72.         original_workspace=$(echo "$line" | cut -d ' ' -f 2)
  73.         window_workspace=$(hyprctl -j clients | jq --arg ADDRESS "$window_address" '.[] | select(.address == $ADDRESS)' | jq -r '.workspace.name')
  74.         if [ "$window_workspace" == "$active_workspace" ] && [ "$original_workspace" == "$workspace_name" ]; then
  75.             hyprctl dispatch movetoworkspacesilent "$original_workspace","address:$window_address"
  76.             sed -i "/^$window_address /d" "$STORE_FILE"
  77.             any_windows_moved=1
  78.         fi
  79.     done <"$STORE_FILE"
  80.  
  81.  
  82.     if [ "$any_windows_moved" -eq 0 ]; then
  83.         windows_info=$(hyprctl -j clients | jq --arg WORKSPACE "$workspace_name" -c '.[] | select(.workspace.name == $WORKSPACE)')
  84.  
  85.         echo "$windows_info" | while IFS= read -r window; do
  86.             window_address=$(echo "$window" | jq -r '.address')
  87.             window_workspace=$(echo "$window" | jq -r '.workspace.name')
  88.  
  89.             if $IGNORE_SPECIAL && [[ $window_workspace == *"special"* ]]; then
  90.                 continue
  91.             fi
  92.  
  93.             if grep -q "^$window_address " "$STORE_FILE"; then
  94.                 original_workspace=$(grep "^$window_address " "$STORE_FILE" | cut -d ' ' -f 2)
  95.                 sed -i "/^$window_address /d" "$STORE_FILE"
  96.                 echo "$window_address $window_workspace" >>"$STORE_FILE"
  97.                 hyprctl dispatch movetoworkspace "$active_workspace","address:$window_address"
  98.             else
  99.                 original_workspace_name=$(hyprctl -j clients | jq --arg ADDRESS "$window_address" '.[] | select(.address == $ADDRESS)' | jq -r '.workspace.name')
  100.                 if [ "$original_workspace_name" != "$active_workspace" ]; then
  101.                     echo "$window_address $window_workspace" >>"$STORE_FILE"
  102.                     hyprctl dispatch movetoworkspace "$active_workspace","address:$window_address"
  103.                 fi
  104.             fi
  105.         done
  106.     fi
  107. }
  108.  
  109. select_window() {
  110.     active_workspace=$(hyprctl activeworkspace -j | jq -r '.name')
  111.     window_list=$(hyprctl -j clients | jq -r --arg active_workspace "$active_workspace" '.[] | select(.workspace.name != $active_workspace) | "\(.title) | \(.address)"')
  112.  
  113.     declare -A window_map
  114.     updated_window_list=""
  115.     index=1
  116.  
  117.     while IFS= read -r line; do
  118.         window_address=$(echo "$line" | awk -F ' | ' '{print $NF}')
  119.         window_map[$index]=$window_address
  120.         updated_window_list+="$index | "$(echo "$line" | sed "s/ | $window_address//")$'\n'
  121.         let index=index+1
  122.     done <<<"$window_list"
  123.  
  124.     selected_window=$(echo -e "$updated_window_list" | tofi --height 400 --prompt-text="Window: ")
  125.  
  126.     window_id=$(echo "$selected_window" | awk -F ' | ' '{print $1}')
  127.     window_address=${window_map[$window_id]}
  128.  
  129.     if [ -z "$window_address" ]; then
  130.         echo "No window selected."
  131.         exit 1
  132.     fi
  133.  
  134.     original_workspace=$(hyprctl -j clients | jq --arg ADDRESS "$window_address" '.[] | select(.address == $ADDRESS) | .workspace.name' | jq -r)
  135.  
  136.     if grep -q "^$window_address" "$STORE_FILE"; then
  137.         sed -i "/^$window_address/d" "$STORE_FILE"
  138.     fi
  139.  
  140.     hyprctl dispatch movetoworkspace "$active_workspace","address:$window_address"
  141.  
  142.     echo "$window_address $original_workspace" >>"$STORE_FILE"
  143. }
  144.  
  145. while getopts "sc:w:rb" opt; do
  146.     case ${opt} in
  147.     s)
  148.         IGNORE_SPECIAL=false
  149.         ;;
  150.     c)
  151.         if [ -z "$OPTARG" ]; then
  152.             echo "Usage: $0 -c <window_class>"
  153.             exit 1
  154.         fi
  155.         toggle_class "$OPTARG"
  156.         ;;
  157.     w)
  158.         if [ -z "$OPTARG" ]; then
  159.             echo "Usage: $0 -w <workspace_name>"
  160.             exit 1
  161.         fi
  162.         toggle_workspace "$OPTARG"
  163.         ;;
  164.     r)
  165.         select_window
  166.         ;;
  167.     b)
  168.         send_back
  169.         ;;
  170.     *)
  171.         echo "Invalid option: -$OPTARG" 1>&2
  172.         exit 1
  173.         ;;
  174.     esac
  175. done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement