REF make this function not hurt to look at

This commit is contained in:
Nathan Dwarshuis 2020-03-17 23:24:44 -04:00
parent 5b572277ae
commit 3b9b98a1f6
1 changed files with 26 additions and 26 deletions

View File

@ -7,11 +7,11 @@ import ACPI
import SendXMsg
import qualified Theme as T
import Control.Monad (foldM, mapM_, forM_, void, when)
import Control.Monad (mapM_, forM, forM_, void, when)
import Data.List (find, sortBy, sortOn)
import qualified Data.Map.Lazy as M
import Data.Maybe (isJust)
import Data.Maybe (isJust, catMaybes)
import Data.Monoid (All(..))
import Graphics.X11.Xlib.Atom
@ -345,35 +345,35 @@ myDmenuCmd = "rofi"
-- TODO simplify the convoluted garbage heap...to be fair, this is
-- going to be ugly simply because rofi uses xrandr and xmonad uses
-- xinerama to get screen information...and apparently these index
-- differently. However, I'm sure there's a way to condense this code
-- to something more sane :(
-- differently.
getMonitorName :: X (Maybe String)
getMonitorName = do
dpy <- asks display
root <- asks theRoot
res <- io $ xrrGetScreenResourcesCurrent dpy root
outputs <- io $ case res of
Just res' -> foldM (procOutput dpy res') [] $ xrr_sr_outputs res'
Nothing -> return []
(Rectangle sx sy _ _) <- getFocusedScreen
return $ case find (\(_, x, y) -> x == fromIntegral sx && y == fromIntegral sy) outputs of
Just (name, _, _) -> Just name
Nothing -> Nothing
where
procOutput dpy res acc output = do
oi <- xrrGetOutputInfo dpy res output
-- these are the focused screen coordinates according to xinerama
(sx, sy) <- getCoords
io $ do
res <- xrrGetScreenResourcesCurrent dpy root
outputs <- forM res $ \res' ->
forM (xrr_sr_outputs res') $ \output -> do
oi <- xrrGetOutputInfo dpy res' output
case oi of
Just oi' -> procResources dpy res acc oi'
Nothing -> return acc
procResources dpy res acc oi = do
let name = xrr_oi_name oi
-- 0 = connected; 1 = disconnected
if xrr_oi_connection oi == 0 then do
ci <- xrrGetCrtcInfo dpy res $ xrr_oi_crtc oi
return $ case ci of
Just ci' -> (name, xrr_ci_x ci', xrr_ci_y ci') : acc
Nothing -> acc
else return acc
-- connection: 0 == connected, 1 == disconnected
Just XRROutputInfo { xrr_oi_connection = 0
, xrr_oi_name = name
, xrr_oi_crtc = crtc
} -> do
ci <- xrrGetCrtcInfo dpy res' crtc
return $ (\ci' -> Just (name, xrr_ci_x ci', xrr_ci_y ci'))
=<< ci
_ -> return Nothing
return $ (\(name, _, _) -> Just name)
=<< find (\(_, x, y) -> x == sx && y == sy) . catMaybes
=<< outputs
where
getCoords = do
(Rectangle x y _ _) <- getFocusedScreen
return (fromIntegral x, fromIntegral y)
spawnDmenuCmd :: [String] -> X ()
spawnDmenuCmd args = do