# HG changeset patch # User Glenn Morris # Date 1189054159 0 # Node ID cf017d5aa8c16c3d15d7d1aafe2c4bb21fff1fcd # Parent d409e8e5c28f10c120f132f125ee211831626d47 Move here from ../../man diff -r d409e8e5c28f -r cf017d5aa8c1 doc/emacs/xresources.texi --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/emacs/xresources.texi Thu Sep 06 04:49:19 2007 +0000 @@ -0,0 +1,1216 @@ +@c This is part of the Emacs manual. +@c Copyright (C) 1987, 1993, 1994, 1995, 1997, 2001, 2002, 2003, +@c 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See file emacs.texi for copying conditions. +@node X Resources, Antinews, Emacs Invocation, Top +@appendix X Options and Resources + + You can customize some X-related aspects of Emacs behavior using X +resources, as is usual for programs that use X. On MS-Windows, you +can customize some of the same aspects using the system registry. +@xref{MS-Windows Registry}. Likewise, Emacs on MacOS Carbon emulates X +resources using the Preferences system. @xref{Mac Environment Variables}. + + When Emacs is built using an ``X toolkit'', such as Lucid or +LessTif, you need to use X resources to customize the appearance of +the widgets, including the menu-bar, scroll-bar, and dialog boxes. +This is because the libraries that implement these don't provide for +customization through Emacs. GTK+ widgets use a separate system of +@ifnottex +``GTK resources'', which we will also describe. +@end ifnottex +@iftex +``GTK resources.'' In this chapter we describe the most commonly used +resource specifications. For full documentation, see the online +manual. + +@c Add xref for LessTif/Motif menu resources. +@end iftex + + +@menu +* Resources:: Using X resources with Emacs (in general). +* Table of Resources:: Table of specific X resources that affect Emacs. +* Face Resources:: X resources for customizing faces. +* Lucid Resources:: X resources for Lucid menus. +* LessTif Resources:: X resources for LessTif and Motif menus. +* GTK resources:: Resources for GTK widgets. +@end menu + +@node Resources +@appendixsec X Resources +@cindex resources +@cindex X resources +@cindex @file{~/.Xdefaults} file +@cindex @file{~/.Xresources} file + + Programs running under the X Window System organize their user +options under a hierarchy of classes and resources. You can specify +default values for these options in your X resources file, usually +named @file{~/.Xdefaults} or @file{~/.Xresources}. +If changes in @file{~/.Xdefaults} do not +take effect, it is because your X server stores its own list of +resources; to update them, use the shell command @command{xrdb}---for +instance, @samp{xrdb ~/.Xdefaults}. + + Each line in the file specifies a value for one option or for a +collection of related options, for one program or for several programs +(optionally even for all programs). + +@cindex Registry (MS-Windows) + MS-Windows systems do not support @file{~/.Xdefaults} files, so +instead Emacs compiled for Windows looks for X resources in the +Windows Registry, first under the key +@samp{HKEY_CURRENT_USER\SOFTWARE\GNU\Emacs} and then under the key +@samp{HKEY_LOCAL_MACHINE\SOFTWARE\GNU\Emacs}. The menu and scroll +bars are native widgets on MS-Windows, so they are only customizable +via the system-wide settings in the Display Control Panel. You can +also set resources using the @samp{-xrm} command line option (see +below.) + +@iftex + Applications such as Emacs look for resources with specific names +and their particular meanings. Case distinctions are significant in +these names. Each resource specification in @file{~/.Xdefaults} +states the name of the program and the name of the resource. For +Emacs, the program name is @samp{Emacs}. It looks like this: + +@example +Emacs.borderWidth: 2 +@end example +@end iftex +@ifnottex + Programs define named resources with particular meanings. They also +define how to group resources into named classes. For instance, in +Emacs, the @samp{internalBorder} resource controls the width of the +internal border, and the @samp{borderWidth} resource controls the width +of the external border. Both of these resources are part of the +@samp{BorderWidth} class. Case distinctions are significant in these +names. + + Every resource definition is associated with a specific program +name---the name of the executable file that you ran. For Emacs, that +is normally @samp{emacs}. To specify a definition for all instances +of Emacs, regardless of their names, use @samp{Emacs}. + + In @file{~/.Xdefaults}, you can specify a value for a single resource +on one line, like this: + +@example +emacs.borderWidth: 2 +@end example + +@noindent +Or you can use a class name to specify the same value for all resources +in that class. Here's an example: + +@example +emacs.BorderWidth: 2 +@end example + + If you specify a value for a class, it becomes the default for all +resources in that class. You can specify values for individual +resources as well; these override the class value, for those particular +resources. Thus, this example specifies 2 as the default width for all +borders, but overrides this value with 4 for the external border: + +@example +emacs.BorderWidth: 2 +emacs.borderWidth: 4 +@end example +@end ifnottex + + The order in which the lines appear in the file does not matter. +Also, command-line options always override the X resources file. + +@ifnottex +Here is a list of X command-line options and their corresponding +resource names. + +@table @samp +@item -name @var{name} +@opindex --name +@itemx --name=@var{name} +@cindex resource name, command-line argument +Use @var{name} as the resource name (and the title) for the initial +Emacs frame. This option does not affect subsequent frames, but Lisp +programs can specify frame names when they create frames. + +If you don't specify this option, the default is to use the Emacs +executable's name as the resource name. + +@item -xrm @var{resource-values} +@opindex --xrm +@itemx --xrm=@var{resource-values} +@cindex resource values, command-line argument +Specify X resource values for this Emacs job (see below). +@end table + + For consistency, @samp{-name} also specifies the name to use for +other resource values that do not belong to any particular frame. + + The resources that name Emacs invocations also belong to a class; its +name is @samp{Emacs}. If you write @samp{Emacs} instead of +@samp{emacs}, the resource applies to all frames in all Emacs jobs, +regardless of frame titles and regardless of the name of the executable +file. Here is an example: + +@example +Emacs.BorderWidth: 2 +Emacs.borderWidth: 4 +@end example + + You can specify a string of additional resource values for Emacs to +use with the command line option @samp{-xrm @var{resources}}. The text +@var{resources} should have the same format that you would use inside a file +of X resources. To include multiple resource specifications in +@var{resources}, put a newline between them, just as you would in a file. +You can also use @samp{#include "@var{filename}"} to include a file full +of resource specifications. Resource values specified with @samp{-xrm} +take precedence over all other resource specifications. + + One way to experiment with the effect of different resource settings +is to use the @code{editres} program. Select @samp{Get Tree} from the +@end ifnottex +@iftex + You can experiment with the effect of different resource settings +with the @code{editres} program. Select @samp{Get Tree} from the +@end iftex +@samp{Commands} menu, then click on an Emacs frame. This will display +a tree showing the structure of X toolkit widgets used in an Emacs +frame. Select one of them, such as @samp{menubar}, then select +@samp{Show Resource Box} from the @samp{Commands} menu. This displays +a list of all the meaningful X resources for that widget, and allows +you to edit them. Changes take effect when you click on the +@samp{Apply} button. (See the @code{editres} man page for more +details.) + +@node Table of Resources +@appendixsec Table of X Resources for Emacs + + This table lists the resource names that designate options for +Emacs, not counting those for the appearance of the menu bar, each +with the class that it belongs to: + +@table @asis +@item @code{background} (class @code{Background}) +Background color name. + +@ifnottex +@item @code{bitmapIcon} (class @code{BitmapIcon}) +Use a bitmap icon (a picture of a gnu) if @samp{on}, let the window +manager choose an icon if @samp{off}. +@end ifnottex + +@item @code{borderColor} (class @code{BorderColor}) +Color name for the external border. + +@ifnottex +@item @code{borderWidth} (class @code{BorderWidth}) +Width in pixels of the external border. +@end ifnottex + +@item @code{cursorColor} (class @code{Foreground}) +Color name for text cursor (point). + +@ifnottex +@item @code{cursorBlink} (class @code{CursorBlink}) +Specifies whether to make the cursor blink. The default is @samp{on}. Use +@samp{off} or @samp{false} to turn cursor blinking off. +@end ifnottex + +@item @code{font} (class @code{Font}) +Font name (or fontset name, @pxref{Fontsets}) for @code{default} font. + +@item @code{foreground} (class @code{Foreground}) +Color name for text. + +@item @code{geometry} (class @code{Geometry}) +Window size and position. Be careful not to specify this resource as +@samp{emacs*geometry}, because that may affect individual menus as well +as the Emacs frame itself. + +If this resource specifies a position, that position applies only to the +initial Emacs frame (or, in the case of a resource for a specific frame +name, only that frame). However, the size, if specified here, applies to +all frames. + +@ifnottex +@item @code{fullscreen} (class @code{Fullscreen}) +The desired fullscreen size. The value can be one of @code{fullboth}, +@code{fullwidth} or @code{fullheight}, which correspond to +the command-line options @samp{-fs}, @samp{-fw}, and @samp{-fh} +(@pxref{Window Size X}). + +Note that this applies to the initial frame only. +@end ifnottex + +@item @code{iconName} (class @code{Title}) +Name to display in the icon. + +@item @code{internalBorder} (class @code{BorderWidth}) +Width in pixels of the internal border. + +@item @code{lineSpacing} (class @code{LineSpacing}) +@cindex line spacing +@cindex leading +Additional space (@dfn{leading}) between lines, in pixels. + +@item @code{menuBar} (class @code{MenuBar}) +@cindex menu bar +Give frames menu bars if @samp{on}; don't have menu bars if @samp{off}. +@ifnottex +@xref{Lucid Resources}, and @ref{LessTif Resources}, +@end ifnottex +@iftex +@xref{Lucid Resources}, +@end iftex +for how to control the appearance of the menu bar if you have one. + +@ifnottex +@item @code{minibuffer} (class @code{Minibuffer}) +If @samp{none}, don't make a minibuffer in this frame. +It will use a separate minibuffer frame instead. + +@item @code{paneFont} (class @code{Font}) +@cindex font for menus +Font name for menu pane titles, in non-toolkit versions of Emacs. +@end ifnottex + +@item @code{pointerColor} (class @code{Foreground}) +Color of the mouse cursor. + +@ifnottex +@item @code{privateColormap} (class @code{PrivateColormap}) +If @samp{on}, use a private color map, in the case where the ``default +visual'' of class PseudoColor and Emacs is using it. + +@item @code{reverseVideo} (class @code{ReverseVideo}) +Switch foreground and background default colors if @samp{on}, use colors as +specified if @samp{off}. +@end ifnottex + +@item @code{screenGamma} (class @code{ScreenGamma}) +@cindex gamma correction +Gamma correction for colors, equivalent to the frame parameter +@code{screen-gamma}. + +@item @code{scrollBarWidth} (class @code{ScrollBarWidth}) +@cindex scrollbar width +The scroll bar width in pixels, equivalent to the frame parameter +@code{scroll-bar-width}. + +@ifnottex +@item @code{selectionFont} (class @code{SelectionFont}) +Font name for pop-up menu items, in non-toolkit versions of Emacs. (For +toolkit versions, see @ref{Lucid Resources}, also see @ref{LessTif +Resources}.) + +@item @code{selectionTimeout} (class @code{SelectionTimeout}) +Number of milliseconds to wait for a selection reply. +If the selection owner doesn't reply in this time, we give up. +A value of 0 means wait as long as necessary. + +@item @code{synchronous} (class @code{Synchronous}) +@cindex debugging X problems +@cindex synchronous X mode +Run Emacs in synchronous mode if @samp{on}. Synchronous mode is +useful for debugging X problems. +@end ifnottex + +@item @code{title} (class @code{Title}) +Name to display in the title bar of the initial Emacs frame. + +@item @code{toolBar} (class @code{ToolBar}) +@cindex tool bar +Number of lines to reserve for the tool bar. A zero value suppresses +the tool bar. If the value is non-zero and +@code{auto-resize-tool-bars} is non-@code{nil}, the tool bar's size +will be changed automatically so that all tool bar items are visible. + If the value of @code{auto-resize-tool-bars} is @code{grow-only}, +the tool bar expands automatically, but does not contract automatically. +To contract the tool bar, you must redraw the frame by entering @kbd{C-l}. + +@item @code{useXIM} (class @code{UseXIM}) +@cindex XIM +@cindex X input methods +@cindex input methods, X +Turn off use of X input methods (XIM) if @samp{false} or @samp{off}. +This is only relevant if your Emacs is actually built with XIM +support. It is potentially useful to turn off XIM for efficiency, +especially slow X client/server links. + +@item @code{verticalScrollBars} (class @code{ScrollBars}) +Give frames scroll bars if @samp{on}; don't have scroll bars if +@samp{off}. + +@ifnottex +@item @code{visualClass} (class @code{VisualClass}) +Specify the ``visual'' that X should use. This tells X how to handle +colors. + +The value should start with one of @samp{TrueColor}, +@samp{PseudoColor}, @samp{DirectColor}, @samp{StaticColor}, +@samp{GrayScale}, and @samp{StaticGray}, followed by +@samp{-@var{depth}}, where @var{depth} is the number of color planes. +Most terminals only allow a few ``visuals,'' and the @samp{dpyinfo} +program outputs information saying which ones. +@end ifnottex +@end table + +@node Face Resources +@appendixsec X Resources for Faces + + You can use resources to customize the appearance of particular +faces (@pxref{Faces}): + +@table @code +@item @var{face}.attributeForeground +Foreground color for face @var{face}. +@item @var{face}.attributeBackground +Background color for face @var{face}. +@item @var{face}.attributeUnderline +Underline flag for face @var{face}. Use @samp{on} or @samp{true} for +yes. +@item @var{face}.attributeStrikeThrough +@itemx @var{face}.attributeOverline +@itemx @var{face}.attributeBox +@itemx @var{face}.attributeInverse +Likewise, for other boolean font attributes. +@item @var{face}.attributeStipple +The name of a pixmap data file to use for the stipple pattern, or +@code{false} to not use stipple for the face @var{face}. +@item @var{face}.attributeBackgroundPixmap +The background pixmap for the face @var{face}. Should be a name of a +pixmap file or @code{false}. +@item @var{face}.attributeFont +Font name (full XFD name or valid X abbreviation) for face @var{face}. +Instead of this, you can specify the font through separate attributes. +@end table + + Instead of using @code{attributeFont} to specify a font name, you can +select a font through these separate attributes: + +@table @code +@item @var{face}.attributeFamily +Font family for face @var{face}. +@item @var{face}.attributeHeight +Height of the font to use for face @var{face}: either an integer +specifying the height in units of 1/10@dmn{pt}, or a floating point +number that specifies a scale factor to scale the underlying face's +default font, or a function to be called with the default height which +will return a new height. +@item @var{face}.attributeWidth +@itemx @var{face}.attributeWeight +@itemx @var{face}.attributeSlant +Each of these resources corresponds to a like-named font attribute, +and you write the resource value the same as the symbol you would use +for the font attribute value. +@item @var{face}.attributeBold +Bold flag for face @var{face}---instead of @code{attributeWeight}. Use @samp{on} or @samp{true} for +yes. +@item @var{face}.attributeItalic +Italic flag for face @var{face}---instead of @code{attributeSlant}. +@end table + +@node Lucid Resources +@appendixsec Lucid Menu X Resources +@cindex Menu X Resources (Lucid widgets) +@cindex Lucid Widget X Resources + +@ifnottex + If the Emacs installed at your site was built to use the X toolkit +with the Lucid menu widgets, then the menu bar is a separate widget and +has its own resources. The resource names contain @samp{pane.menubar} +(following, as always, the name of the Emacs invocation, or @samp{Emacs}, +which stands for all Emacs invocations). Specify them like this: + +@example +Emacs.pane.menubar.@var{resource}: @var{value} +@end example + +@noindent +For example, to specify the font @samp{8x16} for the menu-bar items, +write this: +@end ifnottex +@iftex + If the Emacs installed at your site was built to use the X toolkit +with the Lucid menu widgets, then the menu bar is a separate widget +and has its own resources. The resource specifications start with +@samp{Emacs.pane.menubar}---for instance, to specify the font +@samp{8x16} for the menu-bar items, write this: +@end iftex + +@example +Emacs.pane.menubar.font: 8x16 +@end example + +@noindent +Resources for @emph{non-menubar} toolkit pop-up menus have +@samp{menu*} instead of @samp{pane.menubar}. For example, to specify +the font @samp{8x16} for the pop-up menu items, write this: + +@example +Emacs.menu*.font: 8x16 +@end example + +@noindent +For dialog boxes, use @samp{dialog*}: + +@example +Emacs.dialog*.font: 8x16 +@end example + +@noindent +The Lucid menus can display multilingual text in your locale. For +more information about fontsets see the man page for +@code{XCreateFontSet}. To enable multilingual menu text you specify a +@code{fontSet} resource instead of the font resource. If both +@code{font} and @code{fontSet} resources are specified, the +@code{fontSet} resource is used. + + Thus, to specify @samp{-*-helvetica-medium-r-*--*-120-*-*-*-*-*-*,*} +for both the popup and menu bar menus, write this: + +@example +Emacs*menu*fontSet: -*-helvetica-medium-r-*--*-120-*-*-*-*-*-*,* +@end example + +@noindent +The @samp{*menu*} as a wildcard matches @samp{pane.menubar} and +@samp{menu@dots{}}. + +Experience shows that on some systems you may need to add +@samp{shell.}@: before the @samp{pane.menubar} or @samp{menu*}. On +some other systems, you must not add @samp{shell.}. The generic wildcard +approach should work on both kinds of systems. + + Here is a list of the specific resources for menu bars and pop-up menus: + +@table @code +@item font +Font for menu item text. +@item fontSet +Fontset for menu item text. +@item foreground +Color of the foreground. +@item background +Color of the background. +@item buttonForeground +In the menu bar, the color of the foreground for a selected item. +@ifnottex +@item horizontalSpacing +Horizontal spacing in pixels between items. Default is 3. +@item verticalSpacing +Vertical spacing in pixels between items. Default is 2. +@item arrowSpacing +Horizontal spacing between the arrow (which indicates a submenu) and +the associated text. Default is 10. +@item shadowThickness +Thickness of shadow line around the widget. Default is 1. + +Also determines the thickness of shadow lines around other objects, +for instance 3D buttons and arrows. If you have the impression that +the arrows in the menus do not stand out clearly enough or that the +difference between ``in'' and ``out'' buttons is difficult to see, set +this to 2. If you have no problems with visibility, the default +probably looks better. The background color may also have some effect +on the contrast. +@end ifnottex +@item margin +The margin of the menu bar, in characters. Default is 1. +@end table + +@ifnottex +@node LessTif Resources +@appendixsec LessTif Menu X Resources +@cindex Menu X Resources (LessTif widgets) +@cindex LessTif Widget X Resources + + If the Emacs installed at your site was built to use the X toolkit +with the LessTif or Motif widgets, then the menu bar, the dialog +boxes, the pop-up menus, and the file-selection box are separate +widgets and have their own resources. + + The resource names for the menu bar contain @samp{pane.menubar} +(following, as always, the name of the Emacs invocation, or +@samp{Emacs}, which stands for all Emacs invocations). Specify them +like this: + +@smallexample +Emacs.pane.menubar.@var{subwidget}.@var{resource}: @var{value} +@end smallexample + + Each individual string in the menu bar is a subwidget; the subwidget's +name is the same as the menu item string. For example, the word +@samp{File} in the menu bar is part of a subwidget named +@samp{emacs.pane.menubar.File}. Most likely, you want to specify the +same resources for the whole menu bar. To do this, use @samp{*} instead +of a specific subwidget name. For example, to specify the font +@samp{8x16} for the menu-bar items, write this: + +@smallexample +Emacs.pane.menubar.*.fontList: 8x16 +@end smallexample + +@noindent +This also specifies the resource value for submenus. + + Each item in a submenu in the menu bar also has its own name for X +resources; for example, the @samp{File} submenu has an item named +@samp{Save (current buffer)}. A resource specification for a submenu +item looks like this: + +@smallexample +Emacs.pane.menubar.popup_*.@var{menu}.@var{item}.@var{resource}: @var{value} +@end smallexample + +@noindent +For example, here's how to specify the font for the @samp{Save (current +buffer)} item: + +@smallexample +Emacs.pane.menubar.popup_*.File.Save (current buffer).fontList: 8x16 +@end smallexample + +@noindent +For an item in a second-level submenu, such as @samp{Complete Word} +under @samp{Spell Checking} under @samp{Tools}, the resource fits this +template: + +@smallexample +Emacs.pane.menubar.popup_*.popup_*.@var{menu}.@var{resource}: @var{value} +@end smallexample + +@noindent +For example, + +@smallexample +Emacs.pane.menubar.popup_*.popup_*.Spell Checking.Complete Word: @var{value} +@end smallexample + +@noindent +(This should be one long line.) + + It's impossible to specify a resource for all the menu-bar items +without also specifying it for the submenus as well. So if you want the +submenu items to look different from the menu bar itself, you must ask +for that in two steps. First, specify the resource for all of them; +then, override the value for submenus alone. Here is an example: + +@smallexample +Emacs.pane.menubar.*.fontList: 8x16 +Emacs.pane.menubar.popup_*.fontList: 8x16 +@end smallexample + +@noindent +For LessTif pop-up menus, use @samp{menu*} instead of +@samp{pane.menubar}. For example, to specify the font @samp{8x16} for +the pop-up menu items, write this: + +@smallexample +Emacs.menu*.fontList: 8x16 +@end smallexample + +@noindent +For LessTif dialog boxes, use @samp{dialog} instead of @samp{menu}: + +@example +Emacs.dialog*.fontList: 8x16 +Emacs.dialog*.foreground: hotpink +@end example + +To specify resources for the LessTif file-selection box, use +@samp{fsb*}, like this: + +@example +Emacs.fsb*.fontList: 8x16 +@end example + +@iftex +@medbreak +@end iftex + Here is a list of the specific resources for LessTif menu bars and +pop-up menus: + +@table @code +@item armColor +The color to show in an armed button. +@item fontList +The font to use. +@item marginBottom +@itemx marginHeight +@itemx marginLeft +@itemx marginRight +@itemx marginTop +@itemx marginWidth +Amount of space to leave around the item, within the border. +@item borderWidth +The width of the border around the menu item, on all sides. +@item shadowThickness +The width of the border shadow. +@item bottomShadowColor +The color for the border shadow, on the bottom and the right. +@item topShadowColor +The color for the border shadow, on the top and the left. +@end table +@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] = "" + +@} + +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{}. If you don't want any image, use @samp{}. +@samp{} 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