summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--XMonad/Config.hs6
-rw-r--r--XMonad/StackSet.hs11
-rw-r--r--man/xmonad.hs8
-rw-r--r--tests/Properties.hs17
4 files changed, 35 insertions, 7 deletions
diff --git a/XMonad/Config.hs b/XMonad/Config.hs
index 52c04af..aab81f2 100644
--- a/XMonad/Config.hs
+++ b/XMonad/Config.hs
@@ -226,12 +226,12 @@ mouseBindings :: XConfig Layout -> M.Map (KeyMask, Button) (Window -> X ())
mouseBindings (XConfig {XMonad.modMask = modMask}) = M.fromList $
-- mod-button1 %! Set the window to floating mode and move by dragging
[ ((modMask, button1), (\w -> focus w >> mouseMoveWindow w
- >> windows W.swapMaster))
+ >> windows W.shiftMaster))
-- mod-button2 %! Raise the window to the top of the stack
- , ((modMask, button2), (\w -> focus w >> windows W.swapMaster))
+ , ((modMask, button2), (\w -> focus w >> windows W.shiftMaster))
-- mod-button3 %! Set the window to floating mode and resize by dragging
, ((modMask, button3), (\w -> focus w >> mouseResizeWindow w
- >> windows W.swapMaster))
+ >> windows W.shiftMaster))
-- you may also bind events to the mouse scroll wheel (button4 and button5)
]
diff --git a/XMonad/StackSet.hs b/XMonad/StackSet.hs
index 62c3c34..bd1c4b6 100644
--- a/XMonad/StackSet.hs
+++ b/XMonad/StackSet.hs
@@ -42,7 +42,7 @@ module XMonad.StackSet (
insertUp, delete, delete', filter,
-- * Setting the master window
-- $settingMW
- swapUp, swapDown, swapMaster, modify, modify', float, sink, -- needed by users
+ swapUp, swapDown, swapMaster, shiftMaster, modify, modify', float, sink, -- needed by users
-- * Composite operations
-- $composite
shift, shiftWin,
@@ -508,6 +508,15 @@ swapMaster = modify' $ \c -> case c of
-- natural! keep focus, move current to the top, move top to current.
+-- | /O(s)/. Set the master window to the focused window.
+-- The other windows are kept in order and shifted down on the stack, as if you
+-- just hit mod-shift-k a bunch of times.
+-- Focus stays with the item moved.
+shiftMaster :: StackSet i l a s sd -> StackSet i l a s sd
+shiftMaster = modify' $ \c -> case c of
+ Stack _ [] _ -> c -- already master.
+ Stack t ls rs -> Stack t [] (reverse ls ++ rs)
+
-- | /O(s)/. Set focus to the master window.
focusMaster :: StackSet i l a s sd -> StackSet i l a s sd
focusMaster = modify' $ \c -> case c of
diff --git a/man/xmonad.hs b/man/xmonad.hs
index d41fa56..845de8b 100644
--- a/man/xmonad.hs
+++ b/man/xmonad.hs
@@ -157,13 +157,15 @@ myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $
myMouseBindings (XConfig {XMonad.modMask = modMask}) = M.fromList $
-- mod-button1, Set the window to floating mode and move by dragging
- [ ((modMask, button1), (\w -> focus w >> mouseMoveWindow w))
+ [ ((modMask, button1), (\w -> focus w >> mouseMoveWindow w
+ >> windows W.shiftMaster))
-- mod-button2, Raise the window to the top of the stack
- , ((modMask, button2), (\w -> focus w >> windows W.swapMaster))
+ , ((modMask, button2), (\w -> focus w >> windows W.shiftMaster))
-- mod-button3, Set the window to floating mode and resize by dragging
- , ((modMask, button3), (\w -> focus w >> mouseResizeWindow w))
+ , ((modMask, button3), (\w -> focus w >> mouseResizeWindow w
+ >> windows W.shiftMaster))
-- you may also bind events to the mouse scroll wheel (button4 and button5)
]
diff --git a/tests/Properties.hs b/tests/Properties.hs
index 9b0e83c..8a8ab04 100644
--- a/tests/Properties.hs
+++ b/tests/Properties.hs
@@ -528,6 +528,18 @@ prop_shift_reversible i (x :: T) =
y = swapMaster x
n = tag (workspace $ current y)
+------------------------------------------------------------------------
+-- shiftMaster
+
+-- focus/local/idempotent same as swapMaster:
+prop_shift_master_focus (x :: T) = peek x == (peek $ shiftMaster x)
+prop_shift_master_local (x :: T) = hidden_spaces x == hidden_spaces (shiftMaster x)
+prop_shift_master_idempotent (x :: T) = shiftMaster (shiftMaster x) == shiftMaster x
+-- ordering is constant modulo the focused window:
+prop_shift_master_ordering (x :: T) = case peek x of
+ Nothing -> True
+ Just m -> L.delete m (index x) == L.delete m (index $ shiftMaster x)
+
-- ---------------------------------------------------------------------
-- shiftWin
@@ -933,6 +945,11 @@ main = do
,("swapUp is local" , mytest prop_swap_left_local)
,("swapDown is local" , mytest prop_swap_right_local)
+ ,("shiftMaster id on focus", mytest prop_shift_master_focus)
+ ,("shiftMaster is local", mytest prop_shift_master_local)
+ ,("shiftMaster is idempotent", mytest prop_shift_master_idempotent)
+ ,("shiftMaster preserves ordering", mytest prop_shift_master_ordering)
+
,("shift: invariant" , mytest prop_shift_I)
,("shift is reversible" , mytest prop_shift_reversible)
,("shiftWin: invariant" , mytest prop_shift_win_I)