@@ -12,15 +12,21 @@ use std::{
12
12
} ;
13
13
14
14
use cocoa:: {
15
- appkit:: NSApp ,
15
+ appkit:: { NSApp , NSWindow } ,
16
16
base:: nil,
17
- foundation:: { NSAutoreleasePool , NSString } ,
17
+ foundation:: { NSAutoreleasePool , NSSize , NSString } ,
18
18
} ;
19
19
20
20
use crate :: {
21
- event:: { Event , StartCause } ,
21
+ dpi:: LogicalSize ,
22
+ event:: { Event , StartCause , WindowEvent } ,
22
23
event_loop:: { ControlFlow , EventLoopWindowTarget as RootWindowTarget } ,
23
- platform_impl:: platform:: { observer:: EventLoopWaker , util:: Never } ,
24
+ platform_impl:: platform:: {
25
+ event:: { EventProxy , EventWrapper } ,
26
+ observer:: EventLoopWaker ,
27
+ util:: { IdRef , Never } ,
28
+ window:: get_window_id,
29
+ } ,
24
30
window:: WindowId ,
25
31
} ;
26
32
use objc:: runtime:: Object ;
@@ -29,8 +35,8 @@ lazy_static! {
29
35
static ref HANDLER : Handler = Default :: default ( ) ;
30
36
}
31
37
32
- impl Event < Never > {
33
- fn userify < T : ' static > ( self ) -> Event < T > {
38
+ impl < ' a , Never > Event < ' a , Never > {
39
+ fn userify < T : ' static > ( self ) -> Event < ' a , T > {
34
40
self . map_nonuser_event ( )
35
41
// `Never` can't be constructed, so the `UserEvent` variant can't
36
42
// be present here.
@@ -39,12 +45,13 @@ impl Event<Never> {
39
45
}
40
46
41
47
pub trait EventHandler : Debug {
42
- fn handle_nonuser_event ( & mut self , event : Event < Never > , control_flow : & mut ControlFlow ) ;
48
+ // Not sure probably it should accept Event<'static, Never>
49
+ fn handle_nonuser_event ( & mut self , event : Event < ' _ , Never > , control_flow : & mut ControlFlow ) ;
43
50
fn handle_user_events ( & mut self , control_flow : & mut ControlFlow ) ;
44
51
}
45
52
46
53
struct EventLoopHandler < T : ' static > {
47
- callback : Box < dyn FnMut ( Event < T > , & RootWindowTarget < T > , & mut ControlFlow ) > ,
54
+ callback : Box < dyn FnMut ( Event < ' _ , T > , & RootWindowTarget < T > , & mut ControlFlow ) > ,
48
55
will_exit : bool ,
49
56
window_target : Rc < RootWindowTarget < T > > ,
50
57
}
@@ -59,7 +66,7 @@ impl<T> Debug for EventLoopHandler<T> {
59
66
}
60
67
61
68
impl < T > EventHandler for EventLoopHandler < T > {
62
- fn handle_nonuser_event ( & mut self , event : Event < Never > , control_flow : & mut ControlFlow ) {
69
+ fn handle_nonuser_event ( & mut self , event : Event < ' _ , Never > , control_flow : & mut ControlFlow ) {
63
70
( self . callback ) ( event. userify ( ) , & self . window_target , control_flow) ;
64
71
self . will_exit |= * control_flow == ControlFlow :: Exit ;
65
72
if self . will_exit {
@@ -88,7 +95,7 @@ struct Handler {
88
95
control_flow_prev : Mutex < ControlFlow > ,
89
96
start_time : Mutex < Option < Instant > > ,
90
97
callback : Mutex < Option < Box < dyn EventHandler > > > ,
91
- pending_events : Mutex < VecDeque < Event < Never > > > ,
98
+ pending_events : Mutex < VecDeque < EventWrapper > > ,
92
99
pending_redraw : Mutex < Vec < WindowId > > ,
93
100
waker : Mutex < EventLoopWaker > ,
94
101
}
@@ -97,15 +104,15 @@ unsafe impl Send for Handler {}
97
104
unsafe impl Sync for Handler { }
98
105
99
106
impl Handler {
100
- fn events < ' a > ( & ' a self ) -> MutexGuard < ' a , VecDeque < Event < Never > > > {
107
+ fn events ( & self ) -> MutexGuard < ' _ , VecDeque < EventWrapper > > {
101
108
self . pending_events . lock ( ) . unwrap ( )
102
109
}
103
110
104
111
fn redraw < ' a > ( & ' a self ) -> MutexGuard < ' a , Vec < WindowId > > {
105
112
self . pending_redraw . lock ( ) . unwrap ( )
106
113
}
107
114
108
- fn waker < ' a > ( & ' a self ) -> MutexGuard < ' a , EventLoopWaker > {
115
+ fn waker ( & self ) -> MutexGuard < ' _ , EventLoopWaker > {
109
116
self . waker . lock ( ) . unwrap ( )
110
117
}
111
118
@@ -141,7 +148,7 @@ impl Handler {
141
148
* self . start_time . lock ( ) . unwrap ( ) = Some ( Instant :: now ( ) ) ;
142
149
}
143
150
144
- fn take_events ( & self ) -> VecDeque < Event < Never > > {
151
+ fn take_events ( & self ) -> VecDeque < EventWrapper > {
145
152
mem:: replace ( & mut * self . events ( ) , Default :: default ( ) )
146
153
}
147
154
@@ -157,9 +164,14 @@ impl Handler {
157
164
self . in_callback . store ( in_callback, Ordering :: Release ) ;
158
165
}
159
166
160
- fn handle_nonuser_event ( & self , event : Event < Never > ) {
167
+ fn handle_nonuser_event ( & self , wrapper : EventWrapper ) {
161
168
if let Some ( ref mut callback) = * self . callback . lock ( ) . unwrap ( ) {
162
- callback. handle_nonuser_event ( event, & mut * self . control_flow . lock ( ) . unwrap ( ) ) ;
169
+ match wrapper {
170
+ EventWrapper :: StaticEvent ( event) => {
171
+ callback. handle_nonuser_event ( event, & mut * self . control_flow . lock ( ) . unwrap ( ) )
172
+ }
173
+ EventWrapper :: EventProxy ( proxy) => self . handle_proxy ( proxy, callback) ,
174
+ }
163
175
}
164
176
}
165
177
@@ -168,6 +180,46 @@ impl Handler {
168
180
callback. handle_user_events ( & mut * self . control_flow . lock ( ) . unwrap ( ) ) ;
169
181
}
170
182
}
183
+
184
+ fn handle_hidpi_factor_changed_event (
185
+ & self ,
186
+ callback : & mut Box < dyn EventHandler + ' static > ,
187
+ ns_window : IdRef ,
188
+ suggested_size : LogicalSize ,
189
+ hidpi_factor : f64 ,
190
+ ) {
191
+ let size = suggested_size. to_physical ( hidpi_factor) ;
192
+ let new_inner_size = & mut Some ( size) ;
193
+ let event = Event :: WindowEvent {
194
+ window_id : WindowId ( get_window_id ( * ns_window) ) ,
195
+ event : WindowEvent :: HiDpiFactorChanged {
196
+ hidpi_factor,
197
+ new_inner_size,
198
+ } ,
199
+ } ;
200
+
201
+ callback. handle_nonuser_event ( event, & mut * self . control_flow . lock ( ) . unwrap ( ) ) ;
202
+
203
+ let physical_size = new_inner_size. unwrap_or ( size) ;
204
+ let logical_size = physical_size. to_logical ( hidpi_factor) ;
205
+ let size = NSSize :: new ( logical_size. width , logical_size. height ) ;
206
+ unsafe { NSWindow :: setContentSize_ ( * ns_window, size) } ;
207
+ }
208
+
209
+ fn handle_proxy ( & self , proxy : EventProxy , callback : & mut Box < dyn EventHandler + ' static > ) {
210
+ match proxy {
211
+ EventProxy :: HiDpiFactorChangedProxy {
212
+ ns_window,
213
+ suggested_size,
214
+ hidpi_factor,
215
+ } => self . handle_hidpi_factor_changed_event (
216
+ callback,
217
+ ns_window,
218
+ suggested_size,
219
+ hidpi_factor,
220
+ ) ,
221
+ }
222
+ }
171
223
}
172
224
173
225
pub enum AppState { }
@@ -176,16 +228,16 @@ impl AppState {
176
228
// This function extends lifetime of `callback` to 'static as its side effect
177
229
pub unsafe fn set_callback < F , T > ( callback : F , window_target : Rc < RootWindowTarget < T > > )
178
230
where
179
- F : FnMut ( Event < T > , & RootWindowTarget < T > , & mut ControlFlow ) ,
231
+ F : FnMut ( Event < ' _ , T > , & RootWindowTarget < T > , & mut ControlFlow ) ,
180
232
{
181
233
* HANDLER . callback . lock ( ) . unwrap ( ) = Some ( Box :: new ( EventLoopHandler {
182
234
// This transmute is always safe, in case it was reached through `run`, since our
183
235
// lifetime will be already 'static. In other cases caller should ensure that all data
184
236
// they passed to callback will actually outlive it, some apps just can't move
185
237
// everything to event loop, so this is something that they should care about.
186
238
callback : mem:: transmute :: <
187
- Box < dyn FnMut ( Event < T > , & RootWindowTarget < T > , & mut ControlFlow ) > ,
188
- Box < dyn FnMut ( Event < T > , & RootWindowTarget < T > , & mut ControlFlow ) > ,
239
+ Box < dyn FnMut ( Event < ' _ , T > , & RootWindowTarget < T > , & mut ControlFlow ) > ,
240
+ Box < dyn FnMut ( Event < ' _ , T > , & RootWindowTarget < T > , & mut ControlFlow ) > ,
189
241
> ( Box :: new ( callback) ) ,
190
242
will_exit : false ,
191
243
window_target,
@@ -194,7 +246,7 @@ impl AppState {
194
246
195
247
pub fn exit ( ) {
196
248
HANDLER . set_in_callback ( true ) ;
197
- HANDLER . handle_nonuser_event ( Event :: LoopDestroyed ) ;
249
+ HANDLER . handle_nonuser_event ( EventWrapper :: StaticEvent ( Event :: LoopDestroyed ) ) ;
198
250
HANDLER . set_in_callback ( false ) ;
199
251
HANDLER . callback . lock ( ) . unwrap ( ) . take ( ) ;
200
252
}
@@ -203,7 +255,9 @@ impl AppState {
203
255
HANDLER . set_ready ( ) ;
204
256
HANDLER . waker ( ) . start ( ) ;
205
257
HANDLER . set_in_callback ( true ) ;
206
- HANDLER . handle_nonuser_event ( Event :: NewEvents ( StartCause :: Init ) ) ;
258
+ HANDLER . handle_nonuser_event ( EventWrapper :: StaticEvent ( Event :: NewEvents (
259
+ StartCause :: Init ,
260
+ ) ) ) ;
207
261
HANDLER . set_in_callback ( false ) ;
208
262
}
209
263
@@ -234,7 +288,7 @@ impl AppState {
234
288
ControlFlow :: Exit => StartCause :: Poll , //panic!("unexpected `ControlFlow::Exit`"),
235
289
} ;
236
290
HANDLER . set_in_callback ( true ) ;
237
- HANDLER . handle_nonuser_event ( Event :: NewEvents ( cause) ) ;
291
+ HANDLER . handle_nonuser_event ( EventWrapper :: StaticEvent ( Event :: NewEvents ( cause) ) ) ;
238
292
HANDLER . set_in_callback ( false ) ;
239
293
}
240
294
@@ -246,18 +300,18 @@ impl AppState {
246
300
}
247
301
}
248
302
249
- pub fn queue_event ( event : Event < Never > ) {
303
+ pub fn queue_event ( wrapper : EventWrapper ) {
250
304
if !unsafe { msg_send ! [ class!( NSThread ) , isMainThread] } {
251
- panic ! ( "Event queued from different thread: {:#?}" , event ) ;
305
+ panic ! ( "Event queued from different thread: {:#?}" , wrapper ) ;
252
306
}
253
- HANDLER . events ( ) . push_back ( event ) ;
307
+ HANDLER . events ( ) . push_back ( wrapper ) ;
254
308
}
255
309
256
- pub fn queue_events ( mut events : VecDeque < Event < Never > > ) {
310
+ pub fn queue_events ( mut wrappers : VecDeque < EventWrapper > ) {
257
311
if !unsafe { msg_send ! [ class!( NSThread ) , isMainThread] } {
258
- panic ! ( "Events queued from different thread: {:#?}" , events ) ;
312
+ panic ! ( "Events queued from different thread: {:#?}" , wrappers ) ;
259
313
}
260
- HANDLER . events ( ) . append ( & mut events ) ;
314
+ HANDLER . events ( ) . append ( & mut wrappers ) ;
261
315
}
262
316
263
317
pub fn cleared ( ) {
@@ -270,11 +324,13 @@ impl AppState {
270
324
for event in HANDLER . take_events ( ) {
271
325
HANDLER . handle_nonuser_event ( event) ;
272
326
}
273
- HANDLER . handle_nonuser_event ( Event :: MainEventsCleared ) ;
327
+ HANDLER . handle_nonuser_event ( EventWrapper :: StaticEvent ( Event :: MainEventsCleared ) ) ;
274
328
for window_id in HANDLER . should_redraw ( ) {
275
- HANDLER . handle_nonuser_event ( Event :: RedrawRequested ( window_id) ) ;
329
+ HANDLER . handle_nonuser_event ( EventWrapper :: StaticEvent ( Event :: RedrawRequested (
330
+ window_id,
331
+ ) ) ) ;
276
332
}
277
- HANDLER . handle_nonuser_event ( Event :: RedrawEventsCleared ) ;
333
+ HANDLER . handle_nonuser_event ( EventWrapper :: StaticEvent ( Event :: RedrawEventsCleared ) ) ;
278
334
HANDLER . set_in_callback ( false ) ;
279
335
}
280
336
if HANDLER . should_exit ( ) {
0 commit comments