{-# LANGUAGE FlexibleContexts #-}
module WildBind.X11.Emulate
(
sendKeyTo,
sendKey,
pushTo,
push,
remap,
remapR
) where
import Control.Monad.IO.Class (MonadIO(liftIO))
import Control.Monad.Reader.Class (MonadReader(ask))
import WildBind.Binding (Binding', bindsF, on, run)
import WildBind.X11.Internal.FrontEnd
( X11Front(..)
)
import WildBind.X11.Internal.Key
( ToXKeyEvent(..), KeyEventType(..), XKeyEvent,
xSendKeyEvent, press, release
)
import WildBind.X11.Internal.Window
( Window, ActiveWindow, winID
)
sendKeyTo :: (ToXKeyEvent k, MonadIO m)
=> X11Front i
-> Window
-> k
-> m ()
sendKeyTo front win key = liftIO $ xSendKeyEvent kmmap disp win_id key_event
where
kmmap = x11KeyMaskMap front
disp = x11Display front
win_id = winID win
key_event = toXKeyEvent key
sendKey :: (ToXKeyEvent k, MonadIO m, MonadReader Window m) => X11Front i -> k -> m ()
sendKey front key = do
win <- ask
sendKeyTo front win key
pushTo :: (ToXKeyEvent k, MonadIO m) => X11Front i -> Window -> k -> m ()
pushTo front win key = do
send $ press key
send $ release key
where
send = sendKeyTo front win
push :: (ToXKeyEvent k, MonadIO m, MonadReader Window m) => X11Front i -> k -> m ()
push front key = do
win <- ask
pushTo front win key
remap :: (ToXKeyEvent from, ToXKeyEvent to) => X11Front i -> from -> to -> Binding' bs ActiveWindow XKeyEvent
remap front from to = bindsF $ do
on (press from) `run` sendKey' (press to)
on (release from) `run` sendKey' (release to)
where
sendKey' = sendKey front
remapR :: (ToXKeyEvent from, ToXKeyEvent to) => X11Front i -> from -> to -> Binding' bs ActiveWindow XKeyEvent
remapR front from to = bindsF $ do
on (release from) `run` push front to