aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Roundy <droundy@darcs.net>2007-05-12 21:13:15 +0200
committerDavid Roundy <droundy@darcs.net>2007-05-12 21:13:15 +0200
commita27649dcabb864253e3496e15a24842a0fcd3b92 (patch)
tree038ff238e069b9ebd43f3d9daf987cb9ecfb4fde
parent7c37e6463f860d01cfb0c12b91e5f2ab1c7589c5 (diff)
downloadXMonadContrib-a27649dcabb864253e3496e15a24842a0fcd3b92.tar.gz
XMonadContrib-a27649dcabb864253e3496e15a24842a0fcd3b92.tar.xz
XMonadContrib-a27649dcabb864253e3496e15a24842a0fcd3b92.zip
add SwapFocus.
darcs-hash:20070512191315-72aca-791c0e5c24b0d5ae0432f76f1e3c5baf8552e882.gz
-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 ()