diff --git a/c/xlib/util.c b/c/xlib/util.c index 0349e20..eb9395a 100644 --- a/c/xlib/util.c +++ b/c/xlib/util.c @@ -1,54 +1,73 @@ #include "xlib.h" +#include "scheme48.h" -static s48_value P_Get_Default (d, program, option) s48_value d, program, option; { - register char *ret; - - Check_Type (d, T_Display); - if (ret = XGetDefault (DISPLAY(d)->dpy, Get_Strsym (program), - Get_Strsym (option))) - return Make_String (ret, strlen (ret)); - return S48_FALSE; +s48_value scx_Get_Default (s48_value Xdpy, s48_value program, + s48_value option) { + char* ret; + if (ret = XGetDefault (SCX_EXTRACT_DISPLAY(Xdpy), + s48_extract_string(program), + s48_extract_string(option))) + return s48_enter_string(ret); + return S48_FALSE; } -static s48_value P_Resource_Manager_String (d) s48_value d; { - register char *ret; - Check_Type (d, T_Display); - ret = XResourceManagerString (DISPLAY(d)->dpy); - return ret ? Make_String (ret, strlen (ret)) : S48_FALSE; +s48_value scx_Resource_Manager_String (s48_value Xdpy) { + char* ret; + + ret = XResourceManagerString (SCX_EXTRACT_DISPLAY(Xdpy)); + return ret ? s48_enter_string(ret) : S48_FALSE; } -static s48_value P_Parse_Geometry (string) s48_value string; { - s48_value ret, t; - register mask; - int x, y; - unsigned w, h; - mask = XParseGeometry (Get_Strsym (string), &x, &y, &w, &h); - t = ret = P_Make_List (s48_enter_integer (6), S48_FALSE); - if (mask & XNegative) S48_CAR (t) = S48_TRUE; t = S48_CDR (t); - if (mask & YNegative) S48_CAR (t) = S48_TRUE; t = S48_CDR (t); - if (mask & XValue) S48_CAR (t) = s48_enter_integer (x); t = S48_CDR (t); - if (mask & YValue) S48_CAR (t) = s48_enter_integer (y); t = S48_CDR (t); - if (mask & WidthValue) S48_CAR (t) = s48_enter_integer (w); t = S48_CDR (t); - if (mask & HeightValue) S48_CAR (t) = s48_enter_integer (h); - return ret; + +s48_value scx_Parse_Geometry (s48_value strg) { + s48_value ret; + int x, y, res; + unsigned int w, h; + S48_DECLARE_GC_PROTECT(1); + + res = XParseGeometry (s48_extract_string(strg), &x, &y, &w, &h); + S48_GC_PROTECT_1(ret); + if (res & XNegative) { + ret = s48_cons(S48_TRUE, S48_NULL); + }else{ + ret = s48_cons(S48_FALSE, S48_NULL); + } + if (res & YNegative) { + ret = s48_cons(S48_TRUE, ret); + }else{ + ret = s48_cons(S48_FALSE, ret); + } + if (res & XValue) { + ret = s48_cons(s48_enter_integer(x), ret); + }else{ + ret = s48_cons(S48_FALSE, ret); + } + if (res & YValue) { + ret = s48_cons(s48_enter_integer(y), ret); + }else{ + ret = s48_cons(S48_FALSE, ret); + } + if (res & WidthValue) { + ret = s48_cons(s48_enter_integer(w), ret); + }else{ + ret = s48_cons(S48_FALSE, ret); + } + if (res & HeightValue) { + ret = s48_cons(s48_enter_integer (h), ret); + }else{ + ret = s48_cons(S48_FALSE, ret); + } + S48_GC_UNPROTECT(); + return ret; } -static s48_value P_Parse_Color (d, cmap, spec) s48_value d, cmap, spec; { - XColor ret; +// scx_Parse_Color is in colormap.c - Check_Type (d, T_Display); - if (XParseColor (DISPLAY(d)->dpy, Get_Colormap (cmap), Get_Strsym (spec), - &ret)) - return Make_Color (ret.red, ret.green, ret.blue); - return S48_FALSE; -} -elk_init_xlib_util () { - Define_Primitive (P_Get_Default, "get-default", 3, 3, EVAL); - Define_Primitive (P_Resource_Manager_String, - "resource-manager-string", 1, 1, EVAL); - Define_Primitive (P_Parse_Geometry, "parse-geometry", 1, 1, EVAL); - Define_Primitive (P_Parse_Color, "parse-color", 3, 3, EVAL); +void scx_init_util(void) { + S48_EXPORT_FUNCTION(scx_Get_Default); + S48_EXPORT_FUNCTION(scx_Resource_Manager_String); + S48_EXPORT_FUNCTION(scx_Parse_Geometry); }