> module Config where xmonad places each window into a "workspace." Each workspace can have any number of windows, which you can cycle though with mod-j and mod-k. Windows are either displayed full screen, or tiled. You can toggle the layout mode with mod-space. You can switch to workspace N with mod-N. For example, to switch to workspace 5, you would press mod-5. Similarly, you can move the current window to another workspace with mod-shift-N. When running with multiple monitors (Xinerama), each screen has exactly 1 workspace visible. When xmonad starts, workspace 1 is on screen 1, workspace 2 is on screen 2, etc. If you switch to a workspace which is currently visible on another screen, xmonad simply switches focus to that screen. If you switch to a workspace which is *not* visible, xmonad replaces the workspace on the *current* screen with the workspace you selected. For example, if you have the following configuration: Screen 1: Workspace 2 Screen 2: Workspace 5 (current workspace) and you wanted to view workspace 7 on screen 1, you would press: mod-2 (to select workspace 2, and make screen 1 the current screen) mod-7 (to select workspace 7) Since switching to the workspace currently visible on a given screen is such a common operation, shortcuts are provided: mod-{w,e,r} switch to the workspace currently visible on screens 1, 2, and 3 respectively. Likewise, shift-mod-{w,e,r} moves the current window to the workspace on that screen. Using these keys, the above example would become mod-w mod-7. Some imports we need: > import Data.Ratio > import Data.Bits > import qualified Data.Map as M > import System.Exit > import Graphics.X11.Xlib > import XMonad > import Operations The number of workspaces: > workspaces :: Int > workspaces = 9 modMask lets you easily change which modkey you use. The default is mod1Mask. ("alt") > modMask :: KeyMask > modMask = mod1Mask The default size for the left pane. > defaultLeftWidth :: Rational > defaultLeftWidth = 1%2 How much to change the size of the windows on the left by default. > defaultDelta :: Rational > defaultDelta = 3%100 The mask for the numlock key. You may need to change this on some systems. > numlockMask :: KeySym > numlockMask = lockMask The keys list. > keys :: M.Map (KeyMask, KeySym) (X ()) > keys = M.fromList $ > [ ((modMask .|. shiftMask, xK_Return), spawn "xterm") > , ((modMask, xK_p ), spawn "exe=`emenu_path | dmenu` && exec $exe") > , ((controlMask, xK_space ), spawn "gmrun") > , ((modMask, xK_Tab ), raise GT) > , ((modMask, xK_j ), raise GT) > , ((modMask, xK_k ), raise LT) > , ((modMask, xK_h ), changeWidth (negate defaultDelta)) > , ((modMask, xK_l ), changeWidth defaultDelta) > , ((modMask .|. shiftMask, xK_c ), kill) > , ((modMask .|. shiftMask, xK_q ), io $ exitWith ExitSuccess) > , ((modMask .|. shiftMask, xK_F12 ), io restart) > , ((modMask, xK_space ), switchLayout) > , ((modMask, xK_Return), promote) > ] ++ Keybindings to each workspace: > [((m .|. modMask, xK_0 + fromIntegral i), f i) > | i <- [1 .. workspaces] > , (f, m) <- [(view, 0), (tag, shiftMask)]] Keybindings to each screen: > ++ > [((m .|. modMask, key), screenWS sc >>= f) > | (key, sc) <- zip [xK_w, xK_e, xK_r] [1..] > , (f, m) <- [(view, 0), (tag, shiftMask)]]