Een windowmanager in Applescript

Eén van de dingen die OSX mist is een gereedschap om vensters op de juiste plek te krijgen. Toegegeven: dit is voor sommige mensen helemaal geen probleem! Sommige collega's van mij zetten hun vensters op elk leeg plekje wat maar beschikbaar is en kunnen blijkbaar zeer productief zijn: de enkele keer dat ik achter één van hun computers moet zitten erger ik me echter dood en kan juist dat ene venster niet vinden omdat het half buiten de ruimte van de desktop is geplaatst achter één of meer andere vensters… Dat er meer mensen zijn die dit vervelend vinden blijkt wel uit de enorme hoeveelheid programma's die de laatste jaren beschikbaar is gekomen die dit kunnen regelen. Deze bieden vaak veel meer mogelijkheden dan ik zelf nodig heb: voor je het weet ben je weer lange tijd bezig met het instellen van de voorkeuren of het leren van reeksen toets-combinaties (die weer kunnen conflicteren met een ander programma).

Voor mij bied Applescript genoeg mogelijkheden om dit te kunnen regelen: alle programma's die ik gebruik kunnen met dit soort Applescript commando's werken. Er zijn natuurlijk ook programma's die dit niet kunnen: de meeste Adobe applicaties begrijpen er niets van, maar die werken meestal ook niet met de andere windowmanagers.

Om te beginnen moet je weten wat nu precies het formaat (in pixels) is van je beeldscherm. In Applescript doe je dit als volgt:

  1. tell application "Finder"
  2. get bounds of window of desktop
  3. end tell

Als resultaat geeft dit vier getallen geplaatst in een array: bijvoorbeeld: {0, 0, 1366, 768}. De getallen staan voor top en left, het derde getal voor right en het laatste getal voor bottom. We willen deze getallen opslaan voor later gebruik: gegevens in een array kunnen we namelijk telkens opnieuw gebruiken. Vervolgens willen we iets met deze gegevens doen in het programma waarin we werken.

Met de volgende regel plaatsen we het actieve programma in een variabele. Deze noemen we front_app, maar het kan natuurlijk elke naam krijgen die we maar willen.

  1. set front_app to (path to frontmost application as Unicode text)

Vervolgens moeten we het formaat opvragen van het eerste venster van de actieve applicatie:

  1. tell application front_app
  2. get bounds of window 1
  3. end tell

Ook het eerste venster van onze front_app heeft vier variablen in een array die we kunnen gebruiken in ons script (bijvoorbeeld {3, 42, 605, 695}). Als we deze als variabelen definiëren (door ze een naam te geven) kunnen we ze met eenvoudige rekensommen op de juiste plek van het scherm zetten:

  1. tell application front_app
  2. set windowXl to item 1 of windowSize
  3. set windowYt to item 2 of windowSize
  4. set windowXr to item 3 of windowSize
  5. set windowYb to item 4 of windowSize
  6. end tell

Het volgende script bijvoorbeeld centreert het eerste venster van het actieve programma op een scherm:

  1. tell application "Finder"
  2. set screenSize to bounds of window of desktop
  3. set screenWidth to item 3 of screenSize
  4. end tell
  5. set front_app to (path to frontmost application as Unicode text)
  6. tell application front_app
  7. set windowXl to item 1 of windowSize
  8. set windowYt to item 2 of windowSize
  9. set windowXr to item 3 of windowSize
  10. set windowYb to item 4 of windowSize
  11. set windowWidth to windowXr - windowXl
  12. set bounds of window 1 to {¬
  13. (screenWidth - windowWidth) / 2.0, ¬
  14. windowYt, ¬
  15. (screenWidth + windowWidth) / 2.0, ¬
  16. windowYb}
  17. end tell

Als je deze code allemaal netjes in de Applescript Editor hebt ingetypt blijkt natuurlijk dat het alleen in de Editor zelf werkt. Je moet het script op de één of andere manier beschikbaar stellen aan het programma waarin je het wilt gebruiken. Standaard kan dat op twee manieren:

  1. Door het in Automator als een voorziening op te slaan (in een Voer Applescript actie te plaatsen)
  2. Door in de voorkeuren van Applsecript Editor het Applescript Menu te activeren, en het in de centrale scriptmap te plaatsen