aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--XMonad/Layout/LayoutScreens.hs17
1 files changed, 16 insertions, 1 deletions
diff --git a/XMonad/Layout/LayoutScreens.hs b/XMonad/Layout/LayoutScreens.hs
index aa8699c..25d44c9 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