packages feed

nano-ui-sdl-0.1.0.0: lib/NanoUI/Sdl/Clipboard.hs

module NanoUI.Sdl.Clipboard
  ( withSdlClipboard
  ) where

import qualified Data.Text as T
import Data.Text.Foreign (peekCString, withCString)
import Foreign.Ptr (castPtr, nullPtr)
import NanoUI.Testing (Context, withClipboard)
import SDL3.Sys.Bindgen.Runtime.PtrConst qualified as PtrConst
import SDL3.Sys.Clipboard (getClipboardText, setClipboardText)
import SDL3.Sys.Stdinc (free)

-- | Route the context's clipboard through SDL (UTF-8 text both ways).
withSdlClipboard :: Context -> Context
withSdlClipboard ctx = withClipboard ctx readClipboard writeClipboard
  where
    writeClipboard txt = withCString txt (setClipboardText . PtrConst.unsafeFromPtr)
    readClipboard = do
      ptr <- getClipboardText
      if ptr == nullPtr
        then pure Nothing
        else do
          txt <- peekCString ptr
          free (castPtr ptr)
          pure (if T.null txt then Nothing else Just txt)