packages feed

macos-corelibs-0.0.1.0: src/MacSdk/Framework/Accessibility.hs

module MacSdk.Framework.Accessibility
  ( module MacSdk.Framework.Accessibility.Action
  , module MacSdk.Framework.Accessibility.Attribute
  , module MacSdk.Framework.Accessibility.Error
  , module MacSdk.Framework.Accessibility.Observer
  , module MacSdk.Framework.Accessibility.UIElement
  , module MacSdk.Framework.Accessibility.UINotification
  , module MacSdk.Framework.Accessibility.Value
  , trustedCheckOptionPrompt
  , isProcessTrustedWithOptions
  , checkAXPrivileges
  ) where

import MacSdk.Framework.Accessibility.Action
import MacSdk.Framework.Accessibility.Attribute
import MacSdk.Framework.Accessibility.Error (AXError(..), AsAXError(..))
import MacSdk.Framework.Accessibility.Observer
import MacSdk.Framework.Accessibility.UIElement
import MacSdk.Framework.Accessibility.UINotification
import MacSdk.Framework.Accessibility.Value

import MacSdk.Framework.CoreFoundation
import Foreign
import Foreign.C.Types (CBool(..))

foreign import ccall unsafe axTrustedCheckOptionPrompt :: IO CFStringRef

trustedCheckOptionPrompt :: IO CFString
trustedCheckOptionPrompt = axTrustedCheckOptionPrompt >>= manageCFObj

foreign import ccall unsafe "AXIsProcessTrustedWithOptions"
  axIsProcessTrustedWithOptions :: Ptr () -> IO CBool

isProcessTrustedWithOptions :: Dictionary -> IO Bool
isProcessTrustedWithOptions =
  fmap Foreign.toBool . flip withCFPtr (axIsProcessTrustedWithOptions . castPtr)

-- | Check whether the current process has been granted Accessibility privileges
-- by the operating system.
checkAXPrivileges :: IO Bool
checkAXPrivileges = do
  allo <- nullAllocator
  s <- trustedCheckOptionPrompt
  b <- booleanTrue
  createDictionary allo [s] [b] >>= isProcessTrustedWithOptions