+@end ifnottex
+
+
+@node GTK resources
+@appendixsec GTK resources
+@iftex
+ The most common way to customize the GTK widgets Emacs uses (menus, dialogs
+tool bars and scroll bars) is by choosing an appropriate theme, for example
+with the GNOME theme selector. You can also do Emacs specific customization
+by inserting GTK style directives in the file @file{~/.emacs.d/gtkrc}. Some GTK
+themes ignore customizations in @file{~/.emacs.d/gtkrc} so not everything
+works with all themes. To customize Emacs font, background, faces, etc., use
+the normal X resources (@pxref{Resources}). We will present some examples of
+customizations here, but for a more detailed description, see the online manual
+
+ The first example is just one line. It changes the font on all GTK widgets
+to courier with size 12:
+
+@smallexample
+gtk-font-name = "courier 12"
+@end smallexample
+
+ The thing to note is that the font name is not an X font name, like
+-*-helvetica-medium-r-*--*-120-*-*-*-*-*-*, but a Pango font name. A Pango
+font name is basically of the format "family style size", where the style
+is optional as in the case above. A name with a style could be for example:
+
+@smallexample
+gtk-font-name = "helvetica bold 10"
+@end smallexample
+
+ To customize widgets you first define a style and then apply the style to
+the widgets. Here is an example that sets the font for menus, but not
+for other widgets:
+
+@smallexample
+# @r{Define the style @samp{menufont}.}
+style "menufont"
+@{
+ font_name = "helvetica bold 14" # This is a Pango font name
+@}
+
+# @r{Specify that widget type @samp{*emacs-menuitem*} uses @samp{menufont}.}
+widget "*emacs-menuitem*" style "menufont"
+@end smallexample
+
+The widget name in this example contains wildcards, so the style will be
+applied to all widgets that match "*emacs-menuitem*". The widgets are
+named by the way they are contained, from the outer widget to the inner widget.
+So to apply the style "my_style" (not shown) with the full, absolute name, for
+the menubar and the scroll bar in Emacs we use:
+
+@smallexample
+widget "Emacs.pane.menubar" style "my_style"
+widget "Emacs.pane.emacs.verticalScrollBar" style "my_style"
+@end smallexample
+
+But to avoid having to type it all, wildcards are often used. @samp{*}
+matches zero or more characters and @samp{?} matches one character. So "*"
+matches all widgets.
+
+ Each widget has a class (for example GtkMenuItem) and a name (emacs-menuitem).
+You can assign styles by name or by class. In this example we have used the
+class:
+
+@smallexample
+style "menufont"
+@{
+ font_name = "helvetica bold 14"
+@}
+
+widget_class "*GtkMenuBar" style "menufont"
+@end smallexample
+
+@noindent
+The names and classes for the GTK widgets Emacs uses are:
+
+@multitable {@code{verticalScrollbar plus}} {@code{GtkFileSelection} and some}
+@item @code{emacs-filedialog}
+@tab @code{GtkFileSelection}
+@item @code{emacs-dialog}
+@tab @code{GtkDialog}
+@item @code{Emacs}
+@tab @code{GtkWindow}
+@item @code{pane}
+@tab @code{GtkVHbox}
+@item @code{emacs}
+@tab @code{GtkFixed}
+@item @code{verticalScrollBar}
+@tab @code{GtkVScrollbar}
+@item @code{emacs-toolbar}
+@tab @code{GtkToolbar}
+@item @code{menubar}
+@tab @code{GtkMenuBar}
+@item @code{emacs-menuitem}
+@tab anything in menus
+@end multitable
+
+ GTK absolute names are quite strange when it comes to menus
+and dialogs. The names do not start with @samp{Emacs}, as they are
+free-standing windows and not contained (in the GTK sense) by the
+Emacs GtkWindow. To customize the dialogs and menus, use wildcards like this:
+
+@smallexample
+widget "*emacs-dialog*" style "my_dialog_style"
+widget "*emacs-filedialog* style "my_file_style"
+widget "*emacs-menuitem* style "my_menu_style"
+@end smallexample
+
+ If you specify a customization in @file{~/.emacs.d/gtkrc}, then it
+automatically applies only to Emacs, since other programs don't read
+that file. For example, the drop down menu in the file dialog can not
+be customized by any absolute widget name, only by an absolute class
+name. This is because the widgets in the drop down menu do not
+have names and the menu is not contained in the Emacs GtkWindow. To
+have all menus in Emacs look the same, use this in
+@file{~/.emacs.d/gtkrc}:
+
+@smallexample
+widget_class "*Menu*" style "my_menu_style"
+@end smallexample
+
+ Here is a more elaborate example, showing how to change the parts of
+the scroll bar:
+
+@smallexample
+style "scroll"
+@{
+ fg[NORMAL] = "red"@ @ @ @ @ # @r{The arrow color.}
+ bg[NORMAL] = "yellow"@ @ # @r{The thumb and background around the arrow.}
+ bg[ACTIVE] = "blue"@ @ @ @ # @r{The trough color.}
+ bg[PRELIGHT] = "white"@ # @r{The thumb color when the mouse is over it.}
+@}
+
+widget "*verticalScrollBar*" style "scroll"
+@end smallexample
+@end iftex
+
+@ifnottex
+@cindex GTK resources and customization
+@cindex resource files for GTK
+@cindex @file{~/.gtkrc-2.0} file
+@cindex @file{~/.emacs.d/gtkrc} file
+
+ If Emacs was built to use the GTK widget set, then the menu bar, tool bar,
+scroll bar and the dialogs are customized with the standard GTK
+customization file, @file{~/.gtkrc-2.0}, or with the Emacs specific
+file @file{~/.emacs.d/gtkrc}. We recommend that you use
+@file{~/.emacs.d/gtkrc} for customizations, since @file{~/.gtkrc-2.0}
+seems to be ignored when running GConf with GNOME. These files apply
+only to GTK widget features. To customize Emacs font, background,
+faces, etc., use the normal X resources (@pxref{Resources}).
+
+ Some GTK themes override these mechanisms, which means that using
+these mechanisms will not work to customize them.
+
+ In these files you first define a style and say what it means; then
+you specify to apply the style to various widget types (@pxref{GTK
+widget names}). Here is an example of how to change the font for
+Emacs menus:
+
+@smallexample
+# @r{Define the style @samp{menufont}.}
+style "menufont"
+@{
+ font_name = "helvetica bold 14" # This is a Pango font name
+@}
+
+# @r{Specify that widget type @samp{*emacs-menuitem*} uses @samp{menufont}.}
+widget "*emacs-menuitem*" style "menufont"
+@end smallexample
+
+ Here is a more elaborate example, showing how to change the parts of
+the scroll bar:
+
+@smallexample
+style "scroll"
+@{
+ fg[NORMAL] = "red"@ @ @ @ @ # @r{The arrow color.}
+ bg[NORMAL] = "yellow"@ @ # @r{The thumb and background around the arrow.}
+ bg[ACTIVE] = "blue"@ @ @ @ # @r{The trough color.}
+ bg[PRELIGHT] = "white"@ # @r{The thumb color when the mouse is over it.}
+@}
+
+widget "*verticalScrollBar*" style "scroll"
+@end smallexample
+
+ There are also parameters that affect GTK as a whole. For example,
+the property @code{gtk-font-name} sets the default font for GTK. You
+must use Pango font names (@pxref{GTK styles}). A GTK resources file
+that just sets a default font looks like this:
+
+@smallexample
+gtk-font-name = "courier 12"
+@end smallexample
+
+ The GTK resources file is fully described in the GTK API document.
+This can be found in
+@file{@var{prefix}/share/gtk-doc/html/gtk/gtk-resource-files.html},
+where @file{prefix} is the directory in which the GTK libraries were
+installed (usually @file{/usr} or @file{/usr/local}). You can also
+find the document online, at
+@uref{http://developer.gnome.org/doc/API/2.0/gtk/gtk-Resource-Files.html}.
+
+@menu
+* GTK widget names:: How widgets in GTK are named in general.
+* GTK Names in Emacs:: GTK widget names in Emacs.
+* GTK styles:: What can be customized in a GTK widget.
+@end menu
+
+@node GTK widget names
+@appendixsubsec GTK widget names
+@cindex GTK widget names
+
+ A GTK widget is specified by its @dfn{widget class} and
+@dfn{widget name}. The widget class is the type of the widget: for
+example, @code{GtkMenuBar}. The widget name is the name given to a
+specific widget. A widget always has a class, but need not have a
+name.
+
+ @dfn{Absolute names} are sequences of widget names or widget
+classes, corresponding to hierarchies of widgets embedded within
+other widgets. For example, if a @code{GtkWindow} named @code{top}
+contains a @code{GtkVBox} named @code{box}, which in turn contains
+a @code{GtkMenuBar} called @code{menubar}, the absolute class name
+of the menu-bar widget is @code{GtkWindow.GtkVBox.GtkMenuBar}, and
+its absolute widget name is @code{top.box.menubar}.
+
+ When assigning a style to a widget, you can use the absolute class
+name or the absolute widget name.
+
+ There are two commands to specify changes for widgets:
+
+@table @asis
+@item @code{widget_class}
+specifies a style for widgets based on the absolute class name.
+
+@item @code{widget}
+specifies a style for widgets based on the absolute class name,
+or just the class.
+@end table
+
+@noindent
+You must specify the class and the style in double-quotes, and put
+these commands at the top level in the GTK customization file, like
+this:
+
+@smallexample
+style "menufont"
+@{
+ font_name = "helvetica bold 14"
+@}
+
+widget "top.box.menubar" style "menufont"
+widget_class "GtkWindow.GtkVBox.GtkMenuBar" style "menufont"
+@end smallexample
+
+ Matching of absolute names uses shell wildcard syntax: @samp{*}
+matches zero or more characters and @samp{?} matches one character.
+This example assigns @code{base_style} to all widgets:
+
+@smallexample
+widget "*" style "base_style"
+@end smallexample
+
+ Given the absolute class name @code{GtkWindow.GtkVBox.GtkMenuBar}
+and the corresponding absolute widget name @code{top.box.menubar}, all
+these examples specify @code{my_style} for the menu bar:
+
+@smallexample
+widget_class "GtkWindow.GtkVBox.GtkMenuBar" style "my_style"
+widget_class "GtkWindow.*.GtkMenuBar" style "my_style"
+widget_class "*GtkMenuBar" style "my_style"
+widget "top.box.menubar" style "my_style"
+widget "*box*menubar" style "my_style"
+widget "*menubar" style "my_style"
+widget "*menu*" style "my_style"
+@end smallexample
+
+@node GTK Names in Emacs
+@appendixsubsec GTK Widget Names in Emacs
+@cindex GTK widget names
+@cindex GTK widget classes
+
+ In Emacs, the top level widget for a frame is a @code{GtkWindow}
+that contains a @code{GtkVBox}. The @code{GtkVBox} contains the
+@code{GtkMenuBar} and a @code{GtkFixed} widget. The vertical scroll
+bars, @code{GtkVScrollbar}, are contained in the @code{GtkFixed}
+widget. The text you write in Emacs is drawn in the @code{GtkFixed}
+widget.
+
+ Dialogs in Emacs are @code{GtkDialog} widgets. The file dialog is a
+@code{GtkFileSelection} widget.
+
+@noindent
+To set a style for the menu bar using the absolute class name, use:
+
+@smallexample
+widget_class "GtkWindow.GtkVBox.GtkMenuBar" style "my_style"
+@end smallexample
+
+@noindent
+For the scroll bar, the absolute class name is:
+
+@smallexample
+widget_class
+ "GtkWindow.GtkVBox.GtkFixed.GtkVScrollbar"
+ style "my_style"
+@end smallexample
+
+@noindent
+The names for the emacs widgets, and their classes, are:
+
+@multitable {@code{verticalScrollbar plus}} {@code{GtkFileSelection} and some}
+@item @code{emacs-filedialog}
+@tab @code{GtkFileSelection}
+@item @code{emacs-dialog}
+@tab @code{GtkDialog}
+@item @code{Emacs}
+@tab @code{GtkWindow}
+@item @code{pane}
+@tab @code{GtkVHbox}
+@item @code{emacs}
+@tab @code{GtkFixed}
+@item @code{verticalScrollBar}
+@tab @code{GtkVScrollbar}
+@item @code{emacs-toolbar}
+@tab @code{GtkToolbar}
+@item @code{menubar}
+@tab @code{GtkMenuBar}
+@item @code{emacs-menuitem}
+@tab anything in menus
+@end multitable
+
+@noindent
+Thus, for Emacs you can write the two examples above as:
+
+@smallexample
+widget "Emacs.pane.menubar" style "my_style"
+widget "Emacs.pane.emacs.verticalScrollBar" style "my_style"
+@end smallexample
+
+ GTK absolute names are quite strange when it comes to menus
+and dialogs. The names do not start with @samp{Emacs}, as they are
+free-standing windows and not contained (in the GTK sense) by the
+Emacs GtkWindow. To customize the dialogs and menus, use wildcards like this:
+
+@smallexample
+widget "*emacs-dialog*" style "my_dialog_style"
+widget "*emacs-filedialog* style "my_file_style"
+widget "*emacs-menuitem* style "my_menu_style"
+@end smallexample
+
+ If you specify a customization in @file{~/.emacs.d/gtkrc}, then it
+automatically applies only to Emacs, since other programs don't read
+that file. For example, the drop down menu in the file dialog can not
+be customized by any absolute widget name, only by an absolute class
+name. This is because the widgets in the drop down menu do not
+have names and the menu is not contained in the Emacs GtkWindow. To
+have all menus in Emacs look the same, use this in
+@file{~/.emacs.d/gtkrc}:
+
+@smallexample
+widget_class "*Menu*" style "my_menu_style"
+@end smallexample
+
+@node GTK styles
+@appendixsubsec GTK styles
+@cindex GTK styles
+
+ In a GTK style you specify the appearance widgets shall have. You
+can specify foreground and background color, background pixmap and
+font. The edit widget (where you edit the text) in Emacs is a GTK
+widget, but trying to specify a style for the edit widget will have no
+effect. This is so that Emacs compiled for GTK is compatible with
+Emacs compiled for other X toolkits. The settings for foreground,
+background and font for the edit widget is taken from the X resources;
+@pxref{Resources}. Here is an example of two style declarations,
+@samp{default} and @samp{ruler}:
+
+@smallexample
+pixmap_path "/usr/share/pixmaps:/usr/include/X11/pixmaps"
+
+style "default"
+@{
+ font_name = "helvetica 12"
+
+ bg[NORMAL] = @{ 0.83, 0.80, 0.73 @}
+ bg[SELECTED] = @{ 0.0, 0.55, 0.55 @}
+ bg[INSENSITIVE] = @{ 0.77, 0.77, 0.66 @}
+ bg[ACTIVE] = @{ 0.0, 0.55, 0.55 @}
+ bg[PRELIGHT] = @{ 0.0, 0.55, 0.55 @}
+
+ fg[NORMAL] = "black"
+ fg[SELECTED] = @{ 0.9, 0.9, 0.9 @}
+ fg[ACTIVE] = "black"
+ fg[PRELIGHT] = @{ 0.9, 0.9, 0.9 @}
+
+ base[INSENSITIVE] = "#777766"
+ text[INSENSITIVE] = @{ 0.60, 0.65, 0.57 @}
+
+ bg_pixmap[NORMAL] = "background.xpm"
+ bg_pixmap[INSENSITIVE] = "background.xpm"
+ bg_pixmap[ACTIVE] = "background.xpm"
+ bg_pixmap[PRELIGHT] = "<none>"
+
+@}
+
+style "ruler" = "default"
+@{
+ font_name = "helvetica 8"
+@}
+
+@end smallexample
+
+ The style @samp{ruler} inherits from @samp{default}. This way you can build
+on existing styles. The syntax for fonts and colors is described below.
+
+ As this example shows, it is possible to specify several values for
+foreground and background depending on the widget's @dfn{state}. The
+possible states are:
+
+@table @code
+@item NORMAL
+This is the default state for widgets.
+@item ACTIVE
+This is the state for a widget that is ready to do something. It is
+also for the trough of a scroll bar, i.e. @code{bg[ACTIVE] = "red"}
+sets the scroll bar trough to red. Buttons that have been pressed but
+not released yet (``armed'') are in this state.
+@item PRELIGHT
+This is the state for a widget that can be manipulated, when the mouse
+pointer is over it---for example when the mouse is over the thumb in
+the scroll bar or over a menu item. When the mouse is over a button
+that is not pressed, the button is in this state.
+@item SELECTED
+This is the state for data that has been selected by the user. It can
+be selected text or items selected in a list. This state is not used
+in Emacs.
+@item INSENSITIVE
+This is the state for widgets that are visible, but they can not be
+manipulated in the usual way---for example, buttons that can't be
+pressed, and disabled menu items. To display disabled menu items in
+yellow, use @code{fg[INSENSITIVE] = "yellow"}.
+@end table
+
+ Here are the things that can go in a style declaration:
+
+@table @code
+@item bg[@var{state}] = @var{color}
+This specifies the background color for the widget. Note that
+editable text doesn't use @code{bg}; it uses @code{base} instead.
+
+@item base[@var{state}] = @var{color}
+This specifies the background color for editable text. In Emacs, this
+color is used for the background of the text fields in the file
+dialog.
+
+@item bg_pixmap[@var{state}] = "@var{pixmap}"
+This specifies an image background (instead of a background color).
+@var{pixmap} should be the image file name. GTK can use a number of
+image file formats, including XPM, XBM, GIF, JPEG and PNG. If you
+want a widget to use the same image as its parent, use
+@samp{<parent>}. If you don't want any image, use @samp{<none>}.
+@samp{<none>} is the way to cancel a background image inherited from a
+parent style.
+
+You can't specify the file by its absolute file name. GTK looks for
+the pixmap file in directories specified in @code{pixmap_path}.
+@code{pixmap_path} is a colon-separated list of directories within
+double quotes, specified at the top level in a @file{gtkrc} file
+(i.e. not inside a style definition; see example above):
+
+@smallexample
+pixmap_path "/usr/share/pixmaps:/usr/include/X11/pixmaps"
+@end smallexample
+
+@item fg[@var{state}] = @var{color}
+This specifies the foreground color for widgets to use. It is the
+color of text in menus and buttons, and the color for the arrows in
+the scroll bar. For editable text, use @code{text}.
+
+@item text[@var{state}] = @var{color}
+This is the color for editable text. In Emacs, this color is used for the
+text fields in the file dialog.
+
+@item font_name = "@var{font}"
+This specifies the font for text in the widget. @var{font} is a
+Pango font name, for example @samp{Sans Italic 10}, @samp{Helvetica
+Bold 12}, @samp{Courier 14}, @samp{Times 18}. See below for exact
+syntax. The names are case insensitive.
+@end table
+
+ There are three ways to specify a color: by name, in hexadecimal
+form, and with an RGB triplet.
+
+@noindent
+A color name is written within double quotes, for example @code{"red"}.
+
+@noindent
+Hexadecimal form is the same as in X:
+@code{#@var{rrrr}@var{gggg}@var{bbbb}}, where all three color specs
+must have the same number of hex digits (1, 2, 3 or 4).
+
+@noindent
+An RGB triplet looks like @code{@{ @var{r}, @var{g}, @var{b} @}},
+where @var{r}, @var{g} and @var{b} are either integers in the range
+0-65535 or floats in the range 0.0-1.0.
+
+ Pango font names have the form ``@var{family-list} @var{style-options}
+@var{size}.''
+@cindex Pango font name
+@noindent
+@var{family-list} is a comma separated list of font families optionally
+terminated by a comma. This way you can specify several families and the
+first one found will be used. @var{family} corresponds to the second part in
+an X font name, for example in
+
+@smallexample
+-adobe-times-medium-r-normal--12-120-75-75-p-64-iso10646-1
+@end smallexample
+
+@noindent
+the family name is @samp{times}.
+
+@noindent
+@var{style-options} is a whitespace separated list of words where each word
+is a style, variant, weight, or stretch. The default value for all of
+these is @code{normal}.
+
+@noindent
+A `style' corresponds to the fourth part of an X font name. In X font
+names it is the character @samp{r}, @samp{i} or @samp{o}; in Pango
+font names the corresponding values are @code{normal}, @code{italic},
+or @code{oblique}.
+
+@noindent
+A `variant' is either @code{normal} or @code{small-caps}.
+Small caps is a font with the lower case characters replaced by
+smaller variants of the capital characters.
+
+@noindent
+Weight describes the ``boldness'' of a font. It corresponds to the third
+part of an X font name. It is one of @code{ultra-light}, @code{light},
+@code{normal}, @code{bold}, @code{ultra-bold}, or @code{heavy}.
+
+@noindent
+Stretch gives the width of the font relative to other designs within a
+family. It corresponds to the fifth part of an X font name. It is one of
+@code{ultra-condensed}, @code{extra-condensed}, @code{condensed},
+@code{semi-condensed}, @code{normal}, @code{semi-expanded},
+@code{expanded}, @code{extra-expanded}, or @code{ultra-expanded}.
+
+@noindent
+@var{size} is a decimal number that describes the font size in points.
+@end ifnottex
+
+@ignore
+ arch-tag: 9b6ff773-48b6-41f6-b2f9-f114b8bdd97f
+@end ignore