Fixed many valgrind errors. But, I broke testdyngl.
authorBob Pendleton <bob@pendleton.com>
Thu, 06 Mar 2008 23:07:02 +0000
changeset 2323 4ac07ae446d3
parent 2322 c25d45b7add3
child 2324 3202e4826c57
Fixed many valgrind errors. But, I broke testdyngl.
src/video/x11/SDL_x11events.c
src/video/x11/SDL_x11keyboard.c
src/video/x11/SDL_x11opengl.c
src/video/x11/SDL_x11video.c
src/video/x11/SDL_x11window.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;
--- 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;
     }
 }