scx/c/xlib/visual.c

122 lines
3.9 KiB
C

/* Copyright 2001-2003 by Norbert Freudemann, David Frese */
#include "xlib.h"
#define scx_extract_visual_class(x) S48_EXTRACT_ENUM(x, "scx-visual-class")
#define scx_enter_visual_class(x) S48_ENTER_ENUM(x, "scx-visual-classes")
s48_value scx_enter_visual(Visual* vis) {
s48_value v = s48_make_record(scx_visual);
S48_DECLARE_GC_PROTECT(1);
S48_GC_PROTECT_1(v);
S48_RECORD_SET(v, 0, S48_ENTER_POINTER(vis));
S48_GC_UNPROTECT();
return v;
}
#define scx_visual_info s48_get_imported_binding("scx-visual-info")
s48_value scx_enter_visual_info(XVisualInfo* vi) {
s48_value v = s48_make_record(scx_visual_info);
S48_DECLARE_GC_PROTECT(1);
S48_GC_PROTECT_1(v);
S48_RECORD_SET(v, 0, scx_enter_visual(vi->visual));
S48_RECORD_SET(v, 1, scx_enter_visualid(vi->visualid));
S48_RECORD_SET(v, 2, s48_enter_integer(vi->screen));
S48_RECORD_SET(v, 3, s48_enter_integer(vi->depth));
S48_RECORD_SET(v, 4, scx_enter_visual_class(vi->class));
S48_RECORD_SET(v, 5, s48_enter_integer(vi->red_mask));
S48_RECORD_SET(v, 6, s48_enter_integer(vi->green_mask));
S48_RECORD_SET(v, 7, s48_enter_integer(vi->blue_mask));
S48_RECORD_SET(v, 8, s48_enter_integer(vi->bits_per_rgb));
S48_RECORD_SET(v, 9, s48_enter_integer(vi->colormap_size));
S48_GC_UNPROTECT();
return v;
}
unsigned int scx_extract_visual_info(s48_value v, XVisualInfo* vi) {
unsigned long mask = 0;
s48_check_record_type(v, scx_visual_info);
if (!S48_FALSE_P(S48_RECORD_REF(v, 0)))
vi->visual = scx_extract_visual(S48_RECORD_REF(v, 0));
if (!S48_FALSE_P(S48_RECORD_REF(v, 1))) {
vi->visualid = scx_extract_visualid(S48_RECORD_REF(v, 1));
mask |= VisualIDMask;
}
if (!S48_FALSE_P(S48_RECORD_REF(v, 2))) {
vi->screen = s48_extract_integer(S48_RECORD_REF(v, 2));
mask |= VisualScreenMask;
}
if (!S48_FALSE_P(S48_RECORD_REF(v, 3))) {
vi->depth = s48_extract_integer(S48_RECORD_REF(v, 4));
mask |= VisualDepthMask;
}
if (!S48_FALSE_P(S48_RECORD_REF(v, 4))) {
vi->class = scx_extract_visual_class(S48_RECORD_REF(v, 5));
mask |= VisualClassMask;
}
if (!S48_FALSE_P(S48_RECORD_REF(v, 5))) {
vi->red_mask = s48_extract_integer(S48_RECORD_REF(v, 6));
mask |= VisualRedMaskMask;
}
if (!S48_FALSE_P(S48_RECORD_REF(v, 6))) {
vi->green_mask = s48_extract_integer(S48_RECORD_REF(v, 7));
mask |= VisualGreenMaskMask;
}
if (!S48_FALSE_P(S48_RECORD_REF(v, 7))) {
vi->blue_mask = s48_extract_integer(S48_RECORD_REF(v, 8));
mask |= VisualBlueMaskMask;
}
if (!S48_FALSE_P(S48_RECORD_REF(v, 8))) {
vi->bits_per_rgb = s48_extract_integer(S48_RECORD_REF(v, 9));
mask |= VisualBitsPerRGBMask;
}
if (!S48_FALSE_P(S48_RECORD_REF(v, 9))) {
vi->colormap_size = s48_extract_integer(S48_RECORD_REF(v, 10));
mask |= VisualColormapSizeMask;
}
return mask;
}
s48_value scx_Get_Visual_Info(s48_value display, s48_value template) {
XVisualInfo templ;
unsigned long mask = scx_extract_visual_info(template, &templ);
XVisualInfo* vis;
int n, i;
s48_value l = S48_NULL;
S48_DECLARE_GC_PROTECT(1);
vis = XGetVisualInfo(scx_extract_display(display),
mask, &templ, &n);
S48_GC_PROTECT_1(l);
for (i = n-1; i >= 0; i--)
l = s48_cons(scx_enter_visual_info(&vis[i]), l);
S48_GC_UNPROTECT();
return l;
}
s48_value scx_Match_Visual_Info(s48_value display, s48_value scrnum,
s48_value depth, s48_value class) {
XVisualInfo vi;
Status r = XMatchVisualInfo(scx_extract_display(display),
s48_extract_integer(scrnum),
s48_extract_integer(depth),
scx_extract_visual_class(class),
&vi);
if (!r)
return S48_FALSE;
else
return scx_enter_visual_info(&vi);
}
s48_value scx_VisualIDFromVisual(s48_value visual) {
return s48_enter_integer(XVisualIDFromVisual(scx_extract_visual(visual)));
}
void scx_init_visual(void) {
S48_EXPORT_FUNCTION(scx_Get_Visual_Info);
S48_EXPORT_FUNCTION(scx_Match_Visual_Info);
S48_EXPORT_FUNCTION(scx_VisualIDFromVisual);
}