Een windowmanager in Applescript

Op de vorige pagina heb ik een eenvoudig script beschreven om een venster van een actief programma te centreren op een beeldscherm. Natuurlijk is dit slechts een eenvoudig voorbeeld wat waarschijnlijk alleen bruikbaar is voor mensen die mijn aversie tegen asymmetrie delen. Op basis van dit systeem is er echter heel wat meer mogelijk.

Het volgende script plaatst een scherm aan de linkerzijde en vult de helft van de beschikbare ruimte. Het houdt rekening met een aantal factoren: de hoogte van de dock (die bij iedere computer anders kan zijn) en het werkt om een bug van Applescript heen die duidelijk worden als je het programma in BBEdit gebruikt.

Het script gebruikt een optie die diep ingrijpt in OSX. Vanwege de veiligheid moet dit eerst door de gebruiker worden toegestaan. De schuldige hiervoor is de application "System Events": als deze geen toestemming heeft van een administrator werkt deze code niet.

Het volgende script plaatst een venster van het actieve programma aan de linkerzijde van het scherm en neemt dan precies een half scherm in beslag. Ik draai dit programma alleen in BBEdit vanuit het Scripts menu: hierdoor kan ik er een toetsencombinatie aan toekennen.

  1. -- get the size of your screen
  2. tell application "Finder"
  3. set _screen_size to the bounds of the window of desktop
  4. -- place the bounds in variables:
  5. set _left_screen to (item 1 of _screen_size)
  6. set _top_screen to (item 2 of _screen_size)
  7. set _total_screenwidth to (item 3 of _screen_size)
  8. set _total_screenheight to (item 4 of _screen_size)
  9. end tell
  10. -- get the size of your dock
  11. tell application "System Events" to tell process "Dock"
  12. set _dock_size to size in list 1
  13. -- place the width and height in variables:
  14. set _dock_width to item 1 of _dock_size
  15. set _dock_height to item 2 of _dock_size
  16. end tell
  17. -- make some helper variables
  18. set _menubar_height to (_top_screen + 22)
  19. set _BBEdit_fix to (_top_screen + 44)
  20. -- use all variables for calculations and placement of screens
  21. set _half_screenwidth to (_total_screenwidth / 2)
  22. set _max_height to (_total_screenheight - _dock_height)
  23. -- get the name of the frontmost application
  24. tell application "System Events"
  25. set _front_app to the name of the first process whose frontmost is true
  26. end tell
  27. -- activate the front application:
  28. tell application _front_app
  29. activate
  30. if _front_app = "BBEdit" then
  31. tell front window
  32. set the bounds to {_left_screen, _BBEdit_fix, _half_screenwidth, _max_height}
  33. end tell
  34. else
  35. tell front window
  36. set the bounds to {_left_screen, _menubar_height, _half_screenwidth, _max_height}
  37. end tell
  38. end if
  39. end tell

Een variatie op deze code is nodig om het scherm aan de rechterzijde van het scherm te plaatsen:

  1. -- activate the front application:
  2. tell application _front_app
  3. activate
  4. if _front_app = "BBEdit" then
  5. tell front window
  6. set the bounds to {_half_screenwidth, _BBEdit_fix, (_half_screenwidth * 2), _max_height}
  7. end tell
  8. else
  9. tell front window
  10. set the bounds to {_half_screenwidth, _menubar_height, (_half_screenwidth * 2), _max_height}
  11. end tell
  12. end if
  13. end tell