- 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)) );
|
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) {
|
void scx_init_pixel(void) {
|
||||||
S48_EXPORT_FUNCTION(scx_Black_Pixel);
|
S48_EXPORT_FUNCTION(scx_Black_Pixel);
|
||||||
S48_EXPORT_FUNCTION(scx_White_Pixel);
|
S48_EXPORT_FUNCTION(scx_White_Pixel);
|
||||||
|
S48_EXPORT_FUNCTION(scx_Free_Pixel);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,18 +1,37 @@
|
||||||
(define-record-type pixel :pixel
|
(define-record-type pixel :pixel
|
||||||
(really-make-pixel tag Xpixel)
|
(really-make-pixel tag Xpixel colormap)
|
||||||
pixel?
|
pixel?
|
||||||
(tag pixel-tag pixel-set-tag!)
|
(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)))
|
(let ((maybe-pixel (pixel-list-find Xpixel)))
|
||||||
(if maybe-pixel
|
(if maybe-pixel
|
||||||
maybe-pixel
|
(begin
|
||||||
(let ((pixel (really-make-pixel #f Xpixel)))
|
;; now free the Xpixel if it has been allocated
|
||||||
(add-finalizer! pixel pixel-list-delete!)
|
(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-list-set! Xpixel pixel)
|
||||||
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
|
;; All pixel records need to be saved in a weak-list, to have only one record
|
||||||
;; for the same XLib pixel
|
;; for the same XLib pixel
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,15 @@
|
||||||
(define pixel-value pixel-Xpixel)
|
(define pixel-value pixel-Xpixel)
|
||||||
|
|
||||||
(define (black-pixel display)
|
(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)
|
(import-lambda-definition %black-pixel (Xdisplay)
|
||||||
"scx_Black_Pixel")
|
"scx_Black_Pixel")
|
||||||
|
|
||||||
(define (white-pixel display)
|
(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)
|
(import-lambda-definition %white-pixel (Xdisplay)
|
||||||
"scx_White_Pixel")
|
"scx_White_Pixel")
|
Loading…
Reference in New Issue