Mercurial > sdl-ios-xcode
view src/video/x11/SDL_x11mouse.c @ 2723:911db724ea24
Couriersud fixed bug #603
Using the following sequence
SDL_Init(..:)
SDL_CreateWindow(..., SDL_WINDOW_OPENGL)
SDL_DestroyWindow
SDL_CreateWindow(..., SDL_WINDOW_OPENGL)
SDL will crash in X11_GL_GetVisual. This is due to the fact that
during SDL_DestroyWindow X11_GL_Shutdown was called because the last window
has been closed.
On the next call to SDL_CreateWindow the library is still loaded and only the
memory is reinitialized. Function pointers such as gl_data->glXChooseVisual
will not be reinitialized.
Consequently, SDL will crash due to a NULL pointer access.
The attached patch corrects the behaviour.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Tue, 26 Aug 2008 02:47:26 +0000 |
parents | 44e49d3fa6cf |
children | 6fc50bdd88c0 |
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" #include "SDL_x11video.h" #include "../../events/SDL_mouse_c.h" void X11_InitMouse(_THIS) { extern XDevice **SDL_XDevices; XDevice **newDevices; int i, j, index = 0, numOfDevices; extern int SDL_NumOfXDevices; XDeviceInfo *DevList; XAnyClassPtr deviceClass; SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; /* we're getting the list of input devices */ DevList = XListInputDevices(data->display, &numOfDevices); SDL_XDevices = (XDevice **) SDL_malloc(sizeof(XDevice)); /* we're aquiring valuators:mices, tablets, etc. */ for (i = 0; i < numOfDevices; ++i) { /* if it's the core pointer or core keyborard we don't want it */ if ((DevList[i].use != IsXPointer && DevList[i].use != IsXKeyboard)) { /* we have to check all of the device classes */ deviceClass = DevList[i].inputclassinfo; for (j = 0; j < DevList[i].num_classes; ++j) { if (deviceClass->class == ValuatorClass) { /* bingo ;) */ XValuatorInfo *valInfo; SDL_Mouse mouse; newDevices = (XDevice **) SDL_realloc(SDL_XDevices, (index + 1) * sizeof(*newDevices)); if (!newDevices) { SDL_OutOfMemory(); return; } SDL_XDevices = newDevices; SDL_XDevices[index] = XOpenDevice(data->display, DevList[i].id); SDL_zero(mouse); /* the id of the device differs from its index * so we're assigning the index of a device to it's id */ SDL_SetMouseIndexId(DevList[i].id, index); /* lets get the device parameters */ valInfo = (XValuatorInfo *) deviceClass; /* if the device reports pressure, lets check it parameteres */ if (valInfo->num_axes > 2) { data->mouse = SDL_AddMouse(&mouse, index++, DevList[i].name, valInfo->axes[2].max_value, valInfo->axes[2].min_value, 1); } else { data->mouse = SDL_AddMouse(&mouse, index++, DevList[i].name, 0, 0, 1); } break; } /* if it's not class we're interested in, lets go further */ deviceClass = (XAnyClassPtr) ((char *) deviceClass + deviceClass->length); } } } XFreeDeviceList(DevList); SDL_NumOfXDevices = index; } void X11_QuitMouse(_THIS) { SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; /* let's delete all of the mice */ SDL_MouseQuit(); } /* vi: set ts=4 sw=4 expandtab: */