39 lines
1.3 KiB
Haskell
39 lines
1.3 KiB
Haskell
module Screen (screenWidth, nextScreen, prevScreen) where
|
|
|
|
import Graphics.X11.Xinerama (xineramaQueryScreens, XineramaScreenInfo(..))
|
|
import Graphics.X11.Xlib (openDisplay, closeDisplay)
|
|
import qualified XMonad.Actions.CycleWS as CycleWS
|
|
import XMonad (X())
|
|
import Control.Monad.Trans (liftIO)
|
|
|
|
screenWidth :: Int -> IO Int
|
|
screenWidth idx = do
|
|
dsp <- openDisplay "" -- I don't know what the string does :/
|
|
info <- xineramaQueryScreens dsp
|
|
case info of
|
|
Nothing -> return 0
|
|
Just [] -> return 0
|
|
Just screens -> if idx >= 0 && idx < length screens
|
|
then (return . fromIntegral . xsi_width) (screens !! idx)
|
|
else return 0
|
|
|
|
swapScreenDir :: IO Bool
|
|
swapScreenDir = do
|
|
dsp <- openDisplay ""
|
|
info <- xineramaQueryScreens dsp
|
|
closeDisplay dsp
|
|
case info of
|
|
Nothing -> return False
|
|
Just [] -> return False
|
|
Just (s:_) -> return (xsi_width s > 0)
|
|
|
|
nextScreen :: X ()
|
|
nextScreen = do
|
|
swap <- liftIO $ swapScreenDir -- Not too fond of querying the x each time we swap screens, but oh well
|
|
if swap then CycleWS.prevScreen else CycleWS.nextScreen
|
|
|
|
prevScreen :: X ()
|
|
prevScreen = do
|
|
swap <- liftIO $ swapScreenDir -- Not too fond of querying the x each time we swap screens, but oh well
|
|
if swap then CycleWS.nextScreen else CycleWS.prevScreen
|