[Commits] SDL: Fixed some problems with switching to/from fullscreen

libsdl.org revision control commits-owner at libsdl.org
Thu Sep 15 20:57:23 PDT 2011


details:   http://hg.libsdl.org/SDL/rev/74870d003e32
changeset: 5937:74870d003e32
user:      Nathan Heisey <nathanheisey at gmail.com>
date:      Wed Aug 17 13:31:18 2011 +0000
description:
Fixed some problems with switching to/from fullscreen

diffstat:

 src/SDL_compat.c                 |   2 +-
 src/video/bwindow/SDL_BWin.h     |   5 ++-
 src/video/bwindow/SDL_bmodes.cc  |  66 ++++++++++++++++++++++++++++++---------
 src/video/bwindow/SDL_bwindow.cc |   2 +-
 4 files changed, 57 insertions(+), 18 deletions(-)

diffs (181 lines):

diff -r 116b7457e73a -r 74870d003e32 src/SDL_compat.c
--- a/src/SDL_compat.c	Fri Aug 12 16:58:54 2011 +0000
+++ b/src/SDL_compat.c	Wed Aug 17 13:31:18 2011 +0000
@@ -848,7 +848,7 @@
     /* Copy the old bits out */
     length = SDL_PublicSurface->w * SDL_PublicSurface->format->BytesPerPixel;
     pixels = SDL_malloc(SDL_PublicSurface->h * length);
-    if (pixels) {
+    if (pixels && SDL_PublicSurface->pixels) {
         src = (Uint8*)SDL_PublicSurface->pixels;
         dst = (Uint8*)pixels;
         for (row = 0; row < SDL_PublicSurface->h; ++row) {
diff -r 116b7457e73a -r 74870d003e32 src/video/bwindow/SDL_BWin.h
--- a/src/video/bwindow/SDL_BWin.h	Fri Aug 12 16:58:54 2011 +0000
+++ b/src/video/bwindow/SDL_BWin.h	Wed Aug 17 13:31:18 2011 +0000
@@ -98,8 +98,10 @@
 #if SDL_VIDEO_OPENGL
         if (_SDL_GLView) {
             _SDL_GLView->UnlockGL();
+            RemoveChild(_SDL_GLView);	/* Why was this outside the if
+            								statement before? */
         }
-        RemoveChild(_SDL_GLView);
+        
 #endif    
         Unlock();
 #if SDL_VIDEO_OPENGL
@@ -129,6 +131,7 @@
                                      gl_flags);
         }
         AddChild(_SDL_GLView);
+        _SDL_GLView->EnableDirectMode(true);
         _SDL_GLView->LockGL();	/* "New" GLViews are created */
         Unlock();
         return (_SDL_GLView);
diff -r 116b7457e73a -r 74870d003e32 src/video/bwindow/SDL_bmodes.cc
--- a/src/video/bwindow/SDL_bmodes.cc	Fri Aug 12 16:58:54 2011 +0000
+++ b/src/video/bwindow/SDL_bmodes.cc	Wed Aug 17 13:31:18 2011 +0000
@@ -32,12 +32,12 @@
 extern "C" {
 #endif
 
+#if 1
 /* This wrapper is here so that the driverdata can be freed */
 typedef struct SDL_DisplayModeData {
 	display_mode *bmode;
 };
-
-
+#endif
 
 static inline SDL_BWin *_ToBeWin(SDL_Window *window) {
 	return ((SDL_BWin*)(window->driverdata));
@@ -47,6 +47,13 @@
 	return ((SDL_BApp*)be_app);
 }
 
+static inline display_mode * _ExtractBMode(SDL_DisplayMode *mode) {
+#if 0
+	return (display_mode*)(mode->driverdata);
+#else
+	return ((SDL_DisplayModeData*)mode->driverdata)->bmode;
+#endif
+}
 
 /* Copied from haiku/trunk/src/preferences/screen/ScreenMode.cpp */
 static float get_refresh_rate(display_mode &mode) {
@@ -114,9 +121,14 @@
 	mode->w = bmode->virtual_width;
 	mode->h = bmode->virtual_height;
 	mode->refresh_rate = (int)get_refresh_rate(*bmode);
+#if 1
 	SDL_DisplayModeData *data = (SDL_DisplayModeData*)SDL_calloc(1, sizeof(SDL_DisplayModeData));
 	data->bmode = bmode;
+	
 	mode->driverdata = data;
+#else
+	mode->driverdata = bmode;
+#endif
 
 	/* Set the format */
 	int32 bpp = ColorSpaceToBitsPerPixel(bmode->space);
@@ -127,14 +139,15 @@
 void BE_AddDisplay(BScreen *screen) {
 	SDL_VideoDisplay display;
 	SDL_DisplayMode *mode = (SDL_DisplayMode*)SDL_calloc(1, sizeof(SDL_DisplayMode));
-	display_mode bmode;
-	screen->GetMode(&bmode);
+	display_mode *bmode = (display_mode*)SDL_calloc(1, sizeof(display_mode));
+	screen->GetMode(bmode);
 
-	BE_BDisplayModeToSdlDisplayMode(&bmode, mode);
+	BE_BDisplayModeToSdlDisplayMode(bmode, mode);
 	
 	SDL_zero(display);
 	display.desktop_mode = *mode;
 	display.current_mode = *mode;
+	
 	SDL_AddVideoDisplay(&display);
 }
 
@@ -142,20 +155,19 @@
 	BScreen screen;
 	
 	/* Save the current display mode */
-	display_mode *prevMode;
-	screen.GetMode(prevMode);
-	_GetBeApp()->SetPrevMode(prevMode);
+//	display_mode *prevMode;
+//	screen.GetMode(prevMode);
+//	_GetBeApp()->SetPrevMode(prevMode);
 
 	/* Only one possible video display right now */
 	BE_AddDisplay(&screen);
 }
 
 int BE_QuitModes(_THIS) {
-/*	printf(__FILE__": %d; Begin quit\n", __LINE__);*/
 	/* Restore the previous video mode */
 	BScreen screen;
-	display_mode *savedMode = _GetBeApp()->GetPrevMode();
-	screen.SetMode(savedMode);
+//	display_mode *savedMode = _GetBeApp()->GetPrevMode();
+//	screen.SetMode(savedMode);
 	return 0;
 }
 
@@ -197,13 +209,37 @@
 int BE_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode){
 	/* Get the current screen */
 	BScreen bscreen;
-	
+	if(!bscreen.IsValid()) {
+		printf(__FILE__": %d - ERROR: BAD SCREEN\n", __LINE__);
+	}
+
 	/* Set the mode using the driver data */
-	display_mode *bmode = ((SDL_DisplayModeData*)mode->driverdata)->bmode;
-	if(bscreen.SetMode(bmode) == B_OK) {
+	display_mode *bmode = _ExtractBMode(mode);
+
+	status_t s;
+	if((s = bscreen.SetMode(bmode)) == B_OK) {
 		return 0;	/* No error */
 	}
-	
+printf(__FILE__": %d - ERROR: FAILED TO CHANGE VIDEO MODE; s = %i, status = B_BAD_VALUE? %i\n", __LINE__, s, s == B_BAD_VALUE);
+	display_mode *bmode_list;
+	uint32 count;
+	bscreen.GetModeList(&bmode_list, &count);
+	s = bscreen.ProposeMode(bmode, &bmode_list[count - 1], &bmode_list[0]);
+	switch(s) {
+	case B_OK:
+		printf(__FILE__": %d - B_OK\n", __LINE__);
+		break;
+	case B_BAD_VALUE:
+		printf(__FILE__": %d - B_BAD_VALUE\n", __LINE__);
+		break;
+	case B_ERROR:
+		printf(__FILE__": %d - B_ERROR\n", __LINE__);
+		break;
+	default:
+		printf(__FILE__": %d - (unknown error code)\n", __LINE__);
+		break;
+	}
+	free(bmode_list);
 	return -1;
 }
 
diff -r 116b7457e73a -r 74870d003e32 src/video/bwindow/SDL_bwindow.cc
--- a/src/video/bwindow/SDL_bwindow.cc	Fri Aug 12 16:58:54 2011 +0000
+++ b/src/video/bwindow/SDL_bwindow.cc	Wed Aug 17 13:31:18 2011 +0000
@@ -51,7 +51,7 @@
     if(window->flags & SDL_WINDOW_OPENGL) {
     }
     if(!(window->flags & SDL_WINDOW_RESIZABLE)) {
-    	flags |= B_NOT_RESIZABLE;
+    	flags |= B_NOT_RESIZABLE | B_NOT_ZOOMABLE;
     }
     if(window->flags & SDL_WINDOW_BORDERLESS) {
     }


More information about the commits mailing list