Mercurial > hg > xemacs-beta
diff man/lispref/faces.texi @ 428:3ecd8885ac67 r21-2-22
Import from CVS: tag r21-2-22
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:28:15 +0200 |
parents | |
children | 8de8e3f6228a |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/lispref/faces.texi Mon Aug 13 11:28:15 2007 +0200 @@ -0,0 +1,686 @@ +@c -*-texinfo-*- +@c This is part of the XEmacs Lisp Reference Manual. +@c Copyright (C) 1995 Ben Wing. +@c See the file lispref.texi for copying conditions. +@setfilename ../../info/faces.info +@node Faces and Window-System Objects, Glyphs, Specifiers, top +@chapter Faces and Window-System Objects +@cindex faces +@cindex window-system objects + +@menu +* Faces:: Controlling the way text looks. +* Fonts:: Controlling the typeface of text. +* Colors:: Controlling the color of text and pixmaps. +@end menu + +@node Faces +@section Faces + +A @dfn{face} is a named collection of graphical properties: font, +foreground color, background color, background pixmap, optional +underlining, and (on TTY devices) whether the text is to be highlighted, +dimmed, blinking, or displayed in reverse video. Faces control the +display of text on the screen. Every face has a name, which is a symbol +such as @code{default} or @code{modeline}. + +Each built-in property of a face is controlled using a specifier, +which allows it to have separate values in particular buffers, frames, +windows, and devices and to further vary according to device type +(X or TTY) and device class (color, mono, or grayscale). +@xref{Specifiers}, for more information. + +The face named @code{default} is used for ordinary text. The face named +@code{modeline} is used for displaying the modeline. The face named +@code{highlight} is used for highlighted extents (@pxref{Extents}). The +faces named @code{left-margin} and @code{right-margin} are used for the +left and right margin areas, respectively (@pxref{Annotations}). The +face named @code{zmacs-region} is used for the highlighted region +between point and mark. + + +@menu +* Merging Faces:: How XEmacs decides which face to use + for a character. +* Basic Face Functions:: How to define and examine faces. +* Face Properties:: How to access and modify a face's properties. +* Face Convenience Functions:: Convenience functions for accessing + particular properties of a face. +* Other Face Display Functions:: Other functions pertaining to how a + a face appears. +@end menu + +@node Merging Faces +@subsection Merging Faces for Display + + Here are all the ways to specify which face to use for display of text: + +@itemize @bullet +@item +With defaults. Each frame has a @dfn{default face}, which is used for +all text that doesn't somehow specify another face. The face named +@code{default} applies to the text area, while the faces +@code{left-margin} and @code{right-margin} apply to the left and right +margin areas. + +@item +With text properties. A character may have a @code{face} property; if so, +it's displayed with that face. (Text properties are actually implemented +in terms of extents.) @xref{Text Properties}. + +@item +With extents. An extent may have a @code{face} property, which applies +to all the text covered by the extent; in addition, if the +@code{highlight} property is set, the @code{highlight} property applies +when the mouse moves over the extent or if the extent is explicitly +highlighted. @xref{Extents}. + +@item +With annotations. Annotations that are inserted into a buffer can specify +their own face. (Annotations are actually implemented in terms of extents.) +@xref{Annotations}. +@end itemize + + If these various sources together specify more than one face for a +particular character, XEmacs merges the properties of the various faces +specified. Extents, text properties, and annotations all use the same +underlying representation (as extents). When multiple extents cover one +character, an extent with higher priority overrides those with lower +priority. @xref{Extents}. If no extent covers a particular character, +the @code{default} face is used. + +@cindex background pixmap + If a background pixmap is specified, it determines what will be +displayed in the background of text characters. If the background +pixmap is actually a pixmap, with its colors specified, those colors are +used; if it is a bitmap, the face's foreground and background colors are +used to color it. + +@node Basic Face Functions +@subsection Basic Functions for Working with Faces + + The properties a face can specify include the font, the foreground +color, the background color, the background pixmap, the underlining, +the display table, and (for TTY devices) whether the text is to be +highlighted, dimmed, blinking, or displayed in reverse video. +The face can also leave these unspecified, causing them to assume the +value of the corresponding property of the @code{default} face. + + Here are the basic primitives for working with faces. + +@defun make-face name &optional doc-string temporary +This function defines and returns a new face named @var{name}, initially +with all properties unspecified. It does nothing if there is already a +face named @var{name}. Optional argument @var{doc-string} specifies +an explanatory string used for descriptive purposes. If optional +argument @var{temporary} is non-@code{nil}, the face will automatically +disappear when there are no more references to it anywhere in text or +Lisp code (otherwise, the face will continue to exist indefinitely +even if it is not used). +@end defun + +@defun face-list &optional temporary +This function returns a list of the names of all defined faces. If +@var{temporary} is @code{nil}, only the permanent faces are included. +If it is @code{t}, only the temporary faces are included. If it is any +other non-@code{nil} value both permanent and temporary are included. +@end defun + +@defun facep object +This function returns whether the given object is a face. +@end defun + +@defun copy-face old-face new-name &optional locale how-to-add +This function defines a new face named @var{new-name} which is a copy of +the existing face named @var{old-face}. If there is already a face +named @var{new-name}, then it alters the face to have the same +properties as @var{old-face}. @var{locale} and @var{how-to-add} +let you copy just parts of the old face rather than the whole face, +and are as in @code{copy-specifier} (@pxref{Specifiers}). +@end defun + +@node Face Properties +@subsection Face Properties + + You can examine and modify the properties of an existing face with the +following functions. + +The following symbols have predefined meanings: + +@table @code +@item foreground +The foreground color of the face. + +@item background +The background color of the face. + +@item font +The font used to display text covered by this face. + +@item display-table +The display table of the face. + +@item background-pixmap +The pixmap displayed in the background of the face. Only used by faces +on X devices. + +@item underline +Underline all text covered by this face. + +@item highlight +Highlight all text covered by this face. Only used by faces on TTY +devices. + +@item dim +Dim all text covered by this face. Only used by faces on TTY devices. + +@item blinking +Blink all text covered by this face. Only used by faces on TTY devices. + +@item reverse +Reverse the foreground and background colors. Only used by faces on TTY +devices. + +@item doc-string +Description of what the face's normal use is. NOTE: This is not a +specifier, unlike all the other built-in properties, and cannot contain +locale-specific values. +@end table + +@defun set-face-property face property value &optional locale tag how-to-add +This function changes a property of a @var{face}. + +For built-in properties, the actual value of the property is a specifier +and you cannot change this; but you can change the specifications within +the specifier, and that is what this function will do. For user-defined +properties, you can use this function to either change the actual value +of the property or, if this value is a specifier, change the +specifications within it. + +If @var{property} is a built-in property, the specifications to be added +to this property can be supplied in many different ways: + +@itemize @bullet +If @var{value} is a simple instantiator (e.g. a string naming a font or +color) or a list of instantiators, then the instantiator(s) will be +added as a specification of the property for the given @var{locale} +(which defaults to @code{global} if omitted). + +If @var{value} is a list of specifications (each of which is a cons of a +locale and a list of instantiators), then @var{locale} must be +@code{nil} (it does not make sense to explicitly specify a locale in +this case), and specifications will be added as given. + +If @var{value} is a specifier (as would be returned by +@code{face-property} if no @var{locale} argument is given), then some or +all of the specifications in the specifier will be added to the +property. In this case, the function is really equivalent to +@code{copy-specifier} and @var{locale} has the same semantics (if it is +a particular locale, the specification for the locale will be copied; if +a locale type, specifications for all locales of that type will be +copied; if @code{nil} or @code{all}, then all specifications will be +copied). +@end itemize + +@var{how-to-add} should be either @code{nil} or one of the symbols +@code{prepend}, @code{append}, @code{remove-tag-set-prepend}, +@code{remove-tag-set-append}, @code{remove-locale}, +@code{remove-locale-type}, or @code{remove-all}. See +@code{copy-specifier} and @code{add-spec-to-specifier} for a description +of what each of these means. Most of the time, you do not need to worry +about this argument; the default behavior usually is fine. + +In general, it is OK to pass an instance object (e.g. as returned by +@code{face-property-instance}) as an instantiator in place of an actual +instantiator. In such a case, the instantiator used to create that +instance object will be used (for example, if you set a font-instance +object as the value of the @code{font} property, then the font name used +to create that object will be used instead). If some cases, however, +doing this conversion does not make sense, and this will be noted in the +documentation for particular types of instance objects. + +If @var{property} is not a built-in property, then this function will +simply set its value if @var{locale} is @code{nil}. However, if +@var{locale} is given, then this function will attempt to add +@var{value} as the instantiator for the given @var{locale}, using +@code{add-spec-to-specifier}. If the value of the property is not a +specifier, it will automatically be converted into a @code{generic} +specifier. +@end defun + +@defun face-property face property &optional locale +This function returns @var{face}'s value of the given @var{property}. + +If @var{locale} is omitted, the @var{face}'s actual value for +@var{property} will be returned. For built-in properties, this will be +a specifier object of a type appropriate to the property (e.g. a font or +color specifier). For other properties, this could be anything. + +If @var{locale} is supplied, then instead of returning the actual value, +the specification(s) for the given locale or locale type will be +returned. This will only work if the actual value of @var{property} is +a specifier (this will always be the case for built-in properties, but +not or not may apply to user-defined properties). If the actual value +of @var{property} is not a specifier, this value will simply be returned +regardless of @var{locale}. + +The return value will be a list of instantiators (e.g. strings +specifying a font or color name), or a list of specifications, each of +which is a cons of a locale and a list of instantiators. Specifically, +if @var{locale} is a particular locale (a buffer, window, frame, device, +or @code{global}), a list of instantiators for that locale will be +returned. Otherwise, if @var{locale} is a locale type (one of the +symbols @code{buffer}, @code{window}, @code{frame}, or @code{device}), +the specifications for all locales of that type will be returned. +Finally, if @var{locale} is @code{all}, the specifications for all +locales of all types will be returned. + +The specifications in a specifier determine what the value of +@var{property} will be in a particular @dfn{domain} or set of +circumstances, which is typically a particular Emacs window along with +the buffer it contains and the frame and device it lies within. The +value is derived from the instantiator associated with the most specific +locale (in the order buffer, window, frame, device, and @code{global}) +that matches the domain in question. In other words, given a domain +(i.e. an Emacs window, usually), the specifier for @var{property} will +first be searched for a specification whose locale is the buffer +contained within that window; then for a specification whose locale is +the window itself; then for a specification whose locale is the frame +that the window is contained within; etc. The first instantiator that +is valid for the domain (usually this means that the instantiator is +recognized by the device [i.e. the X server or TTY device] that the +domain is on). The function @code{face-property-instance} actually does +all this, and is used to determine how to display the face. +@end defun + +@defun face-property-instance face property &optional domain default no-fallback +This function returns the instance of @var{face}'s @var{property} in the +specified @var{domain}. + +Under most circumstances, @var{domain} will be a particular window, and +the returned instance describes how the specified property actually is +displayed for that window and the particular buffer in it. Note that +this may not be the same as how the property appears when the buffer is +displayed in a different window or frame, or how the property appears in +the same window if you switch to another buffer in that window; and in +those cases, the returned instance would be different. + +The returned instance will typically be a color-instance, font-instance, +or pixmap-instance object, and you can query it using the appropriate +object-specific functions. For example, you could use +@code{color-instance-rgb-components} to find out the RGB (red, green, +and blue) components of how the @code{background} property of the +@code{highlight} face is displayed in a particular window. The results +might be different from the results you would get for another window +(perhaps the user specified a different color for the frame that window +is on; or perhaps the same color was specified but the window is on a +different X server, and that X server has different RGB values for the +color from this one). + +@var{domain} defaults to the selected window if omitted. + +@var{domain} can be a frame or device, instead of a window. The value +returned for a such a domain is used in special circumstances when a +more specific domain does not apply; for example, a frame value might be +used for coloring a toolbar, which is conceptually attached to a frame +rather than a particular window. The value is also useful in +determining what the value would be for a particular window within the +frame or device, if it is not overridden by a more specific +specification. + +If @var{property} does not name a built-in property, its value will +simply be returned unless it is a specifier object, in which case it +will be instanced using @code{specifier-instance}. + +Optional arguments @var{default} and @var{no-fallback} are the same as +in @code{specifier-instance}. @xref{Specifiers}. +@end defun + +@node Face Convenience Functions +@subsection Face Convenience Functions + +@defun set-face-foreground face color &optional locale tag how-to-add +@defunx set-face-background face color &optional locale tag how-to-add +These functions set the foreground (respectively, background) color of +face @var{face} to @var{color}. The argument @var{color} should be a +string (the name of a color) or a color object as returned by +@code{make-color} (@pxref{Colors}). +@end defun + +@defun set-face-background-pixmap face pixmap &optional locale tag how-to-add +This function sets the background pixmap of face @var{face} to +@var{pixmap}. The argument @var{pixmap} should be a string (the name of +a bitmap or pixmap file; the directories listed in the variable +@code{x-bitmap-file-path} will be searched) or a glyph object as +returned by @code{make-glyph} (@pxref{Glyphs}). The argument may also +be a list of the form @code{(@var{width} @var{height} @var{data})} where +@var{width} and @var{height} are the size in pixels, and @var{data} is a +string, containing the raw bits of the bitmap. +@end defun + +@defun set-face-font face font &optional locale tag how-to-add +This function sets the font of face @var{face}. The argument @var{font} +should be a string or a font object as returned by @code{make-font} +(@pxref{Fonts}). +@end defun + +@defun set-face-underline-p face underline-p &optional locale tag how-to-add +This function sets the underline property of face @var{face}. +@end defun + +@defun face-foreground face &optional locale +@defunx face-background face &optional locale +These functions return the foreground (respectively, background) color +specifier of face @var{face}. +@xref{Colors}. +@end defun + +@defun face-background-pixmap face &optional locale +This function return the background-pixmap glyph object of face +@var{face}. +@end defun + +@defun face-font face &optional locale +This function returns the font specifier of face @var{face}. (Note: +This is not the same as the function @code{face-font} in FSF Emacs.) +@xref{Fonts}. +@end defun + +@defun face-font-name face &optional domain +This function returns the name of the font of face @var{face}, or +@code{nil} if it is unspecified. This is basically equivalent to +@code{(font-name (face-font @var{face}) @var{domain})} except that +it does not cause an error if @var{face}'s font is @code{nil}. (This +function is named @code{face-font} in FSF Emacs.) +@end defun + +@defun face-underline-p face &optional locale +This function returns the underline property of face @var{face}. +@end defun + +@defun face-foreground-instance face &optional domain +@defunx face-background-instance face &optional domain +These functions return the foreground (respectively, background) color +specifier of face @var{face}. +@xref{Colors}. +@end defun + +@defun face-background-pixmap-instance face &optional domain +This function return the background-pixmap glyph object of face +@var{face}. +@end defun + +@defun face-font-instance face &optional domain +This function returns the font specifier of face @var{face}. +@xref{Fonts}. +@end defun + +@node Other Face Display Functions +@subsection Other Face Display Functions + +@defun invert-face face &optional locale +Swap the foreground and background colors of face @var{face}. If the +face doesn't specify both foreground and background, then its foreground +and background are set to the default background and foreground. +@end defun + +@defun face-equal face1 face2 &optional domain +This returns @code{t} if the faces @var{face1} and @var{face2} will +display in the same way. @var{domain} is as in +@code{face-property-instance}. +@end defun + +@defun face-differs-from-default-p face &optional domain +This returns @code{t} if the face @var{face} displays differently from +the default face. @var{domain} is as in @code{face-property-instance}. +@end defun + +@node Fonts +@section Fonts +@cindex fonts + + This section describes how to work with font specifier and +font instance objects, which encapsulate fonts in the window system. + +@menu +* Font Specifiers:: Specifying how a font will appear. +* Font Instances:: What a font specifier gets instanced as. +* Font Instance Names:: The name of a font instance. +* Font Instance Size:: The size of a font instance. +* Font Instance Characteristics:: Display characteristics of font instances. +* Font Convenience Functions:: Convenience functions that automatically + instance and retrieve the properties + of a font specifier. +@end menu + +@node Font Specifiers +@subsection Font Specifiers + +@defun font-specifier-p object +This predicate returns @code{t} if @var{object} is a font specifier, and +@code{nil} otherwise. +@end defun + +@node Font Instances +@subsection Font Instances + +@defun font-instance-p object +This predicate returns @code{t} if @var{object} is a font instance, and +@code{nil} otherwise. +@end defun + +@defun make-font-instance name &optional device noerror +This function creates a new font-instance object of the specified name. +@var{device} specifies the device this object applies to and defaults to +the selected device. An error is signalled if the font is unknown or +cannot be allocated; however, if @var{noerror} is non-@code{nil}, +@code{nil} is simply returned in this case. + +The returned object is a normal, first-class lisp object. The way you +``deallocate'' the font is the way you deallocate any other lisp object: +you drop all pointers to it and allow it to be garbage collected. When +these objects are GCed, the underlying X data is deallocated as well. +@end defun + +@node Font Instance Names +@subsection Font Instance Names +@cindex font instance name +@cindex available fonts +@cindex fonts available + +@defun list-fonts pattern &optional device +This function returns a list of font names matching the given pattern. +@var{device} specifies which device to search for names, and defaults to +the currently selected device. +@end defun + +@defun font-instance-name font-instance +This function returns the name used to allocate @var{font-instance}. +@end defun + +@defun font-instance-truename font-instance +This function returns the canonical name of the given font instance. +Font names are patterns which may match any number of fonts, of which +the first found is used. This returns an unambiguous name for that font +(but not necessarily its only unambiguous name). +@end defun + +@node Font Instance Size +@subsection Font Instance Size +@cindex font instance size + +@defun x-font-size font +This function returns the nominal size of the given font. This is done +by parsing its name, so it's likely to lose. X fonts can be specified +(by the user) in either pixels or 10ths of points, and this returns the +first one it finds, so you have to decide which units the returned value +is measured in yourself ... +@end defun + +@defun x-find-larger-font font &optional device +This function loads a new, slightly larger version of the given font (or +font name). Returns the font if it succeeds, @code{nil} otherwise. If +scalable fonts are available, this returns a font which is 1 point +larger. Otherwise, it returns the next larger version of this font that +is defined. +@end defun + +@defun x-find-smaller-font font &optional device +This function loads a new, slightly smaller version of the given font +(or font name). Returns the font if it succeeds, @code{nil} otherwise. +If scalable fonts are available, this returns a font which is 1 point +smaller. Otherwise, it returns the next smaller version of this font +that is defined. +@end defun + +@node Font Instance Characteristics +@subsection Font Instance Characteristics +@cindex font instance characteristics +@cindex characteristics of font instances +@cindex bold +@cindex demibold +@cindex italic +@cindex oblique + +@defun font-instance-properties font +This function returns the properties (an alist or @code{nil}) of +@var{font-instance}. +@end defun + +@defun x-make-font-bold font &optional device +Given an X font specification, this attempts to make a ``bold'' font. +If it fails, it returns @code{nil}. +@end defun + +@defun x-make-font-unbold font &optional device +Given an X font specification, this attempts to make a non-bold font. +If it fails, it returns @code{nil}. +@end defun + +@defun x-make-font-italic font &optional device +Given an X font specification, this attempts to make an ``italic'' font. +If it fails, it returns @code{nil}. +@end defun + +@defun x-make-font-unitalic font &optional device +Given an X font specification, this attempts to make a non-italic font. +If it fails, it returns @code{nil}. +@end defun + +@defun x-make-font-bold-italic font &optional device +Given an X font specification, this attempts to make a ``bold-italic'' +font. If it fails, it returns @code{nil}. +@end defun + +@node Font Convenience Functions +@subsection Font Convenience Functions + +@defun font-name font &optional domain +This function returns the name of the @var{font} in the specified +@var{domain}, if any. @var{font} should be a font specifier object and +@var{domain} is normally a window and defaults to the selected window if +omitted. This is equivalent to using @code{specifier-instance} and +applying @code{font-instance-name} to the result. +@end defun + +@defun font-truename font &optional domain +This function returns the truename of the @var{font} in the specified +@var{domain}, if any. @var{font} should be a font specifier object and +@var{domain} is normally a window and defaults to the selected window if +omitted. This is equivalent to using @code{specifier-instance} and +applying @code{font-instance-truename} to the result. +@end defun + +@defun font-properties font &optional domain +This function returns the properties of the @var{font} in the specified +@var{domain}, if any. @var{font} should be a font specifier object and +@var{domain} is normally a window and defaults to the selected window if +omitted. This is equivalent to using @code{specifier-instance} and +applying @code{font-instance-properties} to the result. +@end defun + +@node Colors +@section Colors +@cindex colors + +@menu +* Color Specifiers:: Specifying how a color will appear. +* Color Instances:: What a color specifier gets instanced as. +* Color Instance Properties:: Properties of color instances. +* Color Convenience Functions:: Convenience functions that automatically + instance and retrieve the properties + of a color specifier. +@end menu + +@node Color Specifiers +@subsection Color Specifiers + +@defun color-specifier-p object +This function returns non-@code{nil} if @var{object} is a color specifier. +@end defun + +@node Color Instances +@subsection Color Instances +@cindex color instances + +A @dfn{color-instance object} is an object describing the way a color +specifier is instanced in a particular domain. Functions such as +@code{face-background-instance} return a color-instance object. For +example, + +@example +(face-background-instance 'default (next-window)) + @result{} #<color-instance moccasin 47=(FFFF,E4E4,B5B5) 0x678d> +@end example + +The color-instance object returned describes the way the background +color of the @code{default} face is displayed in the next window after +the selected one. + +@defun color-instance-p object +This function returns non-@code{nil} if @var{object} is a color-instance. +@end defun + +@node Color Instance Properties +@subsection Color Instance Properties + +@defun color-instance-name color-instance +This function returns the name used to allocate @var{color-instance}. +@end defun + +@defun color-instance-rgb-components color-instance +This function returns a three element list containing the red, green, +and blue color components of @var{color-instance}. + +@example +(color-instance-rgb-components + (face-background-instance 'default (next-window))) + @result{} (65535 58596 46517) +@end example +@end defun + +@node Color Convenience Functions +@subsection Color Convenience Functions + +@defun color-name color &optional domain +This function returns the name of the @var{color} in the specified +@var{domain}, if any. @var{color} should be a color specifier object +and @var{domain} is normally a window and defaults to the selected +window if omitted. This is equivalent to using +@code{specifier-instance} and applying @code{color-instance-name} to the +result. +@end defun + +@defun color-rgb-components color &optional domain +This function returns the @sc{rgb} components of the @var{color} in the +specified @var{domain}, if any. @var{color} should be a color specifier +object and @var{domain} is normally a window and defaults to the +selected window if omitted. This is equivalent to using +@code{specifier-instance} and applying +@code{color-instance-rgb-components} to the result. + +@example +(color-rgb-components (face-background 'default (next-window))) + @result{} (65535 58596 46517) +@end example +@end defun