module XMonad.Util.Hacks (
windowedFullscreenFixEventHook,
javaHack,
trayerAboveXmobarEventHook,
trayAbovePanelEventHook,
) where
import XMonad
import XMonad.Prelude (All (All), filterM, when)
import System.Posix.Env (putEnv)
windowedFullscreenFixEventHook :: Event -> X All
windowedFullscreenFixEventHook :: Event -> X All
windowedFullscreenFixEventHook (ClientMessageEvent EventType
_ CULong
_ Bool
_ Display
dpy EventType
win EventType
typ (CInt
_:[CInt]
dats)) = do
EventType
wmstate <- String -> X EventType
getAtom String
"_NET_WM_STATE"
EventType
fullscreen <- String -> X EventType
getAtom String
"_NET_WM_STATE_FULLSCREEN"
Bool -> X () -> X ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (EventType
typ EventType -> EventType -> Bool
forall a. Eq a => a -> a -> Bool
== EventType
wmstate Bool -> Bool -> Bool
&& EventType -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral EventType
fullscreen CInt -> [CInt] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [CInt]
dats) (X () -> X ()) -> X () -> X ()
forall a b. (a -> b) -> a -> b
$
Display -> EventType -> (WindowAttributes -> X ()) -> X ()
withWindowAttributes Display
dpy EventType
win ((WindowAttributes -> X ()) -> X ())
-> (WindowAttributes -> X ()) -> X ()
forall a b. (a -> b) -> a -> b
$ \WindowAttributes
attrs ->
IO () -> X ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> X ()) -> IO () -> X ()
forall a b. (a -> b) -> a -> b
$ do
Display -> EventType -> EventType -> EventType -> IO ()
resizeWindow Display
dpy EventType
win (CInt -> EventType
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> EventType) -> CInt -> EventType
forall a b. (a -> b) -> a -> b
$ WindowAttributes -> CInt
wa_width WindowAttributes
attrs CInt -> CInt -> CInt
forall a. Num a => a -> a -> a
- CInt
1) (CInt -> EventType
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> EventType) -> CInt -> EventType
forall a b. (a -> b) -> a -> b
$ WindowAttributes -> CInt
wa_height WindowAttributes
attrs)
Display -> EventType -> EventType -> EventType -> IO ()
resizeWindow Display
dpy EventType
win (CInt -> EventType
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> EventType) -> CInt -> EventType
forall a b. (a -> b) -> a -> b
$ WindowAttributes -> CInt
wa_width WindowAttributes
attrs) (CInt -> EventType
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> EventType) -> CInt -> EventType
forall a b. (a -> b) -> a -> b
$ WindowAttributes -> CInt
wa_height WindowAttributes
attrs)
All -> X All
forall (m :: * -> *) a. Monad m => a -> m a
return (All -> X All) -> All -> X All
forall a b. (a -> b) -> a -> b
$ Bool -> All
All Bool
True
windowedFullscreenFixEventHook Event
_ = All -> X All
forall (m :: * -> *) a. Monad m => a -> m a
return (All -> X All) -> All -> X All
forall a b. (a -> b) -> a -> b
$ Bool -> All
All Bool
True
javaHack :: XConfig l -> XConfig l
javaHack :: XConfig l -> XConfig l
javaHack XConfig l
conf = XConfig l
conf
{ startupHook :: X ()
startupHook = XConfig l -> X ()
forall (l :: * -> *). XConfig l -> X ()
startupHook XConfig l
conf
X () -> X () -> X ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> IO () -> X ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
io (String -> IO ()
putEnv String
"_JAVA_AWT_WM_NONREPARENTING=1")
}
trayerAboveXmobarEventHook :: Event -> X All
trayerAboveXmobarEventHook :: Event -> X All
trayerAboveXmobarEventHook = Query Bool -> Query Bool -> Event -> X All
trayAbovePanelEventHook (Query String
className Query String -> String -> Query Bool
forall a. Eq a => Query a -> a -> Query Bool
=? String
"trayer") (Query String
appName Query String -> String -> Query Bool
forall a. Eq a => Query a -> a -> Query Bool
=? String
"xmobar")
trayAbovePanelEventHook
:: Query Bool
-> Query Bool
-> (Event -> X All)
trayAbovePanelEventHook :: Query Bool -> Query Bool -> Event -> X All
trayAbovePanelEventHook Query Bool
trayQ Query Bool
panelQ ConfigureEvent{ev_window :: Event -> EventType
ev_window = EventType
w, ev_above :: Event -> EventType
ev_above = EventType
a} | EventType
a EventType -> EventType -> Bool
forall a. Eq a => a -> a -> Bool
== EventType
none = do
X Bool -> X () -> X ()
whenX (Query Bool -> EventType -> X Bool
forall a. Query a -> EventType -> X a
runQuery Query Bool
trayQ EventType
w) (X () -> X ()) -> X () -> X ()
forall a b. (a -> b) -> a -> b
$ (Display -> X ()) -> X ()
forall a. (Display -> X a) -> X a
withDisplay ((Display -> X ()) -> X ()) -> (Display -> X ()) -> X ()
forall a b. (a -> b) -> a -> b
$ \Display
dpy -> do
EventType
rootw <- (XConf -> EventType) -> X EventType
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks XConf -> EventType
theRoot
(EventType
_, EventType
_, [EventType]
ws) <- IO (EventType, EventType, [EventType])
-> X (EventType, EventType, [EventType])
forall (m :: * -> *) a. MonadIO m => IO a -> m a
io (IO (EventType, EventType, [EventType])
-> X (EventType, EventType, [EventType]))
-> IO (EventType, EventType, [EventType])
-> X (EventType, EventType, [EventType])
forall a b. (a -> b) -> a -> b
$ Display -> EventType -> IO (EventType, EventType, [EventType])
queryTree Display
dpy EventType
rootw
let aboveTrayWs :: [EventType]
aboveTrayWs = (EventType -> Bool) -> [EventType] -> [EventType]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (EventType
w EventType -> EventType -> Bool
forall a. Eq a => a -> a -> Bool
/=) [EventType]
ws
[EventType]
panelWs <- (EventType -> X Bool) -> [EventType] -> X [EventType]
forall (m :: * -> *) a.
Applicative m =>
(a -> m Bool) -> [a] -> m [a]
filterM (Query Bool -> EventType -> X Bool
forall a. Query a -> EventType -> X a
runQuery Query Bool
panelQ) [EventType]
aboveTrayWs
(EventType -> X ()) -> [EventType] -> X ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (IO () -> X ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
io (IO () -> X ()) -> (EventType -> IO ()) -> EventType -> X ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Display -> EventType -> IO ()
lowerWindow Display
dpy) [EventType]
panelWs
X All
forall a. Monoid a => a
mempty
trayAbovePanelEventHook Query Bool
_ Query Bool
_ Event
_ = X All
forall a. Monoid a => a
mempty