Update of /project/mcclim/cvsroot/mcclim/Drei In directory clnet:/tmp/cvs-serv9855
Modified Files: input-editor.lisp drei-clim.lisp Log Message: Implemented `add-input-editor-command' as per the Franz User Guide.
--- /project/mcclim/cvsroot/mcclim/Drei/input-editor.lisp 2006/11/08 01:15:33 1.1 +++ /project/mcclim/cvsroot/mcclim/Drei/input-editor.lisp 2006/11/08 13:08:12 1.2 @@ -176,8 +176,7 @@ (with-accessors ((buffer buffer)) (drei-instance stream) (let* ((array (buffer-sequence buffer 0 (size buffer)))) (make-array (length array) - :fill-pointer t - :adjustable t + :fill-pointer (length array) :initial-contents array))))
(defmethod replace-input ((stream drei-input-editing-mixin) (new-input array) @@ -252,6 +251,10 @@ printed-rep) args))))
+(defvar *drei-input-editing-stream* nil + "Used to provide CLIM-specified input-editing-commands with the +input-editing-stream. Bound when executing a command.") + ;;; Have to reexamine how many of the keyword arguments to ;;; stream-read-gesture should really be passed to the encapsulated ;;; stream. @@ -356,7 +359,8 @@ (drei (drei-instance stream)) (*command-processor* drei) (was-directly-processing (directly-processing-p drei)) - (minibuffer (or (minibuffer drei) *minibuffer*))) + (minibuffer (or (minibuffer drei) *minibuffer*)) + (*drei-input-editing-stream* stream)) (with-bound-drei-special-variables (drei ;; If the minibuffer is the ;; stream we are encapsulating @@ -500,19 +504,22 @@ ;;; CLIM spec does not define, or even suggest, any kind of ;;; programmatic access to the data structures of the input-editor for ;;; these function, it is utterly impossible to write portable -;;; input-editor functions using this -;;; facility. `Add-input-editor-command' is implemented like this in -;;; Drei: the specified gesture sequence is bound to the provided -;;; function in the `editor-table' command table, and will have a -;;; standard Drei command environment when invoked. This is sufficient -;;; for only the most trivial of commands, using `define-command' and -;;; `set-key' is a much, much more powerful mechanism, and it allows -;;; far more elegant handling of numeric arguments. +;;; input-editor functions using this facility. Fortunately, Franz's +;;; user guide saves us. An input-editor-command defined via this +;;; facility takes four arguments: the input-editing stream, the input +;;; buffer (ugh!), the gesture used to invoke the command, and the +;;; accumulated numeric argument.
(defun add-input-editor-command (gestures function) "Set up Drei so performing `gestures' will result in the invocation of `function' " - (set-key function 'editor-table gestures)) + (set-key `(,(lambda (numeric-argument) + (funcall function *drei-input-editing-stream* + (stream-input-buffer *drei-input-editing-stream*) + gestures + numeric-argument)) ,*numeric-argument-marker*) + 'exclusive-input-editor-table + gestures))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; --- /project/mcclim/cvsroot/mcclim/Drei/drei-clim.lisp 2006/11/08 01:15:33 1.1 +++ /project/mcclim/cvsroot/mcclim/Drei/drei-clim.lisp 2006/11/08 13:08:12 1.2 @@ -58,20 +58,20 @@ (make-command-table 'self-insert-table :errorp nil)
;;; Command table for concrete editor stuff. -(make-command-table 'editor-table - :errorp nil - :inherit-from '(comment-table - deletion-table - editing-table - case-table - fill-table - indent-table - marking-table - movement-table - search-table - info-table - self-insert-table - keyboard-macro-table)) +(define-syntax-command-table editor-table + :errorp nil + :inherit-from '(comment-table + deletion-table + editing-table + case-table + fill-table + indent-table + marking-table + movement-table + search-table + info-table + self-insert-table + keyboard-macro-table))
;; Command table for commands that are only available when Drei is a ;; pane.