User: stephent
Date: 06/04/23 18:11:38
Modified: xemacs/src ChangeLog Makefile.in.in config.h.in console-x.h
emacs.c inline.c objects-x.c symsinit.h
Added: xemacs/lisp font-mgr.el
xemacs/src font-mgr.c font-mgr.h
Removed: xemacs/src xft-fonts.c xft-fonts.h
Log:
Xft/fontconfig refactoring, Part I. <87hd4ks29d.fsf(a)tleepslib.sk.tsukuba.ac.jp>
Revision Changes Path
1.500 +4 -0 XEmacs/xemacs/ChangeLog
Index: ChangeLog
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/ChangeLog,v
retrieving revision 1.499
retrieving revision 1.500
diff -u -p -r1.499 -r1.500
--- ChangeLog 2006/03/31 19:18:51 1.499
+++ ChangeLog 2006/04/23 16:11:16 1.500
@@ -1,3 +1,7 @@
+2006-04-15 Stephen J. Turnbull <stephen(a)xemacs.org>
+
+ * configure.ac: Add stubs for fontconfig configuration.
+
2006-03-31 Stephen J. Turnbull <stephen(a)xemacs.org>
* XEmacs 21.5.26 "endive" is released.
1.41 +11 -0 XEmacs/xemacs/configure.ac
Index: configure.ac
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/configure.ac,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -p -r1.40 -r1.41
--- configure.ac 2006/03/30 18:11:17 1.40
+++ configure.ac 2006/04/23 16:11:17 1.41
@@ -669,6 +669,11 @@ XE_MERGED_ARG([infopath],
[AC_DEFINE(INFOPATH_USER_DEFINED)], [])
dnl
XE_HELP_SUBSECTION([Window-system options])
+dnl Enable when fontconfig support is factored out of Xft.
+dnl XE_MERGED_ARG([fontconfig],
+dnl AS_HELP_STRING([--with-fontconfig],
+dnl [Use fontconfig library to configure fonts.],
+dnl [],[])
dnl if you change defaults, make sure to fix arg 6 of the OPTION_HELP macro.
XE_COMPLEX_ARG([xft],
[XE_COMPLEX_OPTION_HELP_STRING([--with-xft],
@@ -3463,6 +3468,9 @@ extern Bool XRegisterIMInstantiateCallba
[XE_DIE(["Unable to find libfontconfig for --with-xft"])])
AC_CHECK_LIB(Xft, XftFontOpen, XE_PREPEND(-lXft, libs_x),
[XE_DIE(["Unable to find libXft for --with-xft"])])
+ dnl #### detect fontconfig properly!!!!
+ with_fontconfig=yes
+ AC_DEFINE(HAVE_FONTCONFIG)
AC_DEFINE(USE_XFT)
dnl Due to interactions with other libraries, must postpone AC_DEFINE
dnl of USE_XFT_MENUBARS, USE_XFT_TABS, and USE_XFT_GAUGE.
@@ -5976,6 +5984,9 @@ if test "$with_x11" = "yes"; then
fi
if test "$with_wmcommand" != no; then
echo " - Handling WM_COMMAND properly."
+ fi
+ if test "$with_fontconfig" = "yes"; then
+ echo " - Using fontconfig to manage fonts."
fi
if test "$with_xft_emacs" = "yes"; then
echo " - Compiling in support for Xft antialiased fonts (EXPERIMENTAL)."
1.737 +32 -0 XEmacs/xemacs/lisp/ChangeLog
Index: ChangeLog
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/lisp/ChangeLog,v
retrieving revision 1.736
retrieving revision 1.737
diff -u -p -r1.736 -r1.737
--- ChangeLog 2006/04/16 15:54:16 1.736
+++ ChangeLog 2006/04/23 16:11:21 1.737
@@ -1,3 +1,35 @@
+2006-04-24 Stephen J. Turnbull <stephen(a)xemacs.org>
+
+ * dumped-lisp.el (fontconfig): Load only with Xft.
+
+ * x-faces.el (fontconfig): Require only with Xft.
+
+2006-04-16 Stephen J. Turnbull <stephen(a)xemacs.org>
+
+ * font-mgr.el: New file. Provides Lisp emulation of fontconfig.
+
+ * fontconfig.el: Require 'font-mgr.
+
+2006-04-11 Stephen J. Turnbull <stephen(a)xemacs.org>
+
+ * fontconfig.el:
+ Add some comments on proposed generic APIs.
+ Remove some unused and probably broken code.
+ Use `fc-define-property' to define new X11 XLFD standard
+ properties: x11-swidth, x11-adstyle, x11-resx, x11-resy,
+ x11-registry, and x11-encoding.
+ Delete fc-font-name-property-PROPERTY constants.
+ (fc-define-property):
+ Add `fc-pattern-del-PROPERTY'.
+
+ * x-faces.el (x-make-font-bold-xft):
+ (x-make-font-unbold-xft):
+ (x-make-font-italic-xft):
+ (x-make-font-unitalic-xft):
+ (x-find-xft-font-of-size):
+ * x-font-menu.el (x-font-menu-load-font-xft):
+ Use property-specific APIs instead of defconsts for property names.
+
2006-04-16 Aidan Kehoe <kehoea(a)parhasard.net>
* cl.el (incf):
1.58 +1 -1 XEmacs/xemacs/lisp/dumped-lisp.el
Index: dumped-lisp.el
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/lisp/dumped-lisp.el,v
retrieving revision 1.57
retrieving revision 1.58
diff -u -p -r1.57 -r1.58
--- dumped-lisp.el 2005/11/26 11:45:53 1.57
+++ dumped-lisp.el 2006/04/23 16:11:22 1.58
@@ -54,7 +54,7 @@ in dumped-lisp.el and is not itself list
"specifier"
"frame" ; needed by faces
;; #### this should be (featurep 'xft)
- (when (featurep 'x) "fontconfig") ; needed by x-faces
+ (when (featurep 'xft-fonts) "fontconfig") ; needed by x-faces
(when (featurep 'x) "x-faces") ; needed by faces
(when (featurep 'gtk) "gtk-faces")
(when (valid-console-type-p 'mswindows) "msw-faces")
1.3 +98 -81 XEmacs/xemacs/lisp/fontconfig.el
Index: fontconfig.el
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/lisp/fontconfig.el,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -p -r1.2 -r1.3
--- fontconfig.el 2005/11/26 11:45:54 1.2
+++ fontconfig.el 2006/04/23 16:11:22 1.3
@@ -105,11 +105,12 @@
;; constructor function `fc-pattern-create'. #### It might make sense
;; to generalize `make-fc-pattern' by allowing a plist of properties
;; as an optional argument. We also provide accessors
-;; `fc-pattern-get-PROPERTY' and mutators `fc-pattern-add-PROPERTY'
-;; for each of the standard properties used by Xft, which overlap
-;; substantially with the properties defined by X11. #### We probably
-;; should provide `fc-pattern-delete-PROPERTY', too.
+;; `fc-pattern-get-PROPERTY' and mutators `fc-pattern-add-PROPERTY' and
+;; `fc-pattern-del-PROPERTY' for each of the standard properties used by
+;; Xft, which overlap substantially with the properties defined by X11.
+(require 'font-mgr)
+
(defalias 'make-fc-pattern 'fc-pattern-create)
(defmacro fc-define-property (property type docfrag &optional obsolete-p)
@@ -117,10 +118,10 @@
A font property is a key in a fontconfig pattern and is associated with
one or more values of a given type. This macro creates wrappers around
-`fc-pattern-get' and `fc-pattern-add' for PROPERTY. Wrappers are
-preferred to use of primitives with a string as the OBJECT argument because
-typos in wrappers result in \"not fboundp\" errors, while a typo in a string
-produces a silent null return.
+`fc-pattern-get', `fc-pattern-add', and `fc-pattern-del' for PROPERTY.
+\(Wrappers are preferred to use of primitives with a string as the OBJECT
+argument because typos in wrappers result in \"not fboundp\" errors, while
+a typo in a string produces a silent null return.)
PROPERTY is a string.
TYPE is a symbol indicating the type of the property value. It is used only
@@ -140,7 +141,10 @@ different properties as being linked to
A mutator `fc-pattern-add-PROPERTY' which takes a fontconfig pattern object
and a value as arguments, and adds the value to the property with the next
id. The type of the value is recognized by `fc-pattern-add', and the id
-is chosen by the fontconfig implementation."
+is chosen by the fontconfig implementation.
+
+A mutator `fc-pattern-del-PROPERTY' which takes a fontconfig pattern object,
+and deletes all values of that property from the pattern."
`(progn
(defsubst ,(intern (concat "fc-pattern-get-" property))
@@ -179,6 +183,20 @@ See `fc-pattern-add' for documentation o
"")
type)
(fc-pattern-add pattern ,property value))
+
+ (defsubst ,(intern (concat "fc-pattern-del-" property))
+ (pattern)
+ ,(format "\
+Delete all values of the %s property of fontconfig pattern PATTERN.%s
+
+This function is a convenience wrapper for `fc-pattern-del'.
+See `fc-pattern-del' for documentation of patterns and error returns."
+ property
+ (if obsolete-p "
+\(Obsolete, only available on systems using Xft version 1.)"
+ "")
+ type)
+ (fc-pattern-del pattern ,property))
,property))
;; define the standard properties for Xft v.2 here
@@ -202,67 +220,25 @@ See `fc-pattern-add' for documentation o
(fc-define-property "weight" integer "the weight")
(fc-define-property "xlfd" string "the XLFD (full name in X11)")
-;; Xft v.1 properties (marked as obsolete)
+;; Xft v.1 properties (generally marked as obsolete)
+;; had different semantics from XLFD "encoding"
(fc-define-property "encoding" string "the encoding" t)
-(fc-define-property "charwidth" integer "the average character width" t)
+;; also used by X11 XLFDs, so not obsolete
+(fc-define-property "charwidth" integer "the average character width")
(fc-define-property "charheight" integer "the average character height" t)
(fc-define-property "core" boolean "represents a core font" t)
(fc-define-property "render" boolean "represents a render (Xft) font" t)
+;; X11 XLFD and other standard properties
+(fc-define-property "x11-swidth" string "the 'set' width")
+(fc-define-property "x11-adstyle" string "any additional style")
+(fc-define-property "x11-resx" string "the horizontal design resolution")
+(fc-define-property "x11-resy" string "the vertical design resolution")
+;; use "charwidth" instead of "x11-avgwidth"
+(fc-define-property "x11-registry" string "the encoding registry")
+;; "x11-encoding" has different semantics from Xft v.1 "encoding"
+(fc-define-property "x11-encoding" string "the encoding index")
-(defconst fc-font-name-property-family "family")
-(defconst fc-font-name-property-style "style")
-(defconst fc-font-name-property-slant "slant")
-(defconst fc-font-name-property-weight "weight")
-(defconst fc-font-name-property-size "size")
-(defconst fc-font-name-property-pixelsize "pixelsize")
-(defconst fc-font-name-property-spacing "spacing")
-(defconst fc-font-name-property-foundry "foundry")
-(defconst fc-font-name-property-antialias "antialias")
-(defconst fc-font-name-property-xlfd "xlfd")
-(defconst fc-font-name-property-file "file")
-(defconst fc-font-name-property-index "index")
-(defconst fc-font-name-property-rasterizer "rasterizer")
-(defconst fc-font-name-property-outline "outline")
-(defconst fc-font-name-property-scalable "scalable")
-(defconst fc-font-name-property-rgba "rgba")
-(defconst fc-font-name-property-minspace "minspace")
-(defconst fc-font-name-property-dpi "dpi")
-
-;; Xft version 1 only
-;;(defconst fc-font-name-property-encoding "encoding")
-;;(defconst fc-font-name-property-charwidth "charwidth")
-;;(defconst fc-font-name-property-charheight "charheight")
-;;(defconst fc-font-name-property-core "core")
-;;(defconst fc-font-name-property-render "render")
-
-
-(defconst fc-pattern-selector-mapping
- `((,fc-font-name-property-family . fc-pattern-get-family)
- (,fc-font-name-property-style . fc-pattern-get-style)
- (,fc-font-name-property-slant . fc-pattern-get-slant)
- (,fc-font-name-property-weight . fc-pattern-get-weight)
- (,fc-font-name-property-size . fc-pattern-get-size)
- (,fc-font-name-property-pixelsize . fc-pattern-get-pixelsize)
- (,fc-font-name-property-spacing . fc-pattern-get-spacing)
- (,fc-font-name-property-foundry . fc-pattern-get-foundry)
- (,fc-font-name-property-antialias . fc-pattern-get-antialias)
- (,fc-font-name-property-xlfd . fc-pattern-get-xlfd)
- (,fc-font-name-property-file . fc-pattern-get-file)
- (,fc-font-name-property-index . fc-pattern-get-index)
- (,fc-font-name-property-rasterizer . fc-pattern-get-rasterizer)
- (,fc-font-name-property-outline . fc-pattern-get-outline)
- (,fc-font-name-property-scalable . fc-pattern-get-scalable)
- (,fc-font-name-property-rgba . fc-pattern-get-rgba)
- (,fc-font-name-property-minspace . fc-pattern-get-minspace)
- (,fc-font-name-property-dpi . fc-pattern-get-dpi)
- ;; Xft version 1 only
- ;; (,fc-font-name-property-encoding . fc-pattern-get-encoding)
- ;; (,fc-font-name-property-charwidth . fc-pattern-get-char-width)
- ;; (,fc-font-name-property-charheight . fc-pattern-get-char-height)
- ;; (,fc-font-name-property-core . fc-pattern-get-core)
- ;; (,fc-font-name-property-render . fc-pattern-get-render)
- ))
(defvar fc-find-available-font-families-fc-fonts-only t
"If `fc-find-available-font-families-fc-fonts-only' is set to `t',
@@ -415,7 +391,33 @@ A new object is allocated and returned."
;;
;; fc-name-parse
;; fc-name-unparse
-;; xft-name-unparse
+;; xft-name-unparse (nonfunctional and presumably obsolete)
+;;
+;; For interfacing with various font rendering systems, we need to be able
+;; to convert the fontconfig patterns to names, and vice versa. The high-
+;; level API is
+;;
+;; font-default-name-syntax
+;; variable naming the default naming syntax
+;; maybe this could be a list to try in order?
+;;
+;; font-name-to-pattern NAME &optional SYNTAX
+;; returns a fontconfig pattern, or nil if the name could not be parsed
+;; NAME is a string
+;; SYNTAX is a name syntax symbol
+;;
+;; font-pattern-to-name PATTERN &optional SYNTAX
+;; returns a string
+;; PATTERN is a fontconfig pattern
+;; SYNTAX is a name syntax symbol
+;;
+;; A "name syntax symbol" is a symbol for a font naming syntax. This may be
+;; a rendering engine syntax or a font manager syntax. Initially, 'x and
+;; 'fontconfig will be supported. Patterns may be unambiguous (one value for
+;; each specified property) or ambiguous (multiple values are allowed for
+;; some specified properties). `font-name-to-pattern' should be unambiguous,
+;; but `font-pattern-to-name' may not be an exact conversion for some
+;; syntaxes, especially for ambiguous patterns.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
@@ -429,6 +431,29 @@ A new object is allocated and returned."
;; fc-list-fonts-pattern-objects
;; fc-font-sort
;; fc-font-real-pattern
+;;
+;; The high-level API is
+;;
+;; font-list &optional PATTERN DEVICE ATTRIBUTE-LIST OPTION-LIST
+;; returns a list of patterns matching pattern
+;; PATTERN is an ambiguous pattern, defaulting to the empty pattern
+;; DEVICE is the display device to query (default: selected device)
+;; ATTRIBUTE-LIST is a list of font attributes to restrict the patterns
+;; in the returned list to; other attributes will not be present in
+;; the patterns, and duplicates will be removed after pruning unwanted
+;; attributes; ATTRIBUTE-LIST has no necessary relation to the active
+;; attributes in PATTERN, both subset and superset make sense; if nil,
+;; the active attributes in PATTERN is used
+;; OPTION-LIST is a list of presentation options, such as sort order
+;; and refresh-cache (if any).
+;;
+;; font-match PATTERN &optional DEVICE
+;; returns a pattern representing the platform match for PATTERN,
+;; which should unambiguously select the same font
+;; PATTERN is an ambiguous pattern
+;; DEVICE is the display device to query (default: selected device)
+;;
+;; Maybe these APIs should get an error-behavior argument?
;; #### it might make sense to generalize `fc-try-font' by having a
;; global variable that contains a list of font name parsers. They are
@@ -446,15 +471,17 @@ selected device."
(fc-name-parse font))
nil))
+;; for example, we'd like these next two to be implementable as
+;; (font-list (fc-create-pattern) device '("family" "style")) and
+;; (font-list (let ((p (fc-create-pattern))) (fc-pattern-add "family" family))
+;; device
+;; '("weight"))
+
(defun fc-find-available-font-families (&optional device filter-fun)
"Find all available font families."
(let ((device (or device (default-x-device)))
(pattern (make-fc-pattern))
(objectset '("family" "style")))
-; Xft2: does not work anymore
-; (if (not fc-find-available-font-families-fc-fonts-only)
-; (fc-pattern-add pattern fc-font-name-property-core t))
-; (fc-objectset-add objectset fc-font-name-property-encoding)
(let* ((all-fonts
(fc-list-fonts-pattern-objects device pattern objectset)))
(fc-delete-duplicates
@@ -465,24 +492,14 @@ selected device."
(fc-filter all-fonts filter-fun)
all-fonts))))))
-; Xft2: does not work anymore
-; (defun fc-find-available-font-families-non-mule (&optional device)
-; (fc-find-available-font-families
-; device
-; '(lambda (pattern)
-; (let ((encodings (fc-pattern-get-all-attributes
-; pattern 'fc-pattern-get-encoding)))
-; ;; Be sure that the font support ISO-8859-1
-; (member "iso8859-1" encodings)))))
-
(defun fc-find-available-weights-for-family (family &optional style device)
"Find available weights for font FAMILY."
(let* ((device (or device (default-x-device)))
(pattern (make-fc-pattern))
(objectset '("weight")))
- (fc-pattern-add pattern fc-font-name-property-family family)
+ (fc-pattern-add-family pattern family)
(if style
- (fc-pattern-add pattern fc-font-name-property-style style))
+ (fc-pattern-add-style pattern style))
(mapcar
'(lambda (pattern)
(let ((fc-weight-constant (fc-pattern-get-weight pattern 0)))
1.24 +38 -35 XEmacs/xemacs/lisp/x-faces.el
Index: x-faces.el
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/lisp/x-faces.el,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -p -r1.23 -r1.24
--- x-faces.el 2005/12/05 09:43:37 1.23
+++ x-faces.el 2006/04/23 16:11:22 1.24
@@ -66,7 +66,19 @@
'(x-get-resource-and-maybe-bogosity-check
x-get-resource x-init-pointer-shape))
-(require 'fontconfig)
+(if (featurep 'xft-fonts)
+ (require 'fontconfig)
+ (globally-declare-boundp
+ '(fc-font-name-weight-bold fc-font-name-weight-black
+ fc-font-name-weight-demibold fc-font-name-weight-medium
+ fc-font-name-slant-oblique fc-font-name-slant-italic
+ fc-font-name-slant-roman))
+ (globally-declare-fboundp
+ '(fc-font-real-pattern fc-pattern-get-size fc-copy-pattern-partial
+ fc-pattern-del-weight fc-pattern-del-style fc-pattern-duplicate
+ fc-pattern-add-weight fc-try-font fc-pattern-add-size
+ fc-name-unparse fc-pattern-del-slant fc-pattern-add-slant
+ fc-pattern-del-size fc-pattern-get-pixelsize)))
(defconst x-font-regexp nil)
(defconst x-font-regexp-head nil)
@@ -186,32 +198,28 @@ If it fails, it returns nil."
font (or device (default-x-device)))))
(if pattern
(let ((size (fc-pattern-get-size pattern 0))
- (copy (fc-copy-pattern-partial
- pattern (list fc-font-name-property-family))))
- (fc-pattern-del copy fc-font-name-property-weight)
- (fc-pattern-del copy fc-font-name-property-style)
+ (copy (fc-copy-pattern-partial pattern (list "family"))))
+ (fc-pattern-del-weight copy)
+ (fc-pattern-del-style copy)
(when copy
(or
;; try bold font
(let ((copy-2 (fc-pattern-duplicate copy)))
- (fc-pattern-add copy-2 fc-font-name-property-weight
- fc-font-name-weight-bold)
+ (fc-pattern-add-weight copy-2 fc-font-name-weight-bold)
(when (fc-try-font copy-2 device)
- (fc-pattern-add copy-2 fc-font-name-property-size size)
+ (fc-pattern-add-size copy-2 size)
(fc-name-unparse copy-2)))
;; try black font
(let ((copy-2 (fc-pattern-duplicate copy)))
- (fc-pattern-add copy-2 fc-font-name-property-weight
- fc-font-name-weight-black)
+ (fc-pattern-add-weight copy-2 fc-font-name-weight-black)
(when (fc-try-font copy-2 device)
- (fc-pattern-add copy-2 fc-font-name-property-size size)
+ (fc-pattern-add-size copy-2 size)
(fc-name-unparse copy-2)))
;; try demibold font
(let ((copy-2 (fc-pattern-duplicate copy)))
- (fc-pattern-add copy-2 fc-font-name-property-weight
- fc-font-name-weight-demibold)
+ (fc-pattern-add-weight copy-2 fc-font-name-weight-demibold)
(when (fc-try-font copy-2 device)
- (fc-pattern-add copy-2 fc-font-name-property-size size)
+ (fc-pattern-add-size copy-2 size)
(fc-name-unparse copy-2)))))))))
(defun x-make-font-bold-core (font &optional device)
@@ -233,9 +241,8 @@ If it fails, it returns nil."
(let ((pattern (fc-font-real-pattern
font (or device (default-x-device)))))
(when pattern
- (fc-pattern-del pattern fc-font-name-property-weight)
- (fc-pattern-add pattern fc-font-name-property-weight
- fc-font-name-weight-medium)
+ (fc-pattern-del-weight pattern)
+ (fc-pattern-add-weight pattern fc-font-name-weight-medium)
(if (fc-try-font pattern device)
(fc-name-unparse pattern)))))
@@ -265,39 +272,37 @@ If it fails, it returns nil."
font (or device (default-x-device)))))
(if pattern
(let ((size (fc-pattern-get-size pattern 0))
- (copy (fc-copy-pattern-partial
- pattern (list fc-font-name-property-family))))
+ (copy (fc-copy-pattern-partial pattern (list "family"))))
(when copy
- (fc-pattern-del copy fc-font-name-property-slant)
- (fc-pattern-del copy fc-font-name-property-style)
+ (fc-pattern-del-slant copy)
+ (fc-pattern-del-style copy)
+ ;; #### can't we do this with one ambiguous pattern?
(let ((pattern-oblique (fc-pattern-duplicate copy))
(pattern-italic (fc-pattern-duplicate copy)))
- (fc-pattern-add pattern-oblique fc-font-name-property-slant
- fc-font-name-slant-oblique)
- (fc-pattern-add pattern-italic fc-font-name-property-slant
- fc-font-name-slant-italic)
+ (fc-pattern-add-slant pattern-oblique fc-font-name-slant-oblique)
+ (fc-pattern-add-slant pattern-italic fc-font-name-slant-italic)
(let ((have-oblique (fc-try-font pattern-oblique device))
(have-italic (fc-try-font pattern-italic device)))
(if try-oblique-before-italic-fonts
(if have-oblique
(progn
(if size
- (fc-pattern-add pattern-oblique fc-font-name-property-size size))
+ (fc-pattern-add-size pattern-oblique size))
(fc-name-unparse pattern-oblique))
(if have-italic
(progn
(if size
- (fc-pattern-add pattern-italic fc-font-name-property-size size))
+ (fc-pattern-add-size pattern-italic size))
(fc-name-unparse pattern-italic))))
(if have-italic
(progn
(if size
- (fc-pattern-add pattern-italic fc-font-name-property-size size))
+ (fc-pattern-add-size pattern-italic size))
(fc-name-unparse pattern-italic))
(if have-oblique
(progn
(if size
- (fc-pattern-add pattern-oblique fc-font-name-property-size size))
+ (fc-pattern-add-size pattern-oblique size))
(fc-name-unparse pattern-oblique))))))))))))
(defun x-make-font-italic-core (font &optional device)
@@ -320,9 +325,8 @@ If it fails, it returns nil."
(let ((pattern (fc-font-real-pattern
font (or device (default-x-device)))))
(when pattern
- (fc-pattern-del pattern fc-font-name-property-slant)
- (fc-pattern-add pattern fc-font-name-property-slant
- fc-font-name-slant-roman)
+ (fc-pattern-del-slant pattern)
+ (fc-pattern-add-slant pattern fc-font-name-slant-roman)
(if (fc-try-font pattern device)
(fc-name-unparse pattern)))))
@@ -523,9 +527,8 @@ Otherwise, it returns the next smaller v
(let ((size (fc-pattern-get-size pattern 0)))
(if (floatp size)
(let ((copy (fc-pattern-duplicate pattern)))
- (fc-pattern-del copy fc-font-name-property-size)
- (fc-pattern-add copy fc-font-name-property-size
- (funcall new-size-proc size))
+ (fc-pattern-del-size copy)
+ (fc-pattern-add-size copy (funcall new-size-proc size))
(if (fc-try-font font device)
(fc-name-unparse copy))))))))
1.15 +6 -6 XEmacs/xemacs/lisp/x-font-menu.el
Index: x-font-menu.el
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/lisp/x-font-menu.el,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -p -r1.14 -r1.15
--- x-font-menu.el 2005/11/26 11:45:55 1.14
+++ x-font-menu.el 2006/04/23 16:11:22 1.15
@@ -346,15 +346,15 @@ or if you change your font path, you can
(defun x-font-menu-load-font-xft (family weight size slant resolution)
(let ((pattern (make-fc-pattern)))
- (fc-pattern-add pattern fc-font-name-property-family family)
+ (fc-pattern-add-family pattern family)
(if weight
- (fc-pattern-add pattern fc-font-name-property-weight
- (fc-font-weight-translate-from-string weight)))
+ (fc-pattern-add-weight pattern
+ (fc-font-weight-translate-from-string weight)))
(if size
- (fc-pattern-add pattern fc-font-name-property-size size))
+ (fc-pattern-add-size pattern size))
(if slant
- (fc-pattern-add pattern fc-font-name-property-slant
- (fc-font-slant-translate-from-string slant)))
+ (fc-pattern-add-slant pattern
+ (fc-font-slant-translate-from-string slant)))
(make-font-instance (fc-name-unparse pattern))))
(defun x-font-menu-load-font-core (family weight size slant resolution)
1.1 XEmacs/xemacs/lisp/font-mgr.el
Index: font-mgr.el
===================================================================
;;; font-mgr.el --- Lisp emulation of fontconfig for X fonts.
;; Copyright (C) 2006 Free Software Foundation, Inc.
;; Author: Stephen J. Turnbull <stephen(a)xemacs.org>
;; Created: 12 Apr 2006 by Stephen J. Turnbull
;; This file is part of XEmacs.
;; XEmacs is free software; you can redistribute it and/or modify it
;; under the terms of the GNU General Public License as published by the
;; Free Software Foundation; either version 2, or (at your option) any
;; later version.
;; XEmacs is distributed in the hope that it will be useful, but WITHOUT
;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
;; for more details.
;; You should have received a copy of the GNU General Public License
;; along with XEmacs; see the file COPYING. If not, write to
;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.
;; Synched up with: Not in GNU Emacs.
;; Commentary
;; This module provides the Lisp interface to fonts in X11, including Xft,
;; but (at least at first) not GTK+ or Qt. It is a substitute for the
;; C library fontconfig, whose interface is provided in ../src/font-mgr.c.
;; static FcChar8 *fc_standard_properties[] = {
;; "antialias", "aspect", "autohint", "charset", "dpi", "family", "file",
;; "foundry", "ftface", "globaladvance", "hinting", "index", "lang",
;; "minspace", "outline", "pixelsize", "rasterizer", "rgba", "scalable",
;; "scale", "size", "slant", "spacing", "style", "verticallayout", "weight",
;; /* obsolete after Xft v. 1 */
;; "charwidth", "charheight", "core", "encoding", "render"
;; #### should we wrap the world in `(unless (featurep 'font-mgr) ... )'?
(provide 'font-mgr)
(defvar xft-xlfd-font-regexp
(concat
;; XLFD specifies ISO 8859-1 encoding, but we can't handle non-ASCII
;; in Mule when this function is called. So use HPC.
;; (xe_xlfd_prefix "\\(\\+[\040-\176\240-\377]*\\)?-")
;; (xe_xlfd_opt_text "\\([\040-\044\046-\176\240-\377]*\\)")
;; (xe_xlfd_text "\\([\040-\044\046-\176\240-\377]+\\)")
"\\`"
"\\(\\+[\040-\176]*\\)?-" ; prefix
"\\([^-]+\\)" ; foundry
"-"
"\\([^-]+\\)" ; family
"-"
"\\([^-]+\\)" ; weight
"-"
"\\([0-9ior?*][iot]?\\)" ; slant
"-"
"\\([^-]+\\)" ; swidth
"-"
"\\([^-]*\\)" ; adstyle
"-"
"\\([0-9?*]+\\|\\[[ 0-9+~.e?*]+\\]\\)" ; pixelsize
"-"
"\\([0-9?*]+\\|\\[[ 0-9+~.e?*]+\\]\\)" ; pointsize
"-"
"\\([0-9?*]+\\)" ; resx
"-"
"\\([0-9?*]+\\)" ; resy
"-"
"\\([cmp?*]\\)" ; spacing
"-"
"~?" ; avgwidth
"\\([0-9?*]+\\)"
"-"
"\\([^-]+\\)" ; registry
"-"
"\\([^-]+\\)" ; encoding
"\\'")
"The regular expression used to match XLFD font names.")
(defun fc-pattern-p (object)
"Returns t if OBJECT is of type fc-pattern, nil otherwise."
(error 'unimplemented "font-mgr library is experimental and incomplete"))
(defun fc-pattern-create ()
"Return a new, empty fc-pattern object."
(error 'unimplemented "font-mgr library is experimental and incomplete"))
(defun fc-name-parse (fontname)
"Parse an Fc font name and return its representation as a fc pattern object."
(error 'unimplemented "font-mgr library is experimental and incomplete"))
(defun fc-name-unparse (pattern)
"Unparse an fc pattern object to a string."
(error 'unimplemented "font-mgr library is experimental and incomplete"))
(defun fc-pattern-duplicate (pattern)
"Make a copy of the fc pattern object PATTERN and return it."
(error 'unimplemented "font-mgr library is experimental and incomplete"))
(defun fc-pattern-add (pattern property value)
"Add attributes to the pattern object PATTERN. PROPERTY is a string naming
the attribute to add, VALUE the value for this attribute.
VALUE may be a string, integer, float, or symbol, in which case the value
will be added as an FcChar8[], int, double, or FcBool respectively."
(error 'unimplemented "font-mgr library is experimental and incomplete"))
(defun fc-pattern-del (pattern property)
"Remove attribute PROPERTY from fc pattern object PATTERN."
(error 'unimplemented "font-mgr library is experimental and incomplete"))
;; Generic interface to FcPatternGet()
;; Don't support the losing symbol-for-property interface.
(defun fc-pattern-get (pattern property &optional id type)
"From PATTERN, extract PROPERTY for the ID'th member, of type TYPE.
PATTERN is an Xft \(fontconfig) pattern object.
PROPERTY is a string naming an fontconfig font property.
Optional ID is a nonnegative integer indexing the list of values for PROPERTY
stored in PATTERN, defaulting to 0 (the first value).
Optional TYPE is a symbol, one of 'string, 'boolean, 'integer, 'float,
'double, 'matrix, 'charset, or 'void, corresponding to the FcValue types.
\('float is an alias for 'double).
The Lisp types returned will conform to TYPE:
string string
boolean `t' or `nil'
integer integer
double \(float) float
matrix not implemented
charset not implemented
void not implemented
Symbols with names of the form \"fc-result-DESCRIPTION\" are returned when
the desired value is not available. These are
fc-result-type-mismatch the value found has an unexpected type
fc-result-no-match there is no such attribute
fc-result-no-id there is no value for the requested ID
The types of the following standard properties are predefined by fontconfig.
The symbol 'fc-result-type-mismatch will be returned if the object exists but
TYPE does not match the predefined type. It is best not to specify a type
for predefined properties, as a mistake here ensures error returns on the
correct type.
Each standard property has a convenience accessor defined in fontconfig.el,
named in the form \"fc-pattern-get-PROPERTY\". The convenience functions are
preferred to `fc-pattern-get' since a typo in the string naming a property
will result in a silent null return, while a typo in a function name will
usually result in a compiler or runtime \"not fboundp\" error. You may use
`defsubst' to define convenience functions for non-standard properties.
family String Font family name
style String Font style. Overrides weight and slant
slant Int Italic, oblique or roman
weight Int Light, medium, demibold, bold or black
size Double Point size
aspect Double Stretches glyphs horizontally before hinting
pixelsize Double Pixel size
spacing Int Proportional, monospace or charcell
foundry String Font foundry name
antialias Bool Whether glyphs can be antialiased
hinting Bool Whether the rasterizer should use hinting
verticallayout Bool Use vertical layout
autohint Bool Use autohinter instead of normal hinter
globaladvance Bool Use font global advance data
file String The filename holding the font
index Int The index of the font within the file
ftface FT_Face Use the specified FreeType face object
rasterizer String Which rasterizer is in use
outline Bool Whether the glyphs are outlines
scalable Bool Whether glyphs can be scaled
scale Double Scale factor for point->pixel conversions
dpi Double Target dots per inch
rgba Int unknown, rgb, bgr, vrgb, vbgr, none - subpixel geometry
minspace Bool Eliminate leading from line spacing
charset CharSet Unicode chars encoded by the font
lang String List of RFC-3066-style languages this font supports
The FT_Face, Matrix, CharSet types are unimplemented, so the corresponding
properties are not accessible from Lisp at this time. If the value of a
property returned has type FT_Face, FcCharSet, or FcMatrix,
`fc-result-type-mismatch' is returned.
The following properties which were standard in Xft v.1 are obsolete in
Xft v.2: encoding, charwidth, charheight, core, and render."
(error 'unimplemented "font-mgr library is experimental and incomplete"))
(defun fc-font-match (device pattern)
"Return the font on DEVICE that most closely matches PATTERN.
DEVICE is an X11 device.
PATTERN is a fontconfig pattern object.
Returns a fontconfig pattern object representing the closest match to the
given pattern, or an error code. Possible error codes are
`fc-result-no-match' and `fc-result-no-id'."
(error 'unimplemented "font-mgr library is experimental and incomplete"))
;; #### fix this name to correspond to Ben's new nomenclature
(defun fc-list-fonts-pattern-objects (device pattern properties)
"Return a list of fonts on DEVICE that match PATTERN for PROPERTIES.
Each font is represented by a fontconfig pattern object.
DEVICE is an X11 device.
PATTERN is a fontconfig pattern to be matched.
PROPERTIES is a list of property names (strings) that should match.
#### DEVICE is unused, ignored, and may be removed if it's not needed to
match other font-listing APIs."
(error 'unimplemented "font-mgr library is experimental and incomplete"))
;; #### maybe this can/should be folded into fc-list-fonts-pattern-objects?
(defun fc-font-sort (device pattern &optional trim nosub)
"Return a list of all fonts sorted by proximity to PATTERN.
Each font is represented by a fontconfig pattern object.
DEVICE is an X11 device.
PATTERN is a fontconfig pattern to be matched.
Optional argument TRIM, if non-nil, means to trim trailing fonts that do not
contribute new characters to the union repertoire.
#### Optional argument NOSUB, if non-nil, suppresses some of the usual
property substitutions. DON'T USE THIS in production code, it is intended
for exploring behavior of fontconfig and will be removed when this code is
stable.
#### DEVICE is unused, ignored, and may be removed if it's not needed to
match other font-listing APIs."
(error 'unimplemented "font-mgr library is experimental and incomplete"))
(when nil
;; #### this actually is an Xft function, should split those out
;; or get rid of them entirely?
;; #### be consistent about argument order.
(defun fc-font-real-pattern (fontname xdevice)
"Temporarily open FONTNAME (a string) and return the actual
fc pattern matched by the Fc library."
(error 'unimplemented "font-mgr library is experimental and incomplete"))
)
(defun xlfd-font-name-p (fontname)
"Check whether the string FONTNAME is a XLFD font name."
(save-match-data
(string-match xft-xlfd-font-regexp fontname)))
;; FcPatternPrint: there is no point in having wrappers fc-pattern-print,
;; Ffc_pattern_print since this function prints to stdout.
;;; end font-mgr.el
1.84 +4 -0 XEmacs/xemacs/lwlib/ChangeLog
Index: ChangeLog
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/lwlib/ChangeLog,v
retrieving revision 1.83
retrieving revision 1.84
diff -u -p -r1.83 -r1.84
--- ChangeLog 2006/03/31 19:19:36 1.83
+++ ChangeLog 2006/04/23 16:11:25 1.84
@@ -1,3 +1,7 @@
+2006-04-22 Stephen J. Turnbull <stephen(a)xemacs.org>
+
+ * lwlib-fonts.c: Rename xft-fonts.h to font-mgr.h.
+
2006-03-31 Stephen J. Turnbull <stephen(a)xemacs.org>
* XEmacs 21.5.26 "endive" is released.
1.3 +1 -1 XEmacs/xemacs/lwlib/lwlib-fonts.c
Index: lwlib-fonts.c
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/lwlib/lwlib-fonts.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -p -r1.2 -r1.3
--- lwlib-fonts.c 2005/11/26 11:45:59 1.2
+++ lwlib-fonts.c 2006/04/23 16:11:26 1.3
@@ -36,7 +36,7 @@ Boston, MA 02111-1307, USA. */
#include "device.h"
#include "device-impl.h"
#include "console-x-impl.h"
-#include "xft-fonts.h"
+#include "font-mgr.h"
#endif
/*
1.337 +5 -0 XEmacs/xemacs/man/ChangeLog
Index: ChangeLog
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/man/ChangeLog,v
retrieving revision 1.336
retrieving revision 1.337
diff -u -p -r1.336 -r1.337
--- ChangeLog 2006/03/31 19:19:47 1.336
+++ ChangeLog 2006/04/23 16:11:27 1.337
@@ -1,3 +1,8 @@
+2006-04-23 Stephen J. Turnbull <stephen(a)xemacs.org>
+
+ * internals/internals.texi: Run texinfo-master-menu.
+ (Creating a New Console/Device/Frame Type): New node.
+
2006-03-31 Stephen J. Turnbull <stephen(a)xemacs.org>
* XEmacs 21.5.26 "endive" is released.
1.75 +234 -66 XEmacs/xemacs/man/internals/internals.texi
Index: internals.texi
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/man/internals/internals.texi,v
retrieving revision 1.74
retrieving revision 1.75
diff -u -p -r1.74 -r1.75
--- internals.texi 2006/03/31 17:51:29 1.74
+++ internals.texi 2006/04/23 16:11:28 1.75
@@ -311,7 +311,7 @@ Similar but generates a general subsecti
* XEmacs from the Perspective of Building::
* Build-Time Dependencies::
* The Modules of XEmacs::
-* The Build Configuration System::
+* The Build Configuration System::
* Rules When Writing New C Code::
* Regression Testing XEmacs::
* CVS Techniques::
@@ -361,6 +361,7 @@ A History of Emacs
The Modules of XEmacs
* A Summary of the Various XEmacs Modules::
+* Modules for Building XEmacs::
* Low-Level Modules::
* Basic Lisp Modules::
* Modules for Standard Editing Operations::
@@ -368,6 +369,19 @@ The Modules of XEmacs
* Modules for Other Aspects of the Lisp Interpreter and Object System::
* Modules for Interfacing with the Operating System::
+Modules for Building XEmacs
+
+* Modules for Build Configuration::
+* Modules for Compiling XEmacs::
+* Modules for Preloading Lisp::
+
+The Build Configuration System
+
+* The version.sh Script::
+* Adding Configurable Features::
+* The configure Script::
+* The Makefile Precursors::
+
Rules When Writing New C Code
* Introduction to Writing C Code::
@@ -393,7 +407,7 @@ Regression Testing XEmacs
CVS Techniques
-* Creating a Branch::
+* Creating a Branch::
* Merging a Branch into the Trunk::
Low-Level Allocation
@@ -471,12 +485,12 @@ Multilingual Support
* Encodings::
* Internal Mule Encodings::
* Byte/Character Types; Buffer Positions; Other Typedefs::
-* Internal Text APIs::
+* Internal Text APIs::
* Coding for Mule::
* CCL::
* Microsoft Windows-Related Multilingual Issues::
* Modules for Internationalization::
-* The Great Mule Merge of March 2002::
+* The Great Mule Merge of March 2002::
Encodings
@@ -525,18 +539,18 @@ Microsoft Windows-Related Multilingual I
The Great Mule Merge of March 2002
-* List of changed files in new Mule workspace::
-* Changes to the MULE subsystems::
-* Pervasive changes throughout XEmacs sources::
-* Changes to specific subsystems::
-* Mule changes by theme::
-* File-coding rewrite::
-* General User-Visible Changes::
-* General Lisp-Visible Changes::
-* User documentation::
-* General internal changes::
-* Ben's TODO list:: Probably obsolete.
-* Ben's README:: Probably obsolete.
+* List of changed files in new Mule workspace::
+* Changes to the MULE subsystems::
+* Pervasive changes throughout XEmacs sources::
+* Changes to specific subsystems::
+* Mule changes by theme::
+* File-coding rewrite::
+* General User-Visible Changes::
+* General Lisp-Visible Changes::
+* User documentation::
+* General internal changes::
+* Ben's TODO list:: Probably obsolete.
+* Ben's README:: Probably obsolete.
Consoles; Devices; Frames; Windows
@@ -544,6 +558,7 @@ Consoles; Devices; Frames; Windows
* Point::
* Window Hierarchy::
* The Window Object::
+* Creating a New Console/Device/Frame Type::
* Modules for the Basic Displayable Lisp Objects::
The Redisplay Mechanism
@@ -595,7 +610,7 @@ Lstreams
Subprocesses
-* Ben's separate stderr notes:: Probably obsolete.
+* Ben's separate stderr notes:: Probably obsolete.
Interface to MS Windows
@@ -603,7 +618,7 @@ Interface to MS Windows
* Windows Build Flags::
* Windows I18N Introduction::
* Modules for Interfacing with MS Windows::
-* CHANGES from 21.4-windows branch:: Probably obsolete.
+* CHANGES from 21.4-windows branch:: Probably obsolete.
Interface to the X Window System
@@ -661,7 +676,7 @@ Future Work
* Future Work -- Display Tables::
* Future Work -- Making Elisp Function Calls Faster::
* Future Work -- Lisp Engine Replacement::
-* Future Work -- Better Rendering Support::
+* Future Work -- Better Rendering Support::
Future Work -- Toolbars
@@ -697,6 +712,20 @@ Future Work -- Lisp Engine Replacement
* Future Work -- Lisp Engine Replacement -- Implementation::
* Future Work -- Startup File Modification by Packages::
+Future Work -- Better Rendering Support
+
+* Better Rendering Support -- Review Criteria::
+* Better Rendering Support -- Implementation::
+* Better Rendering Support -- Current Status::
+* Better Rendering Support -- Configuration with the Interim Patches::
+* Better Rendering Support -- Modern Font Support::
+
+Better Rendering Support -- Modern Font Support
+
+* Modern Font Support -- Font Concepts:: GUI devices, fonts, glyphs, rendering.
+* Modern Font Support -- fontconfig:: Querying and selecting fonts.
+* Modern Font Support -- Xft:: Rendering fonts on X11.
+
Future Work Discussion
* Discussion -- Garbage Collection::
@@ -2737,7 +2766,7 @@ error. (Currently this is only needed f
@menu
* A Summary of the Various XEmacs Modules::
-* Modules for Building XEmacs::
+* Modules for Building XEmacs::
* Low-Level Modules::
* Basic Lisp Modules::
* Modules for Standard Editing Operations::
@@ -3247,9 +3276,9 @@ The following table contains cross-refer
@cindex building XEmacs, modules for
@menu
-* Modules for Build Configuration::
-* Modules for Compiling XEmacs::
-* Modules for Preloading Lisp::
+* Modules for Build Configuration::
+* Modules for Compiling XEmacs::
+* Modules for Preloading Lisp::
@end menu
@@ -3288,7 +3317,7 @@ Makefiles, and I guess cross-references
-@node Modules for Preloading Lisp, , Modules for Compiling XEmacs, Modules for Building XEmacs
+@node Modules for Preloading Lisp, , Modules for Compiling XEmacs, Modules for Building XEmacs
@subsection Modules for Preloading Lisp
@cindex modules for preloading lisp
@cindex preloading lisp, modules for
@@ -4357,10 +4386,10 @@ where they are located is the responsibi
system.
@menu
-* The version.sh Script::
+* The version.sh Script::
* Adding Configurable Features::
-* The configure Script::
-* The Makefile Precursors::
+* The configure Script::
+* The Makefile Precursors::
@end menu
@@ -4836,7 +4865,7 @@ found then an error is generated.
-@node The Makefile Precursors, , The configure Script, The Build Configuration System
+@node The Makefile Precursors, , The configure Script, The Build Configuration System
@section The Makefile Precursors
@cindex Makefile precursors
@cindex precursors, Makefile
@@ -6603,7 +6632,7 @@ XEmacs facilities. @xref{Regression Tes
@cindex CVS techniques
@menu
-* Creating a Branch::
+* Creating a Branch::
* Merging a Branch into the Trunk::
@end menu
@@ -10389,12 +10418,12 @@ representation is that it's compact and
* Encodings::
* Internal Mule Encodings::
* Byte/Character Types; Buffer Positions; Other Typedefs::
-* Internal Text APIs::
+* Internal Text APIs::
* Coding for Mule::
* CCL::
* Microsoft Windows-Related Multilingual Issues::
* Modules for Internationalization::
-* The Great Mule Merge of March 2002::
+* The Great Mule Merge of March 2002::
@end menu
@node Introduction to Multilingual Issues #1, Introduction to Multilingual Issues #2, Multilingual Support, Multilingual Support
@@ -14102,7 +14131,7 @@ string of either regular or wide chars,
prepended with an L (causing it to be a wide string) depending on
XEUNICODE_P.
-@node Modules for Internationalization, The Great Mule Merge of March 2002, Microsoft Windows-Related Multilingual Issues, Multilingual Support
+@node Modules for Internationalization, The Great Mule Merge of March 2002, Microsoft Windows-Related Multilingual Issues, Multilingual Support
@section Modules for Internationalization
@cindex modules for internationalization
@cindex internationalization, modules for
@@ -14208,22 +14237,22 @@ some reorganization according to themes
remains to be done.
@menu
-* List of changed files in new Mule workspace::
-* Changes to the MULE subsystems::
-* Pervasive changes throughout XEmacs sources::
-* Changes to specific subsystems::
-* Mule changes by theme::
-* File-coding rewrite::
-* General User-Visible Changes::
-* General Lisp-Visible Changes::
-* User documentation::
-* General internal changes::
-* Ben's TODO list:: Probably obsolete.
-* Ben's README:: Probably obsolete.
+* List of changed files in new Mule workspace::
+* Changes to the MULE subsystems::
+* Pervasive changes throughout XEmacs sources::
+* Changes to specific subsystems::
+* Mule changes by theme::
+* File-coding rewrite::
+* General User-Visible Changes::
+* General Lisp-Visible Changes::
+* User documentation::
+* General internal changes::
+* Ben's TODO list:: Probably obsolete.
+* Ben's README:: Probably obsolete.
@end menu
-@node List of changed files in new Mule workspace, Changes to the MULE subsystems, , The Great Mule Merge of March 2002
+@node List of changed files in new Mule workspace, Changes to the MULE subsystems, The Great Mule Merge of March 2002, The Great Mule Merge of March 2002
@subsection List of changed files in new Mule workspace
This node lists the files that were touched in the Great Mule Merge.
@@ -15307,7 +15336,7 @@ business of injecting code should be las
interrupt the same process, use the injection method.
@end itemize
-@node Ben's README, , Ben's TODO list, The Great Mule Merge of March 2002
+@node Ben's README, , Ben's TODO list, The Great Mule Merge of March 2002
@subsection Ben's README (probably obsolete)
These notes substantially overlap those in @ref{Ben's TODO list}. They
@@ -17176,6 +17205,7 @@ present in the fsf version, for compatib
* Point::
* Window Hierarchy::
* The Window Object::
+* Creating a New Console/Device/Frame Type::
* Modules for the Basic Displayable Lisp Objects::
@end menu
@@ -17345,7 +17375,7 @@ is @code{nil} but the @code{prev} points
artifact that should be fixed.)
@end enumerate
-@node The Window Object, Modules for the Basic Displayable Lisp Objects, Window Hierarchy, Consoles; Devices; Frames; Windows
+@node The Window Object, Creating a New Console/Device/Frame Type, Window Hierarchy, Consoles; Devices; Frames; Windows
@section The Window Object
@cindex window object, the
@cindex object, the window
@@ -17451,8 +17481,145 @@ If the region (or part of it) is highlig
holds the mark position that made one end of that region. Otherwise,
this field is @code{nil}.
@end table
+
+
+@node Creating a New Console/Device/Frame Type, Modules for the Basic Displayable Lisp Objects, The Window Object, Consoles; Devices; Frames; Windows
+@section Creating a New Console, Device, or Frame Type
+@cindex creating a new console type
+@cindex console type, creating a new
+@cindex creating a new device type
+@cindex device type, creating a new
+@cindex creating a new frame type
+@cindex frame type, creating a new
+
+Unfortunately, at the present time, only the console abstraction is at
+all well-maintained. Device and frame internals are referred to from
+many places in the redisplay and console code. The best that can be
+done therefore is to create a whole new console type, even though much
+code will be shared. (Ben Wing has complained about the code
+duplication in the GTK+ v1 console, and probably would not be happy with
+the unpublished Qt console or Andrew Choi's Carbon console, but it's
+hard to see how those consoles could have been done better without
+fixing the abstractions in the X (actually Xt), MS Windows, and tty
+consoles as well as doing a complete refactoring of the console, device,
+and frame code.)
+
+What is desireable is sharing console, device, and frame methods across
+platforms in a more general way, reducing the amount of duplicated code
+by pulling it back into the redisplay engine proper or the Lisp modules
+as appropriate. For example, we should be able to use
+@samp{make-frame-on-device} to share a single X connection among GTK, X,
+and Xft frames. Xft is partially implemented, but GTK would be much
+harder (impossible?) because it has its own event loop. (Xft shares the
+Xt event loop with the X console.)
+
+The way all methods get added to the console type is uncool. A console
+should be a composite, which indicates a collection of I/O resources
+``used together.'' It should indicate where operations that change
+``focus'' search for targets, @emph{i.e.}, by default new frames are
+created on the selected device of the console where the input that
+invoked the command was received, @samp{pop-to-buffer-other-window} only
+considers existing windows on the same device of the same console,
+(a)emph{etc.} But it should be possible to assemble consoles out of
+component input channels, imaging devices, and multimedia (audio)
+channels.
+
+The following notes may provide some guidance to those who wish to
+create new console types (@emph{i.e.}, port the redisplay code to a new
+platform). They are based on an unsuccessful attempt to refactor the
+Xft code into a new console type while sharing most routines with the X
+console. (For clarification or suggestions, feel free to write
+@email{stephen@(a)xemacs.org,Stephen Turnbull}.)
+
+The first thing to realize is that the naming of many modules obscures
+their relationship to the console abstraction. For example, the
+@file{objects-@var{console-type}}, @file{redisplay-@var{console-type}},
+and @file{glyphs-@var{console-type}} series of modules have nothing to
+do with Lisp objects and little to do with redisplay, respectively.
+Rather they implement abstractions used for rendering on each console
+type, such as fonts and colors (@file{objects}) and string and graphics
+drawing primitives (@file{rendering}). These modules are conceptually
+part of the console implementations, not part of redisplay or Lisp.
+
+Public methods of a console are implemented as C functions declared
+@code{static}, following a rigid naming convention:
+@samp{@var{console-type}_@var{method-name}}. Methods are bound to the
+console type in the @samp{console_type_create_@var{file}} functions for
+each console component (console, device, and frame) using the
+@samp{CONSOLE_HAS_METHOD} family of macros. Methods for displaying
+images are bound using the @samp{IIFORMAT_HAS_DEVMETHOD} family of
+macros. Methods are invoked using the @samp{CONMETH}, @samp{DEVMETH},
+and @samp{FRAMEMETH} families of macros, which look up the relevant
+methods in the object's table of methods.
+
+(a)strong{N.B.} All of the object tables are actually references to
+console method tables. To create a variant of an existing console,
+there is a @samp{CONSOLE_INHERITS_METHOD} constructor, but this actually
+constructs the name of the parent's method pointer and stores in the
+derived console type's method table. Of course this is time-efficient,
+and since there are few console types it is a neglible waste of space.
+However in practice this may have contributed to breaking the various
+abstractions, and the variant console must be coded in the same file as
+the parent (because the methods are static). Another minor symptom of
+the incompleteness of the abstraction is the fact that the API for
+inheritance of device methods for image formats is named
+@samp{IIFORMAT_HAS_SHARED_METHOD}, although the semantics are identical.
+
+One problem encountered in attempting to create an Xft console type as a
+derivative of the X console type was that there is no support for such
+union types in the consistency-checking code, whether for the
+fundamental Lisp consistency checks (the @samp{CHECK_SOMETHING} family
+of macros) or for the error-checking variants of many functions. These
+APIs all simply check for the apparent console type, which is a single
+symbol (or enumerator).
+
+To create a new console with mostly new methods, it's probably best to
+copy all of the @file{@var{function}-@var{console-type}} files from a
+similar console (or several, if the new console type seems like a
+combination of several existing console types), renaming the files by
+substituting @var{new-console-type} for @var{console-type}. Then
+proceed in the obvious way by renaming methods from
+@samp{@var{console-type}_@var{method-name}} to
+@samp{@var{new-console-type}_@var{method-name}}, and implementing them.
+
+Once you've done that, then the fun starts. Insert the initialization
+functions (@samp{syms_of_@var{file}}, @samp{vars_of_@var{file}},
+@samp{console_type_create_@var{file}}, @emph{etc.}) in @samp{main_1} in
+(a)file{emacs.c}.
+
+Add a device creation function @samp{make-@var{console-type}-device} in
+(a)file{device.el}. Add the device type to the calls to
+@samp{Face-frob-property} in @file{faces.el}, as well as calls to the
+device initializer functions for devices and frames, and ``additional
+frobbing'' in that file.
+
+You may wish to add an option to force the initial frame to that device
+type to @file{emacs.c}. Don't forget to document it in the command help
+function in @file{startup.el}.
+
+You may need to add support for your console type in
+@samp{init_event_stream} in @file{event-stream.c}.
+
+If your console has a different UI for fonts or colors, or adds new
+capability, you may need to add a @file{(a)var{console-type}-faces.el}
+file, or add code to the @file{(a)var{parent-type}-faces.el} file, to
+support new font or color capability. Probably initialization code in
+(a)file{faces.c} will be needed too.
+
+A check for the console type is probably needed in @samp{init_redisplay}
+in @file{redisplay.c}.
+
+Ditto for the @file{(a)var{console-type}-init.el} file.
+
+Don't forget that Emacs windows are console-dependent, too. At least a
+@samp{WINDOW_@var{console-type}_P}-checking macro should be added in
+(a)file{window-impl.h}.
-@node Modules for the Basic Displayable Lisp Objects, , The Window Object, Consoles; Devices; Frames; Windows
+Note that this project failed; there are probably many other details to
+be implemented that I didn't get to. But don't let that stop you!
+
+
+@node Modules for the Basic Displayable Lisp Objects, , Creating a New Console/Device/Frame Type, Consoles; Devices; Frames; Windows
@section Modules for the Basic Displayable Lisp Objects
@cindex modules for the basic displayable Lisp objects
@cindex displayable Lisp objects, modules for the basic
@@ -17602,6 +17769,7 @@ windows), there is no device-type-specif
is part of the redisplay mechanism or the code for particular object
types such as scrollbars.
+
@node The Redisplay Mechanism, Extents, Consoles; Devices; Frames; Windows, Top
@chapter The Redisplay Mechanism
@cindex redisplay mechanism, the
@@ -20404,11 +20572,11 @@ or @code{nil} if it is using pipes.
@end table
@menu
-* Ben's separate stderr notes:: Probably obsolete.
+* Ben's separate stderr notes:: Probably obsolete.
@end menu
-@node Ben's separate stderr notes, , , Subprocesses
+@node Ben's separate stderr notes, , Subprocesses, Subprocesses
@subsection Ben's separate stderr notes (probably obsolete)
This node contains some notes that Ben kept on his separate subprocess
@@ -20449,7 +20617,7 @@ see the ChangeLogs in the workspace.
* Windows Build Flags::
* Windows I18N Introduction::
* Modules for Interfacing with MS Windows::
-* CHANGES from 21.4-windows branch:: Probably obsolete.
+* CHANGES from 21.4-windows branch:: Probably obsolete.
@end menu
@node Different kinds of Windows environments, Windows Build Flags, Interface to MS Windows, Interface to MS Windows
@@ -20978,7 +21146,7 @@ Auto-generated Unicode encapsulation hea
@end table
-@node CHANGES from 21.4-windows branch, , Modules for Interfacing with MS Windows, Interface to MS Windows
+@node CHANGES from 21.4-windows branch, , Modules for Interfacing with MS Windows, Interface to MS Windows
@section CHANGES from 21.4-windows branch (probably obsolete)
This node contains the @file{CHANGES-msw} log that Andy Piper kept while
@@ -26741,7 +26909,7 @@ probably not worth doing on the first pa
@end itemize
-@node Future Work -- Lisp Engine Replacement, Future Work -- Better Rendering Support, Future Work -- Making Elisp Function Calls Faster, Future Work
+@node Future Work -- Lisp Engine Replacement, Future Work -- Better Rendering Support, Future Work -- Making Elisp Function Calls Faster, Future Work
@section Future Work -- Lisp Engine Replacement
@cindex future work, lisp engine replacement
@cindex lisp engine replacement, future work
@@ -27354,7 +27522,7 @@ could "just work".
-@node Future Work -- Better Rendering Support, , Future Work -- Lisp Engine Replacement, Future Work
+@node Future Work -- Better Rendering Support, , Future Work -- Lisp Engine Replacement, Future Work
@section Future Work -- Better Rendering Support
@cindex future work, better rendering support
@cindex better rendering support, future work
@@ -27387,15 +27555,15 @@ this point a (private) CVS branch is ava
one may be made available for the Knauel-Matthias patch soon.
@menu
-* Better Rendering Support -- Review Criteria::
-* Better Rendering Support -- Implementation::
-* Better Rendering Support -- Current Status::
-* Better Rendering Support -- Configuration with the Interim Patches::
-* Better Rendering Support -- Modern Font Support::
+* Better Rendering Support -- Review Criteria::
+* Better Rendering Support -- Implementation::
+* Better Rendering Support -- Current Status::
+* Better Rendering Support -- Configuration with the Interim Patches::
+* Better Rendering Support -- Modern Font Support::
@end menu
-@node Better Rendering Support -- Review Criteria, Better Rendering Support -- Implementation, , Future Work -- Better Rendering Support
+@node Better Rendering Support -- Review Criteria, Better Rendering Support -- Implementation, Future Work -- Better Rendering Support, Future Work -- Better Rendering Support
@subsection Better Rendering Support -- Review Criteria
@cindex better rendering support, issues
@cindex issues, better rendering support
@@ -27738,7 +27906,7 @@ rechecked on Linux, where it was observe
-@node Better Rendering Support -- Modern Font Support, , Better Rendering Support -- Configuration with the Interim Patches, Future Work -- Better Rendering Support
+@node Better Rendering Support -- Modern Font Support, , Better Rendering Support -- Configuration with the Interim Patches, Future Work -- Better Rendering Support
@subsection Better Rendering Support -- Modern Font Support
@c Maybe eventually all these @cindexes should be spread about?
@@ -27784,12 +27952,12 @@ minimal configuration} is defined that e
available on all @file{fontconfig} systems.
@menu
-* Modern Font Support -- Font Concepts:: GUI devices, fonts, glyphs, rendering.
-* Modern Font Support -- fontconfig:: Querying and selecting fonts.
-* Modern Font Support -- Xft:: Rendering fonts on X11.
+* Modern Font Support -- Font Concepts:: GUI devices, fonts, glyphs, rendering.
+* Modern Font Support -- fontconfig:: Querying and selecting fonts.
+* Modern Font Support -- Xft:: Rendering fonts on X11.
@end menu
-@node Modern Font Support -- Font Concepts, Modern Font Support -- fontconfig, , Better Rendering Support -- Modern Font Support
+@node Modern Font Support -- Font Concepts, Modern Font Support -- fontconfig, Better Rendering Support -- Modern Font Support, Better Rendering Support -- Modern Font Support
@subsubsection Modern Font Support -- Font Concepts
In modern systems, displays are invariably @dfn{raster graphic devices},
@@ -28201,7 +28369,7 @@ Regular expression matching XLFD font na
-@node Modern Font Support -- Xft, , Modern Font Support -- fontconfig, Better Rendering Support -- Modern Font Support
+@node Modern Font Support -- Xft, , Modern Font Support -- fontconfig, Better Rendering Support -- Modern Font Support
@subsubsection Modern Font Support -- fontconfig
IIRC, we don't really provide any @file{Xft} APIs at the LISP level yet.
1.946 +33 -0 XEmacs/xemacs/src/ChangeLog
Index: ChangeLog
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/src/ChangeLog,v
retrieving revision 1.945
retrieving revision 1.946
diff -u -p -r1.945 -r1.946
--- ChangeLog 2006/04/22 15:18:54 1.945
+++ ChangeLog 2006/04/23 16:11:31 1.946
@@ -1,3 +1,36 @@
+2006-04-23 Stephen J. Turnbull <stephen(a)xemacs.org>
+
+ * Makefile.in.in (x_objs): Change xft-fonts.o to font-mgr.o.
+
+2006-04-17 Stephen J. Turnbull <stephen(a)xemacs.org>
+
+ * config.h.in: New symbol HAVE_FONTCONFIG.
+
+2006-04-22 Stephen J. Turnbull <stephen(a)xemacs.org>
+
+ Rename xft-fonts.{c,h} to font-mgr.{c,h}.
+
+ * font-mgr.c:
+ * emacs.c:
+ * symsinit.h:
+ (syms_of_font_mgr):
+ (vars_of_font_mgr):
+ (reinit_vars_of_font_mgr):
+ (complex_vars_of_font_mgr):
+ Renamed from *_xft_fonts versions.
+
+ * font-mgr.c:
+ * inline.c:
+ * objects-x.c:
+ Update #includes and comments to refer to font-mgr.h.
+ N.B. The feature provided by objects-x.c is still "xft-fonts",
+ which is separate from the font management by fontconfig (from
+ font-mgr.*).
+
+2006-04-15 Stephen J. Turnbull <stephen(a)xemacs.org>
+
+ * console-x.h (<X11/Xft/Xft.h>): Don't cater to Xft v.1.
+
2006-04-17 Stephen J. Turnbull <stephen(a)xemacs.org>
* unicode.c: Improve comment on to/from_unicode table design.
1.125 +1 -1 XEmacs/xemacs/src/Makefile.in.in
Index: Makefile.in.in
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/src/Makefile.in.in,v
retrieving revision 1.124
retrieving revision 1.125
diff -u -p -r1.124 -r1.125
--- Makefile.in.in 2006/02/27 16:29:21 1.124
+++ Makefile.in.in 2006/04/23 16:11:32 1.125
@@ -134,7 +134,7 @@ gui_objs += toolbar.o
x_objs=console-x.o device-x.o event-Xt.o frame-x.o \
glyphs-x.o objects-x.o redisplay-x.o select-x.o xgccache.o intl-x.o
#ifdef USE_XFT
-x_objs += xft-fonts.o
+x_objs += font-mgr.o
#endif
x_gui_objs=$(gui_objs:.o=-x.o)
#ifdef HAVE_TOOLBARS
1.108 +3 -0 XEmacs/xemacs/src/config.h.in
Index: config.h.in
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/src/config.h.in,v
retrieving revision 1.107
retrieving revision 1.108
diff -u -p -r1.107 -r1.108
--- config.h.in 2006/03/27 17:40:58 1.107
+++ config.h.in 2006/04/23 16:11:32 1.108
@@ -206,6 +206,9 @@ things are arranged in config.h.in. In
/* Compile in support for the X window system? */
#undef HAVE_X_WINDOWS
+/* Compile with support for fontconfig? */
+#undef HAVE_FONTCONFIG
+
/* Compile with support for Xft? */
#undef USE_XFT
/* Per-widget stuff will go away? */
1.23 +0 -4 XEmacs/xemacs/src/console-x.h
Index: console-x.h
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/src/console-x.h,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -p -r1.22 -r1.23
--- console-x.h 2005/11/26 11:46:07 1.22
+++ console-x.h 2006/04/23 16:11:32 1.23
@@ -58,10 +58,6 @@ Boston, MA 02111-1307, USA. */
#include <X11/Xft/Xft.h>
#undef glyph_index
#undef face_index
-/* #### this should be made gone */
-#ifndef XFT_VERSION
-#define XFT_VERSION 1
-#endif
#endif
/* R5 defines the XPointer type, but R4 doesn't.
1.165 +4 -4 XEmacs/xemacs/src/emacs.c
Index: emacs.c
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/src/emacs.c,v
retrieving revision 1.164
retrieving revision 1.165
diff -u -p -r1.164 -r1.165
--- emacs.c 2006/02/27 16:29:23 1.164
+++ emacs.c 2006/04/23 16:11:32 1.165
@@ -1620,7 +1620,7 @@ main_1 (int argc, Wexttext **argv, Wextt
#endif /* HAVE_XIM */
#ifdef USE_XFT
- syms_of_xft_fonts();
+ syms_of_font_mgr();
#endif
#endif /* HAVE_X_WINDOWS */
@@ -2205,7 +2205,7 @@ main_1 (int argc, Wexttext **argv, Wextt
#endif
#ifdef USE_XFT
- vars_of_xft_fonts ();
+ vars_of_font_mgr ();
#endif
#endif /* HAVE_X_WINDOWS */
@@ -2335,7 +2335,7 @@ main_1 (int argc, Wexttext **argv, Wextt
reinit_vars_of_gui_x ();
#endif
#ifdef USE_XFT
- reinit_vars_of_xft_fonts ();
+ reinit_vars_of_font_mgr ();
#endif
#endif /* HAVE_X_WINDOWS */
@@ -2407,7 +2407,7 @@ main_1 (int argc, Wexttext **argv, Wextt
#ifdef USE_XFT
/* This uses coding systems. Must be done before faces are init'ed. */
/* not in xft reloaded #3 */
- complex_vars_of_xft_fonts ();
+ complex_vars_of_font_mgr ();
#endif
/* Depends on specifiers. */
1.23 +1 -1 XEmacs/xemacs/src/inline.c
Index: inline.c
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/src/inline.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -p -r1.22 -r1.23
--- inline.c 2005/11/26 11:46:09 1.22
+++ inline.c 2006/04/23 16:11:33 1.23
@@ -101,7 +101,7 @@ Boston, MA 02111-1307, USA. */
#ifdef HAVE_X_WINDOWS
#include "glyphs-x.h"
#ifdef USE_XFT
-#include "xft-fonts.h"
+#include "font-mgr.h"
#endif
#endif
1.38 +2 -2 XEmacs/xemacs/src/objects-x.c
Index: objects-x.c
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/src/objects-x.c,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -p -r1.37 -r1.38
--- objects-x.c 2006/03/17 14:30:45 1.37
+++ objects-x.c 2006/04/23 16:11:33 1.38
@@ -39,7 +39,7 @@ Boston, MA 02111-1307, USA. */
#include "objects-x-impl.h"
#ifdef USE_XFT
-#include "xft-fonts.h"
+#include "font-mgr.h"
#endif
int x_handle_non_fully_specified_fonts;
@@ -206,7 +206,7 @@ x_color_list (void)
/************************************************************************/
#ifdef USE_XFT
-/* #### all these #defines should probably move to xft-fonts.h */
+/* #### all these #defines should probably move to font-mgr.h */
/*
The format of a fontname (as returned by fontconfig) is not well-documented,
1.56 +4 -4 XEmacs/xemacs/src/symsinit.h
Index: symsinit.h
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/src/symsinit.h,v
retrieving revision 1.55
retrieving revision 1.56
diff -u -p -r1.55 -r1.56
--- symsinit.h 2006/02/27 16:29:29 1.55
+++ symsinit.h 2006/04/23 16:11:33 1.56
@@ -160,7 +160,7 @@ void syms_of_objects (void);
void syms_of_objects_mswindows (void);
void syms_of_objects_tty (void);
void syms_of_objects_x (void);
-void syms_of_xft_fonts (void);
+void syms_of_font_mgr (void);
EXTERN_C void syms_of_postgresql (void);
void syms_of_print (void);
void syms_of_process (void);
@@ -398,8 +398,8 @@ void reinit_vars_of_mule_wnn (void);
void vars_of_nt (void);
void vars_of_number (void);
void vars_of_objects (void);
-void vars_of_xft_fonts (void);
-void reinit_vars_of_xft_fonts (void);
+void vars_of_font_mgr (void);
+void reinit_vars_of_font_mgr (void);
void reinit_vars_of_objects (void);
void vars_of_objects_tty (void);
void vars_of_objects_mswindows (void);
@@ -484,7 +484,7 @@ void complex_vars_of_emacs (void);
void complex_vars_of_minibuf (void);
void reinit_complex_vars_of_minibuf (void);
void complex_vars_of_keymap (void);
-void complex_vars_of_xft_fonts (void);
+void complex_vars_of_font_mgr (void);
/* Late initialization -- stuff pertaining only to interactive usage,
I/O, or Lisp reading. (Dump-time and run-time, but the code itself
1.1 XEmacs/xemacs/src/font-mgr.c
Index: font-mgr.c
===================================================================
/* Lisp font handling implementation for X with Xft.
Copyright (C) 2003 Eric Knauel and Matthias Neubauer
Copyright (C) 2005 Eric Knauel
Copyright (C) 2004, 2005 Free Software Foundation, Inc.
Authors: Eric Knauel <knauel(a)informatik.uni-tuebingen.de>
Matthias Neubauer <neubauer(a)informatik.uni-freiburg.de>
Stephen J. Turnbull <stephen(a)xemacs.org>
Created: 27 Oct 2003
Updated: 05 Mar 2005 by Stephen J. Turnbull
This file is part of XEmacs.
XEmacs is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
XEmacs is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with XEmacs; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* Synched up with: Not in GNU Emacs. */
/* This module provides the Lisp interface to fonts in X11, including Xft,
but (at least at first) not GTK+ or Qt.
It should be renamed to fonts-x.h.
Sealevel code should be in ../lwlib/lwlib-fonts.c or
../lwlib/lwlib-colors.c.
*/
#include <config.h>
#include "lisp.h"
#include "device.h"
#include "device-impl.h"
#include "console-x-impl.h"
#include "objects-x.h"
#include "objects-x-impl.h"
#include "hash.h"
#include "font-mgr.h"
/* #### TO DO ####
. The "x-xft-*" and "x_xft_*" nomenclature is mostly redundant, especially
if we separate X fonts from Xft fonts, and use fontconfig more generally.
. We should support the most recent Xft first, old Xft libraries later.
. We may (think about it) wish to use fontconfig generally, even if we're
not using Xft. Either way, names that are really from fontconfig should
use the Fc* namespace.
. Mule-ize this file.
. Separate X Font Struct ops from Xft Font ops; give precedence to Xft but
allow fallback to X.
. Push decisions about font choice, defaults, fallbacks to Lisp; if we
really need efficiency, can reimplement in C later.
. Implement symbols interned in this file in the Q* namespace.
. Implement FcMatrix (Lisp vector).
. Implement FcCharSets (Lisp chartable? For implementation hints, see
FcCharSetFirstPage and FcCharSetNextPage).
. Implement FcConfigs.
DONE
. Fontconfig fontnames are encoded in UTF-8.
*/
Lisp_Object Qxft_font;
Lisp_Object Qfc_patternp;
Lisp_Object Qfc_fontsetp;
/* Lisp_Object Qfc_result_match; */ /* FcResultMatch */
Lisp_Object Qfc_result_type_mismatch; /* FcResultTypeMismatch */
Lisp_Object Qfc_result_no_match; /* FcResultNoMatch */
Lisp_Object Qfc_result_no_id; /* FcResultNoId */
Lisp_Object Qfc_internal_error;
Lisp_Object Vxlfd_font_name_regexp; /* #### Really needed? */
Lisp_Object Vxft_version;
/* Lisp_Object Vfc_version; */ /* #### Should have this, too! */
Fixnum debug_xft; /* Set to 1 enables lots of obnoxious messages.
Setting it to 2 or 3 enables even more. */
/****************************************************************
* FcPattern objects *
****************************************************************/
static void
finalize_fc_pattern (void *header, int UNUSED (for_disksave))
{
struct fc_pattern *p = (struct fc_pattern *) header;
if (p->fcpatPtr)
{
FcPatternDestroy (p->fcpatPtr);
p->fcpatPtr = 0;
}
}
static const struct memory_description fcpattern_description [] = {
/* #### nothing here, is this right?? */
{ XD_END }
};
DEFINE_LRECORD_IMPLEMENTATION("fc-pattern", fc_pattern,
0, 0, 0, finalize_fc_pattern, 0, 0,
fcpattern_description,
struct fc_pattern);
/*
* Helper Functions
*/
static Lisp_Object make_xlfd_font_regexp (void);
static void string_list_to_fcobjectset (Lisp_Object list, FcObjectSet *os);
/*
extract the C representation of the Lisp string STR and convert it
to the encoding used by the Fontconfig API for property and font
names. I suppose that Qnative is the right encoding, the manual
doesn't say much about this topic. This functions assumes that STR
is a Lisp string.
*/
#define extract_fcapi_string(str) \
((FcChar8 *) NEW_LISP_STRING_TO_EXTERNAL ((str), Qnative))
/* fontconfig assumes that objects (property names) are statically allocated,
and you will get bizarre results if you pass Lisp string data or strings
allocated on the stack as objects. fontconfig _does_ copy values, so we
(I hope) don't have to worry about that member.
Probably these functions don't get called so often that the memory leak
due to strdup'ing every time we add a property would matter, but XEmacs
_is_ a long-running process. So we hash them.
I suspect that using symbol names or even keywords does not provide
assurance that the string won't move in memory. So we hash them
ourselves; hash.c hashtables do not interpret the value pointers. */
static FcChar8 *fc_standard_properties[] = {
"antialias", "aspect", "autohint", "charset", "dpi", "family", "file",
"foundry", "ftface", "globaladvance", "hinting", "index", "lang",
"minspace", "outline", "pixelsize", "rasterizer", "rgba", "scalable",
"scale", "size", "slant", "spacing", "style", "verticallayout", "weight",
/* obsolete after Xft v. 1 */
"charwidth", "charheight", "core", "encoding", "render"
};
static struct hash_table *fc_property_name_hash_table;
/* #### Maybe fc_intern should be exposed to LISP? The idea is that
fc-pattern-add could warn or error if the property isn't interned. */
static FcChar8 *
fc_intern (Lisp_Object property)
{
const void *dummy;
FcChar8 *prop = extract_fcapi_string (property);
const void *val = gethash (prop, fc_property_name_hash_table, &dummy);
/* extract_fcapi_string returns something alloca'd
so we can just drop the old value of prop on the floor */
if (val)
prop = (FcChar8 *) val;
else
{
prop = FcStrCopy (prop);
puthash (prop, NULL, fc_property_name_hash_table);
}
return prop;
}
DEFUN("fc-pattern-p", Ffc_pattern_p, 1, 1, 0, /*
Returns t if OBJECT is of type fc-pattern, nil otherwise.
*/
(object))
{
return FCPATTERNP(object) ? Qt : Qnil;
}
DEFUN("fc-pattern-create", Ffc_pattern_create, 0, 0, 0, /*
Return a new, empty fc-pattern object.
*/
())
{
fc_pattern *fcpat =
ALLOC_LCRECORD_TYPE (struct fc_pattern, &lrecord_fc_pattern);
fcpat->fcpatPtr = FcPatternCreate();
return wrap_fcpattern(fcpat);
}
DEFUN("fc-name-parse", Ffc_name_parse, 1, 1, 0, /*
Parse an Fc font name and return its representation as a fc pattern object.
*/
(name))
{
struct fc_pattern *fcpat =
ALLOC_LCRECORD_TYPE (struct fc_pattern, &lrecord_fc_pattern);
CHECK_STRING(name); /* #### MEMORY LEAK!! maybe not ... */
fcpat->fcpatPtr = FcNameParse (extract_fcapi_string (name));
return wrap_fcpattern(fcpat);
}
/* #### Ga-a-ack! Xft's similar function is actually a different API.
We provide both. */
DEFUN("fc-name-unparse", Ffc_name_unparse, 1, 1, 0, /*
Unparse an fc pattern object to a string.
*/
(pattern))
{
CHECK_FCPATTERN(pattern);
{
FcChar8 *temp = FcNameUnparse(XFCPATTERN_PTR(pattern));
Lisp_Object res = build_ext_string (temp, Qxft_font_name_encoding);
free (temp);
return res;
}
}
DEFUN("fc-pattern-duplicate", Ffc_pattern_duplicate, 1, 1, 0, /*
Make a copy of the fc pattern object PATTERN and return it.
*/
(pattern))
{
struct fc_pattern *copy = NULL;
CHECK_FCPATTERN(pattern);
copy = ALLOC_LCRECORD_TYPE (struct fc_pattern, &lrecord_fc_pattern);
copy->fcpatPtr = FcPatternDuplicate(XFCPATTERN_PTR(pattern));
return wrap_fcpattern(copy);
}
DEFUN("fc-pattern-add", Ffc_pattern_add, 3, 3, 0, /*
Add attributes to the pattern object PATTERN. PROPERTY is a string naming
the attribute to add, VALUE the value for this attribute.
VALUE may be a string, integer, float, or symbol, in which case the value
will be added as an FcChar8[], int, double, or FcBool respectively.
*/
(pattern, property, value))
{
Bool res = 0;
Extbyte *obj;
FcPattern *fcpat;
CHECK_FCPATTERN(pattern);
CHECK_STRING(property);
obj = fc_intern (property);
fcpat = XFCPATTERN_PTR (pattern);
if (STRINGP(value))
{
FcChar8 *str = (FcChar8 *) extract_fcapi_string (value);
res = FcPatternAddString (fcpat, obj, str);
}
else if (INTP(value))
{
res = FcPatternAddInteger (fcpat, obj, XINT(value));
}
else if (FLOATP(value))
{
res = FcPatternAddDouble (fcpat, obj, (double) XFLOAT_DATA(value));
}
else if (SYMBOLP(value))
{
res = FcPatternAddBool (fcpat, obj, !NILP(value));
}
/* else ... maybe we should wta here? */
return res ? Qt : Qnil;
}
DEFUN("fc-pattern-del", Ffc_pattern_del, 2, 2, 0, /*
Remove attribute PROPERTY from fc pattern object OBJECT.
*/
(pattern, property))
{
Bool res;
CHECK_FCPATTERN(pattern);
CHECK_STRING(property);
res = FcPatternDel(XFCPATTERN_PTR(pattern),
extract_fcapi_string (property));
return res ? Qt : Qnil;
}
/* Generic interface to FcPatternGet()
* Don't support the losing symbol-for-property interface.
*/
DEFUN("fc-pattern-get", Ffc_pattern_get, 2, 4, 0, /*
>From PATTERN, extract PROPERTY for the ID'th member, of type TYPE.
PATTERN is an Xft (fontconfig) pattern object.
PROPERTY is a string naming an fontconfig font property.
Optional ID is a nonnegative integer indexing the list of values for PROPERTY
stored in PATTERN, defaulting to 0 (the first value).
Optional TYPE is a symbol, one of 'string, 'boolean, 'integer, 'float,
'double, 'matrix, 'charset, or 'void, corresponding to the FcValue types.
('float is an alias for 'double).
The Lisp types returned will conform to TYPE:
string string
boolean `t' or `nil'
integer integer
double (float) float
matrix not implemented
charset not implemented
void not implemented
Symbols with names of the form "fc-result-DESCRIPTION" are returned when
the desired value is not available. These are
fc-result-type-mismatch the value found has an unexpected type
fc-result-no-match there is no such attribute
fc-result-no-id there is no value for the requested ID
The types of the following standard properties are predefined by fontconfig.
The symbol 'fc-result-type-mismatch will be returned if the object exists but
TYPE does not match the predefined type. It is best not to specify a type
for predefined properties, as a mistake here ensures error returns on the
correct type.
Each standard property has a convenience accessor defined in fontconfig.el,
named in the form "fc-pattern-get-PROPERTY". The convenience functions are
preferred to `fc-pattern-get' since a typo in the string naming a property
will result in a silent null return, while a typo in a function name will
usually result in a compiler or runtime \"not fboundp\" error. You may use
`defsubst' to define convenience functions for non-standard properties.
family String Font family name
style String Font style. Overrides weight and slant
slant Int Italic, oblique or roman
weight Int Light, medium, demibold, bold or black
size Double Point size
aspect Double Stretches glyphs horizontally before hinting
pixelsize Double Pixel size
spacing Int Proportional, monospace or charcell
foundry String Font foundry name
antialias Bool Whether glyphs can be antialiased
hinting Bool Whether the rasterizer should use hinting
verticallayout Bool Use vertical layout
autohint Bool Use autohinter instead of normal hinter
globaladvance Bool Use font global advance data
file String The filename holding the font
index Int The index of the font within the file
ftface FT_Face Use the specified FreeType face object
rasterizer String Which rasterizer is in use
outline Bool Whether the glyphs are outlines
scalable Bool Whether glyphs can be scaled
scale Double Scale factor for point->pixel conversions
dpi Double Target dots per inch
rgba Int unknown, rgb, bgr, vrgb, vbgr, none - subpixel geometry
minspace Bool Eliminate leading from line spacing
charset CharSet Unicode chars encoded by the font
lang String List of RFC-3066-style languages this font supports
The FT_Face, Matrix, CharSet types are unimplemented, so the corresponding
properties are not accessible from Lisp at this time. If the value of a
property returned has type FT_Face, FcCharSet, or FcMatrix,
`fc-result-type-mismatch' is returned.
The following properties which were standard in Xft v.1 are obsolete in
Xft v.2: encoding, charwidth, charheight, core, and render. */
(pattern, property, id, type))
{
FcChar8 *fc_property; /* UExtbyte * */
FcResult fc_result;
FcValue fc_value;
/*
process arguments
*/
CHECK_FCPATTERN (pattern);
#if 0
/* Don't support the losing symbol-for-property interface. */
property = SYMBOLP (property) ? symbol_name (XSYMBOL (property)) : property;
#endif
if (STRINGP (property))
{
fc_property = (FcChar8 *) extract_fcapi_string (property);
}
else
{
/* if we allow symbols, this would need to be
list3 (Qlambda, list1 (Qobject),
list3 (Qor, list2 (Qstringp, Qobject),
list2 (Qsymbolp, Qobject)))
or something like that? */
dead_wrong_type_argument (Qstringp, property);
}
if (!NILP (id)) CHECK_NATNUM (id);
if (!NILP (type)) CHECK_SYMBOL (type);
/* get property */
fc_result = FcPatternGet (XFCPATTERN_PTR (pattern),
fc_property,
NILP (id) ? 0 : XINT(id),
&fc_value);
switch (fc_result)
{
case FcResultMatch:
/* wrap it and return */
switch (fc_value.type)
{
case FcTypeInteger:
return ((!NILP (type) && !EQ (type, Qinteger))
? Qfc_result_type_mismatch : make_int (fc_value.u.i));
case FcTypeDouble:
return ((!NILP (type) && !EQ (type, intern ("double"))
&& !EQ (type, Qfloat))
? Qfc_result_type_mismatch : make_float (fc_value.u.d));
case FcTypeString:
return ((!NILP (type) && !EQ (type, Qstring))
? Qfc_result_type_mismatch
: build_ext_string (fc_value.u.s, Qxft_font_name_encoding));
case FcTypeBool:
return ((!NILP (type) && !EQ (type, Qboolean))
? Qfc_result_type_mismatch : fc_value.u.b ? Qt : Qnil);
case FcTypeMatrix:
return Qfc_result_type_mismatch;
/* #### unimplemented
return ((!NILP (type) && !EQ (type, intern ("matrix")))
? Qfc_result_type_mismatch : make_int (fc_value.u.m));
*/
case FcTypeCharSet:
return Qfc_result_type_mismatch;
/* #### unimplemented
return ((!NILP (type) && !EQ (type, intern ("charset")))
? Qfc_result_type_mismatch : make_int (fc_value.u.c));
*/
}
case FcResultTypeMismatch:
return Qfc_result_type_mismatch;
case FcResultNoMatch:
return Qfc_result_no_match;
case FcResultNoId:
return Qfc_result_no_id;
default:
return Qfc_internal_error;
}
}
DEFUN("fc-font-match", Ffc_font_match, 2, 2, 0, /*
Return the font on DEVICE that most closely matches PATTERN.
DEVICE is an X11 device.
PATTERN is a fontconfig pattern object.
Returns a fontconfig pattern object representing the closest match to the
given pattern, or an error code. Possible error codes are
`fc-result-no-match' and `fc-result-no-id'. */
(device, pattern))
{
Display *dpy;
FcResult res;
struct fc_pattern *res_fcpat =
ALLOC_LCRECORD_TYPE (struct fc_pattern, &lrecord_fc_pattern);
CHECK_FCPATTERN(pattern); /* #### MEMORY LEAKS!!! */
if (NILP(device))
return Qnil;
CHECK_X_DEVICE(device);
if (!DEVICE_LIVE_P(XDEVICE(device)))
return Qnil;
dpy = DEVICE_X_DISPLAY(XDEVICE(device));
/* More Xft vs fontconfig brain damage? */
res_fcpat->fcpatPtr = XftFontMatch(dpy, DefaultScreen (dpy),
XFCPATTERN_PTR(pattern), &res);
if (res_fcpat->fcpatPtr == NULL)
switch (res) {
case FcResultNoMatch:
return Qfc_result_no_match;
case FcResultNoId:
return Qfc_result_no_id;
default:
return Qfc_internal_error;
}
else
return wrap_fcpattern(res_fcpat);
}
/* NOTE NOTE NOTE This function destroys the FcFontSet passed to it. */
static Lisp_Object
fontset_to_list (FcFontSet *fontset)
{
int idx;
Lisp_Object fontlist = Qnil;
fc_pattern *fcpat;
/* #### improve this error message */
if (!fontset)
Fsignal (Qinvalid_state,
list1 (build_string ("failed to create FcFontSet")));
for (idx = 0; idx < fontset->nfont; ++idx)
{
fcpat =
ALLOC_LCRECORD_TYPE (struct fc_pattern, &lrecord_fc_pattern);
fcpat->fcpatPtr = FcPatternDuplicate (fontset->fonts[idx]);
fontlist = Fcons (wrap_fcpattern(fcpat), fontlist);
}
FcFontSetDestroy (fontset);
return fontlist;
}
/* #### fix this name to correspond to Ben's new nomenclature */
DEFUN("fc-list-fonts-pattern-objects", Ffc_list_fonts_pattern_objects,
3, 3, 0, /*
Return a list of fonts on DEVICE that match PATTERN for PROPERTIES.
Each font is represented by a fontconfig pattern object.
DEVICE is an X11 device.
PATTERN is a fontconfig pattern to be matched.
PROPERTIES is a list of property names (strings) that should match.
#### DEVICE is unused, ignored, and may be removed if it's not needed to
match other font-listing APIs. */
(UNUSED (device), pattern, properties))
{
FcObjectSet *os;
FcFontSet *fontset;
CHECK_FCPATTERN (pattern);
CHECK_LIST (properties);
os = FcObjectSetCreate ();
string_list_to_fcobjectset (properties, os);
/* #### why don't we need to do the "usual substitutions"? */
fontset = FcFontList (NULL, XFCPATTERN_PTR (pattern), os);
FcObjectSetDestroy (os);
return fontset_to_list (fontset);
}
/* #### maybe this can/should be folded into fc-list-fonts-pattern-objects? */
DEFUN("fc-font-sort", Ffc_font_sort, 2, 4, 0, /*
Return a list of all fonts sorted by proximity to PATTERN.
Each font is represented by a fontconfig pattern object.
DEVICE is an X11 device.
PATTERN is a fontconfig pattern to be matched.
Optional argument TRIM, if non-nil, means to trim trailing fonts that do not
contribute new characters to the union repertoire.
#### Optional argument NOSUB, if non-nil, suppresses some of the usual
property substitutions. DON'T USE THIS in production code, it is intended
for exploring behavior of fontconfig and will be removed when this code is
stable.
#### DEVICE is unused, ignored, and may be removed if it's not needed to
match other font-listing APIs. */
(UNUSED (device), pattern, trim, nosub))
{
CHECK_FCPATTERN (pattern);
{
FcConfig *fcc = FcConfigGetCurrent();
FcFontSet *fontset;
FcPattern *p = XFCPATTERN_PTR (pattern);
FcResult fcresult;
if (NILP(nosub)) /* #### temporary debug hack */
FcDefaultSubstitute (p);
FcConfigSubstitute (fcc, p, FcMatchPattern);
fontset = FcFontSort (fcc, p, !NILP(trim), NULL, &fcresult);
return fontset_to_list (fontset);
}
}
/* #### this actually is an Xft function, should split those out
or get rid of them entirely? */
/* #### be consistent about argument order. */
DEFUN("fc-font-real-pattern", Ffc_font_real_pattern, 2, 2, 0, /*
Temporarily open FONTNAME (a string) and return the actual
fc pattern matched by the Fc library. */
(fontname, xdevice))
{
FcPattern *copy;
Display *dpy;
XftFont *font;
struct fc_pattern *fcpat =
ALLOC_LCRECORD_TYPE (struct fc_pattern, &lrecord_fc_pattern);
CHECK_STRING (fontname); /* #### MEMORY LEAK?! maybe not ... */
if (NILP(xdevice))
return Qnil;
CHECK_X_DEVICE (xdevice);
if (!DEVICE_LIVE_P(XDEVICE(xdevice)))
return Qnil;
/* #### these gymnastics should be unnecessary, just use FcFontMatch */
dpy = DEVICE_X_DISPLAY (XDEVICE (xdevice));
font = XftFontOpenName (dpy, DefaultScreen(dpy),
extract_fcapi_string (fontname));
if (font == NULL)
return Qnil;
copy = FcPatternDuplicate(font->pattern);
XftFontClose(dpy, font);
if (copy == NULL)
return Qnil;
fcpat->fcpatPtr = copy;
return wrap_fcpattern(fcpat);
}
DEFUN("xlfd-font-name-p", Fxlfd_font_name_p, 1, 1, 0, /*
Check whether the string FONTNAME is a XLFD font name. */
(fontname))
{
CHECK_STRING(fontname);
/* #### should bind `case-fold-search' here? */
return Fstring_match(Vxlfd_font_name_regexp, fontname, Qnil, Qnil);
}
/* FcPatternPrint: there is no point in having wrappers fc-pattern-print,
Ffc_pattern_print since this function prints to stdout. */
/* Initialization of font-mgr */
#define XE_XLFD_SEPARATOR "-"
/* XLFD specifies ISO 8859-1 encoding, but we can't handle non-ASCII
in Mule when this function is called. So use HPC. */
#if 0
#define XE_XLFD_PREFIX "\\(\\+[\040-\176\240-\377]*\\)?-"
#define XE_XLFD_OPT_TEXT "\\([\040-\044\046-\176\240-\377]*\\)"
#define XE_XLFD_TEXT "\\([\040-\044\046-\176\240-\377]+\\)"
#else
#define XE_XLFD_PREFIX "\\(\\+[\040-\176]*\\)?-"
#define XE_XLFD_OPT_TEXT "\\([^-]*\\)"
#define XE_XLFD_TEXT "\\([^-]+\\)"
#endif
#define XE_XLFD_SLANT "\\([0-9ior?*][iot]?\\)"
#define XE_XLFD_SPACING "\\([cmp?*]\\)"
/* Hyphen as minus conflicts with use as separator. */
#define XE_XLFD_OPT_NEGATE "~?"
#define XE_XLFD_NUMBER "\\([0-9?*]+\\)"
#define XE_XLFD_PSIZE "\\([0-9?*]+\\|\\[[ 0-9+~.e?*]+\\]\\)"
/* Call this only from the init code
#### This is really horrible, let's get rid of it, please. */
static Lisp_Object
make_xlfd_font_regexp (void)
{
struct gcpro gcpro1;
unsigned i;
Lisp_Object reg = Qnil;
const Extbyte *re[] = /* #### This could just be catenated by
cpp and passed to build_ext_string. */
{
/* Regular expression matching XLFDs as defined by XLFD v. 1.5.
Matches must be case-insensitive.
PSIZE is a pixel or point size, which may be a "matrix". The
syntax of a matrix is not checked, just some lexical properties.
AFAICT none of the TEXT fields except adstyle is optional.
NB. It should not be a problem if this matches "too much", since
an "old" server will simply not be able to find a matching font. */
"\\`",
XE_XLFD_PREFIX, /* prefix */
XE_XLFD_TEXT, /* foundry */
XE_XLFD_SEPARATOR,
XE_XLFD_TEXT, /* family */
XE_XLFD_SEPARATOR,
XE_XLFD_TEXT, /* weight */
XE_XLFD_SEPARATOR,
XE_XLFD_SLANT, /* slant */
XE_XLFD_SEPARATOR,
XE_XLFD_TEXT, /* swidth */
XE_XLFD_SEPARATOR,
XE_XLFD_OPT_TEXT, /* adstyle */
XE_XLFD_SEPARATOR,
XE_XLFD_PSIZE, /* pixelsize */
XE_XLFD_SEPARATOR,
XE_XLFD_PSIZE, /* pointsize */
XE_XLFD_SEPARATOR,
XE_XLFD_NUMBER, /* resx */
XE_XLFD_SEPARATOR,
XE_XLFD_NUMBER, /* resy */
XE_XLFD_SEPARATOR,
XE_XLFD_SPACING, /* spacing */
XE_XLFD_SEPARATOR,
XE_XLFD_OPT_NEGATE, /* avgwidth */
XE_XLFD_NUMBER,
XE_XLFD_SEPARATOR,
XE_XLFD_TEXT, /* registry */
XE_XLFD_SEPARATOR,
XE_XLFD_TEXT, /* encoding */
"\\'"
};
GCPRO1 (reg);
for (i = 0; i < sizeof(re)/sizeof(Extbyte *); i++)
{
/* #### Currently this is Host Portable Coding, not ISO 8859-1. */
reg = concat2(reg, build_ext_string (re[i], Qx_font_name_encoding));
}
RETURN_UNGCPRO (reg);
}
#undef XE_XLFD_SEPARATOR
#undef XE_XLFD_PREFIX
#undef XE_XLFD_OPT_TEXT
#undef XE_XLFD_TEXT
#undef XE_XLFD_OPT_SLANT
#undef XE_XLFD_OPT_SPACING
#undef XE_XLFD_OPT_NEGATE
#undef XE_XLFD_NUMBER
#undef XE_XLFD_PSIZE
#define MINL(x,y) ((((unsigned long) (x)) < ((unsigned long) (y))) \
? ((unsigned long) (x)) : ((unsigned long) (y)))
static void
string_list_to_fcobjectset (Lisp_Object list, FcObjectSet *os)
{
EXTERNAL_LIST_LOOP_2 (elt, list)
{
FcChar8 *s;
CHECK_STRING (elt);
s = fc_intern (elt);
fprintf (stderr, "%s\n", s);
FcObjectSetAdd (os, s);
}
}
void
syms_of_font_mgr (void)
{
INIT_LRECORD_IMPLEMENTATION(fc_pattern);
DEFSYMBOL_MULTIWORD_PREDICATE(Qfc_patternp);
DEFSYMBOL(Qfc_result_type_mismatch);
DEFSYMBOL(Qfc_result_no_match);
DEFSYMBOL(Qfc_result_no_id);
DEFSYMBOL(Qfc_internal_error);
DEFSYMBOL(Qxft_font);
DEFSUBR(Ffc_pattern_p);
DEFSUBR(Ffc_pattern_create);
DEFSUBR(Ffc_name_parse);
DEFSUBR(Ffc_name_unparse);
DEFSUBR(Ffc_pattern_duplicate);
DEFSUBR(Ffc_pattern_add);
DEFSUBR(Ffc_pattern_del);
DEFSUBR(Ffc_pattern_get);
DEFSUBR(Ffc_list_fonts_pattern_objects);
DEFSUBR(Ffc_font_sort);
DEFSUBR(Ffc_font_match);
DEFSUBR(Ffc_font_real_pattern);
DEFSUBR(Fxlfd_font_name_p);
}
void
vars_of_font_mgr (void)
{
/* #### These two variables need to go somewhere else. */
/* #### I know, but the right fix is use the generic debug facility. */
DEFVAR_INT ("xft-debug-level", &debug_xft /*
Level of debugging messages to issue to stderr for Xft.
A nonnegative integer. Set to 0 to suppress all warnings.
Default is 1 to ensure a minimum of debugging output at initialization.
Higher levels give even more information.
*/ );
debug_xft = 1;
DEFVAR_LISP("xft-version", &Vxft_version /*
The major version number of the Xft library being used.
*/ );
Vxft_version = make_int(XFT_VERSION);
Fprovide (intern ("xft"));
}
void
complex_vars_of_font_mgr (void)
{
DEFVAR_LISP("xft-xlfd-font-regexp", &Vxlfd_font_name_regexp /*
The regular expression used to match XLFD font names. */
);
Vxlfd_font_name_regexp = make_xlfd_font_regexp();
}
void
reinit_vars_of_font_mgr (void)
{
int i, size = (int) countof (fc_standard_properties);
FcInit ();
fc_property_name_hash_table = make_string_hash_table (size);
for (i = 0; i < size; ++i)
puthash (fc_standard_properties[i], NULL, fc_property_name_hash_table);
}
1.1 XEmacs/xemacs/src/font-mgr.h
Index: font-mgr.h
===================================================================
/* Lisp font data structures for X and Xft.
Copyright (C) 2003 Eric Knauel and Matthias Neubauer
Copyright (C) 2005 Eric Knauel
Copyright (C) 2004, 2005 Free Software Foundation, Inc.
Authors: Eric Knauel <knauel(a)informatik.uni-tuebingen.de>
Matthias Neubauer <neubauer(a)informatik.uni-freiburg.de>
Stephen J. Turnbull <stephen(a)xemacs.org>
Created: 27 Oct 2003
Updated: 05 Mar 2005 by Stephen J. Turnbull
This file is part of XEmacs.
XEmacs is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
XEmacs is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with XEmacs; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* Synched up with: Not in GNU Emacs. */
/* This module provides the Lisp interface to fonts in X11, including Xft,
but (at least at first) not GTK+ or Qt.
It should be renamed to fonts-x.h.
Sealevel code should be in ../lwlib/lwlib-fonts.h or
../lwlib/lwlib-colors.h.
*/
#ifndef INCLUDED_font_mgr_h_
#define INCLUDED_font_mgr_h_
#include "../lwlib/lwlib-fonts.h"
#include "../lwlib/lwlib-colors.h"
extern Fixnum debug_xft;
/* Standard for fontconfig. Use a macro to show we're not guessing. */
#define Qxft_font_name_encoding Qutf_8
#define XE_XLFD_MAKE_LISP_STRING(s) (make_string(s, strlen(s)))
struct fc_pattern
{
struct LCRECORD_HEADER header;
FcPattern *fcpatPtr;
};
typedef struct fc_pattern fc_pattern;
DECLARE_LRECORD(fc_pattern, struct fc_pattern);
#define XFCPATTERN(x) XRECORD (x, fc_pattern, struct fc_pattern)
#define wrap_fcpattern(p) wrap_record (p, fc_pattern)
#define FCPATTERNP(x) RECORDP (x, fc_pattern)
#define CHECK_FCPATTERN(x) CHECK_RECORD (x, fc_pattern)
#define CONCHECK_FCPATTERN(x) CONCHECK_RECORD (x, fc_pattern)
#define XFCPATTERN_PTR(x) (XFCPATTERN(x)->fcpatPtr)
#endif /* INCLUDED_font_mgr_h_ */