aboutsummaryrefslogtreecommitdiffstats
path: root/DwmPromote.hs
diff options
context:
space:
mode:
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