--- InsertPosition.hs
+++ InsertPositionNew.hs
@@ -16,15 +16,16 @@
 module XMonad.Hooks.InsertPosition (
     -- * Usage
     -- $usage
-    insertPosition
+    insertPosition,
+    insertPositionPerWorkspace
     ,Focus(..), Position(..)
     ) where

-import XMonad(ManageHook, MonadReader(ask))
+import XMonad(ManageHook, MonadReader(ask), WorkspaceId)
 import qualified XMonad.StackSet as W
 import Control.Applicative((<$>))
 import Data.Maybe(fromMaybe)
-import Data.List(find)
+import Data.List(find,lookup)
 import Data.Monoid(Endo(Endo))

 -- $usage
@@ -44,26 +45,30 @@
 -- | insertPosition. A manage hook for placing new windows. XMonad's default is
 -- the same as using: @insertPosition Above Newer@.
 insertPosition :: Position -> Focus -> ManageHook
-insertPosition pos foc = Endo . g <$> ask
+insertPosition = insertPositionPerWorkspace []
+
+-- | Specify an insertPosition for a particular Workspace.
+insertPositionPerWorkspace :: [(WorkspaceId, (Position, Focus))] -> Position -> Focus -> ManageHook
+insertPositionPerWorkspace l pos foc = Endo . g <$> ask
   where
-    g w = viewingWs w (updateFocus w . ins w . W.delete w)
-    ins w = (\f ws -> fromMaybe id (W.focusWindow <$> W.peek ws) $ f ws) $
-        case pos of
+    g w = viewingWs w (\i -> updateFocus i w . ins i w . W.delete w)
+    ins i w = (\f ws -> fromMaybe id (W.focusWindow <$> W.peek ws) $ f ws) $
+        case fst $ fromMaybe (pos,foc) (lookup i l) of
             Master -> W.insertUp w . W.focusMaster
             End    -> insertDown w . W.modify' focusLast'
             Above  -> W.insertUp w
             Below  -> insertDown w
-    updateFocus =
-        case foc of
+    updateFocus i =
+        case snd $ fromMaybe (pos,foc) (lookup i l) of
             Older -> const id
             Newer -> W.focusWindow

 -- | Modify the StackSet when the workspace containing w is focused
-viewingWs :: (Eq a, Eq s, Eq i, Show i) =>a-> (W.StackSet i l a s sd -> W.StackSet i l a s sd)-> W.StackSet i l a s sd-> W.StackSet i l a s sd
+viewingWs :: (Eq a, Eq s, Eq i, Show i) =>a-> (i -> W.StackSet i l a s sd -> W.StackSet i l a s sd)-> W.StackSet i l a s sd-> W.StackSet i l a s sd
 viewingWs w f = do
     i <- W.tag . W.workspace . W.current
     ws <- find (elem w . W.integrate' . W.stack) . W.workspaces
-    maybe id (fmap (W.view i . f) . W.view . W.tag) ws
+    maybe id (fmap (W.view i . f i) . W.view . W.tag) ws

 -- | 'insertDown' and 'focusLast' belong in XMonad.StackSet?
 insertDown :: (Eq a) => a -> W.StackSet i l a s sd -> W.StackSet i l a s sd
