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.
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.
$ 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:- idź do:
/System/Library/CoreServices/Dock
- kliknij prawym przyciskiem myszy i Pokaż Zawartość pakietu
- Nawigacja:
/Contents/MacOS/
- skopiuj i wklej plik binarny
Dock
na pulpit. - 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).
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.
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ść.
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?
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.
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';'
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).
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
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