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