OSX Lion AppleScript: jak uzyskać aktualną przestrzeń # z mission control?

Próbuję dowiedzieć się, jak zdobyć obecną przestrzeń # z kontroli misji. Źródło byłoby pomocne, ale bardziej pomocne byłyby informacje o tym, jak sam to rozgryźć. Napisałem kilka applescriptów, ale często wydaje się, że za każdym razem, gdy muszę zrobić coś nowego (na co nie mogę znaleźć dokumentacji słownika), wchodzi to w kategorię " powiedz tej konkretnej aplikacji (np. "zdarzenia systemowe") to bardzo konkretne coś " i nie mam pojęcia, jak mógłbym się domyślić, że Wynocha.


Dokładnie to, co staram się zrobić:

I nienawiść Nowa mission control w OSX 10.7. Chcę, aby moje przestrzenie" grid " z powrotem, ponieważ używałem go cały czas. Kiedyś nawigowałem między spacjami za pomocą klawiszy strzałek (np. ALT+) co kilka sekund. Teraz utknąłem z tą niezgrabną tablicą przestrzeni 1x9 zamiast eleganckiej siatki 3x3. Ponownie zmapowałem wszystkie moje spacje, aby użyć klawiatury numerycznej, która częściowo rozwiązuje problem (ponieważ jest to 3x3 grid), ale tylko wtedy, gdy mam podłączoną zewnętrzną klawiaturę.

W zasadzie chcę móc używać ALT+ oraz ponownie, ale aby to zrobić, muszę wykryć bieżącą przestrzeń #, aby móc przełączyć się ze spacji 5-->2, na przykład.

Odpowiedź Dave ' a poniżej, choć znacznie bardziej szczegółowa niż się spodziewałem, wymaga napisania aplikacji, aby to zrobić(plus to nadal nie w pełni odpowiedzieć na pytanie). Jeśli to w ogóle możliwe, wolałbym po prostu związać kilka kluczy do applescript.

Author: Mark Kahn, 2011-07-21

7 answers

Sam próbuję to rozgryźć. Jeszcze nie, ale we właściwym kierunku:

  • każda misja kontrolna "przestrzeń" dostaje uuid przypisany do niej...
  • ...z wyjątkiem pierwszego (AFAIK) i deski rozdzielczej.
Możesz je przeczytać tutaj:
$ defaults read com.apple.spaces
$ defaults read com.apple.desktop

Lokalizacja pliku:

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

Oto mój. Mam włączone cztery spacje i pojawiają się trzy wpisy:

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

Jeśli usuniesz spację, ten wpis zostanie usunięty z pliku. Jeśli dodasz spację, zostanie dodany wpis. Ponownie, nigdy nie ma wpisu dla pulpitu 1 lub Pulpitu Nawigacyjnego.

Nie jestem pewien, czy istnieje publiczne API, aby dowiedzieć się, jaka przestrzeń uuid jest wyświetlana na wyświetlaczu. W przeciwieństwie do innych, Wyświetlacz 1+n jest wyświetlany tylko raz.]}

Rzuciłem okiem na bibliotekę edytora AppleScript (okno - - - > biblioteka) i nie widziałem żadnych wpisów w zdarzeniach systemowych dla spaces. Jest to prawdopodobnie coś, co można zrobić z Cocoa, może przez prywatne API, ale nie jestem pewien AppleScript.


Aktualizacja-lipiec 23, 2011

Wygląda jak Stacja Kontroli Lotów. Możesz pobrać jego pliki nagłówkowe w następujący sposób:
  1. idź do: /System/Library/CoreServices/Dock
  2. kliknij prawym przyciskiem myszy i Pokaż Zawartość pakietu
  3. Nawigacja: /Contents/MacOS/
  4. skopiuj i wklej plik binarny Dock na pulpit.
  5. Run: $class-dump ~/Desktop/Dock

To wypluwa wszystkie pliki nagłówkowe (jest długa; prawie 7500 linii). Możesz zobaczyć spaceUUID ciągi pojawiające się tam. Istnieje klasa o nazwie WVSpace, która wydaje się reprezentować jedną przestrzeń w Mission Control, oraz wiele innych klas WV*.

Będę oglądał to jutro; zbyt zmęczony teraz. :)


Aktualizacja-lipiec 24, 2011

Wewnątrz doku jest klasa o nazwie WVSpaces. Posiada wiele atrybutów, w tym:

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

Każda klasa WVSpace ma atrybut NSString *_uuid;, który jest prawdopodobnie jest w kosmosie. Więc teoretycznie można uzyskać bieżący numer przestrzeni tak:

WVSpace *currentSpace = [[WVSpaces sharedInstance] currentSpace];
NSString *currentSpaceUUID = [currentSpace _uuid];     // Empty string if main space???
Trik polega na tym, jak uzyskać dostęp do prywatnej klasy zakopanej w doku? Zakładam, że to Singleton, ponieważ ma atrybut NSMutableArray *_spaces;, prawdopodobnie z każdą wymienioną w nim przestrzenią. Tylko jedna spacja jest wyświetlana naraz (dotyczy to wielu monitorów; spacja obejmuje oba monitory), więc sensowne jest posiadanie tylko jednej instancji {15]}.

Wygląda na to, że aby uzyskać dostęp do Docka, konieczne będzie włamanie się do Docka (SIMBL).

 28
Author: Dave Gallagher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-13 17:06:21

Poszperałam i wymyśliłam to: https://gist.github.com/1129406

Spacje mają nonsequential ID i indeks sekwencyjny (oparty na 0). ID można uzyskać na dwa sposoby:

  • z publicznych interfejsów API (patrz get_space_id)
  • z prywatnego API CGS CGSGetWorkspace

Możesz ustawić bieżącą przestrzeń według indeksu za pomocą publicznych interfejsów API (choć same powiadomienia nie są publicznie udokumentowane): zobacz set_space_by_index

Możesz ustawić bieżącą przestrzeń według ID korzystanie z prywatnego interfejsu API CGS CGSSetWorkspace.

Tynie możesz uzyskać bezpośrednio bieżącego indeksu przestrzeni. Jeśli jednak zawsze używasz tego samego zestawu dziewięciu spacji, możesz je obracać za pomocą set_space_by_index, zbierać ich identyfikatory i tworzyć mapowanie. Następnie będziesz mógł uzyskać bieżący indeks z identyfikatora.

 15
Author: LaC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-06 14:59:50

... też nad tym pracuję:)

Mówisz ,że " musisz wykryć bieżącą przestrzeń #". Nie jest to ściśle prawda: aby przesunąć w dół o jeden rząd, wystarczy przesunąć 3 spacje w prawo, więc w zasadzie można po prostu związać coś w stylu

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

Do Alt-down (z FastScripts, Alfred lub jakaś inna szybka metoda, która pozwala uniknąć napowietrzania Automatora). To podejście nie powiedzie się, jeśli kiedykolwiek uderzysz w dolny rząd, oczywiście-ale jeśli jesteś naprawdę twardy, nigdy nie robisz :)
Musisz "włączyć Dostęp dla urządzeń wspomagających" w okienku preferencji uniwersalnego dostępu dla podejścia key code do pracy.

Zastrzeżenie: to nie działa. Kiedy uruchamiam skrypt powyżej, ładnie przeskakuję trzy spacje. Problem polega na tym, że potem moja klawiatura przestaje odpowiadać: wydaje się, że tylko menedżer okien odbiera zdarzenia: mogę zamknąć okna i przełączać przestrzeń, ale nie mogę wchodzić w interakcje z żadnymi aplikacjami.
Moja teoria jest taka, że to się dzieje gdy skok powoduje zmianę bieżącej aplikacji podczas wykonywania skryptu -- ale nie mam pojęcia jak to naprawić.

Podobne spostrzeżenie: Mission Control (tj. /Applications/Mission Control.app/Contents/MacOS/Mission\ Control) wydaje się reagować na niektóre argumenty linii poleceń:

  • Mission\ Control: Pokaż kontrolę misji
  • Mission\ Control 1: Pokaż pulpit
  • Mission\ Control 2: pokaż bieżące okna aplikacji

Próbowałem wstawić niektóre UUID z defaults read com.apple.spaces, ale to nie pomogło. To tyle, jeśli chodzi o wpadanie w ciemność.

 7
Author: Janus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-05 08:33:39

Napisałem aplikację - czy działa na Ciebie?

Zmień Przestrzeń.app

Klawisze, aby to działa są control-shift i klawisze strzałek, chociaż może to być naprawione, jeśli utkniesz na ALT.

Upewnij się, że masz ustawione 9 spacji (pulpitów) przed rozpoczęciem, i musisz zmienić domyślne powiązania klawiszy ctrl-up i Ctrl-down w Preferencjach systemowych na coś innego (w klawiaturze -> skróty klawiaturowe - > Mission Control : Mission Control I Show Pulpit).

Przy pierwszym uruchomieniu będzie przechodzić przez pulpity, aby wyliczyć je po pierwszej zmianie spacji.

Wtedy powinieneś być w stanie zmieniać między pulpitami jak w siatce 3x3.

Może i jest kilka zmarszczek, ale to w zasadzie funkcjonalne, przynajmniej dla mnie.

 4
Author: sdsykes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-31 19:23:07

Jestem na Mountain Lion i to chyba działa na mnie.

defaults read com.apple.spaces

Poszukaj "Aktualnej przestrzeni". Zauważysz, że uruchomienie tego polecenia z różnymi aktywnymi spacjami nie zmienia bieżącej spacji, ale jeśli zaznaczysz i odznaczysz przycisk wyboru w "Preferencjach systemowych" i uruchomisz go ponownie, zobaczysz go zaktualizowanego.

Miejmy nadzieję, że to pomoże komuś innemu!

EDIT: jest brzydki, ale używam tego:

killall Dock && sleep 0.2 && defaults read com.apple.spaces | grep -A1 "Current Space" | tail -1 | awk '{print $NF }' | cut -f1 -d';'

 2
Author: patcon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-07 06:50:38

Http://switchstep.com/ReSpaceApp

To działa, jest darmowe (teraz) i jest niesamowite.

Pamiętaj tylko, aby ręcznie utworzyć tyle spacji, ile oczekuje twój układ (w preferencjach).

 1
Author: David Lio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-22 06:49:02
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
Author: Montaldo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-20 21:23:49