Directory listing for: someodd/opensource/window_maker_rofi_window_switcher
DIR Parent directory (..)
TEXT README.txt (4.7KB, 2026-05-20):
window_maker_rofi_window_switcher
=================================
A rofi window switcher that actually shows minimized windows
under Window Maker.
What this is
------------
`rofi -show window` is a lovely Alt-Tab replacement -- until you run
it under Window Maker, where it silently omits every minimized
(iconified) window. The windows you most want to dig back up are
exactly the ones it hides.
`rofi-windows` is a small bash script that replaces rofi's native
window mode. It drives the list from wmctrl instead of rofi's own
EWMH walk, so minimized windows show up like everything else. It
also cleans up the cosmetics rofi's mode gave you for free: icons,
sane ordering, and tidy labels.
Why rofi's own mode fails here
------------------------------
Two things, found by poking at the live X server:
1. Window Maker never sets _NET_WM_NAME on its
_NET_SUPPORTING_WM_CHECK window, so rofi prints "No window
manager detected" and drops into a degraded code path.
2. WMaker flags iconified windows _NET_WM_STATE_HIDDEN +
_NET_WM_STATE_SKIP_PAGER, and rofi's window mode treats them
as not-listable.
The good news: those windows DO stay in _NET_CLIENT_LIST and do NOT
carry _NET_WM_STATE_SKIP_TASKBAR -- so wmctrl and xdotool see them
perfectly. This script just leans on those two tools instead.
(You can paper over problem 1 by stamping the name yourself:
chk=$(xprop -root _NET_SUPPORTING_WM_CHECK | grep -o '0x[0-9a-f]*')
xprop -id "$chk" -f _NET_WM_NAME 8u -set _NET_WM_NAME "Window Maker"
run from your WMaker autostart. In testing that alone didn't make
rofi's native mode list minimized windows reliably, which is why
this script exists.)
What it does better than `wmctrl -l | rofi -dmenu`
--------------------------------------------------
- clean labels: no hex window id, desktop number, or hostname
- filters out WMaker's internal / dockapp windows (empty titles)
- per-app icons pulled from WM_CLASS
- most-recently-used order (reverse stacking); the currently
focused window is excluded, so pressing Enter on the default
row jumps to your previous window, just like Alt-Tab
- off-desktop windows are tagged [->N] (other workspace) or
[all] (sticky) so you know the pick will move you
- selection is mapped by list index, so duplicate titles (hello,
twelve Firefox windows) are never ambiguous
- reliable de-iconify via `xdotool windowmap` + `windowactivate`,
with a `wmctrl` fallback
Requirements
------------
rofi wmctrl xdotool xprop
Optional: an icon theme with app icons (Papirus is assumed by the
icon map, but any theme works -- missing icons just render blank),
and notify-send for the "no other windows" message.
On Debian/Ubuntu:
sudo apt install rofi wmctrl xdotool x11-utils
Setup
-----
Drop the script somewhere on your PATH and make it executable:
install -Dm755 rofi-windows ~/.local/bin/rofi-windows
Then bind a key to it. In Window Maker, edit
~/GNUstep/Defaults/WMRootMenu and add (or repoint your existing
"Rofi Window" entry):
("Windows", SHORTCUT, "Mod4+Tab", EXEC,
"/home/YOU/.local/bin/rofi-windows"),
WMaker's EXEC runs under /bin/sh and won't expand ~, so use an
absolute path. Restart Window Maker to reload the menu.
Not on Window Maker? Any launcher works. With xbindkeys, in
~/.xbindkeysrc:
"~/.local/bin/rofi-windows"
Mod4 + Tab
Using it
--------
Hit your key. Type to filter -- matching runs over the window title
AND the WM_CLASS, so "firefox" or "thunar" narrows things even when
titles collide. Enter raises the selected window (un-minimizing and
switching workspace as needed). Escape does nothing.
Customizing
-----------
Icon names come from WM_CLASS via the `icon_for` function near the
top. If an app's icon doesn't resolve, add a case for it there --
left side is the lowercased class (the part after the dot in
`xprop WM_CLASS`), right side is an icon name in your theme.
Icon size is set with the `-theme-str 'element-icon { size: 1.4em; }'`
line at the bottom; bump it to taste.
To list every window including the focused one, remove the
`(( dec == active_dec )) && continue` line.
How it works
------------
- `wmctrl -l -x` enumerates every window with its WM_CLASS
- the row order follows _NET_CLIENT_LIST_STACKING reversed (top of
the stack = most recently raised = first in the list)
- rows are fed to `rofi -dmenu` using its row protocol (NUL +
0x1f field separators) to attach icons and hidden search meta
- `rofi -format i` returns the chosen row's index, which maps back
to a window id with zero title-parsing ambiguity
- `xdotool windowmap` un-iconifies, `windowactivate` raises and
focuses (switching workspace if the window lives elsewhere)
No warranty, do whatever you like with it.
BIN rofi-windows 3.5KB 2026-05-20