An
interactive-pane
is an editor with a process reading and processing input, and that collects any output into itself. The class listener-pane is built upon this, and adds functionality for handling Lisp forms.
An
interactive-pane
contains its own GUI stream. The
top-level-function
is called once, when the
interactive pane is created: it needs to repeatedly take input from the GUI stream and write output to it.
The first argument to top-level-function is the interface containing the interactive pane. The second argument is the interactive pane itself. The third argument is the GUI stream. The default for top-level-function is a function which runs a Lisp listener top-loop.
This class was named
interactive-stream
in LispWorks 3.2 but has been renamed to avoid confusion (this class is not a stream but a pane that contains a stream). The class
interactive-stream
and its accessors
interactive-stream-top-level-function
and
interactive-stream-stream
have been kept for compatibility but may be dropped in future versions of LispWorks.
This example assumes there is just one line of output from each command sent to the pipe
(capi:contain
(make-instance
'capi:interactive-pane
:top-level-function
#'(lambda (interface pane stream)
(declare (ignore interface pane))
(with-open-stream (s (sys:open-pipe
'("/usr/local/bin/bash")
:direction :io))
(loop
(progn
(format stream "primitive xterm$ ")
(let ((input (read-line stream nil nil)))
(if input
(progn
(write-line input s)
(force-output s))
(return))))
(let ((output (read-line s nil nil)))
(if output
(progn
(write-line output stream)
(force-output stream))
(return)))))))
:best-height 300
:best-width 300)