@@ -190,39 +190,17 @@ unsafe fn get_string_attribute(element: AXUIElementRef, attr_name: &str) -> Opti
190190/// Get position (CGPoint) and size (CGSize) of an AX element.
191191/// Returns None if either attribute is missing.
192192unsafe fn get_position_and_size ( element : AXUIElementRef ) -> Option < ( CGPoint , CGSize ) > {
193- let position = get_ax_point ( element, "AXPosition" ) ?;
194- let size = get_ax_size ( element, "AXSize" ) ?;
193+ let position: CGPoint = get_ax_value ( element, "AXPosition" , K_AX_VALUE_TYPE_CGPOINT ) ?;
194+ let size: CGSize = get_ax_value ( element, "AXSize" , K_AX_VALUE_TYPE_CGSIZE ) ?;
195195 Some ( ( position, size) )
196196}
197197
198- /// Extract a CGPoint from an AXValue attribute.
199- unsafe fn get_ax_point ( element : AXUIElementRef , attr_name : & str ) -> Option < CGPoint > {
200- let attr = CFString :: new ( attr_name) ;
201- let mut value_ref: core_foundation:: base:: CFTypeRef = ptr:: null ( ) ;
202- let err = AXUIElementCopyAttributeValue ( element, attr. as_concrete_TypeRef ( ) , & mut value_ref) ;
203-
204- if err != K_AX_ERROR_SUCCESS || value_ref. is_null ( ) {
205- return None ;
206- }
207-
208- let mut point = CGPoint :: new ( 0.0 , 0.0 ) ;
209- let ok = AXValueGetValue (
210- value_ref as AXValueRef ,
211- K_AX_VALUE_TYPE_CGPOINT ,
212- & mut point as * mut CGPoint as * mut c_void ,
213- ) ;
214-
215- core_foundation:: base:: CFRelease ( value_ref) ;
216-
217- if ok {
218- Some ( point)
219- } else {
220- None
221- }
222- }
223-
224- /// Extract a CGSize from an AXValue attribute.
225- unsafe fn get_ax_size ( element : AXUIElementRef , attr_name : & str ) -> Option < CGSize > {
198+ /// Extract a typed value (CGPoint or CGSize) from an AXValue attribute.
199+ unsafe fn get_ax_value < T : Default > (
200+ element : AXUIElementRef ,
201+ attr_name : & str ,
202+ ax_value_type : u32 ,
203+ ) -> Option < T > {
226204 let attr = CFString :: new ( attr_name) ;
227205 let mut value_ref: core_foundation:: base:: CFTypeRef = ptr:: null ( ) ;
228206 let err = AXUIElementCopyAttributeValue ( element, attr. as_concrete_TypeRef ( ) , & mut value_ref) ;
@@ -231,17 +209,17 @@ unsafe fn get_ax_size(element: AXUIElementRef, attr_name: &str) -> Option<CGSize
231209 return None ;
232210 }
233211
234- let mut size = CGSize :: new ( 0.0 , 0.0 ) ;
212+ let mut result = T :: default ( ) ;
235213 let ok = AXValueGetValue (
236214 value_ref as AXValueRef ,
237- K_AX_VALUE_TYPE_CGSIZE ,
238- & mut size as * mut CGSize as * mut c_void ,
215+ ax_value_type ,
216+ & mut result as * mut T as * mut c_void ,
239217 ) ;
240218
241219 core_foundation:: base:: CFRelease ( value_ref) ;
242220
243221 if ok {
244- Some ( size )
222+ Some ( result )
245223 } else {
246224 None
247225 }
0 commit comments