From abebe3085c2ceb11aabdf519942a96e6cd42322a Mon Sep 17 00:00:00 2001 From: Anders Engstrom Date: Mon, 8 Mar 2010 11:43:18 +0000 Subject: [PATCH] X.L.LayoutScreens split current screen This patch will allow the user to split the currently focused screen instead of all screens together. This is usefull for multiscreen users who have functioning xinerama, but wish to split one of the screens. --- XMonad/Layout/LayoutScreens.hs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/XMonad/Layout/LayoutScreens.hs b/XMonad/Layout/LayoutScreens.hs index aa8699c9..25d44c93 100644 --- a/XMonad/Layout/LayoutScreens.hs +++ b/XMonad/Layout/LayoutScreens.hs @@ -16,7 +16,7 @@ module XMonad.Layout.LayoutScreens ( -- * Usage -- $usage - layoutScreens, fixedLayout + layoutScreens, layoutSplitScreen, fixedLayout ) where import XMonad @@ -55,6 +55,7 @@ import qualified XMonad.StackSet as W -- For detailed instructions on editing your key bindings, see -- "XMonad.Doc.Extending#Editing_key_bindings". +-- | Modify all screens. layoutScreens :: LayoutClass l Int => Int -> l Int -> X () layoutScreens nscr _ | nscr < 1 = trace $ "Can't layoutScreens with only " ++ show nscr ++ " screens." layoutScreens nscr l = @@ -67,6 +68,20 @@ layoutScreens nscr l = , W.visible = zipWith3 W.Screen xs [1 ..] $ map SD ss , W.hidden = ys } +-- | Modify current screen. +layoutSplitScreen :: LayoutClass l Int => Int -> l Int -> X () +layoutSplitScreen nscr _ | nscr < 1 = trace $ "Can't layoutSplitScreen with only " ++ show nscr ++ " screens." +layoutSplitScreen nscr l = + do rect <- gets $ screenRect . W.screenDetail . W.current . windowset + (wss, _) <- runLayout (W.Workspace "" l (Just $ W.Stack { W.focus=1, W.up=[],W.down=[1..nscr-1] })) rect + windows $ \ws@(W.StackSet { W.current = c, W.visible = vs, W.hidden = hs }) -> + let (x:xs, ys) = splitAt nscr $ W.workspace c : hs + s:ss = map snd wss + in ws { W.current = W.Screen x (W.screen c) (SD s) + , W.visible = (zipWith3 W.Screen xs [(W.screen c+1) ..] $ map SD ss) ++ + map (\v -> if W.screen v>W.screen c then v{W.screen = W.screen v + fromIntegral (nscr-1)} else v) vs + , W.hidden = ys } + getWindowRectangle :: Window -> X Rectangle getWindowRectangle w = withDisplay $ \d -> do a <- io $ getWindowAttributes d w