(Sorry if this is a double-post, I sent first to the newsgroup rather than the mailing list).

As I've mentioned before on the list, I'm working on a Perl extension that allows integration between a Perl app and other Mac apps via the Apple Events IPC mechanism. There is an older Perl package (Mac::Carbon) that provides such functionality among its other methods, but much of it is obsolete and/or will no longer build, and the author has not updated the package for years.

I have made excellent progress and have gotten the C side pretty much worked out: I can send basic commands via the Apple Event/AppleScript mechanism to my Perl/Tkx app, have the app run a command, and return output via the Apple Event pipeline. I am running into an unexpected difficulty, however. The commands that I am exposing involve a combination of data processing and also updating the UI of my application. The data side works, but the UI (which is controlled by the Tkx event loop) does not respond.

Here's a brief example:

sub scriptSetDir {
    my $dname = shift;
    &selectFileSystem("$dname");
    return "Set directory as $dname\n";

}

This command is supposed to grab a directory name as the command parameter, sets a variable to that value, run the internal "selectFileSystem" command that updates the app UI with the contents of the directory, and the returns the command result to the external IPC mechanism. The first and the last things happen, but the &selectFileSystem call does not fire. It's not clear to me why this is the case.

Getting the form of the command name passed to the Apple Events mechanism has proven a bit tricky; Perl would complain about "undefined subroutine" if I just passed the bare name of the command to the IPC mechanism. Interestingly, it would complain that the name "Tkx::i::scriptSetDir" was the command. I'm not sure where the Tkx::i namespace came from in this regard. Eventually, this form of mapping the command worked:

    Mac::AEM::installeventhandler( "CoKv", "fMdr", "main::scriptSetDir" );

The first two args above are the IPC event codes used by the Apple OS to register what events/commands my app will handle. The third, which maps the Perl command to the "main::'" namespace, fires the Perl-level data processing pieces but not the updates to the Tkx UI.

I suspect there is something going on with the Tkx event loop that simply does not receive the message to fire the command; I know that from trying to integrate Tkx with other Perl IPC systems that only running a Tcl-based socket plays nicely with Tkx. The Apple Event mechanism, however, is lower-level and plays nicely with Tk in other contexts (I've gotten it to work with Tcl/Tk and Python/Tkinter). Because there are so many layers here, it's hard to figure out where to debug it. Has anyone else used some kind of IPC mechanism with Perl/Tkx successfully, perhaps with COM on Windows or dbus on Linux (the rough analogs to Apple Events on other platforms)?

Advice is appreciated.

--Kevin

--
Kevin Walzer
Code by Kevin/Mobile Code by Kevin
http://www.codebykevin.com
http://www.wtmobilesoftware.com

Reply via email to