Fixes for OpenGL on Haiku. SDL-1.2
authorRyan C. Gordon <icculus@icculus.org>
Thu, 04 Aug 2011 01:44:32 -0400
branchSDL-1.2
changeset 5599 5d7e82c63e84
parent 5576 538c2b7689b8
child 5606 cf638ceb1f2c
Fixes for OpenGL on Haiku. testgl now passes when this patch is used. This patch was originally from Urias McCullough (umccullough).
src/video/bwindow/SDL_BWin.h
src/video/bwindow/SDL_sysevents.cc
--- a/src/video/bwindow/SDL_BWin.h	Wed Jul 20 16:35:04 2011 -0700
+++ b/src/video/bwindow/SDL_BWin.h	Thu Aug 04 01:44:32 2011 -0400
@@ -112,7 +112,7 @@
 			if ( SDL_GLView == NULL ) {
 				SDL_GLView = new BGLView(Bounds(), "SDL GLView",
 					 	B_FOLLOW_ALL_SIDES, (B_WILL_DRAW|B_FRAME_EVENTS),
-					 	gl_flags);
+					 	gl_flags|BGL_DOUBLE);
 				SDL_GLView->EnableDirectMode(true);
 			}
 			if ( the_view != SDL_GLView ) {
@@ -133,17 +133,17 @@
 			}
 			if ( the_view != SDL_View ) {
 				if ( the_view ) {
-#if SDL_VIDEO_OPENGL
-					if ( the_view == SDL_GLView ) {
-						SDL_GLView->UnlockGL();
-					}
-#endif
 					RemoveChild(the_view);
 				}
 				AddChild(SDL_View);
 				the_view = SDL_View;
 			}
 		}
+#if SDL_VIDEO_OPENGL
+		if ( the_view == SDL_GLView ) {
+			SDL_GLView->UnlockGL();
+		}
+#endif
 		Unlock();
 		return(retval);
 	}
@@ -191,8 +191,8 @@
 #if SDL_VIDEO_OPENGL
 	virtual void SwapBuffers(void) {
 		SDL_GLView->UnlockGL();
+		SDL_GLView->SwapBuffers();
 		SDL_GLView->LockGL();
-		SDL_GLView->SwapBuffers();
 	}
 #endif
 	virtual BView *View(void) {
@@ -215,6 +215,11 @@
 			   the application should respond to the quit request,
 			   or ignore it as desired.
 			 */
+#if SDL_VIDEO_OPENGL
+			if ( SDL_GLView != NULL ) {
+				SDL_GLView->EnableDirectMode(false);
+			}
+#endif
 			return(false);
 		}
 		return(true);	/* Close the app window */
--- a/src/video/bwindow/SDL_sysevents.cc	Wed Jul 20 16:35:04 2011 -0700
+++ b/src/video/bwindow/SDL_sysevents.cc	Thu Aug 04 01:44:32 2011 -0400
@@ -36,6 +36,7 @@
 #include "../../events/SDL_sysevents.h"
 #include "../../events/SDL_events_c.h"
 #include "SDL_sysevents_c.h"
+#include "../SDL_cursor_c.h"
 
 void BE_PumpEvents(_THIS)
 {
@@ -203,11 +204,21 @@
 				if (transit == B_EXITED_VIEW) {
 					if ( SDL_GetAppState() & SDL_APPMOUSEFOCUS ) {
 						SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS);
+#if SDL_VIDEO_OPENGL
+					// for some reason, SDL_EraseCursor fails for OpenGL
+					if (this->the_view != this->SDL_GLView)
+#endif
+							SDL_EraseCursor(SDL_VideoSurface);
 						be_app->SetCursor(B_HAND_CURSOR);
 					}
 				} else {
 					if ( !(SDL_GetAppState() & SDL_APPMOUSEFOCUS) ) {
 						SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS);
+#if SDL_VIDEO_OPENGL
+					// for some reason, SDL_EraseCursor fails for OpenGL
+					if (this->the_view != this->SDL_GLView)
+#endif
+							SDL_EraseCursor(SDL_VideoSurface);
 						SDL_SetCursor(NULL);
 					}
 
@@ -395,4 +406,10 @@
 		default:
 			break;
 	}
+#if SDL_VIDEO_OPENGL
+	// If it is a BGLView, it is apparently required to
+	// call DirectConnected() on it as well
+	if (this->the_view == this->SDL_GLView)
+		this->SDL_GLView->DirectConnected(info);
+#endif	
 }