FvwmButtons(1) Fvwm Modules FvwmButtons(1)

NAME


FvwmButtons - the fvwm buttonbox module

SYNOPSIS


Module FvwmButtons [-g geometry] [-transient | -transientpanel] [name[configfile]]

FvwmButtons can only be invoked by fvwm. Command line invocation of
the FvwmButtons module will not work.


DESCRIPTION


The FvwmButtons module provides a window of buttons which sits on the
X terminal's root window. The user can press the buttons at any time,
and trigger invocation of a user-specified command by the window
manager. FvwmButtons only works when fvwm is used as the window
manager.

The buttonbox can be of any configuration or geometry, and can have
monochrome or color icons to represent the actions which would be
invoked. Even other applications can be 'swallowed' by the button
bar.

Panels that are opened on a button press are available too. See
CREATING PANELS section for details.


OPTIONS


The -g option specifies the geometry of the main window. The command
line option takes precedence over any other geometry settings in the
configuration file.

The -transient option tells FvwmButtons to terminate itself after the
first key or button press has been received (presses to open a sub
panel do not count) or a sub panel has been closed or respawned. This
is especially useful for sub panels where you want to select a single
button and have it closed automatically. It could be used to create
two-dimensional graphical menus. Since -transient is an option, not
a configuration setting you can use the same configuration for
transient and non transient button bars.

The -transientpanel option does roughly the same as the -transient
option, but instead of closing the whole button bar, the window is
merely hidden. This is very useful if the button bar is started as a
subpanel of another button bar because it avoids that it must be
started again when something is selected.


INVOCATION


FvwmButtons is spawned by fvwm, so command line invocation will not
work.

FvwmButtons can be invoked by inserting the line 'Module FvwmButtons
OptionalName' in the .fvwm2rc file. This should be placed in the
StartFunction if FvwmButtons is to be spawned during fvwm's
initialization. This can be bound to a menu or mouse button or
keystroke to invoke it later.

When invoked with the OptionalName argument, the OptionalName is used
to find configuration commands. For example:

AddToFunc StartFunction Module FvwmButtons MyButtonBox

FvwmButtons will then use only the lines starting with
"*MyButtonBox", instead of the default "*FvwmButtons".


CONFIGURATION OPTIONS


The following commands are understood by FvwmButtons:


*FvwmButtons: Back color
Specifies the background color for the buttons. The relief and
shadow color are calculated from the background color.


*FvwmButtons: BoxSize algorithm
This option specifies how serious FvwmButtons takes the Rows
and Columns options (see below). It can be one of dumb, fixed
or smart.

If fixed is used and both Rows and Columns are specified and
non-zero, FvwmButtons uses exactly the number of rows and
columns specified. If the box is too small to accommodate all
buttons the module will fail.

If smart is used FvwmButtons enlarges the box so all buttons
have a chance to fit. The number of columns is increased to at
least the width of the widest button and new rows are added
until all buttons are placed. For the best tolerance of
configuration errors use the smart option.

dumb is neither fixed nor smart. This is the default.


*FvwmButtons: Colorset colorset
Tells the module to use colorset colorset for the window
background. Refer to the fvwm man page for details about
colorsets.


*FvwmButtons: ActiveColorset colorset
Tells the module to use colorset colorset for the background
color/image and/or title color of a button when the mouse is
hovering above a button.


*FvwmButtons: PressColorset colorset
Tells the module to use colorset colorset for the background
color/image and/or title color of a button when it is pressed.


*FvwmButtons: Columns columns
Specifies the number of columns of buttons to be created. If
unspecified, the number of columns is set to the number of
buttons requested, divided by the number of rows. If both the
rows and columns are specified, but the number of buttons is
more than the rows and columns allow for, the columns
specification is ignored unless the BoxSize option is fixed.


*FvwmButtons: File filename
Specifies that the configuration for this button is found in
the file filename. Filename can be a full pathname, or is
assumed to be in fvwm's startup directory. The configuration
file is in the same format as fvwm's configuration file, but
each line is read as if prefixed by "*FvwmButtons". Comments
are given by starting a line with "#". Line continuation is
done by ending a line with a "\".


*FvwmButtons: Font font
Specifies the font to be used for labeling the buttons, or
None.


*FvwmButtons: Fore color
Specifies the color used for button label text and monochrome
icons.


*FvwmButtons: Frame width
Specifies the width of the relief around each button. If this
is a negative number, the relief is inverted. This makes the
button sunken normally and raised when activated.


*FvwmButtons: Geometry geometry
Specifies the FvwmButtons window location and size. The
geometry is a standard X11 window geometry specification.


*FvwmButtons: ButtonGeometry geometry
This option works like the Geometry option except that the
size is the size of a single button. The size of the whole
FvwmButtons window is calculated by multiplying the button
dimension by the number of rows and columns.


*FvwmButtons: Padding width height
This option specifies the default horizontal padding to be
width pixels, and the vertical padding to be height pixels.
The amount of free space between the relief of the button and
its contents is normally 2 pixels on the sides and 4 pixels
above and below, except for swallowed windows and containers,
which are not padded at all, unless this option is used.


*FvwmButtons: Pixmap pixmapfile
Specifies a background pixmap to use. Specify "none" (without
the double quotes) for a transparent background.


*FvwmButtons: Rows rows
Specifies the number of rows of buttons to be created. The
default is 2 rows.


*FvwmButtons: (options) [title icon command]
Specifies the contents of a button in the buttonbox. The
following options, separated by commas or whitespace, can be
given a button:

geometry
Specifies the size and position of the button within
the FvwmButtons window or container. The geometry is a
standard X11 window geometry specification. The button
is width times the normal button width and height times
the normal button height. If values for x and y are
given, the button is placed x (y) button units from the
left (top) of the container if x (y) is positive and x
(y) units from the right (bottom) if x (y) is negative.
Buttons with position arguments (x and y) are placed
before those without them. If two or more buttons are
forced to overlap by this, FvwmButtons exits with an
error message.


Action [(options)] command
Specifies an fvwm command to be executed when the
button is activated by pressing return or a mouse
button. The command needs to be quoted if it contains a
comma or a closing parenthesis.

The current options of the Action are: Mouse n - this
action is only executed for mouse button n. One action
can be defined for each mouse button, in addition to
the general action.

In the command part, you can use a number of predefined
variables: $left, $right, $top and $bottom are
substituted by the left, right, top and bottom
coordinates of the button pressed. $-left, $-right,
$-top and $-bottom are substituted likewise, but the
coordinates are calculated from the bottom or the right
edge of the screen instead (for a button that is 5
pixels away from the right screen border, $-right will
be 5). $width and $height are replaced by the width or
height of the button. The variables $fg and $bg are
replaced with the name of the foreground or background
color set with the Back or Fore option (see below). All
this is done regardless of any quoting characters. To
get a literal '$' use the string '$$'.

Example:


*FvwmButtons: (Title xload, Action (Mouse 1) \
`Exec exec xload -fg $fg -bg $bg -geometry -3000-3000`)


Note: With fvwm versions prior to 2.5.0, actions could
not be assigned to a button that swallowed an
application window (see Swallow option). Such actions
worked only when the border around the button was
clicked. This is now possible, but to get back the old
behavior, the ActionIgnoresClientWindow can be used on
the button:


*FvwmButtons: (Action beep, ActionIgnoresClientWindow, \
Swallow xeyes "Exec exec xeyes")


In this example, the action is only executed when you
click on the border of the button or the transparent
part of the xeyes window, but not on the xeyes window
itself.


ActionIgnoresClientWindow
See the note in the description of Action above.


ActionOnPress
Usually the action is executed on the button release
except for the Popup action. This option changes this
behavior, the action is executed on the button press.
This may be good, for example, with Menu or
SendToModule that generates popups, or when Frame is 0
and the button would look unresponsive otherwise.


Back color
Specifies the background color to be used drawing this
box. A relief color and a shadow color are calculated
from this.


Center The contents of the button is centered on the button.
This is the default but may be changed by Left or
Right.


Top The contents of the button is vertically aligned at the
top of the button. The default is to vertically center
it.


Colorset colorset
The given colorset can be applied to a container, a
swallowed application and a simple button. To apply it
to a button or container, simply put the option in a
line with a button or container description. Drawing
backgrounds for individual buttons and containers with
colorsets requires a lot of communication with the X
server. So if you are not content with the drawing
speed of dozens of buttons with colorset backgrounds,
do not use colorsets here. Setting colorsets as the
background of swallowed applications does not have this
restriction but depends entirely on the swallowed
application. It may work as you wish, but since it
involves fiddling with other applications' windows
there is no guarantee for anything. I have tested
three applications: xosview works nicely with a
colorset background, xload works only with a VGradient
or solid background and an analog xclock leaves a trail
painted in the background color after its hands.

If the swallowed window is an fvwm module (see the
(No)FvwmModule option to Swallow), then the colorset is
not applied to the swallowed module. You should use the
colorset in the module configuration. If the swallowed
module has a transparent colorset background, then the
FvwmButtons background (and not the button colorset) is
seen by transparency of the background of the swallowed
module. Refer to the fvwm man page for details about
colorsets.


ActiveColorset colorset
Use colorset colorset for the background color/image
and/or title color of the button when the mouse is
hovering above it.


PressColorset colorset
Use colorset colorset for the background color/image
and/or title color of the button when it is pressed.


Container [(options)]
Specifies that this button will contain a miniature
buttonbox, equivalent to swallowing another FvwmButtons
module. The options are the same as can be given for a
single button, but they affect all the contained
buttons. Options available for this use are Back, Font,
Fore, Frame and Padding. Flags for Title and Swallow
options can be set with Title(flags) and
Swallow(flags). You should also specify either "Columns
width" or "Rows height", or "Rows 2" will be assumed.
For an example, see the Sample configuration section.

The container button itself (separate from the
contents) can take format options like Frame and
Padding, and commands can be bound to it. This means
you can make a sensitive relief around a container,
like

*FvwmButtons: (2x2, Frame 5, Padding 2 2, Action Beep,\
Container(Frame 1))

Typically you will want to at least give the container
a size setting widthxheight.


End Specifies that no more buttons are defined for the
current container, and further buttons will be put in
the container's parent. This option should be given on
a line by itself, i.e

*FvwmButtons: (End)


Font fontname
Specifies that the font fontname is to be used for
labeling this button.


Fore color
Specifies the foregound color of the title and
monochrome icons in this button.


Frame width
The relief of the button will be width pixels wide. If
width is given as a negative number, the relief is
inverted. This makes the button sunken normally and
raised when activated.


Icon filename
The name of an image file, containing the icon to
display on the button. FvwmButtons searches through
the path specified in the fvwm ImagePath configuration
item to find the icon file.


ActiveIcon filename
The name of an image file, containing an alternative
icon to display on the button when the mouse is
hovering above the button. If no ActiveIcon is
specified, the image specified by Icon is displayed (if
there is one).


PressIcon filename
The name of an image file, containing an alternative
icon to display on the button when the button is
pressed. If no PressIcon is specified, the image
specified by Icon is displayed (if there is one).


Id id The id to be used to identify this button. The first
character of the id should be alphabetic. See also the
"DYNAMICAL ACTIONS" section.


Left The contents of the button are aligned to the left. The
default is to center the contents on the button.


NoSize This option specifies that this button will not be
considered at all when making the initial calculations
of button sizes. Useful for the odd button that gets
just a couple of pixels too large to keep in line, and
therefore blows up your whole buttonbox. "NoSize" is
equivalent to "Size 0 0".


Padding width height
The amount of free space between the relief of the
button and its contents is normally 2 pixels to the
sides and 4 pixels above and below, except for
swallowed windows and containers, which are by default
not padded at all. This option sets the horizontal
padding to width and the vertical padding to height.


Panel [ (options) ] hangon command
Panels can be swallowed exactly like windows are
swallowed by buttons with the Swallow command below,
but they are not displayed within the button. Instead
they are hidden until the user presses the panel's
button. Then the panel (the window of the swallowed
application) opens with a sliding animation. The
options can be any of the flags described for the
Swallow command. In addition a direction 'left',
'right', 'up' or 'down' can be used to specify the
sliding direction.

The steps animation-steps option defines the number of
animation steps.

The delay ms option sets the delay between the steps of
the animation in milliseconds. Use zero for no delay.
The maximum delay is 10 seconds (10000). It doesn't
make any sense to use the delay option unless you also
use the smooth option.

The smooth option causes the panel to redraw between
the steps of the animation. The sliding animation may
be smoother this way, it depends on the application,
and display speed. The application may appear to grow
instead of sliding out. The animation may be slower.

The Hints option causes FvwmButtons to use the
applications size hints to calculate the size of the
animation steps. Hints is the default. If the number
of steps is not what you want, try using NoHints.

The noborder option tells FvwmButtons to ignore the
borders of the window when calculating positions for
the animation (equivalent to set noplr and noptb in the
position option).

With the indicator option set, FvwmButtons will draw a
small triangle in the button that will open a panel.
The triangle points in the direction where the panel
will pop up. The indicator keyword may be followed by
a positive integer that specifies the maximum width and
height of the indicator. Without this size FvwmButtons
will make the indicator fit the button. You will
probably want to use the Padding option to leave a few
pixels between the indicator and the frame of the
button.

The position option allows one to place the panel. The
syntax is:

position [context-window] [pos] [x y] [border-opts]

The argument context-window can be one of: Button,
Module or Root. The context-window is the window from
which panel percentage offsets are calculated. Button
specifies the panel's button, Module specifies
FvwmButtons itself, and Root specifies a virtual
screen. The context-window together with the sliding
direction define a line segment which is one of the
borders of the context-window: the
top/bottom/left/right border for sliding
up/down/left/right.

The pos argument can be one of: center, left or right
(for sliding up or a down) or top or bottom (for
sliding left or right). It defines the vertical
(sliding up and down) or the horizontal (sliding left
and right) position of the Panel on the line segment.
For example, for a sliding up if you use a left pos,
then the left borders of the panel and of the context-
window will be aligned.

The offset values x and y specify how far the panel is
moved from it's default position. By default, the
numeric value given is interpreted as a percentage of
the context window's width (height). A trailing "p"
changes the interpretation to mean "pixels". All offset
calculations are relative to the buttons location, even
when using a root context.

The border-opts are: mlr, mtb, noplr and noptb. They
define which border widths are taken in account. By
default, the borders of FvwmButtons are not taken in
account. mlr reverses this default for the left and the
right border and mtb reverses this default for the top
and the bottom border. Conversely, by default the
borders of the Panel are taken in account. noplr
reverses this default for the left and the right border
and noptb reverses this default for the top and the
bottom border.

The defaults are sliding up with a delay of five
milliseconds and twelve animation steps. To post the
panel without any animation, set the number of steps to
zero. The default position is 'Button center'.

Please refer to the CREATING PANELS section for further
information on panels.

Example:

# To include the panel in a button
*FvwmButtons: (Panel(down, delay 0, steps 16) \
SubPanel "Module FvwmButtons SubPanel")

# To define the panel as an instance of
# FvwmButtons with a different name:
*SubPanel: (Icon my_lock.xpm, Action Exec xlock)
*SubPanel: (Icon my_move.xpm, Action Move)
...


Right The contents of the button are aligned to the right.
The default is to center the contents on the button.


Size width height
Specifies that the contents of this button require
width by height pixels, regardless of what size
FvwmButtons calculates from the icon and the title. A
button bar with only swallowed windows will not get
very large without this option specified, as
FvwmButtons does not consider sizes for swallowing
buttons. Note that this option gives the minimum space
assured; other buttons might require the buttonbox to
use larger sizes.


Swallow [(flags)] hangon command
Causes FvwmButtons to execute command, and when a
window with a name, class or resource matching hangon
appears, it is captured and swallowed into this button.
The hangon string may contain wildcard characters ('*')
that match any substring. Swallow replaces the
variables $fg and $bg as described above for the Action
option (but if you use the UseOld and NoClose options
the application is not be restarted when FvwmButtons is
restarted and thus does not get the new colors - if you
changed them). An example:

*FvwmButtons: (Swallow XClock 'Exec xclock -geometry -3000-3000 &')

takes the first window whose name, class, or resource
is "XClock" and displays it in the button. If no
matching window is found, the "Exec" command creates
one. The argument "-geometry -3000-3000" is used so
that the window is first drawn out of sight before its
swallowed into FvwmButtons.

Modules can be swallowed by specifying the module
instead of 'Exec whatever', like:

*FvwmButtons: (Swallow "FvwmPager" "FvwmPager 0 0")

The flags that can be given to swallow are:

NoClose / Close - Specifies whether the swallowed
program in this button will be un-swallowed or closed
when FvwmButtons exits cleanly. "NoClose" can be
combined with "UseOld" to have windows survive a
restart of the window manager. The default setting is
"Close".

NoHints / Hints - Specifies whether hints from the
swallowed program in this button will be ignored or
not, useful in forcing a window to resize itself to fit
its button. The default value is "Hints".

NoKill / Kill - Specifies whether the swallowed program
will be closed by killing it or by sending a message to
it. This can be useful in ending programs that doesn't
accept window manager protocol. The default value is
"NoKill". This has no effect if "NoClose" is specified.

NoRespawn / Respawn / SwallowNew - Specifies whether
the swallowed program is to be respawned (restarted) if
it dies. If "Respawn" is specified, the program is
respawned using the original command. Use this option
with care, the program might have a legitimate reason
to die. If "SwallowNew" is given, the program is not
respawned, but if a new window with the specified name
appears, it is swallowed.

NoOld / UseOld - Specifies whether the button will try
to swallow an existing window matching the hangon name
before spawning one itself with command. The hangon
string may contain wildcard characters ('*') that match
any substring.The default value is "NoOld". "UseOld"
can be combined with "NoKill" to have windows survive a
restart of the window manager. If you want FvwmButtons
to swallow an old window, and not spawn one itself if
failing, let the command be "Nop":

*FvwmButtons: (Swallow (UseOld) "Console" Nop)

If you want to be able to start it yourself, combine it
with an action:

*FvwmButtons: (Swallow (UseOld) "Console" Nop, \
Action `Exec "Console" console &`)

NoTitle / UseTitle - Specifies whether the title of the
button will be taken from the swallowed window's title
or not. If "UseTitle" is given, the title on the button
changes dynamically to reflect the window name. The
default is "NoTitle".

NoFvwmModule / FvwmModule - By default, FvwmButtons
treats the swallowed window as an fvwm module window if
the 4 first letters of the command is "Fvwm" or the 6
first letters of the command is "Module". NoFvwmModule
and FvwmModule override this logic.


Title [(options)] name
Specifies the title to be written on the button.
Whitespace can be included in the title by quoting it.
If a title at any time is too long for its buttons,
characters are chopped of one at a time until it fits.
If justify is "Right", the head is removed, otherwise
its tail is removed. These options can be given to
Title:

Center - The title is centered horizontally. This is
the default.

Left - The title is justified to the left side.

Right - The title is justified to the right side.

Side - Causes the title to appear on the right hand
side of any icon or swallowed window, instead of below
which is the default. If you use small icons, and
combine this with the "Left" or "Right" option, you can
get a look similar to fvwm's menus.


ActiveTitle name
Specifies the title to be written on the button when
the mouse is hovering above the button. If no
ActiveTitle is specified, the text specified by Title
is displayed (if there is any).


PressTitle name
Specifies the title to be written on the button when
the button is pressed. If no PressTitle is specified,
the text specified by Title is displayed (if there is
any).


Legacy fields [title icon command]
These fields are kept for compatibility with previous
versions of FvwmButtons, and their use is discouraged.
The title field is similar to the option Title name. If
the title field is "-", no title is displayed. The icon
field is similar to the option Icon filename. If the
icon field is "-" no icon is displayed. The command
field is similar to the option Action command or
alternatively Swallow "hangon" command.

The command
Any fvwm command is recognized by FvwmButtons. See
fvwm(1) for more information.

The Exec command has a small extension when used in
Actions, its syntax is:

Exec ["hangon"] command

Example:

*FvwmButtons: (Action Exec "xload" xload)

The hangon string must be enclosed in double quotes.
When FvwmButtons finds such an Exec command, the button
remains pushed in until a window whose name, class or
resource matches the quoted portion of the command is
encountered. This is intended to provide visual
feedback to the user that the action he has requested
will be performed. The hangon string may contain
wildcard characters ('*') that match any substring. If
the quoted portion contains no characters, then the
button will pop out immediately. Note that users can
continue pressing the button, and re-executing the
command, even when it looks pressed in.


Quoting
Any string which contains whitespace must be quoted.
Contrary to earlier versions commands no longer need to
be quoted. In this case any quoting character will be
passed on to the application untouched. Only commas ','
and closing parentheses ')' have to be quoted inside a
command. Quoting can be done with any of the three
quotation characters; single quote:

'This is a "quote"',

double quote:

"It's another `quote'",

and back quote:

`This is a strange quote`.

The back quoting is unusual but used on purpose, if you
use a preprocessor like FvwmCpp and want it to get into
your commands, like this:

#define BG gray60
*FvwmButtons: (Swallow "xload" `Exec xload -bg BG &`)

Any single character can be quoted with a preceding
backslash '\'.

CREATING PANELS


Former versions of FvwmButtons (fvwm 2.0.46 to 2.3.6) had a different
way of handling panels. You can not use your old panel configuration
with the new panel feature. Read "CONVERTING OLD PANEL
CONFIGURATIONS" for more information.


HOW TO CREATE NEW PANELS


Any program that can be launched from within fvwm and that has a
window can be used as a panel. A terminal window could be your
panel, or some application like xload or xosview or another fvwm
module, including FvwmButtons itself. All you need to know is how to
start your application from fvwm.

The button that invokes the panel is as easily configured as any
other button. Essentially you need nothing more than the Panel
option:


*FvwmButtons: (Panel my_first_panel \
"Module FvwmButtons -g -30000-30000 my_first_panel")
*FvwmButtons: (Panel my_second_panel \
"Exec exec xterm -g -30000-30000 -n my_second_panel")


This works like the Swallow option. The difference is that the
application is not put into the button when it starts up but instead
hidden from view. When you press the button for the panel the window
slides into view. The '-g -30000-30000' option tells the application
that it should be created somewhere very far to the top and left of
your visible screen. Otherwise you would see it flashing for a
moment when FvwmButtons starts up. Some applications do not work
well with this kind of syntax so you may have to live with the short
flashing of the window. If you want to make a panel from another
instance of FvwmButtons you can do so, but you must give it a
different name ('my_first_panel' in above example). If you run
FvwmButtons under the same name, new panels are created recursively
until your system runs out of resources and FvwmButtons crashes! To
configure a second button bar with a different name, simply put
'*new_name' in place of '*FvwmButtons' in your configuration file.
If you are not familiar with the Swallow option or if you want to
learn more about how 'swallowing' panels works, refer to the
description of the Swallow option.

Now that your panel basically works you will want to tune it a bit.
You may not want a window title on the panel. To disable the title
use the fvwm Style command. If your button bar is 'sticky' you may
want to make the panel sticky too. And probably the panel window
should have no icon in case it is iconified.


Style name_of_panel_window NoTitle, Sitcky, NoIcon


You may want your panel to stay open only until you select something
in it. You can give FvwmButtons the -transientpanel option after the
-g option in the command. FvwmPager has a similar option
'-transient'.

Last, but not least, you can now put an icon, a title or a small
arrow in the button so that you can see what it is for. A title or
icon can be specified as usual. To activate the arrow, just add
'(indicator)' after the 'Panel' keyword in the example above and the
Padding option to leave a few pixels between the arrow and the border
of the button. An optional direction in which the panel is opened
can be given too:


*FvwmButtons: (Padding 2, Panel(down, indicator) my_first_panel \
"Module FvwmButtons -g -30000-30000 -transientpanel my_first_panel")


There are several more options to configure how your panel works, for
example the speed and smoothness of the sliding animation. Please
refer to the description of the Panel option for further details.


CONVERTING OLD PANEL CONFIGURATIONS


This section describes how to convert a pretty old syntax used in
2.2.x versions. You may skip it if your syntax is more recent.

With the old panel feature you first had one or more lines defining
panels in your main FvwmButtons configuration:


...
*FvwmButtons(Title WinOps,Panel WinOps)
*FvwmButtons(Title Tools ,Panel Tools)
...


After the last configuration line for the main panel the
configuration of the first panel followed, introduced with a line
beginning with *FvwmButtonsPanel:


*FvwmButtonsPanel WinOps
*FvwmButtonsBack bisque2
...

*FvwmButtonsPanel Tools
*FvwmButtonsBack bisque2
...


And perhaps you had style commands for you panels:


Style FvwmButtonsPanel Title, NoHandles, BorderWidth 0
Style FvwmButtonsPanel NoButton 2, NoButton 4, Sticky


The new configuration looks much the same, but now the configuration
of the main panel is independent of the configuration of the sub
panels. The lines invoking the panels use the same syntax as the
Swallow option, so you simply add the name of the window to use as a
panel and the command to execute instead of the panel name. Note
that you give the new instance of FvwmButtons a different name.


*FvwmButtons: (Title WinOps, Panel WinOps \
"Module FvwmButtons WinOps")
*FvwmButtons: (Title Tools , Panel Tools \
"Module FvwmButtons Tools")


If you used something like 'Panel-d' you now have to use
'Panel(down)' instead. To make the new panel vanish as soon as a
button was selected start FvwmButtons with the '-transientpanel'
option:


*FvwmButtons: (Title Tools , Panel(down) Tools \
"Module FvwmButtons -transientpanel Tools")


The rest of the configuration is very easy to change. Delete the
lines '*FvwmButtonsPanel <name>' and add <name> to all of the
following configuration lines for the panel instead. Use the same
name in your Style commands:


*WinOps: Back bisque2
...
*Tools: Back bisque2
...
Style "WinOps" Title, NoHandles, BorderWidth 0
Style "WinOps" NoButton 2, NoButton 4, Sticky
Style "Tools" Title, NoHandles, BorderWidth 0
Style "Tools" NoButton 2, NoButton 4, Sticky


That's it. The new panels are much more flexible. Please refer to
other parts of this documentation for details.


WHY WAS THE PANEL FEATURE REWRITTEN?
There are several reasons. The most important one is that the
program code implementing the panels was very disruptive and caused a
lot of problems. At the same time it made writing new features for
FvwmButtons difficult at best. The second reason is that most users
were simply unable to make it work - it was way too complicated.
Even I (the author of the new code) had to spend several hours before
I got it working the first time. The third reason is that the new
panels are more versatile. Any application can be a panel in
FvwmButtons, not just other instances of FvwmButtons itself. So I
sincerely hope that nobody is angry about the change. Yes - you have
to change your configuration, but the new feature is much easier to
configure, especially if you already know how the Swallow option
works.


ARRANGEMENT ALGORITHM


FvwmButtons tries to arrange its buttons as best it can, by using
recursively, on each container including the buttonbox itself, the
following algorithm.

Getting the size right
First it calculates the number of button unit areas it will
need, by adding the width times the height in buttons of each
button. Containers are for the moment considered a normal
button. Then it considers the given rows and columns
arguments. If the number of rows is given, it will calculate
how many columns are needed, and stick to that, unless columns
is larger, in which case you will get some empty space at the
bottom of the buttonbox. If the number of columns is given, it
calculates how many rows it needs to fit all the buttons. If
neither is given, it assumes you want two rows, and finds the
number of columns from that. If the BoxSize option is set to
smart at least the height/width of the tallest/widest button
is used while the fixed value prevents the box from getting
resized if both rows and columns have been set to non-zero.

Shuffling buttons
Now it has a large enough area to place the buttons in, all
that is left is to place them right. There are two kinds of
buttons: fixed and floating buttons. A fixed button is forced
to a specific slot in the button box by a x/y geometry
argument. All other buttons are considered floating. Fixed
buttons are placed first. Should a fixed button overlap
another one or shall be place outside the buttons window,
FvwmButtons exits with an error message. After that the
floating buttons are placed. The algorithm tries to place the
buttons in a left to right, top to bottom western fashion. If
a button fits at the suggested position it is placed there, if
not the current slot stays empty and the slot to the right
will be considered. After the button has been placed, the next
button is tried to be placed in the next slot and so on until
all buttons are placed. Additional rows are added below the
bottom line of buttons until all buttons are placed if
necessary if the BoxSize option smart is used.

Containers
Containers are arranged by the same algorithm, in fact they
are shuffled recursively as the algorithm finds them.

Clarifying example
An example might be useful here: Suppose you have 6 buttons,
all unit sized except number two, which is 2x2. This makes for
5 times 1 plus 1 times 4 equals 9 unit buttons total area.
Assume you have requested 3 columns.

1) +---+---+---+ 2) +---+---+---+ 3) +---+---+---+
| 1 | | | 1 | | | 1 | |
+---+ + +---+ 2 + +---+ 2 +
| | | | | | 3 | |
+ + + +---+---+ +---+---+---+
| | | | | | | |
+-----------+ +---+-------+ +---+---+---+

4) +---+---+---+ 5) +---+-------+ 6) +---+-------+
| 1 | | | 1 | | | 1 | |
+---+ 2 + +---+ 2 | +---+ 2 |
| 3 | | | 3 | | | 3 | |
+---+---+---+ +---+---+---+ +---+-------+
| 4 | | | 4 | 5 | | | 4 | 5 | 6 |
+---+---+---+ +---+---+---+ +---+---+---+


What size will the buttons be?
When FvwmButtons has read the icons and fonts that are
required by its configuration, it can find out which size is
needed for every non-swallowing button. The unit button size
of a container is set to be large enough to hold the largest
button in it without squeezing it. Swallowed windows are
simply expected to be comfortable with the button size they
get from this scheme. If a particular configuration requires
more space for a swallowed window, it can be set in that
button's configuration line using the option "Size width
height". This will tell FvwmButtons to give this button at
least width by height pixels inside the relief and padding.


DYNAMICAL ACTIONS


A running FvwmButtons instance may receive some commands at run time.
This is achieved using the fvwm command

SendToModule FvwmButtons-Alias <action> <params>

Supported actions:


ChangeButton button_id options
can be used to change the title or icon of a button at run
time. button_id is the id of the button to change as
specified using the Id button option. It may also be a
number, in this case the button with the given number is
assumed. And finally, button_id may be in the form +x+y,
where x and y are a column number and a row number of the
button to be changed. It is possible to specify multiple
option pairs (name with value) by delimiting them using comma.
Currently options include Title, ActiveTitle, PressTitle,
Colorset, Icon, ActiveIcon and PressIcon. These options work
like the configuration options of the same name.


ExpandButtonVars button_id command
replaces variables present in the command exactly like in the
Action button option and then sends the command back to fvwm.
button_id has the same syntax as described in ChangeButton
above.


PressButton button_id [mouse_button]
simulates a mouse click on a button. button_id is the id of
the button to press as specified using the Id button option
and mouse_button is the number of mouse button used to click
on the button e.g "1" for the left mouse button etc. Quotes
around the number are not necessary. If mouse_button option
is omitted, mouse button 1 is assumed. This command behaves
exactly as if the mouse button was pressed and released on the
button on in question.


Silent This prefix may be specified before other actions. It disables
all possible error and warning messages.


Example:

*FvwmButtons: (Id note1, Title "13:30 - Dinner", Icon clock1.xpm)

SendToModule FvwmButtons Silent \
ChangeButton note1 Icon clock2.xpm, Title "18:00 - Go Home"


SAMPLE CONFIGURATION


The following are excerpts from a .fvwm2rc file which describe
FvwmButtons initialization commands:


##########################################################
# Load any modules which should be started during fvwm
# initialization

# Make sure FvwmButtons is always there.
AddToFunc StartFunction "I" Module FvwmButtons

# Make it titlebar-less, sticky, and give it an icon
Style "FvwmButtons" Icon toolbox.xpm, NoTitle, Sticky

# Make the menu/panel look like CDE
Style "WinOps" Title, NoHandles, BorderWidth 0
Style "WinOps" NoButton 2, NoButton 4, Sticky
Style "Tools" Title, NoHandles, BorderWidth 0
Style "Tools" NoButton 2, NoButton 4, Sticky

##########################################################
DestroyModuleConfig FvwmButtons: *
*FvwmButtons: Fore Black
*FvwmButtons: Back rgb:90/80/90
*FvwmButtons: Geometry -135-5
*FvwmButtons: Rows 1
*FvwmButtons: BoxSize smart
*FvwmButtons: Font -*-helvetica-medium-r-*-*-12-*
*FvwmButtons: Padding 2 2

*FvwmButtons: (Title WinOps, Panel WinOps \
"Module FvwmButtons -transientpanel WinOps")
*FvwmButtons: (Title Tools, Panel Tools \
"Module FvwmButtons -transientpanel Tools")

*FvwmButtons: (Title Resize, Icon resize.xpm, Action Resize)
*FvwmButtons: (Title Move, Icon arrows2.xpm, Action Move )
*FvwmButtons: (Title Lower, Icon Down, Action Lower )
*FvwmButtons: (Title Raise, Icon Up, Action Raise )
*FvwmButtons: (Title Kill, Icon bomb.xpm, Action Destroy)

*FvwmButtons: (1x1,Container(Rows 3,Frame 1))
*FvwmButtons: (Title Dopey ,Action \
`Exec "big_win" xterm -T big_win -geometry 80x50 &`)
*FvwmButtons: (Title Snoopy, Font fixed, Action \
`Exec "small_win" xterm -T small_win &`)
*FvwmButtons: (Title Smokin')
*FvwmButtons: (End)

*FvwmButtons: (Title Xcalc, Icon rcalc.xpm, \
Action `Exec "Calculator" xcalc &`)
*FvwmButtons: (Title XMag, Icon magnifying_glass2.xpm, \
Action `Exec "xmag" xmag &`)
*FvwmButtons: (Title Mail, Icon mail2.xpm, \
Action `Exec "xmh" xmh &`)
*FvwmButtons: (4x1, Swallow "FvwmPager" `FvwmPager 0 3` \
Frame 3)

*FvwmButtons: (Swallow(UseOld,NoKill) "xload15" `Exec xload \
-title xload15 -nolabel -bg rgb:90/80/90 -update 15 \
-geometry -3000-3000 &`)


The last lines are a little tricky - one spawns an FvwmPager module,
and captures it to display in a quadruple width button. is used, the
Pager will be as big as possible within the button's relief.

The final line is even more magic. Note the combination of UseOld and
NoKill, which will try to swallow an existing window with the name
"xload15" when starting up (if failing: starting one with the
specified command), which is un-swallowed when ending FvwmButtons.
The swallowed application is started with "-geometry -3000-3000" so
that it will not be visible until its swallowed.

The other panels are specified after the root panel:


########## PANEL WinOps
DestroyModuleConfig WinOps: *
*WinOps: Back bisque2
*WinOps: Geometry -3-3
*WinOps: Columns 1

*WinOps: (Title Resize, Icon resize.xpm, Action Resize)
*WinOps: (Title Move, Icon arrows2.xpm, Action Move )
*WinOps: (Title Lower, Icon Down, Action Lower )
*WinOps: (Title Raise, Icon Up, Action Raise )

########## PANEL Tools
DestroyModuleConfig Tools: *
*Tools: Back bisque2
*Tools: Geometry -1-1
*Tools: Columns 1

*Tools: (Title Kill, Icon bomb.xpm, Action Destroy)


The color specification rgb:90/80/90 is actually the most correct way
of specifying independent colors in X, and should be used instead of
the older #908090. If the latter specification is used in your
configuration file, you should be sure to escape the hash in any of
the commands which will be executed, or fvwm will consider the rest
of the line a comment.

Note that with the x/y geometry specs you can easily build button
windows with gaps. Here is another example. You can not accomplish
this without geometry specs for the buttons:

##########################################################
# Another example
##########################################################

# Make it titlebar-less, sticky, and give it an icon
Style "FvwmButtons" Icon toolbox.xpm, NoTitle, Sticky

DestroyModuleConfig FvwmButtons: *
*FvwmButtons: Font 5x7
*FvwmButtons: Back rgb:90/80/90
*FvwmButtons: Fore black
*FvwmButtons: Frame 1
# 9x11 pixels per button, 4x4 pixels for the frame
*FvwmButtons: Geometry 580x59+0-0
*FvwmButtons: Rows 5
*FvwmButtons: Columns 64
*FvwmButtons: BoxSize fixed
*FvwmButtons: Padding 1 1

# Pop up a module menu directly above the button.
*FvwmButtons: (9x1+3+0, Padding 0, Title "Modules", \
Action `Menu Modulepopup rectangle \
$widthx$height+$lleft+$top o+50 -100m`)

# first row of buttons from left to right:
*FvwmButtons: (3x2+0+1, Icon my_lock.xpm, Action `Exec xlock`)
*FvwmButtons: (3x2+3+1, Icon my_recapture.xpm, Action Recapture)
*FvwmButtons: (3x2+6+1, Icon my_resize.xpm, Action Resize)
*FvwmButtons: (3x2+9+1, Icon my_move.xpm, Action Move)
*FvwmButtons: (3x2+12+1, Icon my_fvwmconsole.xpm, \
Action 'Module FvwmConsole')

# second row of buttons from left to right:
*FvwmButtons: (3x2+0+3, Icon my_exit.xpm, Action QuitSave)
*FvwmButtons: (3x2+3+3, Icon my_restart.xpm, Action Restart)
*FvwmButtons: (3x2+6+3, Icon my_kill.xpm, Action Destroy)
*FvwmButtons: (3x2+9+3, Icon my_shell.xpm, Action 'Exec rxvt')

# big items
*FvwmButtons: (10x5, Swallow (NoKill, NoCLose) \
"FvwmPager" 'FvwmPager * * -geometry 40x40-1024-1024')
*FvwmButtons: (6x5, Swallow "FvwmXclock" `Exec xclock \
-name FvwmXclock -geometry 40x40+0-3000 -padding 1 \
-analog -chime -bg rgb:90/80/90`)
*FvwmButtons: (13x5, Swallow (NoClose) \
"FvwmIconMan" 'Module FvwmIconMan')
*FvwmButtons: (20x5, Padding 0, Swallow "xosview" \
`Exec /usr/X11R6/bin/xosview -cpu -int -page -net \
-geometry 100x50+0-3000 -font 5x7`)


BUGS


The action part of the Swallow option must be quoted if it contains
any whitespace character.


COPYRIGHTS


The FvwmButtons program, and the concept for interfacing this module
to the Window Manager, are all original work by Robert Nation.

Copyright 1993, Robert Nation. No guarantees or warranties or
anything are provided or implied in any way whatsoever. Use this
program at your own risk. Permission to use this program for any
purpose is given, as long as the copyright is kept intact.

Further modifications and patching by Jarl Totland, copyright 1996.
The statement above still applies.


AUTHOR


Robert Nation. Somewhat enhanced by Jarl Totland, Jui-Hsuan Joshua
Feng, Scott Smedley.

3rd Berkeley Distribution 19 October 2022 (2.7.0) FvwmButtons(1)

tribblix@gmail.com :: GitHub :: Privacy