FvwmProxy(1)

✨ FvwmProxy(1) β€” Fvwm Modules πŸ’–

Okay bestie, let's get into FvwmProxy(1) πŸ¦‹ (it's the fvwm proxy module, and yes, it's giving main character energy πŸ’…).

🌸 NAME

FvwmProxy - the fvwm proxy module πŸŽ€

🧚 SYNOPSIS

Okay so FvwmProxy is spawned by fvwm, which means no command line invocation will work 😭 don't even try it, bestie.

πŸ’œ DESCRIPTION

Okay so FvwmProxy lets you find and control windows that are hiding behind other windows πŸ‘€ It does this with small, non-overlapping proxy windows πŸ¦‹ The default vibe includes raising and lowering the proxied windows, and that's it, no cap πŸ’…

Using the sample config, pressing Alt-Tab cycles through the windows and lets you use assignable click actions on the proxies ✨ Releasing the Alt key deactivates the proxy windows 🫢 By default, pressing the left or right mouse buttons on a proxy window raises or lowers the associated proxied window, respectively πŸ”₯ There's also an extra mapping where the proxies automatically pop up just by holding the Alt key, which is lowkey iconic 🌈

Proxy windows are always on top, and they try to center on the regular window they proxy 🌸 There's a simple collision algorithm that nudges the proxy windows around so they don't overlap, and honestly, it's so satisfying πŸ₯Ήβœ¨

πŸ‘‘ COPYRIGHTS

The FvwmProxy program is original work by Jason Weber πŸ’–

Copyright 2002, Jason Weber. No guarantees or warranties or anything are provided or implied in any way whatsoever. Use this program at your own risk πŸ’€ I'm not saying it's dangerous, I'm just saying read the fine print, bestie πŸ™ˆ

πŸ“ INVOCATION

Okay so FvwmProxy can be invoked by putting the line Module FvwmProxy in your .fvwm2rc file πŸŽ€ That line can sit on its own if you want FvwmProxy spawned during fvwm's initialization, or you can bind it to a menu, mouse button, or keystroke to invoke it later on ✨ Fvwm will search the directory specified in the ModulePath configuration option to try to find FvwmProxy 🧚

Part 1 of 3 β€” more coming, so stay tuned, bestie πŸ’œ

✨ CONFIGURATION OPTIONS ✨

okay so this is where the real styling happens πŸ’… every line starts with *FvwmProxy: and the bold part is the setting, the rest is what it does. let's go 🫢


  • *FvwmProxy: Colorset n 🎨 β€” this picks the color theme for unselected proxy windows, so the everyday look πŸ’–
  • *FvwmProxy: SelectColorset n ✨ β€” this is the color theme for the selected proxy window, the main character of the moment πŸ‘‘
  • *FvwmProxy: IconifiedColorset n 🧊 β€” this is the color theme for proxies of iconified windows. it only matters if ProxyIconified is on, so keep that in mind πŸ™ˆ

  • *FvwmProxy: Font font πŸ”€ β€” the font for the big proxy text. this usually holds the icon string and sits nearly vertically centered πŸŽ€ if there's no icon string, it uses the title bar string instead. if the text is too wide it gets cropped on the right βœ‚οΈ and if you don't set a Font, a default steps in 🌸
  • *FvwmProxy: SmallFont font πŸ”‘ β€” the font for the little auxiliary text. this usually has the title bar string, but it gets skipped if it matches the icon string and that text wasn't cropped. it's drawn near the bottom, so go for the smallest font that's still legible πŸ¦‹ if the text is too wide it gets cropped on the left, and if you don't set a SmallFont, this text never shows up at all πŸ’€

  • *FvwmProxy: Width w πŸ“ β€” the size in X of each proxy window. the default is 180 πŸ’–
  • *FvwmProxy: Height h πŸ“ β€” the size in Y of each proxy window. the default is 60 🌈
  • *FvwmProxy: Separation d 🧚 β€” the minimum distance between proxy windows when they're adjusting for collisions. the default is 10 🫧
  • *FvwmProxy: ShowMiniIcons bool πŸ–ΌοΈ β€” if true, proxies show the mini icon of the window they represent, as long as that window actually has one. the default is true ✨
  • *FvwmProxy: EnterSelect bool πŸ–±οΈ β€” if true, a proxy gets selected just by hovering over it, even with no mouse buttons pressed. the default is false πŸ™…β€β™€οΈ

  • *FvwmProxy: ProxyMove bool 🚚 β€” if true, moving a proxy window also moves the window it represents. the default is false πŸ’…
ngl this one has a catch 😭 the proxied window doesn't recognize snap effects during this operation, so it won't snap along with it.
  • *FvwmProxy: ProxyIconified bool πŸͺ„ β€” if true, proxies keep showing up even when their windows are iconified. bonus tip from the original: add click actions that Iconify on and off, like on the middle mouse button πŸ–±οΈ the default is false 🫢
  • *FvwmProxy: ShowOnly mode πŸ‘€ β€” this limits which proxies show up during the Show action. the supported modes are Selected, Covered, Grouped, and All. the default is All, which shows every proxy on the current desk 🌍
    • Selected only shows the proxy for the selected window. if nothing is selected, the currently focused window counts as the select window for ShowOnly filtering 🎯
    • Covered is Selected plus any proxies that overlap the select real window 🫣
    • Grouped is Covered plus proxies in the same window group as the selected window πŸ‘―β€β™€οΈ
    • in every mode, iconified proxies never appear if ProxyIconified is false πŸ™ˆ
    • heads up: using just Selected can leave you with untouchable proxies that vanish before you can reach them, which is why Covered exists 😭

  • *FvwmProxy: Action mouseaction response πŸ–±οΈ β€” tells FvwmProxy to do the response you pick whenever the given mouse action happens. the supported mouse actions are Click1, Click2, Click3, and so on, one for each button πŸ”˜ by default the module handles 3 mouse buttons, but it can be compiled to handle more πŸ› οΈ the default responses are Raise for Click1, Nop for Click2, and Lower for Click3 πŸŽ€
  • *FvwmProxy: Action Select command 🎯 β€” picks an fvwm function to run during a FvwmProxy Hide command, for the window whose proxy was selected. the default is WindowListFunc, which the fvwm install already predefines. you can replace it, add to it, or bring in a totally independent function πŸ’–
  • *FvwmProxy: Action Show command 🌀️ β€” picks an fvwm function to run during a FvwmProxy Show command. the default is Nop 😌
  • *FvwmProxy: Action Hide command πŸŒ™ β€” picks an fvwm function to run during a FvwmProxy Hide command. the default is Nop 😌
  • *FvwmProxy: Action Abort command πŸ›‘ β€” picks an fvwm function to run during a FvwmProxy Abort command. the default is Nop 😌
  • *FvwmProxy: Action Mark command πŸ”– β€” picks an fvwm function to run on a window right after it gets marked. the default is Nop 😌
  • *FvwmProxy: Action Unmark command πŸ“Œ β€” picks an fvwm function to run on a marked window just after another window takes the mark. the default is Nop 😌
  • *FvwmProxy: Action ModifierRelease modifiers command ⌨️ β€” picks an fvwm function to run while proxies are showing and the specified modifiers are all released. the modifiers use the same syntax as the Mouse command 🫢 the default is Nop 😌

  • *FvwmProxy: Group groupname command pattern πŸ‘― β€” for the named group, this adjusts whether windows matching the pattern are included. the groupname is just a string you use to link windows together πŸ”— the window pattern uses the same format as the Style command πŸŽ€ the supported commands are Include, SoftInclude, WeakInclude, WeakSoftInclude, and Exclude. here's the tea 🍡
    • the ones ending in Include add windows to the group πŸ’–
    • Exclude counteracts an inclusion pattern or auto-inclusion (see the flags below) 🚫 all exclusion checks run after all the inclusion checks, so exclusion always gets the final word πŸ‘‘
    • soft inclusion means those windows only move when a non-soft window in the group moves 🫧 moving or resizing them doesn't affect any other windows, and they're immune to edge effects πŸ›‘οΈ soft inclusion also affects provocation effects (see below) 🌸
    • weak inclusion stops a window from being included purely by name πŸ™…β€β™€οΈ it relies on X11 leader or process ID matching instead. weakly included names won't start a group, but they can join one in the same known process or with the same leader 🀝 once they've joined, the name is only used to figure out whether the inclusion is soft πŸ¦‹
  • *FvwmProxy: Group groupname flag πŸ³οΈβ€πŸŒˆ β€” for the named group, this turns on the given flag. the supported flags are AutoInclude, AutoSoft, and IgnoreIDs ✨ by default, all window grouping only groups windows in the same process or with the same X11 client leader. IgnoreIDs turns that check off πŸ™ƒ AutoInclude automatically includes any window that matches the same process or client leader, so you don't have to name them one by one 🫢 AutoSoft makes all AutoInclusions soft (see the inclusion description above) 🧸
  • *FvwmProxy: Group groupname provocation pattern πŸ’₯ β€” the provocation flags let you decide whether grouped windows set off each other when you raise or lower one, move to another desk, drag windows together, or change iconification πŸ‘€ the compound flag looks like (No|Inherit)(Hard|Soft)(Raise|Desk|Drag|Icon|All). the pattern is optional and should already have been included, and it limits the change to just that part of the group 🎯
    • the first element is optional. it can switch the effect off, or, when there's a pattern, it can inherit the setting for the group dynamically πŸ”„ the default is to turn the effect on πŸ’‘
    • the second element lets you apply the change only to windows whose soft state is on or off 🫧 the default is to change both πŸ’–
    • the third element picks which provoking effect you're changing: window raise/lower, moving to another desk, dragging windows together, toggling iconification, or all of them 🎭
    • if either the provoking window or a potentially provoked window has an effect turned off, the provocation just doesn't happen 🚫

  • *FvwmProxy: SlotWidth w 🧩 β€” the width of the icons used in slots. the default is 16 πŸ“
  • *FvwmProxy: SlotHeight h πŸ“ β€” the height of the icons used in slots. the default is 16 πŸ“
  • *FvwmProxy: SlotSpace d 🫧 β€” the space between icons used in slots. the default is 4 ✨
  • *FvwmProxy: GroupSlot n 🌈 β€” the first slot that represents a colored group. group slots don't need icons, since they get drawn by predetermined means 🎨 the default is 2 πŸ’–
  • *FvwmProxy: GroupCount n πŸ”’ β€” the number of group slots. the default is 6 πŸ‘‘
  • *FvwmProxy: SlotStyle n style πŸ’… β€” for non-group slots, this defines the appearance of the indicated slot. the style format matches the ButtonStyle command πŸŽ€ the default is nothing πŸ«₯
  • *FvwmProxy: SlotAction n mouseaction response πŸ–±οΈ β€” for non-group slots, this defines how the indicated slot behaves. the mouse action and response work exactly like the FvwmProxy Action configuration 🫢 the default is Nop 😌
  • *FvwmProxy: UndoLimit n βͺ β€” the number of entries in the undo buffer, which also limits how far back you can undo πŸ™ƒ the default is 8 πŸ¦‹

✨ COMMANDS ✨

πŸ¦‹ SendToModule FvwmProxy Show

Okay so this one activates proxy windows for every window on the current desk that doesn't use the WindowListSkip option πŸ’… If you switch desks, new proxies are automatically generated for you ✨

🌸 SendToModule FvwmProxy Hide

This one deactivates all proxy windows πŸ™ˆ But if a proxy is selected (like with Next and Prev), the Select Action gets called on the window that proxy represents. The default action is raising that window and warping the mouse to a spot over it 🫢

πŸ“ SendToModule FvwmProxy ShowToggle

If it's shown, hide it. If it's hidden, show it πŸ”₯

πŸ’€ SendToModule FvwmProxy Abort

Deactivates all proxy windows too, but unlike Hide, no action gets taken on any selected window. Totally different energy πŸ’œ

🧚 SendToModule FvwmProxy Circulate command

This tells FvwmProxy to run a conditional command and mark the result. The embedded command SendToModule FvwmProxy Mark is automatically appended after the optional condition, so supplying your own embedded command will probably fail 😭

🚨 Heads up, bestie: because SendToModule FvwmProxy Mark gets tacked on automatically, adding your own embedded command will probably fail.

An example argument to Circulate is ScanForWindow East South (CurrentPage). If the proxies aren't already shown (like with the Show command), any Circulate command will automatically show the proxies πŸ¦‹

πŸ‘‘ SendToModule FvwmProxy Next (obsolete)

⚠️ This one is obsolete, so it's giving old-school vibes πŸ•°οΈ

If a proxy window is selected, the next proxy gets selected. Windows with the WindowListSkip option get ignored. The proxies are sorted left to right during the Show command. If no proxy is currently selected, but a proxy on this desk was selected on a recent show, that proxy gets selected. If no proxy on this desk was recently selected, the leftmost proxy is used. This nearly duplicates the functionality of Circulate ScanForWindow East South (CurrentPage) ✨

🌈 SendToModule FvwmProxy Prev (obsolete)

⚠️ Also obsolete, so keep that in mind πŸ’€

If a proxy window is selected, the previous proxy gets selected. The starting point is the same as with the Next command, except that with no recent selection, the rightmost proxy is chosen instead. This nearly duplicates the functionality of Circulate ScanForWindow West North (CurrentPage) 🌈

πŸŽ€ SendToModule FvwmProxy SoftToggle

This toggles the soft group inclusion setting for the selected window. It's the same setting you can activate using the SoftInclude and AutoSoft commands inside the FvwmProxy Group configuration πŸŽ€

🫧 SendToModule FvwmProxy IsolateToggle

This toggles the isolation setting for the selected window's group. Isolated groups only let one member be un-iconified at a time 🫧 The members also get coerced to the same position and size, constrained by their size increment.

🌟 SendToModule FvwmProxy PrevIsolated

If you're focused on a member of an isolating group, this deiconifies the member higher on the list. If no member is higher, it deiconifies the last member ⭐

πŸ’« SendToModule FvwmProxy NextIsolated

If you're focused on a member of an isolating group, this deiconifies the member lower on the list. If no member is higher, it deiconifies the first member πŸ’«

↩️ SendToModule FvwmProxy Undo

This attempts to undo the last window move and/or resize πŸ™ˆ

β†ͺ️ SendToModule FvwmProxy Redo

This attempts to redo the most recent Undo. If another move or resize happens after the previous undo, the redo buffer gets cleared 🧹


πŸŽ€ SAMPLE CONFIGURATION πŸŽ€

The following are excerpts from a .fvwm2rc file that describe FvwmProxy initialization commands πŸ’–

Key Tab A M SendToModule FvwmProxy Circulate \
    ScanForWindow East South (CurrentPage)
Key Tab A SM SendToModule FvwmProxy Circulate \
    ScanForWindow West North (CurrentPage)

*FvwmProxy: Action ModifierRelease M SendToModule FvwmProxy Hide

But Meta-Shift-Tab can be awkward, so Meta-Q may be a better alternative 🫢

Key Q A M SendToModule FvwmProxy Circulate \
    ScanForWindow West North (CurrentPage)

You might consider adding !Sticky to the (CurrentPage) conditional if you use Sticky for low-interactivity programs, like load meters and music players 🎡

To have the proxies immediately pop up when you hold the Alt key, add πŸ‘€

Key Meta_L A N SendToModule FvwmProxy Show

If that's too intrusive, you can assign Alt-Esc to switch the proxies on and off by adding πŸ¦‹

Key Escape A M SendToModule FvwmProxy ShowToggle
🚨 Some platforms have problems where general Alt key combinations become otherwise dysfunctional after defining these mappings. If this happens, it might be difficult to take full advantage of this module 😭

To have the mouse jump to the center instead of the upper left corner, try adding 🎯

AddToFunc WindowListFunc
+ I WarpToWindow 50 50

or just make your own list function from scratch, for example 🧚

DestroyFunc WindowListFunc
AddToFunc WindowListFunc
+ I WindowId $[w.id] Raise
+ I WindowId $[w.id] WarpToWindow 50 50

Note that the default configuration does not activate any Next/Prev operations for Alt-Tab, since that sequence is, by default, used by another module. Adding appropriate key mappings to your .fvwm2rc will switch this responsibility over to FvwmProxy πŸ”

If you use ProxyIconified, you might consider adding Iconify actions 🌈

AddToFunc WindowListFunc
+ I WindowId $[w.id] Iconify Off

AddToFunc Raise-and-Deiconify
+ I WindowId $[w.id] Raise
+ I WindowId $[w.id] Iconify Off

*FvwmProxy: Action Click1 Raise-and-Deiconify
*FvwmProxy: Action Click2 Iconify

You can set up some basic slots pretty easily πŸ“

*FvwmProxy: GroupSlot 2
*FvwmProxy: GroupCount 5

*FvwmProxy: SlotStyle 1 MiniIcon
*FvwmProxy: SlotStyle 7 Pixmap "squeeze.xpm"
*FvwmProxy: SlotStyle 8 Pixmap "mini-up.xpm"
*FvwmProxy: SlotStyle 9 Pixmap "mini-bball.xpm"
*FvwmProxy: SlotStyle 10 Pixmap "mini-cross.xpm"

*FvwmProxy: SlotAction 1 Click1 Popup WindowMenu
*FvwmProxy: SlotAction 7 Click1 SendToModule FvwmProxy IsolateToggle
*FvwmProxy: SlotAction 8 Click1 SendToModule FvwmProxy SoftToggle
*FvwmProxy: SlotAction 9 Click1 Iconify
*FvwmProxy: SlotAction 10 Click1 Delete

In this example, WindowMenu is something you would have to define yourself. If your proxy width is too small, some slots can get cut off πŸ™ˆ

Undo and redo can be easily mapped to any keys ↩️

Key Z A 3 SendToModule FvwmProxy Undo
Key R A 3 SendToModule FvwmProxy Redo

You can rotate through an isolated group using any keys. For example, meta cursor-up and cursor-down could traverse the group πŸ”„

Key Up A 3 SendToModule FvwmProxy PrevIsolated
Key Down A 3 SendToModule FvwmProxy NextIsolated

A somewhat impractical example of a group definition using GIMP is as follows 🎨

*FvwmProxy: Group "GIMP" Include "The GIMP"
*FvwmProxy: Group "GIMP" Include "Module Manager"
*FvwmProxy: Group "GIMP" SoftInclude "Unit Editor"
*FvwmProxy: Group "GIMP" AutoInclude
*FvwmProxy: Group "GIMP" AutoSoft
*FvwmProxy: Group "GIMP" Exclude "Preferences"

This sets up a hard attachment between the windows "The GIMP" and "Module Manager". The "Unit Editor" is also in the group, but it only responds to movement of one of the hard inclusions. Any window in the same process or with the same client leader is also associated, but they default to soft inclusion, except "Preferences", which is explicitly excluded 🫢

Note that in this case, the explicit soft inclusion of "Unit Editor" is redundant with the combination of AutoInclude and AutoSoft. However, if AutoSoft was not specified, the explicit SoftInclude would distinguish that pattern from the otherwise hard inclusion under just AutoInclude πŸ’…

🫢 AUTHOR 🫢

Jason Weber πŸ’œ


Okay bestie, that's the whole thing! πŸŽ‰ This page was written up for FvwmProxy version 2.7.0, from the 3rd Berkeley Distribution, dated 19 October 2022, and it lives on as FvwmProxy(1) 🌸✨ Slay the window manager, periodt πŸ’–πŸ¦‹