Scripter le changement automatique de fond d'écran
Par Contributeur - Publié le
AppleScript est un language de programmation relativement simple de mise en oeuvre pour l'automatisation de taches relativement lourdes comme les discussions sur irc, (on peut réaliser un bot grâce a certaines applications scriptables, comme IRCLE), automatiser les fonctions du Finder (script de connection), etc... Mais bon, c'est assez abstrait tout ça, et vous ne vous sentez pas d'attaque a lire le manuel (deux tomes de 400 pages chacun, j'admets que c'est assez dissuasif)...
Heureusement, =MAC=4Ever, qui s'est pris la tête dessus pendant un petit mois, est là pour tout vous expliquer... Et va même vous apprendre à automatiser le changement de fond d'écran au démarrage (Note De Le Correcteur (c'est à dire De Le MathBat) : qu'il est fort ce 4Ever quand même !).
Matériel requis
Il vous faudra :
[ Un ordinateur avec une pomme dessus (toutes les pommes peuvent convenir, évitez cependant les SE l'écran est assez fatiguant, et puis ça chauffe vite...) ;
* L'application AppleScript Editor adapté au systeme de la bécanne (normalement elle est dessus de série) ;
* De la patience... (iTunes en fond de tâche ça aide) ;
* Des images à placer en fond d’écran.
Avant tout, la théorie
AppleScript est un langage de pilotage, d'automatisation de tâches, que ce soit pour le système ou pour les applications. Sa caractéristique clé est sa capacité a envoyer des commandes aux objets de différentes applications, y compris à ceux du Finder. Son but est d'interagir avec les applications afin de limiter les taches répétitives qui ne sont alors plus effectuées par l'utilisateur.
Pour cela, il peut capter des signaux envoyés par l'ordinateur (lors de l'arrivée d'un message sur irc, par exemple) et envoyer à celui-ci des instructions de manière simple, par l'intermédiaire des Apple Events.
De plus, pour pouvoir être utilisé par un plus grand nombre il utilise une syntaxe, qui, selon ses concepteurs, permet de l'appréhender de manière aussi intuitive que l'anglais. Certes, c'est agréable à lire, mais utiliser : set [variable] to [valeur] au lieu de l'habituel : [variable] = [valeur] ou : [variable] := [valeur] constitue plus, pour moi, une perte de temps qu'une simplification.
Enfin, et là, c'est tout simplement génial, l'éditeur présente le script tout seul, en le mettant en forme, avec des couleurs différentes pour les variables, fonctions, commentaires, texte non débugué, etc... On se rapproche de la perfection. Une fenêtre peut même être ouverte lors du débuggage d'un script pour voire quelles instructions sont effectuées et leurs résultat ("Event log", ou "pomme-e").
Un dernier avantage est que les scripts écrits sont a priori compatibles OS X et systèmes classiques, les jeux d’instructions (OSAX) de base étant les mêmes.
Passons à la pratique
Ça y est, on a compris ce que c'était, maintenant on voudrait bien le faire tourner, cette application. Quand vous le lancez (Il faut double-cliquer dessus... Et en faisant confiance a la gravité, ça devrait passer... ), l'éditeur de script vous affiche une fenêtre avec 3 boutons ("record", "stop", et "play") ainsi qu'un champ pour le texte, où il faut taper le script (et pas la liste des courses, même si ScriptEditor peut aussi servir a éditer du texte brut, ce qui est parfois utile...).
On va commencer par un petit "hello world"... Tapez ceci :
tell application "finder"
display dialog "hello world" buttons {"boujour a toi..."} with icon 2
end tell
Et là, merveille ! une fenêtre apparaît...
Bon, alors comme c'est une syntaxe qui est semblable a l'anglais, j'ai rien a expliquer, si ce n'est que tell application finder permet de dire que l'on va travailler avec l'application "finder", jusqu'à end tell, ce qui permet d'utiliser ses instructions (ici : display dialog), et le signe ¬ veut dire que l'on ne va a la ligne que pour clarifier la présentation (les lignes deux et trois sont équivalentes a : display dialog "hello world" buttons {"boujour a toi..."} with icon 2.
Si vous voulez connaître la liste des commandes offertes par une application, il suffit de glisser son icône sur l'éditeur de script, et vous pourrez alors la faire quitter (quit, c'est universel), la faire bipper (beep, universel aussi ), mais aussi lui faire envoyer des mails, envoyer des messages aux bots IRC, voire même scripter votre rush 6 zerglings a Starcraft... (euh... non, starcraft n'est pas apple-scriptable... dommage...).
Pour ceux qui veulent aller plus loin, je vais vous apprendre a changer automatiquement le fond d'écran au démarrage (très utile pour les fonds d'écran d'Anna quand on en a beaucoup).
Script de changement du fond d'écran
Alors, tout d'abord, expliquons le principe : il s'agit de choisir, a chaque démarrage, une image que l'on proposera au système comme fond d'écran. Pour ce faire, on créera un fichier (ici mac4ever.jpg) que l'on changera a chaque démarrage. Le système, au démarrage suivant, appliquera donc comme fond d'écran l'image choisie au démarrage antérieur. Pour ce faire, nous aurons besoin de l'intruction copy (pour copier l'image), delete (pour la supprimer), if* (pour faire des choix), et random number (pour choisir aléatoirement le fichier).
En voici les syntaxes (si vous voulez plus d'infos, vous pouvez chercher dans l'excellent Guide Apple Script en français) des commandes que nous allons utiliser :
copy [file path] to [folder]
delete [file path]
empty trash (attention à ne pas supprimer des fichiers par erreur)
random number from [plus petit nombre] to [plus grand nombre] with seed 0 (l'instruction with seed 0 permets de réinitialiser le gestionnaire aléatoire)
if [condition] then
[liste d'instruction]
end if
Voici donc la syntaxe a adopter :
tell application "finder"
([ on travaille avec le Finder, pour pouvoir utiliser les instructions move, delete, empty trash... ])
if file "mac4ever.jpg" of folder ("MACosX:Pictures copy") exists then
-- on supprime l’ancien fond d’écran
delete (file ("mac4ever.jpg") of folder "MACosX:Pictures copy")
end if
([ ici, il s'agit de choisit un élément au hasard parmi une liste, pour cela on compte le nombre d'éléments dans le fichier, on choisi aléatoirement un de ces éléments, que l'on copie dans le dossier d'images et que l'on renomme sous le nom mac4ever.jpg. l'image est ainsi modifiée. ])
set NbElements to count file in folder "MACosX:Pictures copy"
set i to random number from 1 to NbElements with seed 0
set nvlpic to file i of folder "MACosX:Pictures copy"
set newfil to duplicate nvlpic to folder ("MACosX:Pictures copy")
set name of newfil to "mac4ever.jpg"
end tell
Les symboles -- et ([…]) permettent d'inserer des commentaires au sein du script afin de rendre sa lecture aisée... N'oubliez pas par ailleurs de remplacer "MACosX:Pictures copy" par le chemin d'acces de votre fichier.
Il vous suffit ensuite d’enregistrer le script sous la forme d’une application (désactiver "l’écran de démarrage") et ensuite de démarrer une fois le script, de le placer dans le dossier ouverture au démarrage, et de mettre l’image "mac4ever.jpg", crée par le script, en fond d’écran.
Problèmes du script et solutions
Le script crée est court, facile a mettre en œuvre. Il présente cependant des défauts :
* Tout d’abord, il supprime tout élément se trouvant dans la corbeille au démarrage… Ce qui peut etre ennuyeux, surtout si vous êtes du genre distrait.
* De plus, pour changer de dossier de fond d’écran, il vous faudra "mettre les mains dans le cambouis", et retaper son chemin d’accès… Peu élégant, et très peu flexible.
Problème du fichier se trouvant dans la corbeille lors du démarrage
Il suffit de vérifier que la corbeille ne contient qu’un élément (celui que l’on veut supprimer) avant de la vider. Sinon, on affichera un dialogue demandant si il souhaite, ou non, vider la corbeille.
La syntaxe du dialogue est : display dialog « texte a afficher » default answer « meuh » buttons {liste de boutons} default button « nom du boutton par déafaut » with icon x (en sachant que chacun des éléments après le texte a afficher est optionnel, que [i[x]/i] est un nombre compris entre 0 et 2, et que le nom du bouton par défaut doit être un élément de la liste des boutons).
La syntaxe a adopter (qui donne un bon exemple de structure if-then-else) est donc :
if (count items in trash) = 1 then
empty trash else
([ au cas ou d'autres fichiers sont dans la corbeille, on demande double confirmation avant de supprimer. ])
set MaDialog to display dialog "Bureau Aléatoire Alert : La corbeille contient d'autres éléments que la copie de l'ancienne image" buttons {"Vider quand même", "Laisser telle quelle"} with icon 2
if button returned of MaDialog is "Vider quand même" then set MaDialog2 to display dialog "Bureau Aléatoire Alert : Tous les fichiers de la corbeille seront supprimés" buttons {"Confirmer", "Annuler"} ¬
default button "annuler" with icon 0
if button returned of MaDialog2 is "confirmer" then empty trash
end if
end if
end if
end if
Notons que, pour obtenir les résultats d’un dialogue (text returned, button returned, etc.), il faut enregistrer celui-ci dans une variable (ici MaDialog) et utiliser les variables de résultats par défaut : button returned, text returned, etc. en précisant la boîte de dialogue a laquelle elles font référence.
Éviter de mettre le chemin de dossier directement dans le script
Pour cela, on demande à l'application "Finder" d’afficher un dialogue pour enregistrer le chemin d’accès d’un dossier choisi par l’utilisateur, grâce à cette commande :
set mafold to Choose folder with prompt « Entrez le nom du dossier »
Enfin, il faut enregistrer ce résultat dans un fichier pour ne pas avoir à le rechercher a chaque démarrage. Pour créer le fichier, on utilise la commande open access file « nom du fichier » qui crée le fichier si il n’existe pas (attention, ne pas oublier de faire close access ensuite, sinon le fichier restera ouvert).
Le nom du fichier de préférences sera le même que celui de l’application, avec "prefs" rajouté a la suite, d’où les deux premières lignes rajoutées.
Au lancement, deux cas se présentent : soit le fichier de préférence existe (if file preffile exists then), et dans ce cas on le lit pour déterminer le chemin d’accès du dossier, soit il n’existe pas, et il faut alors le créer après avoir demandé a l’utilisateur de choisir son dossier. On y écrit alors le chemin d’accès : commande write. Ce qui donne la syntaxe suivante :
set loc to (path to me) as string
set PrefFile to loc & "Prefs"
if file PrefFile exists then set mafold to (read file PrefFile)
else
set mafold to choose folder with prompt ¬
"Choisissez un dossier contenant les images de démarrage."
open for access file PrefFile close access file PrefFile
write (mafold as string) to file PrefFile starting at 1 open mafold
end if
end if
Pour les étourdis…
On pourra éventuellement mettre au premier lancement du script une fenêtre pour vérifier qu’un alias du fichier est bien placé dans "Ouverture au démarrage", ainsi qu’une éventuelle aide sommaide :
set MaDialog3 to display dialog ¬
"N'oubliez pas de mettre l'image mac4ever.jpg en fond d'écran dans les préférences système... et de lancer cette application a chaque démarrage." buttons {"Aide", "OK"} ¬ with icon 2
if (button returned of MaDialog3) = "Aide" then
display dialog ¬
"Pour lancer l'application à chaque démarrage, il suffit de :
* glisser un alias (pomme-M) dans le dossier ouverture au demarrage (Mac OS 8 ou 9)
* ouvrir le tableau de bord "Login" (Mac OS X)." buttons {"Okay, j'ai compris"}
end if
Lien et script complet
Guides AppleScript (en francais)
excellente compilation de fond d'écrans
Script Complet ( a enregistrer au format application ... )
-- declaration des variables
global nvlpic
global mafold
global PrefFile
-- lecture ( ou création ) du fichier de preferences
tell application "Finder"
set loc to (path to me) as string
set PrefFile to loc & "Prefs"
if file PrefFile exists then
set mafold to (read file PrefFile)
else
set mafold to choose folder with prompt ¬
"Choisissez un dossier contenant les images de démarrage."
open for access file PrefFile
close access file PrefFile
write (mafold as string) to file PrefFile starting at 1
open mafold
set MaDialog3 to display dialog ¬
"N'oubliez pas de mettre l'image mac4ever.jpg en fond d'écran dans les preferences système... et de lancer cette application a chaque démarrage." buttons {"Aide", "Ok"} ¬
with icon 2
if (button returned of MaDialog3) = "aide" then
display dialog ¬
"Pour lancer l'application a chaque démarrage, il suffit de :
-glisser un alias (pomme-M) dans le dossier ouverture au demarrage ( OS 8 ou 9 )
-ouvrir le tableau de bord login ( OS X )." buttons {"okay, j'ai compris"}
end if
end if
-- suppression de l'image mac4ever.jpg pour la remplacer par une autre
if file "mac4ever.jpg" of folder mafold exists then
delete file ("mac4ever.jpg") of folder mafold
([ on vérifie que le fichier est bien seul dans la corbeille
pour ne pas supprimer par erreur un fichier utilisateur ])
if (count items in trash) = 1 then
empty trash
else
([ au cas ou d'autres fichiers sont dans la corbeille, on demande
donble confirmation avant de supprimer. ])
set MaDialog to display dialog ¬
¬
"Bureau Aléatoire Alert :
La corbeille contient d'autres éléments que la copie de l'ancienne image" buttons {"vider quand meme", "laisser telle quelle"} ¬
with icon 2
if button returned of MaDialog is "vider quand meme" then
set MaDialog2 to display dialog ¬
¬
"Bureau Aléatoire Alert:
Tous les fichiers de la corbeille seront supprimés" buttons {"confirmer", "annuler"} ¬
default button ¬
"annuler" with icon 0
if button returned of MaDialog2 is "confirmer" then
empty trash
end if
end if
end if
end if
-- on choisit l'image
set NbElements to count file in folder mafold
set i to random number from 1 to NbElements with seed 0
set nvlpic to file i of folder mafold
set newfil to duplicate nvlpic to folder mafold
set name of newfil to "mac4ever.jpg"
end tell