[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