forked from opencode.energia.arti.ee/vt1200
54 lines
1.1 KiB
C
54 lines
1.1 KiB
C
/*
|
|
* smoke.c -- Task 1 acceptance: a local Xlib client installs the per-process
|
|
* Xlib context, opens the display, maps a window, and receives a real KeyPress.
|
|
*/
|
|
#include "xlib.h"
|
|
|
|
extern int vt_install_xg(void);
|
|
|
|
volatile vt_u32 mark[32];
|
|
volatile vt_u32 evbuf[24];
|
|
|
|
int main(void)
|
|
{
|
|
void *dpy;
|
|
vt_u32 root, win;
|
|
vt_u32 ks;
|
|
char buf[8];
|
|
int n;
|
|
|
|
mark[0] = 0x534D4F4BUL; /* SMOK */
|
|
if(!vt_install_xg()) return 1;
|
|
dpy = VT_XOPEN("0::0");
|
|
mark[1] = (vt_u32)dpy;
|
|
if(!dpy) return 2;
|
|
|
|
root = *(vt_u32 *)((char *)dpy + 0x90);
|
|
root = *(vt_u32 *)((char *)root + 8);
|
|
win = VT_XCREATE(dpy, root, 80, 80, 480, 312, 2, 1, 0);
|
|
mark[2] = win;
|
|
if(!win) return 3;
|
|
|
|
VT_XSELECT(dpy, win, 0x22000FUL);
|
|
VT_XMAP(dpy, win);
|
|
VT_XSYNC(dpy, 0);
|
|
mark[3] = 0;
|
|
|
|
for(;;) {
|
|
VT_XNEXT(dpy, (void *)evbuf);
|
|
mark[3] = mark[3] + 1;
|
|
mark[4] = evbuf[0];
|
|
mark[5] = evbuf[13];
|
|
if(evbuf[0] == 2) {
|
|
ks = 0;
|
|
n = VT_XLOOKUP((void *)evbuf, buf, 8, &ks, 0);
|
|
mark[6] = (vt_u32)n;
|
|
mark[7] = (vt_u32)(unsigned char)buf[0];
|
|
mark[8] = ks;
|
|
mark[9] = 0x4B455950UL; /* KEYP */
|
|
break;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|