diff --git a/src/conio/sdl_con.c b/src/conio/sdl_con.c index e151e0b655ab88bb30ae7a7f8a65caed92da4eb6..935c78e0b948f7e8b4b2fd035081cb06b860fb1f 100644 --- a/src/conio/sdl_con.c +++ b/src/conio/sdl_con.c @@ -665,6 +665,11 @@ static void setup_surfaces_locked(struct video_stats *vs) sdl.DestroyTexture(texture); texture = newtexture; } + if (vs != &vstat) { + pthread_mutex_lock(&vstatlock); + *vs = vstat; + pthread_mutex_unlock(&vstatlock); + } sdl.SetWindowMinimumSize(win, idealmw, idealmh); if(win!=NULL) { @@ -686,14 +691,13 @@ static void setup_surfaces(void) } /* Called from event thread only */ -static void sdl_add_key(unsigned int keyval) +static void sdl_add_key(unsigned int keyval, struct video_stats *vs) { - if(keyval==0xa600) { + if(keyval==0xa600 && vs != NULL) { fullscreen=!fullscreen; cio_api.mode=fullscreen?CIOLIB_MODE_SDL_FULLSCREEN:CIOLIB_MODE_SDL; sdl.SetWindowFullscreen(win, fullscreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0); - // TODO: This uses vstat from the video event thread... - setup_surfaces(); + setup_surfaces_locked(vs); return; } if(keyval <= 0xffff) { @@ -787,7 +791,7 @@ static unsigned int sdl_get_char_code(unsigned int keysym, unsigned int mod) } static void -sdl_add_keys(uint8_t *utf8s) +sdl_add_keys(uint8_t *utf8s, struct video_stats *vs) { char *chars; char *p; @@ -795,7 +799,7 @@ sdl_add_keys(uint8_t *utf8s) chars = utf8_to_cp(getcodepage(), utf8s, '\x00', strlen((char *)utf8s), NULL); if (chars) { for (p = chars; *p; p++) { - sdl_add_key(*((uint8_t *)p)); + sdl_add_key(*((uint8_t *)p), vs); } free(chars); } @@ -807,7 +811,7 @@ static void sdl_mouse_thread(void *data) SetThreadName("SDL Mouse"); while(1) { if(mouse_wait()) - sdl_add_key(CIO_KEY_MOUSE); + sdl_add_key(CIO_KEY_MOUSE, NULL); } } @@ -945,11 +949,11 @@ void sdl_video_event_thread(void *data) || ev.key.keysym.sym == SDLK_KP_PLUS || ev.key.keysym.sym == SDLK_KP_PERIOD)) break; - sdl_add_key(sdl_get_char_code(ev.key.keysym.sym, ev.key.keysym.mod)); + sdl_add_key(sdl_get_char_code(ev.key.keysym.sym, ev.key.keysym.mod), &cvstat); } else if (!isprint(ev.key.keysym.sym)) { if (ev.key.keysym.sym < 128) - sdl_add_key(ev.key.keysym.sym); + sdl_add_key(ev.key.keysym.sym, &cvstat); } break; case SDL_TEXTINPUT: @@ -957,9 +961,9 @@ void sdl_video_event_thread(void *data) unsigned int charcode = sdl_get_char_code(last_sym, last_mod & ~(KMOD_ALT)); // If the key is exactly what we would expect, use sdl_get_char_code() if (*(uint8_t *)ev.text.text == charcode) - sdl_add_key(sdl_get_char_code(last_sym, last_mod)); + sdl_add_key(sdl_get_char_code(last_sym, last_mod), &cvstat); else - sdl_add_keys((uint8_t *)ev.text.text); + sdl_add_keys((uint8_t *)ev.text.text, &cvstat); } break; case SDL_KEYUP: @@ -1025,7 +1029,7 @@ void sdl_video_event_thread(void *data) if (ciolib_reaper) sdl_user_func(SDL_USEREVENT_QUIT); else - sdl_add_key(CIO_KEY_QUIT); + sdl_add_key(CIO_KEY_QUIT, &cvstat); break; case SDL_WINDOWEVENT: switch(ev.window.event) {