Update of /project/beirc/cvsroot/beirc In directory clnet:/tmp/cvs-serv18310
Modified Files: application.lisp presentations.lisp Log Message: Catch bad input on the interactor and present it in a way that allows re-editing.
Works in mcclim only, sorry.
--- /project/beirc/cvsroot/beirc/application.lisp 2006/04/20 02:23:56 1.78 +++ /project/beirc/cvsroot/beirc/application.lisp 2006/04/20 06:39:27 1.79 @@ -444,6 +444,11 @@ (define-window-switcher com-window-next (:next :control) 1 (constantly t)) (define-window-switcher com-window-previous (:prior :control) -1 (constantly t))))
+(define-beirc-command (com-insert-input :name t) ((input 'bad-input)) + (setf (incomplete-input (current-receiver *application-frame*)) + (concatenate 'string (incomplete-input (current-receiver *application-frame*)) + input))) + (define-beirc-command (com-close :name t) ((receivers '(sequence receiver) :prompt "tab" :default (list (current-receiver *application-frame*)))) (dolist (receiver receivers) (let* ((connection (connection receiver)) @@ -703,6 +708,16 @@ (beep)) #+sbcl (simple-error (e) (format t "~a" e))))
+(define-presentation-to-command-translator incomplete-input-to-input-translator + (bad-input com-insert-input beirc + :menu nil + :gesture :select + :documentation "Append this to the input line" + :pointer-documentation "Append this to the input line" + :priority 10) + (object) + (list object)) + (define-presentation-to-command-translator nickname-to-ignore-translator (nickname com-ignore beirc :menu t @@ -969,7 +984,8 @@ (with-output-to-string (s) (loop for elt across buffer if (characterp elt) - do (write-char elt s))))))) + do (write-char elt s)))) + (incomplete-input (current-receiver frame)))))
(define-condition invoked-command-by-clicking () () @@ -1013,48 +1029,69 @@ (call-next-method))
(defmethod read-frame-command ((frame beirc) &key (stream *standard-input*)) - (unwind-protect - (clim:with-input-editing (stream) - (when (and (current-receiver frame) (incomplete-input (current-receiver frame))) - (replace-input stream (incomplete-input (current-receiver frame)) :rescan t)) - (with-input-context ('command) (object) - (with-command-table-keystrokes (*accelerator-gestures* (frame-command-table frame)) - (catch 'keystroke-command - (let ((force-restore-input-state nil)) - (labels ((reset-saved-input () - (when (current-receiver frame) - (setf (incomplete-input (current-receiver frame)) "")))) - (handler-bind ((accelerator-gesture - (lambda (gesture) - (save-input-line stream frame) - (throw 'keystroke-command (lookup-keystroke-command-item - (accelerator-gesture-event gesture) - (frame-command-table frame))))) - (abort-gesture - (lambda (gesture) - (declare (ignore gesture)) - (reset-saved-input) - (setf force-restore-input-state nil))) - (invoked-command-by-clicking - (lambda (cond) - (declare (ignore cond)) - (save-input-line stream frame) - (setf force-restore-input-state t) - (invoke-restart 'acknowledged)))) - (let ((c (clim:read-gesture :stream stream :peek-p t))) - (multiple-value-prog1 - (cond ((eql c #/) - (clim:read-gesture :stream stream) - (accept 'command :stream stream :prompt nil)) - (t - (list 'com-say (accept 'mumble :history 'mumble :prompt nil :stream stream)))) - (if force-restore-input-state - (setf force-restore-input-state nil) - (reset-saved-input))))))))) - (command - (save-input-line stream frame) - object))) - (window-clear stream))) + (let ((bad-input nil)) + (unwind-protect + (clim:with-input-editing (stream) + (when (and (current-receiver frame) (incomplete-input (current-receiver frame))) + (replace-input stream (incomplete-input (current-receiver frame)) :rescan t)) + (with-input-context ('command) (object) + (with-command-table-keystrokes (*accelerator-gestures* (frame-command-table frame)) + (catch 'keystroke-command + (let ((force-restore-input-state nil)) + (labels ((reset-saved-input () + (when (current-receiver frame) + (setf (incomplete-input (current-receiver frame)) "")))) + (handler-bind ((accelerator-gesture + (lambda (gesture) + (save-input-line stream frame) + (throw 'keystroke-command (lookup-keystroke-command-item + (accelerator-gesture-event gesture) + (frame-command-table frame))))) + (abort-gesture + (lambda (gesture) + (declare (ignore gesture)) + (reset-saved-input) + (setf force-restore-input-state nil))) + (invoked-command-by-clicking + (lambda (cond) + (declare (ignore cond)) + (save-input-line stream frame) + (setf force-restore-input-state t) + (invoke-restart 'acknowledged)))) + (let ((c (clim:read-gesture :stream stream :peek-p t))) + (multiple-value-prog1 + (cond ((eql c #/) + (handler-case + (progn + (clim:read-gesture :stream stream) + (accept 'command :stream stream :prompt nil)) + (simple-completion-error (c) + #+mcclim + (let ((preliminary-line (save-input-line stream frame))) + (setf (incomplete-input (current-receiver frame)) + (subseq preliminary-line 0 + (search (climi::completion-error-input-so-far c) + preliminary-line)) + bad-input (subseq preliminary-line + (search (climi::completion-error-input-so-far c) + preliminary-line)) + force-restore-input-state t)) + (beep) + nil))) + (t + (list 'com-say (accept 'mumble :history 'mumble :prompt nil :stream stream)))) + (if force-restore-input-state + (setf force-restore-input-state nil) + (reset-saved-input))))))))) + (command + (save-input-line stream frame) + object))) + (window-clear stream) + (when bad-input + (format stream "Bad input "") + (with-drawing-options (stream :ink +red3+) + (present bad-input 'bad-input :stream stream)) + (format stream "".")))))
(defun irc-event-loop (frame connection) (let ((*application-frame* frame)) --- /project/beirc/cvsroot/beirc/presentations.lisp 2006/03/22 00:31:14 1.13 +++ /project/beirc/cvsroot/beirc/presentations.lisp 2006/04/20 06:39:27 1.14 @@ -8,6 +8,8 @@ (define-presentation-type channel () :inherit-from 'string) (define-presentation-type hostmask () :inherit-from 'string)
+(define-presentation-type bad-input () :inherit-from 'string) + (defun hash-alist (hashtable &aux res) (maphash (lambda (k v) (push (cons k v) res)) hashtable) res)