FVWMMFL(1)

✨ FVWMMFL(1) β€” FvwmMFL ✨

okay bestie, gather round, because this is the Fvwm3 front-loader module and it's genuinely one of the most fun little gremlins in the whole Fvwm family πŸ’– (that's the Fvwm Modules section of the manual, and the page you're reading is literally called FVWMMFL(1), iykyk).


🌸 NAME 🌸

FvwmMFL β€” the Fvwm3 front-loader module. that's it, that's the name, she's iconic πŸ‘‘


πŸŽ€ SYNOPSIS πŸŽ€

FvwmMFL can only be invoked by Fvwm3. Command line invocation of the
FvwmMFL will not work.

This module has no command-line options.

so basically no cap: you cannot just roll up to a terminal and run this yourself. FvwmMFL can only be invoked by Fvwm3, and trying to launch it from a command line is just not gonna work, fr fr. also β€” this module has no command-line options. zero. none. no flags to memorise, no --help to poke at. it's giving low-maintenance πŸ’…


πŸ¦‹ DESCRIPTION πŸ¦‹

so what does FvwmMFL actually do? it hands you access to Fvwm events over a unix-domain socket ✨ and the whole point of that is to let externally-written programs β€” we call them clients β€” receive information from Fvwm and then do something about that event. main character energy, honestly.

the info coming out of Fvwm3 arrives in the form of JSON packets. every packet has different fields depending on the type you asked for β€” so no two packets are identical, they're all a little ✨unique✨ like that.


πŸ’œ COMMUNICATION πŸ’œ

the default unix-domain socket for FvwmMFL is:

$TMPDIR/fvwmmfl/fvwm_mfl_$DISPLAY.sock

want to move it somewhere else? sure, slay. you can change the path where fvwm_mfl_$DISPLAY.sock gets created by setting the FVWMMFL_SOCKET_PATH environment variable 🫢 and FvwmMFL will create it if it doesn't already exist, and set relevant permissions. she's organised like that.


πŸ“ REGISTERING INTEREST πŸ“

okay so here's the fun part β€” you can send commands to FvwmMFL to control which information gets sent to the client, and the command that does all that work is set πŸ’– the table below (turned into a cute little list because we're being girlies today) shows every event you can subscribe to:

  • new_window β€” Fired when a new window is mapped and visible.
  • map β€” Fired when a window is mapped.
  • configure_window β€” Fired when a window is moved or resized.
  • destroy_window β€” Fired when a window is closed.
  • new_page β€” Fired when a new page is switched to.
  • new_desk β€” Fired when a new desk is switched to.
  • raise_window β€” Fired when a window is raised (or changes layer).
  • lower_window β€” Fired when a window is lowered (or changed layer).
  • focus_change β€” Fired when a window loses/gains focus.
  • enter_window β€” Fired when a window has the pointer moved into it.
  • leave_Window β€” Fired when a window has pointer moved out of it.
  • window_shade β€” Fired when a window is shaded.
  • window_unshade β€” Fired when a window is unshaded.
  • window_name β€” Fired when the window name changes.
  • visible_name β€” Fired when the visible window name changes.
  • res_class β€” Fired when the class of the window is set.
  • res_name β€” Fired when the resource of the window is set.
  • iconify β€” Fired when a window is iconified.
  • deiconify β€” Fired when a window is deiconified.
  • icon_name β€” Fired when the icon name changes.
  • visible_icon_name β€” Fired when the icon's visible name changes.
  • icon_file β€” Fired when the path to the icon changes.
  • icon_location β€” Fired when the icon location changes.
  • restack β€” Fired when the window stacking order changes.
  • echo β€” Fired when Fvwm receives an Echo command.

(and yes, leave_Window really does have that capital W β€” we respect the original's choices here πŸ™ˆ)

so say you want to register an interest in new_window and focus_change β€” you'd send these commands via the socket:

set new_window
set focus_change

and when you're done with an event and want to βœ‚οΈ cut it loose, you use the unset command:

unset focus_change

periodt πŸ’…


🌈 JSON FORMAT 🌈

every packet sent to a client is in plain JSON. the information inside each packet varies depending on the event β€” so yeah, it shifts, deal with it πŸ’–

TODO: document each JSON structure.

(not me leaving the TODO exactly where it was β€” bestie, I'm not about to invent lore that isn't in the original 😭)


⭐ EXAMPLE ⭐

here's how you'd monitor for focus_change events at the shell, printing out the JSON that comes back:

      echo set focus_change | nc -U /tmp/fvwm_mfl.sock 2>&1 | jq --unbuffered

Outputs:

  { "focus_change": { "window": "0x5400022", "type": 0, "hilight": {
  "text_colour": 16777215, "bg_colour": 32767 } } }

look at that output. gorgeous. obsessed. πŸ₯°


πŸ‘‘ AUTHORS πŸ‘‘

this module first appeared in 2020. babygirl is still young, still thriving πŸ’–


and that's the whole page, bestie β€” from $TMPDIR/fvwmmfl/fvwm_mfl_$DISPLAY.sock all the way to the JSON, you now know FvwmMFL better than half the internet. go forth and subscribe to some events πŸŒΈπŸ¦‹

this was the FVWMMFL(1) page from the Fvwm Modules manual, dated 2026-07-31 β€” sending you love and a working socket πŸ’œβœŒοΈ

πŸ“¦ where this page comes from