Подтвердить что ты не робот

OSX Lion AppleScript: Как получить текущее пространство # из управления миссией?

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


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

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

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

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

4b9b3361

Ответ 1

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

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

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

$ 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 отображается на дисплее. Я бы предположил, что no uuid означает Display 1, а средний экран дисплея 1 + n.

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


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

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

  • Перейти к: /System/Library/CoreServices/Dock
  • Щелкните правой кнопкой мыши и Показать содержимое пакета
  • Перейдите: /Contents/MacOS/
  • Скопируйте и вставьте двоичный файл Dock на свой рабочий стол.
  • Запуск: $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.

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

Вы говорите, что вам нужно обнаружить текущее пространство #. Это не совсем верно: для перемещения вниз по одной строке вы просто перемещаете 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 к работе.

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

Связанное наблюдение: 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

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

Изменить Space.app

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

Перед началом работы убедитесь, что у вас установлено 9 пространств (настольных компьютеров), и вам нужно будет изменить привязки клавиш ctrl-up и ctrl-down по умолчанию в системных настройках к чему-то еще (в Keyboard → Shortcut Keyboard → Управление миссией: управление миссиями и показ рабочего стола).

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

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

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

Ответ 5

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

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';'

Ответ 6

http://switchstep.com/ReSpaceApp

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

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

Ответ 7

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