libmonado 1.6.0

Rust bindings to the libmonado library that controls Monado from other processes
Documentation
use dlopen2::wrapper::WrapperApi;
use flagset::flags;
use std::fmt::Debug;
use std::os::raw::c_char;
use std::{ffi::c_void, fmt::Display};

use crate::space::{MndPose, ReferenceSpaceType};

#[repr(i32)]
#[doc = " Result codes for operations, negative are errors, zero or positives are\n success."]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum MndResult {
	Success = 0,
	ErrorInvalidVersion = -1,
	ErrorInvalidValue = -2,
	ErrorConnectingFailed = -3,
	ErrorOperationFailed = -4,
	ErrorRecenteringNotSupported = -5,
	ErrorInvalidProperty = -6,
	ErrorInvalidOperation = -7,
	ErrorUnsupportedOperation = -8,
}
impl MndResult {
	pub fn to_result(self) -> Result<(), MndResult> {
		if self == MndResult::Success {
			Ok(())
		} else {
			Err(self)
		}
	}
}

impl std::error::Error for MndResult {
	fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
		None
	}
	fn cause(&self) -> Option<&dyn std::error::Error> {
		None
	}
	fn description(&self) -> &str {
		"std::error::Error::description() is deprecated, use the Display impl instead."
	}
}

impl Display for MndResult {
	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
		write!(f, "{:?}", self)
	}
}

flags! {
	#[doc = " Bitflags for client application state."]
	pub enum ClientState: u32 {
		ClientPrimaryApp = 1,
		ClientSessionActive = 2,
		ClientSessionVisible = 4,
		ClientSessionFocused = 8,
		ClientSessionOverlay = 16,
		ClientIoActive = 32,
		ClientPosesBlocked = 64,
		ClientHtBlocked = 128,
		ClientInputsBlocked = 256,
		ClientOutputsBlocked = 512,
	}
}

flags! {
	#[doc = " Bitflags for IO blocking."]
	#[repr(u32)]
	pub enum BlockFlags: u32 {
		None = 0,
		BlockPoses = 1,
		BlockHt = 2,
		BlockInputs = 4,
		BlockOutputs = 8,
	}
}

#[repr(i32)]
#[doc = " A property to get from a thing (currently only devices)."]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum MndProperty {
	PropertyNameString = 0,
	PropertySerialString = 1,
	PropertyTrackingOriginU32 = 2,
	PropertySupportsPositionBool = 3,
	PropertySupportsOrientationBool = 4,
	PropertySupportsBrightnessBool = 5,
}

#[doc = " Opaque type for libmonado state"]
pub type MndRootPtr = *mut c_void;

#[derive(WrapperApi)]
pub struct MonadoApi {
	mnd_api_get_version:
		unsafe extern "C" fn(out_major: *mut u32, out_minor: *mut u32, out_patch: *mut u32),
	mnd_root_create: unsafe extern "C" fn(out_root: *mut MndRootPtr) -> MndResult,
	mnd_root_destroy: unsafe extern "C" fn(out_root: *mut MndRootPtr),
	mnd_root_update_client_list: unsafe extern "C" fn(root: MndRootPtr) -> MndResult,
	mnd_root_get_number_clients:
		unsafe extern "C" fn(root: MndRootPtr, out_num: *mut u32) -> MndResult,
	mnd_root_get_client_id_at_index:
		unsafe extern "C" fn(root: MndRootPtr, index: u32, out_client_id: *mut u32) -> MndResult,
	mnd_root_get_client_name: unsafe extern "C" fn(
		root: MndRootPtr,
		client_id: u32,
		out_name: *mut *const ::std::os::raw::c_char,
	) -> MndResult,
	mnd_root_get_client_state:
		unsafe extern "C" fn(root: MndRootPtr, client_id: u32, out_flags: *mut u32) -> MndResult,
	mnd_root_set_client_primary:
		unsafe extern "C" fn(root: MndRootPtr, client_id: u32) -> MndResult,
	mnd_root_set_client_focused:
		unsafe extern "C" fn(root: MndRootPtr, client_id: u32) -> MndResult,
	mnd_root_toggle_client_io_active:
		unsafe extern "C" fn(root: MndRootPtr, client_id: u32) -> MndResult,
	mnd_root_set_client_io_blocks: Option<
		unsafe extern "C" fn(root: MndRootPtr, client_id: u32, block_flags: u32) -> MndResult,
	>,
	mnd_root_get_device_count:
		unsafe extern "C" fn(root: MndRootPtr, out_device_count: *mut u32) -> MndResult,
	mnd_root_get_device_info: unsafe extern "C" fn(
		root: MndRootPtr,
		device_index: u32,
		out_index: *mut u32,
		out_dev_name: *mut *const ::std::os::raw::c_char,
	) -> MndResult,
	mnd_root_get_device_from_role: unsafe extern "C" fn(
		root: MndRootPtr,
		role_name: *const ::std::os::raw::c_char,
		out_index: *mut i32,
	) -> MndResult,
	mnd_root_recenter_local_spaces: unsafe extern "C" fn(root: MndRootPtr) -> MndResult,
	mnd_root_get_device_info_bool: unsafe extern "C" fn(
		root: MndRootPtr,
		device_index: u32,
		mnd_property_t: MndProperty,
		out_bool: *mut bool,
	) -> MndResult,
	mnd_root_get_device_info_i32: unsafe extern "C" fn(
		root: MndRootPtr,
		device_index: u32,
		mnd_property_t: MndProperty,
		out_i32: *mut i32,
	) -> MndResult,
	mnd_root_get_device_info_u32: unsafe extern "C" fn(
		root: MndRootPtr,
		device_index: u32,
		mnd_property_t: MndProperty,
		out_u32: *mut u32,
	) -> MndResult,
	mnd_root_get_device_info_float: unsafe extern "C" fn(
		root: MndRootPtr,
		device_index: u32,
		mnd_property_t: MndProperty,
		out_float: *mut f32,
	) -> MndResult,
	mnd_root_get_device_info_string: unsafe extern "C" fn(
		root: MndRootPtr,
		device_index: u32,
		mnd_property_t: MndProperty,
		out_string: *mut *mut ::std::os::raw::c_char,
	) -> MndResult,

	mnd_root_get_reference_space_offset: unsafe extern "C" fn(
		root: MndRootPtr,
		type_: ReferenceSpaceType,
		out_offset: *mut MndPose,
	) -> MndResult,
	mnd_root_set_reference_space_offset: unsafe extern "C" fn(
		root: MndRootPtr,
		type_: ReferenceSpaceType,
		offset: *const MndPose,
	) -> MndResult,
	mnd_root_get_tracking_origin_offset: unsafe extern "C" fn(
		root: MndRootPtr,
		origin_id: u32,
		out_offset: *mut MndPose,
	) -> MndResult,
	mnd_root_set_tracking_origin_offset:
		unsafe extern "C" fn(root: MndRootPtr, origin_id: u32, offset: *const MndPose) -> MndResult,
	mnd_root_get_tracking_origin_count:
		unsafe extern "C" fn(root: MndRootPtr, out_track_count: *mut u32) -> MndResult,
	mnd_root_get_tracking_origin_name: unsafe extern "C" fn(
		root: MndRootPtr,
		origin_id: u32,
		out_string: *mut *const c_char,
	) -> MndResult,
	mnd_root_get_device_battery_status: unsafe extern "C" fn(
		root: MndRootPtr,
		device_index: u32,
		out_present: *mut bool,
		out_charging: *mut bool,
		out_charge: *mut f32,
	) -> MndResult,
	mnd_root_get_device_brightness: unsafe extern "C" fn(
		root: MndRootPtr,
		device_index: u32,
		out_brightness: *mut f32,
	) -> MndResult,
	mnd_root_set_device_brightness: unsafe extern "C" fn(
		root: MndRootPtr,
		device_index: u32,
		brightness: f32,
		relative: bool,
	) -> MndResult,
}