Я могу открыть вкладку Terminal с помощью следующего AppleScript:
tell application "Terminal"
set myTab to do script "exec sleep 1"
get myTab
end tell
Это возвращает строку как: tab 1 of window id 3263 of application "Terminal"
. Здорово, я вижу идентификатор 3263 окна и вкладку номер 1 (хотя я не знаю, как запросить myTab для получения только этих значений).
В Какао ScriptingBridge я могу сделать:
SBApplication *terminal;
SBObject *tab;
terminal = [SBApplication applicationWithBundleIdentifier:@"com.apple.terminal"]
tab = [terminal doScript:@"exec sleep 1" in:nil]
Как я получаю идентификатор окна и число вкладки от объекта вкладки?
Редактирование 27.04.2009 - Почему?
В ответе на то, почему я хочу сделать это - я открываю команду в Окне терминала (как выше) и возвращаю объект вкладки. Однако я хочу переместиться/изменить размер это окно, таким образом, я должен получить доступ к объекту "окна" вкладки.
Я использую Objective C (хорошо на самом деле, Objective C, соединенный мостом от Perl), и хочу придерживаться стандартных компонентов ОС, таким образом, я полагаю, что у меня только есть платформы NSAppleScript и ScriptingBridge для проигрывания с (весь жемчуг applescript, модули порвали с углеродным удалением на 64 бита). Я попробовал бы NSAppleScript, но обработка возвращаемого значения, кажется, черная магия.
Мое текущее решение состоит в том, чтобы добраться, TTY объекта вкладки (гарантировал уникальный), и перечислите каждую вкладку каждого окна, пока я не нахожу окно, содержащее вкладку. Я предположил, что это не могло быть лучшим способом (это уверенный не быстро!).
Редактирование 30.04.2009 - Решение
На основе предложений "имеет" ниже, я выдержал NSAppleEventDescriptor API. Первоначально, я только смог добраться до этого с NSAppleScript executeAndReturnError()
звонить. Однако я нашел, что NSAppleScript был очень, намного медленнее, чем ScriptingBridge.
После использования ClassDump для извлечения еще немного вызовов SBObject я нашел недокументированное specifierDescription()
и qualifiedSpecifier()
вызовы. Первый дает мне хорошую "вкладку X идентификационной Y строки" окна. Последние возвраты дескриптор события яблока, который я могу затем декодировать.
Мой заключительный код (в жемчуге):
use Foundation;
NSBundle->bundleWithPath_('/System/Library/Frameworks/ScriptingBridge.framework')->load;
# Create an OSType (bid endian long) from a string
sub OSType ($) { return unpack('N', $_[0]) }
my $terminal = SBApplication->applicationWithBundleIdentifier_("com.apple.terminal");
my $tab = $terminal->doScript_in_("exec sleep 1", undef);
my $tab_ev_desc = $tab->qualifiedSpecifier;
my $tab_id = $tab_ev_desc->descriptorForKeyword_(OSType 'seld')->int32Value;
my $win_ev_desc = $tab_ev_desc->descriptorForKeyword_(OSType 'from');
my $window_id = $win_ev_desc->descriptorForKeyword_(OSType 'seld')->int32Value;
print "Window:$window_id Tab:$tab_id\n";
Технически вы не можете; лучший вопрос: почему вы хотите?
(Ну, хорошо, вы могли бы, если бы использовали Apple Event Manager API или objc-appscript , оба из которых могут дать вам необработанный AEDesc / NSAppleEventDescriptor, который вы можете рекурсивно разделить себя . Или вы можете покопаться в SB, чтобы увидеть, есть ли недокументированный API для доступа к базовому AEDesc, но, конечно, будьте осторожны с бдителем. В качестве альтернативы может быть лучший способ достичь своей фактической цели, не прибегая к хакерским атакам, но вам потребуется предоставить дополнительную информацию.)