@@ -14,6 +14,24 @@ use sdl2::{
14
14
15
15
use crate :: { OutputImage , OutputSettings , SimulatorDisplay } ;
16
16
17
+ struct SdlContext {
18
+ video_subsystem : sdl2:: VideoSubsystem ,
19
+ event_pump : EventPump ,
20
+ }
21
+
22
+ thread_local ! {
23
+ static SDL_CONTEXT : std:: cell:: RefCell <SdlContext > = {
24
+ let sdl_context = sdl2:: init( ) . unwrap( ) ;
25
+ let video_subsystem = sdl_context. video( ) . unwrap( ) ;
26
+ let event_pump = sdl_context. event_pump( ) . unwrap( ) ;
27
+
28
+ std:: cell:: RefCell :: new( SdlContext {
29
+ video_subsystem,
30
+ event_pump,
31
+ } )
32
+ } ;
33
+ }
34
+
17
35
/// A derivation of [`sdl2::event::Event`] mapped to embedded-graphics coordinates
18
36
#[ derive( Copy , Clone , Debug , PartialEq , Eq ) ]
19
37
pub enum SimulatorEvent {
@@ -67,7 +85,6 @@ pub enum SimulatorEvent {
67
85
68
86
pub struct SdlWindow {
69
87
canvas : Canvas < sdl2:: video:: Window > ,
70
- event_pump : EventPump ,
71
88
window_texture : SdlWindowTexture ,
72
89
size : Size ,
73
90
}
@@ -81,19 +98,18 @@ impl SdlWindow {
81
98
where
82
99
C : PixelColor + Into < Rgb888 > ,
83
100
{
84
- let sdl_context = sdl2:: init ( ) . unwrap ( ) ;
85
- let video_subsystem = sdl_context. video ( ) . unwrap ( ) ;
86
-
87
101
let size = output_settings. framebuffer_size ( display) ;
88
102
89
- let window = video_subsystem
90
- . window ( title, size. width , size. height )
91
- . position_centered ( )
92
- . build ( )
93
- . unwrap ( ) ;
103
+ let window = SDL_CONTEXT . with ( |ctx| {
104
+ ctx. borrow_mut ( )
105
+ . video_subsystem
106
+ . window ( title, size. width , size. height )
107
+ . position_centered ( )
108
+ . build ( )
109
+ . unwrap ( )
110
+ } ) ;
94
111
95
112
let canvas = window. into_canvas ( ) . build ( ) . unwrap ( ) ;
96
- let event_pump = sdl_context. event_pump ( ) . unwrap ( ) ;
97
113
98
114
let window_texture = SdlWindowTextureBuilder {
99
115
texture_creator : canvas. texture_creator ( ) ,
@@ -107,7 +123,6 @@ impl SdlWindow {
107
123
108
124
Self {
109
125
canvas,
110
- event_pump,
111
126
window_texture,
112
127
size,
113
128
}
@@ -138,8 +153,11 @@ impl SdlWindow {
138
153
output_settings : & OutputSettings ,
139
154
) -> impl Iterator < Item = SimulatorEvent > + ' _ {
140
155
let output_settings = output_settings. clone ( ) ;
141
- self . event_pump
142
- . poll_iter ( )
156
+ let events: Vec < Event > =
157
+ SDL_CONTEXT . with ( |ctx| ctx. borrow_mut ( ) . event_pump . poll_iter ( ) . collect ( ) ) ;
158
+ events
159
+ . into_iter ( )
160
+ . filter ( |e| e. get_window_id ( ) == Some ( self . canvas . window ( ) . id ( ) ) )
143
161
. filter_map ( move |event| match event {
144
162
Event :: Quit { .. }
145
163
| Event :: KeyDown {
0 commit comments