{-# LANGUAGE DeriveDataTypeable #-}
module XMonad.Util.Replace
(
replace
) where
import XMonad
import Data.Function
import Control.Monad
replace :: IO ()
replace :: IO ()
replace = do
Display
dpy <- String -> IO Display
openDisplay ""
let dflt :: ScreenNumber
dflt = Display -> ScreenNumber
defaultScreen Display
dpy
ScreenNumber
rootw <- Display -> ScreenNumber -> IO ScreenNumber
rootWindow Display
dpy ScreenNumber
dflt
ScreenNumber
wmSnAtom <- Display -> String -> Bool -> IO ScreenNumber
internAtom Display
dpy ("WM_S" String -> String -> String
forall a. [a] -> [a] -> [a]
++ (ScreenNumber -> String
forall a. Show a => a -> String
show ScreenNumber
dflt)) Bool
False
ScreenNumber
currentWmSnOwner <- Display -> ScreenNumber -> IO ScreenNumber
xGetSelectionOwner Display
dpy ScreenNumber
wmSnAtom
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (ScreenNumber
currentWmSnOwner ScreenNumber -> ScreenNumber -> Bool
forall a. Eq a => a -> a -> Bool
/= 0) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ "Screen " String -> String -> String
forall a. [a] -> [a] -> [a]
++ (ScreenNumber -> String
forall a. Show a => a -> String
show ScreenNumber
dflt) String -> String -> String
forall a. [a] -> [a] -> [a]
++ " on display \""
String -> String -> String
forall a. [a] -> [a] -> [a]
++ (Display -> String
displayString Display
dpy) String -> String -> String
forall a. [a] -> [a] -> [a]
++ "\" already has a window manager."
Display -> ScreenNumber -> ScreenNumber -> IO ()
selectInput Display
dpy ScreenNumber
currentWmSnOwner ScreenNumber
structureNotifyMask
ScreenNumber
netWmSnOwner <- (Ptr SetWindowAttributes -> IO ScreenNumber) -> IO ScreenNumber
forall a. (Ptr SetWindowAttributes -> IO a) -> IO a
allocaSetWindowAttributes ((Ptr SetWindowAttributes -> IO ScreenNumber) -> IO ScreenNumber)
-> (Ptr SetWindowAttributes -> IO ScreenNumber) -> IO ScreenNumber
forall a b. (a -> b) -> a -> b
$ \attributes :: 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 (-100) (-100) 1 1 0 CInt
copyFromParent CInt
copyFromParent Visual
visual ScreenNumber
attrmask Ptr SetWindowAttributes
attributes
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ "Replacing existing window manager..."
Display -> ScreenNumber -> ScreenNumber -> ScreenNumber -> IO ()
xSetSelectionOwner Display
dpy ScreenNumber
wmSnAtom ScreenNumber
netWmSnOwner ScreenNumber
currentTime
String -> IO ()
putStr (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ "Waiting for other window manager to terminate... "
(IO () -> IO ()) -> IO ()
forall a. (a -> a) -> a
fix ((IO () -> IO ()) -> IO ()) -> (IO () -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \again :: IO ()
again -> do
ScreenNumber
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
$ \event :: XEventPtr
event -> do
Display -> ScreenNumber -> ScreenNumber -> XEventPtr -> IO ()
windowEvent Display
dpy ScreenNumber
currentWmSnOwner ScreenNumber
structureNotifyMask XEventPtr
event
XEventPtr -> IO ScreenNumber
get_EventType XEventPtr
event
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (ScreenNumber
evt ScreenNumber -> ScreenNumber -> Bool
forall a. Eq a => a -> a -> Bool
/= ScreenNumber
destroyNotify) IO ()
again
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ "done"
Display -> IO ()
closeDisplay Display
dpy