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