{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE TypeApplications #-}
module XMonad.Hooks.StatusBar.WorkspaceScreen
(
combineWithScreen
, combineWithScreenName
, combineWithScreenNumber
, WorkspaceScreenCombiner
) where
import Graphics.X11.Xrandr
import XMonad
import XMonad.Hooks.StatusBar.PP
import XMonad.Prelude
import qualified XMonad.StackSet as W
type WorkspaceScreenCombiner = WorkspaceId -> WindowScreen -> String
screenNames :: X [Maybe String]
screenNames :: X [Maybe WorkspaceId]
screenNames = do
XConf { Display
display :: XConf -> Display
display :: Display
display, Window
theRoot :: XConf -> Window
theRoot :: Window
theRoot } <- forall r (m :: * -> *). MonadReader r m => m r
ask
let getName :: XRRMonitorInfo -> IO (Maybe WorkspaceId)
getName XRRMonitorInfo
mi = Display -> Window -> IO (Maybe WorkspaceId)
getAtomName Display
display (XRRMonitorInfo -> Window
xrr_moninf_name XRRMonitorInfo
mi)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
io
forall a b. (a -> b) -> a -> b
$ forall b a. b -> (a -> b) -> Maybe a -> b
maybe (forall (f :: * -> *) a. Applicative f => a -> f a
pure []) (forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse XRRMonitorInfo -> IO (Maybe WorkspaceId)
getName)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Display -> Window -> Bool -> IO (Maybe [XRRMonitorInfo])
xrrGetMonitors Display
display Window
theRoot Bool
True
combineWithScreenName :: (WorkspaceId -> String -> String) -> PP -> X PP
combineWithScreenName :: (WorkspaceId -> WorkspaceId -> WorkspaceId) -> PP -> X PP
combineWithScreenName WorkspaceId -> WorkspaceId -> WorkspaceId
c = X WorkspaceScreenCombiner -> PP -> X PP
combineWithScreen forall a b. (a -> b) -> a -> b
$ do
[Maybe WorkspaceId]
screens <- X [Maybe WorkspaceId]
screenNames
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ \WorkspaceId
w WindowScreen
sc -> forall b a. b -> (a -> b) -> Maybe a -> b
maybe WorkspaceId
w (WorkspaceId -> WorkspaceId -> WorkspaceId
c WorkspaceId
w) forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. Monad m => m (m a) -> m a
join ([Maybe WorkspaceId]
screens forall a. [a] -> Int -> Maybe a
!? forall a b. (Integral a, Num b) => a -> b
fi (forall i l a sid sd. Screen i l a sid sd -> sid
W.screen WindowScreen
sc))
combineWithScreenNumber :: (WorkspaceId -> String -> String) -> PP -> X PP
combineWithScreenNumber :: (WorkspaceId -> WorkspaceId -> WorkspaceId) -> PP -> X PP
combineWithScreenNumber WorkspaceId -> WorkspaceId -> WorkspaceId
c =
X WorkspaceScreenCombiner -> PP -> X PP
combineWithScreen forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ \WorkspaceId
w WindowScreen
sc -> WorkspaceId -> WorkspaceId -> WorkspaceId
c WorkspaceId
w (forall a. Show a => a -> WorkspaceId
show @Int forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fi forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a sid sd. Screen i l a sid sd -> sid
W.screen forall a b. (a -> b) -> a -> b
$ WindowScreen
sc)
combineWithScreen :: X WorkspaceScreenCombiner -> PP -> X PP
combineWithScreen :: X WorkspaceScreenCombiner -> PP -> X PP
combineWithScreen X WorkspaceScreenCombiner
xCombiner PP
pp = do
WorkspaceScreenCombiner
combiner <- X WorkspaceScreenCombiner
xCombiner
[WindowScreen]
ss <- forall a. (WindowSet -> X a) -> X a
withWindowSet (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 -> [Screen i l a s sd]
W.screens)
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ PP
pp
{ ppRename :: WorkspaceId -> WindowSpace -> WorkspaceId
ppRename = PP -> WorkspaceId -> WindowSpace -> WorkspaceId
ppRename PP
pp forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< \WorkspaceId
s WindowSpace
w ->
forall b a. b -> (a -> b) -> Maybe a -> b
maybe WorkspaceId
s (WorkspaceScreenCombiner
combiner WorkspaceId
s) (forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find ((forall a. Eq a => a -> a -> Bool
== forall i l a. Workspace i l a -> i
W.tag WindowSpace
w) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a. Workspace i l a -> i
W.tag 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) [WindowScreen]
ss)
}