While X provides operating system support for a graphical interface, management of that interface falls to the window manager. OpenBSD has packages for button-heavy, pointy-clicky window managers such as KDE, Gnome, and Xfce. These window managers might provide a comfortable bridge between consumer-friendly operating systems and OpenBSD, but they’re not designed for the more hard-core Unix user.
Xenocara includes three window managers: the classic fvwm(1)
and twm(1)
window managers that have shipped with X since the last millennium, and the OpenBSD-specific cwm(1)
. OpenBSD developers wrote cwm
specifically as a modern, fast, keyboard-friendly interface.
To start cwm
at login, invoke it in $HOME/.xsession:
/usr/X11R6/bin/cwm
When your cwm
session ends, xdm
returns you to the login screen.
Rather than using mouse-driven configuration menus, cwm
uses a single configuration file, $HOME/.cwmrc. You can read the complete documentation in cwmrc(5)
. Here, as I discuss various cwm
features, I’ll mention how each can be configured or changed in .cwmrc.
Most cwm
operations require you to press a configurable combination of keys. For example, CTRL-ALT-DEL locks the screen. The cwm
documentation lists the modifier keys shown in Table 17-1.
For example, CS-r
in .cwmrc means CTRL-SHIFT-R. CM-W
represents CTRL-ALT-W.
The default cwm
configuration allows you to choose a new window manager with CTRL-ALT-W from any command on the system. Enter cwm
, and cwm
should restart without losing any of your windows.
You can also bind a key sequence to any cwm
command listed in cwmrc(5)
. For example, suppose you want to use the key sequence CTRL-ALT-R to delete your current window. Add the following to .cwmrc:
bind CM-r delete
The change will take effect only once you use CTRL-ALT-W to restart cwm
or you log out and back in again. After you’ve done one or the other, use CTRL-ALT-R to delete the current window.
If you make an entry in .cwmrc that cwm
cannot parse, cwm
will not process the configuration file, and you will lose all of your custom cwm
settings as soon as you load the configuration file. If your custom settings vanish, your most recent changes to .cwmrc are wrong. If you make an error that cwm
can parse, cwm
will accept it. No one except the user will have trouble in this case.
When you are running the graphical desktop, everything on screen is a window. A terminal runs in a window, as do web browsers and games. Managing windows—raising, hiding, resizing, naming, and so on—is the core task of a window manager.
A default cwm
session starts with a plain gray screen and a small xconsole(1)
window. Create a new terminal window with CTRL-SHIFT-ENTER. The window manager should focus on whatever window your mouse is over. (Press SHIFT-+ to increase the font size of the terminal windows.)
If you press CTRL-SHIFT-ENTER repeatedly, you won’t see additional terminal windows. Oh, the new windows will be created, but on top of one another. Press ALT and the left mouse button to move the currently active window, and you should expose another terminal window beneath that one.
I find the default terminal size too small; I want wider terminals with more rows. To resize the terminal window, press ALT and the center mouse button (or both buttons simultaneously). The mouse will move to the lower-right corner of the window and change to a right angle bracket. The window will continue to resize as long as you hold down the mouse button.
To maximize windows vertically, press CTRL-ALT-=. To maximize windows horizontally, press CTRL-ALT- SHIFT-=. To destroy a window, focus on it and press CTRL-ALT-X. You will not be asked to confirm your decision; cwm
will obey and exterminate the window immediately.
To exit cwm
and return to the login screen, press CTRL-ALT-Q.
Now that you can create windows, let’s look at ways to manage them.
First, switch between visible windows with ALT-TAB. The newly active window should rise to the foreground.
To assign a name to a window, press CTRL-ALT-N to access the label prompt, and then enter the window’s desired name. Names are useful when you choose to hide a window without destroying it.
To hide a window, focus on it, and then press ALT-ENTER to make it disappear. Pressing ALT-TAB won’t bring it back because it’s hidden. Press the left mouse button for a list of all hidden windows, arranged by name. Any windows you didn’t name will show up as the program name. All terminals show up as xterm
. Click the name to unhide the window.
It’s a good idea to name windows that have a specific purpose, such as a long-running software build. That way, you can minimize the window when it’s not interesting, and quickly find it again when necessary. I name windows created by SSH sessions after the connected server.
You can search for windows by name. Press CTRL-ALT-/ to get a window>>
prompt, and then start typing the name of the window. cwm
will list all matching windows. Hidden windows have an ampersand (&
) before their name. Exclamation points indicate the window with focus.
Don’t walk away from an active workstation without locking it, especially if you’re logged on to sensitive systems or as root. Press CTRL-ALT-DEL to lock your desktop, and the screen will go blank. Press another key, and cwm
will request your password to unlock the workstation.
The default screensaver is a blank screen, provided with xlock(1)
. To use a different screensaver, set a path to it in .cwmrc, as follows:
command lock path-to-command
For example, to use xlock
’s flow mode as a screensaver, add the following to .cwmrc:
command lock '/usr/X11R6/bin/xlock -mode flow'
If you don’t like any of the screensavers in Xenocara’s xlock(1)
, try the xscreensaver
package.
One common task is to connect to remote machines with SSH. To do so, press ALT-. to display an ssh>>
prompt, and then enter the name of the machine to which you want to make the connection. Conveniently, cwm
supports autocompletion, based on entries in known_hosts. As you type a hostname at the ssh
prompt, cwm
checks for matching names in the system’s and users’ known_hosts. Press the down-arrow key to find your desired hosts, or keep typing the hostname to connect to a new host. (Autocompletion won’t work if you hash known_hosts entries.)
And by the way, if you open multiple SSH sessions, name them, because sorting through multiple sessions labeled ssh
is annoying.
Click the right mouse button on the background to bring up the application menu. The cwm
developers have no idea which programs are important to you, so they don’t even try to provide a default application menu. You need to build that yourself with .cwmrc entries. Each command has the following format:
command name path-to-command
Yes, this is exactly the same as the format for setting the screensaver. The lock
command is actually one of two special command keywords. Here, I’ve created an application menu with two choices, which are my web browser and my PDF reader:
command firefox /usr/local/bin/firefox command xpdf /usr/local/bin/xpdf
When I right-click the desktop background, I’ll see a menu with these two choices.
Almost everyone has a mouse these days, but sometimes you’re in a situation where it’s best to ignore that mouse. Perhaps your desk is too small, your mouse is broken, repeatedly removing your hands from the keyboard slows you down (as in you don’t have a sensible mouse-in-keyboard), or you just hate your mouse today (which is both valid and respectable).
To control the mouse cursor with the keyboard, use CTRL and the arrow keys to move the pointer a small amount, or press CTRL-SHIFT and an arrow key to make larger pointer movements. On my system CTRL-SHIFT-up arrow moves the mouse pointer up about a terminal line, but that varies with font size.
You can also use keyboard commands to shift window placement and size, as shown in Table 17-2.
Key Combination |
Direction |
alt-shift–H |
Left |
alt-shift–J |
Down |
alt-shift–K |
Up |
alt-shift–l |
Right |
Use ALT and a direction key to move a window a small amount, or ALT-SHIFT to move the window a larger amount. To resize a window by a small amount, use CTRL-ALT and a direction key. CTRL-ALT-SHIFT and a direction key resizes the window a larger amount. Just as if you were resizing with the mouse, the size change occurs from the lower-right corner of the window. Place a window’s upper-left corner where you want it, and then resize the window.
The default cwm
desktop is rather bland, but a few adjustments make it easier on the eyes. One of the first things I set is a background color: black. Use xsetroot(1)
to set your background color.
$ xsetroot -solid black
You can include this command in .xsession or run it in a terminal. The file /usr/X11R6/share/X11/rgb.txt lists the colors X recognizes. If a color name is two words, either remove the spaces in the name or put the name in single quotes, like this:
$ xsetroot -solid 'hot pink'
If you want an image in the background, use feh
(/usr/ports/graphics/feh).
$ feh --bg-scale /home/mwlucas/galaxies.jpg
To make window edges easier to identify, put borders around them. The default border is 1 pixel wide, in your choice of colors. I prefer 3-pixel borders, blue for the active window and dark blue for the inactive windows. That requires the following entries in .cwmrc:
borderwidth 3 color activeborder blue color inactiveborder darkblue
As you grow more accustomed to cwm
, you might find that you want particular applications—perhaps an MP3 player, a clock, and a fancy graphic system load indicator—to always be visible. Maximizing a window can bury these applications. To address this, define a gap in .cwmrc, which sets the number of pixels to be kept clear even when you maximize a window.
gap top bottom left right
For example, when I must keep track of time, I run xclock(1)
on the right side of my screen. Experimentation has shown that my clock is about 175 pixels wide. I leave a gap of 180 pixels, so that even when I maximize a window, it doesn’t cover the clock. Here’s my gap
entry in .cwmrc:
gap 0 0 0 180
Now I can no longer use the excuse that I missed work because I lost my clock on my desktop. Fortunately, I have many other handy excuses.
While the cwm
authors did their best to choose keyboard shortcuts that wouldn’t conflict with those used by other programs, they could not avoid every possible conflict. If you run into such a conflict, you can solve the problem by modifying entries in .cwmrc to replace conflicting cwm
key bindings.
For example, cwm
uses CTRL and CTRL-SHIFT with the arrow keys to move the pointer, but OpenOffice also uses these key combinations to move the pointer and highlight within a text document. I’ve used OpenOffice for more than 10 years, and have written millions of words in it. My fingers have been well-trained, and I’m not going to try to retrain them. The cwm
key assignments must change.
Use the bind
command to remap keys. Start by disconnecting the CTRL and CTRL-SHIFT and arrow key combinations from cwm
with the unmap
option. Remember that .cwmrc uses C
to represent CTRL and S
to represent SHIFT (as shown earlier in Table 17-1).
bind CS-Left unmap bind CS-Right unmap bind CS-Up unmap bind CS-Down unmap bind C-Left unmap bind C-Right unmap bind C-Up unmap bind C-Down unmap
These keystrokes will now pass through to applications, such as OpenOffice.
To determine how to move the pointer with the keyboard, I check cwmrc(5)
for the list of commands that can be bound to a key. The manual defines commands with a brief name and a description of their functionality. The pointer movement commands begin with ptrmove
and bigptrmove
, plus a direction. I find them and use the Windows key (also known as modifier 4) to replace the functions I removed from the CTRL key.
bind 4-Left ptrmoveleft bind 4-Right ptrmoveright bind 4-Up ptrmoveup bind 4-Down ptrmovedown bind 4S-Left bigptrmoveleft bind 4S-Right bigptrmoveright bind 4S-Up bigptrmoveup bind 4S-Down bigptrmovedown
I can now use both OpenOffice and cwm
’s keyboard functions.
At this point, I’ve covered everything I’ve used since OpenBSD introduced cwm
, which should get you started. For more information, read cwm(1)
and cwmrc(5)
. You’ll see that cwm
supports many more features.
Now that we’ve covered OpenBSD’s appearance, let’s dive deep into the operating system core.