Ver Fonte

finally fix memory leak issue

siduck76 há 3 anos atrás
pai
commit
f397a51a8e
1 ficheiros alterados com 15 adições e 23 exclusões
  1. 15 23
      chadwm/dwm.c

+ 15 - 23
chadwm/dwm.c

@@ -410,8 +410,7 @@ struct Monitor {
   Window barwin;
   Window tabwin;
   Window tagwin;
-  Pixmap tagmap;
-  Imlib_Image tag_images[LENGTH(tags)];
+  Pixmap tagmap[LENGTH(tags)];
   int previewshow;
   int ntabs;
   int tab_widths[MAXTABS];
@@ -688,16 +687,12 @@ void cleanupmon(Monitor *mon) {
     m->next = mon->next;
   }
   for (i = 0; i < LENGTH(tags); i++) {
-	  if (mon->tag_images[i]) {
-		  imlib_context_set_image(mon->tag_images[i]);
-		  imlib_free_image();
-	  }
+           XFreePixmap(dpy, mon->tagmap[i]);
   }
   XUnmapWindow(dpy, mon->barwin);
   XDestroyWindow(dpy, mon->barwin);
   XUnmapWindow(dpy, mon->tabwin);
   XDestroyWindow(dpy, mon->tabwin);
-  XFreePixmap(dpy, mon->tagmap);
   XUnmapWindow(dpy, mon->tagwin);
   XDestroyWindow(dpy, mon->tagwin);
   free(mon);
@@ -2683,16 +2678,9 @@ showtagpreview(int tag)
 		return;
 	}
 
-	if (selmon->tag_images[tag]) {
-		imlib_context_set_image(selmon->tag_images[tag]);
-		imlib_context_set_display(dpy);
-		imlib_context_set_visual(DefaultVisual(dpy, screen));
-		imlib_context_set_colormap(DefaultColormap(dpy, screen));
-		imlib_context_set_drawable(selmon->tagmap);
-               	imlib_render_image_part_on_drawable_at_size(0, 0, selmon->mw, selmon->mh, 0, 0, selmon->mw / scalepreview, selmon->mh / scalepreview);
-
-		XSetWindowBackgroundPixmap(dpy, selmon->tagwin, selmon->tagmap);
-                XCopyArea(dpy, selmon->tagmap, selmon->tagwin, drw->gc, 0, 0, selmon->mw / scalepreview, selmon->mh / scalepreview, 0, 0);
+        if (selmon->tagmap[tag]) {
+		XSetWindowBackgroundPixmap(dpy, selmon->tagwin, selmon->tagmap[tag]);
+		XCopyArea(dpy, selmon->tagmap[tag], selmon->tagwin, drw->gc, 0, 0, selmon->mw / scalepreview, selmon->mh / scalepreview, 0, 0);
 		XSync(dpy, False);
 		XMapWindow(dpy, selmon->tagwin);
 	} else
@@ -2735,21 +2723,26 @@ void switchtag(void) {
   	int i;
 	unsigned int occ = 0;
 	Client *c;
+        Imlib_Image image;
 
 	for (c = selmon->clients; c; c = c->next)
 		occ |= c->tags;
 	for (i = 0; i < LENGTH(tags); i++) {
 		if (selmon->tagset[selmon->seltags] & 1 << i) {
-                  	imlib_context_set_image(selmon->tag_images[i]);
-			imlib_free_image();
-                        selmon->tag_images[i] = NULL;
 			if (occ & 1 << i) {
-				selmon->tag_images[i] = imlib_create_image(sw, sh);
-				imlib_context_set_image(selmon->tag_images[i]);
+                          	image = imlib_create_image(sw, sh);
+				imlib_context_set_image(image);
 				imlib_context_set_display(dpy);
 				imlib_context_set_visual(DefaultVisual(dpy, screen));
 				imlib_context_set_drawable(RootWindow(dpy, screen));
 				imlib_copy_drawable_to_image(0, selmon->mx, selmon->my, selmon->mw ,selmon->mh, 0, 0, 1);
+                                selmon->tagmap[i] = XCreatePixmap(dpy, selmon->tagwin, selmon->mw / scalepreview, selmon->mh / scalepreview, DefaultDepth(dpy, screen));
+				imlib_context_set_drawable(selmon->tagmap[i]);
+				imlib_render_image_part_on_drawable_at_size(0, 0, selmon->mw, selmon->mh, 0, 0, selmon->mw / scalepreview, selmon->mh / scalepreview);
+				imlib_free_image();
+			} else if(selmon->tagmap[i] != 0) {
+				XFreePixmap(dpy, selmon->tagmap[i]);
+				selmon->tagmap[i] = 0;
                         }
 		}
 	}
@@ -2965,7 +2958,6 @@ updatepreview(void)
 		XDefineCursor(dpy, m->tagwin, cursor[CurNormal]->cursor);
 		XMapRaised(dpy, m->tagwin);
 		XUnmapWindow(dpy, m->tagwin);
-		m->tagmap = XCreatePixmap(dpy, m->tagwin, m->mw / 4, m->mh / 4, DefaultDepth(dpy, screen));
 	}
 }