From 04be166879cb32f3a188f3d3382dde62cf29e590 Mon Sep 17 00:00:00 2001 From: Nathan Heisey Date: Wed, 17 Aug 2011 13:31:18 +0000 Subject: [PATCH] Fixed some problems with switching to/from fullscreen --- 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(-) diff --git a/src/SDL_compat.c b/src/SDL_compat.c index 013dd22b1..dd3fc7371 100644 --- a/src/SDL_compat.c +++ b/src/SDL_compat.c @@ -848,7 +848,7 @@ SDL_WM_ToggleFullScreen(SDL_Surface * surface) /* 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 --git a/src/video/bwindow/SDL_BWin.h b/src/video/bwindow/SDL_BWin.h index 192bfc59e..2bb982eb3 100644 --- a/src/video/bwindow/SDL_BWin.h +++ b/src/video/bwindow/SDL_BWin.h @@ -98,8 +98,10 @@ class SDL_BWin:public BDirectWindow #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 @@ class SDL_BWin:public BDirectWindow gl_flags); } AddChild(_SDL_GLView); + _SDL_GLView->EnableDirectMode(true); _SDL_GLView->LockGL(); /* "New" GLViews are created */ Unlock(); return (_SDL_GLView); diff --git a/src/video/bwindow/SDL_bmodes.cc b/src/video/bwindow/SDL_bmodes.cc index a75801433..245e84d4f 100644 --- a/src/video/bwindow/SDL_bmodes.cc +++ b/src/video/bwindow/SDL_bmodes.cc @@ -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 @@ static inline SDL_BApp *_GetBeApp() { 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 @@ static inline void BE_BDisplayModeToSdlDisplayMode(display_mode *bmode, 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 @@ static inline void BE_BDisplayModeToSdlDisplayMode(display_mode *bmode, 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 @@ int BE_InitModes(_THIS) { 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 @@ void BE_GetDisplayModes(_THIS, SDL_VideoDisplay *display) { 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 --git a/src/video/bwindow/SDL_bwindow.cc b/src/video/bwindow/SDL_bwindow.cc index 2297fc800..de2b3ca69 100644 --- a/src/video/bwindow/SDL_bwindow.cc +++ b/src/video/bwindow/SDL_bwindow.cc @@ -51,7 +51,7 @@ int _InitWindow(_THIS, SDL_Window *window) { 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) { }