#include <X11/Intrinsic.h>
#include <X11/Xlib.h>
#include <stdio.h>
#include <errno.h>
#include "KlLib.h"
int KlExp_r; /* X fd */
static Display *display;
Window b_win; /* last created window */
int b_x = 0;
int b_y = 0;
int b_w = 10;
int b_h = 10;
/*****************************************************************************\
* WRAPPERS *
\*****************************************************************************/
GC cleargc, drawgc;
KlO
drawinit(KlString name, KlNumber x, KlNumber y, KlNumber w, KlNumber h)
{
Window win = XCreateSimpleWindow(display, DefaultRootWindow(display),
x->number, y->number,
w->number, h->number,
0, 0, WhitePixel(display, 0));
b_win = win;
XStoreName(display, win, name->string);
XMapWindow(display, win);
XFlush(display);
return (KlO) KlNumberMake(win);
}
KlO
drawrect(KlNumber x, KlNumber y, KlNumber w, KlNumber h)
{
XFillRectangle(display, b_win, drawgc, x->number, y->number,
w->number, h->number);
return NIL;
}
KlO
drawclear(KlNumber x, KlNumber y, KlNumber w, KlNumber h)
{
XFillRectangle(display, b_win, cleargc, x->number, y->number,
w->number, h->number);
return NIL;
}
KlO
drawsync()
{
XSync(display, 0);
return NIL;
}
void
KlExpHandler(name, fd, closure)
char *name;
int fd;
void *closure;
{
XEvent e;
process_event:
XNextEvent(display, &e);
if (XPending(display))
goto process_event;
}
void expmain()
{
KlDeclareSubr(drawinit, "drawinit", 5);
KlDeclareSubr(drawrect, "drawrect", 4);
KlDeclareSubr(drawclear, "drawclear", 4);
KlDeclareSubr(drawsync, "drawsync", 0);
display = XOpenDisplay(0);
KlExp_r = ConnectionNumber(display);
KlAddInput("Exp", KlExp_r, KlExpHandler, 0);
cleargc = XCreateGC(display, DefaultRootWindow(display), None, NULL);
XSetFunction(display, cleargc, GXcopy);
XSetForeground(display, cleargc, WhitePixel(display, 0));
XSetBackground(display, cleargc, WhitePixel(display, 0));
drawgc = XCreateGC(display, DefaultRootWindow(display), None, NULL);
XSetFunction(display, drawgc, GXcopy);
XSetForeground(display, drawgc, BlackPixel(display, 0));
XSetBackground(display, cleargc, BlackPixel(display, 0));
XSync(display, 0);
}
void
KlExpHandler()
{
XEvent e;
process_event:
XNextEvent(display, &e);
if (XPending(display))
goto process_event;
}
syntax highlighted by Code2HTML, v. 0.9.1