FVWM3-MENU-DESKTOP(1)

πŸ’– FVWM3-MENU-DESKTOP πŸ’– (the fvwm3-menu-desktop(1) manual, bestie)


🌸 NAME 🌸

fvwm3-menu-desktop β€” reads XDG menu files and creates Fvwm menus πŸŽ€


✨ SYNOPSIS ✨

fvwm3-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 ]

πŸ¦‹ DESCRIPTION πŸ¦‹

Okay so this is a python script, right? And what it does is it parses XDG menu definitions and builds the matching fvwm menus out of them. Iconic behavior fr fr. Just know that it depends on python-xdg to actually run β€” no python-xdg, no menu magic πŸ’…


πŸ‘‘ MAIN OPTIONS πŸ‘‘

  • --help β€” shows you the help and then dips. Bye! πŸ‘‹
  • --version β€” shows the version and exits. Periodt.
  • --get-menus all|desktop β€” prints a space separated list of full menu paths it found on your system. all prints every menu on the system except the empty ones. desktop prints the menu(s) that would be generated by the script. Heads up bestie: no menu generation is done when you use this. It's just a lil peek πŸ‘€
  • --desktop NAME β€” optional parameter that sets the NAME of the desktop XDG .menu file(s) to use. This overrides any default menus you set via FvwmForm-XDGMenu-Config, and it makes the script go find menus where NAME is part of the file name. Possible names include: gnome, kde, xfce, lxde, debian, etc. You can run this together with --menu-type to control which .menu file(s) get used πŸŽ€
  • --menu-type NAME β€” optional parameter that sets the NAME of the XDG menu type to use. This overrides any default menus set via FvwmForm-XDGMenu-Config and makes the script find menus where NAME is part of the file name. Possible NAME types could be: applications, settings, preferences, etc. When you use it with --desktop, only menus whose file name matches 'destkop*menutype' are found. And if no menus are found? The script exits with an error, sorry babe 😭
  • --all-menus β€” builds all the menus found on the system. If you pair it with --desktop or --menu-type, it builds all the menus matching those settings. Greedy in the best way πŸ’…
  • --install-prefix DIR β€” optional parameter that overrides the standard locations for XDG menu definitions. It tells fvwm3-menu-desktop to look in DIR for .menu files instead of the standard locations /etc/xdg/menus (and $HOME/.config/menus if it exists) πŸ—‚οΈ
  • --with-titles|-w β€” if this is set, menus are generated with titles. This is the default. You can use it to override the FvwmForm-XDGMenu-Config default setting πŸ‘‘
  • --without-titles β€” if this is set, menus are generated without titles. The default is to generate with titles, so this is your "actually, no titles" button.
  • --title|-t NAME β€” define the menu title NAME of the top menu used by Fvwm's Menu or Popup commands. Default is "XDGMenu" ✨
  • --include-items NAME β€” controls whether the extra menu items 'Regenerate' and 'Configure' get included in the top level menu. NAME can be one of regenerate, config, both, or none. Default is both.
  • --regen-cmd CMD β€” sets the fvwm command CMD that runs when you pick the 'Regenerate' menu item. Default is "PipeRead fvwm3-menu-desktop".
  • --term-cmd CMD β€” sets the terminal emulator command CMD that's used to run terminal applications in. CMD needs to end with an execute option, like xterm's -e option, which will run the command that gets appended to CMD. Default is "xterm -e". πŸ‘‰ Debian specific: per Debian policy, the default is changed to "x-terminal-emulator -e".
  • --dynamic β€” use this one when you're creating dynamic menus with DynamicPopUpAction and DynamicPopDownAction. It adds a 'recreate' to the DestroyMenu command on the top level menu so those actions don't get Destroyed when the menu regenerates. Keep your dynamic actions alive, periodt πŸ”₯
  • --insert-in-menu NAME β€” inserts the generated menu(s) IN a menu NAME (its top title). This makes it so the top level menu is not Destroyed and the items get added to the end. > ⚠️ Heads up: 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 you 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 the --desktop|--menu-type settings.
  • --menu-error|-e β€” 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 πŸ›
  • --verbose β€” enables additional information printouts on STDERR. For the girlies who need to see everything πŸ”

πŸŽ€ ICONS OPTIONS πŸŽ€

By default, fvwm3-menu-desktop builds menus without mini-icons. To turn mini-icons on, use the options below πŸ‘‡

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's still too slow using icons, see EXAMPLES for ways to limit how often the menu gets generated to speed things up.

  • --enable-mini-icons β€” turns mini-icons on 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 you specify with the --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 icon theme used. Default is gnome, but all the 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. iykyk 🎨
  • --size|-s NUM β€” if --enable-mini-icons is used, the size of the icons can be changed with this parameter. Default is 24.
  • --mini-icon-dir DIR β€” when a mini-icon of the right size isn't available, fvwm3-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'.

🌈 USAGE 🌈

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

fvwm3-menu-desktop --get-menus all

If no menus are found, you might just 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 to search for menus.

Through some combination of command line options and the FvwmForm-XDGMenu-Config settings, fvwm3-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 fvwm3-menu-desktop was run with no options:

fvwm3-menu-desktop --get-menus desktop

fvwm3-menu-desktop determines which menu(s) to generate like this πŸ‘‡

  • If no config file is found, all menus will be weighted and the script will generate the best (highest weight) menu found. Winner winner πŸ†
  • If a config file is found (and override options are not used), the script will generate all menus selected in FvwmForm-XDGMenu-Config.
  • --desktop, --menu-type, --set-menus and --all-menus will override any menus selected in FvwmForm-XDGMenu-Config.
  • --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 generated.
  • --set-menus generates menus from the list of full path menu file names.
  • --all-menus by itself will generate all menus found.

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

PipeRead 'fvwm3-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

fvwm3-menu-desktop can be configured through both command line options and a FvwmForm GUI to customize the menu(s) that get generated πŸ’…


🧚 GUI 🧚

FvwmForm-XDGMenu-Config is a FvwmForm interface you can use to configure the defaults for fvwm3-menu-desktop. You can access it from the "Configure" item in the top level menu that gets generated, or run the following from within FvwmCommand or FvwmPrompt:

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 fvwm3-menu-desktop will parse for defaults when it runs 🫢

See the help inside of FvwmForm-XDGMenu-Config for more information.

✨ EXAMPLES ✨

okay bestie, here's the tea on how people actually set this up πŸ«– there are sooo many ways to make fvwm run fvwm3-menu-desktop and generate your menu, so let's go through the hits.

Method one: generate it once at startup and vibe. You just generate the menu when fvwm loads, and then use the GUI config tool to change whatever options you want. All you gotta add to your fvwm config file is this:

AddToMenu MenuFvwmRoot "XDG Menu" Popup XDGMenu PipeRead
'fvwm3-menu-desktop'

so the menu gets created once, when fvwm loads. πŸŽ€ and yeah, lowkey, menu creation can sometimes be slow, which means fvwm might take longer to load than you'd like. sorry bestie 😭

and because the menu is only generated when fvwm starts, if you install or remove software you're gonna have to pick the 'Regenerate' option to rebuild the menu. no cap.


Method two: the speedrun β€” write it to a file. 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 that, use --regen-cmd to call a custom function and write the menu to a file with a command like:

fvwm3-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 'fvwm3-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

Method three: slide into an existing menu. besides creating a top level menu, fvwm3-menu-desktop can insert the menu into an existing menu using the --insert-in-menu option. for example, you 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 'fvwm3-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. πŸŒ€

but here's the problem bestie: you have to restart fvwm or rebuild the whole menu to Regenerate it, because menu items cannot be removed. it's giving one-way street πŸ’€

to do that, 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 'fvwm3-menu-desktop --insert-in-menu MenuFvwmRoot \
    --regen-cmd XDGRegen'

Method four: dynamic menus, main character energy. πŸ‘‘ 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, you could create the menu XDGMenu when it is opened using:

AddToMenu XDGMenu "XDGMenu" Title
+ DynamicPopUpAction PipeRead 'fvwm3-menu-desktop'

this will create the menu when it is opened. one issue here is that 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, use the --dynamic option:

AddToMenu XDGMenu "XDGMenu" Title
+ DynamicPopUpAction PipeRead 'fvwm3-menu-desktop \
    --dynamic --include-items config'
+ DynamicPopDownAction DestroyMenu recreate XDGMenu

this will now Destroy the menu when it's closed so it can be rebuilt the next time it is opened. the recreate flag doesn't completely destroy the menu β€” it keeps the DynamicPopUpAction and DynamicPopDownAction actions alive. and the --dynamic flag includes the recreate option in the generated menus. slay πŸ’…


Method five: insert AND stay dynamic. to insert a menu into MenuFvwmRoot and still be dynamic, you need to use a function that generates the whole menu. for example:

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 `fvwm3-menu-desktop --insert-in-menu MenuFvwmRoot \
    --include-items config`

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

periodt. 🌈


πŸ› BUGS πŸ›

ngl, the whole process of creating menus from files is slow. 😭 otherwise, report bugs to the fvwm-workers mailing list fvwm-workers@fvwm.org.


πŸ‘‘ AUTHORS πŸ‘‘

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 and Date: 03.12.2005. πŸŽ€

the script was reworked to replace the existing fvwm3-menu-desktop perl script by the fvwm-workers. iconic behavior fr fr πŸ’–


🫢 COPYING 🫢

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


and that's a wrap bestie!! ✨ this was FVWM3-MENU-DESKTOP(1), dated 2026-07-31 β€” go forth and make your menu gorgeous, you absolute icon πŸ¦‹πŸ’œ

πŸ“¦ where this page comes from