IceWM – The Cool Window Manager

IceWM is a lightweight window manager for UNIX-like systems. Although widely used, it is often underrated – there is hardly any IceWM-related content on the Internet. This article is my attempt to share my experiences as a longtime IceWM user. It contains tips and tricks, usage scenarios, and makes use of examples whenever possible to better demonstrate IceWM’s features and capabilities. Finally, the article is meant for those with some familiarity with UNIX, but who are new to IceWM.

1. Introduction to IceWM

IceWM is mean to be a fast, lightweight, unobtrusive window manager. It isn’t a full-fledged desktop environment like, for instance KDE, GNOME, CDE or XFce. See Appendix A at the end of the article for the difference between a Window Manager and a Desktop Enviroment.

The IceWM interface looks a lot like a simple Windows 95 default desktop. So even for those of you new to UNIX, IceWM won’t be too difficult to start using. It can be extensively themed too, to resemble Windows NT, XP, MacOS 9 and OS X. So if you’re a recent convert to Linux, and don’t want (or can’t afford) the full-fledged capabilities of KDE or GNOME, IceWM is for you. Just theme it to look like your old OS! No wonder it’s also known as the “impersonator”.

IceWM is also for the UNIX gurus out there. Being fairly minimalistic, you can use it simply as a means to manage the dozens of terminal windows you’ll have open. Another reason that experienced Linux/UNIX ‘power users’ will like IceWM is that it’s extremely unobtrusive. Once you’ve got it customised the way you want it, you won’t notice it. Quite a difference from Windows XP’s irritating popup messages and ubiquitious branding. It’s like XP’s constantly hammering into your brain – “You’re Using Microsoft Windows XP And You Better Not Forget It”! Unfortunately, neither GNOME nor KDE are much better – think of all the applications which begin with ‘K’ or ‘G’! IceWM, on the other hand, accomplishes the one thing that is essential for an effective window manager – it makes you forget about its existence.

Finally, IceWM is remarkably flexible, while remaining simple to configure. All of IceWM’s features can be configured via five plaintext configuration files, all of which but one are usually under 25 lines in length. While there are graphical tools for configuring IceWM, I find them very inadequate, and almost everyone will find it easier to edit the files by hand.

Well, enough of an introduction to IceWM. Let’s get down to the specifics. First, the obligatory download-and-install procedure.

2. Getting, Configuring and Installing IceWM

2.1 Obtaining and compiling IceWM

You can get IceWM at There are both source tarballs and binary versions available for download. If you don’t have root privileges on your machine, then the source is what you’ll need. You can install in your home directory.

For the RPM, as root, type

rpm -Uvh icewm-<version-number>.rpm

For the tarball, we go through the 3-step ritual of configuring, compiling and installing. Say you’re installing in ~/icewm. First we’ll untar the archive. For files ending in .tar.gz, we type

tar -zxvf <filename>.tar.gz

and for files that end in .tar.bz2, type

tar -jxvf <filename>.tar.bz2

“cd” into the archive directory, and type the following:

$./configure --prefix=/home/rahul/icewm

The “–prefix” option will ensure that icewm is installed in a directory within your home directory. Other options you might want to add to the configure script:

Disable internationalization
Disable internationalized message
Support gradients (experimental, implies -enable-antialiasing)
Support antialiasing (experimental, implies -enable-xfreetype)
Display GNOME 2 menus
Use Imlib for images path to imlib-config

The “imlib” option enables IceWM to use .pngs and other non-xpm file formats for use as icon files. That’s usually a good idea.

Once the configure script is done, type

$ make && \
make install && \
xmessage -center ' Done!' || \
xmessage -center ' Error!'

Then go on doing some other work. Once the system’s finished compiling and installing, a message window will popup with either ” Done!” if everything went off fine, else you’ll see ” Error!”.

2.2 Settting up IceWM as the default window manager

The binary that launches IceWM is now icewm-session. In earlier versions, the single binary icewm used to handle all of the window manager’s tasks. These have now been broken down into

the actual window manager binary.
the background-setting applications.
catches docklet objects from aaplications like Gaim.
runs all of the above when needed
(internal), generates IceWM menus from GNOME(1) menus
(internal), generates IceWM menus from FreeDesktop .desktop files (KDE/GNOME(2) menus).

Open your .Xclients file in your favourite text editor. At the end, add the line

/home/rahul/icewm/bin/icewm-session || exec xterm 

and save the file. The .Xclients file is used by all Redhat-based distros. On other systems (I think Debian and others) it might be the .xsession file. This file is parsed when you start X either via the command line by issuing “startx” or by the login manager in case you’ve selected the “default” login session.

3. Exploring IceWM

3.1. Components of the IceWM desktop

  1. The Start Button
  2. Taskbar
  3. Virtual Desktops
  4. Command Line
  5. Clock
  6. CPU Status Applet
  7. Net Status Applet

So, if you’ve had any prior Windows OS experience, the default IceWM desktop won’t be in the least bit intimidating to you. Not as much as Fluxbox, anyways. The key is to be able to customise these components to maximise your productivity. That’s the purpose of the next section.

What you don’t see in this screenshot is the Toolbar. That’s an area on the taskbar usually just to the right of the start menu button – kind of like the Quick Launch Toolbar in Windows 98 onwards. You can place heavily used apps there, so that they’re just a mouse click away.

If you have a 24/7 Internet connection, you might be interested in the Mail Check applet. That’s an applet much like the Net Status/ CPU Status applets, which checks your mail server for new email every few minutes and reports when new mail does arrive. It can be configured to launch your preferred mail client when clicked upon.

The newer versions of IceWM have full support for the system tray standard, which allows applications like Kopete/GAIM/K3B to dock into the IceWM tray. That’s a boon – using GAIM was no fun when you had to keep it on the taskbar, conversations and all!

What might irk some users of Windows, or even our own KDE and Gnome, is the lack is support for icons on the desktop. Of course, that is not supposed to be the Window Manager’s job. Although the toolbar and menu provide ready access to most applications that a user requires, there might be those among you who insist that they have a “My Documents” or “Trash” folder on the desktop. There is a workaround to this, but it’s neither elegant nor pretty. You can use an application by the name of DFM, or Desktop File Manager. It essentially draws ‘icons’ on the root window, and can launch programs/ open the location in a traditional file manager when clicked upon. DFM is the application that Vector Linux’s implementation of IceWM uses. If you’ve ever wondered how Vector does it… well, now you know! The flip side to DFM is that it’s not pretty. Take a look at the screenshots on the home page, and you’ll find that you’d rather do without it.

3.2. IceWM configuration files

As I mentioned earlier, all of IceWM can be configured via five files. I stress once more that while there are graphical tools to provide an easy, point-and-click interface to configure IceWM, they’re ugly, incomplete, immature, hard to get, hard to install, frustrating to use, and hopelessly inadequate. (My, am I in a vicious mood!) Actually, all five files are small in size, well commented, and have trivially simple syntax. Besides, the excellent IceWM Manual contains all you’ll ever need to know to build your own config files.

  1. menu (~/.icewm/menu)

    Unlike the Windows/KDE/Gnome “Start Menu”s, IceWM’s menu is not a pain to edit. The philosophy is to have entries for only those programs that you use on a regular basis, and organised into the menu structure that you want.

    First, jot down a list of the applications you use on a regular basis, and the path to the executable. If you like, in a text editor or on paper, draw a rough outline of how you’d like your menu to look once its done. This outline will be a huge time saver when you actually to write your own menu file, and you’ll be able to concentrate on writing the file itself, rather than designing the menu at the same time. For instance, some part of my menu outline would go like:

    	More (menu)
    	Config Files (menu)

    Now for the file itself. The syntax for the menu file is

    • For applications:
      prog	Program_Name	icon-name	executable -with -options
    • For submenus:
      menu	Submenu_Name	folder {}

    Between the braces, you can have any sort of hierarchy you want – applications, and more submenus. If the program label or submenu label spans multiple words, enclose the string in double quotes. The icon field is the name of the icon file to be used to display a small 16×16 sized icon to the left of the menu entry, a la Win/KDE/GNOME. More on the icon convention after this sub-section. Finally, the “path to executable with options” is how you would call the application via the command-line, with all its options. For instance, the menu entry for my xterm is

    prog XTerm xterm xterm -bg black -fg white -font 7x14 -geometry 120x40

    Hope that example makes things clear. Oh, and one more thing: If IceWM can’t find the executable, it just won’t display it! If you thought you had Gaim installed but didn’t, IceWM won’t find /usr/bin/gaim or whatever, so it’ll just ignore that line! Nice touch, eh?

    About the icon option:
    IceWM expects to find all its icons in some directory. This option can be set in the preferences file (the exact option will be discussed in the section on the preferences file). If not set, it’ll assume the system default. Now, if configured with generic icon handling capabilities, IceWM will look for two .xpm files. For instance, for Mozilla, IceWM will expect to find, in that directory, XPM images named mozilla_16x16.xpm and mozilla_32x32.xpm, which are, of course, 16×16 pixel and 32×32 pixel images. To set this icon in the menu file, simply enter “mozilla” in the icon field. So your entry for mozilla would end up something like

    prog Mozilla mozilla mozilla

    My IceWM installation has the icon directory set as ~/pics/icons . One useful tip: Usually the icons that you want to use will be in PNG format, usually as part of a Gnome or KDE icon theme (think Crystal or Noia). So to convert them to XPM, and the right sizes, you’ll need a couple of carefully crafted shell commands:

    1. First copy all the icons you want from the KDE icon theme into a directory – ideally the one which you’ve chosen as your IceWM icon directory. So you’ll have PNGs like mozilla.png, gaim.png…. Ideally copy the 48×48 icons.
    2. Now we need to convert them to XPM format, and resize them to 16×16 pixels and 32×32 pixels. So for that, on the command line, type
      $ for F in `ls *.png`
      > do
      > convert $F -resize 16x16 `basename $F .png`_16x16.xpm
      > convert $F -resize 32x32 `basename $F .png`_32x32.xpm
      > done

    With this, you’ll have populated your icon directory.

    Here’s a listing of my menu file, and the menu it produces:

    prog Firefox firefox /home/rahul/local/firefox/firefox
    prog Thunderbird thunderbird /home/rahul/local/thunderbird/thunderbird
    prog Opera opera opera
    prog Mozilla mozilla /home/rahul/local/mozilla/mozilla
    prog FTP gftp /home/rahul/local/gftp/bin/gftp
    prog Gaim gaim gaim
    prog GVim vim gvim
    prog Nedit nedit nedit
    prog XMMS xmms xmms
    prog XCalc xcalc xcalc
    menu "More Progs"	folder {
    	prog " Writer" kword oowriter
    	prog "Gimp 2.0" gimp gimp-2.0
    	prog Konqueror kfm kfmclient openProfile filemanagement
    	prog GKrellm gkrellm gkrellm
    	prog Dillo app dillo
    	prog K3B k3b k3b
    prog MPlayer mplayer gmplayer
    menu "Configs"	folder {
    	prog Preferences app gvim /home/rahul/.icewm/preferences
    	prog Toolbar app gvim /home/rahul/.icewm/toolbar
    	prog Menu app gvim /home/rahul/.icewm/menu
    	prog Keys app gvim /home/rahul/.icewm/keys
    	prog "Win Options" app gvim /home/rahul/.icewm/winoptions
    	prog "bashrc" app gvim /home/rahul/.bashrc
    	prog "bash_profile" app gvim /home/rahul/.bash_profile
    	prog "xbindkeys" app gvim /home/rahul/.xbindkeysrc
    	prog "Xclients" app gvim /home/rahul/.Xclients
    menu "System"	folder {
    	prog "Logout" app killall icewm-session
    	prog "Halt" app halt -p
    	prog "Reboot" app reboot

  2. keys (~/.icewm/keys)

    IceWM’s got excellent support for keyboard shortcuts. The IceWM manual goes so far as to say you can use IceWM without a mouse. Indeed, you can control all aspects of the window manager – minimising/maximising/moving, workspace navigation, and so on – with keystrokes (this is done via the preferences file). In addition, IceWM includes a configuration file that you can use to launch arbitrary applications using arbitrary keyboard shortcuts. This is the ‘keys’ file. Its syntax is exceedingly simple:

    key Keystroke+Combination executable -with -options

    And here’s my keyfile listing:

    # Rahul Gaitonde's IceWM keys file.
    key "F15" xterm -bg black -fg white -font 7x14 -geometry 120x40
    key "Ctrl+Alt+f" /home/rahul/local/firefox/firefox
    key "Ctrl+Alt+t" /home/rahul/local/thunderbird/thunderbird
    key "F16" killall -QUIT icewm-session
    key "Ctrl+KP_Divide" aumix -v -5	# lower volume
    key "Ctrl+KP_Multiply" aumix -v +5	# raise volume
    key "Ctrl+KP_Subtract" aumix -v 0	# mute

    Obviously, pressing the Control key, Alt key and ‘f’ simultaneously, would launch Mozilla Firefox. That’s fine, but what the hell is F15? or F16? No, dear reader, I have not managed to get hold of a very complex keyboard with numerous additional keys; I’ve simply mapped my two Windows “start menu” keys and the other “right-click” key to F13, F14 and F15, from left to right. In addition, my keyboard has four smaller keys at the top right hand side, labelled “Turbo”, “Power”, “Sleep” and “Wakeup”, 3 of whose keycodes can be picked up by xev. They’ve been mapped to F16, F17 and F18, left to right. This mapping’s been done via xmodmap. Use “man xmodmap” for more information on this tool.

    Anyways, as you can see, pressing the “right-click” button, now F15, launches an xterm. This, I’ve discovered, is an even faster way of launching your favourite terminal emulator than, say, Ctrl+t or similar.

    The last 3 lines are a huge convenience – adjusting the volume, no matter what application has current keyboard focus. I use the OSS sound drivers, so my volume is adjusted using aumix. If you’re using ALSA, use alsamixer instead. Experiment on your own; I’ve never tried. ALSA always gives me slightly inferior sound quality – and I can’t take that – I love my music and I’ve spent a lot of money on my speaker system! So I increase the volume with the control key and the ‘*’ key on the numeric keypad (hence the ‘KP_’ in the key name). To find the name for a key, look carefully at the output of xev; the “keycode” section gives the scan code for the key.

  3. toolbar (~/.icewm/toolbar)

    The toolbar is the area just to the left of the start button. It exists to allow one-click access to the most heavily used applications. I’ve come to the conclusion that most users will use either the keys file or the toolbar file. Those that prefer the mouse will pack their toolbar with apps; those whose fingers are stuck to their keyboards, will prefer to launch their apps via the keyboard. I’m part of the latter category, so I don’t even use a toolbar.

    The syntax of the toolbar exactly the same as the one for the menu file, but of course, no submenus!

    Here’s a screenshot of an ad-hoc toolbar I made:

  4. winoptions (~/.icewm/winoptions)

    The winoptions file defines which applications go on which workspace (virtual desktop). In addition, you can define what kind of border it has, whether or not it appears on the taskbar, in the window list, on all workspaces, in the system tray; its layer (below, above all other windows), its geometry, whether it will be moveable, resizable, closable, and much more. A comprehensive list of all options is given in the section on Window Options in the IceWM manual.

    The syntax of this file is value

    To make it clearer, consider the entry for xmms in my winoptions file. I spend extended periods of time at my computer, and I like music playing at very low volumes while I’m working. I don’t want xmms to be present on my current workspace, or on all workspaces. I want it in some far-off wokspace, playing a huge playlist. At the same time, I don’t want the hassle of launching it and then moving it to that workspace – since I always do that, there has to be a way of automating it. So I tell IceWM via the winoptions file, that I’d like my xmms instance to be moved to workpace so-and-so as soon as it’s launched. So my entry is

    xmms.workspace: 3

    which puts xmms onto the 4th workspace, no matter when or where it’s started from.

    Another example – I want to have an xterm ready for me to work on whenever I log in to IceWM. The simplest solution would be for me to put an entry for xterm in my .Xclients file, and write

    xterm.workspace: 0

    in my winoptions file, so that I’d be on workspace 0, ready with the xterm when IceWM starts up. But think again. Now, every time I were to launch an xterm, it’d get placed on workspace 0, which is not what I want! So what do I do? Be Smart. In my .Xclients file, I change the line that launches xterm to include the option

    -name init

    and in my winoptions file, I add the line

    init.workspace: 0

    What happens, is that ONLY that particular instance of xterm is placed on workspace 0.

    This is something that I picked up from the Internet – winoptions for running gkrellm.

    # GKrellm requires some special settings
    gkrellm.ignoreWinList: 1
    gkrellm.ignoreTaskBar: 1
    gkrellm.ignoreQuickSwitch: 1

    Essentially, place gkrellm on all workspaces, do not place in in the taskbar, and do not show in the Quickswitch (Alt+Tab) list, and do not show it in the Window List box.

  5. preferences (~/.icewm/preferences)

    OK. This is the one huge file among the five. My preferences file is 838 lines long. Don’t be surprised, though. This file contains settings for each and every aspect of IceWM that you can think up of, and plenty that you can’t. This is the place to tweak IceWM. In fact, this file contains so many options to set, some obvious, some esoteric, that I haven’t seen a single graphical utility that does a good job of presenting all this to you in a well formatted, categorised manner. Again, you’re better off editing this file by hand.

    No, really. Each option is preceded by a line or two, explaining the option. There’s also a blank line between two consecutive options, so that explains why the file is so goddamned large! The options themselves are pretty straightforward and consistent in their naming.

    What I’m going to do now, is list a few lines from my preferences file, to get you started on editing your own preferences file. I don’t think any option really needs to be explained.

    # Rahul's IceWM preferences
    # Those settings commented out will use system default/theme-specified values
    # Misc. Global Settings
    ShutdownCommand="halt -p"
    WorkspaceNames= " 1 ", " 2 ", " 3 ", " 4 "
    DesktopBackgroundColor = "rgb:00/00/40"
    DesktopBackgroundImage = "/home/rahul/pics/wallpapers/apple/redmond-2.jpg"
    # Taskbar Settings
    # Menu Settings
    # Keyboard Shortcuts

3.3. Graphical configuration tools

Don’t like ’em… don’t use ’em.

4. IceWM Themes

IceWM has hundreds of themes written for it! As I said at the beginnning of this page, IceWM is very themeable. Find links for two sites chock-full of IceWM themes in the next section on Links for IceWM. You can even write your own themes – it’s very simple. There’s a guide at

Here are a few of my favourite themes. Most have been lightly hacked to suit my desktop. I haven’t changed any accompanying documentation, so the names of the original authors, their contact addresses and email addresses have been preserved. In fact, none of these even contain any references to me. Use them all you want – all of them are freely distributable – but contact the original author in case of problems/anything else!

I’ve also heavily hacked a theme named “Fake95”, and made it look as much as possible like Windows NT 4.0, based on a bunch of screenshots that I had. Here’s the tarball.

IceWM Links

The home page.

Manuals from IceWM’s Home Pages.

Theme sites.

Some useful IceWM pages.

Window Managers v/s Desktop Environments

The X Window System (often just X) is the program that provides the capabilities for running graphical applications on Linux (for that matter, UNIX). It controls the hardware – keyboard, mouse, touchpad, monitor. This is so that the apps themselves don’t need to bother about the underlying hardware. All they do is “talk” to X. X makes applications display their interfaces on screen but doesn’t bother about how the apps are displayed, or the windows themselves. This is the famous “mechanism, not policy” distinction that the X Window System makes.

The program that does control the displaying of windows on the screen is the Window Manager, which in essence is an X program. The window manager (WM) controls the look and feel of the windows – the decorations. It also controls how the windows act. So it manages the moving, hiding, resizing, iconifying and closing windows. It determines which window is on top, handles the overlapping, determines which window gets the input from the user. Finally, it controls the manner in which the above tasks are initiated – that is, which keyboard/mouse buttons correspond to which actions.

Additionally, a WM may provide additional capability – mapping key combinations to launch arbitrary applications, or providing a task bar and menu, like IceWM, or providing a number of Virtual Desktops, and so on. These are not strictly required of a WM. Metacity, which is GNOME’s default WM, does not provide a menu or taskbar and leaves that to gnome-panel.

Examples of WMs are IceWM, Fluxbox, WindowMaker, FVWM, Metacity, Sawfish, AfterStep, Blackbox, OpenBox. There are literally dozens more, all with different aims (eye-candy, productivity, low resource usage…)

Optionally, a window manager may be part of a larger suite of tools called a Desktop Environment. The Desktop Environment, manages the entire desktop, in addition to just the windows. A Desktop Environment may provide its own graphical toolkit (the way GNOME uses GTK+ and KDE uses QT), features such as icons on the desktop, screensavers, a file manager, a framework for inter-application communication (the way GNOME’s got Bonobo and KDE’s got DCOP and KParts), and so on. However, a WM must still manage the windows. GNOME uses Metacity as its default WM, but it’s used WindowMaker, Enlightenment and Sawfish in the past. It’s usually quite easy to change GNOME’s default WM, but KDE’s WM, kwm, is tightly integrated into the DE. That makes it a real pain to change, and an even greater pain to live without later.

About the author:
Rahul Gaitonde is a developer at IBM Global Services, Pune, India. While his first experience with Linux was RedHat 6.0 in 2000, today he uses Fedora Core 2. He often writes about Linux-related issues, especially pertaining to usability, and has previously contributed to Find all his articles and essays at

If you would like to see your thoughts or experiences with technology published, please consider writing an article for OSNews.


  1. 2004-07-22 6:37 pm
  2. 2004-07-22 6:49 pm
  3. 2004-07-22 6:55 pm
  4. 2004-07-22 6:57 pm
  5. 2004-07-22 7:01 pm
  6. 2004-07-22 7:04 pm
  7. 2004-07-22 7:06 pm
  8. 2004-07-22 7:08 pm
  9. 2004-07-22 7:25 pm
  10. 2004-07-22 7:42 pm
  11. 2004-07-22 7:47 pm
  12. 2004-07-22 7:54 pm
  13. 2004-07-22 7:54 pm
  14. 2004-07-22 7:57 pm
  15. 2004-07-22 7:59 pm
  16. 2004-07-22 9:01 pm
  17. 2004-07-22 9:06 pm
  18. 2004-07-22 9:11 pm
  19. 2004-07-22 9:22 pm
  20. 2004-07-22 9:32 pm
  21. 2004-07-22 9:33 pm
  22. 2004-07-22 9:42 pm
  23. 2004-07-22 10:07 pm
  24. 2004-07-22 10:22 pm
  25. 2004-07-22 10:33 pm
  26. 2004-07-22 10:35 pm
  27. 2004-07-22 10:37 pm
  28. 2004-07-22 10:41 pm
  29. 2004-07-22 10:42 pm
  30. 2004-07-22 10:50 pm
  31. 2004-07-22 10:56 pm
  32. 2004-07-22 11:07 pm
  33. 2004-07-22 11:09 pm
  34. 2004-07-22 11:10 pm
  35. 2004-07-22 11:18 pm
  36. 2004-07-22 11:37 pm
  37. 2004-07-22 11:58 pm
  38. 2004-07-23 12:24 am
  39. 2004-07-23 12:40 am
  40. 2004-07-23 12:44 am
  41. 2004-07-23 1:29 am
  42. 2004-07-23 1:32 am
  43. 2004-07-23 1:50 am
  44. 2004-07-23 1:58 am
  45. 2004-07-23 2:34 am
  46. 2004-07-23 4:05 am
  47. 2004-07-23 4:16 am
  48. 2004-07-23 4:21 am
  49. 2004-07-23 5:46 am
  50. 2004-07-23 5:57 am
  51. 2004-07-23 7:13 am
  52. 2004-07-23 7:40 am
  53. 2004-07-23 8:07 am
  54. 2004-07-23 8:10 am
  55. 2004-07-23 8:30 am
  56. 2004-07-23 9:08 am
  57. 2004-07-23 11:07 am
  58. 2004-07-23 11:46 am
  59. 2004-07-23 12:23 pm
  60. 2004-07-23 12:54 pm
  61. 2004-07-23 1:22 pm
  62. 2004-07-24 7:50 am
  63. 2004-07-24 6:11 pm
  64. 2004-07-25 5:20 am
  65. 2004-07-27 10:46 am
  66. 2004-07-27 7:16 pm
  67. 2004-07-28 11:25 am