mirror of
https://github.com/xmonad/xmonad-contrib.git
synced 2025-05-19 03:20:21 -07:00
Rescreen: collects new screen information
This commit is contained in:
parent
2b171ea19c
commit
2d5e2818a1
41
Rescreen.hs
Normal file
41
Rescreen.hs
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
-- Grabs new screen information. Useful for randr setups.
|
||||||
|
-- To use rescreen, add a keybinding in Config.hs. For example:
|
||||||
|
-- , ((modMask .|. shiftMask, xK_F12 ), rescreen)
|
||||||
|
|
||||||
|
-- TODO Get this code into xmonad when it is ready for randr support.
|
||||||
|
-- Make it happen automatically on randr events. It's currently 20 loc, but I
|
||||||
|
-- believe it can be shrunk a bit.
|
||||||
|
|
||||||
|
module XMonadContrib.Rescreen (rescreen) where
|
||||||
|
|
||||||
|
import qualified StackSet as W
|
||||||
|
import XMonad
|
||||||
|
import Operations
|
||||||
|
|
||||||
|
import Graphics.X11.Xlib
|
||||||
|
import Graphics.X11.Xinerama
|
||||||
|
|
||||||
|
import Control.Monad.State
|
||||||
|
import Control.Monad.Reader
|
||||||
|
import Data.List (partition)
|
||||||
|
|
||||||
|
rescreen :: X ()
|
||||||
|
rescreen = do
|
||||||
|
dpy <- asks display
|
||||||
|
xinesc <- io $ getScreenInfo dpy
|
||||||
|
-- TODO: This stuff is necessary because Xlib apparently caches screen
|
||||||
|
-- width/height. Find a better solution later. I hate Xlib.
|
||||||
|
let sx = maximum $ map (\r -> rect_x r + fromIntegral (rect_width r)) xinesc
|
||||||
|
sy = maximum $ map (\r -> rect_y r + fromIntegral (rect_height r)) xinesc
|
||||||
|
modify (\s -> s { xineScreens = xinesc, dimensions = (sx, sy) })
|
||||||
|
ws <- gets windowset
|
||||||
|
let s = W.current ws : W.visible ws
|
||||||
|
t = zipWith const [0 :: ScreenId ..] xinesc
|
||||||
|
(stay, hide) = partition (\x -> fromIntegral (W.screen x) < length t) s
|
||||||
|
newsids = filter (\x -> fromIntegral x >= length s) t
|
||||||
|
(newvis, newinvis) = splitAt (length newsids) (map W.workspace hide ++ W.hidden ws)
|
||||||
|
(newcurr : xs) = stay ++ zipWith W.Screen newvis newsids
|
||||||
|
windows $ const $ ws { W.current = newcurr
|
||||||
|
, W.visible = xs
|
||||||
|
, W.hidden = newinvis
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user