Browse Source

Fix missed grab state changes in SDL demos
Move grab handling out of `nk_sdl_handle_event` to `nk_sdl_handle_grab`,
which is now called outside of the event loop.
This change makes the logic similar to the GLFW demos and fixes issues
with missed grab state changes and mouse cursor disappearing.

paccer 1 year ago
parent
commit
e3b0f24626

+ 1 - 0
demo/sdl_opengl2/main.c

@@ -139,6 +139,7 @@ main(int argc, char *argv[])
             if (evt.type == SDL_QUIT) goto cleanup;
             nk_sdl_handle_event(&evt);
         }
+        nk_sdl_handle_grab(); /* optional grabbing behavior */
         nk_input_end(ctx);
 
         /* GUI */

+ 12 - 8
demo/sdl_opengl2/nuklear_sdl_gl2.h

@@ -233,21 +233,25 @@ nk_sdl_font_stash_end(void)
         nk_style_set_font(&sdl.ctx, &sdl.atlas.default_font->handle);
 }
 
-NK_API int
-nk_sdl_handle_event(SDL_Event *evt)
+NK_API void
+nk_sdl_handle_grab(void)
 {
     struct nk_context *ctx = &sdl.ctx;
-
-    /* optional grabbing behavior */
     if (ctx->input.mouse.grab) {
         SDL_SetRelativeMouseMode(SDL_TRUE);
-        ctx->input.mouse.grab = 0;
     } else if (ctx->input.mouse.ungrab) {
-        int x = (int)ctx->input.mouse.prev.x, y = (int)ctx->input.mouse.prev.y;
+        SDL_WarpMouseInWindow(sdl.win, (int)ctx->input.mouse.prev.x, (int)ctx->input.mouse.prev.y);
         SDL_SetRelativeMouseMode(SDL_FALSE);
-        SDL_WarpMouseInWindow(sdl.win, x, y);
-        ctx->input.mouse.ungrab = 0;
+    } else if (ctx->input.mouse.grabbed) {
+        ctx->input.mouse.pos.x = ctx->input.mouse.prev.x;
+        ctx->input.mouse.pos.y = ctx->input.mouse.prev.y;
     }
+}
+
+NK_API int
+nk_sdl_handle_event(SDL_Event *evt)
+{
+    struct nk_context *ctx = &sdl.ctx;
 
     switch(evt->type)
     {

+ 3 - 1
demo/sdl_opengl3/main.c

@@ -149,7 +149,9 @@ int main(int argc, char *argv[])
         while (SDL_PollEvent(&evt)) {
             if (evt.type == SDL_QUIT) goto cleanup;
             nk_sdl_handle_event(&evt);
-        } nk_input_end(ctx);
+        }
+        nk_sdl_handle_grab(); /* optional grabbing behavior */
+        nk_input_end(ctx);
 
         /* GUI */
         if (nk_begin(ctx, "Demo", nk_rect(50, 50, 230, 250),

+ 12 - 8
demo/sdl_opengl3/nuklear_sdl_gl3.h

@@ -342,21 +342,25 @@ nk_sdl_font_stash_end(void)
 
 }
 
-NK_API int
-nk_sdl_handle_event(SDL_Event *evt)
+NK_API void
+nk_sdl_handle_grab(void)
 {
     struct nk_context *ctx = &sdl.ctx;
-
-    /* optional grabbing behavior */
     if (ctx->input.mouse.grab) {
         SDL_SetRelativeMouseMode(SDL_TRUE);
-        ctx->input.mouse.grab = 0;
     } else if (ctx->input.mouse.ungrab) {
-        int x = (int)ctx->input.mouse.prev.x, y = (int)ctx->input.mouse.prev.y;
+        SDL_WarpMouseInWindow(sdl.win, (int)ctx->input.mouse.prev.x, (int)ctx->input.mouse.prev.y);
         SDL_SetRelativeMouseMode(SDL_FALSE);
-        SDL_WarpMouseInWindow(sdl.win, x, y);
-        ctx->input.mouse.ungrab = 0;
+    } else if (ctx->input.mouse.grabbed) {
+        ctx->input.mouse.pos.x = ctx->input.mouse.prev.x;
+        ctx->input.mouse.pos.y = ctx->input.mouse.prev.y;
     }
+}
+
+NK_API int
+nk_sdl_handle_event(SDL_Event *evt)
+{
+    struct nk_context *ctx = &sdl.ctx;
 
     switch(evt->type)
     {

+ 1 - 0
demo/sdl_opengles2/main.c

@@ -92,6 +92,7 @@ MainLoop(void* loopArg){
         if (evt.type == SDL_QUIT) running = nk_false;
         nk_sdl_handle_event(&evt);
     }
+    nk_sdl_handle_grab(); /* optional grabbing behavior */
     nk_input_end(ctx);
 
 

+ 12 - 8
demo/sdl_opengles2/nuklear_sdl_gles2.h

@@ -342,21 +342,25 @@ nk_sdl_font_stash_end(void)
 
 }
 
-NK_API int
-nk_sdl_handle_event(SDL_Event *evt)
+NK_API void
+nk_sdl_handle_grab(void)
 {
     struct nk_context *ctx = &sdl.ctx;
-
-    /* optional grabbing behavior */
     if (ctx->input.mouse.grab) {
         SDL_SetRelativeMouseMode(SDL_TRUE);
-        ctx->input.mouse.grab = 0;
     } else if (ctx->input.mouse.ungrab) {
-        int x = (int)ctx->input.mouse.prev.x, y = (int)ctx->input.mouse.prev.y;
+        SDL_WarpMouseInWindow(sdl.win, (int)ctx->input.mouse.prev.x, (int)ctx->input.mouse.prev.y);
         SDL_SetRelativeMouseMode(SDL_FALSE);
-        SDL_WarpMouseInWindow(sdl.win, x, y);
-        ctx->input.mouse.ungrab = 0;
+    } else if (ctx->input.mouse.grabbed) {
+        ctx->input.mouse.pos.x = ctx->input.mouse.prev.x;
+        ctx->input.mouse.pos.y = ctx->input.mouse.prev.y;
     }
+}
+
+NK_API int
+nk_sdl_handle_event(SDL_Event *evt)
+{
+    struct nk_context *ctx = &sdl.ctx;
 
     switch(evt->type)
     {

+ 1 - 0
demo/sdl_renderer/main.c

@@ -177,6 +177,7 @@ main(int argc, char *argv[])
             if (evt.type == SDL_QUIT) goto cleanup;
             nk_sdl_handle_event(&evt);
         }
+        nk_sdl_handle_grab(); /* optional grabbing behavior */
         nk_input_end(ctx);
 
         /* GUI */

+ 12 - 8
demo/sdl_renderer/nuklear_sdl_renderer.h

@@ -264,21 +264,25 @@ nk_sdl_font_stash_end(void)
         nk_style_set_font(&sdl.ctx, &sdl.atlas.default_font->handle);
 }
 
-NK_API int
-nk_sdl_handle_event(SDL_Event *evt)
+NK_API void
+nk_sdl_handle_grab(void)
 {
     struct nk_context *ctx = &sdl.ctx;
-
-    /* optional grabbing behavior */
     if (ctx->input.mouse.grab) {
         SDL_SetRelativeMouseMode(SDL_TRUE);
-        ctx->input.mouse.grab = 0;
     } else if (ctx->input.mouse.ungrab) {
-        int x = (int)ctx->input.mouse.prev.x, y = (int)ctx->input.mouse.prev.y;
+        SDL_WarpMouseInWindow(sdl.win, (int)ctx->input.mouse.prev.x, (int)ctx->input.mouse.prev.y);
         SDL_SetRelativeMouseMode(SDL_FALSE);
-        SDL_WarpMouseInWindow(sdl.win, x, y);
-        ctx->input.mouse.ungrab = 0;
+    } else if (ctx->input.mouse.grabbed) {
+        ctx->input.mouse.pos.x = ctx->input.mouse.prev.x;
+        ctx->input.mouse.pos.y = ctx->input.mouse.prev.y;
     }
+}
+
+NK_API int
+nk_sdl_handle_event(SDL_Event *evt)
+{
+    struct nk_context *ctx = &sdl.ctx;
 
     switch(evt->type)
     {