packages feed

desktop-portal-0.3.2.0: src/Desktop/Portal/Camera.hs

module Desktop.Portal.Camera
  ( accessCamera,
    openPipeWireRemote,
    isCameraPresent,
  )
where

import Control.Exception (throwIO)
import DBus (InterfaceName, Variant, fromVariant, toVariant)
import DBus.Client qualified as DBus
import Data.Map (Map)
import Data.Text (Text)
import Desktop.Portal.Internal (Client, Request, callMethod, getPropertyValue, sendRequest)
import System.Posix (Fd)

cameraInterface :: InterfaceName
cameraInterface = "org.freedesktop.portal.Camera"

-- | Requests access to the camera.
--
-- If access is granted, then request will return '()', otherwise it will be cancelled.
accessCamera :: Client -> IO (Request ())
accessCamera client = do
  sendRequest client cameraInterface "AccessCamera" [] mempty (const (pure ()))

openPipeWireRemote :: Client -> IO Fd
openPipeWireRemote client = do
  res <- callMethod client cameraInterface "OpenPipeWireRemote" [toVariant (mempty :: Map Text Variant)]
  case res of
    [fromVariant -> Just fd] ->
      pure fd
    _ ->
      throwIO . DBus.clientError $ "openPipeWireRemote: could not parse response: " <> show res

isCameraPresent :: Client -> IO Bool
isCameraPresent client = do
  getPropertyValue client cameraInterface "IsCameraPresent"