xmonad 0.5 → 0.6
raw patch · 15 files changed
+235/−180 lines, 15 filesdep +QuickCheckdep +randomdep ~X11
Dependencies added: QuickCheck, random
Dependency ranges changed: X11
Files
- Main.hs +20/−7
- README +1/−1
- XMonad/Config.hs +18/−9
- XMonad/Core.hs +60/−39
- XMonad/Layout.hs +1/−1
- XMonad/Main.hs +11/−6
- XMonad/ManageHook.hs +1/−1
- XMonad/Operations.hs +30/−26
- XMonad/StackSet.hs +1/−1
- man/xmonad.1 +13/−19
- man/xmonad.1.in +13/−19
- man/xmonad.hs +9/−2
- man/xmonad.html +26/−39
- tests/Properties.hs +3/−3
- xmonad.cabal +28/−7
Main.hs view
@@ -1,6 +1,6 @@ ---------------------------------------------------------------------------- -- |--- Module : Main.hs+-- Module : Main -- Copyright : (c) Spencer Janssen 2007 -- License : BSD3-style (see LICENSE) --@@ -14,21 +14,34 @@ module Main (main) where -import XMonad.Main-import XMonad.Config-import XMonad.Core (getXMonadDir, recompile)+import XMonad import Control.Exception (handle) import System.IO+import System.Info import System.Environment import System.Posix.Process (executeFile) +#ifdef TESTING+import qualified Properties+#endif+ -- | The entry point into xmonad. Attempts to compile any custom main -- for xmonad, and if it doesn't find one, just launches the default. main :: IO () main = do- handle (hPrint stderr) buildLaunch- xmonad defaultConfig -- if buildLaunch returns, execute the trusted core+ args <- getArgs+ let launch = handle (hPrint stderr) buildLaunch >> xmonad defaultConfig+ case args of+ [] -> launch+ ["--resume", _] -> launch+ ["--recompile"] -> recompile False >> return ()+ ["--recompile-force"] -> recompile True >> return ()+ ["--version"] -> putStrLn "xmonad 0.5"+#ifdef TESTING+ ("--run-tests":_) -> Properties.main+#endif+ _ -> fail "unrecognized flags" -- | Build "~/.xmonad/xmonad.hs" with ghc, then execute it. If there are no -- errors, this function does not return. An exception is raised in any of@@ -45,5 +58,5 @@ recompile False dir <- getXMonadDir args <- getArgs- executeFile (dir ++ "/xmonad") False args Nothing+ executeFile (dir ++ "/xmonad-"++arch++"-"++os) False args Nothing return ()
README view
@@ -72,7 +72,7 @@ mtl http://hackage.haskell.org/cgi-bin/hackage-scripts/package/mtl-1.0 unix http://hackage.haskell.org/cgi-bin/hackage-scripts/package/unix-2.0 - X11 http://hackage.haskell.org/cgi-bin/hackage-scripts/package/X11-1.3.0+ X11 http://hackage.haskell.org/cgi-bin/hackage-scripts/package/X11-1.4.1 * Build xmonad:
XMonad/Config.hs view
@@ -10,9 +10,13 @@ -- Portability : portable -- -- This module specifies the default configuration values for xmonad.--- Users should not modify this file. Rather, they should provide their--- own @~\/.xmonad\/xmonad.hs@ that overrides specific fields in defaultConfig. --+-- DO NOT MODIFY THIS FILE! It won't work. You may configure xmonad+-- by providing your own @~\/.xmonad\/xmonad.hs@ that overrides+-- specific fields in 'defaultConfig'. For a starting point, you can+-- copy the @xmonad.hs@ found in the @man@ directory, or look at+-- examples on the xmonad wiki.+-- ------------------------------------------------------------------------ module XMonad.Config (defaultConfig) where@@ -22,10 +26,12 @@ -- import XMonad.Core as XMonad hiding (workspaces,manageHook,numlockMask,keys,logHook,borderWidth,mouseBindings- ,defaultGaps,layoutHook,modMask,terminal,normalBorderColor,focusedBorderColor)+ ,defaultGaps,layoutHook,modMask,terminal,normalBorderColor,focusedBorderColor+ ,focusFollowsMouse) import qualified XMonad.Core as XMonad (workspaces,manageHook,numlockMask,keys,logHook,borderWidth,mouseBindings- ,defaultGaps,layoutHook,modMask,terminal,normalBorderColor,focusedBorderColor)+ ,defaultGaps,layoutHook,modMask,terminal,normalBorderColor,focusedBorderColor+ ,focusFollowsMouse) import XMonad.Layout import XMonad.Operations@@ -113,9 +119,7 @@ manageHook :: ManageHook manageHook = composeAll [ className =? "MPlayer" --> doFloat- , className =? "Gimp" --> doFloat- , resource =? "desktop_window" --> doIgnore- , resource =? "kdesktop" --> doIgnore ]+ , className =? "Gimp" --> doFloat ] ------------------------------------------------------------------------ -- Logging@@ -163,6 +167,10 @@ terminal :: String terminal = "xterm" +-- | Whether focus follows the mouse pointer.+focusFollowsMouse :: Bool+focusFollowsMouse = True+ -- | The xmonad key bindings. Add, modify or remove key bindings here. -- -- (The comment formatting character is used when generating the manpage)@@ -207,7 +215,7 @@ -- quit, or restart , ((modMask .|. shiftMask, xK_q ), io (exitWith ExitSuccess)) -- %! Quit xmonad- , ((modMask , xK_q ), broadcastMessage ReleaseResources >> restart (Just "xmonad") True) -- %! Restart xmonad+ , ((modMask , xK_q ), restart "xmonad" True) -- %! Restart xmonad ] ++ -- mod-[1..9] %! Switch to workspace N@@ -249,4 +257,5 @@ , XMonad.keys = keys , XMonad.logHook = logHook , XMonad.mouseBindings = mouseBindings- , XMonad.manageHook = manageHook }+ , XMonad.manageHook = manageHook+ , XMonad.focusFollowsMouse = focusFollowsMouse }
XMonad/Core.hs view
@@ -5,7 +5,7 @@ ----------------------------------------------------------------------------- -- |--- Module : XMonad/Core.hs+-- Module : XMonad.Core -- Copyright : (c) Spencer Janssen 2007 -- License : BSD3-style (see LICENSE) --@@ -24,13 +24,13 @@ XConf(..), XConfig(..), LayoutClass(..), Layout(..), readsLayout, Typeable, Message, SomeMessage(..), fromMessage, runLayout, LayoutMessages(..),- runX, catchX, userCode, io, catchIO,- withDisplay, withWindowSet, isRoot,+ runX, catchX, userCode, io, catchIO, doubleFork,+ withDisplay, withWindowSet, isRoot, runOnWorkspaces, broadcastMessage, getAtom, spawn, restart, getXMonadDir, recompile, trace, whenJust, whenX, atom_WM_STATE, atom_WM_PROTOCOLS, atom_WM_DELETE_WINDOW, ManageHook, Query(..), runManageHook ) where -import XMonad.StackSet+import XMonad.StackSet hiding (modify) import Prelude hiding ( catch ) import Control.Exception (catch, bracket, throw, Exception(ExitException))@@ -38,11 +38,11 @@ import Control.Monad.State import Control.Monad.Reader import System.IO+import System.Info import System.Posix.Process (executeFile, forkProcess, getProcessStatus, createSession) import System.Process import System.Directory import System.Exit-import System.Environment import Graphics.X11.Xlib import Graphics.X11.Xlib.Extras (Event) import Data.Typeable@@ -73,22 +73,22 @@ -- todo, better name data XConfig l = XConfig- { normalBorderColor :: !String -- ^ Non focused windows border color. Default: \"#dddddd\"- , focusedBorderColor :: !String -- ^ Focused windows border color. Default: \"#ff0000\"- , terminal :: !String -- ^ The preferred terminal application. Default: \"xterm\"- , layoutHook :: !(l Window) -- ^ The avaiable layouts- , manageHook :: !ManageHook- -- ^ The action to run when a new window is opened- , workspaces :: [String] -- ^ The list of workspaces' names- , defaultGaps :: [(Int,Int,Int,Int)] -- ^ The list of gaps, per screen- , numlockMask :: !KeyMask -- ^ The numlock modifier- , modMask :: !KeyMask -- ^ the mod modifier- , keys :: XConfig Layout -> M.Map (ButtonMask,KeySym) (X ())- -- ^ The key binding: a map from key presses and actions- , mouseBindings :: XConfig Layout -> M.Map (ButtonMask, Button) (Window -> X ())- -- ^ The mouse bindings- , borderWidth :: !Dimension -- ^ The border width- , logHook :: X () -- ^ The action to perform when the windows set is changed+ { normalBorderColor :: !String -- ^ Non focused windows border color. Default: \"#dddddd\"+ , focusedBorderColor :: !String -- ^ Focused windows border color. Default: \"#ff0000\"+ , terminal :: !String -- ^ The preferred terminal application. Default: \"xterm\"+ , layoutHook :: !(l Window) -- ^ The available layouts+ , manageHook :: !ManageHook -- ^ The action to run when a new window is opened+ , workspaces :: ![String] -- ^ The list of workspaces' names+ , defaultGaps :: ![(Int,Int,Int,Int)] -- ^ The list of gaps, per screen+ , numlockMask :: !KeyMask -- ^ The numlock modifier+ , modMask :: !KeyMask -- ^ the mod modifier+ , keys :: !(XConfig Layout -> M.Map (ButtonMask,KeySym) (X ()))+ -- ^ The key binding: a map from key presses and actions+ , mouseBindings :: !(XConfig Layout -> M.Map (ButtonMask, Button) (Window -> X ()))+ -- ^ The mouse bindings+ , borderWidth :: !Dimension -- ^ The border width+ , logHook :: !(X ()) -- ^ The action to perform when the windows set is changed+ , focusFollowsMouse :: !Bool -- ^ Whether window entry events can change focus } @@ -303,17 +303,31 @@ getProcessStatus True False pid return () --- | Restart xmonad via exec().------ If the first parameter is 'Just name', restart will attempt to execute the--- program corresponding to 'name'. Otherwise, xmonad will attempt to execute--- the name of the current program.+-- | Send a message to all visible layouts, without necessarily refreshing.+-- This is how we implement the hooks, such as UnDoLayout.+broadcastMessage :: Message a => a -> X ()+broadcastMessage a = runOnWorkspaces $ \w -> do+ ml' <- handleMessage (layout w) (SomeMessage a) `catchX` return Nothing+ return $ w { layout = maybe (layout w) id ml' }++-- | This is basically a map function, running a function in the X monad on+-- each workspace with the output of that function being the modified workspace.+runOnWorkspaces :: (WindowSpace -> X WindowSpace) -> X ()+runOnWorkspaces job = do+ ws <- gets windowset+ h <- mapM job $ hidden ws+ c:v <- mapM (\s -> (\w -> s { workspace = w}) <$> job (workspace s))+ $ current ws : visible ws+ modify $ \s -> s { windowset = ws { current = c, visible = v, hidden = h } }++-- | @restart name resume@. Attempt to restart xmonad by executing the program+-- @name@. If @resume@ is 'True', restart with the current window state.+-- When executing another window manager, @resume@ should be 'False'. ----- When the second parameter is 'True', xmonad will attempt to resume with the--- current window state.-restart :: Maybe String -> Bool -> X ()-restart mprog resume = do- prog <- maybe (io getProgName) return mprog+restart :: String -> Bool -> X ()+restart prog resume = do+ broadcastMessage ReleaseResources+ io . flush =<< asks display args <- if resume then gets (("--resume":) . return . showWs . windowset) else return [] catchIO (executeFile prog True args Nothing) where showWs = show . mapLayout show@@ -331,20 +345,25 @@ -- The -i flag is used to restrict recompilation to the xmonad.hs file only. -- -- Compilation errors (if any) are logged to ~\/.xmonad\/xmonad.errors. If--- GHC indicates failure with a non-zero exit code, an xmessage containing--- GHC's is spawned.+-- GHC indicates failure with a non-zero exit code, an xmessage displaying+-- that file is spawned. ---recompile :: MonadIO m => Bool -> m ()+-- False is returned if there is compilation errors.+--+recompile :: MonadIO m => Bool -> m Bool recompile force = io $ do dir <- getXMonadDir- let bin = dir ++ "/" ++ "xmonad"- err = bin ++ ".errors"- src = bin ++ ".hs"+ let binn = "xmonad-"++arch++"-"++os+ bin = dir ++ "/" ++ binn+ base = dir ++ "/" ++ "xmonad"+ err = base ++ ".errors"+ src = base ++ ".hs" srcT <- getModTime src binT <- getModTime bin- when (force || srcT > binT) $ do+ if (force || srcT > binT)+ then do status <- bracket (openFile err WriteMode) hClose $ \h -> do- waitForProcess =<< runProcess "ghc" ["--make", "xmonad.hs", "-i", "-no-recomp", "-v0"] (Just dir)+ waitForProcess =<< runProcess "ghc" ["--make", "xmonad.hs", "-i", "-no-recomp", "-v0", "-o",binn] (Just dir) Nothing Nothing Nothing (Just h) -- now, if it fails, run xmessage to let the user know:@@ -354,6 +373,8 @@ ["Error detected while loading xmonad configuration file: " ++ src] ++ lines ghcErr ++ ["","Please check the file for errors."] doubleFork $ executeFile "xmessage" True [msg] Nothing+ return (status == ExitSuccess)+ else return True where getModTime f = catch (Just <$> getModificationTime f) (const $ return Nothing) -- | Run a side effecting action with the current workspace. Like 'when' but
XMonad/Layout.hs view
@@ -3,7 +3,7 @@ -- -------------------------------------------------------------------------- -- |--- Module : Layouts.hs+-- Module : XMonad.Layout -- Copyright : (c) Spencer Janssen 2007 -- License : BSD3-style (see LICENSE) --
XMonad/Main.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE MultiParamTypeClasses, FlexibleContexts #-} ---------------------------------------------------------------------------- -- |--- Module : Core.hs+-- Module : XMonad.Main -- Copyright : (c) Spencer Janssen 2007 -- License : BSD3-style (see LICENSE) --@@ -26,7 +26,6 @@ import Graphics.X11.Xlib hiding (refreshKeyboardMapping) import Graphics.X11.Xlib.Extras-import Graphics.X11.Xinerama (getScreenInfo) import XMonad.Core import XMonad.StackSet (new, floating, member)@@ -46,7 +45,7 @@ let dflt = defaultScreen dpy rootw <- rootWindow dpy dflt- xinesc <- getScreenInfo dpy+ xinesc <- getCleanedScreenInfo dpy nbc <- initColor dpy $ normalBorderColor xmc fbc <- initColor dpy $ focusedBorderColor xmc hSetBuffering stdout NoBuffering@@ -143,7 +142,10 @@ -- window destroyed, unmanage it -- window gone, unmanage it-handle (DestroyWindowEvent {ev_window = w}) = whenX (isClient w) $ unmanage w+handle (DestroyWindowEvent {ev_window = w}) = whenX (isClient w) $ do+ unmanage w+ modify (\s -> s { mapped = S.delete w (mapped s)+ , waitingUnmap = M.delete w (waitingUnmap s)}) -- We track expected unmap events in waitingUnmap. We ignore this event unless -- it is synthetic or we are not expecting an unmap notification from a window.@@ -151,7 +153,9 @@ e <- gets (fromMaybe 0 . M.lookup w . waitingUnmap) if (synthetic || e == 0) then unmanage w- else modify (\s -> s { waitingUnmap = M.adjust pred w (waitingUnmap s) })+ else modify (\s -> s { waitingUnmap = M.update mpred w (waitingUnmap s) })+ where mpred 1 = Nothing+ mpred n = Just $ pred n -- set keyboard mapping handle e@(MappingNotifyEvent {}) = do@@ -189,7 +193,8 @@ -- entered a normal window, makes this focused. handle e@(CrossingEvent {ev_window = w, ev_event_type = t}) | t == enterNotify && ev_mode e == notifyNormal- && ev_detail e /= notifyInferior = focus w+ && ev_detail e /= notifyInferior+ = whenX (asks $ focusFollowsMouse . config) (focus w) -- left a window, check if we need to focus root handle e@(CrossingEvent {ev_event_type = t})
XMonad/ManageHook.hs view
@@ -2,7 +2,7 @@ ----------------------------------------------------------------------------- -- |--- Module : XMonad/ManageHook.hs+-- Module : XMonad.ManageHook -- Copyright : (c) Spencer Janssen 2007 -- License : BSD3-style (see LICENSE) --
XMonad/Operations.hs view
@@ -4,7 +4,7 @@ -- -------------------------------------------------------------------------- -- |--- Module : Operations.hs+-- Module : XMonad.Operations -- Copyright : (c) Spencer Janssen 2007 -- License : BSD3-style (see LICENSE) --@@ -71,13 +71,8 @@ -- | unmanage. A window no longer exists, remove it from the window -- list, on whatever workspace it is. ----- should also unmap?--- unmanage :: Window -> X ()-unmanage w = do- windows (W.delete w)- setWMState w withdrawnState- modify (\s -> s {mapped = S.delete w (mapped s), waitingUnmap = M.delete w (waitingUnmap s)})+unmanage = windows . W.delete -- | Modify the size of the status gap at the top of the current screen -- Taking a function giving the current screen, and current geometry.@@ -116,7 +111,9 @@ let oldvisible = concatMap (W.integrate' . W.stack . W.workspace) $ W.current old : W.visible old ws = f old XConf { display = d , normalBorder = nbc, focusedBorder = fbc } <- ask+ mapM_ setInitialProperties (W.allWindows ws \\ W.allWindows old)+ whenJust (W.peek old) $ \otherw -> io $ setWindowBorder d otherw nbc modify (\s -> s { windowset = ws }) @@ -165,12 +162,16 @@ whenJust (W.peek ws) $ \w -> io $ setWindowBorder d w fbc setTopFocus asks (logHook . config) >>= userCode- -- io performGC -- really helps, but seems to trigger GC bugs? -- hide every window that was potentially visible before, but is not -- given a position by a layout now. mapM_ hide (nub oldvisible \\ visible) + -- all windows that are no longer in the windowset are marked as+ -- withdrawn, it is important to do this after the above, otherwise 'hide'+ -- will overwrite withdrawnState with iconicState+ mapM_ (flip setWMState withdrawnState) (W.allWindows old \\ W.allWindows ws)+ clearEvents enterWindowMask -- | setWMState. set the WM_STATE property@@ -245,11 +246,31 @@ -- --------------------------------------------------------------------- +-- | Returns True if the first rectangle is contained within, but not equal+-- to the second.+containedIn :: Rectangle -> Rectangle -> Bool+containedIn r1@(Rectangle x1 y1 w1 h1) r2@(Rectangle x2 y2 w2 h2)+ = and [ r1 /= r2+ , x1 >= x2+ , y1 >= y2+ , fromIntegral x1 + w1 <= fromIntegral x2 + w2+ , fromIntegral y1 + h1 <= fromIntegral y2 + h2 ]++-- | Given a list of screens, remove all duplicated screens and screens that+-- are entirely contained within another.+nubScreens :: [Rectangle] -> [Rectangle]+nubScreens xs = nub . filter (\x -> not $ any (x `containedIn`) xs) $ xs++-- | Cleans the list of screens according to the rules documented for+-- nubScreens.+getCleanedScreenInfo :: MonadIO m => Display -> m [Rectangle]+getCleanedScreenInfo = io . fmap nubScreens . getScreenInfo+ -- | rescreen. The screen configuration may have changed (due to -- xrandr), update the state and refresh the screen, and reset the gap. rescreen :: X () rescreen = do- xinesc <- withDisplay (io . getScreenInfo)+ xinesc <- withDisplay getCleanedScreenInfo windows $ \ws@(W.StackSet { W.current = v, W.visible = vs, W.hidden = hs }) -> let (xs, ys) = splitAt (length xinesc) $ map W.workspace (v:vs) ++ hs@@ -322,23 +343,6 @@ then do ml' <- handleMessage (W.layout w) (SomeMessage a) `catchX` return Nothing return $ w { W.layout = maybe (W.layout w) id ml' } else return w---- | Send a message to all visible layouts, without necessarily refreshing.--- This is how we implement the hooks, such as UnDoLayout.-broadcastMessage :: Message a => a -> X ()-broadcastMessage a = runOnWorkspaces $ \w -> do- ml' <- handleMessage (W.layout w) (SomeMessage a) `catchX` return Nothing- return $ w { W.layout = maybe (W.layout w) id ml' }---- | This is basically a map function, running a function in the X monad on--- each workspace with the output of that function being the modified workspace.-runOnWorkspaces :: (WindowSpace -> X WindowSpace) -> X ()-runOnWorkspaces job =do- ws <- gets windowset- h <- mapM job $ W.hidden ws- c:v <- mapM (\s -> (\w -> s { W.workspace = w}) <$> job (W.workspace s))- $ W.current ws : W.visible ws- modify $ \s -> s { windowset = ws { W.current = c, W.visible = v, W.hidden = h } } -- | Set the layout of the currently viewed workspace setLayout :: Layout Window -> X ()
XMonad/StackSet.hs view
@@ -2,7 +2,7 @@ ----------------------------------------------------------------------------- -- |--- Module : StackSet+-- Module : XMonad.StackSet -- Copyright : (c) Don Stewart 2007 -- License : BSD3-style (see LICENSE) --
man/xmonad.1 view
@@ -16,25 +16,19 @@ .PP 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. .PP-When running with multiple monitors (Xinerama), each screen has exactly 1 workspace visible. When \fBxmonad\fR 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, \fBxmonad\fR simply switches focus to that screen. If you switch to a workspace which is *not* visible, \fBxmonad\fR replaces the workspace on the *current* screen with the workspace you selected.-.PP-For example, if you have the following configuration:-.RS-.PP-Screen 1: Workspace 2-.PP-Screen 2: Workspace 5 (current workspace)-.RE-.PP-and you wanted to view workspace 7 on screen 1, you would press:-.RS-.PP-mod-2 (to select workspace 2, and make screen 1 the current screen)-.PP-mod-7 (to select workspace 7)-.RE+When running with multiple monitors (Xinerama), each screen has exactly 1 workspace visible. mod-{w,e,r} switch the focus between screens, while shift-mod-{w,e,r} move the current window to that screen. When \fBxmonad\fR starts, workspace 1 is on screen 1, workspace 2 is on screen 2, etc. When switching workspaces to one that is already visible, the current and visible workspaces are swapped. .PP-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.+.SS Flags+\fBxmonad\fR has several flags which you may pass to the executable. These flags are:+.TP+\fB--recompile +Recompiles your configuration in ~/.xmonad/xmonad.hs if it is newer than your already existing ~/.xmonad/xmonad executable.+.TP+\fB--recompile-force+Unconditionally recompiles your configuration in ~/.xmonad/xmonad.hs.+.TP+\fB--version+Display version of \fBxmonad\fR. .SS Default keyboard bindings .IP \fBmod-shift-return\fR@@ -131,6 +125,6 @@ .RE to your \fI~/.xinitrc\fR file .SH CUSTOMIZATION-\fBxmonad\fR is customized by creating a custom Config.hs and (re)compiling the source code. After recompiling, 'restart' is used to fork the new version, with changes reflected immediately.+\fBxmonad\fR is customized in ~/.xmonad/xmonad.hs, and then restarting with mod-q. .SH BUGS Probably. If you find any, please report them: http://code.google.com/p/xmonad/issues/list
man/xmonad.1.in view
@@ -16,25 +16,19 @@ .PP 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. .PP-When running with multiple monitors (Xinerama), each screen has exactly 1 workspace visible. When \fBxmonad\fR 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, \fBxmonad\fR simply switches focus to that screen. If you switch to a workspace which is *not* visible, \fBxmonad\fR replaces the workspace on the *current* screen with the workspace you selected.-.PP-For example, if you have the following configuration:-.RS-.PP-Screen 1: Workspace 2-.PP-Screen 2: Workspace 5 (current workspace)-.RE-.PP-and you wanted to view workspace 7 on screen 1, you would press:-.RS-.PP-mod-2 (to select workspace 2, and make screen 1 the current screen)-.PP-mod-7 (to select workspace 7)-.RE+When running with multiple monitors (Xinerama), each screen has exactly 1 workspace visible. mod-{w,e,r} switch the focus between screens, while shift-mod-{w,e,r} move the current window to that screen. When \fBxmonad\fR starts, workspace 1 is on screen 1, workspace 2 is on screen 2, etc. When switching workspaces to one that is already visible, the current and visible workspaces are swapped. .PP-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.+.SS Flags+\fBxmonad\fR has several flags which you may pass to the executable. These flags are:+.TP+\fB--recompile +Recompiles your configuration in ~/.xmonad/xmonad.hs if it is newer than your already existing ~/.xmonad/xmonad executable.+.TP+\fB--recompile-force+Unconditionally recompiles your configuration in ~/.xmonad/xmonad.hs.+.TP+\fB--version+Display version of \fBxmonad\fR. .SS Default keyboard bindings ___KEYBINDINGS___ .SH EXAMPLES@@ -44,6 +38,6 @@ .RE to your \fI~/.xinitrc\fR file .SH CUSTOMIZATION-\fBxmonad\fR is customized by creating a custom Config.hs and (re)compiling the source code. After recompiling, 'restart' is used to fork the new version, with changes reflected immediately.+\fBxmonad\fR is customized in ~/.xmonad/xmonad.hs, and then restarting with mod-q. .SH BUGS Probably. If you find any, please report them: http://code.google.com/p/xmonad/issues/list
man/xmonad.hs view
@@ -145,8 +145,7 @@ , ((modMask .|. shiftMask, xK_q ), io (exitWith ExitSuccess)) -- Restart xmonad- , ((modMask , xK_q ),- broadcastMessage ReleaseResources >> restart (Just "xmonad") True)+ , ((modMask , xK_q ), restart "xmonad" True) ] ++ @@ -222,13 +221,20 @@ -- > xprop | grep WM_CLASS -- and click on the client you're interested in. --+-- To match on the WM_NAME, you can use 'title' in the same way that+-- 'className' and 'resource' are used below.+-- myManageHook = composeAll [ className =? "MPlayer" --> doFloat , className =? "Gimp" --> doFloat , resource =? "desktop_window" --> doIgnore , resource =? "kdesktop" --> doIgnore ] +-- Whether focus follows the mouse pointer.+myFocusFollowsMouse :: Bool+myFocusFollowsMouse = True + ------------------------------------------------------------------------ -- Status bars and logging @@ -257,6 +263,7 @@ defaults = defaultConfig { -- simple stuff terminal = myTerminal,+ focusFollowsMouse = myFocusFollowsMouse, borderWidth = myBorderWidth, modMask = myModMask, numlockMask = myNumlockMask,
man/xmonad.html view
@@ -1,10 +1,9 @@-Content-type: text/html--<HTML><HEAD><TITLE>Manpage of xmonad</TITLE>+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">+<HTML><HEAD><TITLE>Man page of xmonad</TITLE> </HEAD><BODY> <H1>xmonad</H1> Section: xmonad manual (1)<BR>Updated: 18 April 07<BR><A HREF="#index">Index</A>-<A HREF="http://localhost/cgi-bin/man/man2html">Return to Main Contents</A><HR>+<A HREF="/cgi-bin/man/man2html">Return to Main Contents</A><HR> <A NAME="lbAB"> </A> <H2>NAME</H2>@@ -33,35 +32,22 @@ 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. <P> -When running with multiple monitors (Xinerama), each screen has exactly 1 workspace visible. When <B>xmonad</B> 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, <B>xmonad</B> simply switches focus to that screen. If you switch to a workspace which is *not* visible, <B>xmonad</B> replaces the workspace on the *current* screen with the workspace you selected.-<P>--For example, if you have the following configuration:-<DL COMPACT><DT><DD>-<P>--Screen 1: Workspace 2-<P>--Screen 2: Workspace 5 (current workspace)-</DL>--<P>--and you wanted to view workspace 7 on screen 1, you would press:-<DL COMPACT><DT><DD>+When running with multiple monitors (Xinerama), each screen has exactly 1 workspace visible. mod-{w,e,r} switch the focus between screens, while shift-mod-{w,e,r} move the current window to that screen. When <B>xmonad</B> starts, workspace 1 is on screen 1, workspace 2 is on screen 2, etc. When switching workspaces to one that is already visible, the current and visible workspaces are swapped. <P> -mod-2 (to select workspace 2, and make screen 1 the current screen)-<P>+<A NAME="lbAE"> </A>+<H3>Flags</H3> -mod-7 (to select workspace 7)+<B>xmonad</B> has several flags which you may pass to the executable. These flags are:+<DL COMPACT>+<DT><B>--recompile <DD>+Recompiles your configuration in ~/.xmonad/xmonad.hs if it is newer than your already existing ~/.xmonad/xmonad executable.+<DT>--recompile-force<DD>+Unconditionally recompiles your configuration in ~/.xmonad/xmonad.hs.+<DT>--version<DD>+Display version of xmonad</B>. </DL>--<P>--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.-<A NAME="lbAE"> </A>+<A NAME="lbAF"> </A> <H3>Default keyboard bindings</H3> <DL COMPACT>@@ -154,7 +140,7 @@ Set the window to floating mode and resize by dragging <P> </DL>-<A NAME="lbAF"> </A>+<A NAME="lbAG"> </A> <H2>EXAMPLES</H2> To use <B>xmonad</B> as your window manager add:@@ -163,11 +149,11 @@ </DL> to your <I>~/.xinitrc</I> file-<A NAME="lbAG"> </A>+<A NAME="lbAH"> </A> <H2>CUSTOMIZATION</H2> -<B>xmonad</B> is customized by creating a custom Config.hs and (re)compiling the source code. After recompiling, 'restart' is used to fork the new version, with changes reflected immediately.-<A NAME="lbAH"> </A>+<B>xmonad</B> is customized in ~/.xmonad/xmonad.hs, and then restarting with mod-q.+<A NAME="lbAI"> </A> <H2>BUGS</H2> Probably. If you find any, please report them: <A HREF="http://code.google.com/p/xmonad/issues/list">http://code.google.com/p/xmonad/issues/list</A>@@ -180,16 +166,17 @@ <DT><A HREF="#lbAC">DESCRIPTION</A><DD> <DT><A HREF="#lbAD">USAGE</A><DD> <DL>-<DT><A HREF="#lbAE">Default keyboard bindings</A><DD>+<DT><A HREF="#lbAE">Flags</A><DD>+<DT><A HREF="#lbAF">Default keyboard bindings</A><DD> </DL>-<DT><A HREF="#lbAF">EXAMPLES</A><DD>-<DT><A HREF="#lbAG">CUSTOMIZATION</A><DD>-<DT><A HREF="#lbAH">BUGS</A><DD>+<DT><A HREF="#lbAG">EXAMPLES</A><DD>+<DT><A HREF="#lbAH">CUSTOMIZATION</A><DD>+<DT><A HREF="#lbAI">BUGS</A><DD> </DL> <HR> This document was created by-<A HREF="http://localhost/cgi-bin/man/man2html">man2html</A>,+<A HREF="/cgi-bin/man/man2html">man2html</A>, using the manual pages.<BR>-Time: 03:12:22 GMT, December 05, 2007+Time: 21:27:38 GMT, January 27, 2008 </BODY> </HTML>
tests/Properties.hs view
@@ -1,4 +1,4 @@-{-# OPTIONS -fglasgow-exts #-}+{-# OPTIONS -fglasgow-exts -w #-} module Properties where import XMonad.StackSet hiding (filter)@@ -52,7 +52,6 @@ | s <- ls ] return $ fromList (fromIntegral n, sds,fs,ls,lay)- coarbitrary = error "no coarbitrary for StackSet" -- | fromList. Build a new StackSet from a list of list of elements,@@ -652,7 +651,7 @@ main :: IO () main = do- args <- getArgs+ args <- fmap (drop 1) getArgs let n = if null args then 100 else read (head args) (results, passed) <- liftM unzip $ mapM (\(s,a) -> printf "%-25s: " s >> a n) tests printf "Passed %d tests!\n" (sum passed)@@ -941,6 +940,7 @@ l <- arbitrary -- there cannot be more screens than workspaces: return . EmptyStackSet . new l ns $ take (min (length ns) (length sds)) sds+ coarbitrary = error "coarbitrary EmptyStackSet" -- | Generates a value that satisfies a predicate. suchThat :: Gen a -> (a -> Bool) -> Gen a
xmonad.cabal view
@@ -1,5 +1,5 @@ name: xmonad-version: 0.5+version: 0.6 homepage: http://xmonad.org synopsis: A tiling window manager description:@@ -23,8 +23,12 @@ cabal-version: >= 1.2 flag small_base- description: Choose the new smaller, split-up base package.+ description: Choose the new smaller, split-up base package. +flag testing+ description: Testing mode, only build minimal components+ default: False+ library exposed-modules: XMonad XMonad.Main@@ -39,17 +43,34 @@ build-depends: base >= 3, containers, directory, process else build-depends: base < 3- build-depends: X11>=1.4.0, mtl, unix+ build-depends: X11>=1.4.1, mtl, unix - ghc-options: -funbox-strict-fields -Wall -Werror -optl-Wl,-s+ ghc-options: -funbox-strict-fields -Wall -optl-Wl,-s ghc-prof-options: -prof -auto-all extensions: CPP + if flag(testing)+ buildable: False+ executable xmonad main-is: Main.hs- other-modules: XMonad.Core XMonad.Main XMonad.Layout- XMonad.Operations XMonad.StackSet XMonad+ other-modules: XMonad+ XMonad.Main+ XMonad.Core+ XMonad.Config+ XMonad.Layout+ XMonad.ManageHook+ XMonad.Operations+ XMonad.StackSet - ghc-options: -funbox-strict-fields -Wall -Werror -optl-Wl,-s+ ghc-options: -funbox-strict-fields -Wall -optl-Wl,-s ghc-prof-options: -prof -auto-all extensions: CPP++ if flag(testing)+ cpp-options: -DTESTING+ hs-source-dirs: . tests/+ build-depends: QuickCheck < 2+ ghc-options: -Werror+ if flag(testing) && flag(small_base)+ build-depends: random