view src/events/SDL_resize.c @ 3877:81f66f258d77 SDL-1.2

Fixed bug #281 ------- Comment #2 From Christian Walther 2006-07-23 07:37 [reply] ------- Wow, that was an interesting bug to chase. It was a timing issue: it seems that for some reason, a certain time must pass between ShowMenuBar() being called in QZ_UnsetVideoMode() and the application quitting. Before rev. 1885, this delay was provided by the slow hand-coded fade. With the asynchronous Core Graphics fading introduced in rev. 1885, that delay was no longer present (most of the time) and the bug became apparent. Adding an SDL_Delay(100) somewhere between ShowMenuBar() and the end of QZ_VideoQuit() lowered the frequency of the bug appearing from "almost every time" to "very rarely" here. However, there is another solution: doing the ShowMenuBar() before releasing the captured display instead of afterwards. Apparently, no delay is necessary in that case, and it looks nicer to me anyway because it is the reverse order of the way things are set up in the beginning: capture display - set video mode - hide menu bar - ... - show menu bar - reset video mode - release captured display. So, this is what the attached patch does. In addition, I've taken the liberty of - removing some unused code that I forgot to remove in rev. 1885, - fixing two warnings about undeclared functions in SDL_QuartzVideo.m by including OpenGL.h (whose name is a bit misleading - it only declares CGL stuff, so there's no interference with SDL_opengl.h).
author Sam Lantinga <slouken@libsdl.org>
date Sun, 24 Sep 2006 01:27:40 +0000
parents d910939febfa
children a1b03ba2fcd0
line wrap: on
line source

/*
    SDL - Simple DirectMedia Layer
    Copyright (C) 1997-2006 Sam Lantinga

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library 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
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

    Sam Lantinga
    slouken@libsdl.org
*/
#include "SDL_config.h"

/* Resize event handling code for SDL */

#include "SDL_events.h"
#include "SDL_events_c.h"
#include "../video/SDL_sysvideo.h"


/* Keep the last resize event so we don't post duplicates */
static struct {
	int w;
	int h;
} last_resize;

/* This is global for SDL_eventloop.c */
int SDL_PrivateResize(int w, int h)
{
	int posted;
	SDL_Event events[32];

	/* See if this event would change the video surface */
	if ( !w || !h
#ifndef __OS2__
            || ((last_resize.w == w) && (last_resize.h == h))
#endif
    ) {
		return(0);
	}
        last_resize.w = w;
        last_resize.h = h;
	if ( ! SDL_VideoSurface ||
	     ((w == SDL_VideoSurface->w) && (h == SDL_VideoSurface->h)) ) {
		return(0);
	}

	/* Pull out all old resize events */
	SDL_PeepEvents(events, sizeof(events)/sizeof(events[0]),
	                    SDL_GETEVENT, SDL_VIDEORESIZEMASK);

	/* Post the event, if desired */
	posted = 0;
	if ( SDL_ProcessEvents[SDL_VIDEORESIZE] == SDL_ENABLE ) {
		SDL_Event event;
		event.type = SDL_VIDEORESIZE;
		event.resize.w = w;
		event.resize.h = h;
		if ( (SDL_EventOK == NULL) || (*SDL_EventOK)(&event) ) {
			posted = 1;
			SDL_PushEvent(&event);
		}
	}
	return(posted);
}