47 votes

OSX Lion AppleScript : Comment obtenir le numéro de l'espace actuel # depuis le mission control?

Je cherche à comprendre comment obtenir le numéro d'espace actuel à partir du centre de contrôle de mission. La source serait utile, mais plus utile serait les informations sur comment le découvrir moi-même. J'ai écrit quelques scripts Apple, mais la plupart du temps il semble que chaque fois que j'ai besoin de faire quelque chose de nouveau (que je ne trouve pas dans la documentation du dictionnaire), cela relève de la catégorie "dis à cette application spécifique (par exemple "System Events") cette chose très spécifique" et je n'ai aucune idée de comment je pourrais réellement trouver cela.


Plus précisément ce que j'essaie de faire :

Je déteste le nouveau centre de contrôle de mission dans OSX 10.7. Je veux retrouver ma "grille" d'espaces car je l'utilisais tout le temps. Je naviguais entre les espaces en utilisant les touches fléchées (par exemple ALT+) toutes les quelques secondes. Maintenant je suis coincé avec cet encombrant tableau de 1x9 d'espaces au lieu d'une élégante grille de 3x3. J'ai remappé tous mes espaces pour utiliser le pavé numérique, ce qui règle partiellement le problème (puisque c'est une grille de 3x3), mais seulement quand j'ai un clavier externe attaché.

Essentiellement, je veux pouvoir utiliser ALT+ et à nouveau, mais pour le faire j'ai besoin de détecter le numéro d'espace actuel pour pouvoir passer de l'espace 5-->2, par exemple.

La réponse de Dave ci-dessous, bien plus détaillée que ce à quoi je m'attendais, nécessite d'écrire une application pour faire cela (et cela ne répond toujours pas pleinement à la question). Si c'est possible, je préférerais simplement lier quelques touches à un script Apple.

33voto

Dave Gallagher Points 5314

Je suis en train de comprendre cela moi-même. Pas encore là, mais dans la bonne direction:

  • Chaque "espace" de Mission Control reçoit un uuid qui lui est attribué...
  • ... excepté pour le tout premier (à ma connaissance), et celui du Dashboard.

Vous pouvez les lire ici:

$ defaults read com.apple.spaces
$ defaults read com.apple.desktop

Emplacements des fichiers:

~/Bibliothèque/Préférences/com.apple.spaces.plist
~/Bibliothèque/Préférences/com.apple.desktop.plist

Voici le mien. J'ai quatre espaces activés, et trois entrées apparaissent:

$ defaults read com.apple.spaces
{
    spaces =     (
                {
            type = 0; 
            uuid = "9F552977-3DB0-43E5-8753-E45AC4C61973";
        },
                {
            type = 0;
            uuid = "44C8072A-7DC9-4E83-94DD-BDEAF333C924";
        },
                {
            type = 0;
            uuid = "6FADBDFE-4CE8-4FC9-B535-40D7CC3C4C58";
        }
    );
}

Si vous supprimez un espace, cette entrée sera retirée du fichier. Si vous ajoutez un espace, une entrée sera ajoutée. Encore une fois, il n'y a jamais d'entrée pour le Bureau (Desktop) 1 ou le Dashboard.

Je ne suis pas sûr s'il existe une API publique pour déterminer quel uuid d'espace est affiché sur un écran. Je suppose que pas de uuid signifie l'écran 1, et les autres signifient l'écran 1+n.

J'ai jeté un coup d'œil rapide à la bibliothèque de l'AppleScript Editor (Fenêtre ---> Bibliothèque) et je n'ai pas vu d'entrées sous Événements Système pour spaces. C'est probablement quelque chose qui peut être fait avec Cocoa, peut-être via une API privée, mais je ne suis pas sûr concernant AppleScript.


MISE À JOUR - 23 juillet 2011

Il semble que le Dock contrôle Mission Control. Vous pouvez récupérer ses fichiers d'en-tête de cette manière:

  1. Aller à: /Bibliothèque/Services de Base/Dock
  2. Cliquer-droit et choisir Afficher le contenu du paquet
  3. Naviguer: /Contenu/MacOS/
  4. Copier-coller le binaire Dock sur votre bureau.
  5. Exécuter: $ class-dump ~/Bureau/Dock

Cela va afficher tous ses fichiers d'en-tête (c'est long, presque 7 500 lignes). Vous pouvez voir les chaînes spaceUUID apparaissant dedans. Il y a une classe appelée WVSpace qui semble représenter un seul Espace dans Mission Control, et beaucoup d'autres classes WV*.

Je vais continuer à examiner cela demain; trop fatigué maintenant. :)


MISE À JOUR - 24 juillet 2011

À l'intérieur du Dock, il y a une classe appelée WVSpaces. Elle a un certain nombre d'attributs incluant:

WVSpace *currentSpace;
unsigned int currentWorkspace;
WVSpace *nextSpace;                     // Espace à droite???
WVSpace *previousSpace;                 // Espace à gauche???
BOOL currentSpaceIsDashboard;
BOOL dashboardIsCurrent;
... beaucoup plus...

Chaque classe WVSpace a un attribut NSString *_uuid;, qui est probablement son SpaceUUID. Donc théoriquement, vous pouvez obtenir le numéro de l'espace actuel de cette manière:

WVSpace *currentSpace = [[WVSpaces sharedInstance] currentSpace];
NSString *currentSpaceUUID = [currentSpace _uuid];     // Chaîne vide si espace principal???

Le problème est, comment accéder à la classe privée WVSpaces enfouie à l'intérieur du Dock? Je suppose qu'elle est Singleton car elle a un attribut NSMutableArray *_spaces;, probablement avec chaque espace répertorié dedans. Seul un espace est affiché à la fois (cela reste vrai si vous utilisez plusieurs moniteurs; l'espace s'étend sur les deux), donc il est logique d'avoir une seule instance WVSpaces.

Il semble donc que cela nécessitera quelques piratages SIMBL du Dock pour accéder à WVSpaces.

0 votes

Merci pour l'info. Avez-vous une idée où pourrait se trouver l'uuid actuellement sélectionné? Je n'imagine pas que cela se trouve dans un fichier plist. FYI, je viens de regarder ça et ce sont certainement des uuids générés aléatoirement. Ils changent si vous supprimez un bureau# puis le ré-ajoutez. Quelle est votre raison de creuser dans tout ça? :)

0 votes

J'ai ajouté quelques informations supplémentaires que j'ai trouvées. C'est bon à savoir que les UUID sont uniques et non persistants. Je creuse dans cela pour un programme que j'écris qui est un peu secret pour le moment. ;)

0 votes

À noter que tous les UUID dans l'API Apple seront générés de manière aléatoire à chaque fois qu'un UUID est généré/demandé, indépendamment de l'utilisation. Il n'y aura jamais de UUID attribué "à l'usine" car cela pourrait provoquer des collisions de UUID lorsque deux applications ou appareils communiquent. Le but de UUID est d'identifier de manière unique des instances spécifiques d'un objet spécifique.

15voto

LaC Points 7191

J'ai fouillé un peu et j'ai trouvé ceci: https://gist.github.com/1129406

Les espaces ont un ID non séquentiel et un index séquentiel (commençant à 0). Vous pouvez obtenir l'ID de deux manières:

  • à partir des API publiques (voir get_space_id)
  • à partir de l'API privée CGS CGSGetWorkspace

Vous pouvez définir l'espace actuel par index en utilisant les API publiques (bien que les notifications elles-mêmes ne soient pas publiques): voir set_space_by_index

Vous pouvez définir l'espace actuel par ID en utilisant l'API privée de CGS CGSSetWorkspace.

Vous ne pouvez pas obtenir directement l'index de l'espace actuel. Cependant, si vous utilisez toujours le même ensemble de neuf espaces, vous pouvez les parcourir une fois en utilisant set_space_by_index, collecter leurs IDs et construire une correspondance. Ensuite, vous pourrez obtenir l'index actuel à partir de l'ID.

2 votes

@cocoacoder - Les API existent sur Mountain Lion mais ne font rien ou ne renvoient rien d'utile.

8voto

Janus Points 3051

... a également travaillé sur ceci :)

Vous dites que vous "avez besoin de détecter l'espace actuel #". Ce n'est pas strictement vrai : Pour descendre d'une rangée, il suffit de déplacer 3 espaces vers la droite, donc en principe vous pourriez simplement lier quelque chose comme

dire à l'application "System Events" de dire au processus "WindowServer"
    clé code {124, 124, 124} en utilisant la touche de contrôle enfoncée
end tell

à Alt-bas (avec FastScripts, Alfred ou une autre méthode rapide qui évite la surcharge d'Automator). Cette approche échouera si vous appuyez jamais sur bas dans la rangée du bas, bien sûr -- mais si vous êtes vraiment câblé, vous ne le faites jamais :)
Vous devez "Activer l'accès pour les appareils d'assistance" dans le panneau de préférences Accessibilité universelle pour que l'approche key code fonctionne.

Mise en garde : Cela ne fonctionne pas. Lorsque je lance le script ci-dessus, je saute joliment de trois espaces. Le problème est qu'ensuite mon clavier devient non réactif : Il semble que seul le gestionnaire de fenêtres reçoive des événements : Je peux fermer des fenêtres et changer d'espace, mais je ne peux pas interagir avec les applications.
Ma théorie est que cela se produit lorsque le saut provoque le changement d'application actuelle pendant l'exécution du script -- mais je n'ai aucune idée de comment corriger cela.

Une observation connexe : Le Contrôle de mission (c'est-à-dire /Applications/Contrôle de mission.app/Contents/MacOS/Contrôle\ de\ mission) semble réagir à certains arguments en ligne de commande :

  • Contrôle\ de\ mission : montrer le contrôle de mission
  • Contrôle\ de\ mission 1 : montrer le bureau
  • Contrôle\ de\ mission 2 : afficher les fenêtres de l'application actuelle

J'ai essayé de mettre quelques UUID de defaults read com.apple.spaces, mais ça n'a pas fait grand-chose. Tant pis pour tâtonner dans l'obscurité.

4voto

sdsykes Points 908

J'ai écrit une application - est-ce que ça fonctionne pour vous ?

Change Space.app

Les touches pour le faire fonctionner sont ctrl-shift et les touches des flèches, bien que ceci puisse être corrigé si vous êtes bloqué sur ALT.

Assurez-vous d'avoir 9 espaces (bureaux) configurés avant de commencer, et vous devrez changer les raccourcis clavier par défaut ctrl-haut et ctrl-bas dans les Préférences Système pour autre chose (dans Clavier -> Raccourcis clavier -> Mission Control : Mission Control et Afficher le bureau).

Lors du premier lancement, il passera en revue vos bureaux pour les énumérer lorsque vous changez d'espace pour la première fois.

Ensuite, vous devriez pouvoir passer entre les bureaux comme dans une grille 3x3.

Il peut y avoir quelques petits soucis, mais c'est essentiellement fonctionnel, du moins pour moi.

0 votes

Très bien (je suis un utilisateur et fan de TotalSpaces) mais je pense que l'idée ici était de le faire de façon programmée, puisque cela mentionne AppleScript. Je me souviens que TS a une API, mais je ne me rappelle pas si vous pouvez le contrôler, or juste obtenir des infos de l'API (j'enregistre ce qui se passe dans chacun de mes espaces, donc si ma machine plante je peux plus facilement arranger les choses comme elles étaient avant le crash). Peut-être pourriez-vous commenter cela et donner un exemple de comment le faire.

0 votes

Aussi, il n'y a pratiquement pas de mention de l'API sur le site TS. Peut-être pourriez-vous ajouter de la documentation à ce sujet là-bas?

2voto

David Lio Points 41

http://switchstep.com/ReSpaceApp

Cela fonctionne, est gratuit (pour le moment) et est génial.

Assurez-vous simplement de créer manuellement autant d'espaces que votre disposition (dans les préférences) le nécessite.

0 votes

Ceci est maintenant TotalSpaces, et coûte $18. Ça vaut le coup, cependant. Mis à part "Choosy", TotalSpaces est le seul utilitaire sans lequel je ne peux pratiquement pas vivre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X