View | Details | Raw Unified
Collapse All | Expand All

(-) fvwm-2.4.7.orig/config.h.in (+3 lines)
 Lines 2-7    Link Here 
/* Suffix for config filenames */
/* Suffix for config filenames */
#define FVWMRC ".fvwm2rc"
#define FVWMRC ".fvwm2rc"
/* Define for fancy, multi-pixmap-themeable titlebars */
#define FANCY_TITLEBARS
/* Define if gdk-imlib is used */
/* Define if gdk-imlib is used */
#undef GDK_IMLIB
#undef GDK_IMLIB
(-) fvwm-2.4.7.orig/fvwm/borders.c (-8 / +205 lines)
 Lines 271-280    Link Here 
  case MiniIconButton:
  case MiniIconButton:
  case PixmapButton:
  case PixmapButton:
  case TiledPixmapButton:
  case TiledPixmapButton:
#ifdef FANCY_TITLEBARS
  case MultiPixmap:       /* in case of UseTitleStyle */
#endif
    if (type == PixmapButton || type == TiledPixmapButton)
    if (type == PixmapButton || type == TiledPixmapButton)
    {
    {
      p = df->u.p;
      p = df->u.p;
    }
    }
#ifdef FANCY_TITLEBARS
    else if (type == MultiPixmap) {
      if (left1right0 && df->u.multi_pixmaps[TBP_LEFT_BUTTONS])
        p = df->u.multi_pixmaps[TBP_LEFT_BUTTONS];
      else if (!left1right0 && df->u.multi_pixmaps[TBP_RIGHT_BUTTONS])
        p = df->u.multi_pixmaps[TBP_RIGHT_BUTTONS];
      else if (df->u.multi_pixmaps[TBP_BUTTONS])
        p = df->u.multi_pixmaps[TBP_BUTTONS];
      else if (left1right0 && df->u.multi_pixmaps[TBP_LEFT_MAIN])
        p = df->u.multi_pixmaps[TBP_LEFT_MAIN];
      else if (!left1right0 && df->u.multi_pixmaps[TBP_RIGHT_MAIN])
        p = df->u.multi_pixmaps[TBP_RIGHT_MAIN];
      else
        p = df->u.multi_pixmaps[TBP_MAIN];
    }
#endif
    else
    else
    {
    {
      if (!t->mini_icon)
      if (!t->mini_icon)
 Lines 298-303    Link Here 
    if (is_lowest && !p->mask && pbutton_background_pixmap)
    if (is_lowest && !p->mask && pbutton_background_pixmap)
    {
    {
      if (type == TiledPixmapButton ||
      if (type == TiledPixmapButton ||
#ifdef FANCY_TITLEBARS
          type == MultiPixmap ||
#endif
	  (p && p->width >= width && p->height >= height))
	  (p && p->width >= width && p->height >= height))
      {
      {
	/* better performance: set a background pixmap if possible, i.e. if the
	/* better performance: set a background pixmap if possible, i.e. if the
 Lines 326-332    Link Here 
	XClearWindow(dpy, win);
	XClearWindow(dpy, win);
      }
      }
    }
    }
    if (type != TiledPixmapButton)
    if (type != TiledPixmapButton
#ifdef FANCY_TITLEBARS
        && type != MultiPixmap
#endif
       )
    {
    {
      if (DFS_H_JUSTIFICATION(df->style) == JUST_RIGHT)
      if (DFS_H_JUSTIFICATION(df->style) == JUST_RIGHT)
	x += (int)(width - p->width);
	x += (int)(width - p->width);
 Lines 354-360    Link Here 
    XSetClipMask(dpy, Scr.TransMaskGC, p->mask);
    XSetClipMask(dpy, Scr.TransMaskGC, p->mask);
    XSetClipOrigin(dpy, Scr.TransMaskGC, x, y);
    XSetClipOrigin(dpy, Scr.TransMaskGC, x, y);
    if (type != TiledPixmapButton)
    if (type != TiledPixmapButton
#ifdef FANCY_TITLEBARS
        && type != MultiPixmap
#endif
       )
    {
    {
      int cx = x;
      int cx = x;
      int cy = y;
      int cy = y;
 Lines 448-453    Link Here 
  return;
  return;
}
}
#ifdef FANCY_TITLEBARS
/****************************************************************************
 *
 *  Tile or stretch src into dest, starting at the given location and
 *  continuing for the given width and height. This is a utility function used
 *  by DrawMultiPixmapTitlebar. (tril@igs.net)
 *
 ****************************************************************************/
static void RenderIntoWindow(GC gc, Picture *src, Window dest, int x_start,
                             int y_start, int width, int height, Bool stretch)
{
  Pixmap pm;
  if (stretch)
    pm = CreateStretchPixmap(dpy, src->picture, src->width, src->height,
                             src->depth, width, height, gc);
  else
    pm = CreateTiledPixmap(dpy, src->picture, src->width, src->height,
                           width, height, src->depth, gc);
  XCopyArea(dpy, pm, dest, gc, 0, 0, width, height, x_start, y_start);
  XFreePixmap(dpy, pm);
}
/****************************************************************************
 *
 *  Redraws multi-pixmap titlebar (tril@igs.net)
 *
 ****************************************************************************/
static void DrawMultiPixmapTitlebar(FvwmWindow *window, DecorFace *df)
{
  Window       title_win;
  GC           gc;
  const char  *title;
  Picture    **pm;
  short        stretch_flags;
  int          title_width, title_height, text_width, text_offset, text_y_pos;
  int          left_space, right_space, under_offset, under_width;
  pm = df->u.multi_pixmaps;
  stretch_flags = df->u.multi_stretch_flags;
  gc = Scr.TitleGC;
  XSetClipMask(dpy, gc, None);
  title_win = window->title_w;
  title = window->name;
  title_width = window->title_g.width;
  title_height = window->title_g.height;
  if (pm[TBP_MAIN])
    RenderIntoWindow(gc, pm[TBP_MAIN], title_win, 0, 0, title_width,
                     title_height, (stretch_flags & (1 << TBP_MAIN)));
  else if (!title)
    RenderIntoWindow(gc, pm[TBP_LEFT_MAIN], title_win, 0, 0, title_width,
                     title_height, (stretch_flags & (1 << TBP_LEFT_MAIN)));
  if (title) {
#ifdef I18N_MB
    text_width = XmbTextEscapement(window->title_font.fontset, title,
                                   strlen(title));
#else
    text_width = XTextWidth(window->title_font.font, title, strlen(title));
#endif
    if (text_width > title_width)
      text_width = title_width;
    switch (TB_JUSTIFICATION(GetDecor(window, titlebar))) {
    case JUST_LEFT:
      text_offset = TITLE_PADDING;
      if (pm[TBP_LEFT_OF_TEXT])
        text_offset += pm[TBP_LEFT_OF_TEXT]->width;
      if (pm[TBP_LEFT_END])
        text_offset += pm[TBP_LEFT_END]->width;
      if (text_offset > title_width - text_width)
        text_offset = title_width - text_width;
      break;
    case JUST_RIGHT:
      text_offset = title_width - text_width - TITLE_PADDING;
      if (pm[TBP_RIGHT_OF_TEXT])
        text_offset -= pm[TBP_RIGHT_OF_TEXT]->width;
      if (pm[TBP_RIGHT_END])
        text_offset -= pm[TBP_RIGHT_END]->width;
      if (text_offset < 0)
        text_offset = 0;
      break;
    default:
      text_offset = (title_width - text_width) / 2;
      break;
    }
    under_offset = text_offset;
    under_width = text_width;
    /* If there's title padding, put it *inside* the undertext area: */
    if (under_offset >= TITLE_PADDING) {
      under_offset -= TITLE_PADDING;
      under_width += TITLE_PADDING;
    }
    if (under_offset + under_width + TITLE_PADDING <= title_width)
      under_width += TITLE_PADDING;
    left_space = under_offset;
    right_space = title_width - left_space - under_width;
    if (pm[TBP_LEFT_MAIN] && left_space > 0)
      RenderIntoWindow(gc, pm[TBP_LEFT_MAIN], title_win, 0, 0, left_space,
                       title_height, (stretch_flags & (1 << TBP_LEFT_MAIN)));
    if (pm[TBP_RIGHT_MAIN] && right_space > 0)
      RenderIntoWindow(gc, pm[TBP_RIGHT_MAIN], title_win,
                       under_offset + under_width, 0, right_space,
                       title_height, (stretch_flags & (1 << TBP_RIGHT_MAIN)));
    if (pm[TBP_UNDER_TEXT] && under_width > 0)
      RenderIntoWindow(gc, pm[TBP_UNDER_TEXT], title_win, under_offset, 0,
                       under_width, title_height,
                       (stretch_flags & (1 << TBP_UNDER_TEXT)));
    if (pm[TBP_LEFT_OF_TEXT] &&
        pm[TBP_LEFT_OF_TEXT]->width <= left_space) {
      XCopyArea(dpy, pm[TBP_LEFT_OF_TEXT]->picture, title_win, gc, 0, 0,
                pm[TBP_LEFT_OF_TEXT]->width, title_height,
                under_offset - pm[TBP_LEFT_OF_TEXT]->width, 0);
      left_space -= pm[TBP_LEFT_OF_TEXT]->width;
    }
    if (pm[TBP_RIGHT_OF_TEXT] &&
        pm[TBP_RIGHT_OF_TEXT]->width <= right_space) {
      XCopyArea(dpy, pm[TBP_RIGHT_OF_TEXT]->picture, title_win, gc, 0, 0,
                pm[TBP_RIGHT_OF_TEXT]->width, title_height,
                under_offset + under_width, 0);
      right_space -= pm[TBP_RIGHT_OF_TEXT]->width;
    }
    text_y_pos = title_height
                 - (title_height - window->title_font.font->ascent) / 2
                 - 1;
    if (title_height > 19)
      text_y_pos--;
    if (text_y_pos < 0)
      text_y_pos = 0;
#ifdef I18N_MB
    XmbDrawString(dpy, title_win, window->title_font.fontset, gc, text_offset,
                  gc, text_offset, text_y_pos, title, strlen(title));
#else
    XDrawString(dpy, title_win, gc, text_offset, text_y_pos, title,
                strlen(title));
#endif
  }
  else
    left_space = right_space = title_width;
  if (pm[TBP_LEFT_END] && pm[TBP_LEFT_END]->width <= left_space)
    XCopyArea(dpy, pm[TBP_LEFT_END]->picture, title_win, gc, 0, 0,
              pm[TBP_LEFT_END]->width, title_height, 0, 0);
  if (pm[TBP_RIGHT_END] && pm[TBP_RIGHT_END]->width <= right_space)
    XCopyArea(dpy, pm[TBP_RIGHT_END]->picture, title_win, gc, 0, 0,
              pm[TBP_RIGHT_END]->width, title_height,
              title_width - pm[TBP_RIGHT_END]->width, 0);
}
#endif /* FANCY_TITLEBARS */
/* rules to get button state */
/* rules to get button state */
static enum ButtonState get_button_state(
static enum ButtonState get_button_state(
  Bool has_focus, Bool toggled, Window w)
  Bool has_focus, Bool toggled, Window w)
 Lines 1029-1034    Link Here 
  Window expose_win, XRectangle *rclip)
  Window expose_win, XRectangle *rclip)
{
{
  int i;
  int i;
  int left1right0;
  Bool is_lowest = True;
  Bool is_lowest = True;
  Pixmap *pass_bg_pixmap;
  Pixmap *pass_bg_pixmap;
 Lines 1042-1049    Link Here 
  for (i = 0; i < NUMBER_OF_BUTTONS; i++)
  for (i = 0; i < NUMBER_OF_BUTTONS; i++)
  {
  {
    if (t->button_w[i] != None && (((i & 1) && i / 2 < Scr.nr_right_buttons) ||
    left1right0 = !(i&1);
				   (!(i & 1) && i / 2 < Scr.nr_left_buttons)))
    if (t->button_w[i] != None &&
        ((!left1right0 && i/2 < Scr.nr_right_buttons) ||
         (left1right0  && i/2 < Scr.nr_left_buttons)))
    {
    {
      mwm_flags stateflags =
      mwm_flags stateflags =
	TB_MWM_DECOR_FLAGS(GetDecor(t, buttons[i]));
	TB_MWM_DECOR_FLAGS(GetDecor(t, buttons[i]));
 Lines 1097-1104    Link Here 
	    DrawButton(t, t->button_w[i], t->title_g.height, t->title_g.height,
	    DrawButton(t, t->button_w[i], t->title_g.height, t->title_g.height,
		       tsdf, cd->relief_gc, cd->shadow_gc,
		       tsdf, cd->relief_gc, cd->shadow_gc,
		       cd->fore_color, cd->back_color, is_lowest,
		       cd->fore_color, cd->back_color, is_lowest,
		       TB_MWM_DECOR_FLAGS(GetDecor(t, buttons[i])), 1, NULL,
		       TB_MWM_DECOR_FLAGS(GetDecor(t, buttons[i])),
		       pass_bg_pixmap);
                       left1right0, NULL, pass_bg_pixmap);
	    is_lowest = False;
	    is_lowest = False;
	  }
	  }
	}
	}
 Lines 1110-1117    Link Here 
	  DrawButton(t, t->button_w[i], t->title_g.height, t->title_g.height,
	  DrawButton(t, t->button_w[i], t->title_g.height, t->title_g.height,
		     df, cd->relief_gc, cd->shadow_gc,
		     df, cd->relief_gc, cd->shadow_gc,
		     cd->fore_color, cd->back_color, is_lowest,
		     cd->fore_color, cd->back_color, is_lowest,
		     TB_MWM_DECOR_FLAGS(GetDecor(t, buttons[i])), 1, NULL,
		     TB_MWM_DECOR_FLAGS(GetDecor(t, buttons[i])), left1right0,
		     pass_bg_pixmap);
                     NULL, pass_bg_pixmap);
	  is_lowest = False;
	  is_lowest = False;
	}
	}
 Lines 1276-1281    Link Here 
    /* draw compound titlebar (veliaa@rpi.edu) */
    /* draw compound titlebar (veliaa@rpi.edu) */
    Bool is_lowest = True;
    Bool is_lowest = True;
#ifdef FANCY_TITLEBARS
    if (df->style.face_type == MultiPixmap)
      DrawMultiPixmapTitlebar(t, df);
    else
#endif
    if (PressedW == t->title_w)
    if (PressedW == t->title_w)
    {
    {
#ifdef MULTISTYLE
#ifdef MULTISTYLE
 Lines 1319-1324    Link Here 
      break;
      break;
    }
    }
#ifdef FANCY_TITLEBARS
    if (TB_STATE(GetDecor(t, titlebar))[title_state].style.face_type
        != MultiPixmap)
#endif
    {
#ifdef I18N_MB
#ifdef I18N_MB
    if(t->name != (char *)NULL)
    if(t->name != (char *)NULL)
      XmbDrawString(dpy, t->title_w, t->title_font.fontset,
      XmbDrawString(dpy, t->title_w, t->title_font.fontset,
 Lines 1329-1334    Link Here 
      XDrawString(dpy, t->title_w, Scr.TitleGC, hor_off,
      XDrawString(dpy, t->title_w, Scr.TitleGC, hor_off,
		  t->title_font.y + 1, t->name, strlen(t->name));
		  t->title_font.y + 1, t->name, strlen(t->name));
#endif
#endif
    }
  }
  }
  /*
  /*
(-) fvwm-2.4.7.orig/fvwm/builtins.c (+104 lines)
 Lines 63-68    Link Here 
static char *ReadTitleButton(
static char *ReadTitleButton(
    char *s, TitleButton *tb, Boolean append, int button);
    char *s, TitleButton *tb, Boolean append, int button);
#ifdef FANCY_TITLEBARS
static char *ReadMultiPixmapDecor(char *s, DecorFace *df);
#endif
static void DestroyFvwmDecor(FvwmDecor *decor);
static void DestroyFvwmDecor(FvwmDecor *decor);
extern float rgpctMovementDefault[32];
extern float rgpctMovementDefault[32];
 Lines 1401-1406    Link Here 
void FreeDecorFace(Display *dpy, DecorFace *df)
void FreeDecorFace(Display *dpy, DecorFace *df)
{
{
#ifdef FANCY_TITLEBARS
  int i;
#endif
  switch (DFS_FACE_TYPE(df->style))
  switch (DFS_FACE_TYPE(df->style))
  {
  {
  case GradientButton:
  case GradientButton:
 Lines 1418-1423    Link Here 
      DestroyPicture(dpy, df->u.p);
      DestroyPicture(dpy, df->u.p);
    break;
    break;
#ifdef FANCY_TITLEBARS
  case MultiPixmap:
    if (df->u.multi_pixmaps) {
      for (i=0; i < NUM_TB_PIXMAPS; i++) {
        if (df->u.multi_pixmaps[i])
          DestroyPicture(dpy, df->u.multi_pixmaps[i]);
      }
      free(df->u.multi_pixmaps);
    }
    break;
#endif
  case VectorButton:
  case VectorButton:
  case DefaultVectorButton:
  case DefaultVectorButton:
    if (df->u.vector.x)
    if (df->u.vector.x)
 Lines 1649-1654    Link Here 
      else
      else
	DFS_FACE_TYPE(df->style) = PixmapButton;
	DFS_FACE_TYPE(df->style) = PixmapButton;
    }
    }
#ifdef FANCY_TITLEBARS
    else if (strncasecmp(style,"MultiPixmap",11)==0) {
      if (button != -1) {
        if (verbose)
          fvwm_msg(ERR, "ReadDecorFace",
                   "MultiPixmap is only valid for TitleStyle");
        return False;
      }
      s = ReadMultiPixmapDecor(s, df);
      if (!s)
        return False;
    }
#endif
#ifdef MINI_ICONS
#ifdef MINI_ICONS
    else if (strncasecmp (style, "MiniIcon", 8) == 0)
    else if (strncasecmp (style, "MiniIcon", 8) == 0)
    {
    {
 Lines 1956-1961    Link Here 
  return end;
  return end;
}
}
#ifdef FANCY_TITLEBARS
/*****************************************************************************
 *
 * Reads a multi-pixmap titlebar config. (tril@igs.net)
 *
 ****************************************************************************/
static char *ReadMultiPixmapDecor(char *s, DecorFace *df)
{
  static char *pm_names[NUM_TB_PIXMAPS+1] = {
    "Main",
    "LeftMain",
    "RightMain",
    "UnderText",
    "LeftOfText",
    "RightOfText",
    "LeftEnd",
    "RightEnd",
    "Buttons",
    "LeftButtons",
    "RightButtons",
    NULL
  };
  Picture **pm;
  char *token;
  Bool stretched;
  int pm_id, i;
  df->style.face_type = MultiPixmap;
  df->u.multi_pixmaps = pm =
    (Picture**)safecalloc(NUM_TB_PIXMAPS, sizeof(Picture*));
  s = GetNextTokenIndex(s, pm_names, 0, &pm_id);
  while (pm_id >= 0) {
    s = DoPeekToken(s, &token, ",()", NULL, NULL);
    stretched = False;
    if (StrEquals(token, "stretched")) {
      stretched = True;
      s = DoPeekToken(s, &token, ",", NULL, NULL);
    }
    else if (StrEquals(token, "tiled"))
      s = DoPeekToken(s, &token, ",", NULL, NULL);
    if (!token)
      break;
    if (pm[pm_id]) {
      fvwm_msg(WARN, "ReadMultiPixmapDecor",
               "Ignoring already-specified %s pixmap", pm_names[i]);
      continue;
    }
    if (stretched)
      df->u.multi_stretch_flags |= (1 << pm_id);
    pm[pm_id] = CachePicture(dpy, Scr.NoFocusWin, NULL, token, Scr.ColorLimit);
    if (!pm[pm_id])
      fvwm_msg(ERR, "ReadMultiPixmapDecor", "Pixmap '%s' could not be loaded",
               token);
    s = GetNextTokenIndex(s, pm_names, 0, &pm_id);
  }
  if (!pm[TBP_MAIN] && !(pm[TBP_LEFT_MAIN] && pm[TBP_RIGHT_MAIN])) {
    fvwm_msg(ERR, "ReadMultiPixmapDecor",
             "No Main pixmap found for TitleStyle MultiPixmap "
             "(you must specify either Main, or both LeftMain and RightMain)");
    for (i=0; i < NUM_TB_PIXMAPS; i++) {
      if (pm[i])
        DestroyPicture(dpy, pm[i]);
    }
    free(pm);
    return NULL;
  }
  return s;
}
#endif /* FANCY_TITLEBARS */
#ifdef USEDECOR
#ifdef USEDECOR
/*****************************************************************************
/*****************************************************************************
(-) fvwm-2.4.7.orig/fvwm/fvwm2.1 (+39 lines)
 Lines 6306-6312    Link Here 
ButtonStyle All ActiveUp (-- flat) Inactive \\
ButtonStyle All ActiveUp (-- flat) Inactive \\
  (-- flat)
  (-- flat)
.EE
.EE
If fvwm is compiled with the FANCY_TITLEBARS option enabled, an additional
TitleStyle is available: MultiPixmap. This allows you to specify different
pixmaps for different parts of the titlebar. Some of them are tiled or
stretched to fit a particular space; others are discrete "transition" pixmaps
which are not resized in any way. The definable pixmaps are:
.EX
- Main (tiled/stretched): The main titlebar pixmap
- LeftMain (tiled/stretched): Left of title text
- RightMain (tiled/stretched): Right of title text
- UnderText (tiled/stretched): Underneath title text
- LeftOfText: Pixmap just to the left of the title text
- RightOfText: Pixmap just to the right of the title text
- LeftEnd: Pixmap at the far left end of the titlebar
  (just before buttons)
- RightEnd: Pixmap at the far right end of the titlebar
  (just before buttons)
- Buttons (tiled): Tiled under buttons in case of
  UseTitleStyle
- LeftButtons (tiled): Tiled under left buttons in case of
  UseTitleStyle
- RightButtons (tiled): Tiled under right buttons in case of
  UseTitleStyle
.EE
None of these are mandatory except for Main (or, if you don't define Main,
you must define both LeftMain and RightMain). If no "Buttons" pixmaps are
defined and UseTitleStyle is specified for one or more buttons, Main,
LeftMain, or RightMain will be used as appropriate.
The syntax for this style type is:
.EX
MultiPixmap <section> (<flag>) <pixmap filename>, ...
.EE
continuing for whatever pixmaps you want to define. By default, all
non-transition pixmaps are tiled. If you want one stretched instead (this is
allowed for Main, LeftMain, RightMain, and UnderText), add "(stretched)" after
the section name:
.EX
MultiPixmap Main (stretched) foo.xpm, UnderText bar.xpm
.EE
Otherwise you can omit (<flag>), as shown with UnderText.
.TP
.TP
.BI "UpdateDecor [" decor "]"
.BI "UpdateDecor [" decor "]"
This command is kept mainly for backwards compatibility.  Since
This command is kept mainly for backwards compatibility.  Since
(-) fvwm-2.4.7.orig/fvwm/fvwm2.1.orig (+7739 lines)
Line 0    Link Here 
.\" Formatting instructions for the fvwm man page:
.\"
.\"  - Do not use \f... formatting instructions
.\"    unless you have to, see below.
.\"  - Avoid single and double quotes wherever possible.
.\"
.\" For further details, please refer to the Linux Man-Page how-to.
.\"
.\"  context                                typeface       example
.\"  ---------------------------------- --------------  -----------------
.\"  filenames:                         italics (.I)    .I .fvwm2rc
.\"  command line options of fvwm2 cmd: bold (.B)       .B \-cmd
.\"  arguments of command line options: italics (.I)    .BI \-cmd command
.\"  built in commands:                 bold (.B)       .B Move
.\"  references to built in commands:   bold (.B)       .RB See Move
.\"  references to man page sections:   bold (.B)       .RB See SYNOPSIS
.\"  references to style options:       italics (.I)    .RI See Lenience
.\"  built in command options:          italics (.I)    .BI "Move " "0 0"
.\"  command syntax:                    bold/ita. (.BI) .BI "Move [" "x y" "]"
.\"  environment variables:             italics (.I)    .I $DISPLAY
.\"  key names:                         small (.SM)     .SM Tab
.\"  style names and strings:           double quotes   "stylename", "x"
.\"  single characters:                 single quotes   '@'
.\"  module names:                      bold (.B)       .B FvwmTheme
.\"  links to web pages:                bold (.B)       .B http://fvwm.org
.\"  acronyms:                          small (.SM)     .SM ICCCM
.\"
.\"
.\" The name fvwm is written in lower case throughout this man
.\" page.
.\"
.\" Note that the word "will" is rarely correct in a man page or
.\" any document. Describe what fvwm does, not what it will do,
.\" even if you haven't written the feature yet. dje 2/3/01
.\" (3/Feb/2001).
.\"
.\" A note to everyone who needs to write dates.  Don't use 2/3/01
.\" notation, a non-american person simply can't parse such
.\" sequence of digits.  Please use 3-Feb-2001 or 2001-02-03 forms.
.\" migo 16/May/2001.
.\"
.\" A note about the rule against \f... formatting.  On Solaris,
.\" AIX, and HPUX the ".BI" type commands are limited to 6
.\" arguments. use \f... formatting in that case.  See the lines
.\" formatted with ".IP".
.\"  dje 15/June/2001.
.\"
.\" @(#)fvwm-2.4.7 11 Apr 2002
.de EX		\"Begin example
.ne 5
.if n .sp 1
.if t .sp .5
.nf
.in +.5i
..
.de EE
.fi
.in -.5i
.if n .sp 1
.if t .sp .5
..
.ta .3i .6i .9i 1.2i 1.5i 1.8i
.TH FVWM2 1 "11 Apr 2002"
.UC
.SH NAME
fvwm2 \- F(?) Virtual Window Manager (version 2) for X11
.SH SYNOPSIS
.B fvwm2
.RB [ \-blackout ]
.RB [ \-clientId
.IR       id ]
.RB [ \-cmd
.IR       config_command ]
.RB [ \-d
.IR       displayname ]
.RB [ \-debug ]
.RB [ \-debug_stack_ring ]
.RB [ \-f
.IR       config_file ]
.RB [ \-h ]
.RB [ \-replace ]
.RB [ \-restore
.IR       state_file ]
.RB [ \-s ]
.RB [ \-version ]
.RB [ \-visual
.IR       visual_class ]
.RB [ \-visualId
.IR       id ]
.SH DESCRIPTION
Fvwm is a window manager for X11.  It is designed to minimize
memory consumption, provide a 3D look to window frames, and a
virtual desktop.
Note that there are several window managers around that have
"fvwm" in their name.  In the past, version 2.x of fvwm was
commonly called fvwm2 to distinguish it from the former version
1.x (fvwm or even fvwm1).  Since version 1.x has been replaced by
version 2.x a long time ago we simply call version 2.x and all
versions to come, fvwm, throughout this document, although the
executable program is named fvwm2.  There is an fvwm offspring
called fvwm95. Although it is very similar to older versions of
fvwm version 2 it is technically a different window manager that
has been developed by different people.  The main goal of fvwm95
was to supply a Windows 95 like look and feel.  Since then fvwm
has been greatly enhanced and only very few features of fvwm95 can
not be imitated by fvwm.  No active development has been going on
for fvwm95 for several years now.  Unfortunately Red Hat (a
popular Linux distributor) has a pre-configured fvwm package based
on fvwm version 2.x that is called fvwm95 too.
Fvwm provides both a large
.I virtual desktop
and
.I multiple disjoint desktops
which can be used separately or together.  The virtual desktop
allows you to pretend that your video screen is really quite
large, and you can scroll around within the desktop.  The multiple
disjoint desktops allow you to pretend that you really have
several screens to work at, but each screen is completely
unrelated to the others.
Fvwm provides
.I keyboard accelerators
which allow you to perform most window-manager functions,
including moving and resizing windows, and operating the menus,
using keyboard shortcuts.
Fvwm has also blurred the distinction between configuration
commands and built-in commands that most window-managers make.
Configuration commands typically set fonts, colors, menu contents,
key and mouse function bindings, while built-in commands typically
do things like raise and lower windows.  Fvwm makes no such
distinction, and allows, to the extent that is practical, anything
to be changed at any time.
Other noteworthy differences between Fvwm and other X11 window
managers are the introduction of the
.I SloppyFocus " and " NeverFocus
focus methods.  Focus policy can be specified for individual
windows.  Windows using
.I SloppyFocus
acquire focus when the pointer moves into them and retain focus
until some other window acquires it.  Such windows do not lose
focus when the pointer moves into the root window.  The
.I NeverFocus
policy is provided for use with windows into which one never types
(e.g. xclock, oclock, xbiff, xeyes, tuxeyes) - for example, if a
SloppyFocus terminal window has focus, moving the cursor over a
.I NeverFocus
decoration window won't deprive the terminal of focus.
.SH OPTIONS
These are the command line options that are recognized by fvwm:
.TP
.BI "-blackout"
This option is provided for backward compatibility only.  Blacking
out the screen during startup is not necessary anymore.
.TP
.BI "-clientId " id
This option is used when fvwm is started by a session
manager. Should not be used by a user.
.TP
.BI "-cmd " config_command
Causes fvwm to use
.I config_command
instead of
.RB "'Read"
.IR ".fvwm2rc'"
as its initialization command.  (Note that up to 10
.BR \-f " and " \-cmd
parameters can be given, and they are executed in the order
specified.)
.TP
.BI "-d " displayname
Manage the display called
.I displayname
instead of the name obtained from the environment variable
.IR "$DISPLAY" .
.TP
.BI "-debug"
Puts X transactions in synchronous mode, which dramatically slows
things down, but guarantees that fvwm's internal error messages
are correct. Also causes fvwm to output debug messages while
running.
.TP
.BI "-debug_stack_ring"
Enables stack ring debugging.  This option is only intended for
internal debugging and should only be used by developers.
.TP
.BI "-f " config_file
Causes fvwm to read
.I config_file
instead of
.I .fvwm2rc
as its initialization file.  This is equivalent to
.RB "-cmd 'Read"
.IR "config_file'."
.
.TP
.BI "-h"
A short usage description is printed.
.TP
.BI "-replace"
Try to take over from a previously running wm.  This does not work
unless the other wm is
.SM ICCCM
2.0 compliant.
.TP
.BI "-restore " state_file
This option is used when fvwm is started by a session manager.
Should not be used by a user.
.TP
.BI "-s"
On a multi-screen display, run fvwm only on the screen named in
the
.I $DISPLAY
environment variable or provided through the
.B -d
option. Normally, fvwm attempts to start up on all screens of a
multi-screen display.
.TP
.BI "-version"
Prints the version of fvwm to
.IR stderr .
Also prints an information about the compiled in support for
readline, rplay, stroke, xpm, gnome hints, session management and
multibyte characters.
.TP
.BI "-visual " visual_class
Causes fvwm to use
.I visual_class
for the window borders and menus.
.I visual_class
can be "StaticGray", "GrayScale", "StaticColor", "PseudoColor",
"TrueColor" or "DirectColor".
.TP
.BI "-visualId " id
Causes fvwm to use
.I id
as the visualId for the window borders and menus.
.I id
can be specified as N for decimal or 0xN for hexadecimal. See man
page of xdpyinfo for a list of supported visuals.
.SH ANATOMY OF A WINDOW
Fvwm puts a decorative border around most windows.  This border
consists of a bar on each side and a small L-shaped section on
each corner.  There is an additional top bar called the title-bar
which is used to display the name of the window.  In addition,
there are up to 10 title-bar buttons.  The top, side, and bottom
bars are collectively known as the side-bars.  The corner pieces
are called the frame.
Unless the standard defaults files are modified, pressing mouse
button 1 in the title or side-bars begins a move operation on the
window.  Pressing button 1 in the corner frame pieces begins a
resize operation.  Pressing button 2 anywhere in the border brings
up an extensive list of window operations.
Up to ten title-bar buttons may exist.  Their use is completely
user definable.  The default configuration has a title-bar button
on each side of the title-bar.  The one on the left is used to
bring up a list of window options, regardless of which mouse
button is used.  The one on the right is used to iconify the
window.  The number of title-bar buttons used depends on which
ones have mouse actions bound to them.  See the section on the
.B Mouse
command below.
.SH THE VIRTUAL DESKTOP
Fvwm provides multiple virtual desktops for users who wish to use
them.  The screen is a viewport onto a
.I desktop
which may be larger than the screen.  Several distinct desktops
can be accessed (concept: one desktop for each project, or one
desktop for each application, when view applications are
distinct).  Since each desktop can be larger than the physical
screen, divided into m by n
.I pages
which are each the size of the physical screen, windows which are
larger than the screen or large groups of related windows can
easily be viewed.
The (m by n) size (i.e. number of pages) of the virtual desktops
can be changed any time, by using the
.B DeskTopSize
built-in command.  All virtual desktops must be (are) the same
size.  The total number of distinct desktops does not need to be
specified, but is limited to approximately 4 billion total. All
windows on a range of desktops can be viewed in the
.BR FvwmPager ,
a miniature view of the desktops.  The pager is an accessory
program, called a module, which is not essential for the window
manager to operate.  Windows may also be listed, along with their
geometries, in a window list, accessible as a pop-up menu, or as a
separate window, called the
.B FvwmWinList
(another module).
Fvwm keeps the windows on the desktop in a layered stacking order;
a window in a lower layer never obscures a window in a higher
layer. The layer of a window can be changed by using the
.B Layer
command.  The concept of layers is a generalization of the
.I StaysOnTop
flag of older fvwm versions. The
.IR StaysOnTop " and " StaysPut
.B Style
options are now implemented by putting the windows in suitable
layers and the previously missing
.IB "StaysOnBottom " Style
option has been added.
.B Sticky
windows are windows which transcend the virtual desktop by
"Sticking to the screen's glass".  They always stay put on the
screen. This is convenient for things like clocks and xbiff's, so
you only need to run one such gadget and it always stays with you.
Icons can also be made to stick to the glass, if desired.
Window geometries are specified relative to the current viewport.
That is:
.EX
xterm -geometry +0+0
.EE
creates a window in the upper-left hand corner of the visible
portion of the screen.  It is permissible to specify geometries
which place windows on the virtual desktop, but off the screen.
For example, if the visible screen is 1000 by 1000 pixels, and the
desktop size is 3x3, and the current viewport is at the upper left
hand corner of the desktop, invoking:
.EX
xterm -geometry +1000+1000
.EE
places a window just off of the lower right hand corner of the
screen.  It can be found by moving the mouse to the lower right
hand corner of the screen and waiting for it to scroll into view.
A geometry specified as something like:
.EX
xterm -geometry -5-5
.EE
places the window's lower right hand corner 5 pixels from the
lower right corner of the visible portion of the screen.  Not all
applications support window geometries with negative offsets.
Some applications place the window's upper right hand corner 5
pixels above and to the left of the upper left hand corner of the
screen; others may do just plain bizarre things.
There are several ways to cause a window to map onto a desktop or
page other than the currently active one. The geometry technique
mentioned above (specifying x,y coordinates larger than the
physical screen size), however, suffers from the limitation of
being interpreted relative to the current viewport: the window may
not consistently appear on a specific page, unless you always
invoke the application from the same page.
A better way to place windows on a different page, screen or desk
from the currently mapped viewport is to use the
.IR StartsOnPage or StartsOnScreen
style specification (the successors to the older
.I StartsOnDesk
style) in the
.I .fvwm2rc
configuration file.  The placement is consistent: it does not
depend on your current location on the virtual desktop.
Some applications that understand standard Xt command line
arguments and X resources, like xterm and xfontsel, allow the user
to specify the start-up desk or page on the command line:
.EX
xterm -xrm "*Desk:1"
.EE
starts an xterm on desk number 1;
.EX
xterm -xrm "*Page:3 2 1"
.EE
starts an xterm two pages to the right and one down from the upper
left hand page of desk number 3.  Not all applications understand
the use of these options, however.  You could achieve the same
results with the following lines in your
.I .Xdefaults
file:
.EX
XTerm*Desk: 1
.EE
or
.EX
XTerm*Page: 3 2 1
.EE
.SH USE ON MULTI-SCREEN DISPLAYS
If the
.B -s
command line argument is not given, fvwm automatically starts up
on every screen on the specified display.  After fvwm starts each
screen is treated independently.  Restarts of fvwm need to be
performed separately on each screen.  The use of
.EX
 EdgeScroll 0 0
.EE
is strongly recommended for multi-screen displays.  You may need
to quit on each screen to quit from the X session completely.
This is not to be confused with Xinerama support.
.SH XINERAMA SUPPORT
Fvwm supports the Xinerama extension of newer X servers which
is similar to multi head support (multiple screens) but allows to
move windows between screens.  If Xinerama support has been
compiled into fvwm, it is used whenever fvwm runs on an X server
that supports and uses multiple screens via Xinerama.  Without
this option, the whole desktop is treated as one big screen.  For
example, menus might pop up right between two screens.  The
.BI EdgeResistance
command allows to specify an explicit resistance value for moving
windows over the screen edge between two Xinerama screens.
Xinerama support can be enabled or disabled on the fly or from the
configuration file with the
.B Xinerama
command.  Many modules and commands work nicely with Xinerama
displays.
Everywhere where a geometry in the usual X format can be supplied,
fvwm's Xinerama extension allows to specify a screen in addition
to the geometry (or even the screen alone).  To do this, a '@' is
added to the end of the geometry string followed by either the
screen number or a letter.  A number is taken as the number of the
Xinerama screen to be used (as configured in the X server).  The
letter can be one of 'g' for the global screen (the rectangle that
encloses all Xinerama screens), 'p' for the primary screen (see
below), 'c' for the current screen (the one that currently
contains the pointer).  If the X server does not support Xinerama
or only one screen is used, the screen bit is ignored.
.EX
Style * IconBox 64x300-0-0@p
.EE
Xinerama support can be configured to use a primary screen.  Fwvm
can be configured to place new windows and icons on this screen.
The primary screen is screen 0 by default but can be changed with
the
.B XineramaPrimaryScreen
command.
Xinerama support was designed to work out of the box with the same
configurations file that would work on a single screen.  It may
not work too well if the involved screens use different screen
resolutions.  In this situation, windows may get stuck in the
portion of the whole desktop that belongs to neither screen.  If
this happens, the windows or icons can be retrieved with the
command
.EX
All MoveToScreen
.EE
that can be entered in an FvwmConsole window or with FvwmCommand.
For multi-screen implementations other than Xinerama, such as
Single Logical Screen, it is possible to simulate a Xinerama
configuration if the total screen seen by FVWM is made up of
equal sized monitors in a rectangular grid.  The commands
.BR XineramaSls " and " XineramaSlsSize
are used to configure this feature.
.SH INITIALIZATION
During initialization, fvwm searches for a configuration file
which describes key and button bindings, and many other
things. The format of these files is described later.  Fvwm first
searches for configuration files using the command
.EX
.BI "Read " .fvwm2rc
.EE
This looks for
.IR .fvwm2rc " in "
.IR "$HOME/.fvwm" " or " "$FVWM_USERDIR"
directories, as described in
.B Read
below.  If this fails, fvwm also searches for this file in the
.I $HOME
directory or for
.I system.fvwm2rc
file in the system place.  If a configuration file is not found,
any mouse button or the
.SM Help
or
.SM F1
keys on the root window brings up menus and forms that can create
a starting configuration file.
Fvwm sets two environment variables which are inherited by its
children.  These are
.I $DISPLAY
which describes the display on which fvwm is running.
.I $DISPLAY
may be
.I unix:0.0
or
.IR ":0.0" ,
which doesn't work too well when passed through rsh to another
machine, so
.I $HOSTDISPLAY
is set to a network-ready description of the display.
.I $HOSTDISPLAY
always uses the TCP/IP transport protocol (even for a local
connection) so
.I $DISPLAY
should be used for local connections, as it may use Unix-domain
sockets, which are faster.
If you want to start some applications or modules with fvwm, you
can simply put
.EX
Exec app
.EE
or
.EX
Module FvwmXxx
.EE
into your
.IR .fvwm2rc ,
but it is not recommended; do this only if you know what you are
doing. It is usually critical to start applications or modules
after
.I .fvwm2rc
is read, because it contains styles or module configurations which
can affect window appearance and functionality.
The standard way to start applications or modules on fvwm's start
up is to add them to an initialization function (usually
.BR StartFunction " or " InitFunction ).
This way they are only started after fvwm reads the entire
.IR .fvwm2rc .
Fvwm has three special functions for initialization:
.BR StartFunction ,
which is executed on startups and restarts;
.BR InitFunction " and " RestartFunction ,
which are executed during initialization and restarts
(respectively) just after StartFunction. These functions may be
customized in a user's
.I .fvwm2rc
file via the
.B AddToFunc
command (described later) to start up modules, xterms, or whatever
you'd like to have started by fvwm.
Fvwm has also a special exit function:
. BR ExitFunction ,
executed when exiting or restarting before actually quitting.
It could be used to explicitly kill modules, etc.
If fvwm is run under a session manager, functions
.BR SessionInitFunction " and " SessionRestartFunction
are executed instead of InitFunction and RestartFunction.
This helps to define the user's
.I .fvwm2rc
file to be good for both running under a session manager and
without it.  Generally it is a bad idea to start xterms or other
applications in "Session*" functions.  Also someone can decide to
start different modules while running under a session manager or
not.  For the similar purposes
. B SessionExitFunction
is used instead of ExitFunction.
.EX
DestroyFunc StartFunction
AddToFunc StartFunction
 + I ModuleSynchronous FvwmTheme
 + I Module FvwmPager * *
 + I Module FvwmButtons
DestroyFunc InitFunction
AddToFunc InitFunction
 + I Module FvwmBanner
 + I Module FvwmTaskBar
 + I xsetroot -solid cyan
 + I Exec xterm
 + I Exec netscape
DestroyFunc RestartFunction
AddToFunc RestartFunction
 + I Module FvwmTaskBar
DestroyFunc SessionInitFunction
AddToFunc SessionInitFunction
 + I Module FvwmBanner
DestroyFunc SessionRestartFunction
AddToFunc SessionRestartFunction
 + I Nop
.EE
You don't need to define all special functions if some are empty.
.SH COMPILATION OPTIONS
Fvwm has a number of compile-time options.  If you have trouble
using a certain command or feature, check to see if support for it
was included at compile time.  Optional features are described in
the
.I config.h
file that is generated during compilation.
.SH ICONS
The basic fvwm configuration uses monochrome bitmap icons.  If
.B XPM
extensions are compiled in, then color icons can be used. In order
to use these options you need the XPM package, as described in the
.I INSTALL.fvwm
file.
If both the
.BR SHAPE " and " XPM
options are compiled in you get shaped color icons, which are very
spiffy.
.SH MODULES
A module is a separate program which runs as a separate Unix
process but transmits commands to fvwm to execute.  Users can
write their own modules to do any weird or bizarre manipulations
without bloating or affecting the integrity of fvwm itself.
Modules must be spawned by fvwm so that it can set up two pipes
for fvwm and the module to communicate with.  The pipes are
already open for the module when it starts and the file
descriptors for the pipes are provided as command line arguments.
Modules can be spawned during fvwm at any time during the X
session by use of the
.B Module
built-in command.  Modules can exist for the duration of the X
session, or can perform a single task and exit.  If the module is
still active when fvwm is told to quit, then fvwm closes the
communication pipes and waits to receive a SIGCHLD from the
module, indicating that it has detected the pipe closure and has
exited.  If modules fail to detect the pipe closure fvwm exits
after approximately 30 seconds anyway.  The number of
simultaneously executing modules is limited by the operating
system's maximum number of simultaneously open files, usually
between 60 and 256.
Modules simply transmit text commands to the fvwm built-in command
engine.  Text commands are formatted just as in the case of a
mouse binding in the
.I .fvwm2rc
setup file.  Certain auxiliary information is also transmitted, as
in the sample module
.BR FvwmButtons .
The
.B FvwmButtons
module is documented in its own man page.
Please refer to the
.B "MODULE COMMANDS"
section for details.
.SH ICCCM COMPLIANCE
Fvwm attempts to be
.SM ICCCM
2.0 compliant.  In addition,
.SM ICCCM
states that it should be possible for applications to receive any
keystroke, which is not consistent with the keyboard shortcut
approach used in fvwm and most other window managers.  In
particular you cannot have the same keyboard shortcuts working
with your fvwm and another fvwm running within Xnest (a nested X
server running in a window).  The same problem exists with mouse
bindings.
The
.SM ICCCM
states that windows possessing the property
.EX
WM_HINTS(WM_HINTS):
    Client accepts input or input focus: False
.EE
should not be given the keyboard input focus by the window
manager. These windows can take the input focus by themselves,
however.  A number of applications set this property, and yet
expect the window-manager to give them the keyboard focus anyway,
so fvwm provides a window-style,
.IR Lenience ", "
which allows fvwm to overlook this
.SM ICCCM
rule.  Even with this window-style it is not guaranteed that the
application accepts focus.
The differences between
.SM ICCCM
1.1 and 2.0 include the ability to take over from a running
.SM ICCCM
2.0 compliant window manager; thus
.EX
fvwm2; vi .fvwm2rc; fvwm2 -replace
.EE
resembles the
.B Restart
command.  It is not exactly the same, since killing the previously
running wm may terminate your X session, if the wm was started as
the last client in your
.IR .Xclients " or " .Xsession
file.
Further additions are support for client-side colormap
installation (see the .SM ICCCM for details) and the urgency hint.
Clients can set this hint in the WM_HINTS property of their window
and expect the window manager to attract the users attention to
the window.  Fvwm has two re-definable functions for this purpose,
"UrgencyFunc" and "UrgencyDoneFunc", which are executed when the
flag is set/cleared.  Their default definitions are:
.EX
AddToFunc UrgencyFunc
 + I Iconify off
 + I FlipFocus
 + I Raise
 + I WarpToWindow 5p 5p
AddToFunc UrgencyDoneFunc
 + I Nop
.EE
.SH GNOME COMPLIANCE
Fvwm attempts to be
.SM GNOME
compliant.  Check
.B http://www.gnome.org
for what that may mean.
.SM GNOME
support is a compile time option which is on by default.  To
disable GNOME hints for some or all windows, the
.I GNOMEIgnoreHints
style can be used.
.SH MWM COMPATIBILITY
Fvwm provides options to emulate Motif Window Manager (Mwm) as
well as possible.  Please refer to the
.B Emulate
command as well as to the Mwm specific options of the
.BR Style " and " MenuStyle
commands for details.
.SH OPEN LOOK and XVIEW COMPATIBILITY
Fvwm supports all the Open Look decoration hints (except
pushpins). Most (perhaps all) Open Look applications have a
strange notion of keyboard focus handling.  Although a lot of work
went into fvwm to work well with these, you may still encounter
problems. Should you use any such application, please add the
following line to your .fvwm2rc:
.EX
Style * OLDecor
.EE
.SH M4 PREPROCESSING
.PP
M4 pre-processing is handled by a module in fvwm.  To get more
details, try man
.BR FvwmM4 .
In short, if you want fvwm to parse your files with m4, then
replace the command
.B Read
with
.B FvwmM4
in your
.I .fvwm2rc
file (if it appears at all), and start fvwm with the command
.EX
fvwm2 -cmd "FvwmM4 .fvwm2rc"
.EE
.SH CPP PREPROCESSING
.PP
Cpp is the C-language pre-processor.  fvwm offers cpp processing
which mirrors the m4 pre-processing.  To find out about it,
re-read the M4 section above, but replace "m4" with "cpp".
.SH AUTO-RAISE
.PP
Windows can be automatically raised when it receives focus, or
some number of milliseconds after it receives focus, by using the
auto-raise module,
.BR FvwmAuto .
.SH CONFIGURATION FILES
The configuration file is used to describe mouse and button
bindings, colors, the virtual display size, and related items.
The initialization configuration file is typically called
.IR .fvwm2rc .
By using the
.B Read
built-in, it is easy to read in new configuration files as you go.
Lines beginning with '#' are ignored by fvwm.  Lines starting with
'*' are expected to contain module configuration commands (rather
than configuration commands for fvwm itself). Like in shell
scripts embedded newlines in a configuration file line can be
quoted by preceding them with a backslash.  All lines linked in
this fashion are treated as a single line.  The newline itself is
ignored.
Fvwm makes no distinction between configuration commands and
built-in commands, so anything mentioned in the built-in commands
section can be placed on a line by itself for fvwm to execute as
it reads the configuration file, or it can be placed as an
executable command in a menu or bound to a mouse button or a
keyboard key.  It is left as an exercise for the user to decide
which function make sense for initialization and which ones make
sense for run-time.
.SH SUPPLIED CONFIGURATION
A sample configuration file,
.IR .fvwm2rc ,
is supplied with the fvwm distribution.  It is well commented and
can be used as a source of examples for fvwm configuration.
.\" .SH INTERNATIONALIZATION
.\" Internationalized fvwm enables to display not only LATIN-1
.\" characters but also multi byte characters such as Japanese,
.\" Korean, etc. You should set up your environment variable
.\" .IR LC_TYPE " or " LANG ,
.\" to enable this feature.  Also, you should specify proper
.\" .I FONTSET
.\" instead of
.\" .IR FONT .
.\" Note that no catalog-file or input-methods are implemented.
.SH KEYBOARD SHORTCUTS
Almost all window manager operations can be performed from the
keyboard so mouse-less operation should be possible.  In addition
to scrolling around the virtual desktop by binding the
.B Scroll
built-in to appropriate keys,
.BR Popup ", " Move ", " Resize ", "
and most other built-ins can be bound to keys.  Once a built in
function is started the pointer is moved by using the up, down,
left, and right arrows, and the action is terminated by pressing
return.  Holding down the
.SM Shift
key causes the pointer movement to go in larger steps and holding
down the
.SM control
key causes the cursor movement to go in smaller steps. Standard
emacs and vi cursor movement controls (
.SM Ctrl-n,
.SM Ctrl-p,
.SM Ctrl-f,
.SM Ctrl-b,
and
.SM Ctrl-j,
.SM Ctrl-k,
.SM Ctrl-h,
.SM Ctrl-l
) can be used instead of the arrow keys.
.SH SESSION MANAGEMENT
Fvwm supports session management according to the X Session
Management Protocol.  It saves and restores window position, size,
stacking order, desk, stickiness, shadedness, maximizedness,
iconifiedness for all windows. Furthermore, some global state is
saved.
Fvwm doesn't save any information regarding styles, decors,
functions or menus.  If you change any on these resources during a
session (e.g. by issuing
.B Style
commands or by using various modules), these changes are lost
after saving and restarting the session.  To become permanent,
such changes have to be added to the configuration file.
Note further that the current implementation has the following
anomaly when used on a multi-screen display: Starting fvwm for the
first time, fvwm manages all screens by forking a copy of itself
for each screen.  Every copy knows its parent and issuing a
.B Quit
command to any instance of fvwm kills the master and thus all
copies of fvwm.  When you save and restart the session, the
session manager brings up a copy of fvwm on each screen, but this
time they are started as individual instances managing one screen
only.  Thus a
.B Quit
kills only the copy it was sent to.  This is probably not a very
serious problem, since with session management, you are supposed
to quit a session through the session manager anyway. If it is
really needed,
.EX
Exec exec killall fvwm2
.EE
still kills all copies of fvwm.  Your system must have the
.B killall
command though.
.SH BOOLEAN ARGUMENTS
A number of commands take one or several boolean arguments.  These
take a few equivalent inputs: "yes", "on", "true", "t" and "y" all
evaluate to true while "no", "off", "false", "f" and "n" evaluate
to false.  Some commands allow "toggle" too which means that the
feature is disabled if it is currently enabled and vice versa.
.SH BUILT IN KEY AND MOUSE BINDINGS
The following commands are built-in to fvwm:
.EX
Key Help R A Popup MenuFvwmRoot
Key F1 R A Popup MenuFvwmRoot
Key Tab A M WindowList Root c c NoDeskSort
Key Escape A MC EscapeFunc
Mouse 0 R N Menu MenuFvwmRoot
Mouse 1 TS A FuncFvwmRaiseLowerX Move
Mouse 1 F  A FuncFvwmRaiseLowerX Resize
AddToFunc FuncFvwmRaiseLowerX I Raise
.EE
The
.SM Help
and
.SM F1
keys invoke a built-in menu that fvwm creates.  This is primarily
for new users that have not created their own configuration
file. Either key on the root (background) window pops up an menu
to help you get started.
The
.SM Tab
key pressed anywhere with the
.SM Meta
key (same as the
.SM Alt
key on PC keyboards) held down pop-ups a window list.
Mouse button 1 on the title-bar or side frame can move, raise or
lower a window.
Mouse button 1 on the window corners can resize, raise or lower a
window.
You can override or remove these bindings. To remove the window
list binding, use this:
.EX
Key Tab A M -
.EE
.SH BUILT IN COMMANDS
Fvwm supports a set of built-in functions which can be bound to
keyboard or mouse buttons.  If fvwm expects to find a built-in
function in a command, but fails, it checks to see if the
specified command should have been
.EX
Function (rest of command)
.EE
or
.EX
Module (rest of command)
.EE
This allows complex functions or modules to be invoked in a manner
which is fairly transparent to the configuration file.
Example: the
.I .fvwm2rc
file contains the line
.EX
HelpMe
.EE
Fvwm looks for a built-in command called "HelpMe", and fails.
Next it looks for a user-defined complex function called "HelpMe".
If no such user defined function exists, Fvwm tries to execute a
module called "HelpMe".
Note: There are many commands that affect look and feel of
specific, some or all windows, like
.BR Style ", " Mouse ", the " FvwmTheme
module and many others.  For performance reasons such changes are
not applied immediately but only when fvwm is idle, i.e. no user
interaction or module input is pending.  Specifically, new
.B Style
options that are set in a function are not applied until after the
function has completed.  This can sometimes lead to unwanted
effects.
To force that all pending changes are applied immediately, use the
.BR UpdateStyles ", " Refresh " or " RefreshWindow
commands.
.SS QUOTING
Quotes are required only when needed to make fvwm consider two or
more words to be a single argument.  Unnecessary quoting is
allowed.  If you want a quote character in your text, you must
escape it by using the backslash character.  For example, if you
have a pop-up menu called "Window-Ops", then you don't need
quotes:
.EX
Popup Window-Ops
.EE
but if you replace the dash with a space, then you need
quotes:
.EX
Popup "Window Ops"
.EE
The supported quoting characters are double quotes, single quotes
and reverse single quotes.  All three kinds of quotes are treated
in the same way.  Single characters can be quoted with a preceding
backslash.  Quoting single characters works even inside other
kinds of quotes.
.SS COMMAND EXPANSION
Whenever a fvwm command line is executed, fvwm performs parameter
expansion.  A parameter is a '$' followed by a single letter or a
word enclosed in brackets ($[...]).  If fvwm encounters an
unquoted parameter on the command line it expands it to a string
indicated by the parameter name.  Unknown parameters are left
untouched. Parameter expansion is performed before quoting.  To
quote a '$' use "$$".  Note that module configuration lines
(i.e. lines beginning with '*') are not fully expanded; for
backward compatibility single alphabetic-letter parameters (like
"$d" or "$n") are not expanded in these lines.
The general idea is to expand single letter parameters as soon as
possible.  So a "$d" is expanded immediately when read by the
parser, but "$3" is only expanded in the context of a complex
function with at least four parameters.  Otherwise it is left
untouched.  Similarly, "$c" is only expanded in the context of a
window.
Parameter expansion in the
.BR +
command is different than in normal commands.  If the command is
adding to a function, single letter parameters are expanded
normally which is often not what was intended.  To suppress
expansion the '$' has to be doubled.  Parameters enclosed in
brackets are protected from parameter expansion in these commands
so the '$' must not be doubled.
Example:
.EX
# Print the current desk number, horizontal
# page and the window's class.
Echo $d $[page.nx] $c
# But a function that prints $d needs $$,
# but not before $[page.nx] or $c:
AddToFunc PrintDeskNumber
.EE
Note: If this funtion is called outside a window context, it will
print "$c" instead of the class name.  It is usually not enough to
have the pointer over a window to have a context window.  To force
using the window with the focus, the
.B Current
command can be used:
.EX
Current Echo $d $[page.nx] $c
.EE
The parameters known by fvwm are:
.in +.5i
$$
.in +.3i
A literal '$'.
.in -.3i
.in -.5i
.in +.5i
$.
.in +.3i
The absolute directory of the currently Read file.  Intended for
creating relative and relocatable configuration trees.  If used
outside of any read file, the returned value is '.'.
.in -.3i
.in -.5i
.in +.5i
$c
.in +.3i
The window's resource class name or "$c" if no window is
associated with the command.
.in -.3i
.in -.5i
.in +.5i
$d
.in +.3i
The current desk number.
.in -.3i
.in -.5i
.in +.5i
$n
.in +.3i
The window's name or "$n" if no window is associated with the
command.
.in -.3i
.in -.5i
.in +.5i
$r
.in +.3i
The window's resource name or "$r" if no window is associated with
the command.
.in -.3i
.in -.5i
.in +.5i
$v
.in +.3i
The first line printed by the -version command line option.
.in -.3i
.in -.5i
.in +.5i
$w
.in +.3i
The window-id (expressed in hex, e.g. 0x10023c) of the window the
command was called for or "$w" if no window is associated with the
command.
.in -.3i
.in -.5i
.in +.5i
$x
.in +.3i
The x coordinate of the current viewport.
.in -.3i
.in -.5i
.in +.5i
$y
.in +.3i
The y coordinate of the current viewport.
.in -.3i
.in -.5i
.in +.5i
$0 to $9
.in +.3i
The positional parameters given to a complex function (a function
that has been defined with the
.B AddToFunc
command).  "$0" is replaced with the first parameter, "$1" with
the second parameter and so on.  If the corresponding parameter is
undefined, the "$..." is deleted from the command line.
.in -.3i
.in -.5i
.in +.5i
$*
.in +.3i
All positional parameters given to a complex function.  This
includes parameters that follow after "$9".
.in -.3i
.in -.5i
.in +.5i
$[vp.x]
$[vp.y]
$[vp.width]
$[vp.height]
.in +.3i
Either coordinate or the width or height of the current viewport.
.in -.3i
.in -.5i
.in +.5i
$[desk.width]
$[desk.height]
.in +.3i
The width or height of the whole desktop, i.e. the width or height
multiplied by the number of pages in x or y direction.
.in -.3i
.in -.5i
.in +.5i
$[page.nx]
$[page.ny]
.in +.3i
The current page numbers, by X and Y axes, starting from 0.
.IR page " is equivalent to " area " in the GNOME terminology."
.in -.3i
.in -.5i
.in +.5i
$[w.x]
$[w.y]
$[w.width]
$[w.height]
.in +.3i
Either coordinate or the width or height of the current window if
it is not iconified.  If no window is associated with the command
or the window is iconified, the string is left as is.
.in -.3i
.in -.5i
.in +.5i
$[screen]
.in +.3i
The screen number fvwm is running on.  Useful for setups with
multiple screens.
.in -.3i
.in -.5i
.in +.5i
$[fg.cs<n>]
.in -.5i
.in +.5i
$[bg.cs<n>]
.in -.5i
.in +.5i
$[hilight.cs<n>]
.in -.5i
.in +.5i
$[shadow.cs<n>]
.in +.3i
These class of parameters is replaced with the name of the
foreground (fg), background (bg), hilight (hilight) or shadow
(shadow) color that is defined in colorset <n> (replace <n> with
zero or a positive integer).  For example "$[fg.cs3]" is expanded
to the name of the foreground color of colorset 3 (in
rgb:rrrr/gggg/bbbb form).  Please refer to the man page of the
.B FvwmTheme
module for details about colorsets.  Note that although other
parameters cannot be used in module configuration lines, it is
possible to use this class of parameters.  They can be used
wherever a module expects a color name.  Since the
.B FvwmTheme
module is not running when fvwm first passes through its
configuration file, you may not get the desired results if you use
this in commands like
.EX
Style * HilightFore $[fg.cs0], HilightBack $[bg.cs0]
.EE
.in -.3i
.in -.5i
.in +.5i
$[...]
.in +.3i
If the string within the braces is neither of the above, fvwm
tries to find an environment variable with this name and replaces
its value if one is found (e.g. "$[PAGER]" could be replaced by
"more").  Otherwise the string is left as is.
.in -.3i
.in -.5i
Some examples can be found in the description of the
.B AddToFunc
command.
.SS THE LIST OF BUILTIN COMMANDS
The commands descriptions below are grouped together in the
following sections.  The sections are hopefully sorted in order of
usefulness to the newcomer.
.EX
- Menu commands
- Miscellaneous commands
- Commands affecting window movement and placement
- Commands for focus and mouse movement
- Commands controlling window state
- Commands for mouse, key and stroke bindings
- The Style command (controlling window styles)
- Other commands controlling window styles
- Commands controlling the virtual desktop
- Commands for user functions and shell commands
- Conditional commands
- Module commands
- Quit, restart and session management commands
- Color gradients
.EE
.SS COMMANDS FOR MENUS
.TP
.BI "AddToMenu " menu-name " [" menu-label " " action "]"
Begins or adds to a menu definition.  Typically a menu definition
looks like this:
.EX
AddToMenu Utilities Utilities Title
 + Xterm           Exec  exec xterm -e tcsh
 + Rxvt            Exec  exec rxvt
 + "Remote Logins" Popup Remote-Logins
 + Top             Exec  exec rxvt -T Top -n \\
                   Top -e top
 + Calculator      Exec  exec xcalc
 + Xman            Exec  exec xman
 + Xmag            Exec  exec xmag
 + emacs           Exec  exec xemacs
 + Mail            MailFunction \\
                   xmh "-font fixed"
 + ""              Nop
 + Modules         Popup Module-Popup
 + ""              Nop
 + Exit Fvwm       Popup Quit-Verify
.EE
The menu could be invoked via
.EX
Mouse 1 R A Menu Utilities Nop
.EE
or
.EX
Mouse 1 R A Popup Utilities
.EE
There is no end-of-menu symbol.  Menus do not have to be defined
in a contiguous region of the
.I .fvwm2rc
file.  The quoted portion in the above examples is the menu label,
which appears in the menu when the user pops it up.  The remaining
portion is a built-in command which should be executed if the user
selects that menu item.  An empty menu-label ("") and the
.B Nop
function can be used to insert a separator into the menu.
The keywords
.IR DynamicPopUpAction " and " DynamicPopDownAction
have a special meaning when used as the name of a menu item.  The
action following the keyword is executed whenever the menu is
popped up or down.  This way you can implement dynamic menus.  It
is even possible to destroy itself with
.B DestroyMenu
and the rebuild from scratch.  When the menu has been destroyed
(unless you used the
.I recreate
option when destroying the menu), do not forget to add the dynamic
action again.
Note: Do not trigger actions that require user interaction. They
will probably fail and may screw up your menus.  See
.B Silent
command.
Warning: Do not issue
.B MenuStyle
commands as dynamic menu actions.  Chances are good that this will
crash fvwm.
Example (File browser):
.EX
# You can find the shell script
# fvwm_make_browse_menu.sh in the utils
# directory of the distribution.
AddToMenu BrowseMenu
  'fvwm_make_browse_menu.sh BrowseMenu'
.EE
Example (Picture menu):
.EX
# Build a menu of all .jpg files in
# $HOME/Pictures
AddToMenu JpgMenu foo title
AddToFunc MakeJpgMenu
  do echo AddToMenu JpgMenu "`basename $i`" Exec xv $i; done'
.EE
The keyword
.I MissingSubmenuFunction
has a similar meaning.  It is executed whenever you try to pop up
a sub-menu that does not exist.  With this function you can define
and destroy menus on the fly.  You can use any command after the
keyword, but the name of a function defined with
.B AddToFunc
follows it, fvwm executes this command:
.EX
Function <function-name> <menu-name>
.EE
I.e. the name is passed to the function as its first argument and
can be referred to with "$0".
Example:
.EX
# There is another shell script
# fvwm_make_directory_menu.sh in the utils
# directory of the distribution. To use it,
# define this function in your configuration
# file:
AddToFunc MakeMissingDirectoryMenu
AddToMenu SomeMenu
.EE
This is another implementation of the file browser that uses
sub-menus for subdirectories.
Titles can be used within the menu. If you add the option
.I top
behind the keyword
.BR Title ,
the title is added to the top of the menu.  If there was a title
already, it is overwritten.
.EX
AddToMenu Utilities Tools Title top
.EE
All text up to the first
.SM Tab
in the menu label is aligned to the left side of the menu, all
text right of the first
.SM Tab
is aligned to the left in a second column and all text thereafter
is placed right aligned in the third column.  All other
.SM Tabs
are replaced by spaces.  Note that you can change this format with
the
.I ItemFormat
option of the
.B MenuStyle
command.
If the menu-label contains an ampersand ('&'), the next character
is taken as a hot-key for the menu item.  Hot-keys are underlined
in the label.  To get a literal '&', insert "&&".  Pressing the
hot-key moves through the list of menu items with this hot-key or
selects an item that is the only one with this hot-key.
If the menu-label contains a sub-string which is set off by stars,
then the text between the stars is expected to be the name of an
xpm-icon or bitmap-file to insert in the menu.  To get a literal
'*', insert "**".  For example
.EX
 + Calculator*xcalc.xpm* Exec exec xcalc
.EE
inserts a menu item labeled "Calculator" with a picture of a
calculator above it.  The following:
.EX
 + *xcalc.xpm*           Exec exec xcalc
.EE
Omits the "Calculator" label, but leaves the picture.
If the menu-label contains a sub-string which is set off by
percent signs, then the text between the percent signs is expected
to be the name of an xpm-icon or bitmap-file (a so called mini
icon to insert to the left of the menu label.  A second mini icon
that is drawn at the right side of the menu can be given in the
same way.  To get a literal '%', insert "%%". For example
.EX
 + Calculator%xcalc.xpm% Exec exec xcalc
.EE
inserts a menu item labeled "Calculator" with a picture of a
calculator to the left.  The following:
.EX
 + %xcalc.xpm%           Exec exec xcalc
.EE
Omits the "Calculator" label, but leaves the picture.  The
pictures used with this feature should be small (perhaps 16x16).
If the menu-name (not the label) contains a sub-string which is
set off by at signs ('@'), then the text between them is expected
to be the name of an xpm or bitmap file to draw along the left
side of the menu (a side pixmap).  You may want to use the
.I SidePic
option of the
.B MenuStyle
command instead.  To get a literal '@', insert "@@".  For example
.EX
AddToMenu StartMenu@linux-menu.xpm@
.EE
creates a menu with a picture in its bottom left corner.
If the menu-name also contains a sub-string surrounded by '^'s, then
the text between '^'s is expected to be the name of an X11 color
and the column containing the side picture is colored with that
color.  You can set this color for a menu style using the
.I SideColor
option of the
.B MenuStyle
command.  To get a literal '^', insert "^^".  Example:
.EX
AddToMenu StartMenu@linux-menu.xpm@^blue^
.EE
creates a menu with a picture in its bottom left corner and
colors with blue the region of the menu containing the picture.
In all the above cases, the name of the resulting menu is name
specified, stripped of the substrings between the various
delimiters.
.TP
.BI "ChangeMenuStyle " "menustyle menu ..."
Changes the menu style of
.IR menu " to " menustyle .
You may specified more than one menu in each call of
.BR ChangeMenuStyle .
.EX
ChangeMenuStyle pixmap1 \\
  ScreenSaverMenu ScreenLockMenu
.EE
.TP
.BI "CopyMenuStyle " "orig-menustyle dest-menustyle"
Copy
.IR orig-menustyle " to " dest-menustyle ,
where
.IR orig-menustyle
is an existing menu style.  If the menu style
.IR dest_menustyle
does not exist, then it is created.
.TP
.BI "DestroyMenu [" recreate "] " menu
Deletes a menu, so that subsequent references to it are no longer
valid.  You can use this to change the contents of a menu during
an fvwm session.  The menu can be rebuilt using
.BR AddToMenu .
The optional parameter
.I recreate
tells fvwm not to throw away the menu completely but to throw away
all the menu items (including the title).
.EX
DestroyMenu Utilities
.EE
.TP
.BI "DestroyMenuStyle " menustyle
Deletes the menu style named
.I menustyle
and changes all menus using this style to the default style, you
cannot destroy the default menu style.
.EX
DestroyMenuStyle pixamp1
.EE
.IP "\fBMenu\fP \fImenu-name\fP \
\fB[\fP \fIposition\fP \
\fB] [\fP \fIdouble-click-action\fP \
\fB]\fP"
Causes a previously defined menu to be popped up in a sticky
manner. That is, if the user invokes the menu with a click action
instead of a drag action, the menu stays up.  The command
.I double-click-action
is invoked if the user double-clicks a button (or hits the key
rapidly twice if the menu is bound to a key) when bringing up the
menu.  If the double click action is not specified, double
clicking on the menu does nothing.  However, if the menu begins
with a menu item (i.e. not with a title or a separator) and the
double click action is not given, double clicking invokes the
first item of the menu (but only if the pointer really was over
the item).
Several other commands affect menu operation.  See
.BR MenuStyle " and " SetAnimation .
When in a menu, keyboard shortcuts work as expected.  Cursor
keystrokes are also allowed. Specifically,
.SM Tab,
.SM Meta-Tab,
.SM Cursor-Down,
.SM Ctrl-N,
or
.SM Ctrl-J
move to the next item;
.SM Shift-Tab,
.SM Shift-Meta-Tab,
.SM Cursor-Up,
.SM Ctrl-P,
or
.SM Ctrl-K
move to the prior item;
.SM Cursor-Left
or
.SM Ctrl-B
returns to the prior menu;
.SM Cursor-Right
or
.SM Ctrl-F
pop up the next menu;
.SM Ctrl-Cursor-Up,
.SM Shift-Ctrl-Meta-Tab
and
.SM Page-Up
move up five items;
.SM Ctrl-Cursor-Down,
.SM Ctrl-Meta-Tab
and
.SM Page-Down
move down five items, respectively;
.SM Home,
.SM Shift-Cursor-Up
or
.SM End,
.SM Shift-Cursor-Down
move to the first or last item, respectively;
.SM Meta-Cursor-Up
or
.SM Meta-Cursor-Down
move just behind the next or previous separator;
.SM Shift-Ctrl-Tab
or
.SM Ctrl-Tab
work exactly the same;
.SM Enter,
.SM Return,
or
.SM Space
executes the current item;
.SM Insert
opens the "More..." sub-menu if any;
.SM Escape
and
.SM Delete
exit the current sequence of menus.
The pointer is warped to where it was when the menu was invoked if
it was both invoked and terminated with a keystroke.
The
.I position
arguments allow placement of the menu somewhere on the screen, for
example centered on the visible screen or above a title bar.
Basically it works like this: you specify a
.I context-rectangle
and an offset to this rectangle by which the upper left corner of
the menu is moved from the upper left corner of the rectangle.
The
.I position
arguments consist of several parts:
.EX
.BI "[" context-rectangle "] " "x y" " [" special-options "]"
.EE
The
.I context-rectangle
can be one of:
.in +.5i
.BR Root
.in +.3i
the root window of the current screen.
.in -.3i
.BR XineramaRoot
.in +.3i
the root window of the whole Xinerama screen.  Equivalent to
"root" when Xinerama is not used.
.in -.3i
.BR Mouse
.in +.3i
a 1x1 rectangle at the mouse position.
.in -.3i
.BR Window
.in +.3i
the window with the focus.
.in -.3i
.BR Interior
.in +.3i
the inside of the focused window.
.in -.3i
.BR Title
.in +.3i
the title of the focused window or icon.
.in -.3i
.BR Button<n>
.in +.3i
button #n of the focused window.
.in -.3i
.BR Icon
.in +.3i
the focused icon.
.in -.3i
.BR Menu
.in +.3i
the current menu.
.in -.3i
.BR Item
.in +.3i
the current menu item.
.in -.3i
.BR Context
.in +.3i
the current window, menu or icon.
.in -.3i
.BR This
.in +.3i
whatever widget the pointer is on (e.g. a corner of a window or
the root window).
.in -.3i
.BI "Rectangle <" geometry ">"
.in +.3i
the rectangle defined by
.RI < geometry >
in X geometry format.  Width and height default to 1 if omitted.
.in -.3i
.in -.5i
If the context-rectangle is omitted or illegal (e.g. "item" on a
window), "Mouse" is the default.  Note that not all of these make
sense under all circumstances (e.g. "Icon" if the pointer is on a
menu).
The offset values
.I x
and
.I y
specify how far the menu is moved from it's default position.  By
default, the numeric value given is interpreted as a percentage of
the context rectangle's width (height), but with a trailing
.RI ' m '
the menu's width (height) is used instead.  Furthermore a trailing
.RI ' p '
changes the interpretation to mean pixels.
Instead of a single value you can use a list of values.  All
additional numbers after the first one are separated from their
predecessor by their sign.  Do not use any other separators.
If
.IR x " or " y
are prefixed with "o<number>" where <number> is an integer, the
menu and the rectangle are moved to overlap at the specified
position before any other offsets are applied.  The menu and the
rectangle are placed so that the pixel at <number> percent of the
rectangle's width/height is right over the pixel at <number>
percent of the menu's width/height. So "o0" means that the
top/left borders of the menu and the rectangle overlap, with
"o100" it's the bottom/right borders and if you use "o50" they are
centered upon each other (try it and you will see it is much
simpler than this description).  The default is "o0".  The prefix
"o<number>" is an abbreviation for "+<number>-<number>m".
A prefix of
.RI ' c '
is equivalent to "o50".  Examples:
.EX
# window list in the middle of the screen
WindowList Root c c
# menu to the left of a window
Menu name window -100m c+0
# popup menu 8 pixels above the mouse pointer
Popup name mouse c -100m-8p
# somewhere on the screen
Menu name rectangle 512x384+1+1 +0 +0
# centered vertically around a menu item
AddToMenu foobar-menu
 + "first item" Nop
 + "special item" Popup "another menu" item \\
                  +100 c
 + "last item" Nop
# above the first menu item
AddToMenu foobar-menu
 + "first item" Popup "another menu" item \\
                +0 -100m
.EE
Note that you can put a sub-menu far off the current menu so you
could not reach it with the mouse without leaving the menu.  If
the pointer leaves the current menu in the general direction of
the sub-menu the menu stays up.
The
.IR special-options :
.in +.5i
The
.IR animated " and " Mwm " or " Win
menu styles may move a menu somewhere else on the screen.  If you
do not want this you can add
.I Fixed
as an option.  This might happen for example if you want the menu
always in the top right corner of the screen.
Where do you want a sub-menu to appear when you click on it's menu
item? The default is to place the title under the cursor, but if
you want it where the position arguments say, use the
.I SelectInPlace
option.  If you want the pointer on the title of the menu, use
.I SelectWarp
too. Note that these options apply only if the
.IB "PopupAsRootMenu " MenuStyle
option is used.
The pointer is warped to the title of a sub-menu whenever the
pointer would be on an item when the sub-menu is popped up
.RI ( fvwm
menu style) or never warped to the title at all
.RI ( Mwm " or " Win
menu styles). You can force (forbid) warping whenever the sub-menu
is opened with the
.IR WarpTitle " (" NoWarp ") option."
Note that the
.I special-options
do work with a normal menu that has no other position arguments.
.in -.5i
.TP
.BI "MenuStyle " "stylename options"
Sets a new menu style or changes a previously defined style.  The
.I stylename
is the style name; if it contains spaces or tabs it has to be
quoted.  The name "*" is reserved for the default menu style. The
default menu style is used for every menu-like object (e.g. the
window created by the
.B WindowList
command) that had not be assigned a style using the
.BR ChangeMenuStyle .
See also
.BR DestroyMenuStyle .
When using monochrome color options are ignored.
.I options
is a comma separated list containing some of the keywords
Fvwm / Mwm / Win,
BorderWidth,
Foreground,
Background,
Greyed,
HilightBack / HilightBackOff,
ActiveFore / ActiveForeOff,
MenuColorset,
ActiveColorset,
GreyedColorset,
Hilight3DThick / Hilight3DThin / Hilight3DOff,
Hilight3DThickness,
Animation / AnimationOff,
Font,
MenuFace,
PopupDelay,
PopupOffset,
TitleWarp / TitleWarpOff,
TitleUnderlines0 / TitleUnderlines1 / TitleUnderlines2,
SeparatorsLong / SeparatorsShort,
TrianglesSolid / TrianglesRelief,
PopupImmediately / PopupDelayed,
PopdownImmediately / PopdownDelayed,
DoubleClickTime,
SidePic,
SideColor,
PopupAsRootMenu / PopupAsSubmenu,
RemoveSubmenus / HoldSubmenus,
SubmenusRight / SubmenusLeft,
SelectOnRelease,
ItemFormat,
VerticalItemSpacing,
VerticalTitleSpacing,
AutomaticHotkeys / AutomaticHotkeysOff.
In the above list some options are listed as option pairs or
triples with a '/' in between.  These options exclude each other.
.IR Fvwm ", " Mwm ", " Win
reset all options to the style with the same name in former
versions of fvwm.  The default for new menu styles is
.I Fvwm
style.  These options override all others except
.IR Foreground ", " Background ", " Greyed ", " HilightBack ", "
.IR HilightFore " and " PopupDelay ,
so they should be used only as the first option specified for a
menu style or to reset the style to defined behavior.  The same
effect can be created by setting all the other options one by one.
.IR Mwm " and " Win
style menus popup sub-menus automatically.
.I Win
menus indicate the current menu item by changing the background to dark.
.I Fvwm
sub-menus overlap the parent menu,
.IR Mwm " and " Win
style menus never overlap the parent menu.
.I Fvwm
style is equivalent to HilightBackOff, Hilight3DThin,
ActiveForeOff, AnimationOff, Font, MenuFace, PopupOffset 0 67,
TitleWarp, TitleUnderlines1, SeparatorsShort, TrianglesRelief,
PopupDelayed, PopdownDelayed, PopupAsSubmenu, HoldSubmenus,
SubmenusRight, BorderWidth 2, AutomaticHotkeysOff.
.I Mwm
style is equivalent to HilightBackOff, Hilight3DThick,
ActiveForeOff, AnimationOff, Font, MenuFace, PopupOffset -3 100,
TitleWarpOff, TitleUnderlines2, SeparatorsLong, TrianglesRelief,
PopupImmediately, PopdownDelayed, PopupAsSubmenu, HoldSubmenus,
SubmenusRight, BorderWidth 2, AutomaticHotkeysOff.
.I Win
style is equivalent to HilightBack, Hilight3DOff, ActiveForeOff,
AnimationOff, Font, MenuFace, PopupOffset -5 100, TitleWarpOff,
TitleUnderlines1, SeparatorsShort, TrianglesSolid,
PopupImmediately, PopdownDelayed, PopupAsSubmenu, RemoveSubmenus,
SubmenusRight, BorderWidth 2, AutomaticHotkeysOff.
.I BorderWidth
takes the thickness of the border around the menus in pixels. It
may be zero to 50 pixels.  The default is 2.  Using an illegal
value reverts the border width to the default.
.IR Foreground " and " Background
may have a color name as an argument.  This color is used for menu
text or the menu's background.  You can omit the color name to
reset these colors to the built in default.
.I Greyed
may have a color name as an argument.  This color is the one used
to draw a menu-selection which is prohibited (or not recommended)
by the Mwm hints which an application has specified. If the color
is omitted the color of greyed menu entries is based on the
background color of the menu.
.IR HilightBack " and " HilightBackOff
switch hilighting the background of the selected menu item on and
off.  A specific background color may be used by providing the
color name as an argument to
.IR HilightBack .
If you use this option without an argument the color is based on
the menu's background color.
.I ActiveFore " and " ActiveForeOff
switch hilighting the foreground of the selected menu item on and
off.  A specific foreground color may be used by providing the
color name as an argument to
.IR ActiveFore .
Omitting the color name has the same effect as using
.IR ActiveForeOff .
.I MenuColorset
controls if a colorset is used instead of the
.IR Foreground ", " Background " and " MenuFace
menu styles.  If the
.I MenuColorset
keyword is followed by a number equal to zero or greater, this
number is taken as the number of the colorset to use.  If the
number is omitted, the colorset is switched off and the regular
menu styles are used again.  The foreground and background colors
of the menu items are replaced by the colors from the colorset.
If the colorset has a pixmap defined, this pixmap is used as the
background of the menu.  Note that the
.I MenuFace
menu style has been optimized for memory consumption and may use
less memory than the background from a colorset.  The shape mask
from the colorset is used to shape the menu.  Please refer to the
description of the
.B Colorset
command and the documentation of the
.B FvwmTheme
module for details about colorsets.
.I ActiveColorset
works exactly like
.IR MenuColorset ,
but the foreground from the colorset replaces the color given with
the
.I ActiveFore
menu style and the colorset's background color replaces the color
given with the
.I HilightBack
command (to turn on background hilighting you have to use the
.I HilightBack
menu style too).  If specified, the hilight and shadow colors
from the colorset are used too.  The pixmap and shape mask from
the colorset are not used.
.I GreyedColorset
works exactly like
.IR MenuColorset ,
but the foreground from the colorset replaces the color given with
the
.I Greyed
menu style.  No other parts of the colorset are used.
.IR Hilight3DThick ", " Hilight3DThin " and " Hilight3DOff
determine if the selected menu item is hilighted with a 3D
relief. Thick reliefs are two pixels wide, thin reliefs are one
pixel wide.
.I Hilight3DThickness
takes one numeric argument that may be between -50 and +50
pixels. With negative values the menu item gets a pressed in look.
The above three commands are equivalent to a thickness of 2, 1 and
0.
.IR Animation " and " AnimationOff
turn menu animation on or off.  When animation is on, sub-menus
that don't fit on the screen cause the parent menu to be shifted
to the left so the sub-menu can be seen.
.I Font
takes a font name as an argument.  If a font by this name exists
it is used for the text of all menu items.  If it does not exist
or if the name is left blank the built in default is used.
.I MenuFace
enforces a fancy background upon the menus.  You can use the same
options for
.I MenuFace
as for the
.BR ButtonStyle .
See description of
.B ButtonStyle
command and the
.B COLOR GRADIENTS
sections for more information.  If you use
.I MenuFace
without arguments the style is reverted back to normal.
Some examples of MenuFaces are:
.EX
MenuFace DGradient 128 2 lightgrey 50 blue 50 \\
  white
MenuFace TiledPixmap texture10.xpm
MenuFace HGradient 128 2 Red 40 Maroon 60 \\
  White
MenuFace Solid Maroon
.EE
Note: The gradient styles H, V, B and D are optimized for high
speed and low memory consumption in menus.  This is not the case
for all the other gradient styles.  They may be slow and consume
huge amounts of memory, so if you encounter performance problems
with them you may be better off by not using them.  To improve
performance you can try one or all of the following:
Turn hilighting of the active menu item other than foreground
color off:
.EX
MenuStyle <style> Hilight3DOff, HilightBackOff
MenuStyle <style> ActiveFore <preferred color>
.EE
Make sure sub-menus do not overlap the parent menu. This can
prevent menus being redrawn every time a sub-menu pops up or down.
.EX
MenuStyle <style> PopupOffset 1 100
.EE
Run you X server with backing storage.  If your X Server is
started with the -bs option, turn it off.  If not try the -wm
option.
.EX
startx -- -wm
.EE
You may have to adapt this example to your system (e.g. if you use
xinit to start X).
.I PopupDelay
requires one numeric argument.  This value is the delay in
milliseconds before a sub-menu is popped up when the pointer moves
over a menu item that has a sub-menu.  If the value is zero no
automatic pop up is done.  If the argument is omitted the built in
default is used. Note that the popup delay has no effect if the
.I PopupImmediately
option is used since sub-menus pop up immediately then.
.I PopupImmediately
makes menu items with sub-menus pop up it up as soon as the
pointer enters the item.  The
.I PopupDelay option
is ignored then.  If
.I PopupDelayed
is used fvwm looks at the
.I PopupDelay
option if or when this automatic popup happens.
.I PopdownDelay
works exactly like
.I PopupDelay
but determines the timeout of the
.I PopupDelayed
style.
.I PopdownImmediately
makes sub-menus vanish as soon as the pointer leaves the sub-menu
and the correspondent item in the parent menu.  With the opposite
option
.I PopdownDelayed
the sub-menu only pops down after the time specified with the
.I PopdownDelay
option.  This comes handy when the pointer often strays off the
menu item when trying to move into the sub-menu.  Whenever there
is a conflict between the
.IR PopupImmediately ", " PopupDelayed ", " PopupDelay
styles and the
.IR PopdownImmediately ", " PopdownDelayed ", " PopdownDelay
styles, the
.I Popup...
styles win when using mouse navigation and the
.I Popdown...
styles win when navigating with the keyboard.
.I PopupOffset
requires two integer arguments.  Both values affect where
sub-menus are placed relative to the parent menu.  If both values
are zero, the left edge of the sub-menu overlaps the left edge of
the parent menu.  If the first value is non-zero the sub-menu is
shifted that many pixels to the right (or left if negative).  If
the second value is non-zero the menu is moved by that many
percent of the parent menu's width to the right or left.
.IR TitleWarp " and " TitleWarpOff
affect if the pointer warps to the menu title when a sub-menu is
opened or not. Note that regardless of this setting the pointer is
not warped if the menu does not pop up under the pointer.
.IR TitleUnderlines0 ", " TitleUnderlines1 " and " TitleUnderlines2
specify how many lines are drawn below a menu title.
.IR SeparatorsLong " and " SeparatorsShort
set the length of menu separators.  Long separators run from the
left edge all the way to the right edge.  Short separators leave a
few pixels to the edges of the menu.
.IR TrianglesSolid " and " TrianglesRelief
affect how the small triangles for sub-menus is drawn.  Solid
triangles are filled with a color while relief triangles are
hollow.
.I DoubleClickTime
requires one numeric argument.  This value is the time in
milliseconds between two mouse clicks in a menu to be considered
as a double click.  The default is 450 milliseconds.  If the
argument is omitted the double click time is reset to this
default.
.I SidePic
takes the name of an xpm or bitmap file as an argument. The
picture is drawn along the left side of the menu.  The
.I SidePic
option can be overridden by a menu specific side pixmap (see
.BR AddToMenu ).
If the file name is omitted an existing side pixmap is remove from
the menu style.
.I SideColor
takes the name of an X11 color as an argument. This color is used
to color the column containing the side picture (see
above). The SideColor option can be overridden by a menu specific
side color (see
.BR AddToMenu ).
If the color name is omitted the side color option is switched off.
.IR PopupAsRootMenu " and " PopupAsSubmenu
change the behavior when you click on a menu item that opens a
sub-menu. With
.I PopupAsRootMenu
the original menu is closed before the sub-menu appears, with
.I PopupAsSubmenu
it is not, so you can navigate back into the
parent menu.  Furthermore, with
.I PopupAsSubmenu
the sub-menu is held open (posted) regardless of where you move
the mouse.  Depending on your menu style this may simplify
navigating through the menu.  Any keystroke while a menu is posted
reverts the menu back to the normal behavior.
.I PopupAsSubmenu
is the default.
.I RemoveSubmenus
instructs fvwm to remove sub-menus when you move back into the
parent menu.  With
.I HoldSubmenus
the sub-menu remains visible.  You probably want to use
.I HoldSubmenus
if you are using the
.I PopupDelayed
style.
.I RemoveSubmenus
affects menu navigation with the keyboard.
.I SelectOnRelease
takes an optional key name as an argument.  If the given key is
release in a menu using this style, the current menu item is
selected.  This is intended for
.SM Alt-Tab
.B WindowList
navigation.  The key name is a standard X11 key name as defined in
.IR /usr/include/X11/keysymdef.h ,
with the leading "XK_" omitted.  To disable this behaviour, omit
the key name.
Note: Some X servers do not support KeyRelease events.
.I SelectOnRelease
does not work on such a machine.
.I ItemFormat
takes a special string as its argument that determines the layout
of the menu items.  Think of the format string as if it were a
menu item.  All you have to do is tell fvwm where to place the
different parts of the menu item (i.e. the labels, the triangle
denoting a sub menu, the mini icons and the side pic) in the blank
area.  The string consists of spaces,
.SM Tab
characters and formatting directives beginning with '%'. Any
illegal characters and formatting directives are silently ignored:
.in +.5i
.BR %l ", " %c " and " %r
.in +.3i
Insert the next item label.  Up to three labels can be used. The
item column is left-aligned
.RB ( %l ),
centered
.RB ( %c )
or right-aligned
.RB ( %r ).
.in -.3i
.B %i
.in +.3i
Inserts the mini icon.
.in -.3i
.BR %> " and " %<
.in +.3i
Insert the sub-menu triangle pointing either to the right
.RB ( %> )
or to the left
.RB ( %< )
.in -.3i
.B %|
.in +.3i
The first
.B %|
denotes the beginning of the area that is highlighted either with
a background color or a relief (or both).  The second
.B %|
marks the end of this area.
.B %|
can be used up to twice in the string.  If you don't add one or
both of them, fvwm sets the margins to the margins of the whole
item (not counting the side picture).
.in -.3i
.B %s
.in +.3i
Places the side picture either at the beginning or the end of the
menu. This directive may be used only once and only as the first
or last in the format string. If the
.B %s
is not at the beginning of the string, all characters to the right
of it are silently ignored.
.in -.3i
.BR Space ", " Tab ", " %Space " and " %Tab
.in +.3i
Add a gap as large as one respectively eight spaces are with the
font used in the menu items.  The whole string must be quoted if
spaces or tabs are used.
.in -.3i
.B %p
.in +.3i
Like
.SM Space
and
.SM Tab
.B %p
inserts an empty area into the item, but with better control of
its size (see below).
.in -.3i
.in -.5i
You can define an additional space before and after each of the
objects like this:
.EX
.BI % left . right p
.EE
This means: if the object is defined in the menu (e.g. if it is
.B %s
and you use a side picture, or it is
.B %l
for the third column and there are items defined that actually
have a third column), then add
.I left
pixels before the object and
.I right
pixels after it.  You may leave out the
.I left
or the
.I .right
parts if you don't need them.  All values up to the screen width
are allowed.  Even negative values can be used with care.  The
.B p
may be replaced with any other formatting directives described
above.
Note: Only items defined in the format string are visible in the
menus. So if you do not put a
.B %s
in there you do not see a side picture, even if one is specified.
Note: The
.I SubmenusLeft
style changes the default
.I ItemFormat
string, but if it was set manually it is not modified.
Note: If any unformatted title of the menu is wider than the
widest menu item, the spaces between the different parts of the
menu items are enlarged to match the width of the title.  Leading
left aligned objects in the format string
.RB ( %l ", " %i ", "%< ", first " %| )
stick to the left edge of the menu and trailing right aligned
objects
.RB ( %r ", " %i ", "%> ", second " %| )
stick to the right edge.  The gaps between the remaining items are
enlarged equally.
Examples:
.EX
MenuStyle * ItemFormat \\
  "%.4s%.1|%.5i%.5l%.5l%.5r%.5i%2.3>%1|"
.EE
Is the default string used by fvwm: (side picture + 4 pixels gap)
(beginning of the hilighted area + 1 pixel gap) (mini icon + 5p)
(first column left aligned + 5p) (second column left aligned + 5p)
(third column right aligned + 5p) (second mini icon + 5p) (2p +
sub-menu triangle + 3p) (1p + end of hilighted area).
.EX
MenuStyle * ItemFormat \\
  "%.1|%3.2<%5i%5l%5l%5r%5i%1|%4s"
.EE
Is used by fvwm with the
.I SubmenusLeft
option below.
.IR VerticalItemSpacing " and " VerticalTitleSpacing
control the vertical spacing of menu items and titles like
.I ItemFormat
controls the horizontal spacing.  Both take two numeric arguments
that may range from -100 to +100.  The first is the gap in pixels
above a normal menu item (or a menu title), the second is the gap
in pixels below it.  Negative numbers do not make much sense and
may screw up the menu completely.  If no arguments are given or
the given arguments are invalid, the built in defaults are used:
one pixel above the item or title and two below.
.I SubmenusLeft
mirrors the menu layout and behavior.  Sub-menus pop up to the
left, the sub-menu triangle is drawn left and the mini icon and
side picture are drawn at the right side of the menu.  The default
is
.IR SubmenusRight .
The position hints of a menu are also affected by this setting,
i.e. position hints using
.IR item " or " menu
as context rectangle and position hints using
.I m
offsets.
.IR AutomaticHotkeys " and " AutomaticHotkeysOff
control the menu's ability to automatically provide hot-keys on
the first character of each menu item's label.  This behavior is
always overridden if an explicit hot-key is assigned in the
.B AddToMenu
command.
Examples:
.EX
MenuStyle * Mwm
MenuStyle * Foreground Black, Background gray40
MenuStyle * Greyed gray70, ActiveFore White
MenuStyle * HilightBackOff, Hilight3DOff
MenuStyle * Font lucidasanstypewriter-14
MenuStyle * MenuFace DGradient 64 darkgray \\
  MidnightBlue
MenuStyle red Mwm
MenuStyle red Foreground Yellow
MenuStyle red Background Maroon
MenuStyle red Greyed Red, ActiveFore Red
MenuStyle red HilightBackOff, Hilight3DOff
MenuStyle red Font lucidasanstypewriter-12
MenuStyle red MenuFace DGradient 64 Red Black
.EE
Note that all style options could be placed on a single line for
each style name.
.TP
.BI "MenuStyle " "forecolor backcolor shadecolor font style" " [" anim "]"
This is the old syntax of the
.B MenuStyle
command.  It is obsolete and may be removed in the future.  Please
use the new syntax as described above.
Sets the menu style.  When using monochrome the colors are
ignored.  The
.I shadecolor
is the one used to draw a menu-selection which is prohibited (or
not recommended) by the Mwm hints which an application has
specified.  The style option is either
.IR Fvwm ", " Mwm " or " Win ,
which changes the appearance and operation of the menus.
.IR Mwm " and " Win
style menus popup sub-menus automatically.
.I win
menus indicate the current menu item by changing the background to
black.
.I fvwm
sub-menus overlap the parent menu,
.IR Mwm " and " win
style menus never overlap the parent menu.
When the
.I anim
option is given, sub-menus that don't fit on the screen cause the
parent menu to be shifted to the left so the sub-menu can be
seen. See also
.B SetAnimation
command.
.TP
.BI "Popup " PopupName " [" position "] [" default-action "]"
This built-in has two purposes: to bind a menu to a key or mouse
button, and to bind a sub-menu into a menu.  The formats for the
two purposes differ slightly.  The
.I position
arguments are the same as for
.BR Menu .
The command
.I default-action
is invoked if the user clicks a button to invoke the menu and
releases it immediately again (or hits the key rapidly twice if
the menu is bound to a key).  If the default action is not
specified, double clicking on the menu does nothing.  However, if
the menu begins with a menu item (i.e. not with a title or a
separator) and the default action is not given, double clicking
invokes the first item of the menu (but only if the pointer really
was over the item).
To bind a previously defined pop-up menu to a key or mouse button:
.sp
.in +.25i
The following example binds mouse buttons 2 and 3 to a pop-up
called "Window Ops".  The menu pops up if the buttons 2 or 3 are
pressed in the window frame, side-bar, or title-bar, with no
modifiers (none of shift, control, or meta).
.EX
Mouse 2 FST N Popup "Window Ops"
Mouse 3 FST N Popup "Window Ops"
.EE
Pop-ups can be bound to keys through the use of the
.B Key
built-in.  Pop-ups can be operated without using the mouse by
binding to keys and operating via the up arrow, down arrow, and
enter keys.
.in -.25i
.sp
To bind a previously defined pop-up menu to another menu, for use
as a sub-menu:
.sp
.in +.25i
The following example defines a sub-menu "Quit-Verify" and binds
it into a main menu, called "RootMenu":
.EX
AddToMenu Quit-Verify
 + "Really Quit Fvwm?" Title
 + "Yes, Really Quit"  Quit
 + "Restart Fvwm"      Restart
 + "Restart Fvwm 1.xx" Restart fvwm1 -s
 + ""                  Nop
 + "No, Don't Quit"    Nop
AddToMenu RootMenu "Root Menu" Title
 + "Open XTerm Window" Popup NewWindowMenu
 + "Login as Root"     Exec exec xterm \\
                         -fg green -T Root \\
                         -n Root -e su -
 + "Login as Anyone"   Popup AnyoneMenu
 + "Remote Hosts"      Popup HostMenu
 + ""                  Nop
 + "X utilities"       Popup Xutils
 + ""                  Nop
 + "Fvwm Modules"      Popup Module-Popup
 + "Fvwm Window Ops"   Popup Window-Ops
 + ""                  Nop
 + "Previous Focus"    Prev (AcceptsFocus) Focus
 + "Next Focus"        Next (AcceptsFocus) Focus
 + ""                  Nop
 + "Refresh screen"    Refresh
 + "Recapture screen"  Recapture
 + ""                  Nop
 + "Reset X defaults"  Exec xrdb -load \\
                       $HOME/.Xdefaults
 + ""                  Nop
 + ""                  Nop
 + Quit                Popup Quit-Verify
.EE
.in -.25i
.sp
.B Popup
differs from
.B Menu
in that pop-ups do not stay up if the user simply clicks.  These
are popup-menus, which are a little hard on the wrist.
.B Menu
menus stay up on a click action.  See the
.B Menu
command for an explanation of the interactive behavior of menus. A
menu can be open up to ten times at once, so a menu may even use
itself or any of its predecessors as a sub-menu.
.TP
.BI "Title"
Does nothing.  This is used to insert a title line in a popup or
menu.
.SS MISCELLANEOUS COMMANDS
.TP
.BI "BugOpts [" option " [" bool "]], " ...
This command controls several workarounds for bugs in third party
programs.  The individual options are separated by commas.  The
optional argument
.I bool
is a boolean argument and controls if the bug workaround is
enabled or not.  It can either be "True" or "False" to turn the
option on or off, or "toggle" to switch is back and forth.  If
.I bool
is omitted, the default setting is restored.
.I FlickeringMoveWorkaround
disables ConfigureNotify events that are usually sent to
an application while it is moved.  If some windows flicker
annoyingly while being moved, this option may help you.  Note that
if this problem occurs it is not an fvwm bug, it is a problem of the
application.
.I MixedVisualWorkaround
makes fvwm install the root colormap before it does some
operations using the root window visuals.  This is only useful
when the
.B -visual
option is used to start fvwm and then only with some
configurations of some servers (e.g. Exceed 6.0 with an 8 bit
PseudoColor root and fvwm using a 24 bit TrueColor visual).
The
.I ModalityIsEvil
option controls whether Motif applications have the ability to have
modal dialogs (dialogs that force you to close them first before
you can do anything else).  The default is to not allow
applications to have modal dialogs.  Use this option with care.
Once this option is turned on, you have to restart fvwm to turn it
off.
.I RaiseOverNativeWindows
makes fvwm try to raise the windows it manages over native windows
of the X servers host system.  This is needed for some X servers
running under Windows or Windows NT.  Fvwm tries to detect if it
is running under such an X server and initializes the flag
accordingly.
.I RaiseOverUnmanaged
makes fvwm try to raise the windows it manages over
override_redirect windows.  This is used to cope with ill-mannered
applications that use long-lived windows of this sort, contrary to
.SM ICCCM
conventions.
.I FlickeringQtDialogsWorkaround
suppresses flickering of the focused window in some modules when
using KDE or Qt applications with application modal dialog
windows.  By default this option is turned on.  This option may be
visually disturbing for other applications using windows not
managed by fvwm.  Since these applications are rare it is most
likely safe to leave this option at its default.
.TP
.BI "BusyCursor [" "Option bool" "], " ...
This command controls the cursor during the execution of certain
commands.
.I Option
can be
.IR DynamicMenu ", " ModuleSynchronous ", " Read ", " Wait ", " * .
An option must be followed by a boolean argument
.IR bool .
You can use commas to separate individual options.  If you set an
option to "True", then when the corresponding command is run, fvwm
displays the cursor of the
.I WAIT
context of the
.B CursorStyle
command.  "False" forces to not display the cursor.  The default is:
.EX
BusyCursor DynamicMenu False, \\
  ModuleSynchronous False, Read False, \\
  Recapture True, Wait False
.EE
The option
.I *
refers to all available options.
The
.I Read
option also controls the
.B PipeRead
command.
The
.I DynamicMenu
option affects the
.I DynamicPopupAction
and
.I MissingSubmenuFunction
options of the
.B AddToMenu
command.  If this option is set to "False", then the busy cursor
is not displayed during a dynamic menu command even if this
command is a
.BR Read " or " PipeRead
command and the
.I Read
option is set to "True".
The
.I Wait
option affects only the root cursor.  During a wait pause the root
cursor is replaced by the busy cursor and fvwm is still fully
functional (you can escape from the pause, see the
.B EscapeFunc
command).  If you want to use this option and if you do not use
the default root cursor, you must set your root cursor with the
.B CursorStyle
command.
.TP
.BI "ClickTime [" delay "]"
Specifies the maximum delay in milliseconds between a button press
and a button release for the
.B Function
built-in to consider the action a mouse click.  The default delay
is 150 milliseconds.  Omitting the delay value resets the
.B ClickTime
to the default.
.TP
.BI "ColorLimit " limit
Specifies a
.I limit
on the colors used in  pixmaps used  by fvwm. Zero (the default)
sets no limit.  Fvwm uses pixmaps for icons, mini-icons, and
pixmap borders, menu backgrounds and titles. This command limits
pixmap colors to a set of colors that starts out with common
colors.  The current list contains about 60 colors and starts with
white, black, grey, green, blue, red, cyan, yellow, and magenta.
The command
.EX
ColorLimit 9
.EE
would limit pixmaps to these 9 colors.
It makes the most sense to put this command at the front of the
.I .fvwm2rc
file.  This command should occur before any menu definitions that
contain mini-icons.
Solid frame and title colors (including shadows and gradients) are
not controlled by this command.
This command only makes sense on screens that display a limited
number of colors at once.  If your  display can display more than
2 million colors at once, this command is ignored.  Screens that
only display 256 colors at once are known as 8 bit displays. The 2
million color cutoff point corresponds to 21 bit color, the most
common screen that exceeds this limit would be 24 bit.
On 8 bit displays, the default color limit is set to the size of
the built in table (about 60).  We recommend that you start with
the default value, and not include this command in your
.IR .fvwm2rc .
.TP
.BI "ColormapFocus " FollowsMouse | FollowsFocus
By default, fvwm installs the colormap of the window that the
cursor is in.  If you use
.EX
ColormapFocus FollowsFocus
.EE
then the installed colormap is the one for the window that
currently has the keyboard focus.
.IP "\fBCursorStyle\fP \fIcontext\fP \fB[\fP \fInumber\fP \
\fB|\fP \fIname\fP \
\fB|\fP \fIxpm\fP \
\fB|\fP \fINone\fP \
\fB|\fP \fITiny\fP \
\fB[\fP \fIfore back\fP \
\fB]]\fP"
Defines a new cursor for the specified context.  The various
contexts are:
.in +.5i
.BR "POSITION " (top_left_corner)
.in +.3i
used when initially placing windows
.in -.3i
.BR "TITLE " (top_left_arrow)
.in +.3i
used in a window title-bar
.in -.3i
.BR "DEFAULT " (top_left_arrow)
.in +.3i
used in windows that don't set their cursor
.in -.3i
.BR "SYS " (hand2)
.in +.3i
used in one of the title-bar buttons
.in -.3i
.BR "MOVE " (fleur)
.in +.3i
used when moving or resizing windows
.in -.3i
.BR "RESIZE " (sizing)
.in +.3i
used when moving or resizing windows
.in -.3i
.BR "WAIT " (watch)
.in +.3i
used during certain fvwm commands (see
.B BusyCursor
for details).
.in -.3i
.BR "MENU " (top_left_arrow)
.in +.3i
used in menus
.in -.3i
.BR "SELECT " (crosshair)
.in +.3i
used when the user is required to select a window
.in -.3i
.BR "DESTROY " (pirate)
.in +.3i
used for DESTROY, CLOSE, and DELETE built-ins
.in -.3i
.BR "TOP " (top_side)
.in +.3i
used in the top side-bar of a window
.in -.3i
.BR "RIGHT " (right_side)
.in +.3i
used in the right side-bar of a window
.in -.3i
.BR "BOTTOM " (bottom_side)
.in +.3i
used in the bottom side-bar of a window
.in -.3i
.BR "LEFT " (left_side)
.in +.3i
used in the left side-bar of a window
.in -.3i
.BR "TOP_LEFT " (top_left_corner)
.in +.3i
used in the top left corner of a window
.in -.3i
.BR "TOP_RIGHT " (top_right_corner)
.in +.3i
used in the top right corner of a window
.in -.3i
.BR "BOTTOM_LEFT " (bottom_left_corner)
.in +.3i
used in the bottom left corner of a window
.in -.3i
.BR "BOTTOM_RIGHT " (bottom_right_corner)
.in +.3i
used in the bottom right corner of a window
.in -.3i
.BR "TOP_EDGE " (top_side)
.in +.3i
used at the top edge of the screen.
.in -.3i
.BR "RIGHT_EDGE " (right_side)
.in +.3i
used at the right edge of the screen.
.in -.3i
.BR "BOTTOM_EDGE " (bottom_side)
.in +.3i
used at the bottom edge of the screen.
.in -.3i
.BR "LEFT_EDGE " (left_side)
.in +.3i
used at the left edge of the screen.
.in -.3i
.BR "ROOT " (left_ptr)
.in +.3i
used as the root cursor.
.in -.3i
.BR "STROKE " (plus)
.in +.3i
used during a
.B StrokeFunc
command.
.in -.3i
.in -.5i
The defaults are shown in parentheses above.  If you ever want to
restore the default cursor for a specific context you can omit the
second argument.
The second is either the numeric value of the cursor as defined in
the include file
.I X11/cursorfont.h
or its name (without the XC_ prefix) or the name of an xpm file
containing a pixmap of depth 1 with a mask and an optional
hot-spot (if no hot-spot is defined, the hot-spot is placed in the
center of the image).  Furthermore the name can be
.I None
(no cursor) or
.I Tiny
(a single pixel as the cursor).  For example:
.EX
# make the kill cursor be XC_gumby (both forms work):
CursorStyle DESTROY 56
CursorStyle DESTROY gumby
CursorStyle TOP_LEFT topl.xpm
CursorStyle ROOT hand1 yellow black
.EE
The optional
.IR fg " and " bg
arguments specify the foreground and background colors for the
cursor, defaulting to black and white.
.TP
.BI "DefaultColors [" "foreground background" "]"
.B DefaultColors
sets the default foreground and background colors used in
miscellaneous windows created by fvwm, for example in the geometry
feedback windows during a move or resize operation. If you don't
want to change one color or the other, use - as its color name.
To revert to the builtin default colors omit both color names.
Note that the default colors are not used in menus, window titles
or icon titles.
.TP
.BI "DefaultColorset [" num "]"
.B DefaultColorset
sets the colorset used by the windows controlled by the
.B DefaultColors
command.  To revert back to the
.B DefaultColors
colors use
.EX
DefaultColorset -1
.EE
or any variant of the
.B DefaultColors
command.
.TP
.BI "DefaultFont [" fontname "]"
.B DefaultFont
sets the default font to font
.IR fontname .
The default font is used by fvwm whenever no other font has been
specified.  To reset the default font to the built in default,
omit the argument.  The default font is used for menus, window
titles, icon titles as well as the geometry feedback windows
during a move or resize operation.  To override the default font
in a specific context, use the
.BR "Style * Font" ", " "Style * IconFont" ", or " MenuStyle
commands.
.TP
.BI "DefaultIcon " filename
sets the default icon which is used if a window has neither an
client-supplied icon nor an icon supplied via the
.I Icon
option of the
.B Style
command.
.TP
.BI "DefaultLayers " "bottom put top"
changes the layers that are used for the
.IR StaysOnBottom ", " StaysPut ", " StaysOnTop
.B Style
options.  Initially, the layers 2, 4 and 6 are used.
.TP
.BI "Emulate " Fvwm | Mwm | Win
This command affects how miscellaneous things are done by
fvwm. For example where the move/resize feedback window appears
depends on this command.  To have more Mwm- or Win-like behavior
you can call
.BI Emulate
with
.IR Mwm " or " Win
as its argument.  With
.I Mwm
resize and move feedback windows are in the center of the screen,
instead of the upper left corner.
.TP
.BI "EscapeFunc"
By default the key sequence
.SM Ctrl-Alt-Escape
allows to escape from a
.B Wait
pause and from a locked
.B ModuleSynchronous
command.  The
.B EscapeFunc
command used with the
.B Key
command allows to configure this key sequence.  An example:
.EX
Key Escape A MC -
Key Escape A  S EscapeFunc
.EE
replaces the
.SM Ctrl-Alt-Escape
key sequence with
.SM Shift-Escape
for aborting a
.B Wait
pause and
.B ModuleSynchronous
command.
.B EscapeFunc
used outside the
.B Key
command does nothing.
.TP
.BI "FakeClick [" "command value" "] ..."
This command is mainly intended for debugging fvwm and no
guarantees are made that it works for you.
.B FakeClick
can simulate mouse button press and release events and pass them
to fvwm or the applications.  The parameters are a list of
commands which consist of pairs of
.I command
tokens and integer
.I values,
The
.IR press " and " release
commands are followed by the appropriate mouse button number and
generate a button press or release event on the window below the
pointer.  The
.I wait
commands pauses fvwm for the given number of milliseconds.  The
.I modifiers
command simulates pressing or releasing modifier keys.  The values
1 to 5 are mapped to
.SM Mod1
to
.SM Mod5
while 6, 7 and 8 are mapped to
.SM Shift,
.SM Lock
and
.SM Control.
The modifier is set for any further button events.  To release a
modifier key, use the corresponding negative number.  The
.I depth
command determines to which window the button events are sent.
With a depth of 1, all events go to the root window, regardless of
the pointer's position.  With 2, the event is passed to the top
level window under the pointer which is usually the frame window.
With 3, events go to the client window. Higher numbers go to
successive sub windows.  Zero (0) goes to the smallest window that
contains the pointer. Note that events propagate upward.
.EX
 FakeClick depth 2 press 1 wait 250 release 1
.EE
This simulates a click with button 1 in the parent window (depth
2) with a delay of 250 milliseconds between the press and the
release.
.TP
.BI "GlobalOpts [" options "]"
As announced in the past, this command has been removed.  Please
replace the global options in your configuration file according to
the following table:
.EX
GlobalOpts WindowShadeShrinks
  -->
Style * WindowShadeShrinks
GlobalOpts WindowShadeScrolls
  -->
Style * WindowShadeScrolls
GlobalOpts SmartPlacementIsReallySmart
  -->
Style * MinOverlapPlacement
GlobalOpts SmartPlacementIsNormal
  -->
Style * TileCascadePlacement
GlobalOpts ClickToFocusDoesntPassClick
  -->
Style * ClickToFocusPassesClickOff
GlobalOpts ClickToFocusPassesClick
  -->
Style * ClickToFocusPassesClick
GlobalOpts ClickToFocusDoesntRaise
  -->
Style * ClickToFocusRaisesOff
GlobalOpts ClickToFocusRaises
  -->
Style * ClickToFocusRaises
GlobalOpts MouseFocusClickDoesntRaise
  -->
Style * MouseFocusClickRaisesOff
GlobalOpts MouseFocusClickRaises
  -->
Style * MouseFocusClickRaises
GlobalOpts NoStipledTitles
  -->
Style * StippledTitleOff
GlobalOpts StipledTitles
  -->
Style * StippledTitle
GlobalOpts CaptureHonorsStartsOnPage
  -->
Style * CaptureHonorsStartsOnPage
GlobalOpts CaptureIgnoresStartsOnPage
  -->
Style * CaptureIgnoresStartsOnPage
GlobalOpts RecaptureHonorsStartsOnPage
  -->
Style * RecaptureHonorsStartsOnPage
GlobalOpts RecaptureIgnoresStartsOnPage
  -->
Style * RecaptureIgnoresStartsOnPage
GlobalOpts ActivePlacementHonorsStartsOnPage
  -->
Style * ManualPlacementHonorsStartsOnPage
GlobalOpts ActivePlacementIgnoresStartsOnPage
  -->
Style * ManualPlacementIgnoresStartsOnPage
GlobalOpts RaiseOverNativeWindows
  -->
BugOpts RaiseOverNativeWindows on
GlobalOpts IgnoreNativeWindows
  -->
BugOpts RaiseOverNativeWindows off
.EE
.TP
.BI "HilightColor " "textcolor backgroundcolor"
This command is obsoleted by the
.B Style
options
.IR HilightFore " and " HilightBack .
Please use
.EX
Style * HilightFore textcolor, \\
        HilightBack backgroundcolor
.EE
instead.
.TP
.BI "HilightColorset [" num "]"
This command is obsoleted by the
.B Style
option
.IR HilightColorset .
Please use
.EX
Style * HilightColorset num
.EE
instead.
.TP
.BI "IconFont [" fontname "]"
This command is obsoleted by the
.B Style
option
.IR IconFont .
Please use
.EX
Style * IconFont fontname
.EE
instead.
.TP
.BI "IconPath " path
This command is obsolete.  Please use
.B ImagePath
instead.
.TP
.BI "ImagePath " path
Specifies a colon separated list of directories in which to search
for images (both monochrome and pixmap).  To find an image given
by a relative pathname, fvwm looks into each directory listed in
turn, and uses the first file found.
The
.I path
may contain environment variables such as
.IR $HOME " (or " ${HOME} ).
Further, a '+' in the
.I path
is expanded to the previous value of the path, allowing appending
or prepending to the path easily.
For example:
.EX
ImagePath $HOME/icons:+:/usr/include/X11/bitmaps
.EE
Note: if the
.B FvwmM4
module is used to parse your
.I .fvwm2rc
files, then m4 may want to mangle the word "include" which
frequently shows up in the
.B ImagePath
command.  To fix this one may add
.EX
undefine(`include')
.EE
prior to the
.B ImagePath
command, or better: use the
.I -m4-prefix
option to force all
.B m4
directives to have a prefix of "m4_" (see the
.B FvwmM4
man page).
.TP
.BI "PixmapPath " path
This command is obsolete. Please use
.B ImagePath
instead.
.TP
.BI "WindowFont [" fontname "]"
This command is obsoleted by the
.B Style
option
.IR Font .
Please use
.EX
Style * Font fontname
.EE
instead.
.IP "\fBWindowList [(\fP \fIconditions\fP \
\fB)] [\fP \fIposition\fP \
\fB] [\fP \fIoptions\fP \
\fB] [\fP \fIdouble-click-action\fP \
\fB]\fP"
Generates a pop-up menu (and pops it up) in which the title and
geometry of each of the windows currently on the desktop are
shown.
The format of the geometry part is:
. IR desk "(" layer "): " "x-geometry sticky" ,
where
.IR desk " and " layer
are the corresponding numbers and
.I sticky
is empty or a capital S.  The geometry of iconified windows is
shown in parentheses.  Selecting an item from the window list
pop-up menu causes the interpreted function "WindowListFunc" to be
run with the window id of that window passed in as $0. The default
"WindowListFunc" looks like this:
.EX
AddToFunc WindowListFunc
 + I WindowId $0 Iconify off
 + I WindowId $0 FlipFocus
 + I WindowId $0 Raise
 + I WindowId $0 WarpToWindow 5p 5p
.EE
You can destroy the builtin "WindowListFunc" and create your own
if these defaults do not suit you.
The window list menu uses the "WindowList" menu style if it is
defined (see
.B MenuStyle
command).  Otherwise the default menu style is used.  To switch
back to the default menu style, issue the command
.EX
DestroyMenuStyle WindowList
.EE
Example:
.EX
MenuStyle WindowList SelectOnRelease Meta_L
.EE
The
.I conditions
can be used to exclude certain windows from the window
list. Please refer to the
.B Current
command for details.  Only windows that match the given conditions
are displayed in the window list.  The
.I options
below work vice versa: windows that would otherwise not be
included in the window list can be selected with them.  The
.I conditions
always override the
.IR options .
The
.I position
arguments are the same as for
.BR Menu .
The command
.I double-click-action
is invoked if the user double-clicks (or hits the key rapidly
twice if the menu is bound to a key) when bringing the window
list.  The
.I double-click-action
must be quoted if it consists of more than one word.
The
.I double-click-action
is useful to define a default window if you have bound the window
list to a key (or button) like this:
.EX
# Here we call an existing function, but it may be different
AddToFunc SwitchToWindow
Key Tab A M WindowList "Prev SwitchToWindow"
.EE
Hitting
.SM Alt-Tab
once it brings up the window list, if you hit it twice the focus
is flipped between the current and the last focused window.  With
the proper
.I SelectOnRelease
menu style (see example above) a window is selected as soon as you
release the
.SM Alt
key.
The
.I options
passed to WindowList can be
.IR NoGeometry ,
.IR NoGeometryWithInfo ,
.IR "Function funcname" ,
.IR "Desk desknum" ,
.IR CurrentDesk ,
.IR NoIcons " / " Icons " / " OnlyIcons ,
.IR NoNormal " / " Normal " / " OnlyNormal ,
.IR NoSticky " / " Sticky " / " OnlySticky ,
.IR NoOnTop " / " OnTop " / " OnlyOnTop ,
.IR NoOnBottom " / " OnBottom " / " OnlyOnBottom ,
.IR "Layer m [n]" ,
.IR UseListSkip " / " OnlyListSkip ,
.IR NoDeskSort ,
.IR ReverseOrder ,
.IR UseIconName ,
.IR Alphabetic " / " NotAlphabetic ,
.IR NoHotkeys ,
.IR SelectOnRelease .
(Note - normal means not iconic, sticky, or on top)
The
.I SelectOnRelease
option works exactly like the
.B MenuStyle
option with the same name, but overrides the option given in a
menu style.  By default, this option is set to the left
.SM Alt
key.  To switch it off, use
.I SelectOnRelease
without a key name.
If you pass in a function via
.IR "Function funcname" ,
$0 is the window id:
.EX
AddToFunc IFunc I WindowId $0 Iconify toggle
WindowList Function IFunc, NoSticky, \\
  CurrentDesk, NoIcons
.EE
If you use the
.IB "Layer m " [ "n" ]
option, only windows in layers between m and n are displayed. n
defaults to m.  With the
.I ReverseOrder
option the order of the windows in the list is reversed.
If you wanted to use the
.B WindowList
as an icon manager, you could invoke the following:
.EX
WindowList OnlyIcons, Sticky, OnTop, Geometry
.EE
(Note - the
.I Only
options essentially wipe out all other ones... but the
.I OnlyListSkip
option which just causes
.B WindowList
to only consider the windows with
.I WindowListSkip
style.)
.TP
.BI "+"
Used to continue adding to the last specified decor, function or
menu. See the discussion for
.BR AddToDecor ", " AddToFunc ", and " AddToMenu .
.SS COMMANDS AFFECTING WINDOW MOVEMENT AND PLACEMENT
.TP
.BI "AnimatedMove " "x y" " [" Warp "]"
Move a window in an animated fashion.  Similar to
.B Move
command below. The options are the same, except they are required,
since it doesn't make sense to have a user move the window
interactively and animatedly.  If the optional argument
.I Warp
is specified the pointer is warped with the window.
.TP
.BI "HideGeometryWindow [" Never | Move | Resize "]"
Hides the position or size window that is usually shown when a
window is moved or resized interactively.  To switch it off only
for move or resize operations the optional parameters
.IR Move " and " Resize
can be used respectively.  To switch both on again use the
.I Never
option.
.TP
.BI "Layer [" "arg1 arg2" "] | [" default "]"
Puts the current window in a new layer.  If
.I arg1
is non zero then the next layer is the current layer number plus
.IR arg1 .
If
.I arg1
is zero then the new layer is
.IR arg2 .
As a special case,
.I default
puts the window in its default layer, i.e. the layer it was
initially in.  The same happens if no or invalid arguments are
specified.
.TP
.BI "Lower"
Allows the user to lower a window.  Note that this lowers a window
only in its layer.  To bring a window to the absolute bottom, use
.EX
AddToFunc lower-to-bottom
 + I Layer 0 0
 + I Lower
.EE
.IP "\fBMove [[\fP \fIw\fP \
\fB|\fP \fIm\fP \
\fB]\fP \fIx\fP \
\fB[\fP \fIp\fP \
\fB] [\fP \fIw\fP \
\fB|\fP \fIm\fP \
\fB]\fP \fIy\fP \
\fB[\fP \fIp\fP \
\fB] [\fP \fIWarp\fP \
\fB]] | [\fP \fIpointer\fP \
\fB]\fP"
Allows the user to move a window.  If called from somewhere in a
window or its border, then that window is moved.  If called from
the root window then the user is allowed to select the target
window.  If the optional argument
.I Warp
is specified the pointer is warped with the window.  If the single
argument
.I pointer
is given, the top left corner of the window window is moved to the
pointer position before starting the operation; this is mainly
intended for internal use by modules like
.BR FvwmPager .
The operation can be aborted with Escape or by pressing mouse
button 2. Pressing button 3 sets the
.I PlacedByButton3
condition (see
.B Current
command).
If the optional arguments
.IR x " and " y
are provided, then the window is moved immediately without user
interaction.  Each argument can specify an absolute or relative
position from either the left/top or right/bottom of the screen.
By default, the numeric value given is interpreted as a percentage
of the screen width/height, but a trailing
.RI ' p '
changes the interpretation to mean pixels.  To move the window
relative to its current position, add the
.RI ' w '
(for "window") prefix before the
. IR x " and/or " y
value.  To move the window to a position relative to the current
location of the pointer, add the
.RI ' m '
(for "mouse") prefix.  To leave either coordinate unchanged,
"keep" can be specified in place of
.IR x " or " y .
Simple Examples:
.EX
# Interactive move
Mouse 1 T A Move
# Move window so top left is at (10%,10%)
Mouse 2 T A Move 10 10
# Move top left to (10pixels,10pixels)
Mouse 3 T A Move 10p 10p
.EE
More complex examples (these can be bound as actions to
keystrokes, etc.; only the command is shown, though):
.EX
# Move window so bottom right is at bottom
# right of screen
Move -0 -0
# Move window 5% to the right, and to the
# middle vertically
Move w+5 50
# Move window up 10 pixels, and so left edge
# is at x=40 pixels
Move 40p w-10p
# Move window to the mouse pointer location
#
Move m+0 m+0
.EE
See also the
.B AnimatedMove
command above.
.TP
.BI "MoveToDesk " prev " | " arg1 " [" arg2 "] [" "min max" "]"
Moves the selected window to another desktop.  The arguments are
the same as for the
.B GotoDesk
command.
.B MoveToDesk
is a replacement for the old
.B WindowsDesk
command, which can no longer be used.
.TP
.BI "MoveThreshold [" pixels "]"
When the user presses a mouse button upon an object fvwm waits to
see if the action is a click or a drag.  If the mouse moves by
more than
.I pixels
pixels it is assumed to be a drag.
Previous versions of fvwm hardwired
.I pixels
to 3, which is now the default value.  If
.I pixels
is negative or omitted the default value (which might be increased
when 16000x9000 pixel displays become affordable) is restored.
.IP "\fBMoveToPage [\fP \fIx\fP \
\fB[\fP \fIp\fP \
\fB]\fP \fIy\fP \
\fB[\fP \fIp\fP \
\fB]] | [\fIprev\fP \
\fB]\fP"
Moves the selected window to another page (x,y).  The upper left
page is (0,0), the upper right is (M,0), where M is one less than
the current number of horizontal pages specified in the
.B DeskTopSize
command.  Similarly the lower left page is (0,N), and the lower
right page is (M,N).  Negative page numbers refer to pages from
the rightmost/lowest page.  If
.IR x " and " y
are not given, the window is moved to the current page (a window
that has the focus but is off-screen can be retrieved with this).
Moving windows to a page relative to the current one can be
achieved by adding a trailing
.RI ' p '
after any or both numerical arguments.  To move a window to the
previous page use
.I prev
as the single argument.  Using MoveToPage on a sticky window makes
the window non-sticky (see
.B Stick
command).
Examples:
.EX
# Move window to page (2,3)
MoveToPage 2 3
# Move window to lowest and rightmost page
MoveToPage -1 -1
# Move window to last page visited
MoveToPage prev
# Move window two pages to the right and one
# page up
MoveToPage +2p -1p
.EE
.TP
.BI "MoveToScreen [ " screen " ]"
Moves the selected window to another Xinerama screen.  The
.I screen
argument can be 'p' for the primary screen, 'c' for the current
screen (containing the mouse pointer), 'g' for the global screen
or the screen number itself (counting from zero).
.TP
.BI "OpaqueMoveSize [" percentage "]"
Tells fvwm the maximum size window with which opaque window
movement should be used.  The percentage is percent of the total
screen area (may be greater than 100).  With
.EX
OpaqueMoveSize 0
.EE
all windows are moved using the traditional rubber-band
outline. With
.EX
OpaqueMoveSize unlimited
.EE
or if a negative percentage is given
all windows are moved as solid windows.  The default is
.EX
OpaqueMoveSize 5
.EE
which allows small windows to be moved in an opaque manner but
large windows are moved as rubber-bands.  If
.I percentage
is omitted or invalid the default value is set.  To resize windows
in an opaque manner you can use the
.I ResizeOpaque
style.  See
.B Style
command.
.TP
.BI "PlaceAgain [" Anim "]"
Causes the current window's position to be re-computed using the
initial window placement logic.  The window is moved to where it
would have been if it were a new window that had just appeared.
Most useful with
.IR Smart " or " Clever " (" ReallySmart ")"
placement.  If the optional argument
.I Anim
is specified, an animated move is used to place the window in its
new position.
.TP
.BI "Raise"
Allows the user to raise a window. Note that this raises a window
only in its layer. To bring a window to the absolute top, use
.EX
AddToFunc raise-to-top
 + I Layer 0 ontop
 + I Raise
.EE
where ontop is the highest layer used in your setup.
.TP
.BI "RaiseLower"
Alternately raises and lowers a window.  The window is raised if
it is obscured by any window (except for its own transients when
.I RaiseTransient
style is used; see
.B Style
command) otherwise it is lowered.
.IP "\fBResize [\fP \fIwidth\fP \
\fB[\fP \fIp\fP \
\fB|\fP \fIc\fP \
\fB]\fP \fIheight\fP \
\fB[\fP \fIp\fP \
\fB|\fP \fIc\fP \
\fB]] | [\fP \fIbottomright\fP \
\fB|\fP \fIbr x y\fP \
\fB]\fP"
Allows to resize a window.  If called from somewhere in a window
or its border, then that window is resized.  If called from the
root window then the user is allowed to select the target window.
The operation can be aborted with Escape or by pressing any mouse
button (except button 1 which confirms it).
If the optional arguments
.IR width " and " height
are provided, then the window is resized so that its dimensions
are
.IR width " by " height .
The units of
.IR width " and " height
are percent-of-screen, unless a letter
.RI ' p '
is appended to one or both coordinates, in which case the location
is specified in pixels.  With a
.RI ' c '
suffix the unit defined by the client application (hence the c) is
used.  So you can say
.EX
Resize 80c 24c
.EE
to make a terminal window just big enough for 80x24
characters. Both,
.IR width " and " height
can be negative.  In this case the new size is the screen size
minus the given value.  If either value is "keep", the
corresponding dimension of the window is left untouched.
An alternate syntax is used if the keyword
.IR bottomright " or in short " br
follows the command name.  In this case, the arguments
.IR x " and " y
specify the desired position of the bottom right corner of the
window.  They are interpreted exactly like the
.IR x " and " y
arguments of the
.B Move
command.
.TP
.BI "ResizeMove " "resize-arguments move-arguments"
This command does the same as the
.BR Resize " and " Move
commands, but in a single call which is less visually
disturbing. The
.I resize-arguments
are exactly the same arguments as for the
.B Resize
command and the
.I move-arguments
are exactly the same arguments as for the
.B Move
command except the
.I pointer
option which is not supported by the
.B ResizeMove
command.
Example:
.EX
# Move the window to the top left corner
ResizeMove w+0 -10p 0 -20p
.EE
.TP
.BI "SetAnimation " milliseconds-delay " [" fractions-to-move-list "]"
Sets the time between frames and the list of fractional offsets to
customize the animated moves of the
.B AnimatedMove
command and the animation of menus (if the menu style is set to
animated; see
.B MenuStyle
command).  If the
.I fractions-to-move-list
is omitted, only the time between frames is altered.  The
.I fractions-to-move-list
specifies how far the window should be offset at each successive
frame as a fraction of the difference between the starting
location and the ending location.  e.g.:
.EX
SetAnimation 10 -.01 0 .01 .03 .08 .18 .3 \\
  .45 .6 .75 .85 .90 .94 .97 .99 1.0
.EE
Sets the delay between frames to 10 milliseconds, and sets the
positions of the 16 frames of the animation motion.  Negative
values are allowed, and in particular can be used to make the
motion appear more cartoonish, by briefly moving slightly in the
opposite direction of the main motion.  The above settings are the
default.
.IP "\fBSnapAttraction [\fP \fIproximity\fP \
\fB[\fP \fIbehavior\fP \
\fB] [\fP \fIScreen\fP \
\fB]]\fP"
If during an interactive move the window or icon comes within
.I proximity
pixels of another the window or icon, it is moved to make the
borders adjoin.  The default of 0 means that no snapping happens.
Calling this command without arguments turns off snap attraction
and restores the default behavior.  Please refer also to the
.B SnapGrid
command.
The
.I behavior
argument is optional and may be set to one of the four following
values:  With
.I All
both icons and windows snap to other windows and other icons.
.I SameType
lets snap windows only to other windows and icons only to other
icons. With
.I Windows
windows snap only to other windows.  Icons do not snap. Similarly
with
.I Icons
icons snap to only other icons and windows do not snap.
If the
.I behavior
option is not given, the snapping behavior is not changed.  The
default behavior is
.IR All .
If the
.I Screen
option is present windows and or icons are snapped to the screen
edges too.
.TP
.BI "SnapGrid [" "x-grid-size y-grid-size" "]"
During an interactive move a window or icon is positioned such
that its location (top left corner) is coincident with the nearest
grid point. The default
.IR x-grid-size " and " y-grid-size
setting are both 1, which is effectively no grid all.  An
interactive move with both
.BR SnapGrid " and " SnapAttraction
results in the window being moved to be adjacent to the nearest
window border (if within snap proximity) or grid position.  In
other words, the window moves the shortest distance possible to
satisfy both
.BR SnapGrid " and " SnapAttraction .
Note that the x and y coordinates are not coupled.  For example, a
window may snap to another window on the x axis while snapping to
a grid point on the y axis.  Calling this command without
arguments reinstates the default settings.
.TP
.BI "WindowsDesk " arg1 " [" arg2 "]"
Moves the selected window to another desktop.
This command has been removed and must be replaced by
.BR MoveToDesk ,
the arguments for which are the same as for the
.B GotoDesk
command.
.B Important note:
You cannot simply change the name of the command: the syntax has
changed.  If you used
.EX
WindowsDesk n
.EE
to move a window to desk n, you have to change it to
.EX
MoveToDesk 0 n
.EE
.TP
.BI "XorPixmap [" pixmap "]"
Selects the pixmap with which bits are xor'ed when doing
rubber-band window moving or resizing.  This has a better chance
of making the rubber-band visible if
.B XorValue
does not give good results.  An example pixmap
.I resize.rainbow.xpm
is provided with the icon distribution.  To turn the
.B XorPixmap
off again use the
.B XorValue
command or omit the
.I pixmap
argument.
.TP
.BI "XorValue [" number "]"
Changes the value with which bits are xor'ed when doing
rubber-band window moving or resizing.  Setting this value is a
trial-and-error process.  The default value 0 tries to find a
value that gives a good contrast to black and white.  It is set if
the given
.I number
is omitted or invalid.
.SS COMMANDS FOR FOCUS AND MOUSE MOVEMENT
.TP
.BI "CursorMove " horizontal "[" p "] " vertical "[" p "]"
Moves the mouse pointer by
.I horizontal
pages in the X direction and
.I vertical
pages in the Y direction.  Either or both entries may be
negative. Both horizontal and vertical values are expressed in
percent of pages, so
.EX
CursorMove 100 100
.EE
means to move down and right by one full page.
.EX
CursorMove 50 25
.EE
means to move right half a page and down a quarter of a
page. Alternatively, the distance can be specified in pixels by
appending a
.RI ' p '
to the horizontal and/or vertical specification.  For example
.EX
CursorMove -10p -10p
.EE
means move ten pixels up and ten pixels left.  The CursorMove
function should not be called from pop-up menus.
.TP
.BI "FlipFocus  [" NoWarp "]"
Executes a
.B Focus
command as if the user had used the pointer to select the
window. This command alters the order of the WindowList in the
same way as clicking in a window to focus, i.e. the target window
is removed from the
.B WindowList
and placed at the start. This command is recommended for use with
the
.B Direction
command and in the function invoked from
.BR WindowList .
.TP
.BI "Focus  [" NoWarp "]"
Sets the keyboard focus to the selected window.  If the
.I NoWarp
argument is given, this is all it does.  Otherwise it also moves
the viewport or window as needed to make the selected window
visible. This command does not automatically raise the
window. Does not warp the pointer into the selected window (see
.B WarpToWindow
function).  Does not de-iconify.  This command does not alter the
order of the
.BR WindowList ,
it rotates the
.B WindowList
around so that the target window is at the start.
When the
.I NoWarp
argument is given, Focus cannot transfer the keyboard focus to
windows on other desks.
To raise and/or warp a pointer to a window together with
.BR Focus " or " FlipFocus ,
use a function, like:
.EX
AddToFunc SelectWindow
.EE
.TP
.BI "WarpToWindow " x "[" p "] " y "[" p "]"
Warps the cursor to the associated window.  The parameters
.IR x " and " y
default to percentage of window down and in from the upper left
hand corner (or number of pixels down and in if
.RI ' p '
is appended to the numbers).  If a number is negative the opposite
edge is used and the direction reversed.  This command works also
with windows that are not managed by fvwm.  In this case fvwm does
not bring the window onto the screen if it is not visible.  For
example it is possible to warp the pointer to the center of the
root window on screen 1:
.EX
WindowId root 1 WarpToWindow 50 50
.EE
.SS COMMANDS CONTROLLING WINDOW STATE
.TP
.BI "Close"
If the window accepts the delete window protocol a message is sent
to the window asking it to gracefully remove itself.  If the
window does not understand the delete window protocol then the
window is destroyed as with the
.B Destroy
command.  Note: if the window accepts the delete window protocol
but does not close itself in response, the window is not deleted.
.TP
.BI "Delete"
Sends a message to a window asking that it remove itself,
frequently causing the application to exit.
.TP
.BI "Destroy"
Destroys an application window, which usually causes the
application to crash and burn.
.TP
.BI "Iconify [" bool "]"
Iconifies a window if it is not already iconified or de-iconifies
it if it is already iconified.  The optional argument
.I bool
is a boolean argument.  "True" means only iconification is
allowed, while "False" forces de-iconification.  Using "toggle"
switches between iconified and de-iconified states.
There are a number of
.B Style
options which influence the appearance and behavior of icons (e.g.
.IR StickyIcon ", " NoIcon ).
For backwards compatibility, the optional argument may also be a
positive number instead of "True", or a negative number instead of
"False".  Note that this syntax is obsolete, and will be removed
in the future.
.IP "\fBMaximize [\fP\fIscreen screen-spec\fP\fB] \
[\fP\fIbool\fP\fB] \
[\fP\fIhorizontal\fP\fB[\fP\fIp\fP\fB]\fP \
\fIvertical\fP\fB[\fP\fIp\fP\fB]]\fP"
Without its optional arguments (or if the
.I bool
bit has the value "toggle")
.B Maximize
causes the window to alternately switch from a full-screen size to
its normal size.  To force a window into maximized (normal) state
you can use a "True" or "False" value for the
.I bool
argument.
With the optional arguments
.IR horizontal " and " vertical ,
which are expressed as percentage of a full screen, the user can
control the new size of the window.  An optional suffix
.RI ' p '
can be used to indicate pixels instead of percents of the screen
size.  If horizontal is greater than 0 then the horizontal
dimension of the window is set to
.IR horizontal *screen_width/100.
If the value is smaller than 0 the size is subtracted from the
screen width, i.e. -25 is the same as 75.  If
.I horizontal
is "grow", it is maximized to current available space until
finding any obstacle.  The vertical resizing is similar.  If both
horizontal and vertical values are "grow", it expands vertically
first, then horizontally to find space.  Instead of the horizontal
"grow" argument, "growleft" or "growright" can be used
respectively "growup" and "growdown".  For example, the following
adds a title-bar button to switch a window to the full vertical
size of the screen:
.EX
Mouse 0 4 A Maximize 0 100
.EE
The following causes windows to be stretched to the full width:
.EX
Mouse 0 4 A Maximize 100 0
.EE
This makes a window that is half the screen size in each
direction:
.EX
Mouse 0 4 A Maximize 50 50
.EE
To expand a window horizontally until any other window is found:
.EX
Mouse 0 4 A Maximize 0 grow
.EE
To expand a window but leave the lower 60 pixels of the screen
unoccupied
.EX
Mouse 0 4 A Maximize 100 -60p
.EE
Values larger than 100 can be used with caution.
If the first argument is the word
.IR screen ,
the
.I screen-spec
argument specifies the Xinerama screen on which to operate.
It can be 'p' for the primary screen, 'c' for the current
screen (containing the mouse pointer), 'g' for the global screen
or the screen number itself (counting from zero).  This option is
only useful with multiple Xinerama screens.
.TP
.BI "Recapture"
Causes fvwm to recapture all of its windows.  This ensures that
the latest style parameters are used.  The recapture operation is
visually disturbing.
Since fvwm version 2.4 only a very few
.B Style
options need a
.B Recapture
to take effect (e.g.
.IR UseStyle ).
.TP
.BI "RecaptureWindow"
Causes fvwm to recapture the chosen window.  See
.B Recapture
command above.
.TP
.BI "Refresh"
Causes all windows on the screen to redraw themselves. All pending
updates of all windows' styles and looks are applied immediately.
E.g. if
.BR Style " or " TitleStyle
commands were issued inside a fvwm function.
.TP
.BI "RefreshWindow"
Causes the chosen window to redraw itself. All pending updates of
the window's style and looks are applied immediately.  E.g. if
.BR Style " or " TitleStyle
commands were issued inside a fvwm function.
.TP
.BI "Stick [" bool "]"
If the
.I bool
argument is empty or "toggle", the
.B Stick
command makes a window sticky if it is not already sticky, or
non-sticky if it is already sticky.  To make a window sticky
regardless of its current state the
.I bool
argument must be "True".  To make it non-sticky use "False".
.TP
.BI "WindowShade [" bool "]"
Toggles the window shade feature for titled windows.  Windows in
the shaded state only display a title-bar.  If
.I bool
is not given or "toggle", the window shade state is toggled.  If
.I bool
is "True", the window is forced to the shaded state. If
.I bool
is "False", then the window is forced to the non-shaded
state. Windows without titles can be shaded too.  See also
.I WindowShadeSteps
option of the
.B Style
command.
For backwards compatibility, the optional argument may also be 1
to signify "on", and 2 to signify "off". Note that this syntax is
obsolete, and will be removed in the future.
.TP
.BI "WindowShadeAnimate  [" steps "[" p "]]"
This command is obsolete.  Please use the
.I WindowShadeSteps
option of the
.B Style
command instead.
.SS COMMANDS FOR MOUSE, KEY AND STROKE BINDINGS
.TP
.BI "IgnoreModifiers [" Modifiers "]"
Tells fvwm which modifiers to ignore when matching Mouse or Key
bindings.
.B IgnoreModifiers
affects the
.I ClickToFocus
style too.  This command belongs into your
.IR .fvwm2rc .
If you issue it when your fvwm session is already up and running
the results are unpredictable.  The should appear before any
applications or modules are started in your
.I .fvwm2rc
file (e.g. with the
.B Exec
command).
.I Modifiers
has the same syntax as in the
.BR Mouse " or " Key
bindings, with the addition of 'L' meaning the
.SM caps lock
key.  The default is "L".
.I Modifiers
can be omitted, meaning no modifiers are ignored.  This command
comes in handy if the
.SM num-lock
and
.SM scroll-lock
keys interfere with your shortcuts.  With XFree86 '2' usually is
the
.SM num-lock
modifier and '5' refers to the
.SM scroll-lock
key. To turn all these pesky modifiers off you can use this
command:
.EX
IgnoreModifiers L25
.EE
.I Important Note:
This command creates a lot of extra network traffic, depending on
your CPU, network connection, the number of
.BR Key " or " Mouse
commands in your configuration file and the number of modifiers you
want to ignore.  If you do not have a lightning fast machine or
very few bindings you should not ignore more than two modifiers.
I.e. do not ignore
.SM scroll-lock
if you have no problem with it.  In the
.I FAQ
you can find a better solution of this problem.
.TP
.BI "GnomeButton"
Used in conjunction with
.B Mouse
to pass mouse button presses on the root window to a
.SM GNOME
program (such as GMC).  The following example passes presses of
mouse buttons 1 and 3 to such a program.
.EX
Mouse 1 R A GnomeButton
Mouse 3 R A GnomeButton
.EE
.TP
.BI "Key " "Keyname Context Modifiers Function"
Binds a keyboard key to a specified fvwm built-in function, or
removes the binding if
.I Function
is '-'.  The syntax is the same as for a
.B Mouse
binding except that the mouse button number is replaced with a
.IR Keyname .
The
.I Keyname
is one of the entries from
.IR /usr/include/X11/keysymdef.h ,
with the leading XK_ omitted.  The
.IR Context " and " Modifiers
fields are defined as in the
.B Mouse
binding.  However, when you press a key the context window is the
window that has the keyboard focus.  That is not necessarily the
same as the window the pointer is over (with
.IR SloppyFocus " or " ClickToFocus ).
Note that key bindings with the 'R' (root window) context do not
work properly with
.IR SloppyFocus " and " ClickToFocus .
If you encounter problems, use the
.B PointerKey
command instead.  If you want to bind keys to a window with
.IR SloppyFocus " or " ClickToFocus
that are supposed to work when the pointer is not over the window,
fvwm assumes the pointer is over the client window (i.e. you have
to use the 'W' modifier).
The following example binds the built in window list to pop up
when
.SM Alt-Ctrl-Shift-F11
is hit, no matter where the mouse pointer is:
.EX
Key F11 A SCM WindowList
.EE
Binding a key to a title-bar button causes that button to appear.
Please refer to the
.B Mouse
command for details.
.TP
.BI "Mouse " "Button Context Modifiers Function"
Defines a mouse binding, or removes the binding if
.I Function
is '-'.
.I Button
is the mouse button number.  If
.I Button
is zero then any button performs the specified function.
.I Context
describes where the binding applies.  Valid contexts are 'R' for
the root window, 'W' for an application window, 'T' for a window
title-bar, 'S' for a window side, top, or bottom bar, 'F' for a
window frame (the corners), 'I' for an Icon window, or '0' through
'9' for title-bar buttons, or any combination of these letters.
'A' is for any context except for title-bar buttons.  For
instance, a context of "FST" applies when the mouse is anywhere in
a window's border except the title-bar buttons.  Only 'S' and 'W'
are valid for an undecorated window.
.I Modifiers
is any combination of 'N' for no modifiers, 'C' for control, 'S'
for shift, 'M' for Meta, 'L' for Caps-Lock or 'A' for any
modifier. For example, a modifier of "SM" applies when both the
.SM Meta
and
.SM Shift
keys are down.  X11 modifiers mod1 through mod5 are represented as
the digits '1' through '5'.  The modifier 'L' is ignored by
default.  To turn it on, use the
.B IgnoreModifiers
command.
.I Function
is one of fvwm's built-in functions.
The title-bar buttons are numbered with odd numbered buttons on
the left side of the title-bar and even numbers on the
right. Smaller-numbered buttons are displayed toward the outside
of the window while larger-numbered buttons appear toward the
middle of the window (0 is short for 10).  In summary, the buttons
are numbered:
.EX
1 3 5 7 9    0 8 6 4 2
.EE
The highest odd numbered button which has an action bound to it
determines the number of buttons drawn on the left side of the
title bar.  The highest even number determines the number or right
side buttons which are drawn.  Actions can be bound to either
mouse buttons or keyboard keys.
.TP
.BI "PointerKey " "Keyname Context Modifiers Function"
This command works exactly like the
.B Key
command.  The only difference is that the binding operates on the
window under the pointer.  Normal key bindings operate on the
focused window instead.  The
.B PointerKey
command can for example be used to bind keys to the root window if
you are using
.IR SloppyFocus " or " ClickToFocus .
However, some applications (xterm is one example) are unable to
handle this key anymore, even if the pointer is over the xterm
window.  It is recommended to use the
.B PointerKey
command only for key combinations that are not needed in any
application window.
Example:
.EX
Style * SloppyFocus
PointerKey f1 a m Menu MainMenu
.EE
.TP
.BI "Stroke " "Sequence Button Context Modifiers Function"
Binds a mouse stroke sequence to a specified fvwm built-in
function, or removes the binding if
.I Function
is '-'.  The syntax is the same as for a
.B Mouse
binding except that
.I Sequence
is inserted in front of the button number and a value of 0 for
.I Button
concerns the
.B StrokeFunc
command.  The
.IR Context " and " Modifiers
fields are defined as in the
.B Mouse
binding.  However, only the 'R' Context really works (if you want
to use other contexts you need to use the
.B StrokeFunc
below).
Strokes sequences are defined in a telephone grid like this:
.EX
 1  2  3
 4  5  6
 7  8  9
.EE
or in a numeric pad grid like this:
.EX
 7  8  9
 4  5  6
 1  2  3
.EE
The telephone grid is used by default, to use the numeric pad grid
you should begin the sequence with a 'N'.  Note that a complex
motion may gives several different sequences (see the "netscape"
example below to handle such motion).  Moreover, sequence are
limited to 20 elements (with the present version of
.BR libstroke ),
however, in practice it is preferable to use sequence with less
than 12 elements.
Because of the default button menu in fvwm, you may need to remove
a mouse button binding (using an empty action) before using the
stroke
.EX
Mouse 3 R N
.EE
Also, you can still use the stroke "sequence 0" to simulate a
click:
.EX
Stroke 0 3 R N Menu WindowList Nop
.EE
The following example starts xterm when the mouse drags an 'I' on
the root window with button 3 pressed down:
.EX
Stroke 258  3  R  N  Exec exec xterm
.EE
An example for Netscape:
.EX
Stroke 7415963    3  R  N  Exec exec netscape
Stroke 74148963   3  R  N  Exec exec netscape
Stroke 74158963   3  R  N  Exec exec netscape
Stroke 7418963    3  R  N  Exec exec netscape
Stroke 415963     3  R  N  Exec exec netscape
.EE
You may prefer to use the numeric pad grid since you have such a
grid on your machine. Here an example:
.EX
Stroke N78963314   3  R  N  FvwmForm FvwmForm-QuitVerify
Stroke N789633147  3  R  N  FvwmForm FvwmForm-QuitVerify
.EE
This example starts the "QuitVerify" form if you draw a box that
begins in the top left corner.
Note: You need
.B libstroke
installed and fvwm compiled with stroke support.
.B libstroke
can be obtained at
.EX
.B http://www.etla.net/~willey/projects/libstroke/
.EE
.TP
.BI "StrokeFunc [" Options "]"
Causes fvwm to record a mouse stroke sequence and to execute the
corresponding action as defined in a
.B Stroke
command.  The cursor is modified to the
.I STROKE
context of the
.B CursorStyle
command during recording.  When the stroke is finished
.B StrokeFunc
looks for a stroke binding of the form
.EX
Stroke sequence 0 Context Modifiers action
.EE
and executes the corresponding action (Note the 0).  Normal use of this
function is via a
.BR Mouse " or " Key
command.  Examples:
.EX
Mouse 3 A M StrokeFunc
Key x R N StrokeFunc
.EE
If you press mouse button 3 and
.SM Alt
anywhere (respectively, press the key x when the cursor is on the
root window), then fvwm records the mouse motions until the mouse
button 3 (respectively, the x key) is released and then check if
the recorded
.I sequence
corresponds to a stroke binding of the form
.EX
.RI """Stroke " sequence " 0 A M " action """ \""
.RI """Stroke " sequence " 0 R N " action """ \""
.EE
Note that the
.IR Context " and " Modifiers
are taken at the beginning of the execution of the
.B StrokeFunc
command (so you can release the modifiers before the end of the
stroke recording in the case of a mouse binding and if you used,
say, a title-bar context the mouse motion can go through an
application window).  The keys
.SM Escape
and
.SM Delete
allow you to abort the command.
The
.B StrokeFunc
command has five options:
.IR NotStayPressed ", " EchoSequence ", " DrawMotion ", " FeedBack " and " StrokeWidth.
These options are disabled by default.
.I EchoSequence
causes fvwm to Echo the recorded stroke sequence.
.I DrawMotion
causes fvwm to draw the mouse motion on the screen.
.I FeedBack
causes fvwm to display during a fraction of second the cursor of the
.I WAIT
context of the
.B CursorStyle
command if the recorded stroke sequence corresponds to a stroke
binding.
.I StrokeWidth
takes an integer argument, which must be  >= 0 and <= 100 and
which defines the width of the line for the
.I DrawMotion option.
.I NotStayPressed
works only if
.B StrokeFunc
is used via a
.BR Mouse
or a
.B Key
command.  This option removes the need to have a button or the key
pressed during the stroke, but you have to do a mouse click or
press the
.SM Return
or
.SM Space
key to finish the mouse motion recording (these keys also work
without the
.I NotStayPressed
option).
You can use the
.B StrokeFunc
"alone".  In this case it works as above with the
.I NotStayPressed
option enabled.  However,
.I Modifiers,
in general, may not work as expected (i.e., in this case use 'A'
or 'N' as
.I Modifiers
in the stroke bindings).
Note that some computers do not support key release events. If
that is the case the
.B StrokeFunc
used via a
.B Key
command works as if the
.I NotStayPressed
option is enabled.
.SS THE STYLE COMMAND (CONTROLLING WINDOW STYLES)
.TP
.BI "UpdateStyles"
All pending updates of all windows' styles and looks are applied
immediately.  E.g. if
.BR Style " or " TitleStyle
commands were issued inside a fvwm function.
.TP
.BI "Style " "stylename options"
This command is intended to replace the old fvwm 1.xx global
commands NoBorder, NoTitle, StartsOnDesk, Sticky, StaysOnTop,
Icon, WindowListSkip, CirculateSkip, SuppressIcons, BoundaryWidth,
NoBoundaryWidth, StdForeColor, and StdBackColor with a single
flexible and comprehensive window specific command.  This command
is used to set attributes of a window to values other than the
default or to set the window manager default styles.
.I stylename
can be a window's name, class, or resource string.  It may contain
the wildcards '*' and '?', which are matched in the usual Unix
filename manner.  They are searched in the reverse order
stated. When two conflicting styles apply to the same window, the
style that was changed last wins.
Note: windows that have no name (WM_NAME) are given a name of
"Untitled", and windows that don't have a class (WM_CLASS,
res_class) are given class "NoClass" and those that don't have a
resource (WM_CLASS, res_name) are given resource "NoResource".
.I options
is a comma separated list containing one or more of the keywords
.IR BorderWidth ", " HandleWidth ,
.IR NoIcon " / " Icon ", " MiniIcon ,
.IR IconBox ", " IconGrid ", " IconFill ,
.IR NoTitle " / " Title ,
.IR TitleAtBottom " / " TitleAtTop ,
.IR StippledTitle " / " StippledTitleOff ,
.IR NoHandles " / " Handles ,
.IR WindowListSkip " / " WindowListHit ,
.IR CirculateSkip " / " CirculateHit ,
.IR CirculateSkipShaded " / " CirculateHitShaded ,
.IR Layer ,
.IR StaysOnTop " / " StaysOnBottom " / " StaysPut ,
.IR Sticky " / " Slippery ,
.IR StartIconic " / " StartNormal ,
.IR Color ", " ForeColor ", " BackColor ", " Colorset ,
.IR HilightFore ", " HilightBack ", " HilightColorset ,
.IR BorderColorset ", " HilightBorderColorset ,
.IR Font ,
.IR IconFont ,
.IR StartsOnDesk " / " StartsOnPage " / " StartsAnyWhere ,
.IR StartsOnScreen ,
.IR ManualPlacementHonorsStartsOnPage " / " ManualPlacementIgnoresStartsOnPage ,
.IR CaptureHonorsStartsOnPage " / " CaptureIgnoresStartsOnPage ,
.IR RecaptureHonorsStartsOnPage " / " RecaptureIgnoresStartsOnPage ,
.IR StartsOnPageIncludesTransients " / " StartsOnPageIgnoresTransients ,
.IR IconTitle " / " NoIconTitle ,
.IR MwmButtons " / " FvwmButtons ,
.IR MwmBorder " / " FvwmBorder ,
.IR MwmDecor " / " NoDecorHint ,
.IR MwmFunctions " / " NoFuncHint ,
.IR HintOverride " / " NoOverride ,
.IR NoButton " / " Button ,
.IR ResizeHintOverride " / " NoResizeOverride ,
.IR OLDecor " / " NoOLDecor ,
.IR GNOMEUseHints " / " GNOMEIgnoreHints ,
.IR StickyIcon " / " SlipperyIcon ,
.IR ManualPlacement " / " CascadePlacement " / " MinOverlapPlacement " / "
.IR MinOverlapPercentPlacement " / " TileManualPlacement " / "
.IR TileCascadePlacement ,
.IR DecorateTransient " / " NakedTransient ,
.IR RaiseTransient " / " DontRaiseTransient ,
.IR LowerTransient " / " DontLowerTransient ,
.IR StackTransientParent " / " DontStackTransientParent ,
.IR SkipMapping " / " ShowMapping ,
.IR ScatterWindowGroups " / " KeepWindowGroupsOnDesk ,
.IR UseDecor ,
.IR UseStyle ,
.IR NoPPosition " / " UsePPosition ,
.IR NoUSPosition " / " UseUSPosition ,
.IR NoTransientPPosition " / " UseTransientPPosition ,
.IR NoTransientUSPosition " / " UseTransientUSPosition ,
.IR UseIconPosition " / " NoIconPosition ,
.IR Lenience " / " NoLenience ,
.IR ClickToFocus " / " SloppyFocus " /"
.IR MouseFocus | FocusFollowsMouse " / " NeverFocus ,
.IR ClickToFocusPassesClickOff " / " ClickToFocusPassesClick ,
.IR ClickToFocusRaisesOff " / " ClickToFocusRaises ,
.IR MouseFocusClickRaises " / " MouseFocusClickRaisesOff ,
.IR StartsLowered " / " StartsRaised ,
.IR GrabFocus " / " GrabFocusOff ,
.IR GrabFocusTransient " / " GrabFocusTransientOff ,
.IR IgnoreRestack " / " AllowRestack ,
.IR FixedPosition " / " VariablePosition ,
.IR IconOverride " / " NoIconOverride " / " NoActiveIconOverride ,
.IR DepressableBorder " / " FirmBorder ,
.IR MaxWindowSize ,
.IR IconifyWindowGroups " / " IconifyWindowGroupsOff ,
.IR ResizeOpaque " / " ResizeOutline ,
.IR BackingStore " / " BackingStoreOff ,
.IR Opacity " / " ParentalRelativity ,
.IR SaveUnder " / " SaveUnderOff ,
.IR WindowShadeShrinks " / " WindowShadeScrolls ,
.IR WindowShadeSteps.
.\" +++++++++++++++ general notes
In the above list some options are listed as
style-option/opposite-style-option.  The opposite-style-option for
entries that have them describes the fvwm default behavior and can
be used if you want to change the fvwm default behavior.
.\" +++++++++++++++ focus policy
.TP
.B Focus policy
.I ClickToFocus
instructs fvwm to give the focus to the window when it is clicked
in.  The default
.I MouseFocus
(or its alias
.IR FocusFollowsMouse )
tells fvwm to give the window the focus as soon as the pointer
enters the window, and take it away when the pointer leaves the
window.
.I SloppyFocus
is similar, but doesn't give up the focus if the pointer leaves
the window to pass over the root window or a ClickToFocus window
(unless you click on it, that is), which makes it possible to move
the mouse out of the way without losing focus.  A window with the
style
.I NeverFocus
never receives the focus.  This is useful for modules like
.BR FvwmButtons ,
for example.
The focus model can be augmented with several additional options.
.IR ClickToFocusPassesClickOff " and " ClickToFocusPassesClick
controls if a mouse click to focus a window using the
.I ClickToFocus
model is sent to the application or not.  Similarly,
.IR ClickToFocusRaisesOff " and " ClickToFocusRaises
control if the window is raised, while
.IR MouseFocusClickRaises " and " MouseFocusClickRaisesOff
are equivalent but apply only to windows using
.IR SloppyFocus ", " MouseFocus " and " NeverFocus .
The defaults are
.IR ClickToFocusPassesClick ,
.IR ClickToFocusRaises " and " MouseFocusClickRaisesOff .
.I GrabFocus
causes a newly mapped window to grab the focus, while
.I GrabFocusOff
turns this off.
.I GrabFocus
is the default for
.I ClickToFocus
windows and
.I GrabFocusOff
is the default for
.IR MouseFocus " and " SloppyFocus
windows.  Note that this option is switched back to the default
every time you change the focus policy.  You have to use it after
the initial
.IR ClickToFocus / MouseFocus / SloppyFocus .
This style does not apply to transient windows.  The
.IR GrabFocusTransient " and " GrabFocusTransientOff
styles are responsible for this behavior.  By default,
.I GrabFocusTransient
is turned on.
.I Lenience
instructs fvwm to ignore the convention in the
.SM ICCCM
which states that if an application sets the input field of the
wm_hints structure to False, then it never wants the window
manager to give it the input focus.  The only application that we
know of which needs this is sxpm, and that is a silly bug with a
trivial fix and has no overall effect on the program anyway.
Rumor is that some older applications have problems too.
.\" +++++++++++++++ styles affecting the window title
.TP
.B Window title
The
.IR Title " and " NoTitle
options determine if the window has a title-bar or not.  By
default all windows have a title-bar.
Windows with the
.I TitleAtBottom
style have a title-bar below the window instead of above as
usual. The
.I TitleAtTop
style restores the default placement.  Even if the window has the
.I NoTitle
style set, this affects the
.I WindowShade
command.
With the
.I StippledTitle
style, are drawn with the same effect that is usually reserved for
windows with the
.I Sticky
style.
.I StippledTitleOff
reverts back to normal titles.
.I Color
takes two arguments.  The first is the window-label text color and
the second is the window decoration's normal background color. The
two colors are separated with a slash.  If the use of a slash
causes problems then the separate
.IR ForeColor " and " BackColor
options can be used.
.I Colorset
takes the colorset number as its sole argument and overrides the
colors set by
.IR Color .
Instead, the corresponding colors from the given colorset are
used.  Note that all other features of a colorset are unsupported
yet. To stop using the colorset, the colorset number can be
omitted.
The
.IR HilightFore ", " HilightBack " and " HilightColorset
style options work exactly like
.IR ForeColor ", " BackColor " and " Colorset
but are used only if the window has the focus.  These styles
replace the old commands
.BR HilightColor " and " HilightColorset .
.IR BorderColorset
takes the colorset number as its sole argument and overrides the
colors set by
.IR Color " or " Colorset .
for the window border.  To stop using a colorset, the argument can
be omitted.
The
.IR HilightBorderColorset
style option works similarly to
.IR BorderColorset
but is used when the window has the focus.
The
.IR Font " and " IconFont
options take the name of a font as their sole argument. This font
is used in the window or icon title.  By default the font given in
the
.B DefaultFont
command is used.  To revert back to the default, use the style
without the name argument.  These styles replace the older
.BR WindowFont " and " IconFont
commands.
.\" +++++++++++++++ styles affecting title buttons
.TP
.B Title buttons
.IR Button " and " NoButton
take a numeric argument which is the number of the title-bar
button which is to be included/omitted.
.I MwmButtons
makes the
.B Maximize
button look pressed-in when the window is maximized.  See the
.I MwmDecorMax
flag in
.B ButtonStyle
for more information.  To switch this style off again, use the
.I FvwmButtons
style.
.\" +++++++++++++++ styles affecting borders
.TP
.B Borders
.I MwmBorder
makes the 3-D bevel more closely match Mwm's.
.I FvwmBorder
turns off the previous option.
.I HandleWidth
takes a numeric argument which is the width of the border to place
the window if it does have resize-handles.
.I BorderWidth
takes a numeric argument which is the width of the border to place
the window if it does not have resize-handles.
.I DepressableBorder
makes the border parts of the window decoration look sunken in
when a button is pressed over them.  This can be disabled again
with the
.I FirmBorder
style.
.\" +++++++++++++++ icons, shading, maximizing, movement, resizing
.TP
.B Icons, shading, maximizing, movement, resizing
.I Icon
takes an (optional) unquoted string argument which is the icon
bitmap or pixmap to use.  Icons specified this way override pixmap
icons, but not icon windows, provided by the client in the
application (with the WM_HINTS property).  The
.I IconOverride
style changes the behavior to override any client-provided icons;
the
.I NoIconOverride
style changes the behavior to not override any client-provided
icons; the default overriding behavior can be activated with the
.I NoActiveIconOverride
style.  With this style, fvwm uses application provided icons if
the icon is changed but uses the icon provided in the
configuration file until then.
There is one exception to these rules, namely
.EX
Style * Icon unknown.xpm
.EE
doesn't force the unknown.xpm icon on every window, it just sets
the default icon like the DefaultIcon command. If you really want
all windows to have the same icon, you can use
.EX
Style ** Icon unknown.xpm
.EE
If the
.I NoIcon
attribute is set then the specified window simply disappears when
it is iconified.  The window can be recovered through the
window-list.  If
.I Icon
is set without an argument then the
.I NoIcon
attribute is cleared but no icon is specified.  An example which
allows only the
.B FvwmPager
module icon to exist:
.EX
Style * NoIcon
Style FvwmPager Icon
.EE
.I IconBox
takes no argument, four numeric arguments (plus optionally a
screen specification), an X11 geometry string or the string
"none":
.EX
.RI IconBox " [" "screen scr-spec" "] " "l t r b"
.EE
or
.EX
IconBox geometry
.EE
Where
.I l
is the left coordinate,
.I t
is the top,
.I r
is right and
.I b
is bottom.  Negative coordinates indicate distance from the right
or bottom of the screen.
If the first argument is the word
.IR screen ,
the
.I scr-spec
argument specifies the Xinerama screen on which the IconBox is
defined.  It can be the usual screen Xinerama specification, 'p',
'c', 'g', a screen number or the additional 'w' for the screen
where the window center is located.  This is only useful with
multiple Xinerama screens.  Perhaps easier to use is an X11
geometry string:
.EX
IconBox -80x200-1-1
.EE
Which would place an 80 by 240 pixel icon box in the lower right
hand corner of the screen.  The icon box is a region of the screen
where fvwm attempts to put icons for any matching window, as long
as they do not overlap other icons. Multiple icon boxes can be
defined as overflow areas.  When the first icon box is full, the
second one is filled.  All the icon boxes for one style must be
defined in one
.B Style
command.  For example:
.EX
Style * IconBox -80x200-1-1, \\
        IconBox 1000x70-1-1
.EE
A Style command with the IconBox option replaces any icon box
previously defined for the same style.  Thats why the backslash in
the previous example is required.
Note: The geometry for the icon box command takes the additional
screen specifier "@w" in case a Xinerama setup is used.  This
designates the screen where the window center is located.  The
additional screen specifier is not allowed anywhere else.
If you never define an icon box, or you fill all the icon boxes,
fvwm has a default icon box that covers the screen, it fills top
to bottom, then left to right, and has an 80x80 pixel grid.  To
disable all but the default icon box you can use IconBox without
arguments in a separate
.B Style
command.  To disable all icon boxes including the default icon
box, the argument "none" can be specified.
Hint: You can auto arrange your icons in the icon box with a
simple fvwm function.  Put the "DeiconifyAndRearrange" function
below in your configuration file:
.EX
AddToFunc DeiconifyAndRearrange
 + C Iconify off
 + C All (CurrentPage Iconic) RecaptureWindow
.EE
And then replace all places where you call the
.B Iconify
builtin function to de-iconify an icon with a call to the new
function.  For example replace
.EX
AddToFunc IconFunc
 + C Iconify off
 + M Raise
 + M Move
 + D Iconify off
Mouse 1 I A Iconify off
.EE
with
.EX
AddToFunc IconFunc
 + C DeiconifyAndRearrange
 + M Raise
 + M Move
 + D DeiconifyAndRearrange
Mouse 1 I A DeiconifyAndRearrange
.EE
.I IconGrid
takes 2 numeric arguments greater than zero.
.EX
.I IconGrid x y
.EE
Icons are placed in an icon box by stepping through the icon box
using the
.IR x " and " y
values for the icon grid, looking for a free space. The default
grid is 3 by 3 pixels which gives a tightly packed appearance. To
get a more regular appearance use a grid larger than your largest
icon. Currently there is no way to clip an icon to a maximum
size. An
.I IconGrid
definition must follow the
.B IconBox
definition that it applies to:
.EX
Style * IconBox -80x240-1-1, IconGrid 90 90
.EE
.I IconFill
takes 2 arguments.
.EX
.RI "IconFill " "Bottom Right"
.EE
Icons are placed in an icon box by stepping through the icon box
using these arguments to control the direction the box is filled
in. By default the direction is left to right, then top to bottom.
This would be expressed as:
.EX
IconFill left top
.EE
To fill an icon box in columns instead of rows, specify the
vertical direction (top or bottom) first. The directions can be
abbreviated or spelled out as follows: "t", "top", "b", "bot",
"bottom", "l", "lft", "left", "r", "rgt", "right". An
.B IconFill
definition must follow the
.B IconBox
definition that it applies to:
.EX
Style * IconBox -80x240-1-1, IconFill b r
.EE
.I MiniIcon
specifies a pixmap to use as the miniature icon for the
window. This miniature icon can be drawn in a title-bar button
(see
.BR ButtonStyle ),
and can be used by various fvwm modules
.RB ( FvwmWinList ", " FvwmIconMan " and " FvwmTaskBar ).
It takes the name of a pixmap as an argument.
.I WindowShadeShrinks " and " WindowShadeScrolls
control if the contents of a window that is being shaded with the
.B WindowShade
command are scrolled (default) or if they stay in place.
The
.I WindowShadeSteps
option selects the number of steps for animation when shading a
window with
.BR WindowShade .
It takes one number as its argument.  If the number has a trailing
.RI ' p '
it sets the number of pixels to use as the step size instead of
a fixed number of steps.  0 disables the animation.  This happens
too if the argument is omitted or invalid.
.I ResizeOpaque
instructs fvwm to resize the corresponding windows with their
contents visible instead of using an outline.  Since this causes
the application to redraw frequently it can be quite slow and make
the window flicker excessively, depending on the amount of
graphics the application redraws.  The
.I ResizeOutline
style (default) negates the
.I ResizeOpaque
style.  Many applications do not like their windows being resized
opaque, e.g. XEmacs, Netscape or terminals with a pixmap
background. If you do not like the result, don't use the
.I ResizeOpaque
style for these windows.  To exempt certain windows from opaque
resizing you could use these lines in your configuration file:
.EX
Style * ResizeOpaque
Style rxvt ResizeOutline
Style emacs ResizeOutline
.EE
.I Sticky
makes the window sticky, i.e. it is always visible on each page
and each desk.  The opposite style,
.I Slippery
reverts back to the default.
.I StickyIcon
makes the window sticky when its iconified.  It de-iconifies on
top the active desktop.
.I SlipperIcon
reverts back to the default.
.I IgnoreRestack
makes fvwm ignore attempts of clients to raise or lower their own
windows.  By default, the opposite style,
.I AllowRestack
is active.
.I FixedPosition
makes fvwm ignore attempts of the user to move the window.  To
allow user movement of windows, use the
.I VariablePosition
style.
.I ResizeHintOverride
instructs fvwm to ignore the program supplied minimum and maximum
size.  This can be handy for broken applications that refuse to be
resized.  Don't use it if you don't need it.  The default
(opposite) style is
.I NoResizeOverride.
.I MaxWindowSize " [ width [ p ]  height [ p ] ]"
Tells fvwm the maximum width and height of a window.  The values
are the percentage of the total screen area.  If the letter
.RI ' p '
is appended to either of the values, the numbers are interpreted
as pixels. This command is useful to force large application
windows to be fully visible.  Neither
.IR height " or " width
may be less than 100 pixels.  If you omit the parameters or their
values are invalid, both limits are set to 32767 pixels (which is
the default).
With
.I IconifyWindowGroups
all windows in the same window group are iconified at once when
group leader is iconified.  The default is
.IR IconifyWindowGroupsOff ,
which disables this behaviour.  Although a number of applications
use the window group hint, it is rarely used in a proper way, so
it is probably best to use
.I IconifyWindowGroups
only for selected applications.
.\" +++++++++++++++ Window Manager placement
.TP
.B Window Manager placement
Applications can place windows at a particular spot on the screen
either by window manager hints or a geometry specification.  When
they do neither, then the window manager steps in to find a place
for the window.  Fvwm knows six ways to deal with this
situation. The default is
.IR TileCascadePlacement .
.I CascadePlacement
automatically place new windows in a cascading fashion.
.I TileCascadePlacement
automatically places new windows in a smart location - a location
in which they do not overlap any other windows on the screen.  If
no such position can be found
.IR CascadePlacement
is used as a fall-back method.
.I TileManualPlacement
This is the same as
.IR TileCascadePlacement ,
but uses
.IR ManualPlacement
as the fall-back method.
.I MinOverlapPlacement
automatically places new windows in a location in which the
overlapping area in pixels of other windows is minimal.  This
placement policy especially tries to avoid overlapping icons and
windows on higher layers.
.I MinOverlapPercentPlacement
is similar to
.IR MinOverlapPlacement
but tries to minimize the overlapped percentages of other windows
instead of the overlapped area in pixels.  This placement policy
tries to avoid covering other windows completely and tries even
harder not to cover small windows.
.I ManualPlacement
(aka active placement). The user is required to place every new
window manually.  The window only shows as a rubber band until a
place is selected manually. The window is placed when a mouse
button or any key except
.SM Escape
is pressed.  Escape aborts manual placement which places the
window in the top left corner of the screen. If mouse button 2 is
pressed during the initial placement of a window (respectively
.SM Shift
and mouse button 1 in case Mwm emulation has been enabled with the
.B Emulate
command), the user is asked to resize the window too.  Pressing
button 3 sets the
.I PlacedByButton3
condition (see
.B Current
command).
Example:
.EX
Style * ManualPlacement
*FvwmEvent: PassID
*FvwmEvent: add_window GrowDownFunc
AddToFunc StartFunction
AddToFunc GrowDownFunc
  Resize bottomright keep -0p
.EE
Now, whenever a window is created and the user presses button 3 to
finish initial placement, the window is automatically enlarged
until it hits the bottom screen border.
.I Old placement styles
DumbPlacement / SmartPlacement / SmartPlacementOff,
ActivePlacement / RandomPlacement,
ActivePlacementsHonorsStartsOnPage / ActivePlacementsHonorsStartsOnPageOff,
GlobalOpts SmartPlacementIsReallySmart / GlobalOpts SmartPlacementIsNormal
are still supported but will be removed in the future. The old and
new styles can be translated according to the following table:
.EX
GlobalOpts SmartPlacementIsReallySmart
Style * SmartPlacement
  -->
Style * SmartPlacement, CleverPlacement
Global SmartPlacementIsNormal
Style * SmartPlacement
  -->
Style * SmartPlacement, CleverPlacementOff
Style * DumbPlacement, RandomPlacement
  -->
Style * CascadePlacement
Style * DumbPlacement, ActivePlacement
  -->
Style * ManualPlacement
Style * SmartPlacement + RandomPlacement + CleverPlacementOff
  -->
Style * TileCascadePlacement
Style * SmartPlacement + ActivePlacement + CleverPlacementOff
  -->
Style * TileManualPlacement
Style * SmartPlacement + CleverPlacement
  -->
Style * MinOverlapPlacement
Style * SmartPlacement, ActivePlacement, CleverPlacement
  -->
Style * MinOverlapPercentPlacement
Style * ActivePlacementsHonorsStartsOnPage
  -->
Style * ManualPlacementsHonorsStartsOnPage
Style * ActivePlacementsHonorsStartsOnPageOff
  -->
Style * ManualPlacementsHonorsStartsOnPageOff
.EE
.\" +++++++++++++++ placement options and stacking policy
.TP
.B Placement policy options and window stacking
.I NoPPosition
instructs fvwm to ignore the program specified position (PPosition
hint) when adding new windows.  Using PPosition is required for
some applications, but if you don't have one of those its a real
headache.  Many programs set PPosition to something obnoxious like
0,0 (upper left corner).
.I NoUSPosition
works like
.I NoPPosition
but applies suppresses using the user specified position indicated
by the program (USPosition hint).  It is generally a bad thing to
override the user's choice, but some applications misuse the
USPosition hint to force their windows to a certain spot on the
screen without the user's consent.
.IR NoTransientPPosition " and " UseTransientPPosition
work like
.IR NoPPosition " and " UsePPosition
but apply only to transient windows.
.I NoIconPosition
instructs fvwm to ignore the program specified icon position
(IconPosition hint) when iconifying the window.
.I StartsOnDesk
takes a numeric argument which is the desktop number on which the
window should be initially placed.  Note that standard Xt programs
can also specify this via a resource (e.g. "-xrm '*Desk: 1'").
.I StartsOnPage
takes 1, 2, or 3 numeric arguments.  If one or three arguments are
given, the first (or only) argument is the desktop number. If
three arguments are given, the 2nd and 3rd arguments identify the
x,y page position on the virtual window.  If two arguments are
given, they specify the page position, and indicate no desk
preference.  If only one argument is given,
.I StartsOnPage
functions exactly like
.IR StartsOnDesk .
For those standard Xt programs which understand this usage, the
starting desk/page can also be specified via a resource (e.g.,
"-xrm '*page: 1 0 2'").
.I StartsOnPage
in conjunction with
.I SkipMapping
is a useful technique when you want to start an app on some other
page and continue with what you were doing, rather than waiting
for it to appear.
.I StartsOnScreen
takes one argument.  It can be 'p' for the primary screen, 'c' for
the current screen (containing the mouse pointer), 'g' for the
global screen or the screen number itself (counting from zero).
A new window is placed on the specified Xinerama screen.  The
default is to place windows on the screen that contains the mouse
pointer at the time the window is created.
However, those windows which are not placed by FVWM (i.e., those with
a USPosition hint from a user specified geometry) are normally placed
in a position relative to the global screen.  The
.I StartsOnScreen
style is also useful to cause these windows to be placed relative
to a specific Xinerama screen.  For example:
.EX
Style * StartsOnScreen c
.EE
Would cause all windows, including those with their own geometry
to be placed relative to the current Xinerama screen rather than
the global screen.
For those standard Xt programs which understand this usage, the
starting desk/page can also be specified via a resource (e.g.,
"-xrm '*fvwmscreen: c'").  ('fvwmscreen' was chosen
because some applications already use '.screen' for other
purposes.)
.I StartsOnPageIncludesTransients
causes the
.I StartsOnPage
style to be applied even for transient windows.  This is not
usually useful, since transients are usually pop ups that you want
to appear in your visible viewport; but occasionally an
application uses a transient for something like a startup window
that needs to be coerced into place.
.I ManualPlacementIgnoresStartsOnPage
suppresses
.IR StartsOnPage " or " StartsOnDesk
placement in the event that both
.IR ManualPlacement " and " SkipMapping
are in effect when a window is created.  This prevents you from
interactively placing a window and then wondering where it
disappeared to, because it got placed on a different desk or page.
.I ManualPlacementHonorsStartsOnPage
allows this to happen anyway.  The option has no effect if
.I SkipMapping
is not in effect, because fvwm switches to the proper desk/page to
perform interactive placement.  The default is
.IR ManualPlacementIgnoresStartsOnPage "; "
.I ManualPlacementHonorsStartsOnPage
matches the way the old
.I StartsOnDesk
style used to handle the situation.
.I CaptureHonorsStartsOnPage
causes the initial capture (of an already existing window) at
startup to place the window according to the
.IR StartsOnPage " and " StartsOnScreen
desk, page and Xinerama screen specification.
.I CaptureIgnoresStartsOnPage
causes fvwm to ignore these settings (including
.IR StartsOnDesk )
on initial capture.  The default is
.IR CaptureIgnoresStartsOnPage .
.I RecaptureHonorsStartsOnPage
causes a window to be placed according to, or revert to, the
.IR StartsOnPage " and " StartsOnScreen
desk, page and Xinerama screen specification on
.BR Restart " or " Recapture .
.I RecaptureIgnoresStartsOnPage
causes fvwm to respect the current window position on
.BR Restart " or " Recapture .
The default is
.IR RecaptureIgnoresStartsOnPage .
.I Layer
accepts one optional argument: a non-negative integer.  This is
the layer the window is put in.  If no argument is given, any
previously set value is deleted and the default layer is implied.
.I StaysOnTop
puts the window in the top layer.  This layer can be changed by
the built-in command
.BR DefaultLayers ;
the default is 6.
.I StaysPut
puts the window in the put layer.  This layer can be changed by
the built-in command
.BR DefaultLayers ;
the default is 4.
.I StaysOnBottom
puts the window in the bottom layer.  This layer can be changed by
the built-in command
.BR DefaultLayers ;
the default is 2.
.I StartsLowered
instructs fvwm to put the window initially at the bottom of its
layer rather than the default
.IR StartsRaised .
.I SkipMapping
tells fvwm not to switch to the desk the window is on when it gets
mapped initially (useful with
.IR StartsOnDesk " or " StartsOnPage ).
.I KeepWindowGroupsOnDesk
makes new windows that have the window group hint set appear on
the same desk as the other windows of the same group.  Since this
bevhaviour may be confusing, the default setting is
.IR ScatterWindowGroups .
The window group hint is ignored when placing windows in this
case.
.\" +++++++++++++++ transient windows
.TP
.B Transient windows
.I DecorateTransient
causes transient windows, which are normally left undecorated, to
be given the usual fvwm decorations (title bar, buttons,
etc.). Note that some pop-up windows, such as the xterm menus, are
not managed by the window manager and still do not receive
decorations.
.I NakedTransient
(the default) causes transient windows not to be given the
standard decorations. You can only bind keys or mouse buttons to
the sides and the client window of an undecorated window ('S'
and 'W' contexts in bindings, see
.BR Mouse " and " Key
commands).
A window with the
.I RaiseTransient
style that has transient windows raises all its transients when it
is raised.  The
.I DontRaiseTransient
style disables this behavior.  All windows are then treated as if
they had no transients.
A window with the
.I LowerTransient
style that has transient windows lowers all its transients when it
is lowered.  The
.I DontLowerTransient
style disables this behavior.  All windows are then treated as if
they had no transients.
The
.I StackTransientParent
style augments
.IR RaiseTransient " and " LowerTransient
styles.  Raising a window with
.I StackTransientParent
style transfers the raise action to the main window if the window
being raised is a transient and its main window has
.I RaiseTransient
style; this effect makes raise on a transient act just like raise
on its main - the whole group is raised.  Similar behavior holds
for lowering a whole group of transients when the main has
.I LowerTransient
style.
.I DontStackTransientParent
turns this behavior off.
.I (Dont)StackTransientParent
has no effect if
.IR RaiseTransient " and " LowerTransient
are not used.
A reasonable emulation of Motif raise/lower on transients is
possible like this
.EX
Style * RaiseTransient
Style * LowerTransient
Style * StackTransientParent
.EE
.\" +++++++++++++++ miscellaneous
.TP
.B Miscellaneous
The
.IR BackingStore " and " SaveUnder
styles enable the corresponding window attributes in the X server.
.I BackingStore
means that the X server tries to keep the obscured parts of a
window in memory while windows with
.I SaveUnder
store the graphics below them.  Either option can speed up fvwm if
the connection to the X server is slow (e.g. over a modem link).
By default both styles are turned off.  To switch them off
explicitly you can use the
.IR BackingStoreOff " and " SaveUnderOff
styles.
.I ParentalRelativity
enables clients that use a background pixmap of type
.IR ParentRelative
to achieve transparency. Fvwm modules that support transparent
colorsets require this setting.
.I Opacity
is the default and should be used for all non-transparent clients
for better performance.
.I MwmDecor
makes fvwm attempt to recognize and respect the mwm decoration
hints that applications occasionally use.  To switch this style
off, use the
.I NoDecorHint
style.
.I MwmFunctions
makes fvwm attempt to recognize and respect the mwm prohibited
operations hints that applications occasionally use.
.I HintOverride
makes fvwm shade out operations that mwm would prohibit, but it
lets you perform the operation anyway.
.I NoFuncHint
allows turns off the mwm hints completely.
.I OLDecor
makes fvwm attempt to recognize and respect the olwm and olvwm
hints that many older XView and OLIT applications use.  Switch
this option off with
.IR NoOLDecor .
With
.I GNOMEIgnoreHints
fvwm ignores all GNOME hints for the window, even if GNOME
compliance is compiled in.  This is useful for those pesky
applications that try to be more clever than the user and use
GNOME hints to force the window manager to ignore the user's
preferences.  The
.I GNOMEUseHints
style switches back to the default behaviour.
.I UseDecor
accepts one argument: the name of a decor created with
.BR AddToDecor .
If no decor name is specified, the "Default" decor is
used. Windows do not actually contain decors, but are always
assigned to one.  If the decor is later modified with
.BR AddToDecor ,
the changes are visible for all windows which are assigned to it.
The decor for a window can be reassigned with
.BR ChangeDecor .
.I UseStyle
takes one arg, which is the name of another style.  That way you
can have unrelated window names easily inherit similar traits
without retyping.  For example:
.EX
  Style rxvt UseStyle XTerm
.EE
Warning:  If a style is built from one or more parent styles and
the parent styles are changed, the derived style is not
modified. To achieve this you have to issue the
.I UseStyle
line again.
.\" +++++++++++++++ examples
.TP
.B Examples
.EX
# Change default fvwm behavior to no title-
# bars on windows! Also define a default icon.
Style *             NoTitle,               \\
                    Icon unknown1.xpm,     \\
                    BorderWidth 4,         \\
                    HandleWidth 5
# now, window specific changes:
Style Fvwm*       NoHandles, Sticky,       \\
                  WindowListSkip,          \\
                  BorderWidth 0
Style FvwmPager   StaysOnTop, BorderWidth 0
Style *lock       NoHandles, Sticky,       \\
                  StaysOnTop, WindowListSkip
Style xbiff       Sticky, WindowListSkip
Style FvwmButtons NoHandles, Sticky,       \\
                  WindowListSkip
Style sxpm        NoHandles
# Put title-bars back on xterms only!
Style xterm     Title, Color black/grey
Style rxvt        Icon term.xpm
Style xterm       Icon rterm.xpm
Style xcalc       Icon xcalc.xpm
Style xbiff       Icon mail1.xpm
Style xmh         Icon mail1.xpm,         \\
                    StartsOnDesk 2
Style xman        Icon xman.xpm
Style matlab      Icon math4.xpm,         \\
                    StartsOnDesk 3
Style xmag        Icon magnifying_glass2.xpm
Style xgraph      Icon graphs.xpm
Style FvwmButtons Icon toolbox.xpm
Style Maker       StartsOnDesk 1
Style signal      StartsOnDesk 3
# Fire up Netscape on the second desk, in the
# middle of my 3x3 virtual desktop, and don't
# bother me with it...
Style Netscape* SkipMapping,              \\
                StartsOnPage 1 1 1
.EE
Note that all properties for a window are or'ed together.  In the
above example "FvwmPager" gets the property
.I StaysOnTop
via an exact window name match but also gets
.IR NoHandles ", " Sticky " and " WindowListSkip
by a match to "Fvwm*".  It gets
.I NoTitle
by virtue of a match to "*".  If conflicting styles are specified
for a window, then the last style specified are used.
If the
.I NoIcon
attribute is set then the specified window simply disappears when
it is iconified.  The window can be recovered through the
window-list.  If
.I Icon
is set without an argument then the
.I NoIcon
attribute is cleared but no icon is specified.  An example which
allows only the FvwmPager module icon to exist:
.EX
Style * NoIcon
Style FvwmPager Icon
.EE
.TP
.BI "DestroyStyle " style
Deletes the style named
.IR style .
The changes take effect immediately.  Note that
.I style
is not a wild-carded search string, but rather a case-sensitive
string that should exactly match the original
.B Style
command.
Destroying style "*" can be done, but isn't really to be
recommended. For example:
.EX
DestroyStyle Application*
.EE
This removes all settings for the style named "Application*", NOT
all styles starting with "Application".
.SS OTHER COMMANDS CONTROLLING WINDOW STYLES
.IP "\fBAddButtonStyle\fP \fIbutton\fP \
\fB[\fP \fIstate\fP \
\fB] [\fP \fIstyle\fP \
\fB] [-- [!]\fP \fIflag\fP \
\fB...]\fP"
Adds a button style to
.IR button .
.I button
can be a button number, or one of "All", "Left" or "Right".
.I state
can be "ActiveUp," "ActiveDown" or "Inactive" or any of these
three with "Toggled" prepended.  "ActiveUp" selects the style of
the button when the window has the focus and the button is not
pressed. "ActiveDown" is similar but applies when the button is
pressed while the "Inactive" style is used for windows without the
focus.  The "Toggled" prefix refers to maximized, shaded or sticky
windows that have the corresponding
.I MwmDecor...
button style set.  If
.I state
is omitted, then the style is added to every state.  If the
.IR style " and " flags
are enclosed in parentheses, then multiple
.I state
definitions can be placed on a single line.
.I Flags
for additional button styles cannot be changed after definition.
Buttons are drawn in the order of definition, beginning with the
most recent button style, followed by those added with
.BR AddButtonStyle .
To clear the button style stack, change style flags, or for
descriptions of available styles and flags, see the
.B ButtonStyle
command.  Examples:
.EX
ButtonStyle 1 Pixmap led.xpm -- Top Left
ButtonStyle 1 ActiveDown HGradient 8 grey \\
  black
ButtonStyle All --  UseTitleStyle
AddButtonStyle 1 ActiveUp (Pixmap a.xpm)  \\
  ActiveDown (Pixmap b.xpm -- Top)
AddButtonStyle 1 Vector 4 50x30@1 70x70@0 \\
  30x70@0 50x30@1
.EE
Initially for this example all button states are set to a pixmap.
The second line replaces the "ActiveDown" state with a gradient
(it overrides the pixmap assigned to it in the line before, which
assigned the same style to every state).  Then, the
.I UseTitleStyle
flag is set for all buttons, which causes fvwm to draw any styles
set with
.B TitleStyle
before drawing the buttons.  Finally,
.B AddButtonStyle
is used to place additional pixmaps for both "ActiveUp" and
"ActiveDown" states and a vector button style is drawn on top of
all state.
.IP "\fBAddTitleStyle [\fP \fIstate\fP \
\fB] [\fP \fIstyle\fP \
\fB] [-- [!]\fP \fIflag\fP \
\fB...]\fP"
Adds a title style to the title-bar.
.I state
can be one of "ActiveUp," "ActiveDown" or "Inactive" or any of
these with "Toggled" prepended.  If
.I state
is omitted, then the style is added to every state.  If the
.IR style " and " flags
are enclosed in parentheses, then multiple
.I state
definitions can be placed on a single line.  This command is quite
similar to the
.B AddButtonStyle
command (see above).
Title-bars are drawn in the order of definition, beginning with
the most recent
.BR TitleStyle ,
followed by those added with
.BR AddTitleStyle .
To clear the title style stack, change style flags, or for the
descriptions of available styles and flags, see the
.BR TitleStyle " and " ButtonStyle
commands.
.TP
.BI "AddToDecor " decor
Add or divert commands to the decor named
.IR decor .
A decor is a name given to the set of commands which affect button
styles, title-bar styles and border styles.  If
.I decor
does not exist it is created; otherwise the existing
.I decor
is modified.  Note: Earlier versions allowed to use the
.BR HilightColor ", " HilightColorset " and " WindowFont
commands in decors.  This is no longer possible.  Please use the
.I Style
command with the
.IR Hilight... " and " Font
options.
New decors start out exactly like the "default" decor without any
style definitions.  A given decor may be applied to a set of
windows with the
.I UseDecor
option of the
.B Style
command.  Modifying an existing decor affects all windows which
are currently assigned to it.
.B AddToDecor
is similar in usage to the
.BR AddToMenu " and " AddToFunc
commands, except that menus and functions are replaced by
.BR ButtonStyle ", " AddButtonStyle ", " TitleStyle ,
.BR AddTitleStyle " and " BorderStyle
commands.  Decors created with
.B AddToDecor
can be manipulated with
.BR ChangeDecor ", " DestroyDecor ", " UpdateDecor
and the
.IB "UseDecor " Style
option.
The following example creates a decor "FlatDecor" and style
"FlatStyle".  They are distinct entities:
.EX
AddToDecor FlatDecor
 + ButtonStyle All ActiveUp (-- flat) \\
   Inactive (-- flat)
 + TitleStyle -- flat
 + BorderStyle -- HiddenHandles NoInset
Style FlatStyle UseDecor FlatDecor, \\
     Color white/grey40,HandleWidth 4
Style xterm UseStyle FlatStyle
.EE
An existing window's decor may be reassigned with
.BR ChangeDecor .
A decor can be destroyed with
.BR DestroyDecor .
.EX
DestroyDecor FlatDecor
AddToDecor FlatDecor ...
Style FlatStyle UseDecor FlatDecor, \\
     Color white/grey40,HandleWidth 4
.EE
and now apply the style again:
.EX
Style xterm UseStyle FlatStyle
.EE
.IP "\fBBorderStyle [\fP \fIstate\fP \
\fB] [\fP \fIstyle\fP \
\fB] [-- [!]\fP \fIflag\fP \
\fB...]\fP"
Defines a border style for windows.
.I state
can be either "Active" or "Inactive".  If
.I state
is omitted, then the style is set for both states.  If the
.IR style " and " flags
are enclosed in parentheses, then multiple
.I state
definitions can be specified per line.
.I style
is a subset of the available button styles, and can only be
.I TiledPixmap
(uniform pixmaps which match the bevel colors work best this
way). If a
.RI ' ! '
is prefixed to any
.IR flag ,
the behavior is negated.  If
.I style
is not specified, then one can change flags without resetting the
style.
The
.I HiddenHandles
flag hides the corner handle dividing lines on windows with
handles (this option has no effect for NoHandle windows).  By
default,
.I HiddenHandles
is disabled.
The
.I NoInset
flag supplements
.IR HiddenHandles .
If given, the inner bevel around the window frame is not drawn.
If
.I HiddenHandles
is not specified, the frame looks a little strange.
.I Raised
causes a raised relief pattern to be drawn (default).
.I Sunk
causes a sunken relief pattern to be drawn.
.I Flat
inhibits the relief pattern from being drawn.
To decorate the active and inactive window borders with a textured
pixmap, one might specify:
.EX
BorderStyle Active TiledPixmap marble.xpm
BorderStyle Inactive TiledPixmap granite.xpm
BorderStyle Active -- HiddenHandles NoInset
.EE
To clear the style for both states:
.EX
BorderStyle Simple
.EE
To clear for a single state:
.EX
BorderStyle Active Simple
.EE
To unset a flag for a given state:
.EX
BorderStyle Inactive -- !NoInset
.EE
title-bar buttons can inherit the border style with the
.I UseBorderStyle
flag (see
.BR ButtonStyle ).
.TP
.BI "ButtonState [" "ActiveDown bool" "] [" "inactive bool" "]"
The
.B ButtonState
command controls which states of the window titles and title
buttons are used.  The default is to use all three states:
"ActiveUp", "ActiveDown" and "Inactive" (see
.BR ButtonStyle " and " TitleStyle
commands).  The
.I bool
argument after the key word controls if the designated state is
used ("True") or not ("False").  The "ActiveUp" state cannot be
deactivated. If no arguments are provided or the given arguments
are illegal, the default is restored.
The "ActiveDown" state allows different button styles for pressed
down buttons and titles on active windows.  Otherwise the
"ActiveUp" state is used instead.  The "Inactive" state allows
different button and title styles for inactive windows.  Otherwise
the "ActiveUp" state is used instead.
.IP "\fBButtonStyle\fP \fIbutton\fP \
\fB[\fP \fIstate\fP \
\fB] [\fP \fIstyle\fP \
\fB] [-- [!]\fP \fIflag\fP \
\fB...]\fP"
Sets the button style for a title-bar button.
.I button
is the title-bar button number between 0 and 9, or one of "All",
"Left", "Right", or "Reset".  Button numbering is described in the
.B Mouse
command section.  If the
.IR style " and " flags
are enclosed in parentheses, then multiple
.I state
definitions can be specified per line.
.I state
refers to which button state should be set.  Button states are
defined as follows: "ActiveUp" and "ActiveDown" refer to the
un-pressed and pressed states for buttons on active windows; while
the "Inactive" state denotes buttons on inactive windows.  The
"ToggledActiveUp", "ToggledActiveDown" and "ToggledInactive"
states are used instead for buttons which have one of the
.IR MwmDecorMax ", " MwmDecorShade " or " MwmDecorStick
hints, if the window is maximized, shaded or sticky, respectively.
.EX
AddToDecor Default
 + ButtonStyle 6                   \\
   Vector 4 50x25@1 85x75@0 15x75@0 50x25@1
 + ButtonStyle 6 ToggledActiveUp   \\
   Vector 4 50x75@0 85x25@1 15x25@0 50x75@0
 + ButtonStyle 6 ToggledActiveDown \\
   Vector 4 50x75@0 85x25@1 15x25@0 50x75@0
 + ButtonStyle 6 ToggledInactive   \\
   Vector 4 50x75@0 85x25@1 15x25@0 50x75@0
 + ButtonStyle 6 - MwmDecorShade
Mouse 0 6 N WindowShade
.EE
If
.I state
is "ActiveUp", "ActiveDown", "Inactive", or a "Toggled" variant,
that particular button state is set.  If
.I state
is omitted, every state is set.  Specifying a style destroys the
current style (use
.B AddButtonStyle
to avoid this).
If
.I style
is omitted, then state-dependent flags can be set for the primary
button style without destroying the current style.  Examples (each
line should be considered independent):
.EX
ButtonStyle Left -- flat
ButtonStyle All ActiveUp (-- flat) \\
  Inactive (-- flat)
.EE
The first line sets every state of the left buttons to flat, while
the second sets only the "ActiveUp" and "Inactive" states of every
button to flat (only flags are changed; the buttons' individual
styles are not changed).
If you want to reset all buttons to their defaults:
.EX
ButtonStyle Reset
.EE
To reset the "ActiveUp" button state of button 1 to the default:
.EX
ButtonStyle 1 ActiveUp Default
.EE
To reset all button states of button 1 to the default of
button number 2:
.EX
ButtonStyle 1 Default 2
.EE
For any button, multiple
.I state
definitions can be given on one line by enclosing the
.IR style " and " flags
in parentheses.  If only one definition per line is given the
parentheses can be omitted.
.I flags
affect the specified
.IR state .
If a
.RI ' ! '
is prefixed to any
.IR flag ,
its behavior is negated.  The available state-dependent flags for
all styles are described here (the
.B ButtonStyle
entry deals with state-independent flags).
.I Raised
causes a raised relief pattern to be drawn.
.I Sunk
causes a sunken relief pattern to be drawn.
.I Flat
inhibits the relief pattern from being drawn.
.I UseTitleStyle
causes the given button state to render the current title style
before rendering the button's own styles.  The
.IR Raised ", " Flat " and " Sunk
.B TitleStyle
flags are ignored since they are redundant in this context.
.I UseBorderStyle
causes the button to inherit the decorated
.B BorderStyle
options.
.IR Raised ", " Sunk " and " Flat
are mutually exclusive, and can be specified for the initial
.B ButtonStyle
only.
.IR UseTitleStyle " and " UseBorderStyle
are also mutually exclusive (both can be off however).  The default is
.I Raised
with both
.I UseBorderStyle " and " UseTitleStyle
left unset.
.I Important note
for the "ActiveDown" state:  When a button is pressed, the relief
is inverted.  Because of this, to obtain a sunken "ActiveDown"
state you must specify the opposite of the desired relief (i.e. to
obtain a pressed-in look which is raised, specify
.I Sunk
for "ActiveDown").  This behavior is consistent, but may seem
confusing at first.  The same applies to the "Toggled" state.
Button styles are classified as non-destructive, partially
destructive, or fully destructive.  Non-destructive styles do not
affect the image. Partially destructive styles can obscure some or
all parts of the underlying image (i.e.
.IR Pixmap ).
Fully destructive styles obscure the entire underlying image (i.e.
.I Solid
or one of the
.I gradient
styles).  Thus, if stacking styles with
.BR AddButtonStyle " (or " AddTitleStyle
for title-bars), use care in sequencing styles to minimize redraw.
The available styles and their arguments now follow.
The
.I Simple
style does nothing.  There are no arguments, and this style is an
example of a non-destructive button style.
The
.I Default
style conditionally accepts one argument: a number which specifies
the default button number to load.  If the style command given is
.BR ButtonStyle " or " AddButtonStyle ,
the argument is optional (if given, overrides the current button).
If a command other than
.BR ButtonStyle " or " AddButtonStyle
is used, the number must be specified.
The
.I Solid
style fills the button with a solid color.  The relief border
color is not affected.  The color should be specified as a single
argument.  This style is fully destructive.
The
.I "Vector num"
.IR X x Y @ C " ..."
style draws a line pattern.  Since this is a standard button style,
the keyword
.I Vector
is optional,
.I num
is a number of point specifications of the form
.IR X x Y @ C .
.IR X " and " Y
are point coordinates inside the button, given in percents
(from 0 to 100).
.I C
specifies a line color (0 - the shadow color, 1 - the highlight color,
2 - the background color, 3 - the foreground color).
The first point color is not used.
You can use up to 32 points in a line pattern.
This style is partially destructive.
The specification is a little cumbersome:
.EX
ButtonStyle 2 Vector 4 50x30@1 70x70@0 \\
  30x70@0 50x30@1
.EE
then the button 2 decoration uses a 4-point pattern consisting of
a line from (x=50,y=30) to (70,70) in the shadow color (@0), and
then to (30,70) in the shadow color, and finally to (50,30) in the
highlight color (@1).  Is that too confusing?  See the fvwm web
pages for some examples with screenshots.
A more complex example of
.IR Vector :
.EX
ButtonStyle 8 Vector 10 45x65@2 45x75@3 20x75@3 20x50@3 \\
  35x50@3 35x65@1 35x25@1 75x25@1 75x65@0 35x65@0
ButtonStyle 0 Vector 10 45x65@2 45x75@0 20x75@0 20x50@1 \\
  45x50@1 45x65@0 75x65@3 75x25@3 35x25@3 35x47@3
.EE
The
.I ?Gradient
styles denote color gradients.  Fill in the question mark with any
one of the defined gradient types.  Please refer to the
.B COLOR GRADIENTS
section for a description of the gradient syntax.  The gradient
styles are fully destructive.
The
.I Pixmap
style displays a pixmap.  A pixmap should be specified as an
argument.  For example, the following would give button 2 the same
pixmap for both states, and button 4 different pixmaps for the up,
down and inactive states.
.EX
ButtonStyle 2 Pixmap my_pixmap.xpm
ButtonStyle 4 ActiveUp (Pixmap up.xpm) \\
  ActiveDown (Pixmap down.xpm)
ButtonStyle 4 Inactive Pixmap inactive.xpm
.EE
The pixmap specification can be given as an absolute or relative
pathname (see
.BR ImagePath ).
If the pixmap cannot be found, the button style reverts to
.IR Simple .
Flags specific to the
.I Pixmap
style are
.IR Left ", " Right ", "
.IR Top ", and " Bottom .
These can be used to justify the pixmap (default is centered for
both directions).  Pixmap transparency is used for the color
"None."  This style is partially destructive.
The
.I MiniIcon
style draws the window's miniature icon in the button, which is
specified with the
.I MiniIcon
option of the
.B Style
command.  This button style accepts no arguments.  Example:
.EX
Style *     MiniIcon mini-bx2.xpm
Style xterm MiniIcon mini-term.xpm
Style Emacs MiniIcon mini-doc.xpm
ButtonStyle 1 MiniIcon
.EE
The
.I TiledPixmap
style accepts a pixmap to be tiled as the button background. One
pixmap is specified as an argument.  Pixmap transparency is not
used.  This style is fully destructive.
.TP
.BI "ButtonStyle " button " - [!]" flag " ..."
Sets state-independent flags for the specified
.IR button .
State-independent flags affect button behavior.  Each
.I flag
is separated by a space.  If a
.RI ' ! '
is prefixed to the flag then the behavior is negated.  The special
flag
.I Clear
clears any existing flags.
The following flags are usually used to tell fvwm which buttons
should be affected by mwm function hints (see
.I MwmFunctions
option of the
.B Style
command.  This is not done automatically since you might have
buttons bound to complex functions, for instance.
.I MwmDecorMenu
should be assigned to title-bar buttons which display a menu.  The
default assignment is the leftmost button.  When a window with the
.I MwmFunctions
.B Style
option requests not to show this button, it is hidden.
.I MwmDecorMin
should be assigned to title-bar buttons which minimize or iconify
the window.  The default assignment is the second button over from
the rightmost button.  When a window with the
.I MwmFunctions
.B Style
option requests not to show this button, it is hidden.
.I MwmDecorMax
should be assigned to title-bar buttons which maximize the
window. The default assignment is the rightmost button.  When a
window with the
.I MwmFunctions
.B Style
option requests not to show this button, it is hidden.  When the
window is maximized, the vector pattern on the button looks
pressed in.
.I MwmDecorShade
should be assigned to title-bar buttons which shade the window
(see
.B WindowShade
command).  When the window is shaded, the vector pattern on the
button looks pressed in.
.I MwmDecorStick
should be assigned to title-bar buttons which make the window
sticky. When the window is sticky, the vector pattern on the
button looks pressed in.
.TP
.BI "ChangeDecor " decor
Changes the decor of a window to
.IR decor .
.I decor
is "Default" or the name of a decor defined with
.BR AddToDecor .
If
.I decor
is invalid, nothing occurs.  If called from somewhere in a window
or its border, then that window is affected.  If called from the
root window the user is allowed to select the target window.
.B ChangeDecor
only affects attributes which can be set using the
.B AddToDecor
command.
.EX
ChangeDecor CustomDecor1
.EE
.TP
.BI "DestroyDecor [" recreate "] " decor
Deletes the
.I decor
defined with
.BR AddToDecor ,
so that subsequent references to it are no longer valid.  Windows
using this
.I decor
revert to the "Default" decor. The optional parameter
.I recreate
tells fvwm not to throw away the decor completely but to throw
away only its contents. If the decor is created again later,
windows do not use it before the
.I UseDecor
style is applied again unless the decor was destroyed with the
.I recreate
option.  The decor named "Default" cannot be destroyed.
.EX
DestroyDecor CustomDecor1
.EE
.TP
.BI "TitleStyle [" justification "] [" height " [" num "]]"
Sets attributes for the title-bar.  Justifications can be
.IR Centered ", " RightJustified " or " LeftJustified .
.I height
sets the title bar's height to an amount in pixels.  Defaults are
.I Centered
and the window's font height.  To reset the font height to the
default value, omit the
.I num
argument after the
.I height
keyword.  Example:
.EX
TitleStyle LeftJustified Height 24
.EE
.IP "\fBTitleStyle [\fP \fIstate\fP \
\fB] [\fP \fIstyle\fP \
\fB] [-- [!]\fP \fIflag\fP \
\fB...]\fP"
Sets the style for the title-bar.
.I state
can be one of  "ActiveUp", "ActiveDown", or "Inactive".  If
.I state
is omitted, then the
.I style
is added to every state.  If parentheses are placed around the
.IR style " and " flags ,
then multiple state definitions can be given per line.
.I style
can be omitted so that flags can be set while not destroying the
current style.
If a
.RI ' ! '
is prefixed to any
.IR flag ,
its behavior is negated.  Valid flags for each state include
.IR Raised ", " Flat " and " Sunk
(these are mutually exclusive).  The default is
.IR Raised .
See the note in
.B ButtonStyle
regarding the "ActiveDown" state.  Examples:
.EX
TitleStyle ActiveUp HGradient 16 navy black
TitleStyle ActiveDown (Solid red -- flat) \\
  Inactive (TiledPixmap wood.xpm)
TitleStyle ActiveUp (-- Flat) ActiveDown  \\
  (-- Raised) Inactive (-- Flat)
.EE
This sets the "ActiveUp" state to a horizontal gradient, the
"ActiveDown" state to solid red, and the "Inactive" state to a
tiled wood pixmap. Finally, "ActiveUp" is set to look flat, while
"ActiveDown" set to be sunk (the
.I Raised
flag for the "ActiveDown" state causes it to appear sunk due to
relief inversion), and "Inactive" is set to flat as well. An
example which sets flags for all states:
.EX
TitleStyle -- flat
.EE
For a flattened look:
.EX
TitleStyle -- flat
ButtonStyle All ActiveUp (-- flat) Inactive \\
  (-- flat)
.EE
.TP
.BI "UpdateDecor [" decor "]"
This command is kept mainly for backwards compatibility.  Since
all elements of a decor are updated immediately when they are
changed, this command is mostly useless.
Updates window decorations.
.I decor
is an optional argument which specifies the
.I decor
to update.  If given, only windows which are assigned to that
particular
.I decor
are updated.  This command is useful, for instance, after a
.BR ButtonStyle ", " TitleStyle " or " BorderStyle
(possibly used in conjunction with
.BR AddToDecor ).
Specifying an invalid decor results in all windows being
updated. This command is less disturbing than
.BR Recapture ,
but does not affect window style options as
.B Recapture
does.
.SS COMMANDS CONTROLLING THE VIRTUAL DESKTOP
.IP "\fBDesk\fP \fIarg1\fP \
\fB[\fP \fIarg2\fP \
\fB] [\fP \fImin max\fP \
\fB]\fP"
This command has been renamed.  Please see
.B GotoDesk
command.
.TP
.BI "DeskTopSize " Horizontal x Vertical
Defines the virtual desktop size in units of the physical screen
size.
.TP
.BI "EdgeResistance " "scrolling moving " [ "xinerama-moving" ]
Tells how hard it should be to change the desktop viewport by
moving the mouse over the edge of the screen and how hard it
should be to move a window over the edge of the screen.
The first parameter tells how many milliseconds the pointer must
spend on the screen edge before fvwm moves the viewport.  This is
intended for people who use
.EX
EdgeScroll 100 100
.EE
but find themselves accidentally flipping pages when they don't
want to.
The second parameter tells how many pixels over the edge of the
screen a window's edge must move before it actually moves
partially off the screen.  By default the viewport is moved a full
page in the requested direction, but if you used
.B EdgeScroll
and set any values other than zero they is used instead.
Note that, with
.EX
EdgeScroll 0 0
.EE
it is still possible to move or resize windows across the edge of
the current screen.  By making the first parameter to
.B EdgeResistance
10000 this type of motion is impossible.  With
.B EdgeResistance
less than 10000 but greater than 0 moving over pages becomes
difficult but not impossible.  See also
.BR EdgeThickness .
The optional third parameter does the same as the second, but for
individual Xinerama screens.  If omitted,
.I xinerama-moving
will be set to the value of
.IR moving .
Set
.I xinerama-moving
to zero to ignore individual screen edges.
.TP
.BI "EdgeScroll " horizontal "[" p "] " vertical "[" p "]"
Specifies the percentage of a page to scroll when the cursor hits
the edge of a page.  A trailing
.RI ' p '
changes the interpretation to mean pixels.  If you don't want any
paging or scrolling when you hit the edge of a page include
.EX
EdgeScroll 0 0
.EE
in your
.I .fvwm2rc
file, or possibly better, set the
.B EdgeThickness
to zero.  See the
.B EdgeThickness
command. If you want whole pages, use
.EX
EdgeScroll 100 100
.EE
Both
.IR horizontal " and " vertical
should be positive numbers.
If the
.IR horizontal " and " vertical
percentages are multiplied by 1000 then scrolling wraps around at
the edge of the desktop.  If
.EX
EdgeScroll 100000 100000
.EE
is used fvwm scrolls by whole pages, wrapping around at the edge
of the desktop.
.TP
.BI "EdgeThickness " 0 | 1 | 2
This is the width or height of the invisible window that fvwm
creates on the edges of the screen that are used for the edge
scrolling feature.
In order to enable page scrolling via the mouse, four windows
called the "pan frames" are placed at the very edge of the
screen. This is how fvwm detects the mouse's presence at the
window edge. Because of the way this works, they need to be at the
top of the stack and eat mouse events, so if you have any kind of
error along the lines of: "mouse clicks at the edge of the screen
do the wrong thing" you're having trouble with the pan frames and
(assuming you don't use the mouse to flip between pages) should
set the EdgeThickness to 0.
A value of
.I 0
completely disables mouse edge scrolling, even while dragging a
window.
.I 1
gives the smallest pan frames, which seem to work best except on
some servers.
.I 2
is the default.
Pan frames of
.IR 1 " or " 2
pixels can sometimes be confusing, for example, if you drag a
window over the edge of the screen, so that it straddles a pan
frame, clicks on the window, near the edge of the screen are
treated as clicks on the root window.
.IP "\fBGotoDesk\fP \fIprev\fP \
\fB|\fP \fIarg1\fP \
\fB[\fP \fIarg2\fP \
\fB] [\fP \fImin max\fP \
\fB]\fP"
Switches the current viewport to another desktop (workspace,
room).
The command takes 1, 2, 3, or 4 arguments.  A single argument is
interpreted as a relative desk number.  Two arguments are
understood as a relative and an absolute desk number.  Three
arguments specify a relative desk and the minimum and maximum of
the allowable range. Four arguments specify the relative,
absolute, minimum and maximum values.  (Desktop numbers can be
negative).  If a literal
.I prev
is given as the single argument, the last visited desk number is
used.
If
.I arg1
is non zero then the next desktop number is the current desktop
number plus
.IR arg1 .
If
.I arg1
is zero then the new desktop number is
.IR arg2 .
(If
.I arg2
is not present, then the command has no effect.)
If
.IR min " and " max
are given, the new desktop number is no smaller than
.I min
and no bigger than
.IR max .
Values out of this range are truncated (if you gave an absolute
desk number) or wrapped around (if you gave a relative desk
number).
The syntax is the same as for
.BR MoveToDesk ,
which moves a window to a different desktop.
The number of active desktops is determined dynamically.  Only
desktops which contain windows or are currently being displayed
are active.  Desktop numbers must be between 2147483647 and
-2147483648 (is that enough?).
.TP
.BI "GotoDeskAndPage " prev " | " "desk xpage ypage"
Switches the current viewport to another desktop and page, similar
to the
.BR GotoDesk " and " GotoPage
commands.  The new desk is
.I desk
and the new page is
.RI ( xpage , ypage ).
.IP "\fBGotoPage\fP \fIprev\fP \
\fB|\fP \fIx\fP \
\fB[\fP \fIp\fP \
\fB]\fP \fIy\fP \
\fB[\fP \fIp\fP \
\fB]\fP"
Moves the desktop viewport to page (x,y).  The upper left page is
(0,0), the upper right is (M,0), where M is one less than the
current number of horizontal pages specified in the
.B DeskTopSize
command.  The lower left page is (0,N), and the lower right page
is (M,N), where N is the desktop's vertical size as specified in
the
.B DeskTopSize
command.  To switch to a page relative to the current one add a
trailing
.RI ' p '
after any or both numerical arguments.  To go to last visited page
use
.I prev
as the first argument.  The
.B GotoPage
function should not be used in a pop-up menu.
Examples:
.EX
# Go to page (2,3)
GotoPage 2 3
# Go to lowest and rightmost page
GotoPage -1 -1
# Go to last page visited
GotoPage prev
# Go two pages to the right and one page up
GotoPage +2p -1p
.EE
.IP "\fBScroll\fP \fIhorizonal\fP \
\fB[\fP \fIp\fP \
\fB]\fP \fIvertical\fP \
\fB[\fP \fIp\fP \
\fB]\fP"
Scrolls the virtual desktop's viewport by
.I horizontal
pages in the x-direction and
.I vertical
pages in the y-direction.  Either or both entries may be negative.
Both
.IR horizontal " and " vertical
values are expressed in percent of pages, so
.EX
Scroll 100 100
.EE
means to scroll down and left by one full page.
.EX
Scroll 50 25
.EE
means to scroll left half a page and down a quarter of a page.
The
.B Scroll
function should not be called from pop-up menus.  Normally,
scrolling stops at the edge of the desktop.
If the
.IR horizontal " and " vertical
percentages are multiplied by 1000 then scrolling wraps around at
the edge of the desktop.  If
.EX
Scroll 100000 0
.EE
is executed over and over fvwm moves to the next desktop page on
each execution and wraps around at the edge of the desktop, so
that every page is hit in turn.
If the letter
.RI ' p '
is appended to each coordinate
.RI ( horizontal " and/or " vertical ),
then the scroll amount is measured in pixels.
.TP
.BI "Xinerama " bool
Enables Xinerama support if the boolean argument is true and
disables it if the argument is false.  Calling this command
without arguments turns on Xinerama support it was disabled before
and turns it off if it was enabled.  For example:
.EX
# Turn Xinerama support on, use primary screen 2
XineramaPrimaryScreen 2
Xinerama on
#Turn it off again
Xinerama off
.EE
.TP
.BI "XineramaPrimaryScreen [" primary-screen "]"
Takes an integer number or 'g' or 'c' as its argument.  A number
is taken as the number of the Xinerama screen that is to be used
as the primary screen.  The primary screen can be used as the
preferred screen to place windows with
.EX
XineramaPrimaryScreen <screen number>
Style * StartsOnScreen p
.EE
The primary screen is used in some of the modules and for the
default icon box too.  Any number that is zero or more is taken as
the primary screen's number.  Instead, the letter 'c' indicates to
use the curent screen (containing the pointer) whenever the
primary screen is used.  This may be very confusing under some
circumstances.  With
'g', the global screen is used as the primary screen, effectively
disabling the primary screen.  Calling this function with any
other argument (including none) resets the primary screen to 0.
.TP
.BI "XineramaSls [" bool "]"
For multi-screen implementations other than Xinerama, such as
Single Logical Screen, it is possible to simulate a Xinerama
configuration if the total screen seen by FVWM is made up of
equal sized monitors in a rectangular grid.  The
.B XineramaSls
command turns SLS support on or off or toggles it to the opposite
state, depending on if the boolean argument is "True", "False" or
"toggle".  If no argument is given, this is treated like "toggle".
The default layout uses 1 by one screens.  To configure the
layout, use the
.B XineramaSlsSize
command.
.TP
.BI "XineramaSlsSize " Horizontal x Vertical
This command configures the layout of the Single Logical screen
feature.  It takes two arguments,
.IR Horizontal " and " Vertical
which must be an integer value dividing evenly into the total
desktop width, and height height.  For an example with two
monitors side by side which appear as one screen through the
X-Server with the right screen as the primary screen, use:
.EX
XineramaSlsSize 2x1
XineramaSlsOn
XineramaPrimaryScreen 1
XineramaOn
.EE
.SS COMMANDS FOR USER FUNCTIONS AND SHELL COMMANDS
.IP "\fBAddToFunc [\fP \fIname\fP \
\fB[\fP \fII\fP \
\fB|\fP \fIM\fP \
\fB|\fP \fIC\fP \
\fB|\fP \fIH\fP \
\fB|\fP \fID action\fP \
\fB]]\fP"
Begins or adds to a function definition.  Here is an example:
.EX
AddToFunc Move-or-Raise I Raise
 + M Move
 + D Lower
.EE
The function name is "Move-or-Raise", and could be invoked from a menu
or a mouse binding or key binding:
.EX
Mouse 1 TS A Move-or-Raise
.EE
The
.I name
must not contain embedded whitespace.  No guarantees are made
whether function names with embedded whitespace work or not.  This
behaviour may also change in the future without further notice.
The letter before the
.I action
tells what kind of action triggers the command which follows it.
.RI ' I '
stands for "Immediate", and is executed as soon as the function is
invoked.
.RI ' M '
stands for "Motion", i.e. if the user starts moving the mouse.
.RI ' C '
stands for "Click", i.e., if the user presses and releases the
mouse.
.RI ' H '
stands for "Hold", i.e. if the user presses a mouse button and
holds it down for more than
.B ClickTime
milliseconds.
.RI ' D '
stands for "Double-click". The action
.RI ' I '
causes an action to be performed on the button-press, if the
function is invoked with prior knowledge of which window to act
on.
There is a number of predefined symbols that are replaced by
certain values if they appear on the command line.  Please refer
to the
.B COMMAND EXPANSION
section for details.
Examples:
If you call
.EX
Key F10 R A Function MailFunction \\
  xmh "-font fixed"
.EE
and "MailFunction" is
.EX
AddToFunc MailFunction
 + I Next ($0) Iconify off
 + I Next (AcceptsFocus, $0) focus
 + I None ($0) Exec exec $0 $1
.EE
Then the last line of the function becomes
.EX
 + I None (xmh) Exec exec xmh -font fixed
.EE
The expansion is performed as the function is executed, so you can
use the same function with all sorts of different arguments.  You
could use
.EX
Key F11 R A Function MailFunction \\
  zmail "-bg pink"
.EE
in the same
.IR .fvwm2rc ,
if you wanted.  An example of using "$w" is:
.EX
AddToFunc PrintFunction
 + I Raise
 + I Exec xdpr -id $w
.EE
Note that "$$" is expanded to '$'.
Another example: bind right mouse button within the window button
number 6 (this is a minimize button for the win95 theme) to
iconify all windows of the same resource:
.EX
AddToFunc FuncIconifySameResource "I" \\
  All ($r) Iconify on
Mouse 3 6 A FuncIconifySameResource
.EE
.TP
.BI "Beep"
As might be expected, this makes the terminal beep.
.TP
.BI "DestroyFunc " function
Deletes a function, so that subsequent references to it are no
longer valid.  You can use this to change the contents of a
function during a fvwm session.  The function can be rebuilt using
.BR AddToFunc .
.EX
DestroyFunc PrintFunction
.EE
.TP
.BI "Echo " string
Prints a message to
.IR stderr .
Potentially useful for debugging things in your
.IR .fvwm2rc .
.EX
Echo Beginning style definitions...
.EE
.TP
.BI "Exec " command
Executes
.IR command .
You should not use an ampersand '&' at the end of the command. You
probably want to use an additional "exec" at the beginning of
.IR command .
Without that, the shell that fvwm invokes to run your command
stays until the command exits.  In effect, you'll have twice as
many processes running as you need.  Note that some shells are
smart enough to avoid this, but it never hurts to include the
"exec" anyway.
The following example binds function key
.SM F1
in the root window, with no modifiers, to the exec function. The
program rxvt is started with an assortment of options.
.EX
Key F1 R N Exec exec rxvt -fg yellow -bg blue \\
  -e /bin/tcsh
.EE
Note that this function doesn't wait for
.I command
to complete, so things like:
.EX
Exec "echo AddToMenu ... > /tmp/file"
Read /tmp/file
.EE
do not work reliably.
.TP
.BI "ExecUseShell [" shell "]"
Makes the
.B Exec
command use the specified shell, or the value of the
.I $SHELL
environment variable if no shell is specified, instead of the
default Bourne shell
.RI ( /bin/sh ).
.EX
ExecUseShell
ExecUseShell /usr/local/bin/tcsh
.EE
.TP
.BI "Function " FunctionName
Used to bind a previously defined function to a key or mouse
button. The following example binds mouse button 1 to a function
called "Move-or-Raise", whose definition was provided as an
example earlier in this man page.  After performing this binding
fvwm executes the "move-or-raise" function whenever button 1 is
pressed in a window's title-bar.
.EX
Mouse 1 T A Function Move-or-Raise
.EE
The keyword
.B Function
may be omitted if
.I FunctionName
does not coincide with a fvwm built-in function name
.TP
.BI "Nop"
Does nothing.  This is used to insert a blank line or separator in a
menu.  If the menu item specification is
.EX
Nop " "
.EE
then a blank line is inserted.  If it looks like
.EX
Nop ""
.EE
then a separator line is inserted.  Can also be used as the
double-click action for
.BR Menu " or " Popup .
.TP
.BI "PipeRead " command " [" quiet "]"
Causes fvwm to read commands from the output of the
.IR command .
This
.I command
is executed by
.I /bin/sh
as if you typed it on the command line.  If the command consists
of more than one word it must be quoted.  Useful for building up
dynamic menu entries based on a directories contents, for
example. If the keyword
.I Quiet
follows the command no message is produced if the
.I command
is not found.
Example:
.EX
AddToMenu HomeDirMenu
PipeRead 'for i in $HOME/*; \\
  do echo "+ $i Exec xterm -e vi $i"; done'
.EE
.TP
.BI "Read " filename " [" quiet "]"
Causes fvwm to read commands from the file named
.IR filename .
If the keyword
.I Quiet
follows the command no message is produced if the file is not
found.  If the file name does not begin with a slash ('/'), fvwm
looks in the user's data directory, then the system data
directory.  The user's data directory is by default
.IR $HOME/.fvwm .
It can be overridden by exporting
.I FVWM_USERDIR
set to any other directory.
.TP
.BI "SetEnv " "variable [value]"
Set an environment variable to a new value, similar to the shell's
export or setenv command.  The
.I variable
and its
.I value
are inherited by processes started directly by fvwm.  This can be
especially useful in conjunction with the
.B FvwmM4
module.  For example:
.EX
SetEnv height HEIGHT
.EE
makes the FvwmM4-set variable
.I HEIGHT
usable by processes started by fvwm as the environment variable
.IR $height .
If
.I value
includes whitespace, you should enclose it in quotes.  If no
.I value
is given, the
.I variable
is deleted from the environment as if
.B UnsetEnv
had been called.
.TP
.BI "Silent " command
A number of built in functions require a window to operate on.  If
no window was selected when such a function is invoked the user is
asked to select a window.  Sometimes this behavior is unwanted,
for example if the function was called by a module and the window
that was selected at first does not exist anymore.  You can
prevent this by putting
.B Silent
in front of the fvwm
.IR command .
If a function that needs a window is called with
.B Silent
without a window selected, it simply returns without doing
anything. If
.B Silent
is used on a user defined function it affects all function and sub
function calls until the original function exits.
Another usage of
.B Silent
is with binding commands
.BR Key ", " PointerKey " and " Mouse ,
this disables error messages.
Examples:
.EX
Silent Move 0 0
Silent User_defined_function
# don't complain on keabords without "Help" key
Silent Key Help R A Popup HelpMenu
.EE
.TP
.BI "UnsetEnv " "variable"
Unset an environment variable, similar to shell's export or
unsetenv command. The
.I variable
then is removed from the environment array inherited by processes
started directly by fvwm.
.TP
.BI "Wait " windowname
This built-in is intended to be used in fvwm functions only.  It
causes execution of a function to pause until a new window with
the title
.I windowname
appears.  Fvwm remains partially functional during a wait.  This
is particularly useful in the "InitFunction" if you are trying to
start windows on specific desktops:
.EX
AddToFunc InitFunction
 + I exec xterm -geometry 80x64+0+0
 + I Wait xterm
 + I Desk 0 2
 + I Exec exec xmh -font fixed -geometry \\
       507x750+0+0
 + I Wait xmh
 + I Desk 0 0
.EE
The above function starts an xterm on the current desk, waits for
it to map itself, then switches to desk 2 and starts an xmh.
After the xmh window appears control moves to desk 0.
You can escape from a
.B Wait
pause by pressing
.SM Ctrl-Alt-Escape
(where
.SM Alt
is the first modifier).  To redefine this key sequence see the
.B EscapeFunc
command.
.SS CONDITIONAL COMMANDS
.TP
.BI "All [(" conditions ")] " command
Execute.
.I command
on all windows meeting the conditions.
.I Conditions
are used exactly as with the
.B Current
command.
.TP
.BI "Current [(" condition ... ")] " command
Performs
.I command
on the currently focused window if it satisfies all
.IR conditions .
The