# Xenophilia Theme

## Overview

Xenophilia is a theme engine for GTK+. Its look could be described as a mix of NextStep, Windows 95 and Amiga, or in other words: plain. Xenophilia was made this way because the default look of GTK (author's opinion) was worse than any of the ones mentioned above, and it was also lacking in a few areas which could be improved upon through the application of common user interface design principles.

By the way, both Windows 95 and Amiga are borrowing much of their visuals from NextStep to begin with.

## Theme Configuration

### Introduction

When a GTK+ program is loaded, the GTK library parses the file `$HOME/.gtkrc`, any application-specific style files and any files that they refer to. These files are in the same text-based format and consist of two types of paragraphs: styles and application of these styles onto widget classes and named widgets. More about the format of these files can be found in the GTK+ documentation and in a tutorial at gtk.themes.org.

Xenophilia is a theme engine. In order to activate the engine and bind it to a style, the style definition must include a specific clause: `engine "xeno" {` `}`. The quoted name tells GTK to use the engine with that name. The curly brackets are mandatory, and any engine-specific options should be placed within them.

The options are in the form option `=` value. If you do not define an option, the default or inherited value for the option will be used. You always override an inherited value if you define it defined, even if the new value is `true` and the inherited value was `false`.

By the way, you should not put a semicolon at the end. `=)`

### Scrollbar

The Xenophilia theme engine applies a few patches to the scrollbar widget which can be configured using the options below:
`scrollbar_knob =` ( `none` | `dimple` | `lines` | `holes` | `buds` | `box` )
  If the option is set to anything but `none`, an image will be drawn on the center of each scrollbar to indicate that it can be moved.
  A `dimple` is a little hole as found on the NextStep scrollbars.
  The `lines` are drawn as the lines on the scrollbars in MacOS.
  `holes`, and
  `buds` are also common patters used to indicate movable objects.
  A `box` is an etched in box. Looks better on other widgets though.
`scrollbar_width =` integer_number
  Sets the width of the scrollbar in pixels. Default is 15.
`stepper_arrows =` ( `true` | `false` )
  If `true` the stepper arrows will be drawn in the default GTK style, i.e. they will be bevelled and drawn without any surrounding box. The default is `false`.
  `stepper_arrows = false`
  `stepper_arrows = true`
`stepper_ends =` ( `true` | `false` )
  If `true` the steppers will be placed at either end of the scrollbar instead of in the corner, which is the default.
`stepper_box =` ( `true` | `false` )
  Draw boxes around the stepper arrows. This option is per default set to the inverse of the option `stepper_arrows`, but can also be set explicitly. Having no boxes around black arrows is rather ugly, but some people (especially old Amigans) like to put boxes around bevelled arrows.`=)`
`scrollbar_flush =` ( `true` | `false` )
  If `true` then there will be no inset border around the scrollbar and its buttons. This will look better when the scrollbar is used for scrolling another widget that does not have any inset border, e.g. X-Chat and gnome-terminal text windows.

### Shadows

shadow_type => [ `none` | `default` | `etched` | `thin` | `black` | `note` | `next` ] ( `in` | `out` )
`in` [ `[` state_type `]` ] `=` shadow_type
`out` [ `[` state_type `]` ] `=` shadow_type
  Overrides the default shadows for widgets attached to the style.
  Example: `out[INSENSITIVE] = etched in`.
`label` [ `[` state_type `]` ] `=` shadow_type
  Defines how labels should be shaded. Example: `label[INSENSITIVE] = in`. Default is `none` for everything except GtkFrame labels.
`button_default =` shadow_type
  Sets the shadow that is drawn around buttons who are automatically clicked when RETURN is pressed.
`menu_item_shadow =` shadow_type
  Sets the shadow used for a menu item when the mouse is over it

### Other widgets

`paned_knob =` ( `none` | `dimple` | `lines` | `holes` | `buds` | `box`)
  The Xenophilia theme engine patches the GtkVPaned and GtkHPaned widget classes to make the resize-knob into a resize-bar that spans the entire length of the gutter. This options define how this resizebar should be drawn. Default is `box`, which means that the resizebar should be drawn with an etched-in frame, in the style of previous versions of Xenophilia.
`handle_knob =` ( `none` | `lines` | `holes` | `buds` | `box`)
  The default (`none`) is to draw the handle like ones Netscape 4.x have. If it is set to `buds` or `holes`, the buds will be organized in a regular grid. If you set it to `lines` it will be drawn like handle boxes in Windows 95. The `box` option makes it look like a resizebar.
`popup_arrows =` ( `true` | `false` )
  Changes the tab on the GtkOptionMenu (popup menu button) to a pair of solid arrows.

### General options

Syntax |  |  |  | Default
`shine` [ `[` state_type `]` ] `=` real_number |  |  |  | `1.5`
`shade` [ `[` state_type `]` ] `=` real_number | `0.66667`
`white` [ `[` state_type `]` ] `=` real_number | `2.0`
`black` [ `[` state_type `]` ] `=` real_number | `0.0`

  These values are shading factors used to blend the background color into the colors used to draw the frames. State_type must be one of `NORMAL`, `PRELIGHT`, `ACTIVE`, `SELECTED` and `INSENSITIVE` as usual. A value of 0.0 gives black, 1.0 gives the background color, and a value of 2.0 give white. The values will be clamped so that `white` > `shine` > 1.0 > `shade` > `black`. If state_type and its brackets are omitted, the option applies to all states except the `INSENSITIVE` state, which defaults to the medium of `NORMAL` and 1.0.
`thickness =` integer
  Sets the border thickness. Legal values are 0 .. 3. Default is 2.
`flat_windows =` ( `true` | `false` )
  If `true` then no bevel will be drawn around the window. This will make Xenophilia themes look better together with certain window manager themes.
`gradient =` ( ( `horizontal` | `vertical` | `diagonal` ) [ `interlaced` ] shade_factor ) | `none`
  Specify how the background should be drawn. The shade_factor for gradients is interpreted just as the values for `shine` and `shade`.
`align =` x_align y_align
  Specify alignment for the background pixmap, if any. Example: `align = 0.5 0.5 # Centered`.

## Runtime Configuration

The theme engine also has a couple of runtime environment variables that were added primarily for testing. Don't use these in themes!.
`XENO_THEME_PATCH =` [ `NOT` ] ( `ALL` | `NONE` | `DEFAULT` | ( `SCROLLBAR` | `SCALE` | `RADIO_BUTTON` | `CHECK_BUTTON` | `PANED` | `SPIN_BUTTON` | `COMBO` | `CLIST` )* )
  Enable or disable installing a patch. If the environment variable isn't defined, patches will be on per default. You can define the variable if you are worried about stability. Don't use it for themes. If you don't want the Xenophilia behaviour for a widget then don't set `xeno` to be its engine! If all you're after is to get rid of the windoze-like combo patch, then this is a bad option; Instead you should theme GtkEntry and GtkButton but not GtkCombo to use the engine.
`XENO_THEME_CMAP =` ( `YES` | `NO` | `TEST` )
  Reduce the number of colors used by the engine if `YES`, or if `TEST` and you are running on a pseudocolor display. You can force the option off with `NO`. The default is `TEST`.