In addition to gadget panes, CLIM allows gadgets to be used inside of CLIM stream panes. For instance, an accepting-values whose fields consist of gadgets may appear in an ordinary CLIM stream pane. [annotate]
Note that many of the functions in the output record protocol must correctly manage the case where there are gadgets contained within output records. For example, (setf* output-record-position) may need to notify the host window system that the toolkit object representing the gadget has moved, window-clear needs to deactive any gadgets, and so forth. [annotate]
The instantiable class the represents an output record class that contains a gadget. This is a subclass of output-record. [annotate] |
Invokes body to create a gadget, and then creates a gadget output record that contains the gadget and install's it into the output history of the output recording stream stream. The returned value of body must be the gadget. [annotate] The options in options are passed as initargs to the call to invoke-with-new-output-record that is used to create the gadget output record. [annotate] The stream argument is not evaluated, and must be a symbol that is bound to an output recording stream. If stream is t, *standard-output* is used. body may have zero or more declarations as its first forms. [annotate] For example, the following could be used to create an output record containing a radio box that itself contains several toggle buttons: [annotate]
(with-output-as-gadget (stream)
(let* ((radio-box
(make-pane 'radio-box
:client stream :id 'radio-box)))
(dolist (item sequence)
(make-pane 'toggle-button
:label (princ-to-string (item-name item))
:value (item-value item)
:id item :parent radio-box))
radio-box))
A more complex (and somewhat contrived) example of a push button that calls back into the presentation type system to execute a command might be as follows: [annotate]
(with-output-as-gadget (stream)
(make-pane 'push-button
:label "Click here to exit"
:activate-callback
#'(lambda (button)
(declare (ignore button))
(throw-highlighted-presentation
(make-instance 'standard-presentation
:object `(com-exit ,*application-frame*)
:type 'command)
*input-context*
(make-instance 'pointer-button-press-event
:sheet (sheet-parent button)
:x 0 :y 0
:modifiers 0
:button +pointer-left-button+)))))
|