aboutsummaryrefslogtreecommitdiff
path: root/vendor/x11iraf/ximtool/ximtool.c
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/x11iraf/ximtool/ximtool.c')
-rw-r--r--vendor/x11iraf/ximtool/ximtool.c640
1 files changed, 640 insertions, 0 deletions
diff --git a/vendor/x11iraf/ximtool/ximtool.c b/vendor/x11iraf/ximtool/ximtool.c
new file mode 100644
index 00000000..abb84d9e
--- /dev/null
+++ b/vendor/x11iraf/ximtool/ximtool.c
@@ -0,0 +1,640 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+#include <errno.h>
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Xmu/Error.h>
+#include <Obm.h>
+
+#define XIMTOOL_MAIN
+#include "ximtool.h"
+
+/* The X11IRAF version. */
+char *ximtool_version[] = {
+# include "../version.h"
+ NULL
+};
+
+
+/*
+ * XIMTOOL -- X11 based image display server and standalone image display
+ * client. This program is based on the IRAF prototype widget server (object
+ * manager library or OBM) and the gterm-image widget.
+ */
+
+/* Compatibility hacks. */
+#ifdef AUX
+void *memmove(a,b,n) void *a; const void *b; size_t n; { bcopy(b,a,n); }
+#else
+#if defined(sun) && !defined(SVR4)
+void *memmove(a,b,n) void *a; void *b; size_t n; { bcopy(b,a,n); }
+#endif
+#endif
+
+/* Data. */
+XtAppContext app_context;
+static char server[] = "server";
+
+/* The builtin default GUI. */
+char *defgui_text[] = {
+# include "ximtool.gui.h"
+ NULL
+};
+
+
+#ifdef AUX
+#define SIGFUNC sigfunc_t
+#else
+typedef void (*SIGFUNC)();
+#endif
+
+void xim_onsig();
+
+
+/* MAIN -- XImtool main program. This is the only ximtool routine containing
+ * window system specific code.
+ */
+main (argc, argv)
+int argc;
+char *argv[];
+{
+ register XimDataPtr xim = &ximtool_data;
+ register int i;
+ register IsmModule ism;
+
+ Screen *screen;
+ Visual *visual;
+ Widget toplevel;
+ XtPointer obm;
+ char **sv_argv, *init_file = NULL, *str;
+ int sv_argc, ncolors, base;
+ int depth, tile = 0;
+
+ extern IsmModule ismNameToPtr();
+ int xerror(), xioerror();
+
+
+ /* Process the command line arguments. Scan the arglist first to see
+ * if we're requesting help or a printout of the default GUI, if so
+ * print these out and exit.
+ */
+ if (argc > 1) {
+ if (strcmp (argv[1], "-help") == 0) {
+ Usage ();
+ exit (1);
+
+ } else if (strcmp (argv[1], "-version") == 0) {
+ printf ("Version: %s\n", ximtool_version[0]);
+ exit (1);
+
+ } else if (strcmp (argv[1], "-defgui") == 0) {
+ register int i;
+ for (i=0; defgui_text[i]; i++)
+ printf ("%s\n", defgui_text[i]);
+ exit (0);
+ }
+ }
+
+
+ /* Loop over the command line options and preprocess the ones that
+ * are widget/GUI resources we want to make available more easily.
+ * To do this we'll tweak the argument list so it appears to be a
+ * "-xrm" resource setting, this means the X initialization code
+ * below will do all the real work.
+ */
+ for (i=1; i < argc; i++) {
+
+ if (strcmp (argv[i], "-cmapName") == 0) {
+ str = argv[++i];
+ strcpy (argv[i-1], "-xrm\0");
+ argv[i] = (char *) malloc (256);
+ sprintf (argv[i], "XImtool*cmapName:%s\0", str);
+
+ } else if (strcmp (argv[i], "-maxColors") == 0) {
+ ncolors = atoi (argv[++i]);
+ ncolors = max (32, min (201, ncolors));
+ strcpy (argv[i-1], "-xrm\0");
+ argv[i] = (char *) malloc (256);
+ sprintf (argv[i], "XImtool*maxColors:%d\0", ncolors);
+
+ } else if (strcmp (argv[i], "-basePixel") == 0) {
+ base = atoi (argv[++i]);
+ strcpy (argv[i-1], "-xrm\0");
+ argv[i] = (char *) malloc (256);
+ sprintf (argv[i], "XImtool*basePixel:%d", base);
+
+ } else if (strcmp (argv[i], "-cmapInitialize") == 0) {
+ str = argv[++i];
+ strcpy (argv[i-1], "-xrm\0");
+ argv[i] = (char *) malloc (256);
+ sprintf (argv[i], "XImtool*cmapInitialize:%s", str);
+
+ } else if (strcmp (argv[i], "-displayPanner") == 0) {
+ str = argv[++i];
+ strcpy (argv[i-1], "-xrm\0");
+ argv[i] = (char *) malloc (256);
+ sprintf (argv[i], "XImtool*displayPanner:%s", str);
+
+ } else if (strcmp (argv[i], "-displayMagnifier") == 0) {
+ str = argv[++i];
+ strcpy (argv[i-1], "-xrm\0");
+ argv[i] = (char *) malloc (256);
+ sprintf (argv[i], "XImtool*displayMagnifier:%s", str);
+
+ } else if (strcmp (argv[i], "-displayCoords") == 0) {
+ str = argv[++i];
+ strcpy (argv[i-1], "-xrm\0");
+ argv[i] = (char *) malloc (256);
+ sprintf (argv[i], "XImtool*displayCoords:%s", str);
+
+ } else if (strcmp (argv[i], "-printConfig") == 0) {
+ str = argv[++i];
+ strcpy (argv[i-1], "-xrm\0");
+ argv[i] = (char *) malloc (256);
+ sprintf (argv[i], "XImtool*printConfig:%s", str);
+ }
+ }
+
+ /* Get local copy of argc and argv. */
+ if ((sv_argc = argc) > 0) {
+ sv_argv = (char **) XtMalloc (argc * sizeof(char *));
+ memmove (sv_argv, argv, argc * sizeof(char *));
+ } else
+ sv_argv = argv;
+
+ /* Initialize applications context. We don't use the top level
+ * shell created here, but we need to deal with it in order to
+ * get the application resources. The object manager opens its own
+ * connection to the display server and manages a separate window
+ * hierarchy with its own top level shell.
+ */
+ xim->toplevel = toplevel = XtAppInitialize (&app_context, "XImtool",
+ (XrmOptionDescList) NULL, 0, &sv_argc, sv_argv,
+ (String *) NULL, (ArgList) NULL, 0);
+
+ /* Free saved arglist. */
+ free ((char *)sv_argv);
+
+ /* Get application resources. */
+ XtVaGetApplicationResources (xim->toplevel, xim,
+ resources, XtNumber(resources),
+ /* Add any resource overrides here */
+ NULL);
+
+ /* Check to see if we have the correct visual to proceed, if not
+ * shut down more gracefully and informatively than the BadMatch
+ * error from X that awaits us.
+ */
+
+#ifdef PSEUDOCOLOR_ONLY
+ screen = XtScreen (toplevel);
+ visual = DefaultVisualOfScreen(screen);
+ depth = DefaultDepthOfScreen(screen);
+ if (depth != 8 || visual->class != PseudoColor)
+ xim_badVisual (depth, visual->class);
+#endif
+
+
+
+ /* Initialize the object manager. */
+ xim->obm = obm = (XtPointer) ObmOpen (app_context, argc, argv);
+ ObmAddCallback (obm, OBMCB_setGterm|OBMCB_preserve, xim_reset,
+ (XtPointer)xim);
+
+
+ /* Loop over the command line options. The default xim structure
+ * should be defined at this point so the command options can be
+ * used to override them.
+ */
+ for (i=1; i < argc; i++) {
+
+ /* Anything without a '-' is a file name to load at startup.
+ * Only use the first name defined.
+ */
+ if (argv[i][0] != '-') { /* File name */
+ if (!init_file) {
+ init_file = argv[i];
+ if (access (init_file, F_OK) < 0) {
+ fprintf (stderr, "%s: File does not exist: '%s'\n",
+ argv[0], init_file);
+ exit (1);
+ } else if (access (init_file, R_OK) < 0) {
+ fprintf (stderr,
+ "%s: File doesn't have read permission: '%s'\n",
+ argv[0], init_file);
+ exit (1);
+ }
+ }
+
+ } else if (strcmp (argv[i], "-gui") == 0) {
+ xim->gui = argv[++i];
+
+ } else if (strcmp (argv[i], "-cmap1") == 0) {
+ xim->userCMap1 = argv[++i];
+
+ } else if (strcmp (argv[i], "-cmap2") == 0) {
+ xim->userCMap2 = argv[++i];
+
+ } else if (strcmp (argv[i], "-cmapDir1") == 0) {
+ xim->userCMapDir1 = argv[++i];
+
+ } else if (strcmp (argv[i], "-cmapDir2") == 0) {
+ xim->userCMapDir2 = argv[++i];
+
+ } else if (strcmp (argv[i], "-imtoolrc") == 0) {
+ xim->imtoolrc = argv[++i];
+
+ } else if (strcmp (argv[i], "-memModel") == 0) {
+ xim->memModel = argv[++i];
+
+ } else if (strcmp (argv[i], "-config") == 0) {
+ xim->def_config = atoi (argv[++i]);
+
+ } else if (strcmp (argv[i], "-nframes") == 0) {
+ i++;
+ xim->def_nframes = min (MAX_FRAMES, atoi (argv[i]));
+
+ } else if (strcmp (argv[i], "-tile") == 0) {
+ tile = ++xim->tileFrames;
+
+ } else if (strcmp (argv[i], "-invert") == 0) {
+ xim->invert++;
+
+ } else if (strcmp (argv[i], "-fifo") == 0) {
+ if (strcmp ("none", argv[i+1]) == 0) {
+ xim->input_fifo = "none";
+ } else {
+ xim->input_fifo = malloc (strlen(argv[++i])+2);
+ xim->output_fifo = malloc (strlen(argv[i])+2);
+ sprintf (xim->input_fifo, "%si", argv[i]);
+ sprintf (xim->output_fifo, "%so", argv[i]);
+ }
+
+ } else if (strcmp (argv[i], "-port") == 0) {
+ xim->port = atoi (argv[++i]);
+
+ } else if (strcmp (argv[i], "-nports") == 0) {
+ xim->nports = atoi (argv[++i]);
+
+ } else if (strcmp (argv[i], "-unix") == 0) {
+ xim->unixaddr = argv[++i];
+
+ } else if (strcmp (argv[i], "-fifo_only") == 0) {
+ xim->unixaddr = "none";
+ xim->port = 0;
+
+ } else if (strcmp (argv[i], "-inet_only") == 0 ||
+ strcmp (argv[i], "-port_only") == 0 ) {
+ xim->input_fifo = "";
+ xim->unixaddr = "none";
+
+ } else if (strcmp (argv[i], "-unix_only") == 0) {
+ xim->input_fifo = "";
+ xim->port = 0;
+
+ } else if (strcmp (argv[i], "-ismdev") == 0) {
+ if (strcmp ("none", xim->ism_addr) )
+ xim->ism_addr = argv[++i];
+ else
+ i++;
+
+
+ /* Skip any standard X toolkit flags, they're handled above.
+ */
+ } else if (strcmp (argv[i], "-bg") == 0) {
+ i++;
+ } else if (strcmp (argv[i], "-fg") == 0) {
+ i++;
+ } else if (strcmp (argv[i], "-iconic") == 0) {
+ ;
+ } else if (strcmp (argv[i], "-display") == 0) {
+ i++;
+ } else if (strcmp (argv[i], "-geometry") == 0) {
+ i++;
+ } else if (strcmp (argv[i], "-title") == 0) {
+ i++;
+ } else if (strcmp (argv[i], "-xrm") == 0) {
+ i++;
+
+ } else {
+ fprintf (stderr, "Unrecognized flag '%s'\n", argv[i]);
+ Usage();
+ exit (1);
+ }
+ }
+
+
+ /* Initialize the ximtool/obm client code. */
+ xim_clientOpen (xim);
+
+ /* Load the Ximtool GUI. If the GUI name is "default" the builtin
+ * default GUI is used. This is stored as an array of text lines,
+ * which we must append newlines to and concatenate together to
+ * form the GUI message.
+ */
+ if (strcmp (xim->gui, "default") == 0 ||
+ (ObmDeliverMsgFromFile (obm, server, xim->gui) != 0)) {
+
+ register char *ip, *op;
+ char *message;
+ int i;
+
+ message = (char *) malloc (409600);
+ for (i=0, op=message; ip = defgui_text[i]; i++) {
+ while (*ip)
+ *op++ = *ip++;
+ *op++ = '\n';
+ }
+ *op++ = '\0';
+
+ ObmDeliverMsg (obm, server, message);
+ free ((char *)message);
+
+ }
+
+ /* Activate the GUI. */
+ ObmActivate (obm);
+
+ /* Initialize the frame buffers and graphics pipeline. */
+ xim->tileFrames = tile;
+ xim_initialize (xim, xim->def_config, xim->def_nframes, 1);
+
+ /* Listen for a client connection. */
+ xim_iisOpen (xim);
+ xim_ismOpen (xim);
+
+ /* Display a pretty logo. */
+ xim_displayLogo (xim);
+
+ /* Initialize the hardcopy option and printer configuration. */
+ xim_initPrinterOps (xim);
+
+ /* Open the file Load/Save structures. */
+ xim_initLoad (xim);
+ xim_initSave (xim);
+
+ /* Load a file at startup if it was defined. */
+ if ( init_file != NULL )
+ xim_loadFile (xim, init_file, 1);
+
+ /* Lookup the ISM command for the WCSPIX task and start it.
+ */
+ if ((ism = ismNameToPtr ("wcspix"))) {
+ system (ism->command);
+ ism_message (ism, "wcspix", "initialize");
+ }
+
+ XSetErrorHandler(xerror);
+ XSetIOErrorHandler(xioerror);
+
+
+/* signal (SIGINT, (SIGFUNC)xim_onsig);*/
+
+ /* EXECUTE */
+ XtAppMainLoop (app_context);
+
+ xim_shutdown (xim);
+}
+
+
+/* XIM_SHUTDOWN -- Terminate ximtool.
+ */
+xim_shutdown (xim)
+register XimDataPtr xim;
+{
+ eps_close (xim->psim);
+ xim_loadClose (xim);
+ xim_saveClose (xim);
+ xim_clientClose (xim);
+ xim_iisClose (xim);
+ xim_ismClose (xim);
+ xim_close (xim);
+ ObmClose (xim->obm);
+ exit (0);
+}
+
+
+/* XIM_ADDINPUT -- Register a procedure to be called when there is input
+ * to be processed on the given input source. The ximtool code doesn't
+ * talk to X directly so we need to provide this interface routine.
+ */
+XtPointer
+xim_addInput (xim, input, proc, client_data)
+register XimDataPtr xim;
+int input;
+void (*proc)();
+XtPointer client_data;
+{
+ return ((XtPointer) XtAppAddInput (app_context, input,
+ (XtPointer)XtInputReadMask, *proc, client_data));
+}
+
+
+/* XIM_REMOVEINPUT -- Remove a callback previously posted with xim_addInput.
+ */
+void
+xim_removeInput (xim, id)
+register XimDataPtr xim;
+XtPointer id;
+{
+ XtRemoveInput ((XtInputId)id);
+}
+
+
+/* USAGE -- Print a list of command-line options.
+ */
+Usage ()
+{
+ fprintf (stderr, "Usage:\n\n");
+ printoption (" ximtool");
+ printoption ("[-basePixel <num>]"); /* base cmap pixel */
+ printoption ("[-cmap1 <file>]"); /* User cmap 1 */
+ printoption ("[-cmap2 <file>]"); /* User cmap 2 */
+ printoption ("[-cmapDir1 <dir>]"); /* User cmapDir 1 */
+ printoption ("[-cmapDir2 <dir>]"); /* User cmapDir 2 */
+ printoption ("[-cmapInitialize <bool>]"); /* initialize colormap */
+ printoption ("[-cmapName <name>]"); /* colormap name */
+ printoption ("[-config <num>]"); /* initial config */
+ printoption ("[-defgui]"); /* Print default GUI */
+ printoption ("[-displayPanner <bool>]"); /* display panner box */
+ printoption ("[-displayMagnifier <bool>]"); /* display magnifier box */
+ printoption ("[-displayCoords <bool>]"); /* display wcs coords box */
+ printoption ("[-fifo <pipe>]"); /* fifo pipe */
+ printoption ("[-fifo_only]"); /* use fifo only */
+ printoption ("[-gui <file>]"); /* GUI file */
+ printoption ("[-help]"); /* Print help */
+ printoption ("[-imtoolrc <file>]"); /* fbconfig file */
+ printoption ("[-inet_only | -port_only]"); /* use inet only */
+ printoption ("[-invert]"); /* invert colormap */
+ printoption ("[-ismdev <dev>]"); /* ISM device template */
+ printoption ("[-maxColors <num>]"); /* # of colors */
+ printoption ("[-memModel <type>]"); /* memory model */
+ printoption ("[-nframes <num>]"); /* # of frames */
+ printoption ("[-port <num>]"); /* inet port */
+ printoption ("[-printConfig <name>]"); /* printer config file */
+ printoption ("[-tile]"); /* tile frames */
+ printoption ("[-unix <name>]"); /* unix socket */
+ printoption ("[-unix_only]"); /* use unix only */
+ printoption ("[<file>]"); /* file to load */
+ fprintf (stderr,"\n");
+}
+
+
+/* PRINTOPTION -- Pretty-print an option string.
+ */
+static int cpos = 0;
+printoption(st)
+char *st;
+{
+ if (strlen(st) + cpos > 78) {
+ fprintf (stderr,"\n\t");
+ cpos = 8;
+ }
+ fprintf (stderr,"%s ",st);
+ cpos = cpos + strlen(st) + 1;
+}
+
+
+/* xim_badVisual -- A bad X visual has been detected for the screen which
+ * will cause us to crash with a BadMatch error. Instead, abort with a
+ * more informative message so the user can correct the visual.
+ */
+xim_badVisual (depth, class)
+int depth;
+int class;
+{
+ fprintf (stderr,
+ "\nERROR: Detected incorrect X visual: depth=%d class=", depth);
+ switch (class) {
+ case StaticGray: fprintf (stderr, "StaticGray\n") ; break;
+ case GrayScale: fprintf (stderr, "GrayScale\n") ; break;
+ case StaticColor: fprintf (stderr, "StaticColor\n") ; break;
+ case PseudoColor: fprintf (stderr, "PseudoColor\n") ; break;
+ case TrueColor: fprintf (stderr, "TrueColor\n") ; break;
+ case DirectColor: fprintf (stderr, "DirectColor\n") ; break;
+ default: fprintf (stderr, "DirectColor\n") ; break;
+ }
+
+ fprintf (stderr, "\n");
+ fprintf (stderr,
+ "XImtool currently requires an 8-bit PseudoColor visual in order\n");
+ fprintf (stderr,
+ "to operate properly. Unfortunately the only workaround for this\n");
+ fprintf (stderr,
+ "at present is to start an 8-bit server using commands such as\n\n");
+ fprintf (stderr,
+ " %% startx -- -bpp 8\t\t\t\t\t # XFree86 V3.x\n");
+ fprintf (stderr,
+ " %% startx -- -depth 8\t\t\t\t # XFree86 V4.x\n");
+ fprintf (stderr,
+ " %% Xsun :0 -dev /dev/fb defclass PseudoColor defdepth 8 # Sun\n");
+ fprintf (stderr,
+ " %% Xdec -vclass0 PseudoColor\t\t\t\t # Digital Unix\n");
+ fprintf (stderr,
+ "\nThe actual commands used will vary depending on the platform,\n");
+ fprintf (stderr,
+ "window manager/desktop used, and in some cases video hardware.\n");
+ fprintf (stderr,
+ "See the Xserver(1) and xinit(1) man page for details. Users should\n");
+ fprintf (stderr,
+ "also contact IRAF site support (iraf@noao.edu) with any questions\n");
+ fprintf (stderr,
+ "or problems.\n\n");
+
+ exit (1);
+}
+
+
+
+#define ERROR_XERROR 83 /* xerror: XError event */
+#define ERROR_XIOERROR 84 /* xioerror: X I/O error */
+
+/* XERROR -- Handle an XLIB server error. A standard X error message is
+ * printed and then the program either dumps core, exits, or ignores the error,
+ * depending upon the value of the environment variable XGXERROR, if defined.
+*/
+/*ARGSUSED*/
+xerror (display, event)
+Display *display;
+register XErrorEvent *event;
+{
+ static char *envvar = "XGXERROR";
+ static int nerrs = 0;
+ extern char *getenv();
+ char fname[128];
+ char *action;
+ int pid;
+
+ fprintf (stderr, "ximtool: warning, error event received:\n");
+ (void) XmuPrintDefaultErrorMessage (display, event, stderr);
+ if (nerrs++ > 50)
+ exit (ERROR_XERROR);
+
+ if (action = getenv (envvar)) {
+ if (strcmp (action, "dumpcore") == 0) {
+ if ((pid = fork()) >= 0) {
+ if (pid) {
+ fprintf (stderr, "dumping core... ");
+ fflush (stderr);
+ sprintf (fname, "core.%d", pid);
+ wait(NULL); rename ("core", fname);
+ fprintf (stderr, "core file core.%d written\n", pid);
+ fflush (stderr);
+ } else
+ kill (getpid(), 6);
+ } else
+ fprintf (stderr, "fork failed, no core dump produced\n");
+ } else if (strcmp (action, "exit") == 0) {
+ fprintf (stderr, "program terminated\n");
+ exit (ERROR_XERROR);
+ } else
+ fprintf (stderr, "%s: unknown action %s\n", envvar, action);
+ }
+ fflush (stderr);
+
+ return (0);
+}
+
+
+/*ARGSUSED*/
+xioerror(dpy)
+Display *dpy;
+{
+ char *SysErrorMsg();
+
+ (void) fprintf (stderr,
+ "ximtool: fatal IO error %d (%s) or KillClient on X server \"%s\"\r\n",
+ errno, SysErrorMsg (errno),
+ DisplayString (dpy));
+
+ exit (ERROR_XIOERROR);
+}
+
+void xt_error(message)
+ String message;
+{
+ (void) fprintf (stderr, "ximtool Xt error: %s\n", message);
+ exit (1);
+}
+
+
+char *SysErrorMsg (n)
+ int n;
+{
+ return((n >= 0) ? (char *)strerror(n) : "unknown error");
+}
+
+
+/* XIM_ONSIG -- Catch interrupt and shutdown gracefully.
+ */
+void
+xim_onsig (sig, code, scp)
+int sig; /* signal which was trapped */
+int *code; /* not used */
+int *scp; /* not used */
+{
+ xim_shutdown (&ximtool_data);
+}
+