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"