9
9
10
10
#![ allow( non_upper_case_globals) ]
11
11
12
+ use std:: marker:: PhantomData ;
13
+
12
14
use core_foundation_sys:: base:: CFIndex ;
13
15
use core_foundation_sys:: base:: { kCFAllocatorDefault, CFOptionFlags } ;
14
16
pub use core_foundation_sys:: runloop:: * ;
@@ -19,7 +21,23 @@ use crate::date::{CFAbsoluteTime, CFTimeInterval};
19
21
use crate :: filedescriptor:: CFFileDescriptor ;
20
22
use crate :: string:: CFString ;
21
23
22
- pub type CFRunLoopMode = CFStringRef ;
24
+ pub struct CFRunLoopMode < ' a > ( CFStringRef , PhantomData < & ' a CFString > ) ;
25
+
26
+ impl < ' a > CFRunLoopMode < ' a > {
27
+ pub fn new ( s : & ' a CFString ) -> CFRunLoopMode < ' a > {
28
+ CFRunLoopMode ( s. as_concrete_TypeRef ( ) , PhantomData )
29
+ }
30
+
31
+ #[ doc( alias = "kCFRunLoopCommonModes" ) ]
32
+ pub fn common ( ) -> CFRunLoopMode < ' static > {
33
+ unsafe { CFRunLoopMode ( kCFRunLoopCommonModes, PhantomData ) }
34
+ }
35
+
36
+ #[ doc( alias = "kCFRunLoopDefaultMode" ) ]
37
+ pub fn default ( ) -> CFRunLoopMode < ' static > {
38
+ unsafe { CFRunLoopMode ( kCFRunLoopDefaultMode, PhantomData ) }
39
+ }
40
+ }
23
41
24
42
declare_TCFType ! ( CFRunLoop , CFRunLoopRef ) ;
25
43
impl_TCFType ! ( CFRunLoop , CFRunLoopRef , CFRunLoopGetTypeID ) ;
@@ -59,15 +77,15 @@ impl CFRunLoop {
59
77
}
60
78
61
79
pub fn run_in_mode (
62
- mode : CFStringRef ,
80
+ mode : CFRunLoopMode ,
63
81
duration : std:: time:: Duration ,
64
82
return_after_source_handled : bool ,
65
83
) -> CFRunLoopRunResult {
66
84
let seconds = duration. as_secs_f64 ( ) ;
67
85
let return_after_source_handled = if return_after_source_handled { 1 } else { 0 } ;
68
86
69
87
unsafe {
70
- match CFRunLoopRunInMode ( mode, seconds, return_after_source_handled) {
88
+ match CFRunLoopRunInMode ( mode. 0 , seconds, return_after_source_handled) {
71
89
2 => CFRunLoopRunResult :: Stopped ,
72
90
3 => CFRunLoopRunResult :: TimedOut ,
73
91
4 => CFRunLoopRunResult :: HandledSource ,
@@ -95,50 +113,50 @@ impl CFRunLoop {
95
113
}
96
114
97
115
pub fn contains_timer ( & self , timer : & CFRunLoopTimer , mode : CFRunLoopMode ) -> bool {
98
- unsafe { CFRunLoopContainsTimer ( self . 0 , timer. 0 , mode) != 0 }
116
+ unsafe { CFRunLoopContainsTimer ( self . 0 , timer. 0 , mode. 0 ) != 0 }
99
117
}
100
118
101
119
pub fn add_timer ( & self , timer : & CFRunLoopTimer , mode : CFRunLoopMode ) {
102
120
unsafe {
103
- CFRunLoopAddTimer ( self . 0 , timer. 0 , mode) ;
121
+ CFRunLoopAddTimer ( self . 0 , timer. 0 , mode. 0 ) ;
104
122
}
105
123
}
106
124
107
125
pub fn remove_timer ( & self , timer : & CFRunLoopTimer , mode : CFRunLoopMode ) {
108
126
unsafe {
109
- CFRunLoopRemoveTimer ( self . 0 , timer. 0 , mode) ;
127
+ CFRunLoopRemoveTimer ( self . 0 , timer. 0 , mode. 0 ) ;
110
128
}
111
129
}
112
130
113
131
pub fn contains_source ( & self , source : & CFRunLoopSource , mode : CFRunLoopMode ) -> bool {
114
- unsafe { CFRunLoopContainsSource ( self . 0 , source. 0 , mode) != 0 }
132
+ unsafe { CFRunLoopContainsSource ( self . 0 , source. 0 , mode. 0 ) != 0 }
115
133
}
116
134
117
135
pub fn add_source ( & self , source : & CFRunLoopSource , mode : CFRunLoopMode ) {
118
136
unsafe {
119
- CFRunLoopAddSource ( self . 0 , source. 0 , mode) ;
137
+ CFRunLoopAddSource ( self . 0 , source. 0 , mode. 0 ) ;
120
138
}
121
139
}
122
140
123
141
pub fn remove_source ( & self , source : & CFRunLoopSource , mode : CFRunLoopMode ) {
124
142
unsafe {
125
- CFRunLoopRemoveSource ( self . 0 , source. 0 , mode) ;
143
+ CFRunLoopRemoveSource ( self . 0 , source. 0 , mode. 0 ) ;
126
144
}
127
145
}
128
146
129
147
pub fn contains_observer ( & self , observer : & CFRunLoopObserver , mode : CFRunLoopMode ) -> bool {
130
- unsafe { CFRunLoopContainsObserver ( self . 0 , observer. 0 , mode) != 0 }
148
+ unsafe { CFRunLoopContainsObserver ( self . 0 , observer. 0 , mode. 0 ) != 0 }
131
149
}
132
150
133
151
pub fn add_observer ( & self , observer : & CFRunLoopObserver , mode : CFRunLoopMode ) {
134
152
unsafe {
135
- CFRunLoopAddObserver ( self . 0 , observer. 0 , mode) ;
153
+ CFRunLoopAddObserver ( self . 0 , observer. 0 , mode. 0 ) ;
136
154
}
137
155
}
138
156
139
157
pub fn remove_observer ( & self , observer : & CFRunLoopObserver , mode : CFRunLoopMode ) {
140
158
unsafe {
141
- CFRunLoopRemoveObserver ( self . 0 , observer. 0 , mode) ;
159
+ CFRunLoopRemoveObserver ( self . 0 , observer. 0 , mode. 0 ) ;
142
160
}
143
161
}
144
162
}
@@ -222,9 +240,8 @@ mod test {
222
240
223
241
let run_loop_timer =
224
242
CFRunLoopTimer :: new ( now + 0.20f64 , 0f64 , 0 , 0 , timer_popped, & mut context) ;
225
- unsafe {
226
- run_loop. add_timer ( & run_loop_timer, kCFRunLoopDefaultMode) ;
227
- }
243
+ run_loop. add_timer ( & run_loop_timer, CFRunLoopMode :: default ( ) ) ;
244
+
228
245
CFRunLoop :: run_current ( ) ;
229
246
let elapsed = elapsed_rx. try_recv ( ) . unwrap ( ) ;
230
247
println ! ( "wait_200_milliseconds, elapsed: {}" , elapsed) ;
@@ -277,7 +294,7 @@ mod test {
277
294
} ;
278
295
279
296
let runloop = CFRunLoop :: get_current ( ) ;
280
- runloop. add_observer ( & observer, unsafe { kCFRunLoopDefaultMode } ) ;
297
+ runloop. add_observer ( & observer, CFRunLoopMode :: default ( ) ) ;
281
298
282
299
let timer = CFRunLoopTimer :: new (
283
300
CFDate :: now ( ) . abs_time ( ) + 1f64 ,
@@ -287,11 +304,10 @@ mod test {
287
304
observe_timer_popped,
288
305
null_mut ( ) ,
289
306
) ;
290
- runloop. add_timer ( & timer, unsafe { kCFRunLoopDefaultMode } ) ;
307
+ runloop. add_timer ( & timer, CFRunLoopMode :: default ( ) ) ;
291
308
292
- let result = unsafe {
293
- CFRunLoop :: run_in_mode ( kCFRunLoopDefaultMode, Duration :: from_secs ( 10 ) , false )
294
- } ;
309
+ let result =
310
+ CFRunLoop :: run_in_mode ( CFRunLoopMode :: default ( ) , Duration :: from_secs ( 10 ) , false ) ;
295
311
296
312
assert_eq ! ( result, CFRunLoopRunResult :: Stopped ) ;
297
313
0 commit comments