@@ -72,55 +72,6 @@ static void twin_sdl_damage(twin_screen_t *screen, twin_sdl_t *tx)
7272 twin_screen_damage (screen , 0 , 0 , width , height );
7373}
7474
75- static bool twin_sdl_read_events (int file maybe_unused ,
76- twin_file_op_t ops maybe_unused ,
77- void * closure )
78- {
79- twin_screen_t * screen = SCREEN (closure );
80- twin_sdl_t * tx = PRIV (closure );
81-
82- SDL_Event ev ;
83- while (SDL_PollEvent (& ev )) {
84- twin_event_t tev ;
85- switch (ev .type ) {
86- case SDL_WINDOWEVENT :
87- if (ev .window .event == SDL_WINDOWEVENT_EXPOSED ||
88- ev .window .event == SDL_WINDOWEVENT_SHOWN ) {
89- twin_sdl_damage (screen , tx );
90- }
91- break ;
92- case SDL_QUIT :
93- _twin_sdl_destroy (screen , tx );
94- return false;
95- case SDL_MOUSEBUTTONDOWN :
96- case SDL_MOUSEBUTTONUP :
97- tev .u .pointer .screen_x = ev .button .x ;
98- tev .u .pointer .screen_y = ev .button .y ;
99- tev .u .pointer .button =
100- ((ev .button .state >> 8 ) | (1 << (ev .button .button - 1 )));
101- tev .kind = ((ev .type == SDL_MOUSEBUTTONDOWN ) ? TwinEventButtonDown
102- : TwinEventButtonUp );
103- twin_screen_dispatch (screen , & tev );
104- break ;
105- case SDL_KEYDOWN :
106- case SDL_KEYUP :
107- tev .u .key .key = ev .key .keysym .sym ;
108- tev .kind = ((ev .key .type == SDL_KEYDOWN ) ? TwinEventKeyDown
109- : TwinEventKeyUp );
110- twin_screen_dispatch (screen , & tev );
111- break ;
112- case SDL_MOUSEMOTION :
113- tev .u .pointer .screen_x = ev .motion .x ;
114- tev .u .pointer .screen_y = ev .motion .y ;
115- tev .kind = TwinEventMotion ;
116- tev .u .pointer .button = ev .motion .state ;
117- twin_screen_dispatch (screen , & tev );
118- break ;
119- }
120- }
121- return true;
122- }
123-
12475static bool twin_sdl_work (void * closure )
12576{
12677 twin_screen_t * screen = SCREEN (closure );
@@ -174,8 +125,6 @@ twin_context_t *twin_sdl_init(int width, int height)
174125 ctx -> screen = twin_screen_create (width , height , _twin_sdl_put_begin ,
175126 _twin_sdl_put_span , ctx );
176127
177- twin_set_file (twin_sdl_read_events , 0 , TWIN_READ , ctx );
178-
179128 twin_set_work (twin_sdl_work , TWIN_WORK_REDISPLAY , ctx );
180129
181130 return ctx ;
@@ -195,6 +144,53 @@ static void twin_sdl_configure(twin_context_t *ctx)
195144 twin_screen_resize (ctx -> screen , width , height );
196145}
197146
147+ static bool twin_sdl_poll (twin_context_t * ctx )
148+ {
149+ twin_screen_t * screen = SCREEN (ctx );
150+ twin_sdl_t * tx = PRIV (ctx );
151+
152+ SDL_Event ev ;
153+ while (SDL_PollEvent (& ev )) {
154+ twin_event_t tev ;
155+ switch (ev .type ) {
156+ case SDL_WINDOWEVENT :
157+ if (ev .window .event == SDL_WINDOWEVENT_EXPOSED ||
158+ ev .window .event == SDL_WINDOWEVENT_SHOWN ) {
159+ twin_sdl_damage (screen , tx );
160+ }
161+ break ;
162+ case SDL_QUIT :
163+ _twin_sdl_destroy (screen , tx );
164+ return false;
165+ case SDL_MOUSEBUTTONDOWN :
166+ case SDL_MOUSEBUTTONUP :
167+ tev .u .pointer .screen_x = ev .button .x ;
168+ tev .u .pointer .screen_y = ev .button .y ;
169+ tev .u .pointer .button =
170+ ((ev .button .state >> 8 ) | (1 << (ev .button .button - 1 )));
171+ tev .kind = ((ev .type == SDL_MOUSEBUTTONDOWN ) ? TwinEventButtonDown
172+ : TwinEventButtonUp );
173+ twin_screen_dispatch (screen , & tev );
174+ break ;
175+ case SDL_KEYDOWN :
176+ case SDL_KEYUP :
177+ tev .u .key .key = ev .key .keysym .sym ;
178+ tev .kind = ((ev .key .type == SDL_KEYDOWN ) ? TwinEventKeyDown
179+ : TwinEventKeyUp );
180+ twin_screen_dispatch (screen , & tev );
181+ break ;
182+ case SDL_MOUSEMOTION :
183+ tev .u .pointer .screen_x = ev .motion .x ;
184+ tev .u .pointer .screen_y = ev .motion .y ;
185+ tev .kind = TwinEventMotion ;
186+ tev .u .pointer .button = ev .motion .state ;
187+ twin_screen_dispatch (screen , & tev );
188+ break ;
189+ }
190+ }
191+ return true;
192+ }
193+
198194static void twin_sdl_exit (twin_context_t * ctx )
199195{
200196 if (!ctx )
@@ -209,5 +205,6 @@ static void twin_sdl_exit(twin_context_t *ctx)
209205const twin_backend_t g_twin_backend = {
210206 .init = twin_sdl_init ,
211207 .configure = twin_sdl_configure ,
208+ .poll = twin_sdl_poll ,
212209 .exit = twin_sdl_exit ,
213210};
0 commit comments