55 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| get_windows_with_workspace() {
 | |
|     swaymsg -t get_tree | jq -r '
 | |
|         def calc_ws_name(ws_name):
 | |
|             if ws_name == "__i3_scratch" then "_"
 | |
|             elif (ws_name | test("^[0-9]+:")) then (ws_name | sub("^[0-9]+:"; ""))
 | |
|             else ws_name
 | |
|             end;
 | |
| 
 | |
|         def get_windows(workspace_name):
 | |
|             if (.type == "con" or .type == "floating_con") and .pid != null and (.name // "") != "" then
 | |
|                 {
 | |
|                     id: .id,
 | |
|                     name: .name | ascii_downcase,
 | |
|                     app_id: (.app_id // .window_properties.class // "unknown") | ascii_downcase,
 | |
|                     workspace: workspace_name,
 | |
|                     focused: .focused
 | |
|                 }
 | |
|             else empty end,
 | |
|             (.nodes[]? | get_windows(workspace_name)),
 | |
|             (.floating_nodes[]? | get_windows(workspace_name));
 | |
| 
 | |
|         def traverse_all:
 | |
|             if .type == "workspace" then
 | |
|                 . as $ws | (.name | calc_ws_name(.)) as $ws_name | get_windows($ws_name)
 | |
|             else empty end,
 | |
|             (.nodes[]? | traverse_all);
 | |
| 
 | |
|         traverse_all |
 | |
|         "\(.id)|\(.app_id)|\(.name)|\(.workspace)|\(.focused)"
 | |
|     '
 | |
| }
 | |
| window_list=$(get_windows_with_workspace)
 | |
| 
 | |
| formatted_list=$(echo "$window_list" | while IFS='|' read -r id app_id name workspace focused; do
 | |
|     if [ "$focused" = "true" ]; then
 | |
|         indicator="> "
 | |
|     else
 | |
|         indicator="  "
 | |
|     fi
 | |
| 
 | |
|     printf "%s%s%s %s %s\n" "$workspace" "$indicator" "$id" "$app_id" "$name"
 | |
| done)
 | |
| 
 | |
| selection=$(echo "$formatted_list" | bemenu --auto-select --width-factor 100 --prompt "/" --index "$(echo "$formatted_list" | awk 'substr($0,2,1)==">" {print NR-1}')" )
 | |
| [ -z "$selection" ] && exit 0
 | |
| 
 | |
| window_id=$(echo "$selection" | sed -E 's/^...([0-9]+).*/\1/')
 | |
| 
 | |
| if [ -n "$window_id" ]; then
 | |
|     swaymsg "[con_id=\"$window_id\"] focus"
 | |
| else
 | |
|     echo "Failed to extract window ID."
 | |
|     exit 1
 | |
| fi
 |