[Openmcl-devel] Disabling the listener in when you build an applicaiton

Gary Byers gb at clozure.com
Sun Aug 29 02:01:03 PDT 2010


A listener pops up on startup (and, on OSX, when the application is
activated when no other windows are present) in the IDE because the
IDE is a document-based application and document-based applications
are supposed to create a new document in those situations.  (There's
a little bit of an argument for creating a new editor window in those
cases, but the argument for creating a listener seems to be stronger.)

There isn't an explicit option to BUILD-APPLICATION that suppresses
this behavior, just as there aren't thousands of explicit options
to control the thousands of ways that an application's behavior might
differ from the IDE's.

BUILD-APPLICATION does provide options that let you specify this; some
of that's done declaratively (in the info-plist) and some of it needs
to be done procedurally (by defining classes and methods on those classes
that implement application-specific behavior.)

A lot of a Cocoa application's "application-specific behavior" is implemented
by the global (NS)Application object's delegate; it should be easier than
it is to use BUILD-APPLICATION or some similar tool to arrange that an instance
of some specified, user-defined class will be instantiated and made to be the
application's delegate on startup.  You currently have to jump through some
hoops and ... um, mess with some low-level code in order to do this:

;;; For no apparent reason, the value of GUI::*DEFAULT-NS-APPLICATION-PROXY-CLASS-NAME*
;;; is initialized every time that the IDE starts up.  Its value is just a lisp
;;; string (the ObjC class name of the application delegate's class), and it should
;;; be possible/easy to override the default.

(setq ccl::*lisp-system-pointer-functions*
       (delete 'GUI::*DEFAULT-NS-APPLICATION-PROXY-CLASS-NAME*
               ccl::*lisp-system-pointer-functions*
               :key #'ccl::function-name))

If it were the case that you wanted your application to behave just like the
IDE except for this listener-creation behavior, you could then do:

(defclass my-lisp-application-delegate (gui::lisp-application-delegate)
   ()
   (:metaclass ns:+ns-object))

(setq GUI::*DEFAULT-NS-APPLICATION-PROXY-CLASS-NAME* "MyLispApplicationDelegate")

And, depending on what behavior you want, you could either tell the Cocoa 
runtime that this business of opening untitled documents on startup doesn't
really apply to you:

(objc:defmethod (#/applicationShouldOpenUntitledFile: #>BOOL)
     ((self my-lisp-application-delegate) app)
   (declare (ignore app))
   nil)

or override requests to open a document on startup/reactivation:

(objc:defmethod (#/applicationOpenUntitledFile: #>BOOL)
     ((self my-lisp-application-delegate) app)
     (maybe-open-something app)
     (if (opened-something)
       t
       nil))

I suspect that this isn't the only thing that you'd want to customize.
(the "about" box, the "bundle identifier" - used to name preference
files, among other things -, the types of files/documents your application
manipulates and how it does so, application/document icons, other behaviors.)
BUILD-APPLICATION helps a little in dealing with this.  It could certainly
help more than it does, but I don't think that application generation is
ever likely to be a matter of picking the right combination of options or
keyword arguments from some sort of menu.





On Fri, 27 Aug 2010, Michael Minerva wrote:

> I am trying to create an end user mode and I cannot find anywhere in the documentation for build-applicaiton where you can tell the listener to not pop up.  Is there anyway to do this without hacking around with low level ccl methods?
>
> -Mike
> _______________________________________________
> Openmcl-devel mailing list
> Openmcl-devel at clozure.com
> http://clozure.com/mailman/listinfo/openmcl-devel
>
>



More information about the Openmcl-devel mailing list