aboutsummaryrefslogtreecommitdiffstats
path: root/XMonad
diff options
context:
space:
mode:
Diffstat (limited to 'XMonad')
-rw-r--r--XMonad/Hooks/WorkspaceByPos.hs65
1 files changed, 65 insertions, 0 deletions
diff --git a/XMonad/Hooks/WorkspaceByPos.hs b/XMonad/Hooks/WorkspaceByPos.hs
new file mode 100644
index 0000000..779c948
--- /dev/null
+++ b/XMonad/Hooks/WorkspaceByPos.hs
@@ -0,0 +1,65 @@
+----------------------------------------------------------------------------
+-- |
+-- Module : XMonad.Hooks.WorkspaceByPos
+-- Copyright : (c) Jan Vornberger 2009
+-- License : BSD3-style (see LICENSE)
+--
+-- Maintainer : jan.vornberger@informatik.uni-oldenburg.de
+-- Stability : unstable
+-- Portability : not portable
+--
+-- Useful in a dual-head setup: Looks at the requested geometry of
+-- new windows and moves them to the workspace of the non-focused
+-- screen if necessary.
+--
+-----------------------------------------------------------------------------
+
+module XMonad.Hooks.WorkspaceByPos (
+ -- * Usage
+ -- $usage
+ workspaceByPos
+ ) where
+
+import XMonad
+import qualified XMonad.StackSet as W
+
+import Data.Maybe
+import Control.Applicative((<$>))
+
+-- $usage
+-- You can use this module with the following in your @~\/.xmonad\/xmonad.hs@:
+--
+-- > import XMonad.Hooks.WorkspaceByPos
+-- >
+-- > myManageHook = workspaceByPos <+> manageHook defaultConfig
+-- >
+-- > main = xmonad defaultConfig { manageHook = myManageHook }
+
+workspaceByPos :: ManageHook
+workspaceByPos = ask >>= \w -> do
+ b <- liftX $ needsMoving w
+ case b of
+ Nothing -> idHook
+ Just wkspc -> doShift wkspc
+
+needsMoving :: Window -> X (Maybe WorkspaceId)
+needsMoving w = withDisplay $ \d -> do
+ -- only relocate windows with non-zero position
+ wa <- io $ getWindowAttributes d w
+ if ((wa_x wa) == 0) && ((wa_y wa) == 0)
+ then return Nothing
+ else do
+ ws <- gets windowset
+ sc <- fromMaybe (W.current ws)
+ <$> pointScreen (fi $ wa_x wa) (fi $ wa_y wa)
+ maybeWkspc <- screenWorkspace (W.screen sc)
+ case maybeWkspc of
+ Nothing -> return Nothing
+ Just wkspc -> do
+ let currentWksp = W.currentTag ws
+ if currentWksp == wkspc
+ then return Nothing
+ else return (Just wkspc)
+
+fi :: (Integral a, Num b) => a -> b
+fi = fromIntegral