treewm is a window manager that tries to implement a new concept. In addition to the client windows the user can create desktops which can themselves contain windows and desktops. By arranging the windows in such a tree the user is able to manage his tasks efficiently. treewm is derived by aewm Some bugs/problems are discussed in PROBLEMS Start the window manager: $ X & or $ X :1 & # Press CTRL+ALT+F1 or something like that $ DISPLAY=:0 or $ DISPLAY=:1 $ xterm & $ treewm If you want to start the X window system vi xdm or startx, create an appropriate ~/.xsession file including as last entry treewm A more advanced version of ~/.xsession could look like #!/bin/bash xset m 5 xterm & xsetbg MyFavoriteWallPaper.jpg treewm while xmessage 'Restart Window Manager?' -buttons Yes:0,No:1 -nearmouse; # Just in case treewm crashes or if you want to experiment with the # configfile do treewm; done Introduction (Read this carefully, you won't be able to understand all of treewm's features otherwise): I'm afraid not everything in this README describes the actual behaviour of treewm. If you have any question about how certain things work, feel free to write me a mail. Also have a look at the FAQ. When you start treewm, you've only got one desktop and all client windows are children of this root desktop. Then you can create children of this desktop which can have other desktops as children themselves. You can move windows and desktops arbitrarily around between desktop. Each window has a titlebar. This titlebar is a taskbar as well, desktops have taskbar entries for all their children. Using the mouse, you can perform the following actions: note that raise also means that the icons (if it's a desktop) are raised or lowered Titlebar - clicks: left button: move (and view window-content) + Shift: make window 'always on top' double click with two different buttons: shade middle button + Shift: remove 'always on top' / 'always below' right button + Shift: make window 'always below' (can be combined with 'always on top' to allow to raise to the top and to lower to the bottom) Clicks on taskbar entries: left button: raise middle button: restack window directly below the window you click on next with the middle button move mouse: move window onto another desktop right button: lower move mouse: client menu Double clicks on taskbar entries: left button: create new desktop + Mod1(Alt): collect all windows under the new desktop middle button: select desktop on which new windows are created if the window has the focus right button: lower window to bottom Clicks on first button: left button : maximize (titlebar not visible) + Mod1(Alt): maximize vertically (titlebar not visible) middle button: maximize (titlebar visible) + Mod1(Alt): maximize vertically (titlebar visible) right button: resize + Mod1(Alt): maximize horizontally Clicks on second button: left button: close window (double click kills) + Mod1(Alt): release all windows to parent if this is a desktop middle button: iconify right button: move Clicks on desktop background (or on normal window while Alt is pressed, if you press Ctrl actions are performed on the parent): left button: raise move mouse: move / resize (depends on where you click) middle button: see above move mouse: change position of virtual desktop right button: lower move mouse: menu Clicks on icons left button: perform action move mouse: move icon middle button: reparent icon + Ctrl: copy icon right button: raise/lower icons Moving mouse out of a Desktop with Alt pressed and VirtualX/VirutalY set or moving mouse out of a Desktop with Autoscroll on: move virtual desktop by screenwidth/screenheight Moving mouse with Button1 pressed: change virtual position With Shift (+ Alt) pressed, there are three menus available: left button: application menu (see default.cfg), this one is also available on the root desktop without Alt or Shift middle btton: all windows menu right button: all windows under pointer menu Since release 0.4.0, there is a vi-like command mode. You can access it by pressing Alt+Space, and exit it by Alt+Space again, by Esc or by pressing Return when the line is empty. There are two kinds of commands: one-key-commands that are executed immediately after the keys are pressed and one-line-commands which are executed after the line is finished by Return. Upon startup, treewm creates a fifo file called .cmdtreewm. When you write commands to this file, they are executed as well as if there were typed in the command mode. A list of accepted commands (not in a particular order): Commands for both icons and windows: /regex: Search for a window whose title matches the regular expression n,N: Find next/previous match "xcmd Execute command 'cmd' on window in register x "'cmd Execute commmand 'cmd' on root window !cmd Execute shell command cmd @action Execute action 'action' $menu Show menu 'menu' : Execute text command (see below) t,T Show current window (like Alt+Tab) R Execute the following command recursively (from root desktop) ? Open Menu Commands for windows "ad,...,"zd Put current window into register a,...,z "ay,...,"zy Put current window into register a,...,z d,y Put current window into special register p Insert window from special register under current desktop "ap,...,"zp Insert window from register a,...,z unter current desktop Space Raise current window P Raise current window and all parents g Goto current window S (Un)Shade s (Un)Stick Ctrl+M Maximize (Fullscreen) (experimental) m Maximize (Half) M Maximize (Full) h,H,Ctrl+H Next window (h gives Focus, H raises, Ctrl+H moves the window in the window list) l,L,Ctrl+L Previous window k,K,Ctrl+K Go/Move window up j,J,Ctrl+J Go/Move window down i Show/Hide icons I Iconify window q Close window Q Destroy window c Move window C Resize window D Create desktop Ctrl+d,E Create desktop and collect windows Ctrl+q,e Close desktop and release windows x Lower window X Lower window and parents Ctrl+X Lower window below everything =name Rename desktop to name a Make window always on top A Make window always below t Next window (like Alt+Tab) T Previous window (like Alt+Tab) r Execute the following command recursively (from current desktop) o Make Hole O Delete Hole The following commands are only interpreted if an icon is currently selected SPACE: Execute the Icon h,l,j,k: Move around between icons (like in vi) =: Name the Icon +: Set the command associated with the icon q: Delete the Icon Text Commands: :bind Binds a key to a certain command (e.g. :bind alt+q :quit) :quit/:exit Exits treewm :set Sets an option to true (is inherited by children) :unset Sets an option to false (is inherited by children) :toggle Toggles an option (is inherited by children) :remove Sets an option to the default (inherit it from parent) :cset These commands set/unset the option only for the children :cunset of this desktop but leave the desktop unchanged :ctoggle :cremove :dset These command set/unset the option only for this desktop :dunset itself and leave the children unchanged :dtoggle :dremove Options for windows and desktops: shaded: shade window autoshade: shade window when pointer is moved out of it (experimental) fixedsize: don't allow size change noclose: don't allow close nominimize: don't allow minimize sticky: window doesn't change its position when the virtual position of its parent desktop is changed hastitle: the window has a title hastbentry: the window has an entry in its parents taskbar grabaltclick: alt clicks are grabbed and interpreted by the wm passfirstclick: if the focus policy is focusonclick, ignore the first click on the window titlebarbuttons: window has buttons in its titlebar snap: window snaps at other window's borders above: window is always on top below: window is always below hidemouse: don't show mouse pointer in the inside of the window raiseonclick: raise the window if you click inside of it raiseonenter: raise the window if you enter it with the mouse focusonclick: give the window the focus if you click inside of it focusonenter: give the window the focus you enter it with the mouse Options for desktops: autoscroll: scroll if you move the pointer out of the window tile: always try to arrange windows so that they are not overlapping autoresize: automatically resize desktop taskbarbuttons: desktop has buttons on the taskbar buttons: combination of options titlebarbuttons and taskbarbuttons grabkeyboard: grab the keyboard and send the events to all children. this way you can input something on more than one window simultaneously Note that xterm by default doesn't accept this kind of input. You either have to enable Allow SendEvents in the Ctrl+Button1 Menu or in the ~/.Xdefaults file: xterm*allowSendEvents:true Note that this is considered to be a security hole by the xterm programmers, but i don't think so because if someone has access to your X server he's already won. With the keyboard, you move around using Mod1 + Up/Down/Left/Right (Mod1 is the Alt key on x86 PCs). If you press the shift key, too, you also raise the windows you are giving the focus to. If you press the control key, you can move the windows between desktops. Additionally, the following keys are defined: Mod1 + Esc : (un)maximize window on whole screen (experimental) Mod1 + + Tab : next window on lowest desktop level Mod1 + Shift + Tab : previous window on lowest desktop level Mod1 + Space : raise window (Control raises parents, too) Mod1 + Shift + Space : lower window Mod1 + + PgUp : put window on a higher stacking level Mod1 + + PgDown : put window on a lower stacking level Mod1 + F1 : execute action key1 Mod1 + Shift + F1 : execute action key2 Mod1 + F3 : shade Mod1 + Shift + F3 : minimize Mod1 + F4 : close window (no desktops) Mod1 + Shift + F4 : kill (destroy) window, close desktop Mod1 + F5 : move window (stop moving with space/return/esc) Mod1 + Shift + F5 : resize window Mod1 + F6 : maximize (titlebar not visible) Mod1 + Shift + F6 : maximize (titlebar visible) Mod1 + F7 : show/hide icons Mod1 + Shift + F7 : create desktop Mod1 + + F8-F12 : go to quick access window Mod1 + Shift + F8-F12 : set quick access window You can define the treewm's behaviour in the file ~/.treewm. If you want to choose a different config file, just run treewm with the option -f . Case is ignored, the following sections are interpreted: [Sceme ] [Client ] [Action ] [Menu ] In these sections you can provide options by lines like tag = value Sections can be ended and later continued. If there are more than one values for one tag, i.e. tag = value1 tag = value2 the last value in the config file is used. You can include the information of other sections by writing include = ... Note that you can include more than one section by this line and that only those pieces of information are included that were given in the config file before that line. A Sceme defines the appearance, you can set colors, fonts, pixmaps... You can have multiple scemes, each window belongs to one of these scemes then. A client section contains information about a specific client, for instance the window position. An action usually is an icon on a desktop which can be used to start an application or a desktop (with properties defined in one of the client sections). Actions with names key1, key2, key3 are used as keyboard shortcuts. The menu section defines a menu you can access with Shift (+ Alt) + middle button. If you don't give a section name in a sceme section, this is used as a default for all windows. The only menu section currently used is the one without section name. The complete syntax and the defaults of .treewm can be found in the file default.cfg. It is strongly recommended that you create a .treewm file. Look at the files default.cfg or sample.cfg for details. There is a problem with actions: if treewm starts a program it can't always tell whether the windows that appear belong to this client. By default, treewm gives the next window that is being mapped the client info specified in the action. Some (but not all, unfortunately) apps set the WM_COMMAND property on their windows. If you write WM_COMMAND = true in an action section, the next window whose WM_COMMAND property is the string the app was started with gets the client info supplied by this section. To find out which apps set WM_COMMAND use xprop (if there is no WM_COMMAND but a WM_CLIENT_LEADER property, type xprop -id ). Note that xprop is buggy and does not work correctly with treewm. You can provide a regular expression the title is checked for by writing Regex = or you can define a Class Hint the application must set (almost every application provides a Class Hint, use xprop to find out about that, for details, see default.cfg). treewm is _not_ icccm-compliant and will never be. There are lots of window mangers out there, so why write another one? Well, I think I had some good ideas that are not implemented in any of the big window managers. I was impressed by pwm, the only wm I saw which was able to use the screen's space reasonably. But I thought window managemant could become even more efficient if the windows are arranged in a tree rather than in a list, with the windows being leaf nodes. Many wms use multiple desktops, so you might think of treewm's concept as a kind of generalization of their concepts. In my opinion, a tree is the natural way of arranging tasks. For example if want to write and debug a program, you can create one desktop with the editor windows, then, on the same level of the hierachy you can run and test your program and if you want to have a look at the source you just change the desktop and the windows are arranged exactly in the same way they were before. If you feel like doing something completely different you just have to create another second-level desktop in which you can do what you want and later change to your old project again. Another important advantage of this concept is its flexibility. There are situations in which certain options (for example the focus policy) are quite convenient whereas they're quite annoying in another one. So you should be able not only to change them globally but also to change them only for a special application, that means for a special desktop. A special window attribute of some wms, the sticky attribute, occurs in treewm in a quite natural way, it simply means that the window is on the parent desktop. Looking at many different wms, I found out that no window manager has a concept similar to that (though this the most important concept of X) so I finally decided to create such a window manager myself. Sorry for my english! Thomas Jäger Thomas Jäger