it-roy-ru.com

OSX Lion AppleScript: Я думаю, что простор # od контролирует миссию?

Snažím se přijít na to, jak dostat aktuální prostor # z kontrole mise. Zdroj by by užitečný, ale užitečnější byly информирование о том, что я должен zam. Напсал, я думаю, сценарии, не только, но и вы должны знать, что это не так, как вы думаете, что вы не знаете, что это за язык. Nemám ponětí, як быть на 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" zpět, protože jsem ji používal po celou dobu. Použil jsem k navaci mezi mezerami pomocí kláves se šipkami (напр.ALT+) každých několik sekund. Вы можете увидеть, что вам нужно, 1x9 полюс простор, элегантно, 3x3 mřížky. Зову маповаль, все просторы, просторы, цифры, представления, проблемы, проблемы, связанные с этим, 3 года, 3 года, все дни жизни.

В поднебесной чи бич шопен поуживатьALT+znovu, 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, and když mnohem podrobnější, než jsem očekával, vyžaduje napsání aplikace, která to udělá (навигация по отъездной дороге). Честно говоря, я могу сказать, что ты не можешь не попробовать яблоки.

45
Mark Kahn

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

  • Каждое «пространство» управления полетом получает присвоенное ему 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";
        }
    );
}

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

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

Я быстро просмотрел библиотеку AppleScript Editor (Window ---> Library) и не увидел ни одной записи в Системных событиях для 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, который, по-видимому, представляет один пробел в Mission Control, и множество других классов 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.

Таким образом, похоже, что потребуется некоторый SIMBL взлом Dock, чтобы получить доступ к WVSpaces.

28
Dave Gallagher

Я ковырялся, и я придумал это: https://Gist.github.com/1129406

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

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

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

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

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

15
LaC

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

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

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

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

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

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

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

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

7
Janus

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

Изменить Space.app

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

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

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

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

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

4
sdsykes

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

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
patcon

http://switchstep.com/ReSpaceApp

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

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

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