open_application.zsh 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #!/bin/zsh
  2. export TERMINAL_PATH=/Applications/Alacritty.app/
  3. export BROWSER_PATH=/Applications/Firefox.app/
  4. export FINDER_PATH=/System/Library/CoreServices/Finder.app/
  5. export COMMUNICATIONS_PATH=/Applications/Slack.app/
  6. export MUSIC_PATH=/Applications/Spotify.app/
  7. export NOTETAKING_PATH=/Applications/Obsidian.app/
  8. export PROJECTTRACKING_PATH=/Applications/Asana.app/
  9. export PROJECTDOCS_PATH=/Applications/Notion.app/
  10. export VIDEOCALL_PATH=$HOME/Applications/Google\ Meet.app/
  11. export ALT_COMMUNICATIONS_PATH=/Applications/Signal.app/
  12. export ALT_NOTETAKING_PATH=/Applications/Obsidian.app/
  13. valid_selection=true
  14. case $1 in
  15. terminal)
  16. open $TERMINAL_PATH ;;
  17. browser)
  18. open $BROWSER_PATH ;;
  19. finder)
  20. yabai -m window --focus $(yabai -m query --windows | jq 'map(select(.app=="Finder")) | first | .id') || open $FINDER_PATH ;;
  21. communications)
  22. open $COMMUNICATIONS_PATH || open $ALT_COMMUNICATIONS_PATH ;;
  23. music)
  24. open $MUSIC_PATH ;;
  25. notetaking)
  26. open $ALT_NOTETAKING_PATH || open $NOTETAKING_PATH ;;
  27. videocall)
  28. yabai -m window --focus $(yabai -m query --windows | jq 'map(select(.app == "Google Meet")) | first | .id') || \
  29. open $VIDEOCALL_PATH || open $ALT_COMMUNICATIONS_PATH ;;
  30. projecttracking)
  31. open $PROJECTTRACKING_PATH ;;
  32. projectdocs)
  33. open $PROJECTDOCS_PATH ;;
  34. *)
  35. valid_selection=false
  36. esac
  37. if [ "$valid_selection" = true ] ; then
  38. windows=$(yabai -m query --windows)
  39. spaces=$(yabai -m query --spaces)
  40. displays=$(yabai -m query --displays)
  41. active_display=$(jq 'map(select(."has-focus"==true)) | map(.display) | first' <<< $spaces)
  42. active_space=$(jq 'map(select(."has-focus"==true)) | map(.index) | first' <<< $spaces)
  43. other_space=$(jq 'map(select(."has-focus"==false and ."is-visible"==true)) | map(.index) | first' <<< $spaces)
  44. # If there are 3+ windows in the space, then make selected the largest window
  45. shared_windows=$(jq --argjson space "$active_space" 'map(select(.space==$space)) | map( { ("size"): (.frame.w * .frame.h), "id": .id, "focus": ."has-focus", "title": .title } ) | sort_by(.size)' <<< $windows)
  46. focused_window=$(jq 'map(select(.focus)) | first | .id' <<< $shared_windows)
  47. if [ $(jq 'length' <<< $shared_windows ) -gt 2 ]; then
  48. largest_window=$(jq 'last | .id' <<< $shared_windows)
  49. if [ "$focused_window" != "$largest_window" ]; then
  50. yabai -m window $focused_window --swap $largest_window
  51. fi
  52. fi
  53. yabai -m window $focused_window --focus
  54. fi