Files
xsrc/xfree/xc/programs/dpsexec/dpsexec.c

234 lines
7.1 KiB
C

/* dpsexec.c
*
* (c) Copyright 1990-1994 Adobe Systems Incorporated.
* All rights reserved.
*
* Permission to use, copy, modify, distribute, and sublicense this software
* and its documentation for any purpose and without fee is hereby granted,
* provided that the above copyright notices appear in all copies and that
* both those copyright notices and this permission notice appear in
* supporting documentation and that the name of Adobe Systems Incorporated
* not be used in advertising or publicity pertaining to distribution of the
* software without specific, written prior permission. No trademark license
* to use the Adobe trademarks is hereby granted. If the Adobe trademark
* "Display PostScript"(tm) is used to describe this software, its
* functionality or for any other purpose, such use shall be limited to a
* statement that this software works in conjunction with the Display
* PostScript system. Proper trademark attribution to reflect Adobe's
* ownership of the trademark shall be given whenever any such reference to
* the Display PostScript system is made.
*
* ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
* ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
* ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
* IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
* TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
* PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
*
* Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
* Incorporated which may be registered in certain jurisdictions
*
* Author: Adobe Systems Incorporated
*/
/* $XFree86: xc/programs/dpsexec/dpsexec.c,v 1.8 2004/04/03 22:38:53 tsi Exp $ */
#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 (
DPSContext ctxt,
int code)
{
if (code == PSZOMBIE) {
/* Zombie event means context died */
exit(0);
}
}
int main(
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);
}
/* Make it possible for this client to start a DPS NX agent,
if "dpsnx.agent" is on the executable search path. */
(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);
/* Allow zombie events to be delivered so application can exit
if context dies. Detach context so it doesn't wait for a join
if it dies */
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)) {
/* Read from command line, send to context */
if (fgets(buf, 1000, stdin) == NULL) break;
DPSWriteData(ctxt, buf, strlen(buf));
}
while (XPending(dpy) > 0) {
/* No special event handling - just throw them away.
Must call XNextEvent to allow DPS status events to
be dispatched. */
XNextEvent(dpy, &ev);
}
}
DPSDestroySpace(DPSSpaceFromContext(ctxt));
XFlush(dpy);
return 0;
}