1
0
mirror of https://github.com/xmonad/xmonad-contrib.git synced 2025-08-17 13:24:14 -07:00

Merge pull request 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

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

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