fix fullscreen sometimes losing state

This commit is contained in:
Toad King 2018-01-14 15:19:37 -06:00
parent fca639ad84
commit c8f03b4640

View File

@ -43,10 +43,11 @@ typedef struct
#endif #endif
unsigned fb_width; unsigned fb_width;
unsigned fb_height; unsigned fb_height;
int initial_width;
int initial_height;
} emscripten_ctx_data_t; } emscripten_ctx_data_t;
static int emscripten_initial_width;
static int emscripten_initial_height;
static void gfx_ctx_emscripten_swap_interval(void *data, unsigned interval) static void gfx_ctx_emscripten_swap_interval(void *data, unsigned interval)
{ {
(void)data; (void)data;
@ -78,7 +79,8 @@ static void gfx_ctx_emscripten_get_canvas_size(int *width, int *height)
if (r != EMSCRIPTEN_RESULT_SUCCESS) if (r != EMSCRIPTEN_RESULT_SUCCESS)
{ {
RARCH_ERR("[EMSCRIPTEN/EGL]: Could not get screen dimensions: %d\n", r); RARCH_ERR("[EMSCRIPTEN/EGL]: Could not get screen dimensions: %d\n",
r);
*width = 800; *width = 800;
*height = 600; *height = 600;
} }
@ -97,8 +99,8 @@ static void gfx_ctx_emscripten_check_window(void *data, bool *quit,
if (input_width == 0 || input_height == 0) if (input_width == 0 || input_height == 0)
{ {
input_width = emscripten->initial_width; input_width = emscripten_initial_width;
input_height = emscripten->initial_height; input_height = emscripten_initial_height;
emscripten->fb_width = emscripten->fb_height = 0; emscripten->fb_width = emscripten->fb_height = 0;
} }
@ -106,10 +108,11 @@ static void gfx_ctx_emscripten_check_window(void *data, bool *quit,
*height = (unsigned)input_height; *height = (unsigned)input_height;
*resize = false; *resize = false;
if (input_width != emscripten->fb_width || input_height != emscripten->fb_height) if (input_width != emscripten->fb_width ||
input_height != emscripten->fb_height)
{ {
printf("RESIZE: %dx%d\n", input_width, input_height); r = emscripten_set_canvas_element_size("#canvas",
r = emscripten_set_canvas_element_size("#canvas", input_width, input_height); input_width, input_height);
if (r != EMSCRIPTEN_RESULT_SUCCESS) if (r != EMSCRIPTEN_RESULT_SUCCESS)
{ {
@ -117,7 +120,8 @@ static void gfx_ctx_emscripten_check_window(void *data, bool *quit,
} }
/* fix Module.requestFullscreen messing with the canvas size */ /* fix Module.requestFullscreen messing with the canvas size */
r = emscripten_set_element_css_size("#canvas", (double)input_width, (double)input_height); r = emscripten_set_element_css_size("#canvas",
(double)input_width, (double)input_height);
if (r != EMSCRIPTEN_RESULT_SUCCESS) if (r != EMSCRIPTEN_RESULT_SUCCESS)
{ {
@ -125,6 +129,7 @@ static void gfx_ctx_emscripten_check_window(void *data, bool *quit,
} }
*resize = true; *resize = true;
emscripten_reinit_video = true;
} }
emscripten->fb_width = (unsigned)input_width; emscripten->fb_width = (unsigned)input_width;
@ -156,7 +161,8 @@ static void gfx_ctx_emscripten_destroy(void *data)
free(data); free(data);
} }
static void *gfx_ctx_emscripten_init(video_frame_info_t *video_info, void *video_driver) static void *gfx_ctx_emscripten_init(video_frame_info_t *video_info,
void *video_driver)
{ {
#ifdef HAVE_EGL #ifdef HAVE_EGL
unsigned width, height; unsigned width, height;
@ -186,7 +192,9 @@ static void *gfx_ctx_emscripten_init(video_frame_info_t *video_info, void *video
(void)video_driver; (void)video_driver;
emscripten_get_canvas_element_size("#canvas", &emscripten->initial_width, &emscripten->initial_height); if (emscripten_initial_width == 0 || emscripten_initial_height == 0)
emscripten_get_canvas_element_size("#canvas",
&emscripten_initial_width, &emscripten_initial_height);
#ifdef HAVE_EGL #ifdef HAVE_EGL
if (g_egl_inited) if (g_egl_inited)
@ -195,8 +203,8 @@ static void *gfx_ctx_emscripten_init(video_frame_info_t *video_info, void *video
return (void*)"emscripten"; return (void*)"emscripten";
} }
if (!egl_init_context(&emscripten->egl, EGL_NONE, (void *)EGL_DEFAULT_DISPLAY, if (!egl_init_context(&emscripten->egl, EGL_NONE,
&major, &minor, &n, attribute_list)) (void *)EGL_DEFAULT_DISPLAY, &major, &minor, &n, attribute_list))
{ {
egl_report_error(); egl_report_error();
goto error; goto error;