2010-04-26 6 views
5

puedo abrir una pestaña terminal utilizando el siguiente AppleScript:¿Cómo obtengo el ID de la ventana y el número de pestaña de una ventana de Terminal utilizando AppleScript a través de ScriptingBridge?

tell application "Terminal" 
    set myTab to do script "exec sleep 1" 
    get myTab 
end tell 

Esto devuelve una cadena como: tab 1 of window id 3263 of application "Terminal". Esto es genial, puedo ver la ventana id y la pestaña número (aunque no sé cómo consultar myTab para obtener solo estos valores).

En el cacao ScriptingBridge, que puedo hacer:

SBApplication *terminal; 
SBObject  *tab; 

terminal = [SBApplication applicationWithBundleIdentifier:@"com.apple.terminal"] 
tab = [terminal doScript:@"exec sleep 1" in:nil] 

¿Cómo puedo obtener el identificador de ventana y el número de ficha del objeto pestaña?


Edición 27/04/2009 - ¿Por qué?

En respuesta a por qué quiero hacer esto - Estoy abriendo un comando en una ventana de terminal (como el anterior), y estoy haciendo volver la pestaña objeto. Sin embargo, quiero mover/cambiar el tamaño de esta ventana, así que necesito tener acceso al objeto "ventana" de la pestaña.

Estoy usando Objective-C (bueno, Objective-C puenteado desde Perl), y quiero adherirme a los componentes del sistema operativo estándar, así que creo que solo tengo los marcos NSAppleScript y ScriptingBridge para jugar (todos los manuscritos de Perl) los módulos se rompieron con la eliminación de carbono de 64 bits). Probaría NSAppleScript, pero el procesamiento de los valores devueltos parece ser un arte negro.

Mi solución actual es conseguir que el TTY del objeto pestaña (garantizado única) y enumerar todas las fichas de cada ventana hasta que encuentre la ventana que contiene la ficha. Supuse que esta no podía ser la mejor manera (¡seguro que no es rápido!).


Edición 30/04/2009 - Solución

Sobre la base de las sugerencias de "has" a continuación, que hicieron frente a la API NSAppleEventDescriptor. Inicialmente, solo pude acceder a esto con la llamada executeAndReturnError() de NSAppleScript. Sin embargo, descubrí que NSAppleScript era mucho, mucho más lento que ScriptingBridge.

Después de usar ClassDump para extraer algunas llamadas SBObject más, encontré las llamadas specifierDescription() y no documentadas. El primero me da la agradable "pestaña X de la identificación de ventana Y". Este último devuelve el descriptor de evento de apple, que luego puedo decodificar.

Mi código final (en Perl) es:

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

Respuesta

1

Técnicamente no se puede; una mejor pregunta es ¿por qué quieres?

(Bueno, está bien, lo que podría si se utiliza la API de manzana o Evento objc-appscript, ambos de los cuales se le dará una prima AEDesc/NSAppleEventDescriptor las cuales se puede recursiva pull apart yourself.O puede hurgar en SB para ver si hay una API no documentada para acceder al AEDesc subyacente, pero caveat emptor, por supuesto. Alternativamente, puede haber una mejor manera de lograr su objetivo real sin tener que recurrir a hackery, pero que había necesidad de proporcionar más información)

+0

Gracias por el comentario. Actualicé la pregunta para agregar la parte "por qué". Sospeché que podría terminar jugando con los AppleEvents. ¿Es esto posible en NSAppleScript? Estoy tratando de trabajar solo con cosas que hayan sido preinstaladas en la máquina. –

+0

Sí, debería haber pensado en NSAppleScript también. Si ejecuta el comando 'do script' en AppleScript usando - [NSAppleScript executeAppleEvent: error:] (suponiendo que también quiera pasar parámetros) y devuelva la referencia, obtendrá un NSAppleEventDescriptor que contiene su especificador de objetos. Un poco desordenado, pero si no estás en [Obj-] C y no puedes permitirte las dependencias externas, entonces es realmente tu única opción. En cuanto a empaquetar y desempaquetar AEDescs, no es demasiado difícil una vez que sepa cómo están estructurados. p.ej. Eche un vistazo a la clase AEMCodecs de objc-appscript para obtener consejos. – has

+0

Gracias - parece que NSAppleEventDescriptor es el camino a seguir. Como no me gustaba el rendimiento de NSAppleScript, encontré una llamada de ScriptingBridge no documentada que devolvía el descriptor. Agregué mi código al final de la pregunta. –

0

¿Qué tal algo muy simple como esto:.

aplicación Tell "Terminal" conjunto new_win hacer guión "" conjunto w_id a Identificación del extremo frontal ventana decir

+1

Sí, lo usé por un tiempo, pero hay una condición de carrera si el usuario cambió las ventanas entre "do script" y "set id", que ocurre más de lo que inicialmente se esperaba. –

2

sé que esto es una vieja pregunta, pero sólo tenía este problema hoy en día, y yo no encontraron buenas respuestas en línea. Esto funcionó para mí:

tell application "Terminal" 
    set newTab to do script "echo hello" 
    set theWindow to first window of (every window whose tabs contains newTab) 
    set windowId to theWindow's id 
    repeat with i from 1 to the count of theWindow's tabs 
     if item i of theWindow's tabs is newTab then set tabNumber to i 
    end repeat 
    get {windowId, tabNumber} 
end tell 
Cuestiones relacionadas