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 scx_Intern_Atom(s48_value display, s48_value name,
|
||||||
s48_value only_if_exists) {
|
s48_value only_if_exists) {
|
||||||
Atom a = XInternAtom(scx_extract_display(display),
|
Atom a;
|
||||||
s48_extract_string(name),
|
S48_DECLARE_GC_PROTECT_3(display, name, only_if_exists);
|
||||||
S48_EXTRACT_BOOLEAN(only_if_exists));
|
a = XInternAtom(scx_extract_display(display),
|
||||||
return scx_enter_atom(a);
|
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,
|
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);
|
int i, n = s48_list_length(names);
|
||||||
char* cnames[n];
|
char* cnames[n];
|
||||||
Atom atoms[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++)
|
for (i = 0; i < n; i++)
|
||||||
cnames[i] = s48_extract_string(names);
|
cnames[i] = s48_extract_string(names);
|
||||||
if (!XInternAtoms(scx_extract_display(display),
|
if (!XInternAtoms(scx_extract_display(display),
|
||||||
cnames, n,
|
cnames, n,
|
||||||
S48_EXTRACT_BOOLEAN(only_if_exists),
|
S48_EXTRACT_BOOLEAN(only_if_exists),
|
||||||
atoms))
|
atoms))
|
||||||
return S48_FALSE;
|
S48_GC_RETURN(S48_FALSE);
|
||||||
else {
|
else {
|
||||||
s48_value l = S48_NULL;
|
|
||||||
S48_DECLARE_GC_PROTECT(1);
|
|
||||||
S48_GC_PROTECT_1(l);
|
|
||||||
for (i = n-1; i >= 0; i--)
|
for (i = n-1; i >= 0; i--)
|
||||||
l = s48_cons(scx_enter_atom(atoms[i]), l);
|
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) {
|
s48_value scx_Get_Atom_Name(s48_value display, s48_value a) {
|
||||||
char* s;
|
char* s;
|
||||||
s48_value str;
|
s48_value str;
|
||||||
|
S48_DECLARE_GC_PROTECT_3(display, a, str);
|
||||||
s = XGetAtomName(scx_extract_display(display),
|
s = XGetAtomName(scx_extract_display(display),
|
||||||
scx_extract_atom(a));
|
scx_extract_atom(a));
|
||||||
str = s48_enter_string(s);
|
str = s48_enter_string(s);
|
||||||
XFree(s);
|
XFree(s);
|
||||||
return str;
|
S48_GC_RETURN(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
s48_value scx_List_Properties(s48_value display, s48_value window) {
|
s48_value scx_List_Properties(s48_value display, s48_value window) {
|
||||||
int n, i;
|
int n, i;
|
||||||
Atom *atoms;
|
Atom *atoms;
|
||||||
s48_value l = S48_NULL;
|
s48_value l = S48_NULL;
|
||||||
S48_DECLARE_GC_PROTECT(1);
|
S48_DECLARE_GC_PROTECT_3(display, window, l);
|
||||||
atoms = XListProperties (scx_extract_display(display),
|
atoms = XListProperties (scx_extract_display(display),
|
||||||
scx_extract_window(window), &n);
|
scx_extract_window(window), &n);
|
||||||
|
|
||||||
S48_GC_PROTECT_1(l);
|
|
||||||
for (i = n-1; i >= 0; i--)
|
for (i = n-1; i >= 0; i--)
|
||||||
l = s48_cons(scx_enter_atom(atoms[i]), l);
|
l = s48_cons(scx_enter_atom(atoms[i]), l);
|
||||||
S48_GC_UNPROTECT();
|
|
||||||
XFree ((char*)atoms);
|
XFree ((char*)atoms);
|
||||||
return l;
|
S48_GC_RETURN(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
s48_value scx_Rotate_Window_Properties(s48_value display, s48_value window,
|
s48_value scx_Rotate_Window_Properties(s48_value display, s48_value window,
|
||||||
s48_value properties, s48_value delta) {
|
s48_value properties, s48_value delta) {
|
||||||
int i, n = s48_list_length(properties);
|
int i, n = s48_list_length(properties);
|
||||||
Atom p[n];
|
Atom p[n];
|
||||||
|
S48_DECLARE_GC_PROTECT_4(display, window, properties, delta);
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
p[i] = scx_extract_atom(S48_CAR(properties));
|
p[i] = scx_extract_atom(S48_CAR(properties));
|
||||||
properties = S48_CDR(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),
|
XRotateWindowProperties(scx_extract_display(display),
|
||||||
scx_extract_window(window),
|
scx_extract_window(window),
|
||||||
p, n, s48_extract_integer(delta));
|
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 scx_Delete_Property(s48_value display, s48_value window,
|
||||||
s48_value prop) {
|
s48_value prop) {
|
||||||
|
S48_DECLARE_GC_PROTECT_3(display, window, prop);
|
||||||
XDeleteProperty(scx_extract_display(display), scx_extract_window(window),
|
XDeleteProperty(scx_extract_display(display), scx_extract_window(window),
|
||||||
scx_extract_atom(prop));
|
scx_extract_atom(prop));
|
||||||
return S48_UNSPECIFIC;
|
S48_GC_RETURN(S48_UNSPECIFIC);
|
||||||
}
|
}
|
||||||
|
|
||||||
s48_value scx_property_binding = S48_FALSE;
|
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) {
|
char** data, int* nelements) {
|
||||||
int i;
|
int i;
|
||||||
s48_value d = S48_RECORD_REF(p, 2);
|
s48_value d = S48_RECORD_REF(p, 2);
|
||||||
|
S48_DECLARE_GC_PROTECT_2(p, d);
|
||||||
s48_check_record_type(p, scx_property_binding);
|
s48_check_record_type(p, scx_property_binding);
|
||||||
*type = scx_extract_atom(S48_RECORD_REF(p, 0));
|
*type = scx_extract_atom(S48_RECORD_REF(p, 0));
|
||||||
*format = S48_EXTRACT_ENUM(S48_RECORD_REF(p, 1),
|
*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;
|
break;
|
||||||
}
|
}
|
||||||
|
S48_GC_UNPROTECT();
|
||||||
}
|
}
|
||||||
|
|
||||||
s48_value scx_enter_property(Atom type, int format, char* data,
|
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;
|
int format, i;
|
||||||
unsigned long nitems, bytes_left;
|
unsigned long nitems, bytes_left;
|
||||||
unsigned char* data = NULL;
|
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),
|
if (XGetWindowProperty (scx_extract_display(display),
|
||||||
scx_extract_window(window),
|
scx_extract_window(window),
|
||||||
scx_extract_atom(atom),
|
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),
|
scx_extract_atom(req_type),
|
||||||
&actual_type, &format, &nitems,
|
&actual_type, &format, &nitems,
|
||||||
&bytes_left, &data) == Success) {
|
&bytes_left, &data) == Success) {
|
||||||
s48_value p = scx_enter_property(actual_type, format, data, nitems);
|
p = scx_enter_property(actual_type, format, data, nitems);
|
||||||
s48_value res = S48_NULL;
|
|
||||||
S48_DECLARE_GC_PROTECT(1);
|
|
||||||
|
|
||||||
XFree(data);
|
XFree(data);
|
||||||
S48_GC_PROTECT_1(p);
|
|
||||||
res = s48_cons(s48_enter_integer(bytes_left), p);
|
res = s48_cons(s48_enter_integer(bytes_left), p);
|
||||||
S48_GC_UNPROTECT();
|
S48_GC_RETURN(res);
|
||||||
return res;
|
|
||||||
} else
|
} else
|
||||||
/* Property does not exists */
|
/* Property does not exists */
|
||||||
return S48_FALSE;
|
S48_GC_RETURN(S48_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
s48_value scx_change_property_mode_binding = 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;
|
Atom type;
|
||||||
int format, nelements;
|
int format, nelements;
|
||||||
char* data;
|
char* data;
|
||||||
|
S48_DECLARE_GC_PROTECT_5(display, window, atom, mode, property);
|
||||||
|
|
||||||
scx_extract_property(property, &type, &format, &data, &nelements);
|
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),
|
scx_extract_change_property_mode(mode),
|
||||||
data, nelements);
|
data, nelements);
|
||||||
free(data);
|
free(data);
|
||||||
return S48_UNSPECIFIC;
|
S48_GC_RETURN(S48_UNSPECIFIC);
|
||||||
}
|
}
|
||||||
|
|
||||||
s48_value scx_Set_Selection_Owner(s48_value display, s48_value selection,
|
s48_value scx_Set_Selection_Owner(s48_value display, s48_value selection,
|
||||||
s48_value owner, s48_value time) {
|
s48_value owner, s48_value time) {
|
||||||
|
S48_DECLARE_GC_PROTECT_4(display, selection, owner, time);
|
||||||
XSetSelectionOwner(scx_extract_display(display), scx_extract_atom(selection),
|
XSetSelectionOwner(scx_extract_display(display), scx_extract_atom(selection),
|
||||||
scx_extract_window(owner), scx_extract_time(time));
|
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) {
|
s48_value scx_Get_Selection_Owner(s48_value display, s48_value selection) {
|
||||||
return scx_enter_window(XGetSelectionOwner(scx_extract_display(display),
|
Window w;
|
||||||
scx_extract_atom(selection)));
|
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 scx_Convert_Selection(s48_value display, s48_value selection,
|
||||||
s48_value target, s48_value property,
|
s48_value target, s48_value property,
|
||||||
s48_value requestor, s48_value time) {
|
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),
|
XConvertSelection(scx_extract_display(display), scx_extract_atom(selection),
|
||||||
scx_extract_atom(target), scx_extract_atom(property),
|
scx_extract_atom(target), scx_extract_atom(property),
|
||||||
scx_extract_window(requestor), scx_extract_time(time));
|
scx_extract_window(requestor), scx_extract_time(time));
|
||||||
return S48_UNSPECIFIC;
|
S48_GC_RETURN(S48_UNSPECIFIC);
|
||||||
}
|
}
|
||||||
|
|
||||||
void scx_init_property(void) {
|
void scx_init_property(void) {
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
s48_value scx_Draw_Image_String(s48_value display, s48_value drawable,
|
s48_value scx_Draw_Image_String(s48_value display, s48_value drawable,
|
||||||
s48_value gc, s48_value x, s48_value y,
|
s48_value gc, s48_value x, s48_value y,
|
||||||
s48_value string) {
|
s48_value string) {
|
||||||
|
S48_DECLARE_GC_PROTECT_6(display, drawable, gc, x, y, string);
|
||||||
XDrawImageString(scx_extract_display(display),
|
XDrawImageString(scx_extract_display(display),
|
||||||
scx_extract_drawable(drawable),
|
scx_extract_drawable(drawable),
|
||||||
scx_extract_gc(gc),
|
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_integer(y),
|
||||||
s48_extract_string(string),
|
s48_extract_string(string),
|
||||||
S48_STRING_LENGTH(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,
|
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) {
|
s48_value string) {
|
||||||
int i, len = s48_list_length(string);
|
int i, len = s48_list_length(string);
|
||||||
XChar2b chars[len];
|
XChar2b chars[len];
|
||||||
|
S48_DECLARE_GC_PROTECT_6(display, drawable, gc, x, y, string);
|
||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
chars[i].byte1 = s48_extract_char(S48_CAR(S48_CAR(string)));
|
chars[i].byte1 = s48_extract_char(S48_CAR(S48_CAR(string)));
|
||||||
chars[i].byte2 = s48_extract_char(S48_CDR(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(x),
|
||||||
s48_extract_integer(y),
|
s48_extract_integer(y),
|
||||||
chars, len);
|
chars, len);
|
||||||
return S48_UNSPECIFIC;
|
S48_GC_RETURN(S48_UNSPECIFIC);
|
||||||
}
|
}
|
||||||
|
|
||||||
s48_value scx_text_item = S48_FALSE;
|
s48_value scx_text_item = S48_FALSE;
|
||||||
|
|
||||||
void scx_extract_text_item(s48_value v, XTextItem* ti) {
|
void scx_extract_text_item(s48_value v, XTextItem* ti) {
|
||||||
|
S48_DECLARE_GC_PROTECT_1(v);
|
||||||
s48_check_record_type(v, scx_text_item);
|
s48_check_record_type(v, scx_text_item);
|
||||||
if (S48_RECORD_REF(v, 0) != S48_FALSE) {
|
if (S48_RECORD_REF(v, 0) != S48_FALSE) {
|
||||||
ti->nchars = S48_STRING_LENGTH(S48_RECORD_REF(v, 0));
|
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->delta = s48_extract_integer(S48_RECORD_REF(v, 1));
|
||||||
ti->font = scx_extract_font(S48_RECORD_REF(v, 2));
|
ti->font = scx_extract_font(S48_RECORD_REF(v, 2));
|
||||||
|
S48_GC_UNPROTECT();
|
||||||
/* Free all chars arrays! */
|
/* Free all chars arrays! */
|
||||||
}
|
}
|
||||||
|
|
||||||
void scx_extract_text_item_16(s48_value v, XTextItem16* ti) {
|
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);
|
s48_check_record_type(v, scx_text_item);
|
||||||
{
|
{
|
||||||
if (S48_RECORD_REF(v, 0) != S48_FALSE) {
|
if (S48_RECORD_REF(v, 0) != S48_FALSE) {
|
||||||
s48_value l = S48_RECORD_REF(v, 0);
|
int i, n;
|
||||||
int i, n = s48_list_length(l);
|
l = S48_RECORD_REF(v, 0);
|
||||||
|
n = s48_list_length(l);
|
||||||
XChar2b* s = (XChar2b*)malloc(n * sizeof(XChar2b));
|
XChar2b* s = (XChar2b*)malloc(n * sizeof(XChar2b));
|
||||||
for (i = n-1; i >= 0; i--) {
|
for (i = n-1; i >= 0; i--) {
|
||||||
ti->chars[i].byte1 = s48_extract_integer(S48_CAR(S48_CAR(l)));
|
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->delta = s48_extract_integer(S48_RECORD_REF(v, 1));
|
||||||
ti->font = scx_extract_font(S48_RECORD_REF(v, 2));
|
ti->font = scx_extract_font(S48_RECORD_REF(v, 2));
|
||||||
}
|
}
|
||||||
|
S48_GC_UNPROTECT();
|
||||||
/* Free all chars arrays! */
|
/* Free all chars arrays! */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,6 +86,7 @@ s48_value scx_Draw_Text(s48_value display, s48_value drawable,
|
||||||
s48_value items) {
|
s48_value items) {
|
||||||
int i, len = s48_list_length(items);
|
int i, len = s48_list_length(items);
|
||||||
XTextItem parts[len];
|
XTextItem parts[len];
|
||||||
|
S48_DECLARE_GC_PROTECT_6(display, drawable, gc, x, y, items);
|
||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
scx_extract_text_item(S48_CAR(items), &parts[i]);
|
scx_extract_text_item(S48_CAR(items), &parts[i]);
|
||||||
items = S48_CDR(items);
|
items = S48_CDR(items);
|
||||||
|
@ -90,7 +99,7 @@ s48_value scx_Draw_Text(s48_value display, s48_value drawable,
|
||||||
parts, len);
|
parts, len);
|
||||||
for (i = 0; i < len; i++)
|
for (i = 0; i < len; i++)
|
||||||
free(parts[i].chars);
|
free(parts[i].chars);
|
||||||
return S48_UNSPECIFIC;
|
S48_GC_RETURN(S48_UNSPECIFIC);
|
||||||
}
|
}
|
||||||
|
|
||||||
s48_value scx_Draw_Text_16(s48_value display, s48_value drawable,
|
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) {
|
s48_value items) {
|
||||||
int i, len = s48_list_length(items);
|
int i, len = s48_list_length(items);
|
||||||
XTextItem16 parts[len];
|
XTextItem16 parts[len];
|
||||||
|
S48_DECLARE_GC_PROTECT_6(display, drawable, gc, x, y, items);
|
||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
scx_extract_text_item_16(S48_CAR(items), &parts[i]);
|
scx_extract_text_item_16(S48_CAR(items), &parts[i]);
|
||||||
items = S48_CDR(items);
|
items = S48_CDR(items);
|
||||||
|
@ -110,18 +120,19 @@ s48_value scx_Draw_Text_16(s48_value display, s48_value drawable,
|
||||||
parts, len);
|
parts, len);
|
||||||
for (i = 0; i < len; i++)
|
for (i = 0; i < len; i++)
|
||||||
free(parts[i].chars);
|
free(parts[i].chars);
|
||||||
return S48_UNSPECIFIC;
|
S48_GC_RETURN(S48_UNSPECIFIC);
|
||||||
}
|
}
|
||||||
|
|
||||||
s48_value scx_Text_Extents(s48_value font_struct, s48_value string) {
|
s48_value scx_Text_Extents(s48_value font_struct, s48_value string) {
|
||||||
XCharStruct overall;
|
XCharStruct overall;
|
||||||
int dir, ascent, descent;
|
int dir, ascent, descent;
|
||||||
|
S48_DECLARE_GC_PROTECT_2(font_struct, string);
|
||||||
XTextExtents(scx_extract_fontstruct(font_struct),
|
XTextExtents(scx_extract_fontstruct(font_struct),
|
||||||
s48_extract_string(string),
|
s48_extract_string(string),
|
||||||
S48_STRING_LENGTH(string),
|
S48_STRING_LENGTH(string),
|
||||||
&dir, &ascent, &descent,
|
&dir, &ascent, &descent,
|
||||||
&overall);
|
&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) {
|
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 dir, ascent, descent;
|
||||||
int i, len = s48_list_length(string);
|
int i, len = s48_list_length(string);
|
||||||
XChar2b chars[len];
|
XChar2b chars[len];
|
||||||
|
S48_DECLARE_GC_PROTECT_2(font_struct, string);
|
||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
chars[i].byte1 = s48_extract_char(S48_CAR(S48_CAR(string)));
|
chars[i].byte1 = s48_extract_char(S48_CAR(S48_CAR(string)));
|
||||||
chars[i].byte2 = s48_extract_char(S48_CDR(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,
|
chars, len,
|
||||||
&dir, &ascent, &descent,
|
&dir, &ascent, &descent,
|
||||||
&overall);
|
&overall);
|
||||||
return scx_enter_charstruct(&overall);
|
S48_GC_RETURN(scx_enter_charstruct(&overall));
|
||||||
}
|
}
|
||||||
|
|
||||||
void scx_init_text(void) {
|
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;
|
s48_value scx_enum_set_type_binding = S48_FALSE;
|
||||||
|
|
||||||
extern unsigned long s48_extract_enum_set(s48_value v, s48_value type) {
|
extern unsigned long s48_extract_enum_set(s48_value v, s48_value type) {
|
||||||
s48_value enum_set_type = scx_enum_set_type_binding;
|
S48_DECLARE_GC_PROTECT_2(v, type);
|
||||||
s48_check_record_type(v, enum_set_type);
|
s48_check_record_type(v, scx_enum_set_type_binding);
|
||||||
if (S48_UNSAFE_SHARED_BINDING_REF(type) !=
|
if (S48_UNSAFE_SHARED_BINDING_REF(type) !=
|
||||||
S48_UNSAFE_RECORD_REF(v, 0))
|
S48_UNSAFE_RECORD_REF(v, 0))
|
||||||
s48_raise_argument_type_error(v);
|
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) {
|
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_value scx_struct_cache_ref(void* cpointer, s48_value list) {
|
||||||
|
S48_DECLARE_GC_PROTECT_1(list);
|
||||||
while (list != S48_NULL) {
|
while (list != S48_NULL) {
|
||||||
if (S48_EXTRACT_POINTER(S48_CAR(S48_CAR(list))) == cpointer)
|
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);
|
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) {
|
void scx_struct_cache_set(void* cpointer, s48_value* l, s48_value v) {
|
||||||
s48_value list = *l;
|
s48_value list = *l;
|
||||||
s48_value previous = S48_FALSE;
|
s48_value previous = S48_FALSE;
|
||||||
s48_value pair = S48_FALSE;
|
s48_value pair = S48_FALSE;
|
||||||
S48_DECLARE_GC_PROTECT(3);
|
S48_DECLARE_GC_PROTECT(4);
|
||||||
S48_GC_PROTECT_3(list, pair, previous);
|
S48_GC_PROTECT_4(v, list, pair, previous);
|
||||||
|
|
||||||
/* create the new entry */
|
/* create the new entry */
|
||||||
pair = s48_make_weak_pointer(v);
|
pair = s48_make_weak_pointer(v);
|
||||||
|
|
|
@ -3,11 +3,12 @@
|
||||||
s48_value scx_Get_Default(s48_value dpy, s48_value program,
|
s48_value scx_Get_Default(s48_value dpy, s48_value program,
|
||||||
s48_value option) {
|
s48_value option) {
|
||||||
char* ret;
|
char* ret;
|
||||||
|
S48_DECLARE_GC_PROTECT_3(dpy, program, option);
|
||||||
if (ret = XGetDefault(scx_extract_display(dpy),
|
if (ret = XGetDefault(scx_extract_display(dpy),
|
||||||
s48_extract_string(program),
|
s48_extract_string(program),
|
||||||
s48_extract_string(option)))
|
s48_extract_string(option)))
|
||||||
return s48_enter_string(ret);
|
S48_GC_RETURN(s48_enter_string(ret));
|
||||||
else return S48_FALSE;
|
else S48_GC_RETURN(S48_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
s48_value scx_Resource_Manager_String(s48_value dpy) {
|
s48_value scx_Resource_Manager_String(s48_value dpy) {
|
||||||
|
@ -21,13 +22,12 @@ s48_value scx_Parse_Geometry(s48_value strg) {
|
||||||
s48_value ret;
|
s48_value ret;
|
||||||
int x, y, res;
|
int x, y, res;
|
||||||
unsigned int w, h;
|
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);
|
res = XParseGeometry (s48_extract_string(strg), &x, &y, &w, &h);
|
||||||
|
|
||||||
ret = s48_make_vector(6, S48_FALSE);
|
ret = s48_make_vector(6, S48_FALSE);
|
||||||
|
|
||||||
S48_GC_PROTECT_1(ret);
|
|
||||||
if (res & XNegative) S48_VECTOR_SET(ret, 0, S48_TRUE);
|
if (res & XNegative) S48_VECTOR_SET(ret, 0, S48_TRUE);
|
||||||
if (res & YNegative) S48_VECTOR_SET(ret, 1, S48_TRUE);
|
if (res & YNegative) S48_VECTOR_SET(ret, 1, S48_TRUE);
|
||||||
if (res & XValue) S48_VECTOR_SET(ret, 2, s48_enter_integer(x));
|
if (res & XValue) S48_VECTOR_SET(ret, 2, s48_enter_integer(x));
|
||||||
|
|
Loading…
Reference in New Issue