{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
module XMonad.Config.Mate (
mateConfig,
mateRun,
mateRegister,
desktopLayoutModifiers
) where
import XMonad
import XMonad.Config.Desktop
import XMonad.Util.Run (safeSpawn)
import qualified Data.Map as M
import System.Environment (getEnvironment)
mateConfig :: XConfig
(ModifiedLayout
AvoidStruts (Choose Tall (Choose (Mirror Tall) Full)))
mateConfig = XConfig
(ModifiedLayout
AvoidStruts (Choose Tall (Choose (Mirror Tall) Full)))
desktopConfig
{ terminal :: String
terminal = "mate-terminal"
, keys :: XConfig Layout -> Map (ButtonMask, KeySym) (X ())
keys = XConfig Layout -> Map (ButtonMask, KeySym) (X ())
forall (l :: * -> *). XConfig l -> Map (ButtonMask, KeySym) (X ())
mateKeys (XConfig Layout -> Map (ButtonMask, KeySym) (X ()))
-> (XConfig Layout -> Map (ButtonMask, KeySym) (X ()))
-> XConfig Layout
-> Map (ButtonMask, KeySym) (X ())
forall m. Monoid m => m -> m -> m
<+> XConfig
(ModifiedLayout
AvoidStruts (Choose Tall (Choose (Mirror Tall) Full)))
-> XConfig Layout -> Map (ButtonMask, KeySym) (X ())
forall (l :: * -> *).
XConfig l -> XConfig Layout -> Map (ButtonMask, KeySym) (X ())
keys XConfig
(ModifiedLayout
AvoidStruts (Choose Tall (Choose (Mirror Tall) Full)))
desktopConfig
, startupHook :: X ()
startupHook = X ()
forall (m :: * -> *). MonadIO m => m ()
mateRegister X () -> X () -> X ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> XConfig
(ModifiedLayout
AvoidStruts (Choose Tall (Choose (Mirror Tall) Full)))
-> X ()
forall (l :: * -> *). XConfig l -> X ()
startupHook XConfig
(ModifiedLayout
AvoidStruts (Choose Tall (Choose (Mirror Tall) Full)))
desktopConfig }
mateKeys :: XConfig l -> Map (ButtonMask, KeySym) (X ())
mateKeys (XConfig {modMask :: forall (l :: * -> *). XConfig l -> ButtonMask
modMask = ButtonMask
modm}) = [((ButtonMask, KeySym), X ())] -> Map (ButtonMask, KeySym) (X ())
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([((ButtonMask, KeySym), X ())] -> Map (ButtonMask, KeySym) (X ()))
-> [((ButtonMask, KeySym), X ())]
-> Map (ButtonMask, KeySym) (X ())
forall a b. (a -> b) -> a -> b
$
[ ((ButtonMask
modm, KeySym
xK_p), X ()
mateRun)
, ((ButtonMask
modm ButtonMask -> ButtonMask -> ButtonMask
forall a. Bits a => a -> a -> a
.|. ButtonMask
shiftMask, KeySym
xK_q), String -> X ()
forall (m :: * -> *). MonadIO m => String -> m ()
spawn "mate-session-save --logout-dialog") ]
mateRun :: X ()
mateRun :: X ()
mateRun = (Display -> X ()) -> X ()
forall a. (Display -> X a) -> X a
withDisplay ((Display -> X ()) -> X ()) -> (Display -> X ()) -> X ()
forall a b. (a -> b) -> a -> b
$ \dpy :: Display
dpy -> do
KeySym
rw <- (XConf -> KeySym) -> X KeySym
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks XConf -> KeySym
theRoot
KeySym
mate_panel <- String -> X KeySym
getAtom "_MATE_PANEL_ACTION"
KeySym
panel_run <- String -> X KeySym
getAtom "_MATE_PANEL_ACTION_RUN_DIALOG"
IO () -> X ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
io (IO () -> X ()) -> IO () -> X ()
forall a b. (a -> b) -> a -> b
$ (XEventPtr -> IO ()) -> IO ()
forall a. (XEventPtr -> IO a) -> IO a
allocaXEvent ((XEventPtr -> IO ()) -> IO ()) -> (XEventPtr -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \e :: XEventPtr
e -> do
XEventPtr -> EventType -> IO ()
setEventType XEventPtr
e EventType
clientMessage
XEventPtr -> KeySym -> KeySym -> CInt -> KeySym -> KeySym -> IO ()
setClientMessageEvent XEventPtr
e KeySym
rw KeySym
mate_panel 32 KeySym
panel_run 0
Display -> KeySym -> Bool -> KeySym -> XEventPtr -> IO ()
sendEvent Display
dpy KeySym
rw Bool
False KeySym
structureNotifyMask XEventPtr
e
Display -> Bool -> IO ()
sync Display
dpy Bool
False
mateRegister :: MonadIO m => m ()
mateRegister :: m ()
mateRegister = IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
io (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ do
Maybe String
x <- String -> [(String, String)] -> Maybe String
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup "DESKTOP_AUTOSTART_ID" ([(String, String)] -> Maybe String)
-> IO [(String, String)] -> IO (Maybe String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` IO [(String, String)]
getEnvironment
Maybe String -> (String -> IO ()) -> IO ()
forall (m :: * -> *) a. Monad m => Maybe a -> (a -> m ()) -> m ()
whenJust Maybe String
x ((String -> IO ()) -> IO ()) -> (String -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \sessionId :: String
sessionId -> String -> [String] -> IO ()
forall (m :: * -> *). MonadIO m => String -> [String] -> m ()
safeSpawn "dbus-send"
["--session"
,"--print-reply=literal"
,"--dest=org.mate.SessionManager"
,"/org/mate/SessionManager"
,"org.mate.SessionManager.RegisterClient"
,"string:xmonad"
,"string:"String -> String -> String
forall a. [a] -> [a] -> [a]
++String
sessionId]