Проблема ...Как закрыть окно с помощью платформы OS-X ScriptingBridge, с Perl?
С MacPerl is no longer supported on 64bit perl, я пытаюсь альтернативные структуры для управления Terminal.app.
Я пытаюсь использовать ScriptingBridge, но столкнулся с проблемой передачи перечислимой строки методу closeSaving
с использованием PerlObjCBridge.
Я хочу назвать:
typedef enum {
TerminalSaveOptionsYes = 'yes ' /* Save the file. */,
TerminalSaveOptionsNo = 'no ' /* Do not save the file. */,
TerminalSaveOptionsAsk = 'ask ' /* Ask the user whether or not to save the file. */
} TerminalSaveOptions;
- (void) closeSaving:(TerminalSaveOptions)saving savingIn:(NSURL *)savingIn; // Close a document.
Покушение Решение ...
Я попытался:
#!/usr/bin/perl
use strict;
use warnings;
use Foundation;
# Load the ScriptingBridge framework
NSBundle->bundleWithPath_('/System/Library/Frameworks/ScriptingBridge.framework')->load;
@SBApplication::ISA = qw(PerlObjCBridge);
# Set up scripting bridge for Terminal.app
my $terminal = SBApplication->applicationWithBundleIdentifier_("com.apple.terminal");
# Open a new window, get back the tab
my $tab = $terminal->doScript_in_('exec sleep 60', undef);
warn "Opened tty: ".$tab->tty->UTF8String; # Yes, it is a tab
# Now try to close it
# Simple idea
eval { $tab->closeSaving_savingIn_('no ', undef) }; warn [email protected] if [email protected];
# Try passing a string ref
my $no = 'no ';
eval { $tab->closeSaving_savingIn_(\$no, undef) }; warn [email protected] if [email protected];
# Ok - get a pointer to the string
my $pointer = pack("P4", $no);
eval { $tab->closeSaving_savingIn_($pointer, undef) }; warn [email protected] if [email protected];
eval { $tab->closeSaving_savingIn_(\$pointer, undef) }; warn [email protected] if [email protected];
# Try a pointer decodes as an int, like PerlObjCBridge uses
my $int_pointer = unpack("L!", $pointer);
eval { $tab->closeSaving_savingIn_($int_pointer, undef) }; warn [email protected] if [email protected];
eval { $tab->closeSaving_savingIn_(\$int_pointer, undef) }; warn [email protected] if [email protected];
# Aaarrgghhhh....
Как вы можете видеть, все мои догадки, как пройти перечислимая строка терпит неудачу.
Перед тем, как пламя меня ...
- Я знаю, что я мог бы использовать другой язык (Ruby, Python, какао), чтобы сделать это, но это потребует перевода остальной части кода.
- Возможно, я смогу использовать CamelBones, но я не хочу предполагать, что мои пользователи установили его.
- Я мог бы также использовать инфраструктуру NSAppleScript (предполагая, что я столкнулся с проблемой поиска идентификаторов таблиц и окон), но кажется странным прибегать к нему только для этого вызова.
Да, это оказывается в правильном направлении. TerminalSaveOptions - это OSValue, длинный большой конец. pack («N», «no») работает! –