OSX Lion AppleScript: comment obtenir l'espace actuel # de mission control?
J'essaie de comprendre comment obtenir l'espace # actuel du contrôle de mission. Source serait utile, mais plus utile serait d'informations sur la façon de comprendre cela moi-même. J'ai écrit quelques applescripts, mais le plus souvent, il semble que chaque fois que j'ai besoin de faire quelque chose de nouveau (pour lequel je ne trouve pas de documentation de dictionnaire), Il tombe dans la catégorie " tell this specific app (par exemple "System Events") cette chose très spécifique " et je n'ai aucune idée de la façon dont je hors.
Spécifiquement ce que j'essaie de faire:
I haine le nouveau contrôle de mission dans OSX 10.7. Je veux que mes espaces "grille" de retour depuis que je l'ai utilisé tout le temps. J'avais l'habitude de naviguer entre les espaces en utilisant les touches fléchées (par exemple ALT+↑) Toutes les quelques secondes. Maintenant, je suis coincé avec ce tableau maladroit d'espaces 1x9 au lieu d'une élégante grille 3x3. J'ai re-mappé tous mes espaces pour utiliser le pavé numérique, qui s'occupe partiellement du problème (puisque c'est un Grille 3x3), mais seulement quand j'ai un clavier externe attaché.
, Fondamentalement, je veux être en mesure d'utiliser ALT+↑ et ↓ encore une fois, mais pour ce faire j'ai besoin de détecter les courants de l'espace # alors que je peux passer de l'espace 5-->2, par exemple.
La réponse de Dave ci-dessous, bien que beaucoup plus détaillée que prévu, nécessite d'écrire une application pour le faire (de plus, elle ne répond toujours pas complètement à la question). Si c'est possible, je préfère simplement lier quelques clés à un applescript.
7 réponses
J'essaie de comprendre ça moi-même. Pas encore là, mais dans la bonne direction:
- chaque "espace" de contrôle de Mission reçoit un
uuid
qui lui est assigné... - ...sauf pour le tout premier (AFAIK), et celui du tableau de bord.
, Vous pouvez les lire ici:
$ defaults read com.apple.spaces
$ defaults read com.apple.desktop
Emplacement des fichiers:
~/Library/Preferences/com.apple.spaces.plist
~/Library/Preferences/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 supprimé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 Desktop 1 ou Dashboard.
Je ne suis pas sûr s'il existe une API publique pour déterminer quel espace uuid
est affiché sur un écran. Je suppose que non uuid
signifie Display 1, et les autres signifient Display 1 + n.
J'ai jeté un coup d'œil rapide à travers la bibliothèque de L'éditeur AppleScript (Fenêtre ---> Bibliothèque) et je n'ai vu aucune entrée sous les é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 D'AppleScript.
Mise à jour - juillet 23, 2011
Il ressemble à Dock controls Mission Control. Vous pouvez récupérer ses fichiers d'en-tête comme suit:
- Aller à:
/System/Library/CoreServices/Dock
- faites un clic droit et afficher le contenu de L'Emballage
- Naviguer:
/Contents/MacOS/
- copiez et collez le binaire
Dock
sur votre bureau. - exécuter:
$class-dump ~/Desktop/Dock
Qui va cracher tous ses fichiers d'en-tête (il est long; presque 7500 lignes). Vous pouvez voir les chaînes spaceUUID
apparaître là-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 continuerai à le regarder demain; trop fatigué maintenant. :)
Mise à jour - juillet 24, 2011
À L'intérieur du Dock, il y a une classe appelée WVSpaces
. Il a un certain nombre d'attributs, y compris:
WVSpace *currentSpace;
unsigned int currentWorkspace;
WVSpace *nextSpace; // Space on the right???
WVSpace *previousSpace; // Space on the left???
BOOL currentSpaceIsDashboard;
BOOL dashboardIsCurrent;
...lots more...
Chaque classe WVSpace
a un attribut NSString *_uuid;
, qui est probablement son SpaceUUID. Donc, théoriquement, vous pouvez obtenir le numéro d'espace actuel comme ceci:
WVSpace *currentSpace = [[WVSpaces sharedInstance] currentSpace];
NSString *currentSpaceUUID = [currentSpace _uuid]; // Empty string if main space???
L'astuce est de savoir comment accéder à la classe privée WVSpaces
enterrée à L'intérieur du Dock? Je suppose que C'est Singleton car il a un attribut NSMutableArray *_spaces;
, probablement avec chaque espace répertorié. Un seul espace est affiché à la fois (cela est vrai si vous utilisez plusieurs moniteurs; l'espace s'étend sur les deux), il est donc logique d'avoir une seule instance WVSpaces
.
Donc on dirait il faudra un piratage SIMBL du Dock pour accéder à WVSpaces
.
J'ai été farfouillé, et j'ai trouvé ceci: https://gist.github.com/1129406
Les espaces ont un ID non séquentiel et un index séquentiel (basé sur 0). Vous pouvez obtenir L'ID de deux façons:
- à partir des API publiques (voir
get_space_id
) - à partir de l'API CGS privée
CGSGetWorkspace
Vous pouvez définir l'espace actuel par index en utilisant des API publiques (bien que les notifications elles-mêmes ne soient pas documentées publiquement): voir set_space_by_index
Vous pouvez définir l'espace actuel par ID utilisation privée de L'API CGS CGSSetWorkspace
.
Vous ne pouvez pas obtenir directement l'index d'espace actuel. Cependant, si vous utilisez toujours le même ensemble de neuf espaces, vous pouvez les faire pivoter une fois en utilisant set_space_by_index
, collecter leurs identifiants et créer un mappage. Ensuite, vous serez en mesure d'obtenir l'indice actuel de l'ID.
... j'ai aussi travaillé sur ceci:)
Vous dites que vous " devez détecter l'espace actuel#". Ce n'est pas strictement vrai: pour descendre d'une ligne, il suffit de déplacer 3 espaces à droite, donc en principe vous pouvez simplement lier quelque chose comme
tell application "System Events" to tell process "WindowServer"
key code {124, 124, 124} using control down
end tell
Pour Alt-bas (avec FastScripts, Alfred ou une autre méthode rapide qui évite la surcharge de Automator). Cette approche échouera si vous frappez dans la rangée du bas, bien sûr - mais si vous êtes vraiment câblé, vous ne faites jamais :)
Vous devez "activer l'accès pour les appareils fonctionnels" dans le volet Préférences D'accès universel pour l'approche key code
au travail.
Mise en garde: Cela ne fonctionne pas. Quand je lance le script ci-dessus, je saute bien trois espaces. Le problème est qu'après mon clavier ne répond plus: il semble que seul le gestionnaire de fenêtres reçoive des événements: je peux fermer les fenêtres et changer d'espace, mais je ne peux interagir avec aucune application.
Ma théorie est que cela arrive lorsque le saut provoque le changement de l'application actuelle pendant l'exécution du script-mais je n'ai aucune idée de comment résoudre ce problème.
Une observation: Le Mission Control
(c - /Applications/Mission Control.app/Contents/MacOS/Mission\ Control
) semble réagir à certains arguments de ligne de commande:
-
Mission\ Control
: afficher le contrôle de mission -
Mission\ Control 1
: afficher le bureau -
Mission\ Control 2
: affiche les fenêtres d'application actuelles
J'ai essayé de mettre certains des UUID de defaults read com.apple.spaces
, mais cela n'a pas fait grand-chose. Tellement de tâtonner dans sombre.
J'ai écrit une application - t-il travailler pour vous?
Les touches pour le faire fonctionner sont control-shift et les touches fléchées, bien que cela puisse être réparable si vous êtes coincé sur ALT.
Assurez-vous que vous avez 9 espaces (bureaux) mis en place avant de commencer, et vous devrez changer les raccourcis clavier Ctrl-up et Ctrl-down par défaut dans les Préférences Système à autre chose (dans Clavier - > Raccourcis clavier - > Mission Control: Mission Control et Show Desktop).
Lors de la première exécution, il parcourra vos bureaux pour les énumérer lorsque vous changez d'espace pour la première fois.
Ensuite, vous devriez pouvoir changer entre les bureaux comme dans une grille 3x3.
Il peut y avoir quelques rides, mais c'est fondamentalement fonctionnel, du moins pour moi.
Je suis sur Mountain Lion et cela semble fonctionner pour moi.
defaults read com.apple.spaces
Recherchez "espace actuel". Vous remarquerez que l'exécution de cette commande avec différents espaces actifs ne change pas l'espace actuel, mais si vous cochez et décochez un bouton de case dans "Préférences Système" et l'exécutez à nouveau, vous le verrez mis à jour.
Espérons que cela aide quelqu'un d'autre!
EDIT: c'est moche, mais j'utilise ceci:
killall Dock && sleep 0.2 && defaults read com.apple.spaces | grep -A1 "Current Space" | tail -1 | awk '{print $NF }' | cut -f1 -d';'
Http://switchstep.com/ReSpaceApp
Cela fonctionne, est gratuit (en ce moment) et est génial.
Assurez-vous simplement de créer manuellement autant d'espaces que votre mise en page (dans les préférences) l'attend.
on openNewSpace()
tell application "System Events"
—start mission control
do shell script "/Applications/Mission\\ Control.app/Contents/MacOS/Mission\\ Control"
tell process "Dock"
set countSpaces to count buttons of list 1 of group 1
--new space
click button 1 of group 1
--switch to new space
repeat until (count buttons of list 1 of group 1) = (countSpaces + 1)
end repeat
click button (countSpaces + 1) of list 1 of group 1
end tell
end tell
end openNewSpace