Как я получаю идентификатор окна и количество вкладки использования Окна терминала AppleScript через ScriptingBridge?

Я могу открыть вкладку 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";

5
задан Community 23 May 2017 в 12:32
поделиться

1 ответ

Технически вы не можете; лучший вопрос: почему вы хотите?

(Ну, хорошо, вы могли бы, если бы использовали Apple Event Manager API или objc-appscript , оба из которых могут дать вам необработанный AEDesc / NSAppleEventDescriptor, который вы можете рекурсивно разделить себя . Или вы можете покопаться в SB, чтобы увидеть, есть ли недокументированный API для доступа к базовому AEDesc, но, конечно, будьте осторожны с бдителем. В качестве альтернативы может быть лучший способ достичь своей фактической цели, не прибегая к хакерским атакам, но вам потребуется предоставить дополнительную информацию.)

1
ответ дан 15 December 2019 в 00:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: