tags 325689 + patch
thanks

Without this, I leak resources from the X server with every -onroot,
as can be verified using xrestop, while with this there's no leak.
The extra diagnostics are strictly speaking not necessary,
but really are a good idea since we're modifying the shared root.


--- xloadimage-4.1.orig/root.c  2008-02-02 15:18:36.000000000 -0800
+++ xloadimage-4.1/root.c       2008-02-02 16:04:19.000000000 -0800
@@ -16,23 +16,6 @@

 #define RETAIN_PROP_NAME       "_XSETROOT_ID"

-void updateProperty(dpy, w, name, type, format, data, nelem)
-     Display   *dpy;
-     Window    w;
-     char      *name;
-     Atom      type;
-     int       format;
-     int       data;
-     int       nelem;
-{
-  /* intern the property name */
-  Atom atom = XInternAtom(dpy, name, 0);
-
-  /* create or replace the property */
-  XChangeProperty(dpy, w, atom, type, format, PropModeReplace,
-                 (unsigned char *)&data, nelem);
-}
-

 /* Sets the close-down mode of the client to 'RetainPermanent'
  * so all client resources will be preserved after the client
@@ -47,9 +30,15 @@
 {
   /* create dummy resource */
   Pixmap pm= XCreatePixmap(dpy, w, 1, 1, 1);
+  unsigned char *data = (unsigned char *) ±
        
-  /* create/replace the property */
-  updateProperty(dpy, w, RETAIN_PROP_NAME, XA_PIXMAP, 32, (int)pm, 1);
+  /* intern the property name */
+  char *name = RETAIN_PROP_NAME;
+  Atom atom = XInternAtom(dpy, name, 0);
+
+  /* create or replace the property */
+  XChangeProperty(dpy, w, atom, XA_PIXMAP, 32, PropModeReplace,
+                 data, sizeof(Pixmap)/4);
        
   /* retain all client resources until explicitly killed */
   XSetCloseDownMode(dpy, RetainPermanent);
@@ -65,32 +54,57 @@
      Display   *dpy;
      Window    w;
 {
-  Pixmap *pm;                  
-  Atom actual_type;            /* NOTUSED */
+  Pixmap *pm;
+  unsigned char *charpm;
+  Atom actual_type;
   int  format;
-  int  nitems;
-  int  bytes_after;
+  unsigned long        nitems;
+  unsigned long        bytes_after;
+  int   returncode;

   /* intern the property name */
   Atom atom = XInternAtom(dpy, RETAIN_PROP_NAME, 0);
+  fprintf(stderr, "info: freePrevious ");

   /* look for existing resource allocation */
-  if ((XGetWindowProperty(dpy, w, atom, 0, 1, 1/*delete*/,
-                         AnyPropertyType, &actual_type, &format, (unsigned 
long *)&nitems,
-                         (unsigned long *)&bytes_after, (unsigned char **)&pm) 
== Success) &&
-      nitems == 1) {
-    if ((actual_type == XA_PIXMAP) && (format == 32) &&
-       (nitems == 1) && (bytes_after == 0)) {
-      /* blast it away */
-      XKillClient(dpy, (XID) *pm);
-      XFree((char *)pm);
-    }
-    else if (actual_type != None) {
-      fprintf(stderr,
-             "%s: warning: invalid format encountered for property %s\n",
-             RETAIN_PROP_NAME, "xloadimage");
-    }
-  }
+  nitems = sizeof(Pixmap)/4;
+  returncode = XGetWindowProperty(dpy, w, atom,
+                 0, nitems, 1/*delete*/,
+                XA_PIXMAP, &actual_type,
+                &format, &nitems,
+                &bytes_after, &charpm);
+  if (returncode != Success) {
+    fprintf(stderr, "failed to look for %s with return code %i.\n",
+            RETAIN_PROP_NAME, returncode);
+    return;
+  }
+
+  /* Check if the property was found */
+  if (actual_type == None) {
+    fprintf(stderr, "didn't find evidence of prior run.\n");
+    return;
+  }
+
+  /* Make sure the dummy value is still present */
+  if (actual_type != XA_PIXMAP) {
+    fprintf(stderr, "found wrong data type - skipped.\n");
+    return;
+  }
+
+  /* Check size, in case we're a different architecture */
+  if ((nitems != sizeof(Pixmap)/4) ||
+      (format != 32) ||
+      (bytes_after != 0)) {
+    fprintf(stderr, "saw wrong %li / word size %i / architecture %li.\n",
+            bytes_after, format, nitems);
+    return;
+  }
+
+  /* blast it away */
+  pm = (Pixmap*) charpm;
+  XKillClient(dpy, (XID) *pm);
+  XFree(charpm);
+  fprintf(stderr, "called KillClient and XFree for its prior image.\n");
 }

 #if FIND_DEC_ROOTWINDOW
@@ -185,15 +199,16 @@
     for(i = 0; i < numChildren; i++) {
       Atom actual_type;
       int actual_format;
-      long nitems, bytesafter;
-      Window *newRoot = NULL;
+      unsigned long nitems, bytesafter;
+      unsigned char *newRoot = 0;

-      if (XGetWindowProperty (disp, children[i], __SWM_VROOT,0,1,
-                             False, XA_WINDOW, &actual_type, &actual_format,
-                             (unsigned long *)&nitems, (unsigned long 
*)&bytesafter,
-                             (unsigned char **) &newRoot) ==
-         Success && newRoot) {
-       root = *newRoot;
+      if ((XGetWindowProperty (disp, children[i], __SWM_VROOT,0,1,
+                             False, XA_WINDOW,
+                             &actual_type, &actual_format,
+                             &nitems, &bytesafter, &newRoot)
+          == Success) &&
+         newRoot) {
+       root = *((Window*) newRoot);
        break;
       }
     }



-- System Information:
Debian Release: 4.0
  APT prefers stable
  APT policy: (500, 'stable')
Architecture: amd64 (x86_64)
Shell:  /bin/sh linked to /bin/bash
Kernel: Linux 2.6.18-6-amd64
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)

Versions of packages xloadimage depends on:
ii  libc6                  2.3.6.ds1-13etch4 GNU C Library: Shared libraries
ii  libjpeg62              6b-13             The Independent JPEG Group's JPEG
ii  libpng12-0             1.2.15~beta5-1    PNG library - runtime
ii  libtiff4               3.8.2-7           Tag Image File Format (TIFF) libra
ii  libx11-6               2:1.0.3-7         X11 client-side library
ii  zlib1g                 1:1.2.3-13        compression library - runtime

xloadimage recommends no packages.

-- no debconf information

Reply via email to