how does code works
Rainer Joswig
joswig at lisp.de
Fri Nov 20 21:39:02 UTC 2020
The application frame has a slot OWN-WINDOW-P . This should control whether the reset clock UI uses its own dialog window for resetting the clock values.
if one uses the command :RESET CLOCK 1, then the reset-clock-1 function gets called.
It gets called with keyword arg :OW and its value is the value of the slot value of the application frame.
Inside the function RESET-CLOCK-1 there is use of the macro CLIM:ACCEPTING-VALUES.
The value of the variable OW is used as a value for the keyword option :OWN-WINDOW.
At runtime this macro then will either
:own-window nil -> create the UI for resetting the clock inline
or
:own-window t -> create a new window dialog for resetting the clock
It's a good idea to check the documentation of the used CLIM functions and CLIM macros in a CLIM reference.
> Am 20.11.2020 um 01:19 schrieb igor denisov <saufesma at gmail.com>:
>
> There are places marked with question marks where I do not understand
> what is going on. Can you explain them?
>
> (in-package :common-lisp-user)
> (defpackage :first-app
> (:use :clim :clim-lisp)
> (:export first-app))
> (in-package :first-app)
>
> (defun av-test-display-screen (frame pane)
> (declare (ignore frame))
> (with-text-size (pane :large)
> (fresh-line pane)
> (present '(com-reset-clock-1) 'command :stream pane)
> (fresh-line pane)))
>
> (define-application-frame av-test ()
> ((own-window-p :initform nil)) ;; These slots will typically hold
> ;; any per-instance frame state.
>
> (:menu-bar t)
> (:panes
> (screen :application
> :display-time t
> :display-function #'av-test-display-screen
> :text-style (make-text-style :sans-serif :roman :normal))
> (interactor :interactor :min-width 600)
> (doc :pointer-documentation))
> (:layouts
> (defaults
> (vertically ()
> screen
> interactor
> doc))))
>
> ;; default-frame-top-level will also establish a simple restart
> ;; for abort, and bind the standard stream variables. *query-io* will be bound
> ;; to the value returned by frame-query-io
> (defun reset-clock-1 (&key (stream *query-io*) (ow t))
> ;; ^^^ ^^^ ^ ^
> ;; keyword-name var k-n v
> (multiple-value-bind (second minute hour day month)
> (decode-universal-time (get-universal-time))
> (declare (ignore second)) ;; self explanatory, var second is not used
> ;; anywhere
> (restart-case
> ;; restartable-form
> (progn
> ;; For instance, an accepting-values whose fields consist of
> ;; gadgets may appear in an ordinary CLIM
> ;; stream pane.
> ;; For example, accepting-values dialogs can be implemented by
> ;; using an encapsulating stream that tailors calls to accept and
> ;; prompt-for-accept in such a way that the output is captured and
> ;; formatted into a dialog that contains prompts and fields
> ;; that can be clicked on and modified by the user.
>
> ;; (For example, the behavior of accepting-values can be implemented
> ;; by creating a special class of stream that turns calls to
> ;; accept into fields of a dialog.) ????????????? HOW TO???
>
> ;; accepting-values (&optional stream &key own-window exit-boxes
> ;; initially-select-query-identifier modify-initial-query
> ;; resynchronize-every-pass resize-frame align-prompts label
> ;; scroll-bars x-position y-position width height command-table
> ;; frame-class) &body body [Macro]
>
> (clim:accepting-values (stream :own-window ow)
> ;; (accepting-values (stream :own-window ow)
> ;; same as?????
> ;; (accepting-values
> ;; (&optional stream
> ;; &key own-window
> ;; what is ow) ??????????
> (format stream "Enter the time~%")
> (setq month (clim:accept 'integer :stream stream
> :default month :prompt "Month"))
> (terpri stream)
> (setq day (clim:accept 'integer :stream stream
> :default day :prompt "Day"))
> (terpri stream)
> (setq hour (clim:accept 'integer :stream stream
> :default hour :prompt "Hour"))
> (terpri stream)
> (setq minute (clim:accept 'integer :stream stream
> :default minute :prompt "Minute")))
> ;; This could be code to reset the time, but instead
> ;; we’re just printing it out
> (format nil "New values: Month: ~D, Day: ~D, Time: ~D:~2,'0D."
> month day hour minute))
> ;; case-name is abort, it names this restart.
> (abort () (format nil "Time not set")))))
>
> (define-av-test-command (com-reset-clock-1 :name t :menu nil) ()
> (with-slots (own-window-p) clim:*application-frame*
> (format t "Result: ~S~%" (multiple-value-list
> ;; (defun reset-clock-1
> ;; (&key (stream *query-io*) (ow t)) ...)
> (reset-clock-1 :ow own-window-p))))
> (finish-output *standard-output*)) ;; ^ ^
> ;; |
> av-test slot
> ;; no idea???
> (defun first-app ()
> (run-frame-top-level (make-application-frame 'av-test)))
>
> Regards,
> Igor.
More information about the mcclim-devel
mailing list