[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59863] trunk/blender/intern/ghost/intern/ GHOST_SystemSDL.cpp: fix for bug in GHOST/SDL, events dont always have a window (which ghost needs).

Campbell Barton ideasman42 at gmail.com
Fri Sep 6 03:40:22 CEST 2013


Revision: 59863
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59863
Author:   campbellbarton
Date:     2013-09-06 01:40:20 +0000 (Fri, 06 Sep 2013)
Log Message:
-----------
fix for bug in GHOST/SDL, events dont always have a window (which ghost needs).
fallback to the window with the active opengl context.

Modified Paths:
--------------
    trunk/blender/intern/ghost/intern/GHOST_SystemSDL.cpp

Modified: trunk/blender/intern/ghost/intern/GHOST_SystemSDL.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_SystemSDL.cpp	2013-09-05 23:09:14 UTC (rev 59862)
+++ trunk/blender/intern/ghost/intern/GHOST_SystemSDL.cpp	2013-09-06 01:40:20 UTC (rev 59863)
@@ -276,6 +276,18 @@
 }
 #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 @@
 		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 @@
 		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_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 @@
 		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 @@
 			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);




More information about the Bf-blender-cvs mailing list