[cells-devel] Re: Celtk: setting the content of a text widget ? Fileevent working !
Frank Goenninger
fgoenninger at prion.de
Sat May 20 20:55:24 UTC 2006
Am 20.05.2006 um 20:16 schrieb Frank Goenninger:
> Am 20.05.2006 um 18:24 schrieb Ken Tilton:
>
>> Frank Goenninger wrote:
>>
>>> Hi Kenny, hi all:
>>>
>>> I do have a text widget which is created using mk-text-widget:
>>>
>>> (mk-text-widget :id :receive-window
>>> :state 'disabled
>>> :md-value (c?n "...")
>>> :height 10
>>> :width 80
>>> :borderwidth 2
>>> :relief 'sunken
>>> :pady 5))
>>>
>>> No matter what I do (even setting :state to 'enabled) I do get
>>> anything printed in the text widget.
>>>
>>> I actually execute a setf on md-value of the text widget:
>>>
>>> (setf (md-value (fm-other :receive-window)) data)
>>>
>>>
>>> Any idea? Thx!
>>
>>
>> Hmmm, looks like I did not finish implementing text widgets.
>
> Yep, meanwhile I recognized that an observer is missing in file
> entry.lisp.
Well, actually I had to do (in file entry.lisp):
;; Method CLEAR: clears a text widget to zero content
(defmethod clear ((self text-widget))
(tk-format `(:variable ,self) "~a delete 1.0 end" (^path)))
;; This observer puts text to the widget if md-value has been set
;; Also takes care of edge cases like initialization time and setting
;; strings of length 0...
(defobserver .md-value ((self text-widget))
(trc "md-value output" self new-value)
(if (or (and (not old-value)
(string= new-value ""))
(not new-value))
(tk-format `(:variable ,self) "~a delete 1.0 end" (^path))
(if (> (length new-value) 0)
(tk-format `(:variable ,self) "~a insert end ~a" (^path) new-
value))))
With this and my fileevent stuff I can now say:
;; Model for a simple terminal output window.
(defmodel fileevent-test-window (window)
()
(:default-initargs
:kids (c? (the-kids
(mk-stack (:packing (c?pack-self))
(mk-label :text "Receive window"
:pady 10)
(mk-text-widget :id :receive-window
;:state 'disabled
:md-value (c-in "")
:height 10
:width 80
:borderwidth 2
:relief 'sunken
:pady 5))
(mk-fileevent :id :fileevent-test
:read-fn 'read-from-pipe
:iostream (open "/Users/frgo/tmp/frgo-test"
:direction :input))))))
;; The method read-from-pipe reads data from a pipe generated by
;; mkfifo /Users/frgo/tmp/frgo-test and puts this as the data of a
;; text widget
(defmethod read-from-pipe ((self tk-fileevent) &optional
(operation :read))
(declare (ignorable operation))
(let ((stream (^iostream)))
(let ((data (read-line stream nil nil nil)))
(trc "*** READ-FROM-PIPE: data = " data)
(when data
(setf (md-value (fm-other :receive-window)) data))))
)
;; Test function that fires up the test case
(defun test-fileevent ()
(trc
"-----------------------------------------------------------------------
------")
(test-window 'fileevent-test-window)
(trc
"-----------------------------------------------------------------------
------")
)
Now, whenever I do a
$ echo "Heya this is a test" > /Users/frgo/tmp/frgo-test
the text gets displayed in the window. Of course there's other uses
for this:
You also can open a socket and send application commands to the
application. The read-from-pipe function would then be a little
interpreter kicking of actions in the application...
For me I put the reading function to listen to a RS232C port that is
connected to an AVR-based microcontroller. The controller send status
information and voltage and current values from a power supply to be
displayed as info by my application...
Fileevent to be put to Celtk CVS in a few days ... watch out.
Frank
More information about the cells-devel
mailing list