fixed gc protection

This commit is contained in:
frese 2003-05-02 13:06:50 +00:00
parent a678b14752
commit 992c2aa830
2 changed files with 56 additions and 41 deletions

View File

@ -10,6 +10,7 @@ double s48_extract_number(s48_value v) {
} }
void scx_extract_color(s48_value v, XColor* c) { void scx_extract_color(s48_value v, XColor* c) {
S48_DECLARE_GC_PROTECT_1(v);
s48_check_record_type(v, scx_color); s48_check_record_type(v, scx_color);
c->pixel = scx_extract_pixel(S48_RECORD_REF(v, 0)); c->pixel = scx_extract_pixel(S48_RECORD_REF(v, 0));
c->flags = 0; c->flags = 0;
@ -25,6 +26,7 @@ void scx_extract_color(s48_value v, XColor* c) {
c->flags |= DoBlue; c->flags |= DoBlue;
c->blue = s48_extract_number(S48_RECORD_REF(v, 3)) * 65536; c->blue = s48_extract_number(S48_RECORD_REF(v, 3)) * 65536;
} }
S48_GC_UNPROTECT();
} }
void scx_copy_color(const XColor* c, s48_value v) { void scx_copy_color(const XColor* c, s48_value v) {
@ -49,36 +51,40 @@ s48_value scx_enter_color(const XColor* c) {
s48_value scx_Create_Colormap (s48_value display, s48_value window, s48_value scx_Create_Colormap (s48_value display, s48_value window,
s48_value visual, s48_value alloc) { s48_value visual, s48_value alloc) {
S48_DECLARE_GC_PROTECT_4(display, window, visual, alloc);
Colormap cm = XCreateColormap(scx_extract_display(display), Colormap cm = XCreateColormap(scx_extract_display(display),
scx_extract_window(window), scx_extract_window(window),
scx_extract_visual(visual), scx_extract_visual(visual),
scx_extract_colormap_alloc(alloc)); scx_extract_colormap_alloc(alloc));
return scx_enter_colormap(cm); S48_GC_RETURN(scx_enter_colormap(cm));
} }
s48_value scx_Copy_Colormap_And_Free(s48_value display, s48_value colormap) { s48_value scx_Copy_Colormap_And_Free(s48_value display, s48_value colormap) {
S48_DECLARE_GC_PROTECT_2(display, colormap);
Colormap cm = XCopyColormapAndFree(scx_extract_display(display), Colormap cm = XCopyColormapAndFree(scx_extract_display(display),
scx_extract_colormap(colormap)); scx_extract_colormap(colormap));
return scx_enter_colormap(cm); S48_GC_RETURN(scx_enter_colormap(cm));
} }
s48_value scx_Free_Colormap (s48_value display, s48_value colormap) { s48_value scx_Free_Colormap (s48_value display, s48_value colormap) {
S48_DECLARE_GC_PROTECT_2(display, colormap);
XFreeColormap(scx_extract_display(display), XFreeColormap(scx_extract_display(display),
scx_extract_colormap(colormap)); scx_extract_colormap(colormap));
return S48_UNSPECIFIC; S48_GC_RETURN(S48_UNSPECIFIC);
} }
s48_value scx_Alloc_Color(s48_value display, s48_value colormap, s48_value scx_Alloc_Color(s48_value display, s48_value colormap,
s48_value color) { s48_value color) {
XColor cp; XColor cp;
S48_DECLARE_GC_PROTECT_3(display, colormap, color);
scx_extract_color(color, &cp); scx_extract_color(color, &cp);
if (!XAllocColor(scx_extract_display(display), if (!XAllocColor(scx_extract_display(display),
scx_extract_colormap(colormap), &cp)) scx_extract_colormap(colormap), &cp))
return S48_FALSE; S48_GC_RETURN(S48_FALSE);
else { else {
scx_copy_color(&cp, color); scx_copy_color(&cp, color);
return S48_UNSPECIFIC; S48_GC_RETURN(S48_UNSPECIFIC);
} }
} }
@ -86,7 +92,8 @@ s48_value scx_Alloc_Named_Color(s48_value display, s48_value colormap,
s48_value color_name) { s48_value color_name) {
XColor screen, exact; XColor screen, exact;
int r; int r;
S48_DECLARE_GC_PROTECT(2); s48_value s = S48_NULL, e = S48_NULL;
S48_DECLARE_GC_PROTECT_5(display, colormap, color_name , s, e);
r = XAllocNamedColor(scx_extract_display(display), r = XAllocNamedColor(scx_extract_display(display),
scx_extract_colormap(colormap), scx_extract_colormap(colormap),
@ -94,14 +101,11 @@ s48_value scx_Alloc_Named_Color(s48_value display, s48_value colormap,
&screen, &exact); &screen, &exact);
if (r != 0) { if (r != 0) {
s48_value s = S48_NULL, e = S48_NULL;
S48_GC_PROTECT_2(s, e);
s = scx_enter_color(&screen); s = scx_enter_color(&screen);
e = scx_enter_color(&exact); e = scx_enter_color(&exact);
S48_GC_UNPROTECT(); S48_GC_RETURN(s48_cons(s, e));
return s48_cons(s, e);
} else } else
return S48_FALSE; S48_GC_RETURN(S48_FALSE);
} }
s48_value scx_Alloc_Color_Cells (s48_value display, s48_value colormap, s48_value scx_Alloc_Color_Cells (s48_value display, s48_value colormap,
@ -112,7 +116,8 @@ s48_value scx_Alloc_Color_Cells (s48_value display, s48_value colormap,
unsigned long plane_masks[npl]; unsigned long plane_masks[npl];
unsigned long pixels[npx]; unsigned long pixels[npx];
s48_value pls = S48_NULL, pxs = S48_NULL; s48_value pls = S48_NULL, pxs = S48_NULL;
S48_DECLARE_GC_PROTECT(2); S48_DECLARE_GC_PROTECT_7(display, colormap, contig, nplanes, npixels,
pls, pxs);
if (XAllocColorCells(scx_extract_display(display), if (XAllocColorCells(scx_extract_display(display),
scx_extract_colormap(colormap), scx_extract_colormap(colormap),
@ -120,15 +125,13 @@ s48_value scx_Alloc_Color_Cells (s48_value display, s48_value colormap,
plane_masks, npl, plane_masks, npl,
pixels, npx)) { pixels, npx)) {
int i; int i;
S48_GC_PROTECT_2(pls, pxs);
for (i = npl-1; i >= 0; i--) for (i = npl-1; i >= 0; i--)
pls = s48_cons(s48_enter_integer(plane_masks[i]), pls); pls = s48_cons(s48_enter_integer(plane_masks[i]), pls);
for (i = npx-1; i >= 0; i--) for (i = npx-1; i >= 0; i--)
pxs = s48_cons(scx_enter_pixel(pixels[i]), pxs); pxs = s48_cons(scx_enter_pixel(pixels[i]), pxs);
S48_GC_UNPROTECT(); S48_GC_RETURN(s48_cons(pls, pxs));
return s48_cons(pls, pxs);
} else } else
return S48_FALSE; S48_GC_RETURN(S48_FALSE);
} }
s48_value scx_Alloc_Color_Planes(s48_value display, s48_value colormap, s48_value scx_Alloc_Color_Planes(s48_value display, s48_value colormap,
@ -143,7 +146,8 @@ s48_value scx_Alloc_Color_Planes(s48_value display, s48_value colormap,
unsigned long rmask, gmask, bmask; unsigned long rmask, gmask, bmask;
s48_value pxs = S48_NULL; s48_value pxs = S48_NULL;
s48_value res = S48_NULL; s48_value res = S48_NULL;
S48_DECLARE_GC_PROTECT(2); S48_DECLARE_GC_PROTECT_9(display, colormap, contig, ncolors, nreds, ngreens,
nblues, pxs, res);
if (XAllocColorPlanes(scx_extract_display(display), if (XAllocColorPlanes(scx_extract_display(display),
scx_extract_colormap(colormap), scx_extract_colormap(colormap),
@ -152,17 +156,15 @@ s48_value scx_Alloc_Color_Planes(s48_value display, s48_value colormap,
nre, ngr, nbl, nre, ngr, nbl,
&rmask, &gmask, &bmask)) { &rmask, &gmask, &bmask)) {
int i; int i;
S48_GC_PROTECT_2(pxs, res);
for (i = npx-1; i >= 0; i--) for (i = npx-1; i >= 0; i--)
pxs = s48_cons(scx_enter_pixel(pixels[i]), pxs); pxs = s48_cons(scx_enter_pixel(pixels[i]), pxs);
res = s48_cons(s48_enter_integer(bmask), res); res = s48_cons(s48_enter_integer(bmask), res);
res = s48_cons(s48_enter_integer(gmask), res); res = s48_cons(s48_enter_integer(gmask), res);
res = s48_cons(s48_enter_integer(rmask), res); res = s48_cons(s48_enter_integer(rmask), res);
res = s48_cons(pxs, res); res = s48_cons(pxs, res);
S48_GC_UNPROTECT(); S48_GC_RETURN(res);
return res;
} else } else
return S48_FALSE; S48_GC_RETURN(S48_FALSE);
} }
s48_value scx_Free_Colors(s48_value display, s48_value colormap, s48_value scx_Free_Colors(s48_value display, s48_value colormap,
@ -170,13 +172,14 @@ s48_value scx_Free_Colors(s48_value display, s48_value colormap,
int i, n = s48_list_length(pixels); int i, n = s48_list_length(pixels);
unsigned long cpixels[n]; unsigned long cpixels[n];
s48_value l = pixels; s48_value l = pixels;
S48_DECLARE_GC_PROTECT_5(display, colormap, pixels, planes, l);
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
cpixels[i] = scx_extract_pixel(S48_CAR(l)); cpixels[i] = scx_extract_pixel(S48_CAR(l));
l = S48_CDR(l); l = S48_CDR(l);
} }
XFreeColors(scx_extract_display(display), scx_extract_colormap(colormap), XFreeColors(scx_extract_display(display), scx_extract_colormap(colormap),
cpixels, n, s48_extract_integer(planes)); cpixels, n, s48_extract_integer(planes));
return S48_UNSPECIFIC; S48_GC_RETURN(S48_UNSPECIFIC);
} }
s48_value scx_Query_Colors(s48_value display, s48_value colormap, s48_value scx_Query_Colors(s48_value display, s48_value colormap,
@ -184,6 +187,7 @@ s48_value scx_Query_Colors(s48_value display, s48_value colormap,
int i, n = s48_list_length(colors); int i, n = s48_list_length(colors);
XColor ccolors[n]; XColor ccolors[n];
s48_value l = colors; s48_value l = colors;
S48_DECLARE_GC_PROTECT_4(display, colormap, colors, l);
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
scx_extract_color(S48_CAR(l), &ccolors[i]); scx_extract_color(S48_CAR(l), &ccolors[i]);
l = S48_CDR(l); l = S48_CDR(l);
@ -195,36 +199,35 @@ s48_value scx_Query_Colors(s48_value display, s48_value colormap,
scx_copy_color(&ccolors[i], S48_CAR(l)); scx_copy_color(&ccolors[i], S48_CAR(l));
l = S48_CDR(l); l = S48_CDR(l);
} }
return S48_UNSPECIFIC; S48_GC_RETURN(S48_UNSPECIFIC);
} }
s48_value scx_Lookup_Color(s48_value display, s48_value colormap, s48_value scx_Lookup_Color(s48_value display, s48_value colormap,
s48_value color_name) { s48_value color_name) {
XColor cexact, cscreen; XColor cexact, cscreen;
S48_DECLARE_GC_PROTECT(1);
s48_value r = S48_NULL; s48_value r = S48_NULL;
S48_DECLARE_GC_PROTECT_4(display, colormap, color_name, r);
int res = XLookupColor(scx_extract_display(display), int res = XLookupColor(scx_extract_display(display),
scx_extract_colormap(colormap), scx_extract_colormap(colormap),
s48_extract_string(color_name), s48_extract_string(color_name),
&cexact, &cscreen); &cexact, &cscreen);
if (res == 0) return S48_FALSE; if (res == 0) S48_GC_RETURN(S48_FALSE);
S48_GC_PROTECT_1(r);
r = scx_enter_color(&cscreen); r = scx_enter_color(&cscreen);
r = s48_cons(scx_enter_color(&cexact), r); r = s48_cons(scx_enter_color(&cexact), r);
S48_GC_UNPROTECT(); S48_GC_RETURN(r);
return r;
} }
s48_value scx_Parse_Color(s48_value display, s48_value colormap, s48_value scx_Parse_Color(s48_value display, s48_value colormap,
s48_value spec) { s48_value spec) {
XColor ret; XColor ret;
S48_DECLARE_GC_PROTECT_3(display, colormap, spec);
if (XParseColor(scx_extract_display(display), if (XParseColor(scx_extract_display(display),
scx_extract_colormap(colormap), scx_extract_colormap(colormap),
s48_extract_string(spec), s48_extract_string(spec),
&ret)) { &ret)) {
return scx_enter_color(&ret); S48_GC_RETURN(scx_enter_color(&ret));
} else } else
return S48_FALSE; S48_GC_RETURN(S48_FALSE);
} }
s48_value scx_Store_Colors(s48_value display, s48_value colormap, s48_value scx_Store_Colors(s48_value display, s48_value colormap,
@ -232,6 +235,7 @@ s48_value scx_Store_Colors(s48_value display, s48_value colormap,
int i, n = s48_list_length(colors); int i, n = s48_list_length(colors);
XColor ccolors[n]; XColor ccolors[n];
s48_value l = colors; s48_value l = colors;
S48_DECLARE_GC_PROTECT_4(display, colormap, colors, l);
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
scx_extract_color(S48_CAR(l), &ccolors[i]); scx_extract_color(S48_CAR(l), &ccolors[i]);
l = S48_CDR(l); l = S48_CDR(l);
@ -240,13 +244,15 @@ s48_value scx_Store_Colors(s48_value display, s48_value colormap,
XStoreColors(scx_extract_display(display), XStoreColors(scx_extract_display(display),
scx_extract_colormap(colormap), scx_extract_colormap(colormap),
ccolors, n); ccolors, n);
return S48_UNSPECIFIC; S48_GC_RETURN(S48_UNSPECIFIC);
} }
s48_value scx_Store_Named_Color(s48_value display, s48_value colormap, s48_value scx_Store_Named_Color(s48_value display, s48_value colormap,
s48_value color_name, s48_value pixel, s48_value color_name, s48_value pixel,
s48_value do_red, s48_value do_green, s48_value do_red, s48_value do_green,
s48_value do_blue) { s48_value do_blue) {
S48_DECLARE_GC_PROTECT_7(display, colormap, color_name, pixel, do_red,
do_green, do_blue);
XStoreNamedColor(scx_extract_display(display), XStoreNamedColor(scx_extract_display(display),
scx_extract_colormap(colormap), scx_extract_colormap(colormap),
s48_extract_string(color_name), s48_extract_string(color_name),
@ -254,7 +260,7 @@ s48_value scx_Store_Named_Color(s48_value display, s48_value colormap,
(S48_EXTRACT_BOOLEAN(do_red) ? DoRed : 0) | (S48_EXTRACT_BOOLEAN(do_red) ? DoRed : 0) |
(S48_EXTRACT_BOOLEAN(do_green) ? DoGreen : 0) | (S48_EXTRACT_BOOLEAN(do_green) ? DoGreen : 0) |
(S48_EXTRACT_BOOLEAN(do_blue) ? DoBlue : 0)); (S48_EXTRACT_BOOLEAN(do_blue) ? DoBlue : 0));
return S48_UNSPECIFIC; S48_GC_RETURN(S48_UNSPECIFIC);
} }
void scx_init_colormap(void) { void scx_init_colormap(void) {

View File

@ -9,6 +9,7 @@ s48_value scx_Create_Pixmap_Cursor(s48_value display,
s48_value x, s48_value y) { s48_value x, s48_value y) {
XColor f, b; XColor f, b;
Cursor xc; Cursor xc;
S48_DECLARE_GC_PROTECT_7(display, src, mask, foreground, background, x, y);
scx_extract_color(foreground, &f); scx_extract_color(foreground, &f);
scx_extract_color(background, &b); scx_extract_color(background, &b);
xc = XCreatePixmapCursor(scx_extract_display(display), xc = XCreatePixmapCursor(scx_extract_display(display),
@ -17,7 +18,7 @@ s48_value scx_Create_Pixmap_Cursor(s48_value display,
&f, &b, &f, &b,
s48_extract_integer(x), s48_extract_integer(x),
s48_extract_integer(y)); s48_extract_integer(y));
return scx_enter_cursor(xc); S48_GC_RETURN(scx_enter_cursor(xc));
} }
s48_value scx_Create_Glyph_Cursor(s48_value display, s48_value scx_Create_Glyph_Cursor(s48_value display,
@ -26,6 +27,8 @@ s48_value scx_Create_Glyph_Cursor(s48_value display,
s48_value foreground, s48_value background) { s48_value foreground, s48_value background) {
XColor f, b; XColor f, b;
Cursor xc; Cursor xc;
S48_DECLARE_GC_PROTECT_7(display, src_font, mask_font, srcc, maskc,
foreground, background);
scx_extract_color(foreground, &f); scx_extract_color(foreground, &f);
scx_extract_color(background, &b); scx_extract_color(background, &b);
xc = XCreateGlyphCursor(scx_extract_display(display), xc = XCreateGlyphCursor(scx_extract_display(display),
@ -34,43 +37,49 @@ s48_value scx_Create_Glyph_Cursor(s48_value display,
s48_extract_integer(srcc), s48_extract_integer(srcc),
s48_extract_integer(maskc), s48_extract_integer(maskc),
&f, &b); &f, &b);
return scx_enter_cursor(xc); S48_GC_RETURN(scx_enter_cursor(xc));
} }
s48_value scx_Create_Font_Cursor(s48_value display, s48_value shape) { s48_value scx_Create_Font_Cursor(s48_value display, s48_value shape) {
Cursor xc = XCreateFontCursor(scx_extract_display(display), Cursor xc;
s48_extract_integer(shape)); S48_DECLARE_GC_PROTECT_2(display, shape);
return scx_enter_cursor(xc); xc = XCreateFontCursor(scx_extract_display(display),
s48_extract_integer(shape));
S48_GC_RETURN(scx_enter_cursor(xc));
} }
s48_value scx_Define_Cursor(s48_value display, s48_value window, s48_value scx_Define_Cursor(s48_value display, s48_value window,
s48_value cursor) { s48_value cursor) {
S48_DECLARE_GC_PROTECT_3(display, window, cursor);
XDefineCursor(scx_extract_display(display), scx_extract_window(window), XDefineCursor(scx_extract_display(display), scx_extract_window(window),
scx_extract_cursor(cursor)); scx_extract_cursor(cursor));
return S48_UNSPECIFIC; S48_GC_RETURN(S48_UNSPECIFIC);
} }
s48_value scx_Undefine_Cursor(s48_value display, s48_value window) { s48_value scx_Undefine_Cursor(s48_value display, s48_value window) {
S48_DECLARE_GC_PROTECT_2(display, window);
XUndefineCursor(scx_extract_display(display), XUndefineCursor(scx_extract_display(display),
scx_extract_window(window)); scx_extract_window(window));
return S48_UNSPECIFIC; S48_GC_RETURN(S48_UNSPECIFIC);
} }
s48_value scx_Recolor_Cursor(s48_value display, s48_value cursor, s48_value scx_Recolor_Cursor(s48_value display, s48_value cursor,
s48_value foreground, s48_value background) { s48_value foreground, s48_value background) {
XColor f, b; XColor f, b;
S48_DECLARE_GC_PROTECT_4(display, cursor, foreground, background);
scx_extract_color(foreground, &f); scx_extract_color(foreground, &f);
scx_extract_color(background, &b); scx_extract_color(background, &b);
XRecolorCursor(scx_extract_display(display), XRecolorCursor(scx_extract_display(display),
scx_extract_cursor(cursor), scx_extract_cursor(cursor),
&f, &b); &f, &b);
return S48_UNSPECIFIC; S48_GC_RETURN(S48_UNSPECIFIC);
} }
s48_value scx_Free_Cursor(s48_value display, s48_value cursor) { s48_value scx_Free_Cursor(s48_value display, s48_value cursor) {
S48_DECLARE_GC_PROTECT_2(display, cursor);
XFreeCursor(scx_extract_display(display), XFreeCursor(scx_extract_display(display),
scx_extract_cursor(cursor)); scx_extract_cursor(cursor));
return S48_UNSPECIFIC; S48_GC_RETURN(S48_UNSPECIFIC);
} }
void scx_init_cursor(void) { void scx_init_cursor(void) {