I did some more work on GUSI emulation, and with the help of Dan Sugalski on some, um, good practices with C, and a few words from Matthias, I was able to get most of it done. I have GUSIPath2FSp, GUSIFSp2FullPath, and GUSIFSp2Encoding being emulated properly (more or less), and have GUSIFSpUp and GUSIFSpDown yet to do.
There are a few functions that do not pass their paths through GUSI routines before sending them to Carbon. For now, these routines (such as NewAliasMinimalFromFullPath) will require Mac-style paths; all other routines will accept Unix-style paths, and return Unix-style paths. Witness the bizarre:
$ perl -MMac::Files -le 'print scalar ResolveAlias NewAliasMinimalFromFullPath("Bird:tmp:perl:macos:");'
On the relative path front, it's interesting to note that by switching to Unix-style paths, I went with FSPathMakeRef, which seems to automatically handles relative paths, aliases, etc. Nifty.
I played around more with Notification; it is a little bit hampered, I think, in that it is designed to work with the current application. perl is not an application. It doesn't have an icon in the Dock to bounce. It'd be nice if I could find a way to bounce the icon of an arbitrary application, or maybe the parent application.
In Notification.t, the basic logic is to wait until the current process is not the front process. Well, similarly, perl is the current process, but is never the front process. The processLauncher parameter, though, tells us perl's parent (which in my tests, can be either Terminal or BBEdit), and then I can use that process number for the logic, and automatically grab the name (processName) of the process while I am at it. So when you run it, it'll say "Please switch $name to the background".
And now when I run Processes.t, I get Unix-style paths for the processAppSpec parameter. Wow. Blows my mind, man.