On 5/20/06, Frank Goenninger <fgoenninger@prion.de> wrote:

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))))

I took your stuff and whittled it down to:

(defobserver .md-value ((self text-widget))
  (trc "md-value output" self new-value)
  (with-integrity (:client `(:variable ,self))
    (tk-format-now "~a delete 1.0 end" (^path))
    (when (plusp (length new-value))
      (tk-format-now "~a insert end ~s" (^path) new-value))))

That way two (setf (md-value self) "Hi mom") calls do not produce "Hi momHi mom".

I was not sure  the API entry point CLEAR was needed elsewhere. I can see that it would be, though. Really, the more I look at the text widget  the more I think it needs imperative processing by application code that has a clear idea of what it wants to do with all the capabilities of the widget.

I also brought both commands within the same integrity bundle by skipping the tk-format syntactic sugar and open-coding with-integrity. That just saves one enqueue, no big deal. A bigger deal is that the sort done by tk-user-queue-handler was not (until just now <g>) a stable sort, so the delete could have been executed after the insert. Bringing both operations into the single integrity bundle also fixes that.



Now, whenever I do a

$ echo "Heya this is a test" > /Users/frgo/tmp/frgo-test

the text gets displayed in the window.

Isn't great when we get stuff like that working? Is there a universal law: any time the effect produced by your own code surprises you, you are probably onto something good. Programming never gets old.


Fileevent to be put to Celtk CVS in a few days ... watch out.

Thx. I am switching all my code to LLGPL now, btw. I think we settled on that for your stuff, yes?

kt