aboutsummaryrefslogtreecommitdiffstats
path: root/XMonad/Layout/IndependentScreens.hs
diff options
context:
space:
mode:
Diffstat (limited to 'XMonad/Layout/IndependentScreens.hs')
-rw-r--r--XMonad/Layout/IndependentScreens.hs50
1 files changed, 29 insertions, 21 deletions
diff --git a/XMonad/Layout/IndependentScreens.hs b/XMonad/Layout/IndependentScreens.hs
index d5a1f86..abbe510 100644
--- a/XMonad/Layout/IndependentScreens.hs
+++ b/XMonad/Layout/IndependentScreens.hs
@@ -1,23 +1,31 @@
------------------------------------------------------------------------------
--- |
--- Module : XMonad.Layout.IndependentScreens
--- Copyright : (c) 2009 Daniel Wagner
--- License : BSD3
---
--- Maintainer : <daniel@wagner-home.com>
--- Stability : unstable
--- Portability : unportable
---
--- Utility functions for simulating independent sets of workspaces on
--- each screen (like dwm's workspace model), using internal tags to
--- distinguish workspaces associated with each screen.
------------------------------------------------------------------------------
-
module IndependentScreens where
-marshall (S sc) ws = show sc ++ '_':ws
-unmarshall = ((S . read) *** drop 1) . break (=='_')
-workspaces' = nub . map (snd . unmarshall) . workspaces
-withScreens n workspaces = [marshall sc ws | ws <- workspaces, sc <- [0..n-1]]
-onScreen f workspace = screen . current >>= f . flip marshall workspace
-countScreens = fmap genericLength $ openDisplay "" >>= getScreenInfo
+-- for the screen stuff
+import Control.Arrow hiding ((|||))
+import Control.Monad
+import Control.Monad.Instances
+import Data.List
+import Graphics.X11.Xinerama
+import XMonad
+import XMonad.StackSet hiding (workspaces)
+
+type VirtualWorkspace = String
+type PhysicalWorkspace = String
+
+marshall :: ScreenId -> VirtualWorkspace -> PhysicalWorkspace
+marshall (S sc) vws = show sc ++ '_':vws
+
+unmarshall :: PhysicalWorkspace -> (ScreenId, VirtualWorkspace)
+unmarshall = ((S . read) *** drop 1) . break (=='_')
+
+workspaces' :: XConfig l -> [VirtualWorkspace]
+workspaces' = nub . map (snd . unmarshall) . workspaces
+
+withScreens :: ScreenId -> [VirtualWorkspace] -> [PhysicalWorkspace]
+withScreens n vws = [marshall sc pws | pws <- vws, sc <- [0..n-1]]
+
+onScreen :: (VirtualWorkspace -> WindowSet -> a) -> (PhysicalWorkspace -> WindowSet -> a)
+onScreen f vws = screen . current >>= f . flip marshall vws
+
+countScreens :: (MonadIO m, Integral i) => m i
+countScreens = liftM genericLength . liftIO $ openDisplay "" >>= getScreenInfo