it-swarm.com.de

OSX Lion AppleScript: Aktueller Status # od kontroly misí?

Snažím se přijít na to, jak dostat aktuální prostor # z kontroly mise. Zdroj byl užitečný, ale užitečnější byly informace o tom, jak to zjistit sám. Napsal jsem pár applescripts, ale častěji než ne, zdá se, že kdykoliv musím udělat něco nového (že nemůžu najít documentaci pro slovník) Nemám ponětí, jak bych bis vlastně zjistil.


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

I nenávist nová kontrola mise v OSX 10.7. Chci, aby moje prostory "mřížka", protože jsem ji používal po celou dobu. Použil jsem k navigaci mezi mezerami pomocí kláves se šipkami (např.ALT+) každých několik sekund. Sie können ein Foto mit einer 1x9-poligen Prostitution und einem eleganten 3x3-poligen Prostituierten machen. Znovu jsem mapoval všechny své prostory, abych použil numerickou klávesnici, která se částečně postará o problém (protože se jedná o mřížku 3x3), ale pouze když mám připojenou external.

V podstatě chci být schopen používatALT+einznovu, 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ž jsem očekával, vyžaduje napsání aplikace, která to udělá. Jestli je to vůbec možné, raději bych und jen pár klíčů svázal na applescript.

45
Mark Kahn

Ich versuche das selbst herauszufinden. Noch nicht da, aber in die richtige Richtung:

  • Jedem Mission Control "Space" wird eine uuid zugewiesen ...
  • ... außer dem allerersten (AFAIK) und dem Dashboard.

Sie können sie hier lesen:

$ defaults read com.Apple.spaces
$ defaults read com.Apple.desktop

Dateispeicherorte:

~/Library/Preferences/com.Apple.spaces.plist
~/Library/Preferences/com.Apple.desktop.plist

Hier ist meins. Ich habe vier Leerzeichen aktiviert und drei Einträge werden angezeigt:

$ 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";
        }
    );
}

Wenn Sie ein Leerzeichen löschen, wird dieser Eintrag aus der Datei entfernt. Wenn Sie ein Leerzeichen hinzufügen, wird ein Eintrag hinzugefügt. Auch hier gibt es nie einen Eintrag für Desktop 1 oder Dashboard.

Ich bin nicht sicher, ob es eine öffentliche API gibt, um herauszufinden, welcher Platz uuid auf einer Anzeige angezeigt wird. Ich gehe davon aus, dass keine uuid Anzeige 1 bedeutet und die andere Anzeige 1 + n.

Ich warf einen kurzen Blick durch die AppleScript Editor Library (Window ---> Library) und konnte unter spaces keine Einträge unter System Events sehen. Dies ist wahrscheinlich etwas, das mit Cocoa möglich ist, vielleicht über eine private API, aber ich bin mir nicht sicher, was AppleScript angeht.


UPDATE - 23. Juli 2011

Es sieht aus wie Dock steuert Mission Control. Sie können die Header-Dateien wie folgt abrufen:

  1. Gehe zu: /System/Library/CoreServices/Dock
  2. Rechtsklick und Paketinhalt anzeigen
  3. Navigiere: /Contents/MacOS/
  4. Kopieren Sie die Dock-Binärdatei und fügen Sie sie auf Ihrem Desktop ein.
  5. Ausführen: $class-dump ~/Desktop/Dock

Das spuckt alle Header-Dateien aus (es ist lang; fast 7.500 Zeilen). Dort können Sie die spaceUUID-Zeichenfolgen sehen. Es gibt eine Klasse mit dem Namen WVSpace, die anscheinend einen einzelnen Space in Mission Control darstellt, und viele andere WV * -Klassen.

Ich werde es morgen weiter anschauen; jetzt zu müde :)


UPDATE - 24. Juli 2011

Im Dock gibt es eine Klasse namens WVSpaces. Es hat eine Reihe von Attributen, darunter:

WVSpace *currentSpace;
unsigned int currentWorkspace;
WVSpace *nextSpace;                     // Space on the right???
WVSpace *previousSpace;                 // Space on the left???
BOOL currentSpaceIsDashboard;
BOOL dashboardIsCurrent;
...lots more...

Jede WVSpace-Klasse hat ein NSString *_uuid;-Attribut, bei dem es sich wahrscheinlich um ihre SpaceUUID handelt. Theoretisch können Sie also die aktuelle Raumnummer wie folgt erhalten:

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

Der Trick ist, wie man Zugriff auf die private WVSpaces-Klasse erhält, die sich im Dock befindet. Ich gehe davon aus, dass es Singleton ist, da es ein NSMutableArray *_spaces;-Attribut hat, wahrscheinlich mit jedem Platz darin. Es wird immer nur ein Speicherplatz angezeigt (dies gilt, wenn Sie mehrere Monitore verwenden; der Speicherplatz erstreckt sich über beide), daher ist es sinnvoll, nur eine WVSpaces-Instanz zu haben.

Es sieht also so aus, als würde es einiges SIMBL hacking von Dock erfordern, um Zugriff auf WVSpaces zu erhalten.

28
Dave Gallagher

Ich habe herumgestochert und ich kam dazu: https://Gist.github.com/1129406

Leerzeichen haben eine nicht sequenzielle ID und einen sequenziellen Index (0-basiert). Sie können die ID auf zwei Arten erhalten:

  • von öffentlichen APIs (siehe get_space_id)
  • aus der privaten CGS-API CGSGetWorkspace

Sie können den aktuellen Speicherplatz mithilfe von öffentlichen APIs nach Index festlegen (die Benachrichtigungen selbst sind jedoch nicht öffentlich dokumentiert): siehe set_space_by_index

Sie können den aktuellen Speicherplatz anhand der ID festlegen, indem Sie die CGS-API CGSSetWorkspace verwenden.

Sie kann nicht erhält den aktuellen Space-Index direkt. Wenn Sie jedoch immer den gleichen Satz von neun Leerzeichen verwenden, können Sie sie mithilfe von set_space_by_index einmal durchlaufen, deren IDs sammeln und ein Mapping erstellen. Dann können Sie den aktuellen Index von der ID abrufen.

15
LaC

... auch daran gearbeitet :)

Sie sagen, dass Sie "den aktuellen Platz # erkennen müssen". Dies ist nicht unbedingt richtig: Um eine Zeile nach unten zu verschieben, müssen Sie nur drei Felder nach rechts verschieben, sodass Sie im Prinzip so etwas binden können

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

zu Alt-down (mit FastScripts , Alfred oder einer anderen schnellen Methode, die den Overhead von Automator vermeidet). Dieser Ansatz wird fehlschlagen, wenn Sie jemals in der untersten Reihe getroffen haben - aber wenn Sie wirklich fest verkabelt sind, tun Sie das nie :)
Sie müssen "Zugriff für Hilfsmittel aktivieren" im Einstellungsbereich "Universeller Zugriff", damit der key code-Ansatz funktioniert. 

Vorbehalt : Das funktioniert nicht. Wenn ich das Skript oben starte, springe ich schön um drei Felder. Das Problem ist, dass meine Tastatur danach nicht mehr reagiert: Es scheint, dass nur der Fenstermanager Ereignisse empfängt: Ich kann Fenster schließen und den Speicherplatz wechseln, aber ich kann mit keiner Anwendung interagieren.
Meine Theorie ist, dass dies der Fall ist, wenn der Sprung bewirkt, dass sich die aktuelle Anwendung während der Ausführung des Skripts ändert. Ich weiß jedoch nicht, wie ich das beheben kann.

Eine verwandte Beobachtung: Der Mission Control (d. H. /Applications/Mission Control.app/Contents/MacOS/Mission\ Control) scheint auf einige Befehlszeilenargumente zu reagieren:

  • Mission\ Control: Missionssteuerung anzeigen
  • Mission\ Control 1: Desktop anzeigen
  • Mission\ Control 2: Aktuelle Anwendungsfenster anzeigen

Ich habe versucht, einige UUIDs von defaults read com.Apple.spaces einzufügen, aber das hat nicht viel gebracht. So viel zum Fummeln im Dunkeln.

7
Janus

Ich habe eine App geschrieben - funktioniert sie für Sie?

Space.app ändern

Die Tasten, auf denen es funktioniert, sind die Umschalttaste und die Pfeiltasten. Dies kann jedoch behoben werden, wenn Sie sich nicht an ALT halten.

Stellen Sie sicher, dass Sie über 9 Leerzeichen (Desktops) verfügen, bevor Sie beginnen, und Sie müssen die standardmäßigen Tastenkombinationen für die Tastenkombination Strg-Up und Strg-Down in den Systemeinstellungen auf etwas anderes ändern (unter Tastatur -> Tastenkombinationen -> Mission Control) : Mission Control und Show Desktop).

Beim ersten Durchlauf durchläuft es Ihre Desktops, um sie beim ersten Ändern des Speicherplatzes aufzuzählen.

Dann sollten Sie in der Lage sein, zwischen Desktops wie in einem 3x3-Raster zu wechseln.

Es kann ein paar Falten geben, aber es ist grundsätzlich funktionell, zumindest für mich.

4
sdsykes

Ich bin auf Mountain Lion und das scheint für mich zu funktionieren.

defaults read com.Apple.spaces

Suchen Sie nach "Current Space". Sie werden feststellen, dass die Ausführung dieses Befehls mit verschiedenen aktiven Leerzeichen den aktuellen Leerzeichen nicht verändert. BUT, wenn Sie die Checkbox-Schaltfläche in den "Systemeinstellungen" aktivieren und deaktivieren und erneut ausführen. Sie wird aktualisiert.

Hoffentlich hilft das jemand anderen!

EDIT: Es ist hässlich, aber ich benutze das:

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

Dies funktioniert, ist kostenlos (im Moment) und ist fantastisch.

Stellen Sie sicher, dass Sie so viele Bereiche manuell erstellen, wie Ihr Layout (in den Voreinstellungen) erwartet.

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