Merge pull request #378 from ivanbrennan/boring-swaps

BoringWindows: swapUp, swapDown
This commit is contained in:
Brent Yorgey
2020-09-14 13:50:33 -05:00
committed by GitHub
2 changed files with 30 additions and 6 deletions

View File

@@ -70,6 +70,10 @@
### Bug Fixes and Minor Changes ### Bug Fixes and Minor Changes
* `XMonad.Layout.BoringWindows`
Added boring-aware `swapUp` and `swapDown` functions.
* `XMonad.Util.NamedScratchpad` * `XMonad.Util.NamedScratchpad`
Added two new exported functions to the module: Added two new exported functions to the module:

View File

@@ -20,7 +20,7 @@ module XMonad.Layout.BoringWindows (
boringWindows, boringAuto, boringWindows, boringAuto,
markBoring, markBoringEverywhere, markBoring, markBoringEverywhere,
clearBoring, focusUp, focusDown, clearBoring, focusUp, focusDown,
focusMaster, focusMaster, swapUp, swapDown,
UpdateBoring(UpdateBoring), UpdateBoring(UpdateBoring),
BoringMessage(Replace,Merge), BoringMessage(Replace,Merge),
@@ -65,6 +65,8 @@ import qualified XMonad.StackSet as W
data BoringMessage = FocusUp | FocusDown | FocusMaster | IsBoring Window | ClearBoring data BoringMessage = FocusUp | FocusDown | FocusMaster | IsBoring Window | ClearBoring
| Replace String [Window] | Replace String [Window]
| Merge String [Window] | Merge String [Window]
| SwapUp
| SwapDown
deriving ( Read, Show, Typeable ) deriving ( Read, Show, Typeable )
instance Message BoringMessage instance Message BoringMessage
@@ -75,12 +77,14 @@ data UpdateBoring = UpdateBoring
deriving (Typeable) deriving (Typeable)
instance Message UpdateBoring instance Message UpdateBoring
markBoring, clearBoring, focusUp, focusDown, focusMaster :: X () markBoring, clearBoring, focusUp, focusDown, focusMaster, swapUp, swapDown :: X ()
markBoring = withFocused (sendMessage . IsBoring) markBoring = withFocused (sendMessage . IsBoring)
clearBoring = sendMessage ClearBoring clearBoring = sendMessage ClearBoring
focusUp = sendMessage UpdateBoring >> sendMessage FocusUp focusUp = sendMessage UpdateBoring >> sendMessage FocusUp
focusDown = sendMessage UpdateBoring >> sendMessage FocusDown focusDown = sendMessage UpdateBoring >> sendMessage FocusDown
focusMaster = sendMessage UpdateBoring >> sendMessage FocusMaster focusMaster = sendMessage UpdateBoring >> sendMessage FocusMaster
swapUp = sendMessage UpdateBoring >> sendMessage SwapUp
swapDown = sendMessage UpdateBoring >> sendMessage SwapDown
-- | Mark current focused window boring for all layouts. -- | Mark current focused window boring for all layouts.
-- This is useful in combination with the 'XMonad.Actions.CopyWindow' module. -- This is useful in combination with the 'XMonad.Actions.CopyWindow' module.
@@ -130,12 +134,24 @@ instance LayoutModifier BoringWindows Window where
. skipBoring W.focusUp' -- no boring window gets the focus . skipBoring W.focusUp' -- no boring window gets the focus
. focusMaster' . focusMaster'
return Nothing return Nothing
where skipBoring f st = fromMaybe st $ listToMaybe | Just SwapUp <- fromMessage m =
$ filter ((`notElem` W.focus st:bs) . W.focus) do windows $ W.modify' skipBoringSwapUp
return Nothing
| Just SwapDown <- fromMessage m =
do windows $ W.modify' (reverseStack . skipBoringSwapUp . reverseStack)
return Nothing
where skipBoring = skipBoring' ((`notElem` bs) . W.focus)
skipBoringSwapUp = skipBoring'
(maybe True (`notElem` bs) . listToMaybe . W.down)
swapUp'
skipBoring' p f st = fromMaybe st $ listToMaybe
$ filter p
$ drop 1
$ take (length $ W.integrate st) $ take (length $ W.integrate st)
$ iterate f st $ iterate f st
bs = concat $ cbs:maybeToList lbs ++ M.elems nbs bs = concat $ cbs:maybeToList lbs ++ M.elems nbs
rjl = return . Just . Left rjl = return . Just . Left
reverseStack (W.Stack t ls rs) = W.Stack t rs ls
handleMessOrMaybeModifyIt _ _ = return Nothing handleMessOrMaybeModifyIt _ _ = return Nothing
-- | Variant of 'focusMaster' that works on a -- | Variant of 'focusMaster' that works on a
@@ -144,6 +160,10 @@ focusMaster' :: W.Stack a -> W.Stack a
focusMaster' c@(W.Stack _ [] _) = c focusMaster' c@(W.Stack _ [] _) = c
focusMaster' (W.Stack t ls rs) = W.Stack x [] (xs ++ t : rs) where (x:xs) = reverse ls focusMaster' (W.Stack t ls rs) = W.Stack x [] (xs ++ t : rs) where (x:xs) = reverse ls
swapUp' :: W.Stack a -> W.Stack a
swapUp' (W.Stack t (l:ls) rs) = W.Stack t ls (l:rs)
swapUp' (W.Stack t [] rs) = W.Stack t (reverse rs) []
{- $simplest {- $simplest
An alternative to 'Full' is "XMonad.Layout.Simplest". Less windows are An alternative to 'Full' is "XMonad.Layout.Simplest". Less windows are