module XMonad.Util.Replace
(
replace
) where
import XMonad
import XMonad.Prelude
replace :: IO ()
replace :: IO ()
replace = do
dpy <- String -> IO Display
openDisplay String
""
let dflt = Display -> ScreenNumber
defaultScreen Display
dpy
rootw <- rootWindow dpy dflt
wmSnAtom <- internAtom dpy ("WM_S" ++ show dflt) False
currentWmSnOwner <- xGetSelectionOwner dpy wmSnAtom
when (currentWmSnOwner /= 0) $ do
putStrLn $ "Screen " ++ show dflt ++ " on display \""
++ displayString dpy ++ "\" already has a window manager."
selectInput dpy currentWmSnOwner structureNotifyMask
netWmSnOwner <- allocaSetWindowAttributes $ \Ptr SetWindowAttributes
attributes -> do
Ptr SetWindowAttributes -> Bool -> IO ()
set_override_redirect Ptr SetWindowAttributes
attributes Bool
True
Ptr SetWindowAttributes -> ScreenNumber -> IO ()
set_event_mask Ptr SetWindowAttributes
attributes ScreenNumber
propertyChangeMask
let screen :: Screen
screen = Display -> Screen
defaultScreenOfDisplay Display
dpy
let visual :: Visual
visual = Screen -> Visual
defaultVisualOfScreen Screen
screen
let attrmask :: ScreenNumber
attrmask = ScreenNumber
cWOverrideRedirect ScreenNumber -> ScreenNumber -> ScreenNumber
forall a. Bits a => a -> a -> a
.|. ScreenNumber
cWEventMask
Display
-> ScreenNumber
-> Position
-> Position
-> ScreenNumber
-> ScreenNumber
-> CInt
-> CInt
-> CInt
-> Visual
-> ScreenNumber
-> Ptr SetWindowAttributes
-> IO ScreenNumber
createWindow Display
dpy ScreenNumber
rootw (-Position
100) (-Position
100) ScreenNumber
1 ScreenNumber
1 CInt
0 CInt
copyFromParent CInt
copyFromParent Visual
visual ScreenNumber
attrmask Ptr SetWindowAttributes
attributes
putStrLn "Replacing existing window manager..."
xSetSelectionOwner dpy wmSnAtom netWmSnOwner currentTime
putStr "Waiting for other window manager to terminate... "
fix $ \IO ()
again -> do
evt <- (XEventPtr -> IO ScreenNumber) -> IO ScreenNumber
forall a. (XEventPtr -> IO a) -> IO a
allocaXEvent ((XEventPtr -> IO ScreenNumber) -> IO ScreenNumber)
-> (XEventPtr -> IO ScreenNumber) -> IO ScreenNumber
forall a b. (a -> b) -> a -> b
$ \XEventPtr
event -> do
Display -> ScreenNumber -> ScreenNumber -> XEventPtr -> IO ()
windowEvent Display
dpy ScreenNumber
currentWmSnOwner ScreenNumber
structureNotifyMask XEventPtr
event
XEventPtr -> IO ScreenNumber
get_EventType XEventPtr
event
when (evt /= destroyNotify) again
putStrLn "done"
closeDisplay dpy