2010-04-12 2 views
1

Проблема ...Как закрыть окно с помощью платформы 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 (предполагая, что я столкнулся с проблемой поиска идентификаторов таблиц и окон), но кажется странным прибегать к нему только для этого вызова.

ответ

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

enum не называет строковые константы; он называет int констант. Каждое из этих имен имеет значение int.

Итак, попробуйте упаковать как a или I вместо этого. Или, сделайте оба: Упакуйте как a, затем распакуйте как I и передайте это число.

+0

Да, это оказывается в правильном направлении. TerminalSaveOptions - это OSValue, длинный большой конец. pack («N», «no») работает! –