- added finalize? argument to make-pixel, so that allocated
color-cells (=pixels) are freed correctly.
This commit is contained in:
		
							parent
							
								
									fefeb73ccf
								
							
						
					
					
						commit
						faffbdd4ed
					
				| 
						 | 
				
			
			@ -11,7 +11,18 @@ s48_value scx_White_Pixel(s48_value Xdisplay) {
 | 
			
		|||
  return SCX_ENTER_PIXEL( WhitePixel(dpy, DefaultScreen(dpy)) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
s48_value scx_Free_Pixel(s48_value Xpixel, s48_value Xdisplay, s48_value Xcolormap) {
 | 
			
		||||
  unsigned long pixels[1];
 | 
			
		||||
  pixels[0] = SCX_EXTRACT_PIXEL(Xpixel);
 | 
			
		||||
  
 | 
			
		||||
  XFreeColors(SCX_EXTRACT_DISPLAY(Xdisplay), SCX_EXTRACT_COLORMAP(Xcolormap),
 | 
			
		||||
	      pixels, 1, 0);
 | 
			
		||||
 | 
			
		||||
  return S48_UNSPECIFIC;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void scx_init_pixel(void) {
 | 
			
		||||
  S48_EXPORT_FUNCTION(scx_Black_Pixel);
 | 
			
		||||
  S48_EXPORT_FUNCTION(scx_White_Pixel);
 | 
			
		||||
  S48_EXPORT_FUNCTION(scx_Free_Pixel);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,18 +1,37 @@
 | 
			
		|||
(define-record-type pixel :pixel
 | 
			
		||||
  (really-make-pixel tag Xpixel) 
 | 
			
		||||
  (really-make-pixel tag Xpixel colormap) 
 | 
			
		||||
  pixel?
 | 
			
		||||
  (tag pixel-tag pixel-set-tag!)
 | 
			
		||||
  (Xpixel pixel-Xpixel pixel-set-Xpixel!))
 | 
			
		||||
  (Xpixel pixel-Xpixel pixel-set-Xpixel!)
 | 
			
		||||
  (colormap pixel-colormap pixel-set-colormap!))
 | 
			
		||||
 | 
			
		||||
(define (make-pixel Xpixel)
 | 
			
		||||
;; Attention: colormap can be #f if finalize? is #f
 | 
			
		||||
(define (make-pixel Xpixel colormap finalize?)
 | 
			
		||||
  (let ((maybe-pixel (pixel-list-find Xpixel)))
 | 
			
		||||
    (if maybe-pixel
 | 
			
		||||
	maybe-pixel
 | 
			
		||||
	(let ((pixel (really-make-pixel #f Xpixel)))
 | 
			
		||||
	  (add-finalizer! pixel pixel-list-delete!)
 | 
			
		||||
	(begin
 | 
			
		||||
	  ;; now free the Xpixel if it has been allocated
 | 
			
		||||
	  (if finalize?
 | 
			
		||||
	      (%free-pixel Xpixel 
 | 
			
		||||
			   (display-Xdisplay (colormap-display colormap))
 | 
			
		||||
			   (colormap-Xcolormap colormap)))
 | 
			
		||||
	  maybe-pixel)
 | 
			
		||||
	(let ((pixel (really-make-pixel #f Xpixel colormap)))
 | 
			
		||||
	  (if finalize?
 | 
			
		||||
	      (add-finalizer! pixel free-pixel)
 | 
			
		||||
	      (add-finalizer! pixel pixel-list-delete!))
 | 
			
		||||
	  (pixel-list-set! Xpixel pixel)
 | 
			
		||||
	  pixel))))
 | 
			
		||||
 | 
			
		||||
(define (free-pixel pixel)
 | 
			
		||||
  (%free-pixel (pixel-Xpixel pixel)
 | 
			
		||||
	       (display-Xdisplay (colormap-display (pixel-colormap pixel)))
 | 
			
		||||
	       (colormap-Xcolormap (pixel-colormap pixel)))
 | 
			
		||||
  (pixel-list-delete! pixel))
 | 
			
		||||
 | 
			
		||||
(import-lambda-definition %free-pixel (Xpixel Xdisplay Xcolormap)
 | 
			
		||||
  "scx_Free_Pixel")
 | 
			
		||||
 | 
			
		||||
;; All pixel records need to be saved in a weak-list, to have only one record
 | 
			
		||||
;; for the same XLib pixel
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,13 +1,15 @@
 | 
			
		|||
(define pixel-value pixel-Xpixel)
 | 
			
		||||
 | 
			
		||||
(define (black-pixel display)
 | 
			
		||||
  (make-pixel (%black-pixel (display-Xdisplay display))))
 | 
			
		||||
  (make-pixel (%black-pixel (display-Xdisplay display))
 | 
			
		||||
	      #f #f))
 | 
			
		||||
 | 
			
		||||
(import-lambda-definition %black-pixel (Xdisplay)
 | 
			
		||||
  "scx_Black_Pixel")
 | 
			
		||||
 | 
			
		||||
(define (white-pixel display)
 | 
			
		||||
  (make-pixel (%white-pixel (display-Xdisplay display))))
 | 
			
		||||
  (make-pixel (%white-pixel (display-Xdisplay display))
 | 
			
		||||
	      #f #f))
 | 
			
		||||
 | 
			
		||||
(import-lambda-definition %white-pixel (Xdisplay)
 | 
			
		||||
  "scx_White_Pixel")
 | 
			
		||||
		Loading…
	
		Reference in New Issue