new: event.c, and some changes.

This commit is contained in:
frese 2001-07-09 13:39:59 +00:00
parent 743f003202
commit 6f62901564
9 changed files with 457 additions and 24 deletions

View File

@ -1,7 +1,7 @@
.c.o:
gcc -g -c -I /usr/X11R6/include/ -I /afs/wsi/home/dfreese/scsh-0.6/c/ -o $@ $<
OBJECTS = main.o display.o window.o type.o color.o colormap.o pixel.o gcontext.o
OBJECTS = main.o display.o window.o type.o color.o colormap.o pixel.o gcontext.o event.o pixmap.o graphics.o
test: $(OBJECTS)
gcc -g -o test -L /afs/wsi/home/dfreese/i386_fbsd43/scsh-0.6/lib/scsh/ \

View File

@ -1,5 +1,6 @@
#include "xlib.h"
#include "scheme48.h"
#include <sys/time.h>
// Open_Display(name) name should be a string or S48_FALSE (=> Null)
s48_value Open_Display (s48_value name) {
@ -17,6 +18,26 @@ s48_value Close_Display(s48_value Xdisplay) {
return S48_UNSPECIFIC;
}
// This funktion selects the fd field of the Display-struct. One shouldn't do
// that usually, but we need it.
s48_value Display_Message_fd(s48_value Xdisplay) {
int fd = ConnectionNumber(EXTRACT_DISPLAY(Xdisplay));
/* struct timeval timeout;
fd_set fdset;
FD_ZERO(&fdset);
FD_SET(fd, &fdset);
timeout.tv_sec = 20; // 20 seconds
timeout.tv_usec = 0;
if (select(1, &fdset, NULL, NULL, &timeout) != 0)
return S48_TRUE;
else
return S48_FALSE;
*/
return s48_enter_integer(fd);
}
// The following procedure mainly wrap a corresponding XLib macro without
// underscores...
s48_value Display_Default_Root_Window(s48_value Xdisplay) {
@ -196,6 +217,7 @@ s48_value List_Pixmap_Formats (s48_value Xdisplay) {
void s48_init_display(void) {
S48_EXPORT_FUNCTION(Open_Display);
S48_EXPORT_FUNCTION(Close_Display);
S48_EXPORT_FUNCTION(Display_Message_fd);
S48_EXPORT_FUNCTION(Display_Default_Root_Window);
S48_EXPORT_FUNCTION(Display_Default_Colormap);
S48_EXPORT_FUNCTION(Display_Default_Gcontext);

View File

@ -1,3 +1,369 @@
#include "xlib.h"
#include "scheme48.h"
SYMDESCR Event_Names[] = {
{ "key-press", KeyPress },
{ "key-release", KeyRelease },
{ "button-press", ButtonPress },
{ "button-release", ButtonRelease },
{ "motion-notify", MotionNotify },
{ "enter-notify", EnterNotify },
{ "leave-notify", LeaveNotify },
{ "focus-in", FocusIn },
{ "focus-out", FocusOut },
{ "keymap-notify", KeymapNotify },
{ "expose", Expose },
{ "graphics-expose", GraphicsExpose },
{ "no-expose", NoExpose },
{ "visibility-notify", VisibilityNotify },
{ "create-notify", CreateNotify },
{ "destroy-notify", DestroyNotify },
{ "unmap-notify", UnmapNotify },
{ "map-notify", MapNotify },
{ "map-request", MapRequest },
{ "reparent-notify", ReparentNotify },
{ "configure-notify", ConfigureNotify },
{ "configure-request", ConfigureRequest },
{ "gravity-notify", GravityNotify },
{ "resize-request", ResizeRequest },
{ "circulate-notify", CirculateNotify },
{ "circulate-request", CirculateRequest },
{ "property-notify", PropertyNotify },
{ "selection-clear", SelectionClear },
{ "selection-notify", SelectionNotify },
{ "colormap-notify", ColormapNotify },
{ "client-message", ClientMessage },
{ "mapping-notify", MappingNotify }
};
#define ECAST(name, type) type* name = (type*)e
#define sidx 4
#define SET(i, v) S48_VECTOR_SET(r, i, v)
#define SETSIZE(i) r = s48_make_vector(sidx+i, S48_FALSE)
s48_value enter_event(XEvent* e) {
s48_value r = S48_FALSE;
s48_value temp = S48_FALSE;
int i;
S48_DECLARE_GC_PROTECT(2);
S48_GC_PROTECT_2(r, temp);
switch (e->type) {
case KeyPress : case KeyRelease :
case ButtonPress : case ButtonRelease :
case MotionNotify : {
ECAST(q, XKeyEvent);
SETSIZE(10);
// all equal in the beginning
SET(sidx+0, ENTER_WINDOW(q->root));
SET(sidx+1, ENTER_WINDOW(q->subwindow));
SET(sidx+2, ENTER_TIME(q->time));
SET(sidx+3, s48_enter_integer(q->x));
SET(sidx+4, s48_enter_integer(q->y));
SET(sidx+5, s48_enter_integer(q->x_root));
SET(sidx+6, s48_enter_integer(q->y_root));
SET(sidx+7, Bits_To_Symbols(q->state, State_Syms));
// now they are different
switch (e->type) {
case KeyPress : case KeyRelease : {
SET(sidx+8, s48_enter_integer(q->keycode));
SET(sidx+9, S48_ENTER_BOOLEAN(q->same_screen));
} break;
case ButtonPress : case ButtonRelease : {
ECAST(q, XButtonEvent);
SET(sidx+8, Bit_To_Symbol(q->button, Button_Syms));
SET(sidx+9, S48_ENTER_BOOLEAN(q->same_screen));
} break;
case MotionNotify : {
ECAST(q, XMotionEvent);
SET(sidx+8, S48_ENTER_BOOLEAN(q->is_hint));
SET(sidx+9, S48_ENTER_BOOLEAN(q->same_screen));
} break;
}
} break;
case EnterNotify : case LeaveNotify : {
ECAST(q, XCrossingEvent);
SETSIZE(12);
SET(sidx+0, ENTER_WINDOW(q->root));
SET(sidx+1, ENTER_WINDOW(q->subwindow));
SET(sidx+2, ENTER_TIME(q->time));
SET(sidx+3, s48_enter_integer(q->x));
SET(sidx+4, s48_enter_integer(q->y));
SET(sidx+5, s48_enter_integer(q->x_root));
SET(sidx+6, s48_enter_integer(q->y_root));
SET(sidx+7, Bit_To_Symbol(q->mode, Cross_Mode_Syms));
SET(sidx+8, Bit_To_Symbol(q->detail, Cross_Detail_Syms));
SET(sidx+9, S48_ENTER_BOOLEAN(q->same_screen));
SET(sidx+10, S48_ENTER_BOOLEAN(q->focus));
// Elk does this; but why not State_Syms??
SET(sidx+11, Bit_To_Symbol(q->state, Button_Syms));
} break;
case FocusIn : case FocusOut : {
ECAST(q, XFocusChangeEvent);
SETSIZE(2);
SET(sidx+0, Bit_To_Symbol(q->mode, Cross_Mode_Syms));
SET(sidx+1, Bit_To_Symbol(q->detail, Focus_Detail_Syms));
} break;
case KeymapNotify : {
ECAST(q, XKeymapEvent);
SETSIZE(1);
temp = s48_make_string(32, (char)0);
for (i=0; i < 32; i++)
S48_STRING_SET(temp, i, q->key_vector[i]);
SET(sidx+0, temp);
} break;
case Expose : {
ECAST(q, XExposeEvent);
SETSIZE(5);
SET(sidx+0, s48_enter_integer(q->x));
SET(sidx+1, s48_enter_integer(q->y));
SET(sidx+2, s48_enter_integer(q->width));
SET(sidx+3, s48_enter_integer(q->height));
SET(sidx+4, s48_enter_integer(q->count));
} break;
case GraphicsExpose : {
ECAST(q, XGraphicsExposeEvent);
SETSIZE(7);
// the ->window member is only a drawable here! ??
SET(sidx+0, s48_enter_integer(q->x));
SET(sidx+1, s48_enter_integer(q->y));
SET(sidx+2, s48_enter_integer(q->width));
SET(sidx+3, s48_enter_integer(q->height));
SET(sidx+4, s48_enter_integer(q->count));
SET(sidx+5, s48_enter_integer(q->major_code));
SET(sidx+6, s48_enter_integer(q->minor_code));
} break;
case NoExpose : {
ECAST(q, XNoExposeEvent);
SETSIZE(2);
SET(sidx+0, s48_enter_integer(q->major_code));
SET(sidx+1, s48_enter_integer(q->minor_code));
} break;
case VisibilityNotify : {
ECAST(q, XVisibilityEvent);
SETSIZE(1);
SET(sidx+0, Bit_To_Symbol(q->state, Visibility_Syms));
} break;
case CreateNotify : {
ECAST(q, XCreateWindowEvent);
SETSIZE(7);
SET(sidx+0, ENTER_WINDOW(q->window));
SET(sidx+1, s48_enter_integer(q->x));
SET(sidx+2, s48_enter_integer(q->y));
SET(sidx+3, s48_enter_integer(q->width));
SET(sidx+4, s48_enter_integer(q->height));
SET(sidx+5, s48_enter_integer(q->border_width));
SET(sidx+6, S48_ENTER_BOOLEAN(q->override_redirect));
} break;
case DestroyNotify : {
ECAST(q, XDestroyWindowEvent);
SETSIZE(1);
SET(sidx+0, ENTER_WINDOW(q->window));
} break;
case UnmapNotify : {
ECAST(q, XUnmapEvent);
SETSIZE(2);
SET(sidx+0, ENTER_WINDOW(q->window));
SET(sidx+1, S48_ENTER_BOOLEAN(q->from_configure));
} break;
case MapNotify : {
ECAST(q, XMapEvent);
SETSIZE(2);
SET(sidx+0, ENTER_WINDOW(q->window));
SET(sidx+1, S48_ENTER_BOOLEAN(q->override_redirect));
} break;
case MapRequest : {
ECAST(q, XMapRequestEvent);
SETSIZE(1);
SET(sidx+0, ENTER_WINDOW(q->window));
} break;
case ReparentNotify : {
ECAST(q, XReparentEvent);
SETSIZE(5);
SET(sidx+0, ENTER_WINDOW(q->window));
SET(sidx+1, ENTER_WINDOW(q->parent));
SET(sidx+2, s48_enter_integer(q->x));
SET(sidx+3, s48_enter_integer(q->y));
SET(sidx+4, S48_ENTER_BOOLEAN(q->override_redirect));
} break;
case ConfigureNotify : {
ECAST(q, XConfigureEvent);
SETSIZE(8);
SET(sidx+0, ENTER_WINDOW(q->window));
SET(sidx+1, s48_enter_integer(q->x));
SET(sidx+2, s48_enter_integer(q->y));
SET(sidx+3, s48_enter_integer(q->width));
SET(sidx+4, s48_enter_integer(q->height));
SET(sidx+5, s48_enter_integer(q->border_width));
SET(sidx+6, ENTER_WINDOW(q->above));
SET(sidx+7, S48_ENTER_BOOLEAN(q->override_redirect));
} break;
case ConfigureRequest : {
ECAST(q, XConfigureRequestEvent);
SETSIZE(9);
SET(sidx+0, ENTER_WINDOW(q->window));
SET(sidx+1, s48_enter_integer(q->x));
SET(sidx+2, s48_enter_integer(q->y));
SET(sidx+3, s48_enter_integer(q->width));
SET(sidx+4, s48_enter_integer(q->height));
SET(sidx+5, s48_enter_integer(q->border_width));
SET(sidx+6, ENTER_WINDOW(q->above));
SET(sidx+7, Bit_To_Symbol(q->detail, Stack_Mode_Syms));
SET(sidx+8, s48_enter_integer(q->value_mask));
} break;
case GravityNotify : {
ECAST(q, XGravityEvent);
SETSIZE(3);
SET(sidx+0, ENTER_WINDOW(q->window));
SET(sidx+1, s48_enter_integer(q->x));
SET(sidx+2, s48_enter_integer(q->y));
} break;
case ResizeRequest : {
ECAST(q, XResizeRequestEvent);
SETSIZE(2);
SET(sidx+0, s48_enter_integer(q->width));
SET(sidx+1, s48_enter_integer(q->height));
} break;
case CirculateRequest : {
ECAST(q, XCirculateEvent);
SETSIZE(2);
SET(sidx+0, ENTER_WINDOW(q->window));
SET(sidx+1, Bit_To_Symbol(q->place, Place_Syms));
} break;
case PropertyNotify : {
ECAST(q, XPropertyEvent);
SETSIZE(3);
SET(sidx+0, ENTER_ATOM(q->atom));
SET(sidx+1, ENTER_TIME(q->time));
SET(sidx+2, Bit_To_Symbol(q->state, Prop_Syms));
} break;
case SelectionClear : {
ECAST(q, XSelectionClearEvent);
SETSIZE(2);
SET(sidx+0, ENTER_ATOM(q->selection));
SET(sidx+1, ENTER_TIME(q->time));
} break;
case SelectionRequest : {
ECAST(q, XSelectionRequestEvent);
SETSIZE(5);
SET(sidx+0, ENTER_WINDOW(q->requestor));
SET(sidx+1, ENTER_ATOM(q->selection));
SET(sidx+2, ENTER_ATOM(q->target));
SET(sidx+3, ENTER_ATOM(q->property));
SET(sidx+4, ENTER_TIME(q->time));
} break;
case SelectionNotify : {
ECAST(q, XSelectionEvent);
SETSIZE(4);
SET(sidx+0, ENTER_ATOM(q->selection));
SET(sidx+1, ENTER_ATOM(q->target));
SET(sidx+2, ENTER_ATOM(q->property));
SET(sidx+3, ENTER_TIME(q->time));
} break;
case ColormapNotify : {
ECAST(q, XColormapEvent);
SETSIZE(3);
SET(sidx+0, ENTER_COLORMAP(q->colormap));
SET(sidx+1, S48_ENTER_BOOLEAN(q->new));
SET(sidx+2, q->state == ColormapInstalled ? S48_TRUE : S48_FALSE);
} break;
case ClientMessage : {
ECAST(q, XClientMessageEvent);
SETSIZE(2);
SET(sidx+0, ENTER_ATOM(q->message_type));
switch (q->format) {
case 8 : {
temp = s48_make_string(20, (char)0);
for (i=0; i < 20; i++)
S48_STRING_SET(temp, i, q->data.b[i]);
} break;
case 16 : {
temp = s48_make_vector(10, S48_FALSE);
for (i=0; i < 10; i++)
S48_VECTOR_SET(temp, i, s48_enter_integer(q->data.s[i]));
} break;
case 32 : {
temp = s48_make_vector(5, S48_FALSE);
for (i=0; i < 5; i++)
S48_VECTOR_SET(temp, i, s48_enter_integer(q->data.l[i]));
} break;
default : temp = s48_enter_integer(q->format); //??
}
SET(sidx+1, temp);
}
case MappingNotify : {
ECAST(q, XMappingEvent);
SETSIZE(3);
SET(sidx+0, Bit_To_Symbol(q->request, Mapping_Syms));
SET(sidx+1, s48_enter_integer(q->first_keycode));
SET(sidx+2, s48_enter_integer(q->count));
} break;
} // switch end
// XAnyEvent entries
{
ECAST(q, XAnyEvent);
SET(0, s48_enter_integer(q->serial));
SET(1, S48_ENTER_BOOLEAN(q->send_event));
SET(2, ENTER_DISPLAY(q->display));
SET(3, ENTER_WINDOW(q->window));
}
// more??
// And the Event-Name
r = s48_cons( Bit_To_Symbol(e->type, Event_Names), r );
S48_GC_UNPROTECT();
return r;
}
s48_value Next_Event(s48_value Xdisplay) {
XEvent e;
XNextEvent(EXTRACT_DISPLAY(Xdisplay), &e);
return enter_event(&e);
}
s48_value Peek_Event(s48_value Xdisplay) {
XEvent e;
XPeekEvent(EXTRACT_DISPLAY(Xdisplay), &e);
return enter_event(&e);
}
s48_value Events_Pending(s48_value Xdisplay) {
return s48_enter_integer(XPending(EXTRACT_DISPLAY(Xdisplay)));
}
/*
#include "xlib.h"
#define MAX_ARGS 14
@ -51,7 +417,8 @@ struct predicate_arg {
s48_value *ret;
};
/*ARGSUSED*/
//ARGSUSED
static Event_Predicate (dpy, ep, ptr) Display *dpy; XEvent *ep;
#ifdef XLIB_RELEASE_5_OR_LATER
XPointer ptr; {
@ -73,12 +440,12 @@ static Event_Predicate (dpy, ep, ptr) Display *dpy; XEvent *ep;
return S48_TRUE_P (*ap->ret);
}
/* (handle-events display discard? peek? clause...)
* clause = (event function) or ((event...) function) or (else function)
* loops/blocks until a function returns x != #f, then returns x.
* discard?: discard unprocessed events.
* peek?: don't discard processed events.
*/
// (handle-events display discard? peek? clause...)
// clause = (event function) or ((event...) function) or (else function)
// loops/blocks until a function returns x != #f, then returns x.
// discard?: discard unprocessed events.
// peek?: don't discard processed events.
//
static s48_value P_Handle_Events (argl) s48_value argl; {
s48_value next, clause, func, ret, funcs[LASTEvent], args;
@ -143,7 +510,7 @@ static s48_value P_Handle_Events (argl) s48_value argl; {
Destroy_Event_Args (args);
} else {
if (peek)
XNextEvent (dpy, &e); /* discard it */
XNextEvent (dpy, &e); // discard it
}
} else {
struct predicate_arg a;
@ -411,7 +778,7 @@ s48_value Get_Event_Args (ep) XEvent *ep; {
S48_VECTOR_SET(a[3], i, s48_enter_integer (p->data.l[i]);)
break;
default:
a[3] = s48_enter_integer (p->format); /* ??? */
a[3] = s48_enter_integer (p->format); // ???
}
} break;
case MappingNotify: {
@ -422,6 +789,7 @@ s48_value Get_Event_Args (ep) XEvent *ep; {
a[4] = s48_enter_integer (p->count);
} break;
}
a[0] = Intern (Event_Table[e].name);
for (vp = VECTOR(Argv)->data, i = 0; i < Event_Table[e].argc; i++) {
if (i) vp++;
@ -440,6 +808,11 @@ void Destroy_Event_Args (args) s48_value args; {
S48_CAR (t) = S48_NULL;
}
*/
/*
Encode_Event (e) s48_value e; {
s48_value s;
register char *p;
@ -512,3 +885,14 @@ elk_init_xlib_event () {
"get-motion-events", 3, 3, EVAL);
Define_Primitive (P_Event_Listen, "event-listen", 2, 2, EVAL);
}
*/
void s48_init_event(void) {
S48_EXPORT_FUNCTION(Next_Event);
S48_EXPORT_FUNCTION(Peek_Event);
S48_EXPORT_FUNCTION(Events_Pending);
// Encode_Event
// Get_Motion_Events ??
}

View File

@ -1,11 +1,11 @@
#include "xlib.h"
#include "scheme48.h"
/*
extern XDrawPoints(), XDrawLines(), XDrawRectangle(), XFillRectangle();
extern XDrawRectangles(), XFillRectangles(), XDrawArc(), XFillArc();
extern XDrawArcs(), XFillArcs(), XFillPolygon();
*/
s48_value Clear_Area(s48_value Xwindow, s48_value Xdisplay, s48_value x,
@ -95,7 +95,7 @@ s48_value Draw_Points (s48_value Xdisplay, s48_value Xdrawable,
XPoint p[n];
int mode;
Vector_To_XPoints(vec, p, n);
mode = !S48_EQ_P(relative, S48_FALSE) ? CoordModePrevious : CoordModeOrigin;
mode = !S48_FALSE_P(relative) ? CoordModePrevious : CoordModeOrigin;
XDrawPoints(EXTRACT_DISPLAY(Xdisplay), EXTRACT_DRAWABLE(Xdrawable),
EXTRACT_GCONTEXT(Xgcontext), p, n, mode);
@ -117,11 +117,11 @@ s48_value Draw_Line (s48_value Xdisplay,s48_value Xdrawable,
s48_value Draw_Lines(s48_value Xdisplay, s48_value Xdrawalbe,
s48_value Xgcontext, s48_value vec, s48_value relative){
int n = S48_VECTOR_LENGHT(vec);
int n = S48_VECTOR_LENGTH(vec);
XPoint p[n];
int mode;
Vector_To_Points(vec, p, n);
mode = !S48_EQ_P(relative, S48_FALSE) ? CoordModePrevious : CoordModeOrigin;
Vector_To_XPoints(vec, p, n);
mode = !S48_FALSE_P(relative) ? CoordModePrevious : CoordModeOrigin;
XDrawLines(EXTRACT_DISPLAY(Xdisplay), EXTRACT_DRAWABLE(Xdrawalbe),
EXTRACT_GCONTEXT(Xgcontext), p, n, mode);
@ -204,7 +204,7 @@ s48_value Fill_Rectangles (s48_value Xdisplay, s48_value Xdrawable,
s48_value Xgcontext, s48_value vec){
int n = S48_VECTOR_LENGTH(vec);
XRectangle p[n];
Vector_To_Rectangle(vec, p, n);
Vector_To_XRectangle(vec, p, n);
XFillRectangles(EXTRACT_DISPLAY(Xdisplay), EXTRACT_DRAWABLE(Xdrawable),
EXTRACT_GCONTEXT(Xgcontext), p, n);
@ -289,7 +289,7 @@ s48_value Fill_Polygon (s48_value Xdisplay, s48_value Xdrawable,
int sh = (int)Symbol_To_Bit(shape, Polyshape_Syms);
XPoint p[n];
Vector_To_XPoints(vec, p, n);
mode = !S48_EQ_P(relative, S48_FALSE) ? CoordModePrevious : CoordModeOrigin;
mode = !S48_FALSE_P(relative) ? CoordModePrevious : CoordModeOrigin;
XFillPolygon(EXTRACT_DISPLAY(Xdisplay), EXTRACT_DRAWABLE(Xdrawable),
EXTRACT_GCONTEXT(Xgcontext), p, n, sh, mode);

View File

@ -7,6 +7,9 @@ extern void s48_init_color();
extern void s48_init_colormap();
extern void s48_init_pixel();
extern void s48_init_gcontext();
extern void s48_init_event();
extern void s48_init_pixmap();
extern void s48_init_graphics();
int main(){
s48_add_external_init(s48_init_window);
@ -17,6 +20,9 @@ int main(){
s48_add_external_init(s48_init_colormap);
s48_add_external_init(s48_init_pixel);
s48_add_external_init(s48_init_gcontext);
s48_add_external_init(s48_init_event);
s48_add_external_init(s48_init_pixmap);
s48_add_external_init(s48_init_graphics);
s48_main(8000000, 64000,
"/afs/wsi/home/dfreese/i386_fbsd43/scsh-0.6/lib/scheme48/scsh.image",

View File

@ -1,4 +1,15 @@
#include "xlib.h"
#include "scheme48.h"
s48_value Free_Pixmap(s48_value Xpixmap, s48_value Xdisplay) {
XFreePixmap(EXTRACT_DISPLAY(Xdisplay),
EXTRACT_PIXMAP(Xpixmap));
return S48_UNSPECIFIC;
}
/*
Generic_Predicate (Pixmap)
@ -27,7 +38,7 @@ static s48_value Internal_Make_Pixmap (finalize, dpy, pix)
return pm;
}
/* Backwards compatibility: */
// Backwards compatibility:
s48_value Make_Pixmap (dpy, pix) Display *dpy; Pixmap pix; {
return Internal_Make_Pixmap (1, dpy, pix);
}
@ -146,3 +157,9 @@ elk_init_xlib_pixmap () {
Define_Primitive (P_Read_Bitmap_File, "read-bitmap-file", 2, 2, EVAL);
Define_Primitive (P_Write_Bitmap_File, "write-bitmap-file", 4, 6, VARARGS);
}
*/
void s48_init_pixmap(void) {
S48_EXPORT_FUNCTION(Free_Pixmap);
}

Binary file not shown.

View File

@ -48,11 +48,13 @@ s48_value Bits_To_Symbols(unsigned long bits, SYMDESCR* table) {
}
s48_value Bit_To_Symbol(unsigned long bits, SYMDESCR* table) {
s48_value res = Bits_To_Symbols(bits, table);
if (S48_NULL_P(res))
return s48_enter_integer(bits);
else
return S48_CAR(res);
int i = 0;
while (table[i].name != (char*)0) {
if ((table[i].val & bits) != 0)
return s48_enter_symbol(table[i].name);
else i++;
}
return s48_enter_integer(bits); // or what??
}
unsigned long Symbol_To_Bit(s48_value Sym, SYMDESCR* table) {

View File

@ -47,6 +47,8 @@
#define ENTER_PIXMAP(x) S48_FALSE
#define ENTER_FONT(x) S48_FALSE
#define EXTRACT_FONT(x) (Font)0
#define ENTER_ATOM(x) S48_FALSE
#define ENTER_TIME(x) x == CurrentTime ? s48_enter_symbol("now") : s48_enter_integer(x)
/*