{-# LANGUAGE ViewPatterns, MultiWayIf #-}
module XMonad.Actions.CycleWindows (
cycleRecentWindows,
cycleStacks',
rotOpposite', rotOpposite,
rotFocused', rotFocusedUp, rotFocusedDown, shiftToFocus',
rotUnfocused', rotUnfocusedUp, rotUnfocusedDown,
rotUp, rotDown
) where
import XMonad
import XMonad.Prelude
import qualified XMonad.StackSet as W
import qualified Data.List.NonEmpty as NE
import XMonad.Actions.RotSlaves
import XMonad.Actions.Repeatable (repeatableSt)
import Control.Arrow (second)
import Control.Monad.Trans (lift)
cycleRecentWindows :: [KeySym]
-> KeySym
-> KeySym
-> X ()
cycleRecentWindows :: [KeySym] -> KeySym -> KeySym -> X ()
cycleRecentWindows = (Stack KeySym -> [Stack KeySym])
-> [KeySym] -> KeySym -> KeySym -> X ()
cycleStacks' forall {a}. (Eq a, Show a, Read a) => Stack a -> [Stack a]
stacks where
stacks :: Stack a -> [Stack a]
stacks Stack a
s = forall a b. (a -> b) -> [a] -> [b]
map (forall a. (Eq a, Show a, Read a) => a -> Stack a -> Stack a
`shiftToFocus'` Stack a
s) (forall {a}. Stack a -> [a]
wins Stack a
s)
wins :: Stack a -> [a]
wins (W.Stack a
t [a]
l [a]
r) = a
t forall a. a -> [a] -> [a]
: [a]
r forall a. [a] -> [a] -> [a]
++ forall a. [a] -> [a]
reverse [a]
l
cycleStacks' :: (W.Stack Window -> [W.Stack Window])
-> [KeySym]
-> KeySym
-> KeySym
-> X ()
cycleStacks' :: (Stack KeySym -> [Stack KeySym])
-> [KeySym] -> KeySym -> KeySym -> X ()
cycleStacks' Stack KeySym -> [Stack KeySym]
filteredPerms [KeySym]
mods KeySym
keyNext KeySym
keyPrev = do
[Stack KeySym]
stacks <- forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets forall a b. (a -> b) -> a -> b
$ forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] Stack KeySym -> [Stack KeySym]
filteredPerms
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a. Workspace i l a -> Maybe (Stack a)
W.stack forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a sid sd. Screen i l a sid sd -> Workspace i l a
W.workspace forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a sid sd. StackSet i l a sid sd -> Screen i l a sid sd
W.current forall b c a. (b -> c) -> (a -> b) -> a -> c
. XState -> WindowSet
windowset
let
preview :: StateT Int X ()
preview = do
Int
i <- forall s (m :: * -> *). MonadState s m => m s
get
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. (WindowSet -> WindowSet) -> X ()
windows forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a i l s sd.
(Stack a -> Stack a) -> StackSet i l a s sd -> StackSet i l a s sd
W.modify' forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. a -> b -> a
const forall a b. (a -> b) -> a -> b
$ [Stack KeySym]
stacks forall a. [a] -> Int -> a
!! (Int
i forall a. Integral a => a -> a -> a
`mod` Int
n)
where n :: Int
n = forall (t :: * -> *) a. Foldable t => t a -> Int
length [Stack KeySym]
stacks
forall (f :: * -> *) a. Functor f => f a -> f ()
void forall a b. (a -> b) -> a -> b
$ forall a s.
Monoid a =>
s
-> [KeySym]
-> KeySym
-> (EventType -> KeySym -> StateT s X a)
-> X (a, s)
repeatableSt Int
0 [KeySym]
mods KeySym
keyNext forall a b. (a -> b) -> a -> b
$ \EventType
t KeySym
s -> if
| EventType
t forall a. Eq a => a -> a -> Bool
== EventType
keyPress Bool -> Bool -> Bool
&& KeySym
s forall a. Eq a => a -> a -> Bool
== KeySym
keyNext -> forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify forall a. Enum a => a -> a
succ
| EventType
t forall a. Eq a => a -> a -> Bool
== EventType
keyPress Bool -> Bool -> Bool
&& KeySym
s forall a. Eq a => a -> a -> Bool
== KeySym
keyPrev -> forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify forall a. Enum a => a -> a
pred
| EventType
t forall a. Eq a => a -> a -> Bool
== EventType
keyPress Bool -> Bool -> Bool
&& KeySym
s forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [KeySym
xK_0..KeySym
xK_9] -> forall s (m :: * -> *). MonadState s m => s -> m ()
put (KeySym -> Int
numKeyToN KeySym
s)
| Bool
otherwise -> StateT Int X ()
preview
where numKeyToN :: KeySym -> Int
numKeyToN = forall a. Num a => a -> a -> a
subtract Int
48 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Read a => WorkspaceId -> a
read forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => a -> WorkspaceId
show
shiftToFocus' :: (Eq a, Show a, Read a) => a -> W.Stack a -> W.Stack a
shiftToFocus' :: forall a. (Eq a, Show a, Read a) => a -> Stack a -> Stack a
shiftToFocus' a
w s :: Stack a
s@(W.Stack a
_ [a]
ls [a]
_) = forall a. a -> [a] -> [a] -> Stack a
W.Stack a
w (forall a. [a] -> [a]
reverse [a]
revls') [a]
rs'
where ([a]
revls', [a]
rs') = forall a. Int -> [a] -> ([a], [a])
splitAt (forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
ls) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
filter (forall a. Eq a => a -> a -> Bool
/= a
w) forall a b. (a -> b) -> a -> b
$ forall {a}. Stack a -> [a]
W.integrate Stack a
s
rotOpposite :: X()
rotOpposite :: X ()
rotOpposite = (WindowSet -> WindowSet) -> X ()
windows forall a b. (a -> b) -> a -> b
$ forall a i l s sd.
(Stack a -> Stack a) -> StackSet i l a s sd -> StackSet i l a s sd
W.modify' forall a. Stack a -> Stack a
rotOpposite'
rotOpposite' :: W.Stack a -> W.Stack a
rotOpposite' :: forall a. Stack a -> Stack a
rotOpposite' (W.Stack a
t [a]
l [a]
r) = forall a. a -> [a] -> [a] -> Stack a
W.Stack a
t' [a]
l' [a]
r'
where rrvl :: [a]
rrvl = [a]
r forall a. [a] -> [a] -> [a]
++ forall a. [a] -> [a]
reverse [a]
l
part :: Int
part = (forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
rrvl forall a. Num a => a -> a -> a
+ Int
1) forall a. Integral a => a -> a -> a
`div` Int
2
([a]
l', forall a. HasCallStack => [a] -> NonEmpty a
notEmpty -> a
t' :| [a]
r') = forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second forall a. [a] -> [a]
reverse forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Int -> [a] -> ([a], [a])
splitAt (forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
l) forall a b. (a -> b) -> a -> b
$
forall a. [a] -> [a]
reverse (forall a. Int -> [a] -> [a]
take Int
part [a]
rrvl forall a. [a] -> [a] -> [a]
++ a
t forall a. a -> [a] -> [a]
: forall a. Int -> [a] -> [a]
drop Int
part [a]
rrvl)
rotFocusedUp :: X ()
rotFocusedUp :: X ()
rotFocusedUp = (WindowSet -> WindowSet) -> X ()
windows forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a i l s sd.
(Stack a -> Stack a) -> StackSet i l a s sd -> StackSet i l a s sd
W.modify' forall a b. (a -> b) -> a -> b
$ forall a. ([a] -> [a]) -> Stack a -> Stack a
rotFocused' forall a. [a] -> [a]
rotUp
rotFocusedDown :: X ()
rotFocusedDown :: X ()
rotFocusedDown = (WindowSet -> WindowSet) -> X ()
windows forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a i l s sd.
(Stack a -> Stack a) -> StackSet i l a s sd -> StackSet i l a s sd
W.modify' forall a b. (a -> b) -> a -> b
$ forall a. ([a] -> [a]) -> Stack a -> Stack a
rotFocused' forall a. [a] -> [a]
rotDown
rotFocused' :: ([a] -> [a]) -> W.Stack a -> W.Stack a
rotFocused' :: forall a. ([a] -> [a]) -> Stack a -> Stack a
rotFocused' [a] -> [a]
_ s :: Stack a
s@(W.Stack a
_ [] []) = Stack a
s
rotFocused' [a] -> [a]
f (W.Stack a
t [] (a
r:[a]
rs)) = forall a. a -> [a] -> [a] -> Stack a
W.Stack a
t' [] (a
rforall a. a -> [a] -> [a]
:[a]
rs')
where (forall a. HasCallStack => [a] -> NonEmpty a
notEmpty -> a
t' :| [a]
rs') = [a] -> [a]
f (a
tforall a. a -> [a] -> [a]
:[a]
rs)
rotFocused' [a] -> [a]
f s :: Stack a
s@W.Stack{} = forall a. ([a] -> [a]) -> Stack a -> Stack a
rotSlaves' [a] -> [a]
f Stack a
s
rotUnfocusedUp :: X ()
rotUnfocusedUp :: X ()
rotUnfocusedUp = (WindowSet -> WindowSet) -> X ()
windows forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a i l s sd.
(Stack a -> Stack a) -> StackSet i l a s sd -> StackSet i l a s sd
W.modify' forall a b. (a -> b) -> a -> b
$ forall a. ([a] -> [a]) -> Stack a -> Stack a
rotUnfocused' forall a. [a] -> [a]
rotUp
rotUnfocusedDown :: X ()
rotUnfocusedDown :: X ()
rotUnfocusedDown = (WindowSet -> WindowSet) -> X ()
windows forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a i l s sd.
(Stack a -> Stack a) -> StackSet i l a s sd -> StackSet i l a s sd
W.modify' forall a b. (a -> b) -> a -> b
$ forall a. ([a] -> [a]) -> Stack a -> Stack a
rotUnfocused' forall a. [a] -> [a]
rotDown
rotUnfocused' :: ([a] -> [a]) -> W.Stack a -> W.Stack a
rotUnfocused' :: forall a. ([a] -> [a]) -> Stack a -> Stack a
rotUnfocused' [a] -> [a]
_ s :: Stack a
s@(W.Stack a
_ [] []) = Stack a
s
rotUnfocused' [a] -> [a]
f s :: Stack a
s@(W.Stack a
_ [] [a]
_ ) = forall a. ([a] -> [a]) -> Stack a -> Stack a
rotSlaves' [a] -> [a]
f Stack a
s
rotUnfocused' [a] -> [a]
f (W.Stack a
t [a]
ls [a]
rs) = forall a. a -> [a] -> [a] -> Stack a
W.Stack a
t (forall a. [a] -> [a]
reverse [a]
revls') [a]
rs'
where (a
master :| [a]
revls) = forall a. NonEmpty a -> NonEmpty a
NE.reverse (let a
l:[a]
ll = [a]
ls in a
l forall a. a -> [a] -> NonEmpty a
:| [a]
ll)
([a]
revls',[a]
rs') = forall a. Int -> [a] -> ([a], [a])
splitAt (forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
ls) ([a] -> [a]
f forall a b. (a -> b) -> a -> b
$ a
masterforall a. a -> [a] -> [a]
:[a]
revls forall a. [a] -> [a] -> [a]
++ [a]
rs)