[Openmcl-devel] Accessing method in CoreGraphics

Gary Byers gb at clozure.com
Fri Apr 15 11:51:05 PDT 2005

On Fri, 15 Apr 2005, Duncan Rose wrote:

> Whilst trawling the web recently I came across a page with an
> interesting tidbit on it (from my point of view; page for anybody
> interested is http://www.advogato.org/article/627.html) in the section
> titled 'Is it possible to run a GUI application that doesn't reside in
> a bundle?'.
> In short apparently a CoreGraphics framework function
> 'CPSEnableForegroundOperation' can be used for this. This method is
> referenced elsewhere; a 'find' in the framework directory returns:

You might also want to look at OpenMCL's Cocoa demo, which uses
this technique to ... enable foreground operation.

> Binary file
> ./ApplicationServices.framework/Versions/A/Frameworks/
> CoreGraphics.framework/CoreGraphics matches
> Binary file
> ./ApplicationServices.framework/Versions/A/Frameworks/
> CoreGraphics.framework/CoreGraphics_profile matches
> Binary file
> ./ApplicationServices.framework/Versions/A/Frameworks/
> CoreGraphics.framework/Versions/A/CoreGraphics matches
> Binary file
> ./ApplicationServices.framework/Versions/A/Frameworks/
> CoreGraphics.framework/Versions/A/CoreGraphics_profile matches
> Binary file ./GLUT.framework/GLUT matches
> Binary file ./GLUT.framework/Versions/A/GLUT matches
> Binary file ./JavaVM.framework/Versions/1.4.1/Libraries/libawt.jnilib
> matches)
> I'm trying to use this with the following code:
>    (rlet ((psn-struct :<P>rocess<S>erial<Number>))
>      (#_GetCurrentProcess psn-struct)
>      (#_CPSEnableForegroundOperation psn-struct))
> This (expectedly) fails to compile with the following report:
>  > Error in process listener(1): Foreign function not found:
> OS::|CPSEnableForegroundOperation|
>  > While executing: CCL::LOAD-EXTERNAL-FUNCTION
>  > Type :POP to abort.

It's not defined in the headers; the Cocoa demo uses EXTERNAL-CALL
to access it.

;;; From "ccl:examples;objc-window.lisp":
(defun enable-foreground ()
  (%stack-block ((psn 8))
    (external-call "_GetCurrentProcess" :address psn)
    (external-call "_CPSEnableForegroundOperation" :address psn)
    (eql 0 (external-call "_SetFrontProcess" :address psn :signed-halfword))))

I believe that it's likely that #_GetCurrentProcess and #_SetFrontProcess -
as well as a better-looking definition of the PSN structure - are probably
defined in Carbon headers.

> Unfortunately I can't find any reference to the function in any header
> file on my system (I guess I can't update the interface database in
> this case).

The last time that I did a Google search, I was (mildly) surprised
at how widely-used CPSEnableForegroundOperation was.  Some people
seem to have reverse-engineered it and concluded that it takes
additional mysterious arguments besides a PSN; I don't believe this
to be the case.

Among the applications/frameworks that use it (or did, the last time
that I looked) ar Java and GLUT.  I have no idea why it's a secret,
and suppose that it may disappear/gratuitously change in the future.
(In that latter respect, it's similar to many documented OSX functions.)

> Is there something obvious I'm missing, or something obscure I can try
> (to invoke the function)?

> -Duncan
> _______________________________________________
> Openmcl-devel mailing list
> Openmcl-devel at clozure.com
> http://clozure.com/mailman/listinfo/openmcl-devel

More information about the Openmcl-devel mailing list