From 4a0c72174b35a24af5e6cc3c4e06e0614039da9d Mon Sep 17 00:00:00 2001 From: Ezri Brimhall Date: Mon, 8 Apr 2024 15:48:22 -0600 Subject: [PATCH] Workspace locator should now support more than 2 monitors --- .local/bin/sway-find-workspace | 43 ++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/.local/bin/sway-find-workspace b/.local/bin/sway-find-workspace index 8355e1e..3b8d121 100755 --- a/.local/bin/sway-find-workspace +++ b/.local/bin/sway-find-workspace @@ -7,18 +7,53 @@ for output in $(swaymsg -t get_outputs | jq '[ (.[] | select(.active) | pick(.na output_sets+=$output done +workspace_counts=() +total_workspaces=0 +for output in {1..${#output_sets[@]}}; do + workspace_counts+=$(jq <~/.config/sway/workspaces.json "[.[] | values[]][$((output - 1))] | length" -r) + ((total_workspaces += workspace_counts[output])) +done + workspaces=$(swaymsg -t get_workspaces) current_output=$(echo $workspaces | jq '.[] | select(.focused).output' -r) current_workspace=$(echo $workspaces | jq '.[] | select(.focused).name' -r) +function get_previous_output_workspaces { + output=$1 + previous_outputs=0 + if ((output == 0)); then + echo 0 + return + fi + for cur_output in {1..$output}; do + ((previous_outputs += workspace_counts[cur_output])) + done + echo $previous_outputs +} + function get_ws { ws_set=$1 ws_target=$2 - workspace=$((ws_set * 10 + ws_target)) - - if (( workspace == current_workspace )); then - workspace=$(( (workspace + 9) % 20 + 1 )) + echo "Searching for workspace $ws_target on output $ws_set" >&2 + workspace=$(($(get_previous_output_workspaces $ws_set) + ws_target)) + echo "Staying on this output would be workspace $workspace" >&2 + if ((workspace == current_workspace)); then + echo "We're already on the target workspace, so we should look to change outputs" >&2 + initial_ws_set=$ws_set + while :; do + ws_set=$(((ws_set + 1) % ${#output_sets[@]})) + echo "Checking output $ws_set" >&2 + if ((ws_target < workspace_counts[ws_set + 1])); then + workspace=$(($(get_previous_output_workspaces $ws_set) + ws_target)) + break + elif ((ws_set == initial_ws_set)); then + # If we've looped around to the initial output, just stay on the current workspace + break + else + echo "Output $ws_set doesn't have enough workspaces (only ${workspace_counts[$((ws_set + 1))]}), moving to the next one" >&2 + fi + done fi echo $workspace