From da42ee37cfd316c260665cf32499894d041f0693 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 12 Feb 2011 19:02:14 -0800 Subject: [PATCH] Fixed bug #1117 There's a new event that's always sent when the window changes size, and that event is what the renderers listen for to determine if they need to rebind their context. --- include/SDL_video.h | 3 ++- src/events/SDL_windowevents.c | 3 ++- src/render/opengl/SDL_render_gl.c | 2 +- src/render/opengles/SDL_render_gles.c | 2 +- src/render/opengles2/SDL_render_gles2.c | 2 +- src/render/software/SDL_render_sw.c | 2 +- src/video/SDL_video.c | 8 +++++++- src/video/directfb/SDL_DirectFB_render.c | 2 +- 8 files changed, 16 insertions(+), 8 deletions(-) diff --git a/include/SDL_video.h b/include/SDL_video.h index 8868b638a..cd978c685 100644 --- a/include/SDL_video.h +++ b/include/SDL_video.h @@ -140,7 +140,8 @@ typedef enum redrawn */ SDL_WINDOWEVENT_MOVED, /**< Window has been moved to data1, data2 */ - SDL_WINDOWEVENT_RESIZED, /**< Window size changed to data1xdata2 */ + SDL_WINDOWEVENT_RESIZED, /**< Window has been resized to data1xdata2 */ + SDL_WINDOWEVENT_SIZE_CHANGED, /**< The window size has changed, either as a result of an API call or through the system or user changing the window size. */ SDL_WINDOWEVENT_MINIMIZED, /**< Window has been minimized */ SDL_WINDOWEVENT_MAXIMIZED, /**< Window has been maximized */ SDL_WINDOWEVENT_RESTORED, /**< Window has been restored to normal size diff --git a/src/events/SDL_windowevents.c b/src/events/SDL_windowevents.c index 75b911183..463635dab 100644 --- a/src/events/SDL_windowevents.c +++ b/src/events/SDL_windowevents.c @@ -35,7 +35,8 @@ RemovePendingSizeEvents(void * userdata, SDL_Event *event) SDL_Event *new_event = (SDL_Event *)userdata; if (event->type == SDL_WINDOWEVENT && - event->window.event == SDL_WINDOWEVENT_RESIZED && + (event->window.event == SDL_WINDOWEVENT_RESIZED || + event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED) && event->window.windowID == new_event->window.windowID) { /* We're about to post a new size event, drop the old one */ return 0; diff --git a/src/render/opengl/SDL_render_gl.c b/src/render/opengl/SDL_render_gl.c index 327c41354..526e3dd8f 100644 --- a/src/render/opengl/SDL_render_gl.c +++ b/src/render/opengl/SDL_render_gl.c @@ -348,7 +348,7 @@ GL_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event) { GL_RenderData *data = (GL_RenderData *) renderer->driverdata; - if (event->event == SDL_WINDOWEVENT_RESIZED) { + if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED) { /* Rebind the context to the window area and update matrices */ SDL_CurrentContext = NULL; data->updateSize = SDL_TRUE; diff --git a/src/render/opengles/SDL_render_gles.c b/src/render/opengles/SDL_render_gles.c index 7f2818880..a7d6a14bd 100644 --- a/src/render/opengles/SDL_render_gles.c +++ b/src/render/opengles/SDL_render_gles.c @@ -261,7 +261,7 @@ GLES_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event) { GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata; - if (event->event == SDL_WINDOWEVENT_RESIZED) { + if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED) { /* Rebind the context to the window area and update matrices */ SDL_CurrentContext = NULL; data->updateSize = SDL_TRUE; diff --git a/src/render/opengles2/SDL_render_gles2.c b/src/render/opengles2/SDL_render_gles2.c index 348ae459b..53e5561ec 100644 --- a/src/render/opengles2/SDL_render_gles2.c +++ b/src/render/opengles2/SDL_render_gles2.c @@ -170,7 +170,7 @@ GLES2_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event) { GLES2_DriverContext *rdata = (GLES2_DriverContext *)renderer->driverdata; - if (event->event == SDL_WINDOWEVENT_RESIZED) { + if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED) { /* Rebind the context to the window area */ SDL_CurrentContext = NULL; rdata->updateSize = SDL_TRUE; diff --git a/src/render/software/SDL_render_sw.c b/src/render/software/SDL_render_sw.c index 5be313f0a..d77404ff4 100644 --- a/src/render/software/SDL_render_sw.c +++ b/src/render/software/SDL_render_sw.c @@ -173,7 +173,7 @@ SW_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event) { SW_RenderData *data = (SW_RenderData *) renderer->driverdata; - if (event->event == SDL_WINDOWEVENT_RESIZED) { + if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED) { data->updateSize = SDL_TRUE; } } diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 314c3e6b3..be95910ce 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -1431,10 +1431,15 @@ SDL_SetWindowSize(SDL_Window * window, int w, int h) /* FIXME: Should this change fullscreen modes? */ if (!(window->flags & SDL_WINDOW_FULLSCREEN)) { + window->w = w; + window->h = h; if (_this->SetWindowSize) { _this->SetWindowSize(_this, window); } - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, w, h); + if (window->w == w && window->h == h) { + /* We didn't get a SDL_WINDOWEVENT_RESIZED event (by design) */ + SDL_OnWindowResized(window); + } } } @@ -1706,6 +1711,7 @@ void SDL_OnWindowResized(SDL_Window * window) { window->surface_valid = SDL_FALSE; + SDL_SendWindowEvent(window, SDL_WINDOWEVENT_SIZE_CHANGED, window->w, window->h); } void diff --git a/src/video/directfb/SDL_DirectFB_render.c b/src/video/directfb/SDL_DirectFB_render.c index 153fbb104..8ab584cd5 100644 --- a/src/video/directfb/SDL_DirectFB_render.c +++ b/src/video/directfb/SDL_DirectFB_render.c @@ -279,7 +279,7 @@ DirectFB_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event) { SDL_DFB_RENDERERDATA(renderer); - if (event->event == SDL_WINDOWEVENT_RESIZED) { + if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED) { /* Rebind the context to the window area and update matrices */ //SDL_CurrentContext = NULL; //data->updateSize = SDL_TRUE;