From bfefeedb40f30db5142a31603a62def123cd1794 Mon Sep 17 00:00:00 2001 From: Devin Mullins Date: Thu, 11 Sep 2008 07:39:09 +0200 Subject: add W.shiftMaster, fix float/tile-reordering bug darcs-hash:20080911053909-78224-d050fdbedac4eb39a96f30ec0679a9b67d274091 --- XMonad/Config.hs | 6 +++--- XMonad/StackSet.hs | 11 ++++++++++- man/xmonad.hs | 8 +++++--- tests/Properties.hs | 17 +++++++++++++++++ 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) -- cgit v1.2.3