#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>
#include <sys/time.h>
#include <X11/X.h>
#include <DPS/XDPS.h>
#include <X11/Xlib.h>
#include <DPS/XDPSlib.h>
#include <DPS/dpsXclient.h>
#ifdef __QNX__
#include <sys/select.h>
#endif
#define W_HEIGHT 512
#define W_WIDTH 512
#ifdef _NO_PROTO
#define ARGCAST int
#else
#define ARGCAST void *
#endif
static void MyStatusProc (ctxt, code)
DPSContext ctxt;
int code;
{
if (code == PSZOMBIE) {
exit(0);
}
}
int main(argc, argv)
int argc;
char **argv;
{
char *displayname = "";
Display *dpy;
int i;
char buf[1000];
XEvent ev;
GC gc;
long mask;
int sync = 0;
int backingStore = 0;
int exe = 1;
Window win;
XSetWindowAttributes xswa;
DPSContext ctxt;
XWMHints *hints;
int root = 0;
int width = W_WIDTH;
int height = W_HEIGHT;
Drawable drawable = None;
for (i = 1; i < argc; i++) {
if (strncmp(argv[i], "-display", strlen(argv[i])) == 0) {
i++;
displayname = argv[i];
} else if (strncmp(argv[i], "-sync", strlen(argv[i])) == 0)
sync = 1;
else if (strncmp(argv[i], "-backup", strlen(argv[i])) == 0)
backingStore = 1;
else if (strncmp(argv[i], "-noexec", strlen(argv[i])) == 0)
exe = 0;
else if (strncmp(argv[i], "-root", strlen(argv[i])) == 0)
root = 1;
else if (strncmp(argv[i], "-width", strlen(argv[i])) == 0)
width = atoi(argv[++i]);
else if (strncmp(argv[i], "-height", strlen(argv[i])) == 0)
height = atoi(argv[++i]);
else if (strncmp(argv[i], "-drawable", strlen(argv[i])) == 0)
drawable = (Drawable) atoi(argv[++i]);
else {
fprintf(stderr,
"usage: %s [-display displayname][-sync][-backup][-noexec]\n",
argv[0]);
fprintf(stderr,
" [-root][-width w][-height h][-drawable xid]\n");
exit(1);
}
}
dpy = XOpenDisplay(displayname);
if (dpy == NULL) {
fprintf(stderr, "%s: Can't open display %s!\n", argv[0], displayname);
exit(1);
}
if (sync) (void) XSynchronize(dpy, True);
gc = XCreateGC(dpy, drawable != None ? drawable :
RootWindow (dpy, DefaultScreen (dpy)), 0, NULL);
XSetForeground(dpy, gc, BlackPixel (dpy, DefaultScreen (dpy)));
XSetBackground(dpy, gc, WhitePixel (dpy, DefaultScreen (dpy)));
if (root) {
win = DefaultRootWindow(dpy);
height = DisplayHeight(dpy, DefaultScreen(dpy));
} else if (drawable != None) {
Window root;
int x, y;
unsigned int wwidth, wheight, border, depth;
win = drawable;
(void) XGetGeometry(dpy, win, &root, &x, &y, &wwidth,
&wheight, &border, &depth);
height = wheight;
} else {
win = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy),
3, 385, width, height, 1,
BlackPixel(dpy, DefaultScreen(dpy)),
WhitePixel(dpy, DefaultScreen(dpy)));
hints = XAllocWMHints();
if (hints != NULL) {
hints->flags = InputHint;
hints->input = False;
XSetWMHints(dpy, win, hints);
XFree((char *) hints);
}
XStoreName(dpy, win, "Display PostScript Executive");
XSetIconName(dpy, win, "DPS Exec");
xswa.bit_gravity = SouthWestGravity;
if (backingStore) xswa.backing_store = WhenMapped;
else xswa.backing_store = NotUseful;
xswa.event_mask = 0x0;
mask = CWBitGravity | CWBackingStore | CWEventMask;
XChangeWindowAttributes(dpy, win, mask, &xswa);
XMapWindow(dpy, win);
}
(void) XDPSNXSetClientArg(XDPSNX_AUTO_LAUNCH, (ARGCAST) True);
ctxt = XDPSCreateSimpleContext(dpy, win, gc, 0, height,
DPSDefaultTextBackstop,
DPSDefaultErrorProc, NULL);
if (ctxt == NULL) {
fprintf (stderr, "\ndpsexec: DPS is not available\n");
fprintf (stderr,
"You need an X server with the DPS extension, or a DPS NX agent.\n");
exit (1);
}
DPSSetContext(ctxt);
XDPSRegisterStatusProc(ctxt, MyStatusProc);
XDPSSetStatusMask(ctxt, PSZOMBIEMASK, 0, 0);
DPSPrintf(ctxt, "currentcontext detach ");
if (exe) DPSPrintf(ctxt, "executive");
DPSPrintf(ctxt, "\n");
DPSFlushContext(ctxt);
DPSSuppressBinaryConversion(ctxt, True);
while (1) {
fd_set fdmask;
FD_ZERO(&fdmask);
FD_SET(0, &fdmask);
FD_SET(ConnectionNumber(dpy), &fdmask);
DPSFlushContext(ctxt);
if (select(ConnectionNumber(dpy)+1, &fdmask, NULL, NULL, NULL) < 0)
fprintf(stderr, "select() error %d\n", errno);
else if (FD_ISSET(0, &fdmask)) {
if (fgets(buf, 1000, stdin) == NULL) break;
DPSWriteData(ctxt, buf, strlen(buf));
}
while (XPending(dpy) > 0) {
XNextEvent(dpy, &ev);
}
}
DPSDestroySpace(DPSSpaceFromContext(ctxt));
XFlush(dpy);
return 0;
}