@@ -19,13 +19,11 @@ use objc2::{
19
19
} ;
20
20
use objc2_app_kit:: { NSView , NSWindow } ;
21
21
use objc2_foundation:: { NSArray , NSObject , NSPoint } ;
22
- use once_cell:: sync:: Lazy ;
23
- use std:: { cell:: RefCell , collections:: HashMap , ffi:: c_void, sync:: Mutex } ;
22
+ use std:: { cell:: RefCell , ffi:: c_void, sync:: Mutex } ;
24
23
25
24
use crate :: { event:: QueuedEvents , Adapter } ;
26
25
27
- static SUBCLASSES : Lazy < Mutex < HashMap < & ' static AnyClass , & ' static AnyClass > > > =
28
- Lazy :: new ( || Mutex :: new ( HashMap :: new ( ) ) ) ;
26
+ static SUBCLASSES : Mutex < Vec < ( & ' static AnyClass , & ' static AnyClass ) > > = Mutex :: new ( Vec :: new ( ) ) ;
29
27
30
28
static ASSOCIATED_OBJECT_KEY : u8 = 0 ;
31
29
@@ -163,34 +161,38 @@ impl SubclassingAdapter {
163
161
)
164
162
} ;
165
163
let mut subclasses = SUBCLASSES . lock ( ) . unwrap ( ) ;
166
- let entry = subclasses. entry ( prev_class) ;
167
- let subclass = entry. or_insert_with ( || {
168
- let name = format ! ( "AccessKitSubclassOf{}" , prev_class. name( ) ) ;
169
- let mut builder = ClassBuilder :: new ( & name, prev_class) . unwrap ( ) ;
170
- unsafe {
171
- builder. add_method (
172
- sel ! ( superclass) ,
173
- superclass as unsafe extern "C" fn ( _, _) -> _ ,
174
- ) ;
175
- builder. add_method (
176
- sel ! ( accessibilityChildren) ,
177
- children as unsafe extern "C" fn ( _, _) -> _ ,
178
- ) ;
179
- builder. add_method (
180
- sel ! ( accessibilityFocusedUIElement) ,
181
- focus as unsafe extern "C" fn ( _, _) -> _ ,
182
- ) ;
183
- builder. add_method (
184
- sel ! ( accessibilityHitTest: ) ,
185
- hit_test as unsafe extern "C" fn ( _, _, _) -> _ ,
186
- ) ;
164
+ let subclass = match subclasses. iter ( ) . find ( |entry| entry. 0 == prev_class) {
165
+ Some ( entry) => entry. 1 ,
166
+ None => {
167
+ let name = format ! ( "AccessKitSubclassOf{}" , prev_class. name( ) ) ;
168
+ let mut builder = ClassBuilder :: new ( & name, prev_class) . unwrap ( ) ;
169
+ unsafe {
170
+ builder. add_method (
171
+ sel ! ( superclass) ,
172
+ superclass as unsafe extern "C" fn ( _, _) -> _ ,
173
+ ) ;
174
+ builder. add_method (
175
+ sel ! ( accessibilityChildren) ,
176
+ children as unsafe extern "C" fn ( _, _) -> _ ,
177
+ ) ;
178
+ builder. add_method (
179
+ sel ! ( accessibilityFocusedUIElement) ,
180
+ focus as unsafe extern "C" fn ( _, _) -> _ ,
181
+ ) ;
182
+ builder. add_method (
183
+ sel ! ( accessibilityHitTest: ) ,
184
+ hit_test as unsafe extern "C" fn ( _, _, _) -> _ ,
185
+ ) ;
186
+ }
187
+ let class = builder. register ( ) ;
188
+ subclasses. push ( ( prev_class, class) ) ;
189
+ class
187
190
}
188
- builder. register ( )
189
- } ) ;
191
+ } ;
190
192
// SAFETY: Changing the view's class is only safe because
191
193
// the subclass doesn't add any instance variables;
192
194
// it uses an associated object instead.
193
- unsafe { object_setClass ( view as * mut _ , ( * subclass as * const AnyClass ) . cast ( ) ) } ;
195
+ unsafe { object_setClass ( view as * mut _ , ( subclass as * const AnyClass ) . cast ( ) ) } ;
194
196
Self {
195
197
view : retained_view,
196
198
associated,
0 commit comments