Build a retro Apple desktop with the Linux MLVWM

This article is part of a special series of 24 days of Linux desktops. What if old-school Apple computers were built around open source POSIX? You can find out by building the Macintosh-like Virtual Window Manager.
146 readers like this.
Compute like it's 1989

LSE Library. Modified by CC BY-SA 4.0

Imagine traveling into an alternate history where the Apple II GS and MacOS 7 were built upon open source POSIX, using all the same conventions as modern Linux, like plain-text configuration files and modular system design. What would such an OS have enabled for its users? You can answer these questions (and more!) with the Macintosh-like Virtual Window Manager (MLVWM).

MLVWM running on Slackware 14.2

Installing MLVWM

MLVWM is not an easy installation, and it's probably not in your distribution's software repository. If you have the time to decipher a poorly translated README file, edit some configuration files, gather and resize some old .xpm images, and edit an Xorg preference or two, then you can experience MLVWM. Otherwise, this is a novelty window manager with its latest release back in 2000.

To compile MLVWM, you must have imake installed, which provides the xmkmf command. You can install imake from your distribution's software repository, or get it directly from Assuming you have the xmkmf command, change into the directory containing the MLVWM source code, and run these commands to build it:

$ xmkmf -a
$ make

After building, the compiled mlvwm binary is located in the mlvwm directory. Move it to any location in your path to install it:

$ mv mlvwm/mlvwm /usr/local/bin/

Editing the config files

MLVWM is now installed, but it won't launch correctly without adjusting several configuration files and carefully arranging required image files. Sample config files are located in the sample_rc directory of the source code you downloaded. Copy the files Mlvwm-Netscape and Mlvwm-Xterm to your home directory:

$ cp sample_rc/Mlvwm-{Netscape,Xterm} $HOME

Move the Mlvwmrc file to $HOME/.mlvwmrc (yes, you must use a lower-case "m" even though the sample file deceptively begins with a capital letter):

$ cp sample_rc/Mlvwmrc $HOME/.mlvwmrc

Open .mlwmrc and find lines 54–55, which define the path (the "IconPath") for the pixmap images that MLVWM uses in its menus and UI:

# Set icon search path. It needs before "Style".
IconPath /usr/local/include/X11/pixmaps:/home2/tak/bin/pixmap

Adjust the path to match a directory you will fill with your own images (I suggest using $HOME/.local/share/pixmaps). MLVWM doesn't provide pixmaps, so it's up to you to provide pixmap icons for the desktop you're building.

Do this even if you have pixmaps located elsewhere on your system (such as /usr/share/pixmaps), because you're going to have to adjust the size of the pixmaps, and you probably don't want to do that on a system-wide level.

# Set icon search path. It needs before "Style".
IconPath /home/seth/.local/share/pixmaps

Choosing the pixmaps

You've defined the .local/share/pixmaps directory as the source of pixmaps, but neither the directory nor the images exist yet. Create the directory:

$ mkdir -p $HOME/.local/share/pixmaps

Right now, the config file assigns images to menu entries and UI elements, but none of those images exist on your system. To fix this, read through the configuration file and locate every .xpm image. For each image listed in the config, add an image with the same file name (or change the file name in the config file) to your IconPath directory.

The .mlvwmrc file is well commented, so you can get a general idea of what you're editing. This is just a first pass, anyway. You can always come back and change the look of your desktop later.

Here are some examples.

This code block sets the icon in the upper-left corner of the screen:

# Register the menu
Menu Apple, Icon label1.xpm, Stick

The label1.xpm image is actually provided in the source code download's pixmap directory, but I prefer to use Penguin.xpm from /usr/share/pixmaps (on Slackware). Whatever you use, you must place your custom pixmap in ~/.local/share/pixmaps and either change the pixmap's name in the configuration or rename the pixmap file to match what's currently in the config file.

This code block defines the applications listed in the left menu:

"About this Workstation..." NonSelect, Gray, Action About
"" NonSelect
"Terminal"	Icon mini-display.xpm, Action Exec "kterm" exec kterm -ls
"Editor"  Action Exec "mule" exec mule, Icon mini-edit.xpm
"calculator" Action Exec "xcal" exec xcalc, Icon mini-calc.xpm

By following the same syntax as what you see in the configuration file, you can customize the pixmaps and add your own applications to the menu (for instance, I changed mule to emacs). This is your gateway to your applications in the MLVWM GUI, so list everything you want quick access to. You may also wish to include a shortcut to your /usr/share/applications folder.

"Applications" Icon Penguin.xpm, Action Exec "thunar /usr/share/applications" exec thunar /usr/share/applications 

Once you're finished editing the configuration file and adding your own images to your IconPath directory, your pixmaps must all be resized to roughly 16x16 pixels. (MLVWM isn't consistent in its defaults, so there's room for variation.) You can do this as a bulk action using ImageMagick:

$ for i in ~/.local/share/mlvwm-pixmaps/*xpm ; do convert -resize '16x16^' $i; done

Starting MLVWM

The easiest way to get up and running with MLVWM is to let Xorg do the bulk of the work. First, you must create a $HOME/.xinitrc file. I borrowed this one from Slackware, which borrowed it from Xorg:

# $XConsortium: xinitrc.cpp,v 1.4 91/08/22 11:41:34 rws Exp $


# merge in defaults and keymaps

if [ -f $sysresources ]; then
    xrdb -merge $sysresources

if [ -f $sysmodmap ]; then
    xmodmap $sysmodmap

if [ -f $userresources ]; then
    xrdb -merge $userresources

if [ -f $usermodmap ]; then
    xmodmap $usermodmap

# Start the window manager:
if [ -z "$DESKTOP_SESSION" -a -x /usr/bin/ck-launch-session ]; then
  exec ck-launch-session /usr/local/bin/mlvwm
  exec /usr/local/bin/mlvwm

According to this file, the default action for the startx command is to launch MLVWM. However, your distribution may have other ideas about what happens when your graphic server launches (or is killed to be restarted), so this file may do you little good. On many distributions, you can add a .desktop file to /usr/share/xsessions to have it listed in the GDM or KDM menu, so create a file called mlvwm.desktop and enter this text:

[Desktop Entry]
Comment=Macintosh-like virtual window manager
TryExec=ck-launch-session /usr/local/bin/mlvwm

Log out from your desktop session and log back into MLVWM. By default, your session manager (KDM, GDM, or LightDM, depending on your setup) will continue to log you into your previous desktop, so you must override that before logging in.

With GDM:

With SDDM:

Launching with brute force

If MLVWM fails to start, try installing XDM, a lightweight session manager that doesn't look at /usr/share/xsessions and instead just does whatever the authenticated user's .xinitrc proscribes.


Build your own retro Apple

The MLVWM desktop is unpolished, imperfect, accurate, and loads of fun. Many of the menu options you see are unimplemented, but you can make them active and meaningful.

This is your chance to step back in time, change history, and make the old-school Apple line of computers a bastion of open source. Be a revisionist, design your own retro Apple desktop, and, most importantly, have fun.

What to read next

Use the Window Maker desktop on Linux

This article is part of a special series of 24 days of Linux desktops. Take a step back in time with Window Maker, which implements the old Unix NeXTSTEP environment for today…

Seth Kenlon
Seth Kenlon is a UNIX geek, free culture advocate, independent multimedia artist, and D&D nerd. He has worked in the film and computing industry, often at the same time.

Comments are closed.

Creative Commons LicenseThis work is licensed under a Creative Commons Attribution-Share Alike 4.0 International License.