aboutsummaryrefslogtreecommitdiffstats
path: root/DwmPromote.hs
diff options
context:
space:
mode:
authorMiikka Koskinen <arcatan@kapsi.fi>2007-05-01 10:20:31 +0200
committerMiikka Koskinen <arcatan@kapsi.fi>2007-05-01 10:20:31 +0200
commite572762b1d3b6e1ddced0fc8523f53da948a6660 (patch)
treecc591588d05df6d609d9ef71a04d57c99b69ac5e /DwmPromote.hs
parent42c4186a49ba785deac816a4d69f397d78ab3d90 (diff)
downloadXMonadContrib-e572762b1d3b6e1ddced0fc8523f53da948a6660.tar.gz
XMonadContrib-e572762b1d3b6e1ddced0fc8523f53da948a6660.tar.xz
XMonadContrib-e572762b1d3b6e1ddced0fc8523f53da948a6660.zip
XMonadContrib.DwmPromote: dwm-like promote
I like the way dwm's equivalent to xmonad's promote works, so I implemented dwmpromote. darcs-hash:20070501082031-0ff8e-55a153d752dafb238c0e1f51f4484ec5435af430.gz
Diffstat (limited to 'DwmPromote.hs')
-rw-r--r--DwmPromote.hs46
1 files changed, 46 insertions, 0 deletions
diff --git a/DwmPromote.hs b/DwmPromote.hs
new file mode 100644
index 0000000..7792fdd
--- /dev/null
+++ b/DwmPromote.hs
@@ -0,0 +1,46 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module : XMonadContrib.DwmPromote
+-- Copyright : (c) Miikka Koskinen 2007
+-- License : BSD3-style (see LICENSE)
+--
+-- Maintainer : arcatan@kapsi.fi
+--
+-----------------------------------------------------------------------------
+--
+-- Dwm-like promote function for xmonad.
+--
+-- Swaps focused window with the master window. If focus is in the
+-- master, swap it with the next window in the stack. Focus stays in the
+-- master.
+--
+-- To use, modify your Config.hs to:
+--
+-- import XMonadContrib.DwmPromote
+--
+-- and add a keybinding or substitute promote with dwmpromote:
+--
+-- , ((modMask, xK_Return), dwmpromote)
+--
+
+module XMonadContrib.DwmPromote (dwmpromote) where
+
+import XMonad
+import Operations (windows)
+import StackSet hiding (promote)
+import qualified Data.Map as M
+
+dwmpromote :: X ()
+dwmpromote = windows promote
+
+promote :: (Integral i, Ord a) => StackSet i j a -> StackSet i j a
+promote w = maybe w id $ do
+ a <- peek w -- fail if null
+ let stack = index (current w) w
+ let newstack = swap a (next stack a) stack
+ return $ w { stacks = M.insert (current w) newstack (stacks w),
+ focus = M.insert (current w) (head newstack) (focus w) }
+ where
+ next s a | head s /= a = head s -- focused is not master
+ | length s > 1 = s !! 1
+ | otherwise = a