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.
This commit is contained in:
parent
24d6a47d73
commit
e3b0f24626
|
@ -139,6 +139,7 @@ main(int argc, char *argv[])
|
||||||
if (evt.type == SDL_QUIT) goto cleanup;
|
if (evt.type == SDL_QUIT) goto cleanup;
|
||||||
nk_sdl_handle_event(&evt);
|
nk_sdl_handle_event(&evt);
|
||||||
}
|
}
|
||||||
|
nk_sdl_handle_grab(); /* optional grabbing behavior */
|
||||||
nk_input_end(ctx);
|
nk_input_end(ctx);
|
||||||
|
|
||||||
/* GUI */
|
/* GUI */
|
||||||
|
|
|
@ -233,22 +233,26 @@ nk_sdl_font_stash_end(void)
|
||||||
nk_style_set_font(&sdl.ctx, &sdl.atlas.default_font->handle);
|
nk_style_set_font(&sdl.ctx, &sdl.atlas.default_font->handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NK_API void
|
||||||
|
nk_sdl_handle_grab(void)
|
||||||
|
{
|
||||||
|
struct nk_context *ctx = &sdl.ctx;
|
||||||
|
if (ctx->input.mouse.grab) {
|
||||||
|
SDL_SetRelativeMouseMode(SDL_TRUE);
|
||||||
|
} else if (ctx->input.mouse.ungrab) {
|
||||||
|
SDL_WarpMouseInWindow(sdl.win, (int)ctx->input.mouse.prev.x, (int)ctx->input.mouse.prev.y);
|
||||||
|
SDL_SetRelativeMouseMode(SDL_FALSE);
|
||||||
|
} 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_API int
|
||||||
nk_sdl_handle_event(SDL_Event *evt)
|
nk_sdl_handle_event(SDL_Event *evt)
|
||||||
{
|
{
|
||||||
struct nk_context *ctx = &sdl.ctx;
|
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_SetRelativeMouseMode(SDL_FALSE);
|
|
||||||
SDL_WarpMouseInWindow(sdl.win, x, y);
|
|
||||||
ctx->input.mouse.ungrab = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(evt->type)
|
switch(evt->type)
|
||||||
{
|
{
|
||||||
case SDL_KEYUP: /* KEYUP & KEYDOWN share same routine */
|
case SDL_KEYUP: /* KEYUP & KEYDOWN share same routine */
|
||||||
|
|
|
@ -149,7 +149,9 @@ int main(int argc, char *argv[])
|
||||||
while (SDL_PollEvent(&evt)) {
|
while (SDL_PollEvent(&evt)) {
|
||||||
if (evt.type == SDL_QUIT) goto cleanup;
|
if (evt.type == SDL_QUIT) goto cleanup;
|
||||||
nk_sdl_handle_event(&evt);
|
nk_sdl_handle_event(&evt);
|
||||||
} nk_input_end(ctx);
|
}
|
||||||
|
nk_sdl_handle_grab(); /* optional grabbing behavior */
|
||||||
|
nk_input_end(ctx);
|
||||||
|
|
||||||
/* GUI */
|
/* GUI */
|
||||||
if (nk_begin(ctx, "Demo", nk_rect(50, 50, 230, 250),
|
if (nk_begin(ctx, "Demo", nk_rect(50, 50, 230, 250),
|
||||||
|
|
|
@ -342,22 +342,26 @@ nk_sdl_font_stash_end(void)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NK_API void
|
||||||
|
nk_sdl_handle_grab(void)
|
||||||
|
{
|
||||||
|
struct nk_context *ctx = &sdl.ctx;
|
||||||
|
if (ctx->input.mouse.grab) {
|
||||||
|
SDL_SetRelativeMouseMode(SDL_TRUE);
|
||||||
|
} else if (ctx->input.mouse.ungrab) {
|
||||||
|
SDL_WarpMouseInWindow(sdl.win, (int)ctx->input.mouse.prev.x, (int)ctx->input.mouse.prev.y);
|
||||||
|
SDL_SetRelativeMouseMode(SDL_FALSE);
|
||||||
|
} 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_API int
|
||||||
nk_sdl_handle_event(SDL_Event *evt)
|
nk_sdl_handle_event(SDL_Event *evt)
|
||||||
{
|
{
|
||||||
struct nk_context *ctx = &sdl.ctx;
|
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_SetRelativeMouseMode(SDL_FALSE);
|
|
||||||
SDL_WarpMouseInWindow(sdl.win, x, y);
|
|
||||||
ctx->input.mouse.ungrab = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(evt->type)
|
switch(evt->type)
|
||||||
{
|
{
|
||||||
case SDL_KEYUP: /* KEYUP & KEYDOWN share same routine */
|
case SDL_KEYUP: /* KEYUP & KEYDOWN share same routine */
|
||||||
|
|
|
@ -92,6 +92,7 @@ MainLoop(void* loopArg){
|
||||||
if (evt.type == SDL_QUIT) running = nk_false;
|
if (evt.type == SDL_QUIT) running = nk_false;
|
||||||
nk_sdl_handle_event(&evt);
|
nk_sdl_handle_event(&evt);
|
||||||
}
|
}
|
||||||
|
nk_sdl_handle_grab(); /* optional grabbing behavior */
|
||||||
nk_input_end(ctx);
|
nk_input_end(ctx);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -342,22 +342,26 @@ nk_sdl_font_stash_end(void)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NK_API void
|
||||||
|
nk_sdl_handle_grab(void)
|
||||||
|
{
|
||||||
|
struct nk_context *ctx = &sdl.ctx;
|
||||||
|
if (ctx->input.mouse.grab) {
|
||||||
|
SDL_SetRelativeMouseMode(SDL_TRUE);
|
||||||
|
} else if (ctx->input.mouse.ungrab) {
|
||||||
|
SDL_WarpMouseInWindow(sdl.win, (int)ctx->input.mouse.prev.x, (int)ctx->input.mouse.prev.y);
|
||||||
|
SDL_SetRelativeMouseMode(SDL_FALSE);
|
||||||
|
} 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_API int
|
||||||
nk_sdl_handle_event(SDL_Event *evt)
|
nk_sdl_handle_event(SDL_Event *evt)
|
||||||
{
|
{
|
||||||
struct nk_context *ctx = &sdl.ctx;
|
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_SetRelativeMouseMode(SDL_FALSE);
|
|
||||||
SDL_WarpMouseInWindow(sdl.win, x, y);
|
|
||||||
ctx->input.mouse.ungrab = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(evt->type)
|
switch(evt->type)
|
||||||
{
|
{
|
||||||
case SDL_KEYUP: /* KEYUP & KEYDOWN share same routine */
|
case SDL_KEYUP: /* KEYUP & KEYDOWN share same routine */
|
||||||
|
|
|
@ -177,6 +177,7 @@ main(int argc, char *argv[])
|
||||||
if (evt.type == SDL_QUIT) goto cleanup;
|
if (evt.type == SDL_QUIT) goto cleanup;
|
||||||
nk_sdl_handle_event(&evt);
|
nk_sdl_handle_event(&evt);
|
||||||
}
|
}
|
||||||
|
nk_sdl_handle_grab(); /* optional grabbing behavior */
|
||||||
nk_input_end(ctx);
|
nk_input_end(ctx);
|
||||||
|
|
||||||
/* GUI */
|
/* GUI */
|
||||||
|
|
|
@ -264,22 +264,26 @@ nk_sdl_font_stash_end(void)
|
||||||
nk_style_set_font(&sdl.ctx, &sdl.atlas.default_font->handle);
|
nk_style_set_font(&sdl.ctx, &sdl.atlas.default_font->handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NK_API void
|
||||||
|
nk_sdl_handle_grab(void)
|
||||||
|
{
|
||||||
|
struct nk_context *ctx = &sdl.ctx;
|
||||||
|
if (ctx->input.mouse.grab) {
|
||||||
|
SDL_SetRelativeMouseMode(SDL_TRUE);
|
||||||
|
} else if (ctx->input.mouse.ungrab) {
|
||||||
|
SDL_WarpMouseInWindow(sdl.win, (int)ctx->input.mouse.prev.x, (int)ctx->input.mouse.prev.y);
|
||||||
|
SDL_SetRelativeMouseMode(SDL_FALSE);
|
||||||
|
} 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_API int
|
||||||
nk_sdl_handle_event(SDL_Event *evt)
|
nk_sdl_handle_event(SDL_Event *evt)
|
||||||
{
|
{
|
||||||
struct nk_context *ctx = &sdl.ctx;
|
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_SetRelativeMouseMode(SDL_FALSE);
|
|
||||||
SDL_WarpMouseInWindow(sdl.win, x, y);
|
|
||||||
ctx->input.mouse.ungrab = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(evt->type)
|
switch(evt->type)
|
||||||
{
|
{
|
||||||
case SDL_KEYUP: /* KEYUP & KEYDOWN share same routine */
|
case SDL_KEYUP: /* KEYUP & KEYDOWN share same routine */
|
||||||
|
|
Loading…
Reference in New Issue