mirror of
https://github.com/Relintai/sdl2_frt.git
synced 2024-12-16 11:06:49 +01:00
simplify fullscreen handling using new fullscreen_strategy api, patch contributed by Charlie Birks
This commit is contained in:
parent
be08cc61f9
commit
bdca510fd6
@ -472,59 +472,19 @@ Emscripten_HandleKeyPress(int eventType, const EmscriptenKeyboardEvent *keyEvent
|
|||||||
EM_BOOL
|
EM_BOOL
|
||||||
Emscripten_HandleFullscreenChange(int eventType, const EmscriptenFullscreenChangeEvent *fullscreenChangeEvent, void *userData)
|
Emscripten_HandleFullscreenChange(int eventType, const EmscriptenFullscreenChangeEvent *fullscreenChangeEvent, void *userData)
|
||||||
{
|
{
|
||||||
/*make sure this is actually our element going fullscreen*/
|
|
||||||
if(SDL_strcmp(fullscreenChangeEvent->id, "SDLFullscreenElement") != 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
SDL_WindowData *window_data = userData;
|
SDL_WindowData *window_data = userData;
|
||||||
if(fullscreenChangeEvent->isFullscreen)
|
if(fullscreenChangeEvent->isFullscreen)
|
||||||
{
|
{
|
||||||
SDL_bool is_desktop_fullscreen;
|
SDL_bool is_desktop_fullscreen;
|
||||||
window_data->window->flags |= window_data->requested_fullscreen_mode;
|
window_data->window->flags |= window_data->requested_fullscreen_mode;
|
||||||
|
|
||||||
if(!window_data->requested_fullscreen_mode)
|
|
||||||
window_data->window->flags |= SDL_WINDOW_FULLSCREEN_DESKTOP; /*we didn't reqest fullscreen*/
|
|
||||||
|
|
||||||
window_data->requested_fullscreen_mode = 0;
|
window_data->requested_fullscreen_mode = 0;
|
||||||
|
|
||||||
is_desktop_fullscreen = (window_data->window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP;
|
if(!window_data->requested_fullscreen_mode)
|
||||||
|
window_data->window->flags |= SDL_WINDOW_FULLSCREEN; /*we didn't reqest fullscreen*/
|
||||||
/*update size*/
|
|
||||||
if(window_data->window->flags & SDL_WINDOW_RESIZABLE || is_desktop_fullscreen)
|
|
||||||
{
|
|
||||||
emscripten_set_canvas_size(fullscreenChangeEvent->screenWidth, fullscreenChangeEvent->screenHeight);
|
|
||||||
SDL_SendWindowEvent(window_data->window, SDL_WINDOWEVENT_RESIZED, fullscreenChangeEvent->screenWidth, fullscreenChangeEvent->screenHeight);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/*preserve ratio*/
|
|
||||||
double w = window_data->window->w;
|
|
||||||
double h = window_data->window->h;
|
|
||||||
double factor = SDL_min(fullscreenChangeEvent->screenWidth / w, fullscreenChangeEvent->screenHeight / h);
|
|
||||||
emscripten_set_element_css_size(NULL, w * factor, h * factor);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
EM_ASM({
|
|
||||||
//un-reparent canvas (similar to Module.requestFullscreen)
|
|
||||||
var canvas = Module['canvas'];
|
|
||||||
if(canvas.parentNode.id == "SDLFullscreenElement") {
|
|
||||||
var canvasContainer = canvas.parentNode;
|
|
||||||
canvasContainer.parentNode.insertBefore(canvas, canvasContainer);
|
|
||||||
canvasContainer.parentNode.removeChild(canvasContainer);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
double unscaled_w = window_data->windowed_width / window_data->pixel_ratio;
|
|
||||||
double unscaled_h = window_data->windowed_height / window_data->pixel_ratio;
|
|
||||||
emscripten_set_canvas_size(window_data->windowed_width, window_data->windowed_height);
|
|
||||||
|
|
||||||
if (!window_data->external_size && window_data->pixel_ratio != 1.0f) {
|
|
||||||
emscripten_set_element_css_size(NULL, unscaled_w, unscaled_h);
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_SendWindowEvent(window_data->window, SDL_WINDOWEVENT_RESIZED, unscaled_w, unscaled_h);
|
|
||||||
|
|
||||||
window_data->window->flags &= ~FULLSCREEN_MASK;
|
window_data->window->flags &= ~FULLSCREEN_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -535,17 +495,7 @@ EM_BOOL
|
|||||||
Emscripten_HandleResize(int eventType, const EmscriptenUiEvent *uiEvent, void *userData)
|
Emscripten_HandleResize(int eventType, const EmscriptenUiEvent *uiEvent, void *userData)
|
||||||
{
|
{
|
||||||
SDL_WindowData *window_data = userData;
|
SDL_WindowData *window_data = userData;
|
||||||
if(window_data->window->flags & FULLSCREEN_MASK)
|
if(!(window_data->window->flags & FULLSCREEN_MASK))
|
||||||
{
|
|
||||||
SDL_bool is_desktop_fullscreen = (window_data->window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP;
|
|
||||||
|
|
||||||
if(window_data->window->flags & SDL_WINDOW_RESIZABLE || is_desktop_fullscreen)
|
|
||||||
{
|
|
||||||
emscripten_set_canvas_size(uiEvent->windowInnerWidth * window_data->pixel_ratio, uiEvent->windowInnerHeight * window_data->pixel_ratio);
|
|
||||||
SDL_SendWindowEvent(window_data->window, SDL_WINDOWEVENT_RESIZED, uiEvent->windowInnerWidth, uiEvent->windowInnerHeight);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
/* this will only work if the canvas size is set through css */
|
/* this will only work if the canvas size is set through css */
|
||||||
if(window_data->window->flags & SDL_WINDOW_RESIZABLE)
|
if(window_data->window->flags & SDL_WINDOW_RESIZABLE)
|
||||||
@ -571,6 +521,22 @@ Emscripten_HandleResize(int eventType, const EmscriptenUiEvent *uiEvent, void *u
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EM_BOOL
|
||||||
|
Emscripten_HandleCanvasResize(int eventType, const void *reserved, void *userData)
|
||||||
|
{
|
||||||
|
/*this is used during fullscreen changes*/
|
||||||
|
SDL_WindowData *window_data = userData;
|
||||||
|
|
||||||
|
if(window_data->fullscreen_resize)
|
||||||
|
{
|
||||||
|
double css_w, css_h;
|
||||||
|
emscripten_get_element_css_size(NULL, &css_w, &css_h);
|
||||||
|
SDL_SendWindowEvent(window_data->window, SDL_WINDOWEVENT_RESIZED, css_w, css_h);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
EM_BOOL
|
EM_BOOL
|
||||||
Emscripten_HandleVisibilityChange(int eventType, const EmscriptenVisibilityChangeEvent *visEvent, void *userData)
|
Emscripten_HandleVisibilityChange(int eventType, const EmscriptenVisibilityChangeEvent *visEvent, void *userData)
|
||||||
{
|
{
|
||||||
|
@ -30,6 +30,9 @@ Emscripten_RegisterEventHandlers(SDL_WindowData *data);
|
|||||||
|
|
||||||
extern void
|
extern void
|
||||||
Emscripten_UnregisterEventHandlers(SDL_WindowData *data);
|
Emscripten_UnregisterEventHandlers(SDL_WindowData *data);
|
||||||
|
|
||||||
|
extern int
|
||||||
|
Emscripten_HandleCanvasResize(int eventType, const void *reserved, void *userData);
|
||||||
#endif /* _SDL_emscriptenevents_h */
|
#endif /* _SDL_emscriptenevents_h */
|
||||||
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
/* vi: set ts=4 sw=4 expandtab: */
|
||||||
|
@ -218,9 +218,6 @@ Emscripten_CreateWindow(_THIS, SDL_Window * window)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wdata->windowed_width = scaled_w;
|
|
||||||
wdata->windowed_height = scaled_h;
|
|
||||||
|
|
||||||
if (window->flags & SDL_WINDOW_OPENGL) {
|
if (window->flags & SDL_WINDOW_OPENGL) {
|
||||||
if (!_this->egl_data) {
|
if (!_this->egl_data) {
|
||||||
if (SDL_GL_LoadLibrary(NULL) < 0) {
|
if (SDL_GL_LoadLibrary(NULL) < 0) {
|
||||||
@ -290,24 +287,30 @@ Emscripten_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * di
|
|||||||
data = (SDL_WindowData *) window->driverdata;
|
data = (SDL_WindowData *) window->driverdata;
|
||||||
|
|
||||||
if(fullscreen) {
|
if(fullscreen) {
|
||||||
|
EmscriptenFullscreenStrategy strategy;
|
||||||
|
SDL_bool is_desktop_fullscreen = (window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP;
|
||||||
|
|
||||||
|
strategy.scaleMode = is_desktop_fullscreen ? EMSCRIPTEN_FULLSCREEN_SCALE_STRETCH : EMSCRIPTEN_FULLSCREEN_SCALE_ASPECT;
|
||||||
|
|
||||||
|
if(!is_desktop_fullscreen) {
|
||||||
|
strategy.canvasResolutionScaleMode = EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_NONE;
|
||||||
|
} else if(window->flags & SDL_WINDOW_ALLOW_HIGHDPI) {
|
||||||
|
strategy.canvasResolutionScaleMode = EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_HIDEF;
|
||||||
|
} else {
|
||||||
|
strategy.canvasResolutionScaleMode = EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_STDDEF;
|
||||||
|
}
|
||||||
|
|
||||||
|
strategy.filteringMode = EMSCRIPTEN_FULLSCREEN_FILTERING_DEFAULT;
|
||||||
|
|
||||||
|
strategy.canvasResizedCallback = Emscripten_HandleCanvasResize;
|
||||||
|
strategy.canvasResizedCallbackUserData = data;
|
||||||
|
|
||||||
data->requested_fullscreen_mode = window->flags & (SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_FULLSCREEN);
|
data->requested_fullscreen_mode = window->flags & (SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_FULLSCREEN);
|
||||||
|
data->fullscreen_resize = is_desktop_fullscreen;
|
||||||
/*unset the fullscreen flags as we're not actually fullscreen yet*/
|
/*unset the fullscreen flags as we're not actually fullscreen yet*/
|
||||||
window->flags &= ~(SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_FULLSCREEN);
|
window->flags &= ~(SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_FULLSCREEN);
|
||||||
|
|
||||||
EM_ASM({
|
emscripten_request_fullscreen_strategy(NULL, 1, &strategy);
|
||||||
//reparent canvas (similar to Module.requestFullscreen)
|
|
||||||
var canvas = Module['canvas'];
|
|
||||||
if(canvas.parentNode.id != "SDLFullscreenElement") {
|
|
||||||
var canvasContainer = document.createElement("div");
|
|
||||||
canvasContainer.id = "SDLFullscreenElement";
|
|
||||||
canvas.parentNode.insertBefore(canvasContainer, canvas);
|
|
||||||
canvasContainer.appendChild(canvas);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
int is_fullscreen;
|
|
||||||
emscripten_get_canvas_size(&data->windowed_width, &data->windowed_height, &is_fullscreen);
|
|
||||||
emscripten_request_fullscreen("SDLFullscreenElement", 1);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
emscripten_exit_fullscreen();
|
emscripten_exit_fullscreen();
|
||||||
|
@ -38,14 +38,12 @@ typedef struct SDL_WindowData
|
|||||||
SDL_Window *window;
|
SDL_Window *window;
|
||||||
SDL_Surface *surface;
|
SDL_Surface *surface;
|
||||||
|
|
||||||
int windowed_width;
|
|
||||||
int windowed_height;
|
|
||||||
|
|
||||||
float pixel_ratio;
|
float pixel_ratio;
|
||||||
|
|
||||||
SDL_bool external_size;
|
SDL_bool external_size;
|
||||||
|
|
||||||
int requested_fullscreen_mode;
|
int requested_fullscreen_mode;
|
||||||
|
SDL_bool fullscreen_resize;
|
||||||
|
|
||||||
SDL_bool finger_touching; /* for mapping touch events to mice */
|
SDL_bool finger_touching; /* for mapping touch events to mice */
|
||||||
SDL_FingerID first_finger;
|
SDL_FingerID first_finger;
|
||||||
|
Loading…
Reference in New Issue
Block a user