diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-09-06 05:40:20 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-09-06 05:40:20 +0400 |
commit | 4320a7c9dfe6020b10ddc505d82c29ebc98192b5 (patch) | |
tree | 74259b2f9e8ca8b38607819d897704f6b3320632 /intern | |
parent | 8f3b4a77ef6836e6d377479fdf6060d3bab9ab22 (diff) |
fix for bug in GHOST/SDL, events dont always have a window (which ghost needs).
fallback to the window with the active opengl context.
Diffstat (limited to 'intern')
-rw-r--r-- | intern/ghost/intern/GHOST_SystemSDL.cpp | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/intern/ghost/intern/GHOST_SystemSDL.cpp b/intern/ghost/intern/GHOST_SystemSDL.cpp index 48ea3afd5e1..1d2401e6f71 100644 --- a/intern/ghost/intern/GHOST_SystemSDL.cpp +++ b/intern/ghost/intern/GHOST_SystemSDL.cpp @@ -276,6 +276,18 @@ convertSDLKey(SDL_Scancode key) } #undef GXMAP +/** + * Events don't always have valid windows, + * but GHOST needs a window _always_. fallback to the GL window. + */ +static SDL_Window *SDL_GetWindowFromID_fallback(Uint32 id) +{ + SDL_Window *sdl_win = SDL_GetWindowFromID(id); + if (sdl_win == NULL) { + sdl_win = SDL_GL_GetCurrentWindow(); + } + return sdl_win; +} void GHOST_SystemSDL::processEvent(SDL_Event *sdl_event) @@ -286,7 +298,7 @@ GHOST_SystemSDL::processEvent(SDL_Event *sdl_event) case SDL_WINDOWEVENT: { SDL_WindowEvent &sdl_sub_evt = sdl_event->window; - GHOST_WindowSDL *window = findGhostWindow(SDL_GetWindowFromID(sdl_sub_evt.windowID)); + GHOST_WindowSDL *window = findGhostWindow(SDL_GetWindowFromID_fallback(sdl_sub_evt.windowID)); //assert(window != NULL); // can be NULL on close window. switch (sdl_sub_evt.event) { @@ -318,7 +330,7 @@ GHOST_SystemSDL::processEvent(SDL_Event *sdl_event) case SDL_MOUSEMOTION: { SDL_MouseMotionEvent &sdl_sub_evt = sdl_event->motion; - SDL_Window *sdl_win = SDL_GetWindowFromID(sdl_sub_evt.windowID); + SDL_Window *sdl_win = SDL_GetWindowFromID_fallback(sdl_sub_evt.windowID); GHOST_WindowSDL *window = findGhostWindow(sdl_win); assert(window != NULL); @@ -379,7 +391,7 @@ GHOST_SystemSDL::processEvent(SDL_Event *sdl_event) GHOST_TButtonMask gbmask = GHOST_kButtonMaskLeft; GHOST_TEventType type = (sdl_sub_evt.state == SDL_PRESSED) ? GHOST_kEventButtonDown : GHOST_kEventButtonUp; - GHOST_WindowSDL *window = findGhostWindow(SDL_GetWindowFromID(sdl_sub_evt.windowID)); + GHOST_WindowSDL *window = findGhostWindow(SDL_GetWindowFromID_fallback(sdl_sub_evt.windowID)); assert(window != NULL); /* process rest of normal mouse buttons */ @@ -403,7 +415,7 @@ GHOST_SystemSDL::processEvent(SDL_Event *sdl_event) case SDL_MOUSEWHEEL: { SDL_MouseWheelEvent &sdl_sub_evt = sdl_event->wheel; - GHOST_WindowSDL *window = findGhostWindow(SDL_GetWindowFromID(sdl_sub_evt.windowID)); + GHOST_WindowSDL *window = findGhostWindow(SDL_GetWindowFromID_fallback(sdl_sub_evt.windowID)); assert(window != NULL); g_event = new GHOST_EventWheel(getMilliSeconds(), window, sdl_sub_evt.y); } @@ -415,7 +427,7 @@ GHOST_SystemSDL::processEvent(SDL_Event *sdl_event) SDL_Keycode sym = sdl_sub_evt.keysym.sym; GHOST_TEventType type = (sdl_sub_evt.state == SDL_PRESSED) ? GHOST_kEventKeyDown : GHOST_kEventKeyUp; - GHOST_WindowSDL *window = findGhostWindow(SDL_GetWindowFromID(sdl_sub_evt.windowID)); + GHOST_WindowSDL *window = findGhostWindow(SDL_GetWindowFromID_fallback(sdl_sub_evt.windowID)); assert(window != NULL); GHOST_TKey gkey = convertSDLKey(sdl_sub_evt.keysym.scancode); |