I really wanted to write a guide to how to choose your own window manager, but I have to admit to being stumped as to how to do it. The best way is to do what I did, try nearly all of them and make yourself spend at least a couple days with each one, including reading the documentation heavily. But that isn't realistic. So, how to make that decision?
Focus style can be changed in nearly all current window managers, so that shouldn't be a deciding factor. Most current window managers are also able to bind almost any key or key combination - if you're willing to dig into the configuration files and write the bindings yourself. This is usually fairly easy. Menus are almost always changed the same way: again, you'll be rewriting the configuration files unless you're willing to go back to KDE or GNOME.
And, of course, there's always appearance. Consider how important that is to you. I tend to think of myself as being very utilitarian, but in truth I'm very concerned about the appearance of the window manager that I use. My biggest concern is the desktop background, and I've chosen aterm (http://aterm.sourceforge.net/) as my terminal emulator of choice because it does "true" transparency and isn't nearly as difficult to configure as Eterm. The window manager window framing and appearance has to be something I like as well. If you can't stand looking at the same window frames day after day, you'd better make sure that you've got a WM that supports themes, and that there are themes available.
Most WMs provide a menu by clicking (right or left, depends on the WM) on the desktop. This can be a hassle if you have a maximized window and haven't yet memorized the key combination to pull up the menu (if there even is one). I believe Microsoft may actually deserve the credit for bringing us the "Start" button and its equivalents (or was it Apple?), ie. a fixed place that's always available to click and access the menu system. Another common concept is the "taskbar" or "task manager" which provides a list of running windows (sometimes the list is of all windows in all workspaces, but usually only the windows in the current workspace). Microsoft combined the menu button with the taskbar, so many people are very familiar with that paradigm. Since Windows 98, Microsoft has also included "Quick Launch" icons on the taskbar to start your most commonly used applications. Menu buttons like this remain uncommon in Unix WMs, taskbars are more common. If you want the menu button/taskbar combination, look to IceWM, FVWM (although only one or two of its styles), and the Windows clones. There are also accessory launchers that can be added to most WMs such as fspanel and acidlaunch. The problem with the latter options are that they often don't understand how the WM handles workspaces and appear on only one workspace.
Running all these window managers has clarified for me what I want from a WM. Appearance is important, but that doesn't necessarily mean I need themes if I like the base look. Good support for keyboard control (ie. the ability to change workspaces and windows without the mouse) is essential, but I find I don't like the WMs that try to eliminate the mouse entirely. Applications like the Gimp don't make sense without at mouse, and such a dedication to the keyboard begs the question "why don't you just use screen on the console?" I like window grouping with tabs (all the windows occupy the same space and are accessed by the tabs at the top of the window or with keyboard commands). A menu system is important. Easy configuration of key combinations and the menu is essential. As I write this, this leaves me leaning towards ctwm (no tabs), wmx (no tabs, hard to configure), pwm, and pekwm. Fluxbox is a possibility too.
If you want to modify the window manager itself, or just feel more comfortable in an environment generated in your favourite language, you're covered. Window managers have been written in quite a few programming languages. Most window managers are written in C, and several are written in C++, but there's even a window manager written in Perl.
|C++: aewm++ (a rewrite of aewm in C++). miwm.|
|Eiffel: Framer (written for Rox).|
|Java: JD4X (very early release). Puppet.|
|Lisp: Eclipse. Sawfish ("Emacs Lisp-like scripting language"), Lisp for configuration files. Stump Window Manager, written entirely in Common Lisp (very early release). XWEM (X Window Emacs Manager) is written entirely in Emacs Lisp.|
|Objective C: Interface WM.|
|Perl: perlwm (uses X11::Protocol module) - my experience wasn't good. Pekwm uses a perl-like structure for its configs.|
|Python: PyWM (very early release). PLWM (Pointless Window Manager).|
|Scheme: SCWM (Scheme Configurable Window Manager).|
And remember: if you get a serious hang in a window manager, Ctrl-Alt-Backspace will get you out of X in a hurry. Keep in mind that this kills all applications immediately without saving, so only use it when necessary.