Frank Goenninger wrote:
Another question:
Am 02.04.2006 um 06:12 schrieb Ken Tilton:
Goenninger, Frank wrote:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512
Hi Kenny and all others:
I do have the following mini app now:
- -x-x-x-x-x-
(defmodel psu-rc-app (window) () (:default-initargs :id :psu-rc-app-w :title$ "System Power Supply Remote Control (Version A.01.00)" :kids (c? (the-kids (app-menubar)))))
Why does the title not get set via this default-initargs statement ?
This is the same story: I just have not done anything yet to handle the window class itself.
Background: If you expand any of the (deftk <widget>...) forms (actually, I strongly recommend you do that and stare at /all/ the varieties of code) you will see they expand into quite a bit of code, including a (defobserver <config parameter> ...) for every slot/tk config parameter. The way Celtk (and Cells-Gtk) work is that CLOS classes are defined for every TK widget type. A CLOS slot is defined for every tk config parameter. So with widgets you just set the corresponding CLOS instance slot and a defobserver sends that to Tk via: "<widget> configure -<config param name> <value from CLOS slot>".
I just need to do for the window class what I did with all the widgets and canvas items (the other job deftk handles). What title$ needs is:
(defobserver title$ ((self window)) (tk-format '(:configure "title") "wm title . ~s" (or new-value "Untitled")))
As I look at the other "wm..." commands I can see I first need to add some slots to the window class and then for each a defobserver to shoot the value across to Tk on any change.
[Side note: if you track down the mechanism by which make-instance leads to a corresponding TK widget creation, you will find some code that sweeps throug all the slots populated at make-instance time and includes thos config options in the widget creation. Which is why the generated defobservers check for old-value-boundp; the first time the observer gets invoked (the only time old-value-boundp is nil) is during make-instance, and the observer need not do anything since make-instance (eventually) gets the configs across in the widget creation command.
And another one:
I see there is the title$ slot of a window. How do I setf this correctly ? The following does not work:
(setf (title$ (fm^ :psi-rc-app-w)) "my new title")
It (of course) emits an error that title$ is not a valid function - yes, no, ahem, what? why?
I am not sure I have the same code you have, since I have already changed that slot's initform thus:
(title$ :initarg :title$ :accessor title$ :initform (c? (string-capitalize (class-name (class-of self)))))
So your error could be for two reasons. Either I originally coded it thus
(title$ :reader title$....)
thinking the title$ would never change, which is nonsense because a doc window starts out "Untitled" and then that changes when they save. Anyway, if I do not tell CLOS to create a writer it will not do so. Simple. But I doubt I specified just "reader". More likely (because even i can see it on the current code base) title$ is not exported and you are playing around in celtk-user, as I did deliberately to find out which symbols need to be exported.
So just add title$ to the symbols exported from the defpackage :celtk form.
Thanks for some help here.,
The greater help I can offer is what I do when I cannot believe my eyes on an error: (apropos "title$"), though we both use AllegrroCL so we get to use the groovy Apropos dialog. That not only shows you if a symbol is exported, it will show you if there is a setf as well as a reader. In a case like yours where you have already compiled code and it has failed, you will see the symbol title$ in both the celtk and celtk-user packages. That is a tip-off that the celtk symbol was not exported, because had it been the compiler would not have interned a new symbol in celtk-user when it got to the reference to title$.
kt