macos_accessibility_client/
lib.rs

1#![allow(non_snake_case)]
2
3/// Raw C-bindings for some of Apple's accessibility API. See [Apple's documentation](https://developer.apple.com/documentation/applicationservices/axuielement_h?language=objc#overview)
4pub mod raw {
5	use core_foundation_sys::dictionary::CFDictionaryRef;
6	use core_foundation_sys::base::Boolean;
7	use core_foundation::string::CFStringRef;
8
9	extern {
10		pub static kAXTrustedCheckOptionPrompt: CFStringRef;
11
12		pub fn AXIsProcessTrusted() -> Boolean;
13		pub fn AXIsProcessTrustedWithOptions(theDict: CFDictionaryRef) -> Boolean;
14
15	}
16}
17
18/// Wrapped bindings to some of Apple's accessibility client API.
19pub mod accessibility {
20	use core_foundation::string::CFString;
21	use core_foundation::dictionary::CFDictionary;
22	use core_foundation::boolean::CFBoolean;
23	use core_foundation::base::TCFType;
24
25	use crate::raw::{AXIsProcessTrusted, kAXTrustedCheckOptionPrompt, AXIsProcessTrustedWithOptions};
26
27	/// Checks whether or not this application is a trusted accessibility client.
28	pub fn application_is_trusted() -> bool {
29		unsafe {
30			return AXIsProcessTrusted() != 0;
31		}
32	}
33
34	/// Same as [application_is_trusted], but also shows the user a prompt asking
35	/// them to allow accessibility API access if it hasn't already been given.
36	pub fn application_is_trusted_with_prompt() -> bool {
37		unsafe {
38			let option_prompt = CFString::wrap_under_get_rule(kAXTrustedCheckOptionPrompt);
39			let dict: CFDictionary<CFString, CFBoolean> = CFDictionary::from_CFType_pairs(&[
40				(option_prompt, CFBoolean::true_value()),
41			]);
42			return AXIsProcessTrustedWithOptions(dict.as_concrete_TypeRef()) != 0
43		}
44	}
45}
46
47#[cfg(test)]
48mod tests {
49	use crate::accessibility::{application_is_trusted, application_is_trusted_with_prompt};
50
51	#[test]
52	fn test_application_is_trusted() {
53		assert_eq!(false, application_is_trusted());
54	}
55
56	#[test]
57    fn test_application_is_trusted_with_prompt() {
58		assert_eq!(false, application_is_trusted_with_prompt());
59    }
60}