fvwm‐menu‐desktop − Reads XDG menu files and creates Fvwm

fvwm‐menu‐desktop [ −−help|−h ] [ −−version ] [
−−install−prefix DIR ] [ −−desktop NAME ] [ −−menu−type NAME
] [ −−theme NAME ] [ −−with−titles|−w ] [ −−without−titles ]
[ −−enable−mini−icons ] [ −−size|−s NUM ] [ −−mini−icon−dir
DIR ] [ −−app−icon NAME ] [ −−dir−icon NAME ] [ −−title|−t
NAME ] [ −−insert−in−menu NAME ] [ −−get−menus all|desktop ]
[ −−set−menus menu_paths ] [ −−all−menus ] [ −−include−items
NAME ] [ −−regen−cmd CMD ] [ −−term−cmd CMD ] [ −−dynamic ]
[ −−menu‐error|−e ] [ −−verbose|−v ]

This is a python script which parses XDG menus definitions
to build corresponding fvwm menus. This script depends on
python‐xdg to run.

Main Options

     Show the help and exit.

     Show the version and exit.

−−get−menus all|desktop
     Prints a space separated list of full menu paths found
     on the system.  all will print all menus found on the
     system except empty ones.  desktop will print the
     menu(s) that would be generated by the script.

     No menu generation is done.

−−desktop NAME
     Optional parameter to set the NAME of the desktop XDG
     .menu file(s) to use. This option will override any
     default menus set via FvwmForm‐XDGMenu‐Config and cause
     the script to find menus in which NAME is a part of the
     file name.  Possible names are: gnome, kde, xfce, lxde,
     debian, etc.

     This option can be used in conjunction with −−menu−type


     to control which .menu file(s) are used.

−−menu−type NAME
     Optional parameter to set the NAME of the XDG menu type
     to use. This option will override any default menus set
     via FvwmForm‐XDGMenu‐Config and cause the script to
     find menus in which NAME is a part of the file name.
     Possible NAME types could be: applications, settings,
     preferences, etc.

     When used in conjunction with −−desktop, only menus
     whose file name matches ’*destkop*menutype*’ are found.
     If no menus are found, the script exits with an error.

     This option will build all menus found on the system.
     If used in conjunction with −−desktop or −−menu−type
     this will build all menus matching those settings.

−−install‐prefix DIR
     Optional parameter to override the standard locations
     for XDG menu definitions. Tells fvwm‐menu‐desktop to
     look in DIR for .menu files instead of the standard
     locations /etc/xdg/menus (and $HOME/.config/menus if it

     If this option is set menus are generated with titles.
     This is the default.  This option can be used to
     override the FvwmForm‐XDGMenu‐Config default setting.

     If this option is set menus are generated without
     titles. The default is to generate with titles.

−−title|−t NAME
     Option to define the menu title NAME of the top menu
     used by Fvwm’s Menu or Popup commands. Default is

−−include−items NAME
     This option controls if the additional menu items
     ’Regenerate’ and ’Configure’ are included in the top
     level menu. NAME can be one of regenerate, config,
     both, or none. The default is both.


−−regen−cmd CMD
     This option sets the fvwm command CMD that is run when
     the menu item ´Regenerate’ is selected. The default is
     "PipeRead ‘fvwm‐menu‐desktop‘".

−−term−cmd CMD
     This option sets the terminal emulator command CMD that
     is used to to run terminal applications in. CMD needs
     to end with an execute option, such as xterm’s ‐e
     option, which will run the command that is appended to
     CMD. The default is "xterm ‐e".

     Debian specific: Per Debian policy, default changed to
     "x‐terminal‐emulator ‐e"

     This option is to be used with creating dynamic menus
     using DynamicPopUpAction and DynamicPopDownAction. This
     adds a ’recreate’ to the DestroyMenu command on the top
     level menu so those actions are not Destroyed when the
     menu is regenerated.

−−insert−in−menu NAME
     Option to insert generated menu(s) IN a menu NAME (its
     top title). This option makes it so the top level menu
     is not Destroyed and the items are added to the end.

     Note menus regenerated with this option will append the
     menu items at the end of the existing menu. Each time
     the menu is regenerated new menu items appear giving a
     growing menu of duplicate items.  You have to
     regenerate the whole menu via a function or restart
     fvwm. See EXAMPLES below for some solutions.

−−set−menus menu_paths
     Generates all menus listed in a space separated list of
     full menu paths.  This option overrides any defaults
     and −−desktop|−−menu−type settings.

−−menu‐error |−t
     If this option is present and python‐xdg is not found,
     the script will print the error in the generated menu.
     Used in the default‐config.

     Enables additional information printouts on STDERR.


Icons Options

     By default, fvwm‐menu‐desktop builds menus without
     mini−icons. To enable mini−icons use the following

     If ImageMagick is installed on the system, the script
     will resize and copy the icons to $FVWM_USERDIR/.icons.
     This can take awhile. You should be prepared to wait
     the first time you generate the icons. Once the icons
     have been generated the script should run faster. If it
     is still to slow using icons, see EXAMPLES for ways to
     limit how often the menu is generated to speed things

     This option enables mini−icons in the menus. If set,
     24x24 mini‐icons are used. If the specified icon isn’t
     that size it will be converted if ImageMagick is
     installed and saved in $HOME/.fvwm/icons or to the
     directory specified with −−mini−icon−dir option.
     Otherwise no icon appears in the menu for that entry.
     With most distributions, all the menu entries will have
     mini‐icons appropriate to the application.

−−theme NAME
     Defines the used icon theme. Default is gnome but all
     others found in /usr/share/icons could be used except
     the hicolor theme because it’s the default fallback
     theme if no icon is found.

−−size|−s NUM
     If −−enable−mini−icons is used the size of the icons
     can changed with this parameter. Default is 24.

−−mini−icon−dir DIR
     When the right size mini‐icon isn’t available, fvwm‐
     menu‐desktop creates icons with the right size in
     $HOME/.fvwm/icons.  If you don’t want to use the
     default directory, $HOME/.fvwm/icons, use this option
     to specify a different folder.

−−app−icon NAME
     Sets the default application icon if no others are
     found. Default is ´gnome‐applications’.

−−dir−icon NAME
     Sets the default directory icon if no others are found.


     Default is ´gnome‐fs‐directory’.

fvwm‐menu‐desktop outputs XDG .menu files in the syntax of
fvwm menus. When fvwm‐menu‐desktop is run with no options,
it will load defaults from the FvwmForm‐XDGMenu‐Config file
(see below) then search your system for suitable menu
file(s). To see which menus are available on your system

          fvwm‐menu‐desktop ‐‐get‐menus all

If no menus are found you may not have any installed on your
system. By default menus are stored as *.menu files in
/etc/xdg/menus, $HOME/.config/menus or the location set in
$XDG_MENU_PREFIX. You can use −−install−prefix to specify
another location search for menus.

Though a combination of command line options and the
FvwmForm‐XDGMenu‐Config settings, fvwm‐menu‐desktop can
generate any combination of the menus found. To get a list
of what menu(s) would be generated use the ‐‐get‐menus
desktop option. The following will list all menus generated
if fvwm‐menu‐desktop was run with no options.

          fvwm‐menu‐desktop ‐‐get‐menus desktop

fvwm‐menu‐desktop determines which menu(s) to generate as

     If no config file is found, all menus will be weighted
     and the script will generate the best (highest weight)
     menu found.

     If a config file is found (and override options are not
     used) the script will generate all menus selected in

     ‐‐desktop, ‐‐menu‐type, ‐‐set‐menus and ‐‐all‐menus
     will override any menus selected in FvwmForm‐XDGMenu‐

     ‐‐desktop and ‐‐menu‐type will only include menus whose
     name matches ’*desktop*menutype*’. If used with ‐‐all‐
     menus, all matching menus are generated. If used
     without ‐‐all‐menus, only the highest weighted menu is

     ‐‐set‐menus generates menus from the list of full path
     menu file names.


     ‐‐all‐menus by itself will generate all menus found.

By default fvwm‐menu‐desktop will generate a menu whose top
level name is "XDGMenu". To tell fvwm to read the output of
fvwm‐menu‐desktop to create the menu XDGMenu add the
following to your fvwm config file:

          PipeRead ’fvwm‐menu‐desktop’

Warning: Depending on the options used this command may be
slow and fvwm will pause until this command is complete. See
EXAMPLES below for more details and possible workarounds.

Once the menu is generated you can open the menu by using
the command "Menu XDGMenu". You can also include this in the
MenuFvwmRoot menu by:

          AddToMenu MenuFvwmRoot "XDG Menu" Popup XDGMenu

fvwm‐menu‐desktop can be configured though both command line
options and a FvwmForm GUI to customize the menu(s) that get

FvwmForm‐XDGMenu‐Config is a FvwmForm interface that can be
used to configure the defaults for fvwm‐menu‐desktop. You
can access this from the "Configure" item in the top level
menu that is generated or run the following from within

          Module FvwmPerl ‐l fvwm‐menu‐desktop‐config.fpl

This form can be used to select which menu(s) get generated
by default along with setting many (but not all) of the
available options. When you click "Save Settings" the form
will write a config file located at $FVWM_USERDIR/.FvwmForm‐
XDGMenu‐Config that fvwm‐menu‐desktop will parse for
defaults when run.

See the help inside of FvwmForm‐XDGMenu‐Config for more

There are many ways to setup when fvwm runs fvwm‐menu‐
desktop to generate the menu. One method is to just generate
the menu when fvwm loads and then use the GUI config tool to
change any options.  To do this you only need to add the


following to the fvwm config file:

          AddToMenu MenuFvwmRoot "XDG Menu" Popup XDGMenu
          PipeRead ’fvwm‐menu‐desktop’

The menu is created once when fvwm loads. Since menu
creation can sometimes be slow, this could cause fvwm to
take longer to load than one wants.

The menu is only generated when fvwm starts. If software is
installed or removed you will have to select the
’Regenerate’ option to rebuild the menu.

One way to speed things up is to save the menu in a file and
only generate the menu when ’Regenerate’ is selected. To do
this use ‐‐regen‐cmd to call a custom function and write the
menu to a file using a command like

          fvwm‐menu‐desktop ‐‐regen‐cmd XDGRegen > $FVWM_USERDIR/.XDGMenu

Then add the following to the fvwm config file to define the
function XDGRegen. The second to last line will generate the
menu if the menu file doesn’t exist when fvwm starts.

          DestroyFunc XDGRegen
          AddToFunc XDGRegen
          + I PipeRead ’fvwm‐menu‐desktop ‐‐regen‐cmd XDGRegen > \
              $[FVWM_USERDIR]/.XDGMenu; echo "Nop"’
          + I Read $[FVWM_USERDIR]/.XDGMenu

          Test (!f $[FVWM_USERDIR]/.XDGMenu) XDGRegen
          Read $[FVWM_USERDIR]/.XDGMenu

Besides creating a top level menu, fvwm‐menu‐desktop can
insert the menu into an existing menu using the ‐‐insert‐in‐
menu option. For example one could create the menu
MenuFvwmRoot and include the XDG items at the end.

          DestroyMenu MenuFvwmRoot
          AddToMenu MenuFvwmRoot "Fvwm" Title
          + "Item1" Action1
          + "ItemN" ActionN
          + "" Nop
          PipeRead ’fvwm‐menu‐desktop ‐‐insert‐in‐menu MenuFvwmRoot’


In this case the menu items are inserted at the end of the
MenuFvwmRoot menu.  If no items are in the menu, this menu
becomes MenuFvwmRoot. The problem here is, that you have to
restart fvwm or rebuild the whole menu to Regenerate it
because menu items cannot be removed.  To do this you could
use a function like

          DestroyFunc XDGRegen
          AddToFunc XDGRegen
          + I DestroyMenu MenuFvwmRoot
          + I AddToMenu MenuFvwmRoot "Fvwm" Title
          + I AddToMenu MenuFvwmRoot "Item1" Action1
          + I AddToMenu MenuFvwmRoot "ItemN" ActionN
          + I AddToMenu MenuFvwmRoot "" Nop
          + I PipeRead ’fvwm‐menu‐desktop ‐‐insert‐in‐menu MenuFvwmRoot \
                        ‐‐regen‐cmd XDGRegen’

Fvwm can also create menus dynamically by using
DynamicPopUpAction and/or DynamicPopDownAction. These
commands when used with a Menu will run a Function when the
menu is opened. For example one could create the menu
XDGMenu when it is opened using

          AddToMenu XDGMenu "XDGMenu" Title
          + DynamicPopUpAction PipeRead ’fvwm‐menu‐desktop’

This will create the menu when it is opened. One issue here
is it will only create the menu the first time it is opened,
and you still have to Regenerate the menu to see any
changes. To create the menu each time it is open used the
‐‐dynamic option

          AddToMenu XDGMenu "XDGMenu" Title
          + DynamicPopUpAction PipeRead ’fvwm‐menu‐desktop \
                               ‐‐dynamic ‐‐include‐items config’
          + DynamicPopDownAction DestroyMenu recreate XDGMenu

This will now Destroy the menu when it closed so it can be
rebuilt the next time it is opened. The recreate flag
doesn’t completely destroy the menu keeping the
DynamicPopUpAction and DynamicPopDownAction actions.  The
‐‐dynamic flag includes the recreate option in the generated

To insert a menu into MenuFvwmRoot and still be dynamic you
need to use a function that generates the whole menu. For


          DestroyFunc GenRootMenu
          AddToFunc GenRootMenu
          + I DestroyMenu recreate MenuFvwmRoot
          + I AddToMenu MenuFvwmRoot "Fvwm" Title
          + I AddToMenu MenuFvwmRoot "Item1" Action1
          + I AddToMenu MenuFvwmRoot "ItemN" ActionN
          + I AddToMenu MenuFvwmRoot "" Nop
          + PipeRead ‘fvwm‐menu‐desktop ‐‐insert‐in‐menu MenuFvwmRoot \
                     ‐‐include‐items config‘

          AddToMenu MenuFvwmRoot "Fvwm" Title
          + DynamicPopUpAction GenRootMenu
          + DynamicPopDownAction DestroyMenu recreate MenuFvwmRoot

The whole process of creating menus from files is slow.
Otherwise report bugs to the fvwm‐workers mailing list

This script is based on fvwm‐xdg‐menu.py written by Piotr
Zielinski (http://www.cl.cam.ac.uk/~pz215/) who assigned
Licence: GPL 2 Date: 03.12.2005.

The script was reworked to replace the existing fvwm‐menu‐
desktop perl script by the fvwm‐workers.

The script is distributed by the same terms as fvwm itself.
See GNU General Public License for details.