Update of /project/cells/cvsroot/Celtk In directory clnet:/tmp/cvs-serv17320
Modified Files: demos.lisp entry.lisp menu.lisp multichoice.lisp run.lisp timer.lisp tk-events.lisp widget.lisp Log Message: create command replacing event generate
--- /project/cells/cvsroot/Celtk/demos.lisp 2006/05/16 21:17:15 1.16 +++ /project/cells/cvsroot/Celtk/demos.lisp 2006/05/17 00:40:55 1.17 @@ -25,11 +25,11 @@
(defun ctk::tk-test () ;; ACL project manager needs a zero-argument function, in project package (test-window - ;; true tester: 'one-button-window + ;;'one-button-window ;; Not so good: 'ltktest-cells-inside ;; 'menu-button-test - ;; 'spinbox-test - 'lotsa-widgets + 'spinbox-test + ;; 'lotsa-widgets ;; Now in Gears project 'gears-demo ))
@@ -40,6 +40,11 @@ (mk-frame-stack :packing (c?pack-self) :kids (c? (the-kids + (mk-menubar + :kids (c? (the-kids + (mk-menu-entry-cascade-ex (:label "File") + (mk-menu-entry-command-ex () "Load" (format t "~&Load pressed")) + (mk-menu-entry-command-ex () "Save" (format t "~&Save pressed")))))) (make-instance 'entry :id :entree :fm-parent *parent* @@ -48,70 +53,19 @@ :fm-parent *parent* :text "read" :on-command (lambda (self) - (trc "entry reads" (ctk::tk-eval-var (path (fm^ :entree))))))))))))) - -#+save -(defmodel one-button-window (window) - () - (:default-initargs - :on-event (lambda (self &rest event-args) - (trc "we got events" self event-args)) - :kids (c? (the-kids - (mk-menubar - :kids (c? (the-kids - (mk-menu-entry-cascade-ex (:label "File") - (mk-menu-entry-command-ex () "Load" (format t "~&Load pressed")) - (mk-menu-entry-command-ex () "Save" (format t "~&Save pressed")))))) - (mk-frame-stack - :packing (c?pack-self) - :kids (c? (the-kids - - ;;; (mk-scrolled-list - ;;; :id :spinpkg-sym-list - ;;; :list-height 6 - ;;; :list-item-keys (c? (loop for sym being the symbols in (find-package "CELTK") - ;;; for n below 5 - ;;; counting sym into symct - ;;; collecting sym into syms - ;;; finally (trc "syms found !!!" symct) - ;;; (return syms))) - ;;; :list-item-factory (lambda (sym) - ;;; (trc "make list item" sym *parent*) - ;;; (make-instance 'listbox-item - ;;; :fm-parent *parent* - ;;; :md-value sym - ;;; :item-text (down$ (symbol-name sym))))) - (mk-text-widget - :id :my-text - :md-value (c?n "hello, world") - :height 3 - :width 25) - (make-instance 'button - :fm-parent *parent* - :text "<<kenny>>" - :on-command (lambda (self) - (trc "button pushed!!!" self))) - ;;; (make-instance 'button - ;;; :fm-parent *parent* - ;;; :text "time now?" - ;;; :on-command (c? (lambda (self) - ;;; (trc "we got callbacks" self)))) + (trc "entry reads" (ctk::tk-eval-var (path (fm^ :entree)))))) (make-instance 'scale :fm-parent *parent* :tk-label "Boots" :on-command (c? (lambda (self value) - (trc "we got scale callbacks" self value)))) + (trc "we got scale callbacks" self (parse-integer value))))) (mk-spinbox :id :spin-pkg :md-value (c-in "cells") ;;(cells::c?n "cells") :tk-values (mapcar 'down$ (sort (mapcar 'package-name (list-all-packages)) - 'string>))) - (make-instance 'entry - :fm-parent *parent* - :md-value (c-in "Boots")) - ))))))) + 'string>))))))))))
(defmodel spinbox-test (window) () @@ -142,7 +96,8 @@ (make-instance 'listbox-item :fm-parent *parent* :md-value sym - :item-text (down$ (symbol-name sym)))))))))) + :item-text (down$ (symbol-name sym))))) + (mk-label :text (c? (selection (fm^ :spinpkg-sym-list)))))))))
(defmodel menu-button-test (window) --- /project/cells/cvsroot/Celtk/entry.lisp 2006/05/16 02:52:22 1.7 +++ /project/cells/cvsroot/Celtk/entry.lisp 2006/05/17 00:40:55 1.8 @@ -65,8 +65,7 @@
(defmethod md-awaken :after ((self entry)) ;; move this to a traces slot on widget (with-integrity (:client `(:trace ,self)) - (tk-format-now "trace add variable ~a write TraceOP" (^path)) - )) + (tk-format-now "trace add variable ~a write TraceOP" (^path))))
;;; /// this next replicates the handling of tk-mirror-variable because ;;; those leverage the COMMAND mechanism, which entry lacks --- /project/cells/cvsroot/Celtk/menu.lisp 2006/05/16 21:17:15 1.14 +++ /project/cells/cvsroot/Celtk/menu.lisp 2006/05/17 00:40:55 1.15 @@ -172,7 +172,7 @@ () (:tk-spec command -command) (:default-initargs - :command (c? (format nil "event generate . <<do-menu-command>> -data ~a" (path-idx self))))) + :command (c? (format nil "do-on-command ~a" (path-idx self)))))
(defmacro mk-menu-entry-command-ex ((&rest menu-command-initargs) lbl callback-body) `(mk-menu-entry-command --- /project/cells/cvsroot/Celtk/multichoice.lisp 2006/05/16 21:17:15 1.7 +++ /project/cells/cvsroot/Celtk/multichoice.lisp 2006/05/17 00:40:55 1.8 @@ -44,10 +44,9 @@ :tk-variable nil ;;(c? (^path)) :xscrollcommand (c-in nil) :yscrollcommand (c-in nil) - :command (c? (format nil "event generate ~a <<do-on-command>> -data" (^path))) :on-command (lambda (self value) ;; (trc "hi scale" self value) - (setf (^md-value) value)))) + (setf (^md-value) (parse-integer value)))))
(defmethod make-tk-instance :after ((self scale)) "Still necessary?" @@ -116,7 +115,7 @@ :id (gentemp "SPN") :textVariable (c? (^path)) :xscrollcommand (c-in nil) - :command (c? (format nil "event generate ~a <<do-on-command>> -data %s" (^path))) + :command (c? (format nil "do-on-command ~a %s" (^path))) :on-command (c? (lambda (self text) (eko ("variable mirror command fired !!!!!!!" text) (setf (^md-value) text)))))) --- /project/cells/cvsroot/Celtk/run.lisp 2006/05/16 02:52:22 1.10 +++ /project/cells/cvsroot/Celtk/run.lisp 2006/05/17 00:40:55 1.11 @@ -39,12 +39,13 @@ (tk-app-init *tki*) (tk-togl-init *tki*) (tk-format-now "proc TraceOP {n1 n2 op} {event generate $n1 <<trace>> -data $op}") + (tcl-create-command *tki* "do-on-command" (get-callback 'do-on-command) 42 0)
(with-integrity () (setf *tkw* (make-instance root-class))
(tk-create-event-handler-ex *tkw* 'main-window-proc :virtualEventMask)) - + (tk-format `(:fini) "wm deiconify .") (tk-format-now "bind . <Escape> {destroy .}")
@@ -55,9 +56,6 @@ (when (eq (xevent-type xe) :virtualevent) (bwhen (n$ (xsv name xe)) (case (read-from-string (string-upcase n$)) - (do-menu-command (let ((self (gethash (tcl-get-string (xsv user-data xe)) (dictionary *tkw*)))) - (bwhen (c (^on-command)) - (funcall c self)))) (time-is-up (let ((self (gethash (tcl-get-string (xsv user-data xe)) (dictionary *tkw*)))) (bwhen (c (^on-command)) (funcall c self)))) --- /project/cells/cvsroot/Celtk/timer.lisp 2006/05/16 02:52:22 1.5 +++ /project/cells/cvsroot/Celtk/timer.lisp 2006/05/17 00:40:55 1.6 @@ -52,7 +52,7 @@ (export '(repeat ^repeat)))
(defmodel timer () - ((id :cell nil :initarg :id :accessor id :initform :anon + ((id :cell nil :initarg :id :accessor id :initform (gentemp "AFTER") :documentation "A debugging aid") (tag :cell nil :initarg :tag :accessor tag :initform :anon :documentation "A debugging aid") @@ -99,9 +99,8 @@ (setf (id self) (set-timer self (^delay)))))))))))
(defun set-timer (self time) - (let ((lookup-id (gentemp "AFTER"))) - (setf (gethash lookup-id (dictionary *tkw*)) self) - (tk-eval "after ~a {event generate . <<time-is-up>> -data ~a}" time lookup-id))) + (setf (gethash (id self) (dictionary *tkw*)) self) + (tk-eval "after ~a {do-on-command ~a}" time (id self)))
(defobserver timers ((self tk-object) new-value old-value) (dolist (k (set-difference old-value new-value)) --- /project/cells/cvsroot/Celtk/tk-events.lisp 2006/05/15 05:15:37 1.2 +++ /project/cells/cvsroot/Celtk/tk-events.lisp 2006/05/17 00:40:55 1.3 @@ -8,6 +8,18 @@ (tcl-idle-proc :pointer) (client-data :int))
+(defcfun ("Tcl_CreateCommand" tcl-create-command) :pointer + (interp :pointer) + (cmdName :string) + (proc :pointer) + (client-data :int) + (delete-proc :pointer)) + +(defcfun ("Tcl_SetResult" tcl-set-result) :void + (interp :pointer) + (result :string) + (free-proc :pointer)) + (defcfun ("Tcl_GetString" tcl-get-string) :string (tcl-obj :pointer))
--- /project/cells/cvsroot/Celtk/widget.lisp 2006/05/16 21:17:15 1.7 +++ /project/cells/cvsroot/Celtk/widget.lisp 2006/05/17 00:40:55 1.8 @@ -95,24 +95,21 @@ (defclass commander () () (:default-initargs - :command (c? (format nil "event generate ~a <<do-on-command>>" (^path))))) + :command (c? (format nil "do-on-command ~a" (^path)))))
-(defcallback commander-event-proc :void ((client-data :int)(xe :pointer)) +(defcallback do-on-command :int ((client-data :int)(interp :pointer)(argc :int)(argv :pointer)) (declare (ignore client-data)) - (when (eq (xevent-type xe) :virtualevent) - (bwhen (n$ (xsv name xe)) - (case (read-from-string (string-upcase n$)) - (do-on-command (let ((self (xwin-widget (xsv event-window xe)))) - (bwhen (c (^on-command)) - (let ((d (xsv user-data xe))) - (if (plusp d) - (funcall c self (read-from-string (tcl-get-string d))) - (funcall c self)))))) - (otherwise (trc "commander sees unknown" n$)))))) - -(defmethod make-tk-instance :after ((self commander)) - (with-integrity (:client `(:post-make-tk ,self)) - (tk-create-event-handler-ex self 'commander-event-proc :virtualEventMask))) + (destructuring-bind (path &rest args) + (loop for argn upfrom 1 below argc + collecting (mem-aref argv :string argn)) + (bif (self (gethash path (dictionary *tkw*))) + (bIf (cmd (^on-command)) + (progn (apply cmd self args) + 0) + (progn (tcl-set-result interp (format nil "do-on-command> Target widget ~a has no on-command to run" path) 0) + 1)) + (progn (tcl-set-result interp (format nil "do-on-command> Target widget ~a does not exist" path) 0) + 1))))
(defun widget-menu (self key) (or (find key (^menus) :key 'md-name)