3 patches for repository http://code.haskell.org/XMonadContrib: Fri Mar 6 17:42:00 CET 2015 ankaan@gmail.com * X.L.LayoutBuilder place active on top Make sure that the active layout area is placed on top of all other areas when placing windows. This makes overlapping areas usable. Fri Mar 6 18:17:02 CET 2015 ankaan@gmail.com * X.L.AvoidFloats, like avoidStruts but for floats Checks for floating windows within the layout area and finds a maximum area rectangle within that does not overlap with any of the floating windows. This rectangle is used for all non-floating windows. This new functionality introduced problems with the recommended configuration of one of my other modules (X.A.FloatSnap.) A new and more reliable method of distinguishing between clicks and drags where therefore introduced in the new module X.A.AfterDrag. This does not break any prior use of FloatSnap, but will require changes in configuration if used together with AvoidFloats. (This is mentioned in the docs for AvoidFloats and I recommend using the new configuration method even if AvoidFloats is not in use.) Fri Mar 6 18:54:36 CET 2015 ankaan@gmail.com * Resolve minor conflict in xmonad-contrib.cabal New patches: [X.L.LayoutBuilder place active on top ankaan@gmail.com**20150306164200 Ignore-this: 69d718d0d044ee59a877fa0e63edc474 Make sure that the active layout area is placed on top of all other areas when placing windows. This makes overlapping areas usable. ] { hunk ./XMonad/Layout/LayoutBuilder.hs 13 -- Portability : unportable -- -- A layout combinator that sends a specified number of windows to one rectangle --- and the rest to another. +-- and the rest to another. Each of these rectangles are given a layout that +-- is used within them. This can be chained to provide an arbitrary number of +-- rectangles. The layout combinator allows overlapping rectangles, but such +-- layouts does not work well together with hinting +-- ("XMonad.Layout.LayoutHints", "XMonad.Layout.HintedGrid" etc.) -- ----------------------------------------------------------------------------- hunk ./XMonad/Layout/LayoutBuilder.hs 37 import XMonad import qualified XMonad.StackSet as W -import Data.Maybe (isJust) +import Data.Maybe (isJust,isNothing,listToMaybe) -- $usage -- You can use this module with the following in your @~\/.xmonad\/xmonad.hs@: hunk ./XMonad/Layout/LayoutBuilder.hs 56 -- > ( (layoutN 1 (absBox (-512-200) 0 512 0) (Just $ relBox 0 0 1 1) $ simpleTabbed) -- > $ (layoutN 1 (absBox (-200) 0 0 0) Nothing $ simpleTabbed) -- > $ (layoutAll (absBox 0 0 (-512-200) 0) $ simpleTabbed) +-- > ) ||| +-- > ( (layoutN 1 (absBox 10 0 0 (-10)) Nothing $ Tall 0 0.01 0.5) +-- > $ (layoutN 1 (absBox 0 0 200 0) Nothing $ Tall 0 0.01 0.5) +-- > $ (layoutAll (absBox 10 10 0 0) $ Tall 2 0.01 0.5) -- > ) ||| Full ||| etc... -- > main = xmonad def { layoutHook = myLayout } -- hunk ./XMonad/Layout/LayoutBuilder.hs 67 -- and tabs that show the available windows. It will also produce a layout similar to ThreeColMid and a special layout -- created for use with a 80 columns wide Emacs window, its sidebar and a tabbed area for all other windows. -- +-- The final layout is for applications that use a toolbar in a separate window, shown on a low resolution screen. It has +-- a master area that cover almost the whole screen. It leaves 10 px to the left and 10 px at the bottom. To the left +-- the toolbar is located and can be accessed by focusing this area. It is actually 200 px wide, but usually below the +-- other windows. Similarly all other windows are tiled, but behind the master window and can be accessed by moving the +-- mouse to the bottom of the screen. Everything can also be accessed by the standard focus changing key bindings. +-- -- This module can be used to create many different custom layouts, but there are limitations. The primary limitation -- can be observed in the second and third example when there are only two columns with windows in them. The leftmost -- area is left blank. These blank areas can be avoided by placing the rectangles appropriately. hunk ./XMonad/Layout/LayoutBuilder.hs 171 then box else maybe box id mbox - (sublist,sub') <- handle sub subs $ calcArea selBox rect + (sublist,sub',schange) <- handle sub subs $ calcArea selBox rect + + (nextlist,next',nchange) <- case next of Nothing -> return ([], Nothing, False) + Just n -> do (res, l, ch) <- handle n nexts rect + return (res, Just l, ch) hunk ./XMonad/Layout/LayoutBuilder.hs 177 - (nextlist,next') <- case next of Nothing -> return ([],Nothing) - Just n -> do (res,l) <- handle n nexts rect - return (res,Just l) + let newlist = if (length $ maybe [] W.up s) < (length $ W.integrate' subs) + then sublist++nextlist + else nextlist++sublist + newstate = if subf' /= subf || nextf' /= nextf || schange || nchange + then Just $ LayoutN subf' nextf' num box mbox sub' next' + else Nothing hunk ./XMonad/Layout/LayoutBuilder.hs 184 - return (sublist++nextlist, Just $ LayoutN subf' nextf' num box mbox sub' next' ) + return (newlist, newstate) where handle l s' r = do (res,ml) <- runLayout (W.Workspace "" l s') r l' <- return $ maybe l id ml hunk ./XMonad/Layout/LayoutBuilder.hs 188 - return (res,l') + return (res, l', isNothing ml) -- | Propagate messages. handleMessage l m hunk ./XMonad/Layout/LayoutBuilder.hs 268 subf' = foc subl subf nextf' = foc nextl nextf foc [] _ = Nothing - foc l f = if W.focus s `elem` l - then Just $ W.focus s - else if maybe False (`elem` l) f - then f - else Just $ head l + foc l f | W.focus s `elem` l = Just $ W.focus s + | maybe False (`elem` l) f = f + | otherwise = listToMaybe l calcArea :: SubBox -> Rectangle -> Rectangle calcArea (SubBox xpos ypos width height) rect = Rectangle (rect_x rect + fromIntegral xpos') (rect_y rect + fromIntegral ypos') width' height' } [X.L.AvoidFloats, like avoidStruts but for floats ankaan@gmail.com**20150306171702 Ignore-this: 3722d7787dd2429313f92f85f3ae1251 Checks for floating windows within the layout area and finds a maximum area rectangle within that does not overlap with any of the floating windows. This rectangle is used for all non-floating windows. This new functionality introduced problems with the recommended configuration of one of my other modules (X.A.FloatSnap.) A new and more reliable method of distinguishing between clicks and drags where therefore introduced in the new module X.A.AfterDrag. This does not break any prior use of FloatSnap, but will require changes in configuration if used together with AvoidFloats. (This is mentioned in the docs for AvoidFloats and I recommend using the new configuration method even if AvoidFloats is not in use.) ] { addfile ./XMonad/Actions/AfterDrag.hs hunk ./XMonad/Actions/AfterDrag.hs 1 +----------------------------------------------------------------------------- +-- | +-- Module : XMonad.Actions.AfterDrag +-- Copyright : (c) 2014 Anders Engstrom +-- License : BSD3-style (see LICENSE) +-- +-- Maintainer : Anders Engstrom +-- Stability : unstable +-- Portability : unportable +-- +-- Perform an action after the current mouse drag is completed. +----------------------------------------------------------------------------- + +module XMonad.Actions.AfterDrag ( + -- * Usage + -- $usage + afterDrag, + ifClick, + ifClick') where + +import XMonad +import System.Time + +-- $usage +-- You can use this module with the following in your @~\/.xmonad\/xmonad.hs@: +-- +-- > import XMonad.Actions.AfterDrag +-- +-- Then add appropriate mouse bindings, for example: +-- +-- > , ((modm, button3), (\w -> focus w >> mouseResizeWindow w >> ifClick (windows $ W.float w $ W.RationalRect 0 0 1 1))) +-- +-- This will allow you to resize windows as usual, but if you instead of +-- draging click the mouse button the window will be automatically resized to +-- fill the whole screen. +-- +-- For detailed instructions on editing your mouse bindings, see +-- "XMonad.Doc.Extending#Editing_mouse_bindings". +-- +-- More practical examples are available in "XMonad.Actions.FloatSnap". + +-- | Schedule a task to take place after the current dragging is completed. +afterDrag + :: X () -- ^ The task to schedule. + -> X () +afterDrag task = do drag <- gets dragging + case drag of + Nothing -> return () -- Not dragging + Just (motion, cleanup) -> modify $ \s -> s { dragging = Just(motion, cleanup >> task) } + +-- | Take an action if the current dragging can be considered a click, +-- supposing the drag just started before this function is called. +-- A drag is considered a click if it is completed within 300 ms. +ifClick + :: X () -- ^ The action to take if the dragging turned out to be a click. + -> X () +ifClick action = ifClick' 300 action (return ()) + +-- | Take an action if the current dragging is completed within a certain time (in milliseconds.) +ifClick' + :: Int -- ^ Maximum time of dragging for it to be considered a click (in milliseconds.) + -> X () -- ^ The action to take if the dragging turned out to be a click. + -> X () -- ^ The action to take if the dragging turned out to not be a click. + -> X () +ifClick' ms click drag = do + start <- io $ getClockTime + afterDrag $ do + stop <- io $ getClockTime + if diffClockTimes stop start <= noTimeDiff { tdPicosec = fromIntegral ms * 10^(9 :: Integer) } + then click + else drag hunk ./XMonad/Actions/FloatSnap.hs 24 snapShrink, snapMagicMove, snapMagicResize, - snapMagicMouseResize) where + snapMagicMouseResize, + afterDrag, + ifClick, + ifClick') where import XMonad import Control.Applicative((<$>)) hunk ./XMonad/Actions/FloatSnap.hs 34 import Data.List (sort) import Data.Maybe (listToMaybe,fromJust,isNothing) import qualified XMonad.StackSet as W +import qualified Data.Set as S import XMonad.Hooks.ManageDocks (calcGap) import XMonad.Util.Types (Direction2D(..)) hunk ./XMonad/Actions/FloatSnap.hs 38 - -import qualified Data.Set as S +import XMonad.Actions.AfterDrag -- $usage -- You can use this module with the following in your @~\/.xmonad\/xmonad.hs@: hunk ./XMonad/Actions/FloatSnap.hs 59 -- For detailed instructions on editing your key bindings, see -- "XMonad.Doc.Extending#Editing_key_bindings". -- --- And possibly add an appropriate mouse binding, for example: +-- And possibly add appropriate mouse bindings, for example: -- hunk ./XMonad/Actions/FloatSnap.hs 61 --- > , ((modm, button1), (\w -> focus w >> mouseMoveWindow w >> snapMagicMove (Just 50) (Just 50) w)) --- > , ((modm .|. shiftMask, button1), (\w -> focus w >> mouseMoveWindow w >> snapMagicResize [L,R,U,D] (Just 50) (Just 50) w)) --- > , ((modm, button3), (\w -> focus w >> mouseResizeWindow w >> snapMagicResize [R,D] (Just 50) (Just 50) w)) +-- > , ((modm, button1), (\w -> focus w >> mouseMoveWindow w >> ifClick (snapMagicMove (Just 50) (Just 50) w))) +-- > , ((modm .|. shiftMask, button1), (\w -> focus w >> mouseMoveWindow w >> ifClick (snapMagicResize [L,R,U,D] (Just 50) (Just 50) w))) +-- > , ((modm, button3), (\w -> focus w >> mouseResizeWindow w >> ifClick (snapMagicResize [R,D] (Just 50) (Just 50) w))) -- -- For detailed instructions on editing your mouse bindings, see -- "XMonad.Doc.Extending#Editing_mouse_bindings". hunk ./XMonad/Actions/FloatSnap.hs 69 -- -- Using these mouse bindings, it will not snap while moving, but allow you to click the window once after it has been moved or resized to snap it into place. --- Note that the order in which the commands are applied in the mouse bindings are important. +-- Note that the order in which the commands are applied in the mouse bindings are important. Snapping can also be used together with other window resizing +-- functions, such as those from "XMonad.Actions.FlexibleResize" +-- +-- An alternative set of mouse bindings that will always snap after the drag is: +-- +-- > , ((modm, button1), (\w -> focus w >> mouseMoveWindow w >> afterDrag (snapMagicMove (Just 50) (Just 50) w))) +-- > , ((modm .|. shiftMask, button1), (\w -> focus w >> mouseMoveWindow w >> afterDrag (snapMagicResize [L,R,U,D] (Just 50) (Just 50) w))) +-- > , ((modm, button3), (\w -> focus w >> mouseResizeWindow w >> afterDrag (snapMagicResize [R,D] (Just 50) (Just 50) w))) -- -- Interesting values for the distance to look for window in the orthogonal axis are Nothing (to snap against every window), Just 0 (to only snap -- against windows that we should collide with geometrically while moving) and Just 1 (to also snap against windows we brush against). addfile ./XMonad/Layout/AvoidFloats.hs hunk ./XMonad/Layout/AvoidFloats.hs 1 +{-# LANGUAGE PatternGuards, FlexibleContexts, FlexibleInstances, MultiParamTypeClasses, TypeSynonymInstances, ParallelListComp, DeriveDataTypeable #-} + +----------------------------------------------------------------------------- +-- | +-- Module : XMonad.Layout.AvoidFloats +-- Copyright : (c) 2014 Anders Engstrom +-- License : BSD3-style (see LICENSE) +-- +-- Maintainer : (c) Anders Engstrom +-- Stability : unstable +-- Portability : unportable +-- +-- Find a maximum empty rectangle around floating windows and use that area +-- to display non-floating windows. +-- +----------------------------------------------------------------------------- + +module XMonad.Layout.AvoidFloats ( + -- * Usage + -- $usage + avoidFloats, + avoidFloats', + AvoidFloatMsg(..), + AvoidFloatItemMsg(..), + ) where + +import XMonad +import XMonad.Layout.LayoutModifier +import qualified XMonad.StackSet as W + +import Data.List +import Data.Ord +import Data.Maybe +import qualified Data.Map as M +import qualified Data.Set as S + +-- $usage +-- You can use this module with the following in your ~\/.xmonad\/xmonad.hs file: +-- +-- > import XMonad.Layout.AvoidFloats +-- +-- and modify the layouts to call avoidFloats on the layouts where you want the +-- non-floating windows to not be behind floating windows. +-- +-- > layoutHook = ... ||| avoidFloats True Full ||| ... +-- +-- For more detailed instructions on editing the layoutHook see: +-- "XMonad.Doc.Extending#Editing_the_layout_hook" +-- +-- Then optionally add appropriate key bindings, for example: +-- +-- > ,((modm .|. shiftMask, xK_b), sendMessage AvoidFloatToggle) +-- > ,((modm .|. controlMask, xK_b), withFocused $ sendMessage . AvoidFloatToggleItem) +-- > ,((modm .|. shiftMask .|. controlMask, xK_b), sendMessage (AvoidFloatSet False) >> sendMessage AvoidFloatClearItems) +-- +-- For detailed instructions on editing your key bindings, see +-- "XMonad.Doc.Extending#Editing_key_bindings". +-- +-- Note that this module is incompatible with an old way of configuring +-- "XMonad.Actions.FloatSnap". If you are having problems, please update your +-- configuration. + +-- | Avoid floating windows unless the resulting area for windows would be too small. +-- In that case, use the whole screen as if this layout modifier wasn't there. +avoidFloats + :: Bool -- ^ If floating windows should be avoided by default. + -> l a -- ^ Layout to modify. + -> ModifiedLayout AvoidFloats l a +avoidFloats act = avoidFloats' 100 100 act + +-- | Avoid floating windows unless the resulting area for windows would be too small. +-- In that case, use the whole screen as if this layout modifier wasn't used. +avoidFloats' + :: Int -- ^ Minimum width of the area used for non-floating windows. + -> Int -- ^ Minimum height of the area used for non-floating windows. + -> Bool -- ^ If floating windows should be avoided by default. + -> l a -- ^ Layout to modify. + -> ModifiedLayout AvoidFloats l a +avoidFloats' w h act = ModifiedLayout (AvoidFloats Nothing S.empty w h act) + +data AvoidFloats a = AvoidFloats + { cache :: Maybe ((M.Map a W.RationalRect, Rectangle), Rectangle) + , chosen :: S.Set a + , minw :: Int + , minh :: Int + , avoidAll :: Bool + } deriving (Read, Show) + +-- | Change the state of the whole avoid float layout modifier. +data AvoidFloatMsg + = AvoidFloatToggle -- ^ Toggle between avoiding all or only selected. + | AvoidFloatSet Bool -- ^ Set if all all floating windows should be avoided. + | AvoidFloatClearItems -- ^ Clear the set of windows to specifically avoid. + deriving (Typeable) + + +-- | Change the state of the avoid float layout modifier conserning a specific window. +data AvoidFloatItemMsg a + = AvoidFloatAddItem a -- ^ Add a window to always avoid. + | AvoidFloatRemoveItem a -- ^ Stop always avoiding selected window. + | AvoidFloatToggleItem a -- ^ Toggle between always avoiding selected window. + deriving (Typeable) + +instance Message AvoidFloatMsg +instance Typeable a => Message (AvoidFloatItemMsg a) + +instance LayoutModifier AvoidFloats Window where + modifyLayoutWithUpdate lm w r = withDisplay $ \d -> do + floating <- gets $ W.floating . windowset + case cache lm of + Just (key, mer) | key == (floating,r) -> flip (,) Nothing `fmap` runLayout w mer + _ -> do rs <- io $ map toRect `fmap` mapM (getWindowAttributes d) (filter shouldAvoid $ M.keys floating) + let mer = maximumBy (comparing area) $ filter bigEnough $ maxEmptyRectangles r rs + flip (,) (Just $ pruneWindows $ lm { cache = Just ((floating,r),mer) }) `fmap` runLayout w mer + where + toRect :: WindowAttributes -> Rectangle + toRect wa = let b = fi $ wa_border_width wa + in Rectangle (fi $ wa_x wa) (fi $ wa_y wa) (fi $ wa_width wa + 2*b) (fi $ wa_height wa + 2*b) + + bigEnough :: Rectangle -> Bool + bigEnough rect = rect_width rect >= fi (minw lm) && rect_height rect >= fi (minh lm) + + shouldAvoid a = avoidAll lm || a `S.member` chosen lm + + pureMess lm m + | Just (AvoidFloatToggle) <- fromMessage m = Just $ lm { avoidAll = not (avoidAll lm), cache = Nothing } + | Just (AvoidFloatSet s) <- fromMessage m, s /= avoidAll lm = Just $ lm { avoidAll = s, cache = Nothing } + | Just (AvoidFloatClearItems) <- fromMessage m = Just $ lm { chosen = S.empty, cache = Nothing } + | Just (AvoidFloatAddItem a) <- fromMessage m, a `S.notMember` chosen lm = Just $ lm { chosen = S.insert a (chosen lm), cache = Nothing } + | Just (AvoidFloatRemoveItem a) <- fromMessage m, a `S.member` chosen lm = Just $ lm { chosen = S.delete a (chosen lm), cache = Nothing } + | Just (AvoidFloatToggleItem a) <- fromMessage m = let op = if a `S.member` chosen lm then S.delete else S.insert + in Just $ lm { chosen = op a (chosen lm), cache = Nothing } + | otherwise = Nothing + +pruneWindows :: AvoidFloats Window -> AvoidFloats Window +pruneWindows lm = case cache lm of + Nothing -> lm + Just ((floating,_),_) -> lm { chosen = S.filter (flip M.member floating) (chosen lm) } + +-- | Find all maximum empty rectangles (MERs) that are axis aligned. This is +-- done in O(n^2) time using a modified version of the algoprithm MERAlg 1 +-- described in \"On the maximum empty rectangle problem\" by A. Naamad, D.T. +-- Lee and W.-L HSU. Published in Discrete Applied Mathematics 8 (1984.) +maxEmptyRectangles :: Rectangle -> [Rectangle] -> [Rectangle] +maxEmptyRectangles br rectangles = filter (\a -> area a > 0) $ upAndDownEdge ++ noneOrUpEdge ++ downEdge + where + upAndDownEdge = findGaps br rectangles + noneOrUpEdge = concat $ map (everyLower br bottoms) bottoms + downEdge = concat $ map maybeToList $ map (bottomEdge br bottoms) bottoms + bottoms = sortBy (comparing bottom) $ splitContainers rectangles + +everyLower :: Rectangle -> [Rectangle] -> Rectangle -> [Rectangle] +everyLower br bottoms r = let (rs, boundLeft, boundRight, boundRects) = foldr (everyUpper r) ([], left br, right br, reverse bottoms) bottoms + (boundLeft', boundRight', _) = shrinkBounds boundLeft boundRight boundRects r (top br) + in mkRect boundLeft' boundRight' (top br) (top r) ?: rs + +everyUpper + :: Rectangle -- ^ The current rectangle where the top edge is used. + -> Rectangle -- ^ The current rectangle where the bottom edge is used. + -> ([Rectangle],Int,Int,[Rectangle]) -- ^ List of MERs found so far, left bound, right bound and list of rectangles used for bounds. + -> ([Rectangle],Int,Int,[Rectangle]) +everyUpper lower upper (rs, boundLeft, boundRight, boundRects) = (r?:rs, boundLeft', boundRight', boundRects') + where + r = mkRect boundLeft' boundRight' (bottom upper) (top lower) + (boundLeft', boundRight', boundRects') = shrinkBounds boundLeft boundRight boundRects lower (bottom upper) + +shrinkBounds :: Int -> Int -> [Rectangle] -> Rectangle -> Int -> (Int, Int, [Rectangle]) +shrinkBounds boundLeft boundRight boundRects lower upperLimit = (boundLeft', boundRight', boundRects') + where + (shrinkers, boundRects') = span (\a -> bottom a > upperLimit) boundRects + (boundLeft', boundRight') = foldr (shrinkBounds' lower) (boundLeft, boundRight) $ filter (\a -> top a < top lower) shrinkers + +shrinkBounds' :: Rectangle -> Rectangle -> (Int, Int) -> (Int, Int) +shrinkBounds' mr r (boundLeft, boundRight) + | right r < right mr = (max boundLeft $ right r, boundRight) + | left r > left mr = (boundLeft, min boundRight $ left r) + | otherwise = (right r, left r) -- r is horizontally covering all of mr; make sure the area of this rectangle will always be 0. + +bottomEdge :: Rectangle -> [Rectangle] -> Rectangle -> Maybe Rectangle +bottomEdge br bottoms r = let rs = filter (\a -> bottom r < bottom a && top a < bottom br) bottoms + boundLeft = maximum $ left br : (filter (< right r) $ map right rs) + boundRight = minimum $ right br : (filter (> left r) $ map left rs) + in if any (\a -> left a <= left r && right r <= right a) rs + then Nothing + else mkRect boundLeft boundRight (bottom r) (bottom br) + +-- | Split rectangles that horizontally fully contains another rectangle +-- without sharing either the left or right side. +splitContainers :: [Rectangle] -> [Rectangle] +splitContainers rects = splitContainers' [] $ sortBy (comparing rect_width) rects + where + splitContainers' :: [Rectangle] -> [Rectangle] -> [Rectangle] + splitContainers' res [] = res + splitContainers' res (r:rs) = splitContainers' (r:res) $ concat $ map (doSplit r) rs + + doSplit :: Rectangle -> Rectangle -> [Rectangle] + doSplit guide r + | left guide <= left r || right r <= right guide = [r] + | otherwise = let w0 = fi (rect_x guide - rect_x r) + (rect_width guide `div` 2) + w1 = rect_width r - w0 + in [ Rectangle (rect_x r) (rect_y r) w0 (rect_height r) + , Rectangle (rect_x r + fi w0) (rect_y r) w1 (rect_height r) + ] + +-- | Find all horizontal gaps that are left empty from top to bottom of screen. +findGaps + :: Rectangle -- ^ Bounding rectangle. + -> [Rectangle] -- ^ List of all rectangles that can cover areas in the bounding rectangle. + -> [Rectangle] +findGaps br rs = let (gaps,end) = foldr findGaps' ([], left br) $ sortBy (flip $ comparing left) $ filter inBounds rs + lastgap = mkRect end (right br) (top br) (bottom br) + in lastgap?:gaps + where + findGaps' :: Rectangle -> ([Rectangle], Int) -> ([Rectangle], Int) + findGaps' r (gaps, end) = let gap = mkRect end (left r) (top br) (bottom br) + in (gap?:gaps, max end (right r)) + + inBounds :: Rectangle -> Bool + inBounds r = left r < right br && left br < right r + +fi :: (Integral a, Num b) => a -> b +fi x = fromIntegral x + +(?:) :: Maybe a -> [a] -> [a] +Just x ?: xs = x:xs +_ ?: xs = xs + +left, right, top, bottom, area :: Rectangle -> Int +left r = fi (rect_x r) +right r = fi (rect_x r) + fi (rect_width r) +top r = fi (rect_y r) +bottom r = fi (rect_y r) + fi (rect_height r) +area r = fi (rect_width r * rect_height r) + +mkRect :: Int -> Int -> Int -> Int -> Maybe Rectangle +mkRect l r t b = let rect = Rectangle (fi l) (fi t) (fi $ max 0 $ r-l) (fi $ max 0 $ b-t) + in if area rect > 0 + then Just rect + else Nothing hunk ./xmonad-contrib.cabal 91 XMonad.Doc.Configuring XMonad.Doc.Extending XMonad.Doc.Developing + XMonad.Actions.AfterDrag XMonad.Actions.BluetileCommands XMonad.Actions.Commands XMonad.Actions.ConstrainedResize merger 0.0 ( hunk ./xmonad-contrib.cabal 191 + XMonad.Layout.BinarySpacePartition hunk ./xmonad-contrib.cabal 191 + XMonad.Layout.AvoidFloats ) } [Resolve minor conflict in xmonad-contrib.cabal ankaan@gmail.com**20150306175436 Ignore-this: 24ae68c08107a574199b055989d38347 ] hunk ./xmonad-contrib.cabal 191 XMonad.Hooks.XPropManage XMonad.Layout.Accordion XMonad.Layout.AutoMaster + XMonad.Layout.AvoidFloats + XMonad.Layout.BinarySpacePartition XMonad.Layout.BorderResize XMonad.Layout.BoringWindows XMonad.Layout.ButtonDecoration Context: [add another extension to actually fix the build with ghc-7.10-RC1 Adam Vogt **20150124111939 Ignore-this: 26d6f1b4cb6d573ccf49e6baeca853e4 ] [BinarySpacePartition downstream changes benweitzman@gmail.com**20141110202259 Ignore-this: 42ecc2b07388ba0c7b3eac980256c17b Pulled in changes from my repo for this layout on github (https://github.com/benweitzman/BinarySpacePartition) Includes a new mode for resizing windows in a more intuitive way, also contains a bug fix that was preventing users from resiving a window up. Includes changes from github users egasimus (Adam Avramov) and SolitaryCipher (Nick) ] [add XF86AudioMicMute to EZConfig (#582) Adam Vogt **20141222045306 Ignore-this: 1c91505b303e53b94da624230b3c893c ] [Generalize new workspace addition functions to support arbitrary insertion. nrujac@gmail.com**20141219002309 Ignore-this: 9f8c14b5aa9d398b3f167da0af1a8650 The current DynamicWorkspaces module only supports adding new workspaces at the start of the list of workspaces. This means when binding workspaces to keys based on the position in the list, key bindings can change as workspaces are added in removed in a far more destructive way than necessary. Instead, supporting appending and arbitrary insertion allows the user to determine where the new workspace should be added. This patch is a straight generalization of the addHiddenWorkspace' function. Rather than always using `(:)` to insert the new workspace into the list of workspaces, this patches causes it to use an arbitrary list insertion function instead. A few new functions are added to prevent breakage of external code while exported functions are left unchanged. List of new functions: appendWorkspace appendWorkspacePrompt addWorkspaceAt addHiddenWorkspaceAt Existing functions were modified to call their generalized brethren where possible without changing functionality. This patch should not change behavior for any existing users of this module. ] [address another bitSize/finiteBitSize warning Adam Vogt **20141222033300 Ignore-this: 549e519d25080c77e605dc983f0d239e ] [X.L.Master: Add FixMaster layout modifier Anton Vorontsov **20141220011339 Ignore-this: 82e9736853287f753248af41843ceb6b This layout modifier is useful for the case if you desire to add a master pane that has fixed width (it's fixed even if there is just one window opened). Especially nice feature if you don't want to have too wide terminal in a master pane. The layout is implemented as an addition to Master layout, so it reuses most of the code. ] [filepath dependency for P.Pass was left out Adam Vogt **20141221214129 Ignore-this: 98e63d7b17ac6ebabd8a6b081f5194a1 ] [remove unused imports Adam Vogt **20140815051234 Ignore-this: b2e5be31b70e6d31827e76bd8c00d200 ] [fix build with ghc-6.12 Adam Vogt **20140815051214 Ignore-this: d4c4da527db6c8affc151dc210631b85 ] [use FiniteBitSize with ghc >= 7.8 Adam Vogt **20140815051136 Ignore-this: 90f855fd72406fb3d2640a133d499188 ] [Layout.Spacing: Outer window edges now get as much spacing as inner ones Felix Crux **20141219223646 Ignore-this: 61363e97939fe857876c8252ac5f0302 Layout.Spacing applies a customizable amount of space around the outside of each window. At window edges where two windows meet, the total distance between them is therefore twice the customized value (one space value from each window). At the edge of the screen, however, the spacing is only applied once. This results in uneven amounts of spacing and differently-sized gaps on the screen. This patch extends the Spacing layout to include a further gap all around the edge of the screen, thus making all spaces around windows equal in size. ] [add filepath package dependency needed by Prompt.Pass Adam Vogt **20140909145216 Ignore-this: 588ec76e7fccb4219361da7024c98db4 filepath comes with ghc, and it's used by xmonad-core anyways ] [X.C.Prime: doc tweaks Devin Mullins **20141002075939 Ignore-this: 20d6b829b810f48b5e4b4c161b39b312 ] [X.A.Navigation2D: add convenience functions for setting config & keybindings Devin Mullins **20141002075757 Ignore-this: ed01137f03a531f73315ed503d1eb6ef 1. Added 'additionalNav2DKeys' which adds keybindings for the cartesian product of direction keys and (modifier, action) pairs given. 2. Added 'navigation2D' which combines that with 'withNavigation2DConfig'. 3. Added 'additionalNav2DKeysP' and 'navigation2DP' which do the same, but use the 'additionalKeysP' syntax. ] [X.C.Prime: doc fixes Devin Mullins **20141001075855 Ignore-this: dbbe00791b04df61dcd595c50333fba ] [X.C.Prime: add 'withScreens' and friends Devin Mullins **20141001075250 Ignore-this: eba37b1ff3da265a4dcc509f538fce4d The screen equivalent of 'withWorkspaces' lets you more easily define keys that move/swap between screens. Also, rename wsKeyspecs to wsKeys, and make a couple of doc tweaks. ] [Implement proper handling of dynamically changing hostname Anton Vorontsov **20140901072158 Ignore-this: 2aeac6d2161e666d40cda6a09f78b208 The module implements a proper way of finding out whether the window is remote or local. Just checking for a hostname and WM_CLIENT_MACHINE being equal is often not enough because the hostname is a changing subject (without any established notification mechanisms), and thus WM_CLIENT_MACHINE and the hostname can diverge even for a local window. This module solves the problem. As soon as there is a new window created, we check the hostname and WM_CLIENT_MACHINE, and then we cache the result into the XMONAD_REMOTE property. Notice that XMonad itself does not know anything about hostnames, nor does it have any dependency on Network.* modules. For this module it is not a problem: you can provide a mean to get the hostname through your config file (see usage). Or, if you don't like the hassle of handling dynamic hostnames (suppose your hostname never changes), it is also fine: this module will fallback to using environment variables. ] [Add Stoppable layout for power saving Anton Vorontsov **20140901072141 Ignore-this: a52805d9f3095cd7af48507847ed2fe3 This module implements a special kind of layout modifier, which when applied to a layout, causes xmonad to stop all non-visible processes. In a way, this is a sledge-hammer for applications that drain power. For example, given a web browser on a stoppable workspace, once the workspace is hidden the web browser will be stopped. Note that the stopped application won't be able to communicate with X11 clipboard. For this, the module actually stops applications after a certain delay, giving a chance for a user to complete copy-paste sequence. By default, the delay equals to 15 seconds, it is configurable via 'Stoppable' constructor. The stoppable modifier prepends a mark (by default equals to "Stoppable") to the layout description (alternatively, you can choose your own mark and use it with 'Stoppable' constructor). The stoppable layout (identified by a mark) spans to multiple workspaces, letting you to create groups of stoppable workspaces that only stop processes when none of the workspaces are visible, and conversely, unfreezing all processes even if one of the stoppable workspaces are visible. To stop the process we use signals, which works for most cases. For processes that tinker with signal handling (debuggers), another (Linux-centric) approach may be used. See https://www.kernel.org/doc/Documentation/cgroups/freezer-subsystem.txt ] [X.C.Prime: doc changes Devin Mullins **20140925203037 Ignore-this: 51204c1a9f2e6ed21228d2910417fd21 ] [X.C.Prime: add withWorkspaces et al. Devin Mullins **20140925203034 Ignore-this: 65f691270110cc5de13c950d9dcb0c17 This allows easier configuration of workspaces and their keybindings. Required generalizing the 'Prime' type, so lots of other lines changed in rather trivial ways. ] [X.C.Prime: add ifThenElse binding Devin Mullins **20140924191509 Ignore-this: ae775c418c27301b9c12d2a233502cec This is necessary for if-then-else support in the user's config. ] [X.C.Prime: doc fixes Devin Mullins **20140915080601 Ignore-this: 15e3c445a99d3b2d3a235aa76119797 ] [X.C.Prime: fix 'def' hyperlink in doc Devin Mullins **20140914075352 Ignore-this: a1de1d81a5f140ab7d90edbf393e9bda ] [XMonad.Config.Prime, a do-notation for config Devin Mullins **20140914064828 Ignore-this: f7397aa6e6efe5d76acebfa22c567baa Note that the use of RebindableSyntax is because of the need to vary the layoutHook type throughout the config. The alternative, using the existential Layout type, was rejected because it required TemplateHaskell in order to look nice, and TemplateHaskell is not portable. I've tried to make a version of (>>) that also worked on normal monads, but have had no luck as of yet. Maybe some intrepid soul can add it later. ] [X.P.Shell: fix doc typo me@twifkak.com**20130317115516 Ignore-this: bdd385a9142ed039a917d135e76293fe ] [reverse workspaces, so that switching to a dynamic workspace group restores the focus to the screen that was focused at group creation time nwfilardo@gmail.com**20140913174118 Ignore-this: b74c02b1892159694827e35122c2d517 ] [add filepath dependency, needed by new X.P.Pass module me@twifkak.com**20140913070926 Ignore-this: fec97086c1e66cf8a036265bd1a970a8 ] [add-new-xmonad-prompt-pass eniotna.t@gmail.com**20140829131928 Ignore-this: 11e85dfe3d24cef88d8d89f4e7b1ec0b This module provides 3 to ease passwords manipulation (generate, read, remove): - one to lookup passwords in the password-storage. - one to generate a password for a given password label that the user inputs. - one to delete a stored password for a given password label that the user inputs. All those prompts benefit from the completion system provided by the module . The password store is setuped through an environment variable PASSWORD_STORE_DIR. If this is set, use the content of the variable. Otherwise, the password store is located on user's home @$HOME\/.password-store@. Source: - The password storage implementation is . - Inspired from ] [use Data.Map instead of Data.Map.Strict to support containers < 0.5 Adam Vogt **20140815043141 Ignore-this: 436d18657d8499f4ce57311e84503d9f ] [config-mate allbery.b@gmail.com**20140803020659 Ignore-this: d5de258c0a28cd5ba64a59cf37cd480a Initial support for the Mate desktop environment (http://mate-desktop.org). Based on existing Gnome 2 support, since Mate is a maintained fork of Gnome 2. ] [debug-managehook allbery.b@gmail.com**20140803020601 Ignore-this: 51f9255b496cca79e4a53e274c400ecc A set of hooks, and convenience combinators, to help with ManageHook debugging. Ordinary users may well want to use debugManageHookOn in normal configs, specifying a key sequence which can be pressed before running a command in order to capture debug information just for that command's main window. This is especially useful when trying to diagnose issues such as programs that do not play well with SpawnOn, or ManageHook matching on 'title' when the program does not set the window title until after it is mapped. ] [debug-debug allbery.b@gmail.com**20140803020530 Ignore-this: cbb2b1d99293e3a4d02a256c2733aeb0 Various fixes and enhancements to DebugWindow and DebugStack. ManageDebug requires these fixes, but some of them are significant even if not using ManageDebug. ] [derive Applicative instances to suppress AMP warning Adam Vogt **20140710163950 Ignore-this: c2110d07bccc61462c3fbf73c900aaa1 ] [clean up cabal file and drop support for base < 3 Adam Vogt **20140710013255 Ignore-this: 76b142e2b114604feac9b8e41cf71ab ] [add-duck-duck-go-search-engine eniotna.t@gmail.com**20140617174246 Ignore-this: 29bbfb2d07d9ddf36bf0268a4e255f81 ] [XSelection: getSelection: fix connection exhaustion bug (issue #573); include warning gwern@gwern.net**20140601025019 Ignore-this: add21190fc07338b243c2241cc746119 ] [Fix dbus-send call in XMonad.Config.Gnome md143rbh7f@gmail.com**20140129032114 Ignore-this: ed62458b55c8b34b77f73027eeee1a73 dbus-send --print-reply=string is invalid, but it was silently ignored until recently: http://cgit.freedesktop.org/dbus/dbus/commit/tools/dbus-send.c?id=c690ee4351f99ed5e629ffcf5f4a2edcd418d103 I've changed XMonad.Config.Gnome to run --print-reply=literal, since that's what the old behavior was. ] [warning police (unused variables) Adam Vogt **20140505001242 Ignore-this: a15b4d844b1da4f1f1f9b6095c968705 ] [This patch makes the Ssh extension works with **user** arguments in ssh, .e.g ssh admin@localhost. linxray@gmail.com**20140504091120 Ignore-this: 297673e11d3049c4f127aac3e172d361 ] [remove trailing whitespace in L.BinarySpacePartition Adam Vogt **20140501011943 Ignore-this: 8dd677978992e0854801b8f254463dc2 ] [replace Bound with the equivalent Direction2D Adam Vogt **20140501011540 Ignore-this: b1f1c256aba07f70918fe1d693c8087b ] [remove unused extension in BSP Adam Vogt **20140501011455 Ignore-this: a4962486b2aa3980536bff19a537451e ] [Add BinarySpacePartition layout benweitzman@gmail.com**20140430205848 Ignore-this: a85d1dc51bf54c59ae2bd9d948cc1088 ] [X.Actions.DynamicWorkspaceGroups: export new function addRawWSGroup Brent Yorgey **20140428142901 Ignore-this: a487882c9571bf91ff921d6561bb4cc6 ] [Remove unneeded context with the IfMax layout instance Adam Vogt **20140422221105 Ignore-this: 3b8ac316f56df6a84420754db769fb0 Extra constraints on instances are about as useful as -XDataTypeContexts ] [Adding side tabs and replacing TabbarLocation with Direction2D. nrujac@gmail.com**20140219200811 Ignore-this: edabeec973b4e0d61515818367689843 ] [warning police Daniel Wagner **20140316183747 Ignore-this: fd16435ccdd3fee8924723cc690cc239 ] [New module: XMonad.Util.WindowState Dmitry Bogatov **20140218100229 Ignore-this: 14a6fa263c423cd8cca3b2645b3930d7 Save almost arbitary data per window ] [Add side tabs to the tabbed layout. nrujac@gmail.com**20140213215247 Ignore-this: f81bafe9cb75a30ed6bbbe68cf5d66c0 ] [SpawnNamedPipe hlint cleanup cwills.dev@gmail.com**20140202213613 Ignore-this: dbb68c4c5522026bd108d0158e747b48 ] [document and cleanup SpawnNamedPipe cwills.dev@gmail.com**20140202211000 Ignore-this: b264278f1f1ab1f18b37245a5ff33136 ] [Added SpawnNamedPipe cwills.dev@gmail.com**20140202143415 Ignore-this: 87797ffffc8d0fd088482bd0c5baf0e ] [Make commandToComplete in XMonad.Prompt.Shell complete last word md143rbh7f@gmail.com**20140130200050 Ignore-this: b0fe22fdd7b9409835fd0ca069f2e01a The following change from 2013-02-09 breaks shell completion for me: hunk ./XMonad/Prompt/Shell.hs 65 + commandToComplete _ c = c It seems to be passing the entire string into compgen in order to get the file completions, but it should only pass the last word. I propose reverting this change. Comments are appreciated. ] [expose and document X.L.IndependentScreens.marshallSort Daniel Wagner **20140128212844 Ignore-this: 90c1437c6ffe1dbd8f4a4ed192097ec ] [ServerMode properly indent Adam Vogt **20131219201440 Ignore-this: 761b39c3e3c90b6123f068e8b1d34e5d ] [remove ServerMode tabs Adam Vogt **20131219201000 Ignore-this: f21448c248ec0ac289c309ed964ebcff ] [fix -Wall ServerMode Adam Vogt **20131219181030 Ignore-this: 708dd5fc60f43dee3d1da085002052f ] [documentation note that ServerMode is similar to wmctrl Adam Vogt **20131219180748 Ignore-this: 3215bdf1c698c798eca8ed7f62a0f591 ] [Generalized XMonad.Hooks.ServerMode polson2@hawk.iit.edu**20131216025100 Ignore-this: e58da3b168a1058f32982833ea25a739 ] [IfMax-Layout Ilya Portnov **20131201072634 Ignore-this: dac53f2a0505e740f05fdf03f1db0c21 This adds a new ("conditional") layout, IfMax, which simply runs one layout, if there are <= N windows, and else runs another layout. ] [fix UrgencyHook and add filterUrgencyHook Adam Vogt **20130924224738 Ignore-this: 3b7c62275701e6758397977c5c09b744 ] [export XMonad.Hooks.UrgencyHook.clearUrgency (issue 533) Adam Vogt **20130923031349 Ignore-this: dafe5763d9abcfa606f5c1a8cf5c57d6 ] [minor documentation fix: manageDocks doesn't do anything with struts, so don't claim it does Daniel Wagner **20130814125106 Ignore-this: a2610d6c1318ac0977abfc21d1b91632 ] [don't pretend to be LG3D in X.C.Dmwit because this confuses modern GTK Daniel Wagner **20130813211636 Ignore-this: 8f728dc1b4bf5e472d99419cc5920e51 ] [XMonad.Actions.UpdatePointer: generalise updatePointer Liyang HU **20130730071007 Ignore-this: 3374a62b6c63dcc152dbf843cd0577f0 ] [XMonad.Actions.UpdatePointer: document TowardsCentre Liyang HU **20130730053746 Ignore-this: 2d684b12e4fff0ebec254bea4a4546a3 ] [Haddock formatting in H.Minimize Adam Vogt **20130723155658 Ignore-this: 5db3186a51dec58f78954466ded339cb ] [Bump version (and xmonad dependency) to 0.12 Adam Vogt **20130720205857 Ignore-this: ce165178ca916223501f266339f1de39 This makes a breakage due to missing patches in core a bit more obvious. Previously you would have a build failure regarding some missing identifiers (def re-exported by XMonad from Data.Default), while after applying this patch it will be clear that xmonad-core needs to be updated. ] [Fix issue 551 by also getting manpath without -g flag. Adam Vogt **20130716030536 Ignore-this: ded2d51eb7b7697c0fdfaa8158d612df Instead of taking Ondrej's approach of figuring out which man (man-db or http://primates.ximian.com/~flucifredi/man/) is used by the system, just try both sets of flags. ] [Escape dzen markup and remove xmobar tags from window titles by default. Adam Vogt **20130708144813 Ignore-this: cf56bff752fbf78ea06d5c0cb755f615 The issue was that window titles, such as those set by, for example a browser, could set the window title to display something like normal title Which could be executed by xmobar (or dzen). This adds a ppTitleSanitize which does the above functions. This way when users override ppTitle, the benefits are not lost. Thanks to Raúl Benencia and Joachim Breitner for bringing this to my attention. ] [DynamicBars-use-ExtensibleState gopsychonauts@gmail.com**20130618074755 Ignore-this: afacba51af2be8ede65b9bcf9b002a7 Hooks.DynamicBars was previously using an MVar and the unsafePerformIO hack ( http://www.haskell.org/haskellwiki/Top_level_mutable_state ) to store bar state. Since ExtensibleState exists to solve these sorts of problems, I've switched the file over to use unsafePerformIO instead. Some functions' types had to be changed to allow access to XState, but the public API is unchanged. ] [Catch exceptions when finding commands on PATH in Prompt.Shell Thomas Tuegel **20130616230219 Ignore-this: 5a4d08c80301864bc14ed784f1054c3f ] [Fix haddock parse error in X.A.LinkWorkspaces Adam Vogt **20130528133448 Ignore-this: 42f05cf8ca9e6d1ffae3bd20666d87ab ] [use Data.Default wherever possible, and deprecate the things it replaces Daniel Wagner **20130528013909 Ignore-this: 898458b1d2868a70dfb09faf473dc7aa ] [eliminate references to defaultConfig Daniel Wagner **20130528005825 Ignore-this: 37ae613e4b943e99c5200915b9d95e58 ] [minimal change needed to get xmonad-contrib to build with xmonad's data-default patch Daniel Wagner **20130528001040 Ignore-this: 291e4f6cd74fc2b808062e0369665170 ] [Remove unneeded XSync call in Layout.ShowWName Francesco Ariis **20130517153341 Ignore-this: 4d107c680572eff464c8f6ed9fabdd41 ] [Remove misleading comment: we definitely don't support ghc-6.6 anymore Adam Vogt **20130514215851 Ignore-this: 2d071cb05709a16763d039222264b426 ] [Fix module name in comment of X.L.Fullscreen Adam Vogt **20130514215727 Ignore-this: cb5cf18c301c5daf5e1a2527da1ef6bf ] [Minor update to cabal file (adding modules & maintainership) Adam Vogt **20130514215632 Ignore-this: 82785e02e544e1f797799bed5b5d9be2 ] [Remove trailing whitespace in X.A.LinkWorkspaces Adam Vogt **20130514215421 Ignore-this: 5015ab4468e7931876eb66b019af804c ] [Update documentation of LinkWorkspaces Module quesel@informatik.uni-oldenburg.de**20110328072813 Ignore-this: da863534931181f551c9c54bc4076c05 ] [Added a module for linking workspaces quesel@informatik.uni-oldenburg.de**20110210165018 Ignore-this: 1dba2164cc3387409873d33099596d91 This module provides a way to link certain workspaces in a multihead setup. That way, when switching to the first one the other heads display the linked workspaces. ] [Cache results from calcGap in ManageDocks Adam Vogt **20130425155811 Ignore-this: e5076fdbdfc68bc159424dd4e0f14456 http://www.haskell.org/pipermail/xmonad/2013-April/013670.html ] [Remove unnecessary contexts from L.MultiToggle Adam Vogt **20130217163356 Ignore-this: 6b0e413d8c3a58f62088c32a96c57c51 ] [Generalises modWorkspace to take any layout-transforming function gopsychonauts@gmail.com**20130501151425 Ignore-this: 28c7dc1f6216bb1ebdffef5434ccbcbd modWorkspace already was capable of modifying the layout with an arbitrary layout -> layout function, but its original type restricted it such that it could only apply a single LayoutModifier; this was often inconvenient, as for example it was not possible simply to compose LayoutModifiers for use with modWorkspace. This patch also reimplements onWorkspaces in terms of modWorkspaces, since with the latter's less restrictive type this is now possible. ] [since XMonad.Config.Dmwit mentions xmobar, we should include the associated .xmobarrc file Daniel Wagner **20130503194055 Ignore-this: 2f6d7536df81eb767262b79b60eb1b86 ] [warning police Daniel Wagner **20130502012700 Ignore-this: ae7412ac77c57492a7ad6c5f8f50b9eb ] [XMonad.Config.Dmwit Daniel Wagner **20130502012132 Ignore-this: 7402161579fd2e191b60a057d955e5ea ] [minor fixes to the haddock markup in X.L.IndependentScreens Daniel Wagner **20130411193849 Ignore-this: b6a139aa43fdb39fc1b86566c0c34c7a ] [add whenCurrentOn to X.L.IndependentScreens Daniel Wagner **20130408225251 Ignore-this: ceea3d391f270abc9ed8e52ce19fb1ac ] [Allow to specify the initial gaps' states in X.L.Gaps Paul Fertser **20130222072232 Ignore-this: 31596d918d0050e36ce3f64f56205a64 ] [should bump X11 dependency, too, to make sure we have getAtomName Daniel Wagner **20130225180527 Ignore-this: 260711f27551f18cc66afeb7b4846b9f ] [getAtomName is now defined in the X11 library Daniel Wagner **20130225180323 Ignore-this: 3b9e17c234679e98752a47c37132ee4e ] [Allow to limit maximum row count in X.Prompt completion window Paul Fertser **20130221122050 Ignore-this: 923656f02996f2de2b1336275392c5f9 On a keyboard-less device (such as a smartphone), where one has to use an on-screen keyboard, the maximum completion window height must be limited to avoid overlapping the keyboard. ] [Note in U.NameActions that xmonad core can list default keys now Adam Vogt **20130217233026 Ignore-this: 937bff636fa88171932d5192fe8e290b ] [Export U.NamedActions.addDescrKeys per evaryont's request. Adam Vogt **20130217232619 Ignore-this: a694a0a3ece70b52fba6e8f688d86344 ] [Add EWMH DEMANDS_ATTENTION support to UrgencyHook. Maarten de Vries **20130212181229 Ignore-this: 5a4b314d137676758fad9ec8f85ce422 Add support for the _NET_WM_STATE_DEMANDS_ATTENTION atom by treating it the same way as the WM_HINTS urgency flag. ] [Unconditionally set _NET_WORKAREA in ManageDocks Adam Vogt **20130117180851 Ignore-this: 9f57e53fba9573d8a92cf153beb7fe7a ] [spawn command when no completion is available (if alwaysHighlight is True); changes commandToComplete in Prompt/Shell to complete the whole word instead of using getLastWord c.lopez@kmels.net**20130209190456 Ignore-this: ca7d354bb301b555b64d5e76e31d10e8 ] [order-unindexed-ws-last matthewhague@zoho.com**20120703222726 Ignore-this: 4af8162ee8b16a60e8fd62fbc915d3c0 Changes the WorkspaceCompare module's comparison by index to put workspaces without an index last (rather than first). ] [SpawnOn modification for issue 523 Adam Vogt **20130114014642 Ignore-this: 703f7dc0f800366b752f0ec1cecb52e5 This moves the function to help clean up the `Spawner' to the ManageHook rather than in functions like spawnOn. Probably it makes no difference, the reason is because there's one manageSpawn function but many different so this way there are less functions to write. ] [Update L.TrackFloating.useTransient example code Adam Vogt **20130112041239 Ignore-this: e4e31cf1db742778c1d59d52fdbeed7a Suggest useTransient goes to the right of trackFloating which is the configuration actually tested. ] [Adapt ideas of issue 306 patch to a new modifier in L.TrackFloating Adam Vogt **20130112035701 Ignore-this: d54d27b71b97144ef0660f910fd464aa ] [Make X.A.CycleWS not rely on hidden WS order Dmitri Iouchtchenko **20130109023328 Ignore-this: 8717a154b33253c5df4e9a0ada4c2c3e ] [Add X.H.WorkspaceHistory Dmitri Iouchtchenko **20130109023307 Ignore-this: c9e7ce33a944facc27481dde52c7cc80 ] [Allow removing arbitrary workspaces Dmitri Iouchtchenko **20121231214343 Ignore-this: 6fce4bd3d0c5337e5122158583138e74 ] [Remove first-hidden restriction from X.A.DynamicWorkspaces.removeWorkspace' Dmitri Iouchtchenko **20121231214148 Ignore-this: 55fb0859e9a5f476a834ecbdb774aac8 ] [Add authorspellings file for `darcs show authors'. Adam Vogt **20130101040031 Ignore-this: c3198072ebc6a71d635bec4d8e2c78fd This authorspellings file includes a couple people who've contributed to xmonad (not XMonadContrib). When people have multiple addresses, the most recent one has been picked. ] [TAG 0.11 Adam Vogt **20130101014231 Ignore-this: 57cf32412fd1ce912811cb7fafe930f5 ] Patch bundle hash: ab7bc0b1819e68878a257f8a8ffb5ebe83e3e341