[Openmcl-devel] How to make an alert accessory view be first responder

Ron Garret ron at flownet.com
Tue Feb 16 11:40:03 PST 2010


Cool!  That works!  Thanks!  I didn't realize that "doing layout" meant actually creating the window object.  (This has theological implications: it proves that just because you can't see something doesn't mean it doesn't exist ;-)

(Hm, still has an odd behavior.  The cursor doesn't start blinking until you type something.  Certainly not a show stopper, but kind of weird.)

rg

On Feb 16, 2010, at 11:31 AM, Raffael Cavallaro wrote:

> 
> On Feb 16, 2010, at 1:43 PM, Ron Garret wrote:
> 
>> The problem with trying to do this in the obvious way is that the window doesn't actually exist until #/runModal is called.  But by then it's too late.
> 
> Right you are. Reading the docs, the key is to call #/layout before #/runModal:
> 
> (defun get-string-dialog (msg &optional (default ""))
> (let ((alert (make-instance 'ns:ns-alert))
>       (tf (#/initWithFrame: (make-instance 'ns:ns-text-field)
>                             (ns:make-ns-rect 0 0 400 25))))
>   (#/setStringValue: tf (ccl::%make-nsstring default))
>   (#/setEditable: tf #$YES)
>   (#/setMessageText: alert (ccl::%make-nsstring msg))
>   (#/addButtonWithTitle: alert #@"OK")
>   (#/setAccessoryView: alert tf)
>   (#/layout alert)
>   (#/makeFirstResponder: (#/window alert) tf) 
>   (#/runModal alert) 
>   (CCL::LISP-STRING-FROM-NSSTRING (#/stringValue tf))))
> 
> This ensures that the alert window is actually composed eagerly rather than lazily just prior to display. As long as you call #/layout, then #/makeFirstResponder:, then #/runModal, you get the desired result (at least, it works correctly for me on Clozure CL64 and Clozure CL32.
> 
> warmest regards,
> 
> Ralph
> 
> 
> 
> Raffael Cavallaro
> raffaelcavallaro at me.com
> 
> 
> 
> 
> 




More information about the Openmcl-devel mailing list