Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2013-09-06 05:40:20 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-09-06 05:40:20 +0400
commit4320a7c9dfe6020b10ddc505d82c29ebc98192b5 (patch)
tree74259b2f9e8ca8b38607819d897704f6b3320632 /intern
parent8f3b4a77ef6836e6d377479fdf6060d3bab9ab22 (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.cpp22
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);