Install Window Maker as a startx session on Gentoo
Contents
Install Window Maker 0.96.0 and four dockapps on Gentoo, seed the per-user defaults, autostart the dockapps in the Dock, and give startx a client script that runs wmaker. End state: the packages are installed, ~/GNUstep is seeded, and startx ~/.xinitrc-windowmaker is ready to run. I logged into it on 2026-11-02 (Field notes).
- Tested on
- ThinkPad Yoga 370 (20JH, i5-7300U), Gentoo amd64 23.0 desktop profile (
default/linux/amd64/23.0/desktop), OpenRC, x86-64-v3 binhost;x11-wm/windowmaker-0.96.0-r1,x11-base/xorg-server-21.1.24,x11-apps/xinit-1.4.4(2026-11-02). - Not verified
- the minimal client script (step 8) and the rollback. Everything else was checked structurally (packages, files,
sh -n,wdread, the tty menu branch with a stubstartx) and then in a real login on 2026-11-02 (Field notes). - Needs
- root (
sudo) foremergeand/etc/portage; a working Xorg withstartx(x11-apps/xinit); a tty login. Optional: OpenRC user services and a tty session menu, which is how my box starts sessions (steps 9 to 11); step 10's script also sources my~/.config/x11/common, which this manual does not create. - Time
- 15 min: my first run took 13 min, from writing
package.use(00:19) to theautostartlines (00:32). With my USE flags Window Maker builds from source (3 min 13 s here) andwmsystemtrayalways does. - Risk
- low and reversible. Only new files under
/etc/portageand~, plus six new packages.wmaker.inst --batchoverwrites~/GNUstep/Defaults/WindowMakerwithout asking if it already exists: back it up first.
Before you start#
- You are on a 23.0 profile and have Xorg and
startx:Expected: an amd64 profile; both packages installed. If$ eselect profile show Current /etc/portage/make.profile symlink: default/linux/amd64/23.0/desktop $ qlist -Iv x11-base/xorg-server x11-base/xorg-server-21.1.24 $ qlist -Iv x11-apps/xinit x11-apps/xinit-1.4.4qlistprints nothing, install Xorg first; this manual does not cover it. - Back up any existing Window Maker user config (step 5 overwrites it):
[ -d ~/GNUstep ] && cp -a ~/GNUstep ~/GNUstep.bak-$(date +%F) - No
wmakeris running. Steps 5 and 6 edit files a running Window Maker reads:Expected:$ pgrep -x wmaker; echo rc=$? rc=1rc=1(no process).
Steps#
Set Window Maker's USE flags.
echo 'x11-wm/windowmaker png jpeg webp xinerama xpm nls xrandr' | sudo tee /etc/portage/package.use/windowmaker$ cat /etc/portage/package.use/windowmaker x11-wm/windowmaker png jpeg webp xinerama xpm nls xrandrExpected: the one line.
xineramaandxrandrare what keep the binhost package from being used (step 2). The binhost build of 0.96.0-r1 hasgif jpeg nls png tiff webp xpmand neither of them. Without them, the binary package matches.xineramaadds Xinerama multi-monitor geometry queries (use.desc);xrandrenables XRandR extension support (metadata.xml).Emerge Window Maker.
$ sudo emerge --ask x11-wm/windowmaker … [ebuild N ] x11-wm/windowmaker-0.96.0-r1 USE="gif jpeg nls png tiff webp xinerama xpm xrandr -imagemagick -modelock" !!! The following binary packages have been ignored due to non matching USE: =x11-wm/windowmaker-0.96.0-r1 -xinerama -xrandr … >>> Completed (1 of 1) x11-wm/windowmaker-0.96.0-r1::gentooExpected:
Completed (1 of 1).[ebuildmeans a source build,[binarya binhost package. The "ignored due to non matching USE" lines are a notice, not an error (Failure modes, row 3).Accept the
~amd64keyword forwmsystemtray. It is the only one of the four dockapps without a stable amd64 keyword (KEYWORDS="~amd64 ~ppc64 ~x86"). Write it without a version, so later releases are accepted too:$ echo 'x11-plugins/wmsystemtray ~amd64' | sudo tee /etc/portage/package.accept_keywords/wmsystemtray x11-plugins/wmsystemtray ~amd64Expected: the line echoed back. If you skip this step, step 4 fails with Failure modes, row 2.
Emerge the dockapps from
x11-plugins. The category isx11-plugins, notx11-misc(Failure modes, row 1).$ sudo emerge --ask x11-plugins/wmclock x11-plugins/wmifs x11-plugins/wmmemload x11-plugins/wmsystemtray … [binary N g ] x11-libs/libdockapp-0.7.3-1 USE="X -static-libs" [binary N g ] x11-plugins/wmclock-1.0.16-r1-2 [binary N g ] x11-plugins/wmmemload-0.1.8-r1-1 [ebuild N ~] x11-plugins/wmsystemtray-1.4-r3 [binary N g ] x11-plugins/wmifs-1.9-1 … >>> Jobs: 5 of 5 complete Load avg: 1.02, 1.19, 1.13Expected:
5 of 5 complete.libdockappcomes in as a dependency. Onlywmsystemtraybuilds from source.Seed
~/GNUstepwithwmaker.inst --batch. It needs no X display. This copies the stockWindowMakerdefaults, generatesWMRootMenuwithwmgenmenu, and createsLibrary/WindowMaker/with an executableautostart:$ wmaker.inst --batch Installing WindowMaker 0.96.0 for current user... Creating ~/GNUstep user directory Copying defaults database... Creating icon library directory ~/GNUstep/Library/Icons Creating WindowMaker data library directory ~/GNUstep/Library/WindowMaker Creating style library ~/GNUstep/Library/WindowMaker/Styles Creating theme library ~/GNUstep/Library/WindowMaker/Themes Creating bg image library ~/GNUstep/Library/WindowMaker/Backgrounds Creating icon setup library ~/GNUstep/Library/WindowMaker/IconSets Creating pixmap library ~/GNUstep/Library/WindowMaker/Pixmaps Installation Finished $ ls ~/GNUstep/Defaults WMRootMenu WindowMakerExpected:
Installation Finishedand the two files. (This transcript is from a re-run on the same box with a scratchHOME; the first seed's output was not saved. Paths shortened to~.)WarningRun
wmaker.inst --batchonceBatch mode never prompts. On a second run it replaces
Defaults/WindowMakerwith the stock file and regeneratesWMRootMenu, so every edit made in steps 6 onward is lost.autostartsurvives because it is copied only if absent. Proof: Failure modes, row 4. To refresh only the menu, usewmgenmenu > ~/GNUstep/Defaults/WMRootMenu.Stop Window Maker painting over your wallpaper (optional). The stock
WorkspaceBackis a solid colour. If something draws the root window beforewmakerstarts (myx11/commondoes, step 10), set it to(none):$ wdread WindowMaker WorkspaceBack (solid, "rgb:50/50/75") $ wdwrite WindowMaker WorkspaceBack '(none)' $ wdread WindowMaker WorkspaceBack (none)Expected:
(none)on read-back. (Transcript from the same scratchHOMEas step 5; my real defaults read(none)too, see Verify.) Skip this step if Window Maker is the only thing that sets a background.Start the dockapps from
autostart. Window Maker runs this script before it starts handling events and waits for it to exit, so every command gets a trailing&. It also runs the script again on every Restart (root menu), while the first dockapps are still alive, so each line starts its program only if it is not already running.wmmemload -b -cleaves buffers and page cache out of "used" memory; without it the meter read 86% on a box with 13 GiB available. The file must stay executable. Append the four lines under the stock comment header:cat >> ~/GNUstep/Library/WindowMaker/autostart <<'EOF' pgrep -x wmclock >/dev/null || wmclock & pgrep -x wmifs >/dev/null || wmifs & pgrep -x wmmemload >/dev/null || wmmemload -b -c & pgrep -x wmsystemtray >/dev/null || wmsystemtray & EOF(Transcript from a scratch
HOME; my live file has one more dockapp,wmix, and a comment.)$ tail -4 ~/GNUstep/Library/WindowMaker/autostart pgrep -x wmclock >/dev/null || wmclock & pgrep -x wmifs >/dev/null || wmifs & pgrep -x wmmemload >/dev/null || wmmemload -b -c & pgrep -x wmsystemtray >/dev/null || wmsystemtray & $ sh -n ~/GNUstep/Library/WindowMaker/autostart; echo rc=$? rc=0 $ stat -c "%A %n" ~/GNUstep/Library/WindowMaker/autostart -rwxr-xr-x ~/GNUstep/Library/WindowMaker/autostartExpected: the four lines,
rc=0,xbits set.Write a minimal
startxclient script. One file per window manager, sostartxcan be pointed at it:cat > ~/.xinitrc-windowmaker <<'EOF' #!/bin/sh exec wmaker EOF chmod 755 ~/.xinitrc-windowmaker$ cat ~/.xinitrc-windowmaker #!/bin/sh exec wmaker $ sh -n ~/.xinitrc-windowmaker; echo rc=$? rc=0 $ stat -c "%A %n" ~/.xinitrc-windowmaker -rwxr-xr-x ~/.xinitrc-windowmakerExpected:
rc=0andxbits set.exec wmakeris also what upstream's install page puts in~/.xinitrc. (Transcript from a scratchHOME, paths shortened to~; on my box this file is the longer script in step 10.)[UNVERIFIED: this minimal script was not started; my box runs the step 10 script](My box) Give the session its own OpenRC user runlevel. My session daemons are OpenRC user services; each window manager gets a runlevel with
defaultstacked in, so entering it never stops dbus or PipeWire. Skip steps 9 to 11 if you don't run user services or a tty menu. The two commands are from my rebuild notes (the original run was not captured); the output below is from 2026-11-02 20:56:mkdir -p ~/.config/rc/runlevels/windowmaker rc-update --user -s add default windowmaker$ rc-status --user windowmaker Runlevel: windowmaker Stacked Runlevel: default dbus [ started 20:41:24 (0) ] pipewire [ started 20:41:24 (0) ] wireplumber [ started 20:41:24 (0) ] pipewire-pulse [ started 20:41:24 (0) ]Expected:
Stacked Runlevel: default. I add no services of my own to this runlevel: my terminal and notification services there need Wayland.(My box) Replace the client script with the glue version. This is my
~/.xinitrc-windowmakeras it is on the box. It needs two things this manual does not create:~/.config/x11/common(my shared X startup: keyboard layout, settings daemon, wallpaper, idle lock), and, for theopenrclines, the runlevel from step 9./bin/shstops at a failed., so without that filewmakernever starts. In the comments, "the Path-B chooser" is the tty menu in step 11 andsway-sessionis my Wayland launcher. It runswmakerwithoutexecso the script can leave the runlevel after Window Maker exits:#!/bin/sh # X session: Window Maker. Launched by the Path-B chooser via # `startx ~/.xinitrc-windowmaker -- vtN`. # # Shared startup (env, xkb layout, xsettingsd, cursor, root colour, .Xdefaults) # lives in ~/.config/x11/common so the bare X WMs cannot drift apart. . "$HOME/.config/x11/common" export XDG_CURRENT_DESKTOP=WindowMaker # Enter this WM's own OpenRC user runlevel. `default` (dbus/pipewire/wireplumber) # is stacked into it, and -n (--no-stop) makes entry purely additive, so this can # never stop the session bus out from under us. Done here rather than in each # WM's own config so all the bare X WMs share one mechanism. openrc -U -n windowmaker # NOTE: deliberately not `exec` -- this script must outlive the WM to run the # teardown below, exactly as /usr/local/bin/sway-session does. # # Window Maker provides its own Dock and Clip, so no external panel/bar is # started here (unlike openbox/fvwm3, which run a standalone xfce4-panel). # Dockapps go in ~/GNUstep/Library/WindowMaker/autostart if wanted. # # ~/GNUstep/Defaults/ was seeded with `wmaker.inst --batch`, so the user # defaults database (WindowMaker, WMRootMenu) exists and edits go here instead # of the read-only /etc/X11/WindowMaker fallback. Re-seed only if it is missing. wmaker # WM has exited. Leave its runlevel so any WM-bound service stops rather than # lingering with a dead display. `default` is stacked, so dbus/pipewire survive; # pam_openrc stops those at PAM session close. openrc -U default >/dev/null 2>&1$ sh -n ~/.xinitrc-windowmaker; echo rc=$? rc=0Expected:
rc=0.(My box) Add the session to the tty menu. My tty1 login runs a small menu script (
~/.local/bin/session-chooser) whosestartx_sessionfunctionexecsstartx "$HOME/.xinitrc-$1" -- vtN, withNtaken from the current tty. All ten digits were already used, so Window Maker got a letter. One line goes into the menu's list ofprintflines, the other into thecasebefore the*)fallback:printf ' [w] windowmaker (X11)\n'w|W) startx_session windowmaker ;;Checked with stubs for
startxandsway-sessiononPATH, a scratchHOMEholding a copy of the step 10 script, and the real menu script driven throughscript:$ printf 'w\n' | script -qec 'bash /home/user/.local/bin/session-chooser' /dev/null | tail -3 [w] windowmaker (X11) session [1]: STUB startx ~/.xinitrc-windowmaker -- vt0Expected: the stub prints the
startxline.vt0is the pseudo-terminal's number underscript; on tty1 it isvt1. An unmatched key still falls through to my default session (STUB sway-session).Start the session. Log in on a tty and run:
startx ~/.xinitrc-windowmaker -- vt1Use the number of the tty you are on in place of
1.
Verify#
Structural checks, run 2026-11-02 on the Yoga 370 (home path shortened to ~):
$ command -v wmaker wmclock wmifs wmmemload wmsystemtray
/bin/wmaker
/bin/wmclock
/bin/wmifs
/bin/wmmemload
/bin/wmsystemtray
$ wmaker --version
Window Maker 0.96.0
$ for k in ModifierKey WorkspaceBack; do printf "%s = " $k; wdread WindowMaker $k; done
ModifierKey = Mod4
WorkspaceBack = (none)
$ stat -c "%A %n" ~/.xinitrc-windowmaker ~/GNUstep/Library/WindowMaker/autostart
-rwxr-xr-x ~/.xinitrc-windowmaker
-rwxr-xr-x ~/GNUstep/Library/WindowMaker/autostart
Expected: five binaries, version 0.96.0, WorkspaceBack = (none), both scripts executable. ModifierKey = Mod4 is from my later key setup (Notes), not from this manual; the stock value is Mod1.
In the session (step 12): the Dock and the Clip appear, the four dockapps land in the Dock, and the wallpaper from x11/common stays visible behind them. Restart Window Maker from the root menu: still one of each dockapp.
Undo / rollback#
[UNVERIFIED: rollback not exercised; the unmerge list below is a pretend run]
- Leave the session, then remove the packages from the world file and unmerge them. The pretend run lists exactly these six:For the real removal, take them out of the world file, preview, then depclean only these atoms (a bare
$ emerge -pC x11-wm/windowmaker x11-plugins/wmclock x11-plugins/wmifs x11-plugins/wmmemload x11-plugins/wmsystemtray x11-libs/libdockapp … All selected packages: =x11-plugins/wmmemload-0.1.8-r1 =x11-plugins/wmsystemtray-1.4-r3 =x11-plugins/wmclock-1.0.16-r1 =x11-plugins/wmifs-1.9 =x11-libs/libdockapp-0.7.3 =x11-wm/windowmaker-0.96.0-r1--depcleanwould remove every orphan on the system):sudo emerge --deselect x11-wm/windowmaker x11-plugins/wmclock x11-plugins/wmifs x11-plugins/wmmemload x11-plugins/wmsystemtray emerge -p --depclean x11-wm/windowmaker x11-plugins/wmclock x11-plugins/wmifs x11-plugins/wmmemload x11-plugins/wmsystemtray x11-libs/libdockapp sudo emerge --depclean x11-wm/windowmaker x11-plugins/wmclock x11-plugins/wmifs x11-plugins/wmmemload x11-plugins/wmsystemtray x11-libs/libdockapp sudo rm /etc/portage/package.use/windowmaker /etc/portage/package.accept_keywords/wmsystemtrayrm -r ~/GNUstep, and restore~/GNUstep.bak-<DATE>if you made one in Before you start.rm ~/.xinitrc-windowmaker. On my box also:rc-update --user -s del default windowmaker,rmdir ~/.config/rc/runlevels/windowmaker, and delete the two menu lines from step 11.
Failure modes#
| Symptom (exact message) | Cause | Fix |
|---|---|---|
emerge: there are no ebuilds to satisfy "x11-misc/wmclock". | Wrong category. The dockapps are in x11-plugins. | emerge x11-plugins/wmclock (same for wmifs, wmmemload, wmsystemtray). |
!!! All ebuilds that could satisfy "x11-plugins/wmsystemtray" have been masked. … - x11-plugins/wmsystemtray-1.4-r3::gentoo (masked by: ~amd64 keyword) | wmsystemtray has only ~amd64. | Step 3: x11-plugins/wmsystemtray ~amd64 in package.accept_keywords, without a version. |
!!! The following binary packages have been ignored due to non matching USE: / =x11-wm/windowmaker-0.96.0-r1 -xinerama -xrandr | The binhost package was built without xinerama and xrandr; step 1 enables both. | Nothing, if a 3-minute source build is fine. To use the binary, drop xinerama xrandr from step 1. |
wdread WindowMaker WorkspaceBack prints (solid, "rgb:50/50/75") again after you had set (none) | wmaker.inst --batch was run a second time and reset Defaults/WindowMaker to stock. | Restore from your backup, or redo step 6 and every later wdwrite. Never re-run --batch; use wmgenmenu for the menu. |
Field notes#
- 2026-11-02 evening, Yoga 370, Gentoo amd64 23.0 desktop/OpenRC, windowmaker-0.96.0-r1, first login:
startx ~/.xinitrc-windowmakerfrom the tty menu. The Dock and Clip came up, the dockapps docked, the wallpaper stayed. Four things went wrong first. Restart from the root menu started every dockapp a second time, becauseautostartruns again while the first set is alive (step 7 now checks withpgrep).wmmemloadshowed 86% with 13 GiB available (now-b -c). Super+2 did nothing: Window Maker starts with one workspace, and a workspace key only switches to a workspace that exists unlessAdvanceToNewWorkspace = YES, which creates it (src/event.c:1699;wWorkspaceForceChange,src/workspace.c:476-489); I set that (Notes). Right-click on the desktop did nothing, which was not Window Maker:xinput test-xi2 --rootshowed my touchpad's bottom-right corner arriving as button 1, because the X libinput driver had the pad in clickfinger mode. I switched the pad to button areas (libinput Click Method Enabled 1 0, read back1, 0); a synthetic button-3 click opened the root menu, but the corner itself was not re-tested on its own. After those fixes and two Restarts, Super+Return, Super+2, Super+d (the Run panel from my menu shortcuts) and Restart all worked. Evidence:raw/login-2026-11-02.md. - 2026-11-02 20:51-21:05, Yoga 370, Gentoo amd64 23.0 desktop/OpenRC, windowmaker-0.96.0-r1: I re-checked everything I could without logging in.
wmaker.inst --batchran in a scratchHOMEwithDISPLAYunset (rc=0, the step 5 transcript). In the same scratchHOMEI setWorkspaceBackto(none), ran--batchagain, and read back(solid, "rgb:50/50/75"): the overwrite in the step 5 warning is real. The first day'swmsystemtrayerror was never saved, so I reproduced it (row 2) withemerge -pagainst a copy of/etc/portagewithout the keyword file. The minimal step 8 script passedsh -nin a scratchHOME. The tty menu'swbranch reached a stubstartxwith~/.xinitrc-windowmaker -- vt0(vt0becausescriptruns on a pty). An unmatched key still reached the default session.wdreadon the real defaults givesWorkspaceBack = (none). Nowmakerprocess; still not logged in. - 2026-11-02 00:19-00:32 and 20:35, Yoga 370, Gentoo amd64 23.0 desktop/OpenRC, windowmaker-0.96.0-r1: I wrote
package.use/windowmakerat 00:19.emerge x11-wm/windowmakerstarted at 00:20 and built from source in 3 min 13 s, because the binhost package lackedxinerama xrandr. My first dockapp emerge usedx11-misc/...and failed (row 1). The firstx11-pluginsemerge, at 00:29, exited with status 1 before thewmsystemtraykeyword existed; its output was lost behind adispatch-confsession. I added the keyword at 00:31, and the next emerge took four packages as binaries and builtwmsystemtray. The runlevel was created at 00:25 and theautostartlines at 00:32. In the evening (defaults files saved 20:34-20:35) I reviewed the seeded config: the stock solidWorkspaceBackwould cover the wallpaper myx11/commondraws, so I set it to(none)and moved the keys to Super (Notes). I also found that my power menu's logout did not know aboutwmaker: it would have ended the login session and skipped theopenrc -U defaultteardown in step 10. I addedwmakerto its list of window managers.
Notes#
- Defaults edits and a running wmaker. I made the evening's
wdwriteedits withwmakernot running.wdwriterewrites and reorders the whole file. This build has inotify: a running 0.96.0 watches the Defaults directory (inotifyWatchConfig,src/main.c:491) and re-reads changed domains on anIN_MODIFYevent (handle_inotify_events,src/event.c:360). At my first login I wroteAdvanceToNewWorkspacewhile it ran, then restarted it before testing, so whether a live edit applies without a Restart is not tested. - Why
(none)and not a colour.WorkspaceBack = (none)is accepted case-insensitively bygetWSBackground(src/defaults.c:2054). With a texture set, Window Maker launcheswmsetbgfor the background (src/defaults.c:3101). The upstream user guide says the default isnone, but 0.96.0's code and the shipped file both default to(solid, "rgb:50/50/75"). With(none)set, the wallpaper myx11/commondraws stayed visible at login. - Binding commands to keys. The
WindowMakerdefaults file binds only window-manager actions. A command gets a key through the root menu:(Title, SHORTCUT, "Mod4+Return", EXEC, xterm)inWMRootMenu(src/rootmenu.c:1536-1545). I bound mine that way and moved the modifier to Super (ModifierKey = Mod4). That configuration is for a separate post; Super+Return and Super+d worked in the login session. %in menu commands.ExpandOptions(src/misc.c) passes an unknown%Xthrough unchanged, and there is no%%escape:wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-is correct as written, and5%%-would reachwpctlwith both%. The lettersw W a A sare expanded (%aopens an input dialog), and\%gives a literal%(from reading the code, not tested).- Dockapp options.
wmifs -i <IFACE>if it picks the wrong interface;wmsystemtray -suses 16x16 icons. Not tried. wmaker.instwrites no~/.xinitrcin 0.96.0, even though windowmaker.org's install page says it sets X up to start Window Maker.wmgenmenulists only programs it finds onPATH, so the menu depends on what is installed.- Gentoo also installs
/usr/share/xsessions/wmaker.desktopfor display managers. I don't use one.
Sources#
- Window Maker 0.96.0 source,
WindowMaker-0.96.0.tar.gzfrom Gentoo distfiles:util/wmaker.inst.in(--batchskips the replace prompt, lines 7-8 and 112-125;autostartcopied only if absent, 219-220),src/main.c:519-535(autostart viasystem()before the event loop),src/defaults.c(WorkspaceBackdefault at 549,Noneat 2054),src/rootmenu.c:1536-1545(SHORTCUT),src/misc.c:664-667(%default case). - Window Maker: Installation —
exec wmakerin~/.xinitrc;wmgenmenu > $HOME/GNUstep/Defaults/WMRootMenu. - Window Maker: wmaker_install — the
wmaker.instclaim the 0.96.0 script does not do. - Window Maker User Guide, chapter 4 —
WorkspaceBack"a texture or none (default: none)", contradicted by the code. - wmgenmenu(1) — writes the menu to stdout, filters by
PATH. /var/db/repos/gentoo/x11-plugins/*/andx11-wm/windowmaker/ebuilds andmetadata.xml—KEYWORDS, USE flags. There is no Gentoo wiki page for Window Maker (wiki.gentoo.org/wiki/Window_Maker is 404 as of 2026-11-02).