web-dev-qa-db-fra.com

AppleScript OSX Lion: Jak získat aktuální prostor # od kontroly misí?

Vous êtes le premier à parler, prostituée prostituée # z kontroly mise. Cliquez ici pour afficher tous les détails de cet article, cliquez ici pour obtenir plus de détails. Merci beaucoup. Napsal jsem pár applescripts, ale čènji než ne, zdá se, e kdókó spadá n ko novoo ( Nemám ponětí, jak bych à vlastně zjistil.


Konkrétně to, co se snažím udělat:

I nenávist nová kontrola mise v OSX 10.7. Chci, la prostate aby moje "mřížka" zpet, protože jsem ji používal po celou dobu. Použil jsem k navigació mezi mezeramiALT+) každých několik sekund. Cliquez sur l'image pour l'agrandir 1x9 pole prostor místo elegantní 3x3 mřížky. Znovu jsem mapoval všechny své prostory, abych použil numerickou klávesnici, mangez-vous après le problème (cliquez ici pour lire la suite), cliquez sur le bouton affiché pour afficher le commentaire.

V podstatě chci být schopen používatALT+uneznovu, ale abych tak učinil, musím zjistit aktuální prostor # tak, abych mohl například přepnout z prostoru 5 -> 2.

Daveova odpověď níže, i když mnohem podrobnější, ne manquent pas, mais n'a pas besoin de faire de la plume, c'est-à-dire qu'il n'y a aucune raison de le faire. Jestli je to vůbec možné, cliquez sur le lien suivant pour obtenir plus de détails.

45
Mark Kahn

J'essaie de comprendre cela moi-même. Pas encore là, mais dans la bonne direction:

  • Chaque "espace" de contrôle de mission se voit attribuer une uuid ...
  • ... sauf le tout premier (autant que je sache) 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

Voilà 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 sais pas s'il existe une API publique pour déterminer l'espace uuid affiché sur un écran. Je suppose que pas uuid signifie Affichage 1, et les autres signifient Affichage 1 + n.

J'ai parcouru rapidement la bibliothèque de l'éditeur AppleScript (Fenêtre ---> Bibliothèque) et je n'ai vu aucune entrée 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 pour AppleScript.


UPDATE - 23 juillet 2011

Il semble que Dock contrôle Mission Control. Vous pouvez récupérer ses fichiers d'en-tête comme ceci:

  1. Aller à: /System/Library/CoreServices/Dock
  2. Clic droit et Afficher le contenu du paquet
  3. Navigation: /Contents/MacOS/
  4. Copiez et collez le binaire Dock sur votre bureau.
  5. Exécuter: $class-dump ~/Desktop/Dock

Cela va cracher tous ses fichiers d'en-tête (c'est long: près de 7 500 lignes). Vous pouvez voir les chaînes spaceUUID apparaissant ici. Il existe une classe appelée WVSpace qui semble représenter un seul espace dans Mission Control et de nombreuses autres classes WV *.

Je continuerai à le regarder demain; trop fatigué maintenant. :)


MISE À JOUR - 24 juillet 2011

À l'intérieur du Dock, il y a une classe appelée WVSpaces. Il possède un certain nombre d'attributs, notamment:

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 suit:

WVSpace *currentSpace = [[WVSpaces sharedInstance] currentSpace];
NSString *currentSpaceUUID = [currentSpace _uuid];     // Empty string if main space???

Le truc, c'est comment avoir accès à 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;, avec probablement tous les espaces qui y sont listés. Un seul espace est affiché à la fois (cela est vrai si vous utilisez plusieurs moniteurs; l'espace est suffisant pour les deux), il est donc logique de n'avoir qu'une seule instance WVSpaces.

Il semble donc que vous aurez besoin de SIMBL piratage de Dock pour accéder à WVSpaces.

28
Dave Gallagher

J'ai fouillé, et j'ai trouvé ceci: https://Gist.github.com/1129406

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

  • depuis des API publiques (voir get_space_id)
  • depuis l'API CGS privée CGSGetWorkspace

Vous pouvez définir l'espace actuel par index à l'aide d'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 à l'aide de l'API CGS privée CGSSetWorkspace.

Vous ne pouvez pas obtenir directement l’index spatial actuel. Toutefois, si vous utilisez toujours le même ensemble de neuf espaces, vous pouvez les parcourir une fois à l'aide de set_space_by_index, collecter leurs ID et créer un mappage. Vous pourrez alors obtenir l'index actuel à partir de l'ID.

15
LaC

... travaille aussi sur ça :)

Vous dites que "vous devez détecter l'espace actuel #". Ce n’est pas tout à fait vrai: pour descendre d’une rangée, il suffit de déplacer 3 espaces vers la droite. Ainsi, en principe, vous pouvez simplement lier

tell application "System Events" to tell process "WindowServer"
    key code {124, 124, 124} using control down
end tell

alt-bas (avec FastScripts , Alfred ou une autre méthode rapide qui évite les frais généraux d’Automator). Bien sûr, cette approche échouera si vous avez déjà frappé au bas de la ligne - mais si vous êtes vraiment câblé, vous ne le ferez jamais :)
Vous devez "Activer l'accès pour les appareils d'assistance" dans la sous-fenêtre des préférences d'accès universel pour que l'approche key code fonctionne. 

Avertissement: Cela ne fonctionne pas. Lorsque je lance le script ci-dessus, je saute joliment de trois espaces. Le problème est que, par la suite, mon clavier ne répond plus: 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 aucune application.
Ma théorie est que cela se produit lorsque le saut entraîne le changement de l'application en cours pendant l'exécution du script, mais je ne sais pas comment résoudre ce problème.

Une observation connexe: Le Mission Control (c'est-à-dire /Applications/Mission Control.app/Contents/MacOS/Mission\ Control) semble réagir à certains arguments de la ligne de commande:

  • Mission\ Control: afficher le contrôle de mission
  • Mission\ Control 1: montrer le bureau
  • Mission\ Control 2: affiche les fenêtres d'application actuelles

J'ai essayé de mettre dans certains des UUID de defaults read com.Apple.spaces, mais cela n'a pas fait grand chose. Voilà pour tâtonner dans le noir.

7
Janus

J'ai écrit une application - ça marche pour vous?

Changer Space.app

Les touches pour le faire fonctionner sont control-shift et les touches fléchées, bien que cela puisse être corrigé si vous êtes bloqué sur ALT.

Assurez-vous que vous avez défini 9 espaces (bureaux) avant de commencer et que vous devrez changer les liaisons de touches ctrl-up et ctrl-down par défaut dans quelque chose de différent (dans Clavier -> Raccourcis clavier -> Mission : Mission Control et Show Desktop).

Lors de la première exécution, il passe en revue vos bureaux pour les énumérer lorsque vous changez d’espace.

Vous devriez alors pouvoir changer de bureau, comme dans une grille 3x3.

Il peut y avoir quelques rides, mais c'est fondamentalement fonctionnel, du moins pour moi.

4
sdsykes

Je suis sur Mountain Lion et cela semble fonctionner pour moi.

defaults read com.Apple.spaces

Cherchez "Espace actuel". Vous remarquerez que l'exécution de cette commande avec différents espaces actifs ne modifie pas l'espace actuel MAIS si vous cochez et décochez un bouton de case à cocher dans les "Préférences Système" et que vous 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';'

2
patcon

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) en attend.

1
David Lio
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
1
Montaldo