# HG changeset patch # User Bob Pendleton # Date 1204844822 0 # Node ID 4ac07ae446d34dc6d96b213de9d7319827f77f55 # Parent c25d45b7add311ca8b9247a754ca2659ba8a27c1 Fixed many valgrind errors. But, I broke testdyngl. diff -r c25d45b7add3 -r 4ac07ae446d3 src/video/x11/SDL_x11events.c --- 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; diff -r c25d45b7add3 -r 4ac07ae446d3 src/video/x11/SDL_x11keyboard.c --- 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; diff -r c25d45b7add3 -r 4ac07ae446d3 src/video/x11/SDL_x11opengl.c --- 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 diff -r c25d45b7add3 -r 4ac07ae446d3 src/video/x11/SDL_x11video.c --- 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; diff -r c25d45b7add3 -r 4ac07ae446d3 src/video/x11/SDL_x11window.c --- 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; } }