98 lines
3.1 KiB
C
98 lines
3.1 KiB
C
#include "xlib.h"
|
|
|
|
s48_value Enter_Visual_And_Visual_Info(XVisualInfo* vi) {
|
|
s48_value t = s48_make_vector(10, S48_FALSE);
|
|
S48_DECLARE_GC_PROTECT(1);
|
|
|
|
S48_GC_PROTECT_1(t);
|
|
|
|
S48_VECTOR_SET(t, 0, s48_enter_integer(vi->visualid));
|
|
S48_VECTOR_SET(t, 1, s48_enter_fixnum(vi->screen));
|
|
S48_VECTOR_SET(t, 2, s48_enter_fixnum(vi->depth));
|
|
S48_VECTOR_SET(t, 3, s48_enter_integer(vi->class));
|
|
S48_VECTOR_SET(t, 4, s48_enter_integer(vi->red_mask));
|
|
S48_VECTOR_SET(t, 5, s48_enter_integer(vi->green_mask));
|
|
S48_VECTOR_SET(t, 6, s48_enter_integer(vi->blue_mask));
|
|
S48_VECTOR_SET(t, 7, s48_enter_integer(vi->colormap_size));
|
|
S48_VECTOR_SET(t, 8, s48_enter_fixnum(vi->bits_per_rgb));
|
|
|
|
t = s48_cons(s48_enter_integer(VisualAllMask), t);
|
|
|
|
t = s48_cons(SCX_ENTER_VISUAL(vi->visual), t);
|
|
|
|
S48_GC_UNPROTECT();
|
|
return t;
|
|
}
|
|
|
|
unsigned long Extract_Visual_Info(s48_value vi, XVisualInfo* VI) {
|
|
unsigned long mask = s48_extract_integer(S48_CAR(vi));
|
|
s48_value v = S48_CDR(vi);
|
|
|
|
if (mask & VisualIDMask)
|
|
VI->visualid = s48_extract_integer(S48_VECTOR_REF(v, 0));
|
|
if (mask & VisualScreenMask)
|
|
VI->screen = s48_extract_integer(S48_VECTOR_REF(v, 1));
|
|
if (mask & VisualDepthMask)
|
|
VI->depth = s48_extract_integer(S48_VECTOR_REF(v, 2));
|
|
if (mask & VisualClassMask)
|
|
VI->class = s48_extract_integer(S48_VECTOR_REF(v, 3));
|
|
if (mask & VisualRedMaskMask)
|
|
VI->red_mask = s48_extract_integer(S48_VECTOR_REF(v, 4));
|
|
if (mask & VisualGreenMaskMask)
|
|
VI->green_mask = s48_extract_integer(S48_VECTOR_REF(v, 5));
|
|
if (mask & VisualBlueMaskMask)
|
|
VI->blue_mask = s48_extract_integer(S48_VECTOR_REF(v, 6));
|
|
if (mask & VisualColormapSizeMask)
|
|
VI->colormap_size = s48_extract_integer(S48_VECTOR_REF(v, 7));
|
|
if (mask & VisualBitsPerRGBMask)
|
|
VI->bits_per_rgb = s48_extract_integer(S48_VECTOR_REF(v, 8));
|
|
|
|
return mask;
|
|
}
|
|
|
|
s48_value scx_Get_Visual_Info(s48_value Xdisplay, s48_value v) {
|
|
XVisualInfo template;
|
|
XVisualInfo* visualList;
|
|
int visualsMatch, i;
|
|
long mask = VisualNoMask;
|
|
s48_value res = S48_FALSE;
|
|
S48_DECLARE_GC_PROTECT(1);
|
|
|
|
mask = Extract_Visual_Info(v, &template);
|
|
|
|
visualList = XGetVisualInfo( SCX_EXTRACT_DISPLAY(Xdisplay),
|
|
mask, &template, &visualsMatch);
|
|
|
|
res = s48_make_vector(visualsMatch, S48_FALSE);
|
|
S48_GC_PROTECT_1(res);
|
|
|
|
for (i=0; i<visualsMatch; i++)
|
|
S48_VECTOR_SET(res, i, Enter_Visual_And_Visual_Info(&visualList[i]));
|
|
|
|
S48_GC_UNPROTECT();
|
|
return res;
|
|
}
|
|
|
|
s48_value scx_Visual_ID(s48_value Xvisual) {
|
|
return s48_enter_integer(XVisualIDFromVisual(SCX_EXTRACT_VISUAL(Xvisual)));
|
|
}
|
|
|
|
s48_value scx_Match_Visual_Info(s48_value Xdisplay, s48_value scrnum,
|
|
s48_value depth, s48_value class) {
|
|
XVisualInfo r;
|
|
if (XMatchVisualInfo(SCX_EXTRACT_DISPLAY(Xdisplay),
|
|
s48_extract_integer(scrnum),
|
|
s48_extract_integer(depth),
|
|
s48_extract_integer(class),
|
|
&r))
|
|
return Enter_Visual_And_Visual_Info(&r);
|
|
else
|
|
return S48_FALSE;
|
|
}
|
|
|
|
void scx_init_visual(void) {
|
|
S48_EXPORT_FUNCTION(scx_Get_Visual_Info);
|
|
S48_EXPORT_FUNCTION(scx_Visual_ID);
|
|
S48_EXPORT_FUNCTION(scx_Match_Visual_Info);
|
|
}
|