FvwmRearrange
This module can be called to tile or cascade windows.
When tiling the module rearranges all the windows on the current monitor into a grid (or matrix). By default FvwmRearrange will tile the windows into a grid that is close to a square grid as possible based on the number of windows on the monitor. The size (and direction) of the grid can be configured using various options.
When cascading the module will resize (to 75% the size of the monitor) then place them starting from the top left of the monitor, and place each window down and to the left of the previous window so its title bar and borders can be seen behind it. Both the size windows are resized to and the size of the increments can be configured using various options.
Configuration and Use
FvwmRearrange is a module that must be invoked from fvwm. It can be
add to a menu, key binding, event, and so on. FvwmRearrange is configured
using command line options (all with a single -
). These options affect
the placement, resizing, ordering of windows and so on. For a full list
of FvwmRearrange configuration options see the FvwmRearrange manpage.
The simplest way to run FvwmRerrange is with no options, which
will auto tile (the same as the -auto_tile
option) the windows
on the current monitor. You can additionally specify a specific
monitor to rearrange, and how to order the windows. For example
to auto tile all the windows and order them by their class in
reverse alphabetical order on the RandR monitor DP-2
use:
FvwmRearrange -screen DP-2 -order_class -reverse
By default FvwmRerrange cannot restore the position of the windows.
If you want to be able to return windows to their original position
you can by including the -maximze
option (note this only works on
windows which are not already in the maximized state), which will put
all the windows into a maximized state. This allows you to return the
window to its original position by unmaximizing them. For example:
# Auto tile all windows on RandR monitor DP-2
FvwmRearrange -screen DP-2 -maximize
# Restore the windows original position
All (CurrentPage, !Iconic, CirculateHit, !Sticky) Maximize Off
Tiling Windows
Tiling windows will place them in a grid, whose size can be controlled
using various options. By default FvwmRerrange will use an auto tile mode
which will compute a grid that is as close to a square as possible depending
on the number of windows available. For instance if you have 6 windows, a
2x2 grid is too small, while a 3x3 grid is too big, so a 3x2 grid will be
used instead (if the option -swap
is included the grid will be 2x3).
If the number of windows doesn’t match the size of the grid some cells are
initially empty, for example if there are only 5 windows and a 3x2 grid is
used, one cell of the grid is left empty. In auto tile mode the option
-fill_start
is implied, which will fill the first row (or column if -swap
is used) with the first two windows, and then place the remaining 3 windows
on the second row using all the space. The option -fill_end
can be used to
instead fill the first row with the first three windows, then fill the last
row with the remaining two windows.
The size of the grid can be controlled in various ways. If using auto tile
mode, the option -max_n N
can be used to offset the size of the grid, by
stating how many more columns (or rows with -swap
) the final grid must
have. For example -max_n 2
will mean there is always at least two more
columns than rows, so 5-8 windows will cause a 4x2 grid (or a 2x4 grid with
-swap
). For more control of the grid use the -tile
option, which will
put all windows into a single row (or column with -swap
). If you combine
-tile
with -max_n N
, then you can specify the maximum number of columns
(or rows). For example -tile -max_n 3
will tile the windows so there is at
most three columns, and the number of rows is based off the number of windows
tiled. By default -tile
will leave cells empty unless the -fill_start
or
-fill_end
option is included.
Last, windows are resized to fit into their respective cells subject to EWMH size hints. That means windows like terminals that include hints to only allowing resizing by specific increments (equal to the size of a single character in terminals) may not completely fill their cell leaving gaps. If you want to override this behavior, tell fvwm to ignore resize hints using the following style:
Style * ResizeHintOverride
Cascading Windows
FvwmRerrange can be used to cascade windows using the -cascade
option.
This option mimics the fvwm CascadePlacement
style where windows are placed
starting in the upper left corner of the monitor, placing each window on top
of the previous window shifted down and to the left so the title bar and
border of the previous window is seen behind it.
By default FvwmRerrange will resize the windows to be 75% the size of the
current monitor. The option -noresize
can be used to prevent FvwmRearrange
from resizing the windows, while the option -nostretch
will prevent
FvwmRerrange from making windows bigger, but will shrink them to fit if they
are too big. The options -cascadew X
and -cascadeh Y
can be used to
specify the width and height of the windows. X
and Y
are taken to be
percent of the bounding box, or pixel sizes if they are suffixed with a p
.
The options -inc_equal
can used to make the horizontal and vertical offsets
the same. The options -incx X
and -incy Y
can be used to specify additional
offsets in the respective direction. The values X
and Y
are percent values
or pixel sizes if suffixed with a p
. The options flatx
and flaty
will
disable auto increments, and if used with -incx X
and -incy Y
can be used
to specify the exact increments.
The following example will cascade and resize the windows to have a width of 60% the monitor, a height of 75% the monitor, and make the horizontal and vertical offsets equal.
FvwmRearrange -cascade -inc_equal -cascadew 60
Window Ordering
FvwmRearrange places the windows in the order they are reported by fvwm, that
is the stack order (usually based off of how recently a window was focused)
is used. It is possible to reorder the windows using various order options.
-order_name
, -order_icon
, -order_class
, and -order_resources
orders
the name, icon name, class, or resource alphabetically. -order_xy
and
-order_yx
order the windows based on their position on the screen.
-order_hw
and order_wh
order windows based on their height and width.
All orders can be reversed using the -reverse
option.
Bounding Box
FvwmRearrange honors any EWMHBaseStruts
of the monitor it is on and will
move and resize windows to fit inside the EWMH working area. If the option
-ewmhiwa
is include, the working area be ignored and FvwmRearrange will
use the full monitor. The global screen can be used, -screen g
to span
multiple monitors (this implies -ewmhiwa
).
In addition you can specify a bounding box by adding including four additional
numbers at then end of the options. The numbers give the Left Top Right Bottom
position of the region of the monitor to use. These can either be percent values
or pixel values if a p
suffix is used.
The bounding box can be used to work with more complicated setups. For example if your want a web browser to take up the left half of the monitor, and then tile the remaining windows on the right half of the monitor into at most two columns, use the following (half way is 50%, if you want to avoid panels or be more exact use pixel values instead):
FvwmRearrange -tile -max_n 2 -fill_end 50 0 100 100
Examples
Setup a key binding to auto tile the current monitor, and order by class so the windows appear in approximately the same order. When windows are added or removed, just hit Alt-T to tile again.
# Alt-T auto tile
Key t A M FvwmRearrange -order_class
Use FvwmEvent to make it so you auto tile the monitor a window is added to or deleted from. This uses the context of the window to determine what monitor it was on, and only rearranges that screen.
# FvwmEvent triggers on add_window and destroy_window.
DestroyModuleConfig FE-AutoTile: *
*FE-AutoTile: Cmd Function
*FE-AutoTile: add_window AutoTile
*FE-AutoTile: destroy_window AutoTile
DestroyFunc AutoTile
AddToFunc AutoTile I FvwmRearrange -screen $[w.screen] -order_class
# Run FvwmEvent when fvwm starts.
AddToFunc StartFunction I Module FvwmEvent FE-AutoTile
# Ignore size hints so windows fill the full cell when tiled.
Style * ResizeHintOverride
This example is attached to key binding (alt-T) which will auto tile all
windows on the current monitor. With the same keybinding, it will restore
all windows to their original position. To work in a multiple monitor
setup, the current state is saved in an InfoStore
variable
TitleSwitch<monitor name>
.
DestroyFunc AutoTile
AddToFunc AutoTile
+ I FvwmRearrange -maximize
DestroyFunc Tile
AddToFunc Tile
+ I Test (EnvMatch infostore.TileSwitch$[monitor.current] ON) TileOff
+ I TestRc (NoMatch) TileOn
DestroyFunc TileOn
AddToFunc TileOn
+ I AutoTile
+ I InfoStoreAdd TileSwitch$[monitor.current] ON
DestroyFunc TileOff
AddToFunc TileOff
+ I All (CurrentPage, !Iconic, CirculateHit, !Sticky) Maximize Off
+ I InfoStoreAdd TileSwitch$[monitor.current] OFF
# Alt-T key binding
Key t A M Tile