OSX Lion AppleScript: Как получить текущее пространство # из управления полетами? - PullRequest
45 голосов
/ 21 июля 2011

Я пытаюсь выяснить, как получить текущее пространство # из управления полетом. Источник был бы полезен, но более полезной была бы информация о том, как самому в этом разобраться. Я написал несколько яблочных сценариев, но чаще всего мне кажется, что в любое время, когда мне нужно сделать что-то новое (для которого я не могу найти словарную документацию), оно подпадает под категорию «рассказать об этом конкретном приложении (например,« Система »). События ") это очень специфическая вещь", и я понятия не имею, как бы я на самом деле это выяснил.


В частности, что я пытаюсь сделать:

Я ненавижу новый контроль миссии в OSX 10.7. Я хочу, чтобы мои пробелы вернулись назад, так как я использовал их все время. Я использовал для навигации между пробелами, используя клавиши со стрелками (например, ALT + ) каждые несколько секунд. Теперь я застрял с этим неуклюжим массивом 1х9 вместо элегантной сетки 3х3. Я переназначил все свои пробелы, чтобы использовать цифровую клавиатуру, что частично решает проблему (поскольку это сетка 3х3), но только когда у меня подключена внешняя клавиатура.

В принципе, я хочу иметь возможность снова использовать ALT + и , но для этого мне нужно определить текущее пространство # так что я могу переключиться из пробела 5 -> 2, например.

Ответ Дейва ниже, хотя и гораздо более подробный, чем я ожидал, требует написания приложения для этого (к тому же, оно все еще не полностью отвечает на вопрос). Если это вообще возможно, я бы просто привязал несколько ключей к appleScript.

Ответы [ 7 ]

30 голосов
/ 22 июля 2011

Я пытаюсь понять это сам.Пока нет, но в правильном направлении:

  • Каждому «пространству» Управления полетом присваивается uuid назначенное ему ...
  • ... за исключением самого первогоодин (AFAIK), и один приборной панели.

Вы можете прочитать их здесь:

$ defaults read com.apple.spaces
$ defaults read com.apple.desktop

Расположение файлов:

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

Вот мое.У меня включено четыре пробела, и отображаются три записи:

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

Если вы удалите пробел, эта запись будет удалена из файла.Если вы добавите пробел, запись будет добавлена.Опять же, для Desktop 1 или Dashboard никогда не будет записи.

Я не уверен, существует ли публичный API для определения того, какое пространство uuid отображается на дисплее.Я бы предположил, что нет uuid означает «Дисплей 1», а другие означают «Дисплей 1 + n.

». Я бросил быстрый взгляд через библиотеку AppleScript Editor (Window ---> Library) и ничего не сделал.t увидеть любые записи в разделе Системные события для spaces.Вероятно, это то, что можно сделать с помощью Какао, возможно, через частный API, но я не уверен насчет AppleScript.


ОБНОВЛЕНИЕ - 23 июля 2011 г.

Похоже, Dock контролирует Mission Control.Вы можете получить его заголовочные файлы следующим образом:

  1. Перейти к: /System/Library/CoreServices/Dock
  2. Щелкните правой кнопкой мыши и Показать содержимое пакета
  3. Навигация: /Contents/MacOS/
  4. Скопируйте и вставьте двоичный файл Dock на рабочий стол.
  5. Выполните: $class-dump ~/Desktop/Dock

Это выплюнет все егозаголовочные файлы (это длинные; почти 7500 строк).Вы можете видеть строки spaceUUID, появляющиеся там.Есть класс под названием WVSpace, который, по-видимому, представляет один пробел в Управлении полетами, и множество других классов WV *.

Я продолжу смотреть на него завтра;слишком устал сейчас.:)


ОБНОВЛЕНИЕ - 24 июля 2011 г.

Внутри Dock есть класс с именем WVSpaces.Он имеет ряд атрибутов, включая:

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

Каждый класс WVSpace имеет атрибут NSString *_uuid;, который, вероятно, является его SpaceUUID.Таким образом, теоретически вы можете получить текущий номер пространства следующим образом:

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

Хитрость в том, как получить доступ к закрытому классу WVSpaces, скрытому внутри Dock?Я предполагаю, что это Singleton, так как он имеет атрибут NSMutableArray *_spaces;, вероятно, с каждым пробелом, перечисленным в нем.Одновременно отображается только один пробел (это верно, если вы используете несколько мониторов; пробел распространяется на них обоих), поэтому имеет смысл иметь только один экземпляр WVSpaces.

Так чтоПохоже, что для получения доступа к WVSpaces.

потребуется взлом * Dock SIMBL .
15 голосов
/ 06 августа 2011

Я ковырялся и придумал следующее: https://gist.github.com/1129406

Пробелы имеют непоследовательный идентификатор и последовательный индекс (на основе 0).Вы можете получить идентификатор двумя способами:

  • из общедоступных API (см. get_space_id)
  • из частного CGS API CGSGetWorkspace

Вы можете установить текущее пространство по индексу, используя публичные API (хотя сами уведомления не являются публично документированными): см. set_space_by_index

Вы можете установить текущее пространство по ID, используя приватный API CGS CGSSetWorkspace.

Вы не можете получить текущий индекс пространства напрямую.Однако, если вы всегда используете один и тот же набор из девяти пробелов, вы можете повернуть их один раз, используя set_space_by_index, собрать их идентификаторы и построить отображение.Тогда вы сможете получить текущий индекс из идентификатора.

8 голосов
/ 05 августа 2011

... тоже работал над этим:)

Вы говорите, что вам "необходимо определить текущее пространство #". Это не совсем верно: чтобы двигаться вниз на один ряд, вы просто перемещаете 3 пробела вправо, поэтому в принципе вы можете просто связать что-то вроде

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

до Alt-down (с FastScripts , Альфредом или другим быстрым методом, который позволяет избежать издержек Automator). Этот подход потерпит неудачу, если вы когда-нибудь попадете в нижний ряд, конечно - но если вы действительно зашиты, вы никогда этого не сделаете:)
Вам нужно «Включить доступ для вспомогательных устройств» на панели настроек Универсального доступа, чтобы подход key code работал.

Предостережение : Это не работает. Когда я запускаю скрипт выше, я приятно прыгаю три пробела. Проблема в том, что после этого моя клавиатура перестает отвечать на запросы: кажется, что только оконный менеджер получает события: я могу закрывать окна и переключать пространство, но я не могу взаимодействовать ни с какими приложениями.
Моя теория состоит в том, что это происходит, когда скачок вызывает изменение текущего приложения во время выполнения скрипта - но я понятия не имею, как это исправить.

Соответствующее наблюдение: Mission Control (т.е. /Applications/Mission Control.app/Contents/MacOS/Mission\ Control), похоже, реагирует на некоторые аргументы командной строки:

  • Mission\ Control: показать управление полетом
  • Mission\ Control 1: показать рабочий стол
  • Mission\ Control 2: показать текущие окна приложений

Я пытался вставить некоторые из UUID из defaults read com.apple.spaces, но это мало что дало. Так много для того, чтобы шарить в темноте.

4 голосов
/ 30 августа 2011

Я написал приложение - оно у вас работает?

Изменить Space.app

Клавиши, с помощью которых он работает, - это клавиши Control-Shift и клавиши со стрелками, хотя это можно исправить, если вы застряли на ALT.

Перед началом работы убедитесь, что у вас настроено 9 пробелов (рабочих столов), и вам нужно изменить привязки клавиш ctrl-up и ctrl-down по умолчанию в Системных настройках на другие (в разделе «Клавиатура» -> «Сочетания клавиш» - > Контроль полетов: Контроль полетов и Show Desktop).

При первом запуске он будет циклически перебирать ваши рабочие столы, чтобы перечислять их при первом изменении пространства.

Тогда вы сможете переключаться между рабочими столами, как в сетке 3x3.

Может быть несколько морщин, но это в основном функционально, по крайней мере, для меня.

2 голосов
/ 07 декабря 2012

Я на Горном льве, и это, кажется, работает для меня.

defaults read com.apple.spaces

Ищите «Текущее пространство». Вы заметите, что выполнение этой команды с разными активными пробелами не меняет текущий пробел, НО, если вы установите и снимите флажок в поле «Системные настройки» и снова запустите его, вы увидите, что он обновлен.

Надеюсь, это поможет кому-то еще!

РЕДАКТИРОВАТЬ: Это некрасиво, но я использую это:

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

2 голосов
/ 22 марта 2012

http://switchstep.com/ReSpaceApp

Это работает, бесплатно (прямо сейчас) и потрясающе.

Просто убедитесь, что вы вручную создали столько пробелов, сколько ожидает ваш макет (в настройках).

1 голос
/ 21 марта 2015
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
...