aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--SwapFocus.hs30
1 files changed, 30 insertions, 0 deletions
diff --git a/SwapFocus.hs b/SwapFocus.hs
new file mode 100644
index 0000000..339f526
--- /dev/null
+++ b/SwapFocus.hs
@@ -0,0 +1,30 @@
+module XMonadContrib.SwapFocus ( swapFocus ) where
+
+-- swaps focus with last-focussed window.
+
+-- To use:
+-- import XMonadContrib.SwapFocus ( swapFocus )
+
+-- , ((modMask .|. shiftMask, xK_Tab), swapFocus)
+
+import Control.Monad.State
+
+import Operations ( refresh )
+import XMonad ( X, WindowSet, workspace )
+import StackSet ( StackSet, peekStack, popFocus, pushFocus, current )
+
+sf :: (Integral i, Integral j, Ord a) => StackSet i j a -> Maybe (StackSet i j a)
+sf w = do let i = current w
+ f1 <- peekStack i w
+ f2 <- peekStack i $ popFocus i f1 w
+ return $ pushFocus i f2 $ pushFocus i f1 w
+
+swapFocus :: X ()
+swapFocus = smartwindows sf
+
+-- | smartwindows. Modify the current window list with a pure function, and only refresh if necesary
+smartwindows :: (WindowSet -> Maybe WindowSet) -> X ()
+smartwindows f = do w <- gets workspace
+ case (f w) of Just f' -> do modify $ \s -> s { workspace = f' }
+ refresh
+ Nothing -> return ()