fixed gc protection
This commit is contained in:
parent
87b35c474c
commit
629bfa1d73
|
@ -4,10 +4,12 @@
|
|||
|
||||
s48_value scx_Intern_Atom(s48_value display, s48_value name,
|
||||
s48_value only_if_exists) {
|
||||
Atom a = XInternAtom(scx_extract_display(display),
|
||||
s48_extract_string(name),
|
||||
S48_EXTRACT_BOOLEAN(only_if_exists));
|
||||
return scx_enter_atom(a);
|
||||
Atom a;
|
||||
S48_DECLARE_GC_PROTECT_3(display, name, only_if_exists);
|
||||
a = XInternAtom(scx_extract_display(display),
|
||||
s48_extract_string(name),
|
||||
S48_EXTRACT_BOOLEAN(only_if_exists));
|
||||
S48_GC_RETURN(scx_enter_atom(a));
|
||||
}
|
||||
|
||||
s48_value scx_Intern_Atoms(s48_value display, s48_value names,
|
||||
|
@ -15,53 +17,52 @@ s48_value scx_Intern_Atoms(s48_value display, s48_value names,
|
|||
int i, n = s48_list_length(names);
|
||||
char* cnames[n];
|
||||
Atom atoms[n];
|
||||
s48_value l = S48_NULL;
|
||||
S48_DECLARE_GC_PROTECT_4(display, names, only_if_exists, l);
|
||||
for (i = 0; i < n; i++)
|
||||
cnames[i] = s48_extract_string(names);
|
||||
if (!XInternAtoms(scx_extract_display(display),
|
||||
cnames, n,
|
||||
S48_EXTRACT_BOOLEAN(only_if_exists),
|
||||
atoms))
|
||||
return S48_FALSE;
|
||||
S48_GC_RETURN(S48_FALSE);
|
||||
else {
|
||||
s48_value l = S48_NULL;
|
||||
S48_DECLARE_GC_PROTECT(1);
|
||||
S48_GC_PROTECT_1(l);
|
||||
for (i = n-1; i >= 0; i--)
|
||||
l = s48_cons(scx_enter_atom(atoms[i]), l);
|
||||
return l;
|
||||
S48_GC_RETURN(l);
|
||||
}
|
||||
}
|
||||
|
||||
s48_value scx_Get_Atom_Name(s48_value display, s48_value a) {
|
||||
char* s;
|
||||
s48_value str;
|
||||
S48_DECLARE_GC_PROTECT_3(display, a, str);
|
||||
s = XGetAtomName(scx_extract_display(display),
|
||||
scx_extract_atom(a));
|
||||
str = s48_enter_string(s);
|
||||
XFree(s);
|
||||
return str;
|
||||
S48_GC_RETURN(str);
|
||||
}
|
||||
|
||||
s48_value scx_List_Properties(s48_value display, s48_value window) {
|
||||
int n, i;
|
||||
Atom *atoms;
|
||||
s48_value l = S48_NULL;
|
||||
S48_DECLARE_GC_PROTECT(1);
|
||||
S48_DECLARE_GC_PROTECT_3(display, window, l);
|
||||
atoms = XListProperties (scx_extract_display(display),
|
||||
scx_extract_window(window), &n);
|
||||
|
||||
S48_GC_PROTECT_1(l);
|
||||
for (i = n-1; i >= 0; i--)
|
||||
l = s48_cons(scx_enter_atom(atoms[i]), l);
|
||||
S48_GC_UNPROTECT();
|
||||
XFree ((char*)atoms);
|
||||
return l;
|
||||
S48_GC_RETURN(l);
|
||||
}
|
||||
|
||||
s48_value scx_Rotate_Window_Properties(s48_value display, s48_value window,
|
||||
s48_value properties, s48_value delta) {
|
||||
int i, n = s48_list_length(properties);
|
||||
Atom p[n];
|
||||
S48_DECLARE_GC_PROTECT_4(display, window, properties, delta);
|
||||
for (i = 0; i < n; i++) {
|
||||
p[i] = scx_extract_atom(S48_CAR(properties));
|
||||
properties = S48_CDR(properties);
|
||||
|
@ -69,14 +70,15 @@ s48_value scx_Rotate_Window_Properties(s48_value display, s48_value window,
|
|||
XRotateWindowProperties(scx_extract_display(display),
|
||||
scx_extract_window(window),
|
||||
p, n, s48_extract_integer(delta));
|
||||
return S48_UNSPECIFIC;
|
||||
S48_GC_RETURN(S48_UNSPECIFIC);
|
||||
}
|
||||
|
||||
s48_value scx_Delete_Property(s48_value display, s48_value window,
|
||||
s48_value prop) {
|
||||
S48_DECLARE_GC_PROTECT_3(display, window, prop);
|
||||
XDeleteProperty(scx_extract_display(display), scx_extract_window(window),
|
||||
scx_extract_atom(prop));
|
||||
return S48_UNSPECIFIC;
|
||||
S48_GC_RETURN(S48_UNSPECIFIC);
|
||||
}
|
||||
|
||||
s48_value scx_property_binding = S48_FALSE;
|
||||
|
@ -87,6 +89,7 @@ void scx_extract_property(s48_value p, Atom* type, int* format,
|
|||
char** data, int* nelements) {
|
||||
int i;
|
||||
s48_value d = S48_RECORD_REF(p, 2);
|
||||
S48_DECLARE_GC_PROTECT_2(p, d);
|
||||
s48_check_record_type(p, scx_property_binding);
|
||||
*type = scx_extract_atom(S48_RECORD_REF(p, 0));
|
||||
*format = S48_EXTRACT_ENUM(S48_RECORD_REF(p, 1),
|
||||
|
@ -117,6 +120,7 @@ void scx_extract_property(s48_value p, Atom* type, int* format,
|
|||
}
|
||||
break;
|
||||
}
|
||||
S48_GC_UNPROTECT();
|
||||
}
|
||||
|
||||
s48_value scx_enter_property(Atom type, int format, char* data,
|
||||
|
@ -161,6 +165,9 @@ s48_value scx_Get_Window_Property(s48_value display, s48_value window,
|
|||
int format, i;
|
||||
unsigned long nitems, bytes_left;
|
||||
unsigned char* data = NULL;
|
||||
s48_value p = S48_FALSE, res = S48_NULL;
|
||||
S48_DECLARE_GC_PROTECT_9(display, window, atom, start, len, deletep,
|
||||
req_type, p, res);
|
||||
if (XGetWindowProperty (scx_extract_display(display),
|
||||
scx_extract_window(window),
|
||||
scx_extract_atom(atom),
|
||||
|
@ -170,18 +177,14 @@ s48_value scx_Get_Window_Property(s48_value display, s48_value window,
|
|||
scx_extract_atom(req_type),
|
||||
&actual_type, &format, &nitems,
|
||||
&bytes_left, &data) == Success) {
|
||||
s48_value p = scx_enter_property(actual_type, format, data, nitems);
|
||||
s48_value res = S48_NULL;
|
||||
S48_DECLARE_GC_PROTECT(1);
|
||||
p = scx_enter_property(actual_type, format, data, nitems);
|
||||
|
||||
XFree(data);
|
||||
S48_GC_PROTECT_1(p);
|
||||
res = s48_cons(s48_enter_integer(bytes_left), p);
|
||||
S48_GC_UNPROTECT();
|
||||
return res;
|
||||
S48_GC_RETURN(res);
|
||||
} else
|
||||
/* Property does not exists */
|
||||
return S48_FALSE;
|
||||
S48_GC_RETURN(S48_FALSE);
|
||||
}
|
||||
|
||||
s48_value scx_change_property_mode_binding = S48_FALSE;
|
||||
|
@ -194,6 +197,7 @@ s48_value scx_Change_Property(s48_value display, s48_value window,
|
|||
Atom type;
|
||||
int format, nelements;
|
||||
char* data;
|
||||
S48_DECLARE_GC_PROTECT_5(display, window, atom, mode, property);
|
||||
|
||||
scx_extract_property(property, &type, &format, &data, &nelements);
|
||||
|
||||
|
@ -202,28 +206,34 @@ s48_value scx_Change_Property(s48_value display, s48_value window,
|
|||
scx_extract_change_property_mode(mode),
|
||||
data, nelements);
|
||||
free(data);
|
||||
return S48_UNSPECIFIC;
|
||||
S48_GC_RETURN(S48_UNSPECIFIC);
|
||||
}
|
||||
|
||||
s48_value scx_Set_Selection_Owner(s48_value display, s48_value selection,
|
||||
s48_value owner, s48_value time) {
|
||||
S48_DECLARE_GC_PROTECT_4(display, selection, owner, time);
|
||||
XSetSelectionOwner(scx_extract_display(display), scx_extract_atom(selection),
|
||||
scx_extract_window(owner), scx_extract_time(time));
|
||||
return S48_UNSPECIFIC;
|
||||
S48_GC_RETURN(S48_UNSPECIFIC);
|
||||
}
|
||||
|
||||
s48_value scx_Get_Selection_Owner(s48_value display, s48_value selection) {
|
||||
return scx_enter_window(XGetSelectionOwner(scx_extract_display(display),
|
||||
scx_extract_atom(selection)));
|
||||
Window w;
|
||||
S48_DECLARE_GC_PROTECT_2(display, selection);
|
||||
w = XGetSelectionOwner(scx_extract_display(display),
|
||||
scx_extract_atom(selection));
|
||||
S48_GC_RETURN(scx_enter_window(w));
|
||||
}
|
||||
|
||||
s48_value scx_Convert_Selection(s48_value display, s48_value selection,
|
||||
s48_value target, s48_value property,
|
||||
s48_value requestor, s48_value time) {
|
||||
S48_DECLARE_GC_PROTECT_6(display, selection, target, property, requestor,
|
||||
time);
|
||||
XConvertSelection(scx_extract_display(display), scx_extract_atom(selection),
|
||||
scx_extract_atom(target), scx_extract_atom(property),
|
||||
scx_extract_window(requestor), scx_extract_time(time));
|
||||
return S48_UNSPECIFIC;
|
||||
S48_GC_RETURN(S48_UNSPECIFIC);
|
||||
}
|
||||
|
||||
void scx_init_property(void) {
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
s48_value scx_Draw_Image_String(s48_value display, s48_value drawable,
|
||||
s48_value gc, s48_value x, s48_value y,
|
||||
s48_value string) {
|
||||
S48_DECLARE_GC_PROTECT_6(display, drawable, gc, x, y, string);
|
||||
XDrawImageString(scx_extract_display(display),
|
||||
scx_extract_drawable(drawable),
|
||||
scx_extract_gc(gc),
|
||||
|
@ -12,7 +13,7 @@ s48_value scx_Draw_Image_String(s48_value display, s48_value drawable,
|
|||
s48_extract_integer(y),
|
||||
s48_extract_string(string),
|
||||
S48_STRING_LENGTH(string));
|
||||
return S48_UNSPECIFIC;
|
||||
S48_GC_RETURN(S48_UNSPECIFIC);
|
||||
}
|
||||
|
||||
s48_value scx_Draw_Image_String_16(s48_value display, s48_value drawable,
|
||||
|
@ -20,6 +21,7 @@ s48_value scx_Draw_Image_String_16(s48_value display, s48_value drawable,
|
|||
s48_value string) {
|
||||
int i, len = s48_list_length(string);
|
||||
XChar2b chars[len];
|
||||
S48_DECLARE_GC_PROTECT_6(display, drawable, gc, x, y, string);
|
||||
for (i = 0; i < len; i++) {
|
||||
chars[i].byte1 = s48_extract_char(S48_CAR(S48_CAR(string)));
|
||||
chars[i].byte2 = s48_extract_char(S48_CDR(S48_CAR(string)));
|
||||
|
@ -31,12 +33,13 @@ s48_value scx_Draw_Image_String_16(s48_value display, s48_value drawable,
|
|||
s48_extract_integer(x),
|
||||
s48_extract_integer(y),
|
||||
chars, len);
|
||||
return S48_UNSPECIFIC;
|
||||
S48_GC_RETURN(S48_UNSPECIFIC);
|
||||
}
|
||||
|
||||
s48_value scx_text_item = S48_FALSE;
|
||||
|
||||
void scx_extract_text_item(s48_value v, XTextItem* ti) {
|
||||
S48_DECLARE_GC_PROTECT_1(v);
|
||||
s48_check_record_type(v, scx_text_item);
|
||||
if (S48_RECORD_REF(v, 0) != S48_FALSE) {
|
||||
ti->nchars = S48_STRING_LENGTH(S48_RECORD_REF(v, 0));
|
||||
|
@ -48,15 +51,19 @@ void scx_extract_text_item(s48_value v, XTextItem* ti) {
|
|||
}
|
||||
ti->delta = s48_extract_integer(S48_RECORD_REF(v, 1));
|
||||
ti->font = scx_extract_font(S48_RECORD_REF(v, 2));
|
||||
S48_GC_UNPROTECT();
|
||||
/* Free all chars arrays! */
|
||||
}
|
||||
|
||||
void scx_extract_text_item_16(s48_value v, XTextItem16* ti) {
|
||||
s48_value l = S48_NULL;
|
||||
S48_DECLARE_GC_PROTECT_2(v, l);
|
||||
s48_check_record_type(v, scx_text_item);
|
||||
{
|
||||
if (S48_RECORD_REF(v, 0) != S48_FALSE) {
|
||||
s48_value l = S48_RECORD_REF(v, 0);
|
||||
int i, n = s48_list_length(l);
|
||||
int i, n;
|
||||
l = S48_RECORD_REF(v, 0);
|
||||
n = s48_list_length(l);
|
||||
XChar2b* s = (XChar2b*)malloc(n * sizeof(XChar2b));
|
||||
for (i = n-1; i >= 0; i--) {
|
||||
ti->chars[i].byte1 = s48_extract_integer(S48_CAR(S48_CAR(l)));
|
||||
|
@ -70,6 +77,7 @@ void scx_extract_text_item_16(s48_value v, XTextItem16* ti) {
|
|||
ti->delta = s48_extract_integer(S48_RECORD_REF(v, 1));
|
||||
ti->font = scx_extract_font(S48_RECORD_REF(v, 2));
|
||||
}
|
||||
S48_GC_UNPROTECT();
|
||||
/* Free all chars arrays! */
|
||||
}
|
||||
|
||||
|
@ -78,6 +86,7 @@ s48_value scx_Draw_Text(s48_value display, s48_value drawable,
|
|||
s48_value items) {
|
||||
int i, len = s48_list_length(items);
|
||||
XTextItem parts[len];
|
||||
S48_DECLARE_GC_PROTECT_6(display, drawable, gc, x, y, items);
|
||||
for (i = 0; i < len; i++) {
|
||||
scx_extract_text_item(S48_CAR(items), &parts[i]);
|
||||
items = S48_CDR(items);
|
||||
|
@ -90,7 +99,7 @@ s48_value scx_Draw_Text(s48_value display, s48_value drawable,
|
|||
parts, len);
|
||||
for (i = 0; i < len; i++)
|
||||
free(parts[i].chars);
|
||||
return S48_UNSPECIFIC;
|
||||
S48_GC_RETURN(S48_UNSPECIFIC);
|
||||
}
|
||||
|
||||
s48_value scx_Draw_Text_16(s48_value display, s48_value drawable,
|
||||
|
@ -98,6 +107,7 @@ s48_value scx_Draw_Text_16(s48_value display, s48_value drawable,
|
|||
s48_value items) {
|
||||
int i, len = s48_list_length(items);
|
||||
XTextItem16 parts[len];
|
||||
S48_DECLARE_GC_PROTECT_6(display, drawable, gc, x, y, items);
|
||||
for (i = 0; i < len; i++) {
|
||||
scx_extract_text_item_16(S48_CAR(items), &parts[i]);
|
||||
items = S48_CDR(items);
|
||||
|
@ -110,18 +120,19 @@ s48_value scx_Draw_Text_16(s48_value display, s48_value drawable,
|
|||
parts, len);
|
||||
for (i = 0; i < len; i++)
|
||||
free(parts[i].chars);
|
||||
return S48_UNSPECIFIC;
|
||||
S48_GC_RETURN(S48_UNSPECIFIC);
|
||||
}
|
||||
|
||||
s48_value scx_Text_Extents(s48_value font_struct, s48_value string) {
|
||||
XCharStruct overall;
|
||||
int dir, ascent, descent;
|
||||
S48_DECLARE_GC_PROTECT_2(font_struct, string);
|
||||
XTextExtents(scx_extract_fontstruct(font_struct),
|
||||
s48_extract_string(string),
|
||||
S48_STRING_LENGTH(string),
|
||||
&dir, &ascent, &descent,
|
||||
&overall);
|
||||
return scx_enter_charstruct(&overall);
|
||||
S48_GC_RETURN(scx_enter_charstruct(&overall));
|
||||
}
|
||||
|
||||
s48_value scx_Text_Extents_16(s48_value font_struct, s48_value string) {
|
||||
|
@ -129,6 +140,7 @@ s48_value scx_Text_Extents_16(s48_value font_struct, s48_value string) {
|
|||
int dir, ascent, descent;
|
||||
int i, len = s48_list_length(string);
|
||||
XChar2b chars[len];
|
||||
S48_DECLARE_GC_PROTECT_2(font_struct, string);
|
||||
for (i = 0; i < len; i++) {
|
||||
chars[i].byte1 = s48_extract_char(S48_CAR(S48_CAR(string)));
|
||||
chars[i].byte2 = s48_extract_char(S48_CDR(S48_CAR(string)));
|
||||
|
@ -138,7 +150,7 @@ s48_value scx_Text_Extents_16(s48_value font_struct, s48_value string) {
|
|||
chars, len,
|
||||
&dir, &ascent, &descent,
|
||||
&overall);
|
||||
return scx_enter_charstruct(&overall);
|
||||
S48_GC_RETURN(scx_enter_charstruct(&overall));
|
||||
}
|
||||
|
||||
void scx_init_text(void) {
|
||||
|
|
|
@ -72,12 +72,12 @@ int s48_list_length(s48_value list) {
|
|||
s48_value scx_enum_set_type_binding = S48_FALSE;
|
||||
|
||||
extern unsigned long s48_extract_enum_set(s48_value v, s48_value type) {
|
||||
s48_value enum_set_type = scx_enum_set_type_binding;
|
||||
s48_check_record_type(v, enum_set_type);
|
||||
S48_DECLARE_GC_PROTECT_2(v, type);
|
||||
s48_check_record_type(v, scx_enum_set_type_binding);
|
||||
if (S48_UNSAFE_SHARED_BINDING_REF(type) !=
|
||||
S48_UNSAFE_RECORD_REF(v, 0))
|
||||
s48_raise_argument_type_error(v);
|
||||
return s48_extract_integer(S48_UNSAFE_RECORD_REF(v, 1));
|
||||
S48_GC_RETURN(s48_extract_integer(S48_UNSAFE_RECORD_REF(v, 1)));
|
||||
}
|
||||
|
||||
s48_value s48_enter_enum_set(unsigned long v, s48_value type) {
|
||||
|
@ -91,20 +91,21 @@ s48_value s48_enter_enum_set(unsigned long v, s48_value type) {
|
|||
}
|
||||
|
||||
s48_value scx_struct_cache_ref(void* cpointer, s48_value list) {
|
||||
S48_DECLARE_GC_PROTECT_1(list);
|
||||
while (list != S48_NULL) {
|
||||
if (S48_EXTRACT_POINTER(S48_CAR(S48_CAR(list))) == cpointer)
|
||||
return S48_WEAK_POINTER_REF(S48_CDR(S48_CAR(list)));
|
||||
S48_GC_RETURN(S48_WEAK_POINTER_REF(S48_CDR(S48_CAR(list))));
|
||||
list = S48_CDR(list);
|
||||
}
|
||||
return S48_FALSE;
|
||||
S48_GC_RETURN(S48_FALSE);
|
||||
}
|
||||
|
||||
void scx_struct_cache_set(void* cpointer, s48_value* l, s48_value v) {
|
||||
s48_value list = *l;
|
||||
s48_value previous = S48_FALSE;
|
||||
s48_value pair = S48_FALSE;
|
||||
S48_DECLARE_GC_PROTECT(3);
|
||||
S48_GC_PROTECT_3(list, pair, previous);
|
||||
S48_DECLARE_GC_PROTECT(4);
|
||||
S48_GC_PROTECT_4(v, list, pair, previous);
|
||||
|
||||
/* create the new entry */
|
||||
pair = s48_make_weak_pointer(v);
|
||||
|
|
|
@ -3,11 +3,12 @@
|
|||
s48_value scx_Get_Default(s48_value dpy, s48_value program,
|
||||
s48_value option) {
|
||||
char* ret;
|
||||
S48_DECLARE_GC_PROTECT_3(dpy, program, option);
|
||||
if (ret = XGetDefault(scx_extract_display(dpy),
|
||||
s48_extract_string(program),
|
||||
s48_extract_string(option)))
|
||||
return s48_enter_string(ret);
|
||||
else return S48_FALSE;
|
||||
S48_GC_RETURN(s48_enter_string(ret));
|
||||
else S48_GC_RETURN(S48_FALSE);
|
||||
}
|
||||
|
||||
s48_value scx_Resource_Manager_String(s48_value dpy) {
|
||||
|
@ -21,13 +22,12 @@ s48_value scx_Parse_Geometry(s48_value strg) {
|
|||
s48_value ret;
|
||||
int x, y, res;
|
||||
unsigned int w, h;
|
||||
S48_DECLARE_GC_PROTECT(1);
|
||||
S48_DECLARE_GC_PROTECT_2(strg, ret);
|
||||
|
||||
res = XParseGeometry (s48_extract_string(strg), &x, &y, &w, &h);
|
||||
|
||||
ret = s48_make_vector(6, S48_FALSE);
|
||||
|
||||
S48_GC_PROTECT_1(ret);
|
||||
if (res & XNegative) S48_VECTOR_SET(ret, 0, S48_TRUE);
|
||||
if (res & YNegative) S48_VECTOR_SET(ret, 1, S48_TRUE);
|
||||
if (res & XValue) S48_VECTOR_SET(ret, 2, s48_enter_integer(x));
|
||||
|
|
Loading…
Reference in New Issue