Codebase list icebreaker / HEAD fullscreen.c
HEAD

Tree @HEAD (Download .tar.gz)

fullscreen.c @HEADraw · history · blame

/*
* IceBreaker
* Copyright (c) 2002-2020 Matthew Miller <mattdm@mattdm.org> and
*   Enrico Tassi <gareuselesinge@infinito.it>
*
* <http://www.mattdm.org/icebreaker/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/


#include <SDL.h>
#include <stdlib.h>
#include "icebreaker.h"
#include "globals.h"
#include "laundry.h"
#include "options.h"
#include "text.h"
#include "titlebar.h"

int makefullscreen()
{
	SDL_Surface* fullscreensave = NULL;
	

	//for window manager caption -- the title bar
	char *curcaptiontitle=NULL,*curcaptionicon=NULL;
	char newcaptiontitle[35];


	
	if (screen!=NULL)
	{
		clean(); // very important!
		
		fullscreensave=SDL_CreateRGBSurface(SDL_SWSURFACE,WIDTH,HEIGHT,screen->format->BitsPerPixel,0,0,0,0);
		SDL_BlitSurface(screen, NULL, fullscreensave, NULL);
	
		// the resolution switch is ugly if we don't do this, since
		// sometimes the window gets resized a second before the mode
		// switch. ugh.
		SDL_FillRect(screen,NULL,SDL_MapRGB(screen->format, 0,  0,  0));
		SDL_UpdateRect(screen,0,0,0,0);
	}

	fullscreen = SDL_SetVideoMode(FULLWIDTH, FULLHEIGHT, VIDEODEPTH, SDL_SWSURFACE | SDL_FULLSCREEN );
	if (fullscreen == NULL)
	{
		// FIX -- if this happens, don't die: just stay in windowed
		// mode and return failure (and change calling code to
		// deal with the return value).
		fprintf(stderr, "Couldn't switch to full screen mode.\n"
		                "SDL error: "
		                "%s\n\n", SDL_GetError());
		exit(1);
	}	
	
	screen = NULL;
	
	// very clever idea from Enrico
	screen = SDL_CreateRGBSurfaceFrom(fullscreen->pixels +
	                fullscreen->format->BytesPerPixel * FULLLEFTMARGIN +
	                FULLTOPMARGIN*fullscreen->format->BytesPerPixel *  FULLWIDTH,
	                WIDTH, HEIGHT, VIDEODEPTH,
	                FULLWIDTH * fullscreen->format->BytesPerPixel,0,0,0,0);

	if (screen == NULL)
	{
		// fix -- same as above -- try to recover gracefully if this
		// happens
		fprintf(stderr, "Couldn't access full screen surface. That's not good.\n"
				"SDL error: "
				"%s\n\n", SDL_GetError());
				exit(1);
	}
	gameflags.isfullscreen=true;
	
	// if we wanted to something interesting in the border in full-screen
	// mode, here would be the place.
	SDL_FillRect(fullscreen,NULL,SDL_MapRGB(screen->format, 0,  0,  0));
	
	if (fullscreensave!=NULL)
		SDL_BlitSurface(fullscreensave, NULL, screen, NULL);

	// Set Window Caption For some odd reason, you can't feed the result
	// of GetCaption directly back into SetCaption. So we have to do this.
	SDL_WM_GetCaption(&curcaptiontitle, &curcaptionicon);
	if (curcaptiontitle != NULL && curcaptionicon != NULL)
	{
		snprintf(newcaptiontitle,35,"%s",curcaptiontitle);
		drawtitlebar(newcaptiontitle);
	}

	SDL_UpdateRect(fullscreen,0,0,0,0);
	
	SDL_FreeSurface(fullscreensave);
	
	
	// hmmm -- we might need to recalculate the colors if the video
	// depth happens to change when switching to fullscreen. could 
	// happen....
	
	return 0;
}

int makewindowed()
{
	SDL_Surface * fullscreensave=SDL_CreateRGBSurface(SDL_SWSURFACE,WIDTH,HEIGHT,screen->format->BitsPerPixel,0,0,0,0);

	clean(); // very important!
	
	SDL_BlitSurface(screen, NULL, fullscreensave, NULL);
	
	screen = SDL_SetVideoMode(WIDTH, HEIGHT, VIDEODEPTH, SDL_SWSURFACE);
	if (screen == NULL)
	{
		fprintf(stderr, "Couldn't switch to windowed screen mode.\n"
		                "SDL error: "
		                "%s\n\n", SDL_GetError());
		exit(1);
	}	
	gameflags.isfullscreen=false;
	
	SDL_BlitSurface(fullscreensave, NULL, screen, NULL);

	SDL_UpdateRect(screen,0,0,0,0);

	SDL_FreeSurface(fullscreensave);

	return 0;
}