From b315d5379ddf0fe017491f88689daf9ad33b9903 Mon Sep 17 00:00:00 2001 From: Bob Pendleton Date: Thu, 6 Mar 2008 23:07:02 +0000 Subject: [PATCH] Fixed many valgrind errors. But, I broke testdyngl. --HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%402740 --- src/video/x11/SDL_x11events.c | 11 +++++-- src/video/x11/SDL_x11keyboard.c | 2 +- src/video/x11/SDL_x11opengl.c | 2 +- src/video/x11/SDL_x11video.c | 14 ++++----- src/video/x11/SDL_x11window.c | 51 +++++++++++++++++++++++++++++++-- 5 files changed, 65 insertions(+), 15 deletions(-) diff --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c index 50e47271b..b17f63969 100644 --- a/src/video/x11/SDL_x11events.c +++ b/src/video/x11/SDL_x11events.c @@ -51,10 +51,15 @@ X11_DispatchEvent(_THIS) } 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 --git a/src/video/x11/SDL_x11keyboard.c b/src/video/x11/SDL_x11keyboard.c index 1e4ec4b90..b19204656 100644 --- a/src/video/x11/SDL_x11keyboard.c +++ b/src/video/x11/SDL_x11keyboard.c @@ -330,7 +330,7 @@ X11_InitKeyboard(_THIS) } } 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 --git a/src/video/x11/SDL_x11opengl.c b/src/video/x11/SDL_x11opengl.c index 919e6566a..951d00307 100644 --- a/src/video/x11/SDL_x11opengl.c +++ b/src/video/x11/SDL_x11opengl.c @@ -254,7 +254,7 @@ X11_GL_InitExtensions(_THIS) _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 --git a/src/video/x11/SDL_x11video.c b/src/video/x11/SDL_x11video.c index 58690df9f..2b1f38990 100644 --- a/src/video/x11/SDL_x11video.c +++ b/src/video/x11/SDL_x11video.c @@ -120,14 +120,14 @@ X11_CreateDevice(int devindex) /* 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 || !data) { + if (!device) { SDL_OutOfMemory(); - if (device) { - SDL_free(device); - } + return NULL; + } + data = (struct SDL_VideoData *) SDL_calloc(1, sizeof(SDL_VideoData)); + if (!data) { + SDL_OutOfMemory(); + SDL_free(device); return NULL; } device->driverdata = data; diff --git a/src/video/x11/SDL_x11window.c b/src/video/x11/SDL_x11window.c index b5e28944b..591b05606 100644 --- a/src/video/x11/SDL_x11window.c +++ b/src/video/x11/SDL_x11window.c @@ -35,9 +35,11 @@ SetupWindowData(_THIS, SDL_Window * window, Window w, BOOL created) 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 @@ SetupWindowData(_THIS, SDL_Window * window, Window w, BOOL created) 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 @@ X11_CreateWindow(_THIS, SDL_Window * window) } #endif XDestroyWindow(data->display, w); + X11_PumpEvents(_this); return -1; } return 0; @@ -625,9 +655,24 @@ void 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 @@ X11_DestroyWindow(_THIS, SDL_Window * window) #endif if (data->created) { XDestroyWindow(display, data->window); + X11_PumpEvents(_this); } SDL_free(data); - window->driverdata = NULL; } }