Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- STORE_FILE="/tmp/.win_store"
- IGNORE_SPECIAL=true
- if [ ! -f "$STORE_FILE" ]; then
- touch "$STORE_FILE"
- fi
- send_back() {
- active_window_address=$(hyprctl -j activewindow | jq -r '.address')
- found_in_store=$(grep "$active_window_address" "$STORE_FILE")
- if [ ! -z "$found_in_store" ]; then
- original_workspace=$(echo "$found_in_store" | cut -d ' ' -f 2)
- hyprctl dispatch movetoworkspacesilent "$original_workspace","address:$active_window_address"
- sed -i "/$active_window_address/d" "$STORE_FILE"
- else
- hyprctl notify -1 1500 "rgb(98971a)" The active window has no origin.
- fi
- }
- toggle_class() {
- window_class="$1"
- active_workspace=$(hyprctl activeworkspace -j | jq -r '.name')
- any_windows_moved=0
- while IFS= read -r line; do
- window_address=$(echo "$line" | cut -d ' ' -f 1)
- original_workspace=$(echo "$line" | cut -d ' ' -f 2)
- 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
- hyprctl dispatch movetoworkspacesilent "$original_workspace","address:$window_address"
- sed -i "/^$window_address /d" "$STORE_FILE"
- any_windows_moved=1
- fi
- done <"$STORE_FILE"
- if [ "$any_windows_moved" -eq 0 ]; then
- windows_info=$(hyprctl -j clients | jq --arg CLASS "$window_class" -c '.[] | select(.class == $CLASS)')
- echo "$windows_info" | while IFS= read -r window; do
- window_address=$(echo "$window" | jq -r '.address')
- window_workspace=$(echo "$window" | jq -r '.workspace.name')
- if $IGNORE_SPECIAL && [[ $window_workspace == *"special"* ]]; then
- continue
- fi
- if grep -q "^$window_address " "$STORE_FILE"; then
- original_workspace=$(grep "^$window_address " "$STORE_FILE" | cut -d ' ' -f 2)
- sed -i "/^$window_address /d" "$STORE_FILE"
- echo "$window_address $window_workspace" >>"$STORE_FILE"
- hyprctl dispatch movetoworkspace "$active_workspace","address:$window_address"
- else
- original_workspace_name=$(hyprctl -j clients | jq --arg ADDRESS "$window_address" '.[] | select(.address == $ADDRESS)' | jq -r '.workspace.name')
- if [ "$original_workspace_name" != "$active_workspace" ]; then
- echo "$window_address $window_workspace" >>"$STORE_FILE"
- hyprctl dispatch movetoworkspace "$active_workspace","address:$window_address"
- fi
- fi
- done
- fi
- }
- toggle_workspace() {
- workspace_name="$1"
- active_workspace=$(hyprctl activeworkspace -j | jq -r '.name')
- any_windows_moved=0
- while IFS= read -r line; do
- window_address=$(echo "$line" | cut -d ' ' -f 1)
- original_workspace=$(echo "$line" | cut -d ' ' -f 2)
- window_workspace=$(hyprctl -j clients | jq --arg ADDRESS "$window_address" '.[] | select(.address == $ADDRESS)' | jq -r '.workspace.name')
- if [ "$window_workspace" == "$active_workspace" ] && [ "$original_workspace" == "$workspace_name" ]; then
- hyprctl dispatch movetoworkspacesilent "$original_workspace","address:$window_address"
- sed -i "/^$window_address /d" "$STORE_FILE"
- any_windows_moved=1
- fi
- done <"$STORE_FILE"
- if [ "$any_windows_moved" -eq 0 ]; then
- windows_info=$(hyprctl -j clients | jq --arg WORKSPACE "$workspace_name" -c '.[] | select(.workspace.name == $WORKSPACE)')
- echo "$windows_info" | while IFS= read -r window; do
- window_address=$(echo "$window" | jq -r '.address')
- window_workspace=$(echo "$window" | jq -r '.workspace.name')
- if $IGNORE_SPECIAL && [[ $window_workspace == *"special"* ]]; then
- continue
- fi
- if grep -q "^$window_address " "$STORE_FILE"; then
- original_workspace=$(grep "^$window_address " "$STORE_FILE" | cut -d ' ' -f 2)
- sed -i "/^$window_address /d" "$STORE_FILE"
- echo "$window_address $window_workspace" >>"$STORE_FILE"
- hyprctl dispatch movetoworkspace "$active_workspace","address:$window_address"
- else
- original_workspace_name=$(hyprctl -j clients | jq --arg ADDRESS "$window_address" '.[] | select(.address == $ADDRESS)' | jq -r '.workspace.name')
- if [ "$original_workspace_name" != "$active_workspace" ]; then
- echo "$window_address $window_workspace" >>"$STORE_FILE"
- hyprctl dispatch movetoworkspace "$active_workspace","address:$window_address"
- fi
- fi
- done
- fi
- }
- select_window() {
- active_workspace=$(hyprctl activeworkspace -j | jq -r '.name')
- window_list=$(hyprctl -j clients | jq -r --arg active_workspace "$active_workspace" '.[] | select(.workspace.name != $active_workspace) | "\(.title) | \(.address)"')
- declare -A window_map
- updated_window_list=""
- index=1
- while IFS= read -r line; do
- window_address=$(echo "$line" | awk -F ' | ' '{print $NF}')
- window_map[$index]=$window_address
- updated_window_list+="$index | "$(echo "$line" | sed "s/ | $window_address//")$'\n'
- let index=index+1
- done <<<"$window_list"
- selected_window=$(echo -e "$updated_window_list" | tofi --height 400 --prompt-text="Window: ")
- window_id=$(echo "$selected_window" | awk -F ' | ' '{print $1}')
- window_address=${window_map[$window_id]}
- if [ -z "$window_address" ]; then
- echo "No window selected."
- exit 1
- fi
- original_workspace=$(hyprctl -j clients | jq --arg ADDRESS "$window_address" '.[] | select(.address == $ADDRESS) | .workspace.name' | jq -r)
- if grep -q "^$window_address" "$STORE_FILE"; then
- sed -i "/^$window_address/d" "$STORE_FILE"
- fi
- hyprctl dispatch movetoworkspace "$active_workspace","address:$window_address"
- echo "$window_address $original_workspace" >>"$STORE_FILE"
- }
- while getopts "sc:w:rb" opt; do
- case ${opt} in
- s)
- IGNORE_SPECIAL=false
- ;;
- c)
- if [ -z "$OPTARG" ]; then
- echo "Usage: $0 -c <window_class>"
- exit 1
- fi
- toggle_class "$OPTARG"
- ;;
- w)
- if [ -z "$OPTARG" ]; then
- echo "Usage: $0 -w <workspace_name>"
- exit 1
- fi
- toggle_workspace "$OPTARG"
- ;;
- r)
- select_window
- ;;
- b)
- send_back
- ;;
- *)
- echo "Invalid option: -$OPTARG" 1>&2
- exit 1
- ;;
- esac
- done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement