{-# LANGUAGE ViewPatterns #-}
module XMonad.Actions.WindowGo (
raise,
raiseNext,
runOrRaise,
runOrRaiseNext,
raiseMaybe,
raiseNextMaybe,
raiseNextMaybeCustomFocus,
raiseBrowser,
raiseEditor,
runOrRaiseAndDo,
runOrRaiseMaster,
raiseAndDo,
raiseMaster,
ifWindows,
ifWindow,
raiseHook,
module XMonad.ManageHook
) where
import qualified Data.List as L (nub,sortBy)
import XMonad.Prelude
import XMonad (Query(), X(), ManageHook, WindowSet, withWindowSet, runQuery, liftIO, ask)
import Graphics.X11 (Window)
import XMonad.ManageHook
import XMonad.Operations (windows)
import XMonad.Prompt.Shell (getBrowser, getEditor)
import qualified XMonad.StackSet as W (peek, swapMaster, focusWindow, workspaces, StackSet, Workspace, integrate', tag, stack)
import XMonad.Util.Run (safeSpawnProg)
import qualified Data.List.NonEmpty as NE
workspacesSorted :: Ord i => W.StackSet i l a s sd -> [W.Workspace i l a]
workspacesSorted :: forall i l a s sd.
Ord i =>
StackSet i l a s sd -> [Workspace i l a]
workspacesSorted StackSet i l a s sd
s = forall a. (a -> a -> Ordering) -> [a] -> [a]
L.sortBy (\Workspace i l a
u Workspace i l a
t -> forall i l a. Workspace i l a -> i
W.tag Workspace i l a
u forall a. Ord a => a -> a -> Ordering
`compare` forall i l a. Workspace i l a -> i
W.tag Workspace i l a
t) forall a b. (a -> b) -> a -> b
$ forall i l a s sd. StackSet i l a s sd -> [Workspace i l a]
W.workspaces StackSet i l a s sd
s
allWindowsSorted :: Ord i => Eq a => W.StackSet i l a s sd -> [a]
allWindowsSorted :: forall i a l s sd. (Ord i, Eq a) => StackSet i l a s sd -> [a]
allWindowsSorted = forall a. Eq a => [a] -> [a]
L.nub forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (forall a. Maybe (Stack a) -> [a]
W.integrate' 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 s sd.
Ord i =>
StackSet i l a s sd -> [Workspace i l a]
workspacesSorted
ifWindows :: Query Bool -> ([Window] -> X ()) -> X () -> X ()
ifWindows :: Query Bool -> ([Window] -> X ()) -> X () -> X ()
ifWindows Query Bool
qry [Window] -> X ()
f X ()
el = forall a. (WindowSet -> X a) -> X a
withWindowSet forall a b. (a -> b) -> a -> b
$ \WindowSet
wins -> do
[Window]
matches <- forall (m :: * -> *) a.
Applicative m =>
(a -> m Bool) -> [a] -> m [a]
filterM (forall a. Query a -> Window -> X a
runQuery Query Bool
qry) forall a b. (a -> b) -> a -> b
$ forall i a l s sd. (Ord i, Eq a) => StackSet i l a s sd -> [a]
allWindowsSorted WindowSet
wins
case [Window]
matches of
[] -> X ()
el
[Window]
ws -> [Window] -> X ()
f [Window]
ws
ifWindow :: Query Bool -> ManageHook -> X () -> X ()
ifWindow :: Query Bool -> ManageHook -> X () -> X ()
ifWindow Query Bool
qry ManageHook
mh = Query Bool -> ([Window] -> X ()) -> X () -> X ()
ifWindows Query Bool
qry ((WindowSet -> WindowSet) -> X ()
windows forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Endo a -> a -> a
appEndo forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< forall a. Query a -> Window -> X a
runQuery ManageHook
mh forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. NonEmpty a -> a
NE.head forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasCallStack => [a] -> NonEmpty a
notEmpty)
runOrRaise :: String -> Query Bool -> X ()
runOrRaise :: WorkspaceId -> Query Bool -> X ()
runOrRaise = X () -> Query Bool -> X ()
raiseMaybe forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *). MonadIO m => WorkspaceId -> m ()
safeSpawnProg
raise :: Query Bool -> X ()
raise :: Query Bool -> X ()
raise = X () -> Query Bool -> X ()
raiseMaybe forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. Monad m => a -> m a
return ()
raiseMaybe :: X () -> Query Bool -> X ()
raiseMaybe :: X () -> Query Bool -> X ()
raiseMaybe X ()
f Query Bool
qry = Query Bool -> ManageHook -> X () -> X ()
ifWindow Query Bool
qry ManageHook
raiseHook X ()
f
raiseHook :: ManageHook
raiseHook :: ManageHook
raiseHook = forall r (m :: * -> *). MonadReader r m => m r
ask forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall s. (s -> s) -> Query (Endo s)
doF forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s a i l sd.
(Eq s, Eq a, Eq i) =>
a -> StackSet i l a s sd -> StackSet i l a s sd
W.focusWindow
runOrRaiseNext :: String -> Query Bool -> X ()
runOrRaiseNext :: WorkspaceId -> Query Bool -> X ()
runOrRaiseNext = X () -> Query Bool -> X ()
raiseNextMaybe forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *). MonadIO m => WorkspaceId -> m ()
safeSpawnProg
raiseNext :: Query Bool -> X ()
raiseNext :: Query Bool -> X ()
raiseNext = X () -> Query Bool -> X ()
raiseNextMaybe forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. Monad m => a -> m a
return ()
raiseNextMaybe :: X () -> Query Bool -> X ()
raiseNextMaybe :: X () -> Query Bool -> X ()
raiseNextMaybe = (Window -> WindowSet -> WindowSet) -> X () -> Query Bool -> X ()
raiseNextMaybeCustomFocus forall s a i l sd.
(Eq s, Eq a, Eq i) =>
a -> StackSet i l a s sd -> StackSet i l a s sd
W.focusWindow
raiseNextMaybeCustomFocus :: (Window -> WindowSet -> WindowSet) -> X() -> Query Bool -> X()
raiseNextMaybeCustomFocus :: (Window -> WindowSet -> WindowSet) -> X () -> Query Bool -> X ()
raiseNextMaybeCustomFocus Window -> WindowSet -> WindowSet
focusFn X ()
f Query Bool
qry = forall a b c. (a -> b -> c) -> b -> a -> c
flip (Query Bool -> ([Window] -> X ()) -> X () -> X ()
ifWindows Query Bool
qry) X ()
f forall a b. (a -> b) -> a -> b
$ \[Window]
ws -> do
Maybe Window
foc <- forall a. (WindowSet -> X a) -> X a
withWindowSet forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a s sd. StackSet i l a s sd -> Maybe a
W.peek
case Maybe Window
foc of
Just Window
w | Window
w forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Window]
ws ->
let (forall a. HasCallStack => [a] -> NonEmpty a
notEmpty -> Window
_ :| (forall a. HasCallStack => [a] -> NonEmpty a
notEmpty -> Window
y :| [Window]
_)) = forall a. (a -> Bool) -> [a] -> [a]
dropWhile (forall a. Eq a => a -> a -> Bool
/=Window
w) forall a b. (a -> b) -> a -> b
$ forall a. [a] -> [a]
cycle [Window]
ws
in (WindowSet -> WindowSet) -> X ()
windows forall a b. (a -> b) -> a -> b
$ Window -> WindowSet -> WindowSet
focusFn Window
y
Maybe Window
_ -> (WindowSet -> WindowSet) -> X ()
windows forall b c a. (b -> c) -> (a -> b) -> a -> c
. Window -> WindowSet -> WindowSet
focusFn forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. NonEmpty a -> a
NE.head forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasCallStack => [a] -> NonEmpty a
notEmpty forall a b. (a -> b) -> a -> b
$ [Window]
ws
raiseVar :: IO String -> X ()
raiseVar :: IO WorkspaceId -> X ()
raiseVar IO WorkspaceId
getvar = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO WorkspaceId
getvar forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \WorkspaceId
var -> WorkspaceId -> Query Bool -> X ()
runOrRaise WorkspaceId
var (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower) Query WorkspaceId
className forall a. Eq a => Query a -> a -> Query Bool
=? WorkspaceId
var)
raiseBrowser, raiseEditor :: X ()
raiseBrowser :: X ()
raiseBrowser = IO WorkspaceId -> X ()
raiseVar IO WorkspaceId
getBrowser
raiseEditor :: X ()
raiseEditor = IO WorkspaceId -> X ()
raiseVar IO WorkspaceId
getEditor
raiseAndDo :: X () -> Query Bool -> (Window -> X ()) -> X ()
raiseAndDo :: X () -> Query Bool -> (Window -> X ()) -> X ()
raiseAndDo X ()
f Query Bool
qry Window -> X ()
after = Query Bool -> ManageHook -> X () -> X ()
ifWindow Query Bool
qry (ManageHook
afterRaise forall a. Monoid a => a -> a -> a
`mappend` ManageHook
raiseHook) X ()
f
where afterRaise :: ManageHook
afterRaise = forall r (m :: * -> *). MonadReader r m => m r
ask forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall m. Monoid m => m
idHook) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. X a -> Query a
liftX forall b c a. (b -> c) -> (a -> b) -> a -> c
. Window -> X ()
after
runOrRaiseAndDo :: String -> Query Bool -> (Window -> X ()) -> X ()
runOrRaiseAndDo :: WorkspaceId -> Query Bool -> (Window -> X ()) -> X ()
runOrRaiseAndDo = X () -> Query Bool -> (Window -> X ()) -> X ()
raiseAndDo forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *). MonadIO m => WorkspaceId -> m ()
safeSpawnProg
raiseMaster :: X () -> Query Bool -> X ()
raiseMaster :: X () -> Query Bool -> X ()
raiseMaster X ()
raisef Query Bool
thatUserQuery = X () -> Query Bool -> (Window -> X ()) -> X ()
raiseAndDo X ()
raisef Query Bool
thatUserQuery (\Window
_ -> (WindowSet -> WindowSet) -> X ()
windows forall i l a s sd. StackSet i l a s sd -> StackSet i l a s sd
W.swapMaster)
runOrRaiseMaster :: String -> Query Bool -> X ()
runOrRaiseMaster :: WorkspaceId -> Query Bool -> X ()
runOrRaiseMaster WorkspaceId
run Query Bool
query = WorkspaceId -> Query Bool -> (Window -> X ()) -> X ()
runOrRaiseAndDo WorkspaceId
run Query Bool
query (\Window
_ -> (WindowSet -> WindowSet) -> X ()
windows forall i l a s sd. StackSet i l a s sd -> StackSet i l a s sd
W.swapMaster)