Fixed many valgrind errors. But, I broke testdyngl.
--- a/src/video/x11/SDL_x11events.c Thu Mar 06 17:08:10 2008 +0000
+++ b/src/video/x11/SDL_x11events.c Thu Mar 06 23:07:02 2008 +0000
@@ -51,10 +51,15 @@
}
data = NULL;
- for (i = 0; i < videodata->numwindows; ++i) {
- if (videodata->windowlist[i]->window == xevent.xany.window) {
- data = videodata->windowlist[i];
+ if (videodata &&
+ videodata->windowlist) {
+ for (i = 0; i < videodata->numwindows; ++i) {
+ if ((videodata->windowlist[i] != NULL) &&
+ (videodata->windowlist[i]->window == xevent.xany.window)) {
+ data = videodata->windowlist[i];
+ break;
}
+ }
}
if (!data) {
return;
--- a/src/video/x11/SDL_x11keyboard.c Thu Mar 06 17:08:10 2008 +0000
+++ b/src/video/x11/SDL_x11keyboard.c Thu Mar 06 23:07:02 2008 +0000
@@ -330,7 +330,7 @@
}
}
if (j == SDL_arraysize(fingerprint)) {
- printf("Using scancode set %d\n", i);
+ /* printf("Using scancode set %d\n", i); */
SDL_memcpy(&data->key_layout[min_keycode], scancode_set[i].table,
sizeof(SDL_scancode) * scancode_set[i].table_size);
fingerprint_detected = SDL_TRUE;
--- a/src/video/x11/SDL_x11opengl.c Thu Mar 06 17:08:10 2008 +0000
+++ b/src/video/x11/SDL_x11opengl.c Thu Mar 06 23:07:02 2008 +0000
@@ -254,7 +254,7 @@
_this->gl_data->glXDestroyContext(display, context);
}
XDestroyWindow(display, w);
- /* X11_PumpEvents(_this); */ /* can't do that because the windowlist may be inconsitent at this point */
+ X11_PumpEvents(_this);
}
static int
--- a/src/video/x11/SDL_x11video.c Thu Mar 06 17:08:10 2008 +0000
+++ b/src/video/x11/SDL_x11video.c Thu Mar 06 23:07:02 2008 +0000
@@ -120,14 +120,14 @@
/* Initialize all variables that we clean on shutdown */
device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice));
- if (device) {
- data = (struct SDL_VideoData *) SDL_calloc(1, sizeof(SDL_VideoData));
+ if (!device) {
+ SDL_OutOfMemory();
+ return NULL;
}
- if (!device || !data) {
+ data = (struct SDL_VideoData *) SDL_calloc(1, sizeof(SDL_VideoData));
+ if (!data) {
SDL_OutOfMemory();
- if (device) {
- SDL_free(device);
- }
+ SDL_free(device);
return NULL;
}
device->driverdata = data;
--- a/src/video/x11/SDL_x11window.c Thu Mar 06 17:08:10 2008 +0000
+++ b/src/video/x11/SDL_x11window.c Thu Mar 06 23:07:02 2008 +0000
@@ -35,9 +35,11 @@
SDL_WindowData *data;
int numwindows = videodata->numwindows;
SDL_WindowData **windowlist = videodata->windowlist;
+ int i;
+ int index;
/* Allocate the window data */
- data = (SDL_WindowData *) SDL_malloc(sizeof(*data));
+ data = (SDL_WindowData *) SDL_calloc(1, sizeof(*data));
if (!data) {
SDL_OutOfMemory();
return -1;
@@ -56,6 +58,33 @@
data->created = created;
data->videodata = videodata;
+ /* Associate the data with the window */
+ index = -1;
+ if (windowlist) {
+ for (i = 0; i < numwindows; ++i) {
+ if (windowlist[i] == NULL) {
+ index = i;
+ break;
+ }
+ }
+ }
+
+ if (index >= 0) {
+ windowlist[index] = data;
+ } else {
+ windowlist =
+ (SDL_WindowData **) SDL_realloc(windowlist,
+ (numwindows + 1) * sizeof(*windowlist));
+ if (!windowlist) {
+ SDL_OutOfMemory();
+ SDL_free(data);
+ return -1;
+ }
+ windowlist[numwindows++] = data;
+ videodata->numwindows = numwindows;
+ videodata->windowlist = windowlist;
+ }
+
/* Fill in the SDL window with the window data */
{
XWindowAttributes attrib;
@@ -458,6 +487,7 @@
}
#endif
XDestroyWindow(data->display, w);
+ X11_PumpEvents(_this);
return -1;
}
return 0;
@@ -625,9 +655,24 @@
X11_DestroyWindow(_THIS, SDL_Window * window)
{
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
+ window->driverdata = NULL;
if (data) {
- Display *display = data->videodata->display;
+ SDL_VideoData *videodata = (SDL_VideoData *) data->videodata;
+ Display *display = videodata->display;
+ int numwindows = videodata->numwindows;
+ SDL_WindowData **windowlist = videodata->windowlist;
+ int i;
+
+ if (windowlist) {
+ for (i = 0; i < numwindows; ++i) {
+ if (windowlist[i] &&
+ (windowlist[i]->windowID == window->id)) {
+ windowlist[i] = NULL;
+ break;
+ }
+ }
+ }
#ifdef SDL_VIDEO_OPENGL_GLX
if (window->flags & SDL_WINDOW_OPENGL) {
X11_GL_Shutdown(_this);
@@ -640,9 +685,9 @@
#endif
if (data->created) {
XDestroyWindow(display, data->window);
+ X11_PumpEvents(_this);
}
SDL_free(data);
- window->driverdata = NULL;
}
}