module Text.XkbCommon.Keymap
( Keymap, RMLVO(..), noPrefs,
newKeymapFromNames, newKeymapFromString, keymapAsString, keymapNumLayouts,
keymapKeyNumLayouts, keymapNumMods, keymapModName, keymapModIdx, keymapKeyNumLevels,
keymapNumLeds, keymapLeds, keymapModifiers,
keymapLedName, keymapKeyRepeats
) where
import Control.Monad
import Foreign
import Foreign.C
import qualified System.IO.Unsafe as S (unsafePerformIO)
import Text.XkbCommon.InternalTypes
newKeymapFromNames :: Context -> RMLVO -> IO (Maybe Keymap)
newKeymapFromNames ctx rmlvo = withContext ctx $ \ ptr -> do
crmlvo <- new rmlvo
k <- c_keymap_from_names ptr crmlvo 0
l <- newForeignPtr c_unref_keymap k
return (if k == nullPtr then Nothing else Just $ toKeymap l)
newKeymapFromString :: Context -> String -> Maybe Keymap
newKeymapFromString ctx buf = S.unsafePerformIO $ withCString buf $ \ cstr -> withContext ctx $ \ ptr -> do
k <- c_keymap_from_string ptr cstr 1 0
l <- newForeignPtr c_unref_keymap k
return (if k == nullPtr then Nothing else Just $ toKeymap l)
keymapAsString :: Keymap -> String
keymapAsString km = S.unsafePerformIO $ withKeymap km $ \ ptr ->
c_keymap_as_string ptr 1 >>= peekCString
keymapNumLayouts :: Keymap -> CLayoutIndex
keymapNumLayouts km = S.unsafePerformIO $ withKeymap km c_keymap_num_layouts
keymapKeyNumLayouts :: Keymap -> CKeycode -> CLayoutIndex
keymapKeyNumLayouts km key = S.unsafePerformIO $ withKeymap km $ \ ptr -> c_keymap_num_layouts_key ptr key
keymapLayoutName :: Keymap -> CLayoutIndex -> Maybe String
keymapLayoutName km idx = S.unsafePerformIO $ withKeymap km $ \ ptr -> do
name <- c_keymap_layout_name ptr idx
if name == nullPtr
then return Nothing
else liftM Just $ peekCString name
keymapModifiers :: Keymap -> [String]
keymapModifiers km = [keymapModName km (CModIndex i) | i <- [0..(fromIntegral $ unCModIndex $ keymapNumMods km)]]
keymapNumMods :: Keymap -> CModIndex
keymapNumMods km = S.unsafePerformIO $ withKeymap km c_keymap_num_mods
keymapModName :: Keymap -> CModIndex -> String
keymapModName km idx = S.unsafePerformIO $ withKeymap km $
\ ptr -> c_keymap_mod_name ptr idx >>= peekCString
keymapModIdx :: Keymap -> String -> Maybe CModIndex
keymapModIdx km name = S.unsafePerformIO $ withKeymap km $
\ ptr -> withCString name $ \ cstr -> do
idx <- c_keymap_mod_index ptr cstr
case idx of
CModIndex (4294967295) -> return Nothing
x@(CModIndex n) -> return $ Just x
keymapKeyNumLevels :: Keymap -> CKeycode -> CLayoutIndex -> CLevelIndex
keymapKeyNumLevels km kc idx = S.unsafePerformIO $ withKeymap km $ \ ptr -> c_keymap_num_levels ptr kc idx
keymapLeds :: Keymap -> [String]
keymapLeds km = [keymapLedName km (CLedIndex i) | i <- [0..(fromIntegral $ unCLedIndex $ keymapNumLeds km)]]
keymapNumLeds :: Keymap -> CLedIndex
keymapNumLeds km = S.unsafePerformIO $ withKeymap km c_keymap_num_leds
keymapLedName :: Keymap -> CLedIndex -> String
keymapLedName km id = S.unsafePerformIO . withKeymap km $
\ ptr -> c_keymap_led_name ptr id >>= peekCString
keymapKeyRepeats :: Keymap -> CKeycode -> Bool
keymapKeyRepeats km kc = S.unsafePerformIO (withKeymap km $ \ ptr -> c_keymap_key_repeats ptr kc) /= 0
foreign import ccall unsafe "xkbcommon/xkbcommon.h xkb_keymap_new_from_names"
c_keymap_from_names :: Ptr CContext -> Ptr RMLVO -> CInt -> IO (Ptr CKeymap)
foreign import ccall unsafe "xkbcommon/xkbcommon.h xkb_keymap_new_from_string"
c_keymap_from_string :: Ptr CContext -> CString -> CInt -> CInt -> IO (Ptr CKeymap)
foreign import ccall unsafe "xkbcommon/xkbcommon.h xkb_keymap_get_as_string"
c_keymap_as_string :: Ptr CKeymap -> CInt -> IO CString
foreign import ccall unsafe "xkbcommon/xkbcommon.h &xkb_keymap_unref"
c_unref_keymap :: FinalizerPtr CKeymap
foreign import ccall unsafe "xkbcommon/xkbcommon.h xkb_keymap_layout_get_name"
c_keymap_layout_name :: Ptr CKeymap -> CLayoutIndex -> IO CString
foreign import ccall unsafe "xkbcommon/xkbcommon.h xkb_keymap_num_mods"
c_keymap_num_mods :: Ptr CKeymap -> IO CModIndex
foreign import ccall unsafe "xkbcommon/xkbcommon.h xkb_keymap_mod_get_name"
c_keymap_mod_name :: Ptr CKeymap -> CModIndex -> IO CString
foreign import ccall unsafe "xkbcommon/xkbcommon.h xkb_keymap_mod_get_index"
c_keymap_mod_index :: Ptr CKeymap -> CString -> IO CModIndex
foreign import ccall unsafe "xkbcommon/xkbcommon.h xkb_keymap_num_layouts"
c_keymap_num_layouts :: Ptr CKeymap -> IO CLayoutIndex
foreign import ccall unsafe "xkbcommon/xkbcommon.h xkb_keymap_num_layouts_for_key"
c_keymap_num_layouts_key :: Ptr CKeymap -> CKeycode -> IO CLayoutIndex
foreign import ccall unsafe "xkbcommon/xkbcommon.h xkb_keymap_num_levels_for_key"
c_keymap_num_levels :: Ptr CKeymap -> CKeycode -> CLayoutIndex -> IO CLevelIndex
foreign import ccall unsafe "xkbcommon/xkbcommon.h xkb_keymap_key_get_syms_by_level"
c_keymap_syms_by_level :: Ptr CKeymap -> CKeycode -> CLayoutIndex -> CLevelIndex -> Ptr (Ptr CKeysym) -> IO CInt
foreign import ccall unsafe "xkbcommon/xkbcommon.h xkb_keymap_num_leds"
c_keymap_num_leds :: Ptr CKeymap -> IO CLedIndex
foreign import ccall unsafe "xkbcommon/xkbcommon.h xkb_keymap_led_get_name"
c_keymap_led_name :: Ptr CKeymap -> CLedIndex -> IO CString
foreign import ccall unsafe "xkbcommon/xkbcommon.h xkb_keymap_key_repeats"
c_keymap_key_repeats :: Ptr CKeymap -> CKeycode -> IO CInt