Update of /project/mcclim/cvsroot/mcclim
In directory clnet:/tmp/cvs-serv5802
Modified Files:
frames.lisp
Log Message:
Fix command menus in frames with no interactor (or application-pane?)
by making read-frame-command handle the case :stream nil by calling
the simple event loop. Changed the default top level to call
read-frame-command with a null stream rather than calling the simple
event loop directly.
Previously the command menu would throw a menu-item, but because the
receiving code is in the :around method on read-frame-command (and
thus not executed), the menu selection was ignored.
Metaphorically, the "read a command" operation should be applicable
even when the textual command parser is not invoked.
--- /project/mcclim/cvsroot/mcclim/frames.lisp 2006/05/05 10:24:02 1.119
+++ /project/mcclim/cvsroot/mcclim/frames.lisp 2006/07/01 21:00:31 1.120
@@ -459,11 +459,10 @@
(redisplay-frame-panes frame :force-p first-time)
(setq first-time nil)
(if query-io
- ;; We don't need to turn the cursor on here, as Goatee has its own
- ;; cursor which will appear. In fact, leaving it on causes much
- ;; bit flipping and slows command output somewhat. So, leave it
- ;; off by default, and hope this doesn't violate the spec.
+ ;; For frames with an interactor:
(progn
+ ;; Hide cursor, so we don't need to toggle it during
+ ;; command output.
(setf (cursor-visibility (stream-text-cursor *query-io*))
nil)
(when (and prompt interactorp)
@@ -480,7 +479,9 @@
(execute-frame-command frame command))
(when interactorp
(fresh-line *query-io*))))
- (simple-event-loop)))
+ ;; Frames without an interactor:
+ (let ((command (read-frame-command frame :stream nil)))
+ (when command (execute-frame-command frame command)))))
(abort ()
:report "Return to application command loop"
(if interactorp
@@ -488,7 +489,7 @@
(beep))))))))
(defmethod read-frame-command :around ((frame application-frame)
- &key (stream *standard-input*))
+ &key (stream *standard-input*))
(with-input-context ('menu-item)
(object)
(call-next-method)
@@ -510,7 +511,9 @@
;; If we do things as the spec says, command accelerators will
;; appear to not work, confusing new users.
#+NIL (read-command (frame-command-table frame) :use-keystrokes nil :stream stream)
- (read-command (frame-command-table frame) :use-keystrokes t :stream stream))
+ (if stream
+ (read-command (frame-command-table frame) :use-keystrokes t :stream stream)
+ (simple-event-loop frame)))
(define-event-class execute-command-event (window-manager-event)
((sheet :initarg :sheet :reader event-sheet)
@@ -1297,10 +1300,10 @@
input-context)
(frame-update-pointer-documentation frame input-context stream event))
-(defun simple-event-loop ()
+(defun simple-event-loop (&optional (frame *application-frame*))
"An simple event loop for applications that want all events to be handled by
handle-event methods"
- (let ((queue (frame-event-queue *application-frame*)))
+ (let ((queue (frame-event-queue frame)))
(loop for event = (event-queue-read queue)
;; EVENT-QUEUE-READ in single-process mode calls PROCESS-NEXT-EVENT itself.
do (handle-event (event-sheet event) event))))