Update of /project/cells-gtk/cvsroot/public_html
In directory common-lisp.net:/tmp/cvs-serv17298/public_html
Modified Files:
faq.html
Log Message:
New questions and answers.
Date: Sat Oct 8 17:03:29 2005
Author: pdenno
Index: public_html/faq.html
diff -u public_html/faq.html:1.10 public_html/faq.html:1.11
--- public_html/faq.html:1.10 Mon Oct 3 16:43:46 2005
+++ public_html/faq.html Sat Oct 8 17:03:29 2005
@@ -36,6 +36,7 @@
<li><a href="#q6">What GTK Widgets are implemented in cells-gtk?</a></li>
<li><a href="#q7">Do I have to use cells?</a></li>
<li><a href="#q8">What is libcellsgtk.so about?</a></li>
+ <li><a href="#q8.4">What is in libcellsgtk.so?</a></li>
<li><a href="#q8.5">What is the difference between using c-input (AKA c-in) and c-formula (AKA c?) in a
slot's :initform?</a></li>
<li><a href="#q9">Why do I need :owner here? It looks like c? would bind self to the mk-whatever
@@ -46,7 +47,7 @@
<li><a href="#q12">Changing a cell value causes dependencies to fire, but what is considered a change?</li>
<li><a href="#q13">Can I keep a window around for redisplay after using the window border
'delete' button to delete it?</a></li>
-
+ <li><a href="#q14">Can I use streams with a TextView widget?</a></li>
</ul>
<p/>
@@ -205,17 +206,30 @@
the libgtk.so you are using.
<p/>
+<strong id="q8.4">Q: What is in libcellsgtk.so?</strong><p/>
+<strong>A:</strong>For details look at the source gtk-ffi/gtk-adds.c, but generally:
+<ul>
+ <li>Get a dialog's vbox (so that you can add children to it).</li>
+ <li>Get the popup menu of a textview</li>
+ <li>Allocate text iters and tree iters</li>
+ <li>Check whether or not a widget is mapped and visible</li>
+ <li>Get the window of a widget (useful for DrawingArea).</li>
+ <li>Allocate GdkColor objects</li>
+ <li>Set the RGB values of GdkColor objects.</li>
+</ul>
<p/>
<strong id="q8.5">Q: What is the difference between using c-input (AKA c-in) and c-formula (AKA c?) in a slot's
:initform ?</strong><p/>
<strong>A:</strong>The two define different kinds of cells:<br/>
A c-input cell is a cell whose value may be set through explicit procedural code, using setf on the slot.
+Note: When the cell is referenced by other cells in a cells constraint network, setf-ing the cell
+causes the values of other cells to be recomputed.
<br/>
A c-formula cell is a cell whose value is obtained through evaluation of a formula.
<br/>
Note that the usual semantics of :initform do not apply when :initform is given by c-formula.
-Instead of just setting the value at initialization, the c-formula (an arbitrary lisp form)
+Instead of just setting the value at initialization, the c-formula (generated from the supplied lisp form)
specifies the dynamic relationship between the slot's value and other aspects of the program state.
<p/>
@@ -266,8 +280,9 @@
<p/>
<strong id="q11">Q: What does this error mean? : "cellular slot FOO of #<BAR 21B555A4> cannot be setf
unless initialized as inputp."</strong><p/>
- <strong>A:</strong> This error is signalled because you tried to setf an invariant slot.
- 'inputp' refers to c-in which should have been used to initialize the slot.
+ <strong>A:</strong>This error is signalled because you tried to setf a c-formula slot.
+ 'inputp' refers to c-input (declaration of an input cell) which should have been used
+ to initialize the slot.
Read the <a href="cgtk-primer.html">cells-gtk primer</a> for more
information.
<p/>
@@ -295,12 +310,66 @@
... and, of course, store the widget somewhere so you can later display it with
(gtk-widget-show-all (widget-id my-pseudo-dialog)).
+<p/>
+
+<strong id="q14">Q:Can I use streams with a TextView widget?</strong><p/>
+ <strong>A:</strong>Sure. Do something like this:
+
+<pre>
+(defmethod initialize-instance :after ((self your-gtk-app) &key)
+ (let ((message-textview [wherever it is]))
+ (setf *message-stream*
+ (make-instance 'pane-stream
+ :buffer (buffer message-textview)
+ :view message-textview))))
+
+(defclass pane-stream (stream:fundamental-character-output-stream)
+ ((view :initarg :view)
+ (buffer :initarg :buffer)
+ (mark :initarg :mark)
+ (offset :initform 0 :accessor offset)))
+
+(defmethod initialize-instance :after ((self pane-stream) &key)
+ (with-slots (buffer mark view) self
+ (let ((b (widget-id buffer))
+ (v (widget-id view)))
+ (with-text-iters (iter)
+ (cgtk:gtk-text-buffer-get-iter-at-offset b iter 0)
+ (setf mark (cgtk:gtk-text-buffer-create-mark b "visibility" iter t)))
+ (cgtk:gtk-text-view-set-wrap-mode v 1) ; optional, of course.
+ (cgtk:gtk-text-view-set-editable v nil)))) ; also optional.
+
+; Some lisps might not need this one. Some might need other methods.
+(defmethod stream:stream-line-column ((s pane-stream)) nil)
+
+(defmethod stream:stream-write-char ((s pane-stream) (c character))
+ (with-slots (view buffer offset mark) s
+ (cgtk:text-buffer-insert-text buffer offset (string c))
+ (incf offset)
+ (let ((buf (widget-id buffer)))
+ (with-text-iters (iter)
+ (cgtk:gtk-text-buffer-get-iter-at-offset buf iter offset)
+ (cgtk:gtk-text-buffer-move-mark buf mark iter)
+ (cgtk:gtk-text-view-scroll-mark-onscreen (cgtk::id view) mark )))))
+
+(defmethod stream:stream-write-string ((s pane-stream) string &optional start end)
+ (with-slots (view buffer offset mark) s
+ (cgtk:text-buffer-insert-text buffer offset string)
+ (incf offset (length string))
+ (let ((buf (widget-id buffer)))
+ (with-text-iters (iter)
+ (cgtk:gtk-text-buffer-get-iter-at-offset buf iter offset)
+ (cgtk:gtk-text-buffer-move-mark buf mark iter)
+ (cgtk:gtk-text-view-scroll-mark-onscreen (widget-id view) mark)))))
+
+</pre>
+
<hr/>
<address><a href="mailto:peter.denno@nist.gov">Peter Denno</a></address>
<!-- Created: Thu Mar 3 18:45:35 EST 2005 -->
<!-- hhmts start -->
-Last modified: Sun Mar 6 18:32:15 EST 2005
+Last modified: 2005-10-08
<!-- hhmts end -->
</div>
</body>