CLIM mail archive


defining "virtual" fonts

    Date: Wed, 8 May 1991 16:02 EDT
    From: Richard Lamson <>

	Date: Fri, 19 Apr 91 10:25:02 CDT
	From: George Williams <>

	Is there an equivalent in CLIM 1.0 (I don't have CLIM yet, it's on
	order) to the Symbolics function si:define-character-style-families?
	I want to be able to define a font face name and family of styles, and
	have them mapped to "real" fonts (i.e., fonts that are installed on my

    Sure.  Depends exactly what you want to do, of course, as to what the right way
    to do this.  Here are the primitives:

      (clim:define-text-style-mappings device character-set
	    . style-specs)

    will define the various style specifications for the given device.  The syntax is
    pretty straightforward; see the source for GENERA-IMPLEMENTATION.LISP for a
    simple example.

    Of course, to use this you need to get the device object.  Once you have your root
    window, you get it with CLIM::STREAM-DISPLAY-DEVICE-TYPE, but you can't use that
    at load time, in general, because you don't want to create your root window just
    by loading your software, so you probably shouldn't use DEFINE-TEXT-STYLE-MAPPINGS
    (it's mostly for implementors of ports, where the implementor will put a display
    device into a variable, like the Genera si:*b&w-device* or whatever it's called).

    All is not lost, however.  There is a function named CLIM:ADD-TEXT-STYLE-MAPPING,
    which takes a device, a character set, a text style and a font.  This function is
    intended to use at runtime, after you have your streams in hand.  The device is
    gotten as above.  The character set is probably CLIM:*STANDARD-CHARACTER-SET* (if
    you have a non-standard character you can call CLIM::CHAR-CHARACTER-SET-AND-INDEX
    on it, ignoring the second value).  [Character sets are currently ignored, but if
    you want to continue to have working code in the future, you should use them.]
    The text style must be a text style object, not a list.  The result can be a font
    name or a cons (:STYLE . text-style), which is an "indirect style".

    For example, you can do the following to a Genera-based window:

      (let ((device (clim::stream-display-device-type root)))
	  device clim:*standard-character-set*
	  (parse-text-style '(:eurex :italic :huge)) 'fonts:eurex24i)
	  device clim:*standard-character-set*
	  (parse-text-style '(:eurex :italic :normal)) 'fonts:eurex12i))

Since CLIM internally deals in point sizes, it may be better to
specify the size in points rather than as a "logical" size, that is,
'(:EUREX :ITALIC 24) and '(:EUREX :ITALIC 12).

    There is currently a bug in 1.0 for Genera whereby it doesn't load Genera screen
    fonts automatically.  Alternatively, you can load the font yourself and pass in
    the font itself instead of its name.

    The CLX implementation requires that you pass in X font objects rather than names.
    Unfortunately, getting font objects instead of font names requires that you have
    the X display object in hand.  There is no advertised way to get this currently,
    but you can get the CLIM::DISPLAY slot out of the root window.

    I will put the fact that you can't give names instead of font objects to
    ADD-TEXT-STYLE-MAPPING on the bug list, as well as the fact that you have to parse
    text styles before passing them in to ADD-TEXT-STYLE-MAPPING.

I would not call anything having to do with ADD-TEXT-STYLE-MAPPING and
CLIM:DEFINE-TEXT-STYLE-MAPPINGS a bug, nor would I depend on them
continuing to operate the way they do today.  They are not in the CLIM
1.0 documentation precisely because we did not really believe in the
interfaces.  Why not?  Well, those interfaces don't even work for some
display devices, such as PostScript.  What is needed is some careful
thought about what the interfaces should really look like for *all*
display devices.  Only then should the interfaces be advertised in the

With the above warning, what Richard says is accurate and will work for
the present in CLIM 1.0, but may stop working at some point in time.

**Important Note**
One more thing that everyone should be aware of: if you are using
something that is not documented in the CLIM 1.0 documentation, you run
the risk of losing in the future.  Anything not in the documentation
must be considered internal and subject to change without warning, *even
if it exported from the CLIM package*.


Main Index | Thread Index