226 lines
8.0 KiB
C
226 lines
8.0 KiB
C
#include "xlib.h"
|
|
|
|
unsigned long Values_To_GCValues(s48_value values, XGCValues* GCV) {
|
|
unsigned long mask = s48_extract_integer(S48_CAR(values));
|
|
s48_value v = S48_CDR(values);
|
|
|
|
if (mask & GCFunction)
|
|
GCV->function = s48_extract_integer(S48_VECTOR_REF(v, 0));
|
|
if (mask & GCPlaneMask)
|
|
GCV->plane_mask = SCX_EXTRACT_PIXEL(S48_VECTOR_REF(v, 1));
|
|
if (mask & GCForeground)
|
|
GCV->foreground = SCX_EXTRACT_PIXEL(S48_VECTOR_REF(v, 2));
|
|
if (mask & GCBackground)
|
|
GCV->background = SCX_EXTRACT_PIXEL(S48_VECTOR_REF(v, 3));
|
|
if (mask & GCLineWidth)
|
|
GCV->line_width = s48_extract_integer(S48_VECTOR_REF(v, 4));
|
|
if (mask & GCLineStyle)
|
|
GCV->line_style = s48_extract_integer(S48_VECTOR_REF(v, 5));
|
|
if (mask & GCCapStyle)
|
|
GCV->cap_style = s48_extract_integer(S48_VECTOR_REF(v, 6));
|
|
if (mask & GCJoinStyle)
|
|
GCV->join_style = s48_extract_integer(S48_VECTOR_REF(v, 7));
|
|
if (mask & GCFillStyle)
|
|
GCV->fill_style = s48_extract_integer(S48_VECTOR_REF(v, 8));
|
|
if (mask & GCFillRule)
|
|
GCV->fill_rule = s48_extract_integer(S48_VECTOR_REF(v, 9));
|
|
if (mask & GCTile)
|
|
GCV->tile = SCX_EXTRACT_PIXMAP(S48_VECTOR_REF(v, 10));
|
|
if (mask & GCStipple)
|
|
GCV->stipple = SCX_EXTRACT_PIXMAP(S48_VECTOR_REF(v, 11));
|
|
if (mask & GCTileStipXOrigin)
|
|
GCV->ts_x_origin = s48_extract_integer(S48_VECTOR_REF(v, 12));
|
|
if (mask & GCTileStipYOrigin)
|
|
GCV->ts_y_origin = s48_extract_integer(S48_VECTOR_REF(v, 13));
|
|
if (mask & GCFont)
|
|
GCV->font = SCX_EXTRACT_FONT(S48_VECTOR_REF(v, 14));
|
|
if (mask & GCSubwindowMode)
|
|
GCV->subwindow_mode = s48_extract_integer(S48_VECTOR_REF(v, 15));
|
|
if (mask & GCGraphicsExposures)
|
|
GCV->graphics_exposures = S48_ENTER_BOOLEAN(S48_VECTOR_REF(v, 16));
|
|
if (mask & GCClipXOrigin)
|
|
GCV->clip_x_origin = s48_extract_integer(S48_VECTOR_REF(v, 17));
|
|
if (mask & GCClipYOrigin)
|
|
GCV->clip_y_origin = s48_extract_integer(S48_VECTOR_REF(v, 18));
|
|
if (mask & GCClipMask)
|
|
GCV->clip_mask = SCX_EXTRACT_PIXMAP(S48_VECTOR_REF(v, 19));
|
|
if (mask & GCDashOffset)
|
|
GCV->dash_offset = s48_extract_integer(S48_VECTOR_REF(v, 20));
|
|
if (mask & GCDashList)
|
|
GCV->dashes = (char)s48_extract_integer(S48_VECTOR_REF(v, 21));
|
|
if (mask & GCArcMode)
|
|
GCV->arc_mode = s48_extract_integer(S48_VECTOR_REF(v, 22));
|
|
|
|
return mask;
|
|
}
|
|
|
|
s48_value scx_Create_Gc(s48_value Xdisplay, s48_value Xdrawable,
|
|
s48_value values) {
|
|
XGCValues GCV;
|
|
unsigned long mask = Values_To_GCValues(values, &GCV);
|
|
|
|
GC Xgcontext = XCreateGC(SCX_EXTRACT_DISPLAY(Xdisplay),
|
|
SCX_EXTRACT_DRAWABLE(Xdrawable),
|
|
mask, &GCV);
|
|
|
|
return SCX_ENTER_GCONTEXT(Xgcontext);
|
|
}
|
|
|
|
s48_value scx_Copy_Gc(s48_value Xdisplay, s48_value Xsource, s48_value Xdest) {
|
|
XCopyGC(SCX_EXTRACT_DISPLAY(Xdisplay), SCX_EXTRACT_GCONTEXT(Xsource),
|
|
~0L, SCX_EXTRACT_GCONTEXT(Xdest));
|
|
return S48_UNSPECIFIC;
|
|
}
|
|
|
|
s48_value scx_Copy_Gc_To_Gc(s48_value Xdisplay, s48_value Xfrom, s48_value Xto,
|
|
s48_value attrs) {
|
|
unsigned long mask = s48_extract_integer(attrs); // -1 for all! ??
|
|
XCopyGC(SCX_EXTRACT_DISPLAY(Xdisplay), SCX_EXTRACT_GCONTEXT(Xfrom),
|
|
mask, SCX_EXTRACT_GCONTEXT(Xto));
|
|
return S48_UNSPECIFIC;
|
|
}
|
|
|
|
s48_value scx_Free_Gc(s48_value Xgcontext, s48_value Xdisplay) {
|
|
XFreeGC(SCX_EXTRACT_DISPLAY(Xdisplay), SCX_EXTRACT_GCONTEXT(Xgcontext));
|
|
return S48_UNSPECIFIC;
|
|
}
|
|
|
|
#define ValidGCValuesBits \
|
|
(GCFunction | GCPlaneMask | GCForeground | GCBackground | GCLineWidth |\
|
|
GCLineStyle | GCCapStyle | GCJoinStyle | GCFillStyle | GCFillRule |\
|
|
GCTile | GCStipple | GCTileStipXOrigin | GCTileStipYOrigin | GCFont |\
|
|
GCSubwindowMode | GCGraphicsExposures | GCClipXOrigin | GCClipYOrigin |\
|
|
GCDashOffset | GCArcMode)
|
|
|
|
s48_value scx_Get_Gc_Values (s48_value Xgcontext, s48_value Xdisplay) {
|
|
unsigned long mask = ValidGCValuesBits;
|
|
|
|
XGCValues GCV;
|
|
s48_value res = S48_FALSE;
|
|
S48_DECLARE_GC_PROTECT(1);
|
|
|
|
if (!XGetGCValues (SCX_EXTRACT_DISPLAY(Xdisplay),
|
|
SCX_EXTRACT_GCONTEXT(Xgcontext),
|
|
mask, &GCV))
|
|
res = S48_FALSE;
|
|
else {
|
|
res = s48_make_vector(23, S48_FALSE);
|
|
S48_GC_PROTECT_1(res);
|
|
|
|
S48_VECTOR_SET(res, 0, s48_enter_integer(GCV.function));
|
|
S48_VECTOR_SET(res, 1, SCX_ENTER_PIXEL(GCV.plane_mask));
|
|
S48_VECTOR_SET(res, 2, SCX_ENTER_PIXEL(GCV.foreground));
|
|
S48_VECTOR_SET(res, 3, SCX_ENTER_PIXEL(GCV.background));
|
|
S48_VECTOR_SET(res, 4, s48_enter_fixnum(GCV.line_width));
|
|
S48_VECTOR_SET(res, 5, s48_enter_integer(GCV.line_style));
|
|
S48_VECTOR_SET(res, 6, s48_enter_integer(GCV.cap_style));
|
|
S48_VECTOR_SET(res, 7, s48_enter_integer(GCV.join_style));
|
|
S48_VECTOR_SET(res, 8, s48_enter_integer(GCV.fill_style));
|
|
S48_VECTOR_SET(res, 9, s48_enter_integer(GCV.fill_rule));
|
|
S48_VECTOR_SET(res, 10, SCX_ENTER_PIXMAP(GCV.tile));
|
|
S48_VECTOR_SET(res, 11, SCX_ENTER_PIXMAP(GCV.stipple));
|
|
S48_VECTOR_SET(res, 12, s48_enter_fixnum(GCV.ts_x_origin));
|
|
S48_VECTOR_SET(res, 13, s48_enter_fixnum(GCV.ts_y_origin));
|
|
S48_VECTOR_SET(res, 14, SCX_ENTER_FONT(GCV.font));
|
|
S48_VECTOR_SET(res, 15, s48_enter_integer(GCV.subwindow_mode));
|
|
S48_VECTOR_SET(res, 16, S48_ENTER_BOOLEAN(GCV.graphics_exposures));
|
|
S48_VECTOR_SET(res, 17, s48_enter_fixnum(GCV.clip_x_origin));
|
|
S48_VECTOR_SET(res, 18, s48_enter_fixnum(GCV.clip_y_origin));
|
|
S48_VECTOR_SET(res, 19, SCX_ENTER_PIXMAP(GCV.clip_mask));
|
|
S48_VECTOR_SET(res, 20, s48_enter_integer(GCV.dash_offset));
|
|
S48_VECTOR_SET(res, 21, s48_enter_integer(GCV.dashes));
|
|
S48_VECTOR_SET(res, 22, s48_enter_integer(GCV.arc_mode));
|
|
|
|
res = s48_cons(s48_enter_integer(mask), res);
|
|
|
|
S48_GC_UNPROTECT();
|
|
}
|
|
return res;
|
|
}
|
|
|
|
s48_value scx_Change_Gc (s48_value Xgcontext, s48_value Xdisplay, s48_value args) {
|
|
XGCValues GCV;
|
|
unsigned long mask = Values_To_GCValues(args, &GCV);
|
|
|
|
XChangeGC(SCX_EXTRACT_DISPLAY(Xdisplay), SCX_EXTRACT_GCONTEXT(Xgcontext),
|
|
mask, &GCV);
|
|
|
|
return S48_UNSPECIFIC;
|
|
}
|
|
|
|
s48_value scx_Set_Gcontext_Dashlist(s48_value Xgcontext, s48_value Xdisplay,
|
|
s48_value dashoffset, s48_value dashlist) {
|
|
int n = S48_VECTOR_LENGTH(dashlist);
|
|
char v[n];
|
|
int i;
|
|
for (i=0; i<n; i++) {
|
|
v[i] = (char)s48_extract_integer(S48_VECTOR_REF(dashlist, i));
|
|
}
|
|
|
|
XSetDashes( SCX_EXTRACT_DISPLAY(Xdisplay), SCX_EXTRACT_GCONTEXT(Xgcontext),
|
|
s48_extract_integer(dashoffset), v, n);
|
|
|
|
return S48_UNSPECIFIC;
|
|
}
|
|
|
|
s48_value scx_Set_Gcontext_Clip_Rectangles (s48_value Xgcontext,
|
|
s48_value Xdisplay, s48_value x,
|
|
s48_value y, s48_value v,
|
|
s48_value ord) {
|
|
int n = S48_VECTOR_LENGTH(v);
|
|
|
|
XRectangle p[n];
|
|
|
|
int i;
|
|
s48_value rect;
|
|
for (i = 0; i < n; i++) {
|
|
rect = S48_VECTOR_REF(v, i);
|
|
|
|
p[i].x = (int)s48_extract_integer (S48_CAR (rect));
|
|
rect = S48_CDR (rect);
|
|
p[i].y = (int)s48_extract_integer (S48_CAR (rect));
|
|
rect = S48_CDR (rect);
|
|
p[i].width = (int)s48_extract_integer (S48_CAR (rect));
|
|
rect = S48_CDR (rect);
|
|
p[i].height = (int)s48_extract_integer (S48_CAR (rect));
|
|
|
|
}
|
|
|
|
XSetClipRectangles (SCX_EXTRACT_DISPLAY(Xdisplay),
|
|
SCX_EXTRACT_GCONTEXT(Xgcontext),
|
|
(int)s48_extract_integer (x),
|
|
(int)s48_extract_integer (y), p, n,
|
|
s48_extract_integer(ord));
|
|
|
|
return S48_UNSPECIFIC;
|
|
}
|
|
|
|
s48_value scx_Query_Best_Size (s48_value Xdisplay, s48_value width,
|
|
s48_value height, s48_value shape) {
|
|
unsigned int rw, rh;
|
|
Display* dpy = SCX_EXTRACT_DISPLAY(Xdisplay);
|
|
|
|
if (!XQueryBestSize (dpy,
|
|
s48_extract_integer(shape),
|
|
DefaultRootWindow (dpy), //??
|
|
(int)s48_extract_integer (width),
|
|
(int)s48_extract_integer (height),
|
|
&rw, &rh))
|
|
return S48_FALSE;
|
|
else
|
|
return s48_cons (s48_enter_fixnum (rw), s48_enter_fixnum (rh));
|
|
}
|
|
|
|
|
|
void scx_init_gcontext(void) {
|
|
S48_EXPORT_FUNCTION(scx_Create_Gc);
|
|
S48_EXPORT_FUNCTION(scx_Free_Gc);
|
|
S48_EXPORT_FUNCTION(scx_Copy_Gc);
|
|
S48_EXPORT_FUNCTION(scx_Copy_Gc_To_Gc);
|
|
S48_EXPORT_FUNCTION(scx_Get_Gc_Values);
|
|
S48_EXPORT_FUNCTION(scx_Change_Gc);
|
|
S48_EXPORT_FUNCTION(scx_Set_Gcontext_Dashlist);
|
|
S48_EXPORT_FUNCTION(scx_Set_Gcontext_Clip_Rectangles);
|
|
S48_EXPORT_FUNCTION(scx_Query_Best_Size);
|
|
}
|