1189 lines
		
	
	
		
			49 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			1189 lines
		
	
	
		
			49 KiB
		
	
	
	
		
			C
		
	
	
	
| /* $XFree86$ */
 | |
| /*
 | |
|  * Copyright 2002 Red Hat Inc., Durham, North Carolina.
 | |
|  *
 | |
|  * All Rights Reserved.
 | |
|  *
 | |
|  * Permission is hereby granted, free of charge, to any person obtaining
 | |
|  * a copy of this software and associated documentation files (the
 | |
|  * "Software"), to deal in the Software without restriction, including
 | |
|  * without limitation on the rights to use, copy, modify, merge,
 | |
|  * publish, distribute, sublicense, and/or sell copies of the Software,
 | |
|  * and to permit persons to whom the Software is furnished to do so,
 | |
|  * subject to the following conditions:
 | |
|  *
 | |
|  * The above copyright notice and this permission notice (including the
 | |
|  * next paragraph) shall be included in all copies or substantial
 | |
|  * portions of the Software.
 | |
|  *
 | |
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 | |
|  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | |
|  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 | |
|  * NON-INFRINGEMENT.  IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
 | |
|  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 | |
|  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | |
|  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | |
|  * SOFTWARE.
 | |
|  */
 | |
| 
 | |
| /*
 | |
|  * Authors:
 | |
|  *   Rickard E. (Rik) Faith <faith@redhat.com>
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <X11/Intrinsic.h>
 | |
| #include <X11/StringDefs.h>
 | |
| #include <X11/Xaw/Form.h>
 | |
| #include <X11/Xaw/Box.h>
 | |
| /* #include <X11/Xaw/Paned.h> */
 | |
| #include <X11/Xaw/Command.h>
 | |
| #include <X11/Xaw/SimpleMenu.h>
 | |
| #include <X11/Xaw/SmeBSB.h>
 | |
| #include <X11/Xaw/MenuButton.h>
 | |
| #include <X11/Xaw/Viewport.h>
 | |
| #include <X11/Xaw/Dialog.h>
 | |
| #include <X11/keysym.h>
 | |
| #include <X11/Xmu/SysUtil.h>
 | |
| #include "Canvas.h"
 | |
| 
 | |
| #include "dmxparse.h"
 | |
| #include "dmxprint.h"
 | |
| #include "dmxlog.h"
 | |
| 
 | |
| extern int                 yyparse(void);
 | |
| extern FILE                *yyin;
 | |
| 
 | |
| #define DMX_INFO "xdmxconfig v0.9\nCopyright 2002 Red Hat Inc.\n$Id$"
 | |
| 
 | |
| #define DMX_MAIN_WIDTH    800
 | |
| #define DMX_MAIN_HEIGHT   600
 | |
| #define DMX_DATA_WIDTH    200
 | |
| #define DMX_DATA_HEIGHT   200
 | |
| #define DMX_CANVAS_WIDTH  400
 | |
| #define DMX_CANVAS_HEIGHT 500
 | |
| 
 | |
| DMXConfigEntryPtr          dmxConfigEntry;
 | |
| static DMXConfigVirtualPtr dmxConfigCurrent, dmxConfigNewVirtual;
 | |
| static DMXConfigDisplayPtr dmxConfigCurrentDisplay, dmxConfigNewDisplay;
 | |
| static int                 dmxConfigGrabbed, dmxConfigGrabbedFine;
 | |
| static int                 dmxConfigGrabbedX, dmxConfigGrabbedY;
 | |
| static char                *dmxConfigFilename;
 | |
| static GC                  dmxConfigGC, dmxConfigGCRev, dmxConfigGCHL;
 | |
| static int                 dmxConfigGCInit = 0;
 | |
| static Dimension           dmxConfigWidgetWidth, dmxConfigWidgetHeight;
 | |
| static Dimension           dmxConfigWallWidth, dmxConfigWallHeight;
 | |
| static double              dmxConfigScaleX, dmxConfigScaleY;
 | |
| static int                 dmxConfigNotSaved;
 | |
| static enum {
 | |
|     dmxConfigStateOpen,
 | |
|     dmxConfigStateSave
 | |
| }                          dmxConfigState;
 | |
| 
 | |
| /* Global widgets */
 | |
| static Widget              canvas;
 | |
| static Widget              cnamebox, cdimbox;
 | |
| static Widget              openpopup, opendialog;
 | |
| static Widget              namebox, dimbox, rtbox, origbox;
 | |
| static Widget              okbutton, buttonpopup;
 | |
| static Widget              ecbutton, dcbutton;
 | |
| static Widget              ndbutton0, ndbutton1, edbutton, ddbutton;
 | |
| static Widget              ecpopup, ecdialog0, ecdialog1;
 | |
| static Widget              edpopup, eddialog0, eddialog1, eddialog2;
 | |
| static Widget              aboutpopup, quitpopup;
 | |
| 
 | |
| static void dmxConfigCanvasGCs(void)
 | |
| {
 | |
|     Display       *dpy = XtDisplay(canvas);
 | |
|     Window        win  = XtWindow(canvas);
 | |
|     XGCValues     gcvals;
 | |
|     unsigned long mask;
 | |
|     Colormap      colormap;
 | |
|     XColor        fg, bg, hl, tmp;
 | |
|     
 | |
|     if (dmxConfigGCInit++) return;
 | |
| 
 | |
|     XtVaGetValues(canvas, XtNcolormap, &colormap, NULL);
 | |
|     XAllocNamedColor(XtDisplay(canvas), colormap, "black", &bg, &tmp);
 | |
|     XAllocNamedColor(XtDisplay(canvas), colormap, "white", &fg, &tmp);
 | |
|     XAllocNamedColor(XtDisplay(canvas), colormap, "red",   &hl, &tmp);
 | |
| 
 | |
|     mask = (GCFunction | GCPlaneMask | GCClipMask | GCForeground |
 | |
|             GCBackground | GCLineWidth | GCLineStyle | GCCapStyle |
 | |
|             GCFillStyle);
 | |
| 
 | |
|                                 /* FIXME: copy this from widget */
 | |
|     gcvals.function   = GXcopy;
 | |
|     gcvals.plane_mask = AllPlanes;
 | |
|     gcvals.clip_mask  = None;
 | |
|     gcvals.foreground = fg.pixel;
 | |
|     gcvals.background = bg.pixel;
 | |
|     gcvals.line_width = 0;
 | |
|     gcvals.line_style = LineSolid;
 | |
|     gcvals.cap_style  = CapNotLast;
 | |
|     gcvals.fill_style = FillSolid;
 | |
|     
 | |
|     dmxConfigGC       = XCreateGC(dpy, win, mask, &gcvals);
 | |
|     gcvals.foreground = hl.pixel;
 | |
|     dmxConfigGCHL     = XCreateGC(dpy, win, mask, &gcvals);
 | |
|     gcvals.foreground = bg.pixel;
 | |
|     gcvals.background = fg.pixel;
 | |
|     dmxConfigGCRev    = XCreateGC(dpy, win, mask, &gcvals);
 | |
| }
 | |
| 
 | |
| static void dmxConfigGetDims(int *maxWidth, int *maxHeight)
 | |
| {
 | |
|     DMXConfigSubPtr   pt;
 | |
|     DMXConfigEntryPtr e;
 | |
|     
 | |
|     *maxWidth = dmxConfigWallWidth  = 0;
 | |
|     *maxWidth = dmxConfigWallHeight = 0;
 | |
|     if (!dmxConfigCurrent) return;
 | |
|     
 | |
|     dmxConfigWallWidth  = dmxConfigCurrent->width;
 | |
|     dmxConfigWallHeight = dmxConfigCurrent->height;
 | |
|     if (!dmxConfigWallWidth || !dmxConfigWallHeight) {
 | |
|         for (pt = dmxConfigCurrent->subentry; pt; pt = pt->next) {
 | |
|             if (pt->type == dmxConfigDisplay) {
 | |
|                 int x = pt->display->scrnWidth  + pt->display->rootXOrigin;
 | |
|                 int y = pt->display->scrnHeight + pt->display->rootYOrigin;
 | |
|                 if (x > dmxConfigWallWidth)  dmxConfigWallWidth  = x;
 | |
|                 if (y > dmxConfigWallHeight) dmxConfigWallHeight = y;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|                                 /* Compute maximums */
 | |
|     *maxWidth = *maxHeight = 0;
 | |
|     for (e = dmxConfigEntry; e; e = e->next) {
 | |
|         if (e->type != dmxConfigVirtual) continue;
 | |
|         for (pt = e->virtual->subentry; pt; pt = pt->next) {
 | |
|             if (pt->type == dmxConfigDisplay) {
 | |
|                 int x = pt->display->scrnWidth  + pt->display->rootXOrigin;
 | |
|                 int y = pt->display->scrnHeight + pt->display->rootYOrigin;
 | |
|                 if (x > *maxWidth)  *maxWidth  = x;
 | |
|                 if (y > *maxHeight) *maxHeight = y;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     if (dmxConfigWallWidth  > *maxWidth)  *maxWidth  = dmxConfigWallWidth;
 | |
|     if (dmxConfigWallHeight > *maxHeight) *maxHeight = dmxConfigWallHeight;
 | |
| }
 | |
| 
 | |
| static int scalex(int x)   { return (int)((x * dmxConfigScaleX) + .5); }
 | |
| static int scaley(int y)   { return (int)((y * dmxConfigScaleY) + .5); }
 | |
| static int unscalex(int x) { return (int)((x / dmxConfigScaleX) + .5); }
 | |
| static int unscaley(int y) { return (int)((y / dmxConfigScaleY) + .5); }
 | |
| 
 | |
| static void dmxConfigDataUpdate(void)
 | |
| {
 | |
|                                 /* FIXME: could result in buffer overflows */
 | |
|     char       cnambuf[512];
 | |
|     char       cdimbuf[128];
 | |
|     char       nambuf[512];
 | |
|     char       dimbuf[128];
 | |
|     char       rtbuf[128];
 | |
|     char       offbuf[128];
 | |
|     const char *name;
 | |
| 
 | |
|     if (!dmxConfigCurrent) {
 | |
|         XtVaSetValues(cnamebox,   XtNlabel, "", XtNsensitive, False, NULL);
 | |
|         XtVaSetValues(cdimbox,    XtNlabel, "", XtNsensitive, False, NULL);
 | |
|         XtVaSetValues(ecbutton,                 XtNsensitive, False, NULL);
 | |
|         XtVaSetValues(dcbutton,                 XtNsensitive, False, NULL);
 | |
|         XtVaSetValues(ndbutton0,                XtNsensitive, False, NULL);
 | |
|         XtVaSetValues(ndbutton1,                XtNsensitive, False, NULL);
 | |
|     } else {
 | |
|         name = dmxConfigCurrent->name;
 | |
|         XmuSnprintf(cnambuf, sizeof(cnambuf), "%s", name ? name : "");
 | |
| 	XmuSnprintf(cdimbuf, sizeof(cdimbuf), "%dx%d",
 | |
|                     dmxConfigWallWidth, dmxConfigWallHeight);
 | |
|         XtVaSetValues(cnamebox,   XtNlabel, cnambuf, XtNsensitive, True, NULL);
 | |
|         XtVaSetValues(cdimbox,    XtNlabel, cdimbuf, XtNsensitive, True, NULL);
 | |
|         XtVaSetValues(ecbutton,                      XtNsensitive, True, NULL);
 | |
|         XtVaSetValues(dcbutton,                      XtNsensitive, True, NULL);
 | |
|         XtVaSetValues(ndbutton0,                     XtNsensitive, True, NULL);
 | |
|         XtVaSetValues(ndbutton1,                     XtNsensitive, True, NULL);
 | |
|     }
 | |
|     
 | |
|     if (!dmxConfigCurrentDisplay) {
 | |
|         XtVaSetValues(namebox, XtNlabel, "", XtNsensitive, False, NULL);
 | |
|         XtVaSetValues(dimbox,  XtNlabel, "", XtNsensitive, False, NULL);
 | |
|         XtVaSetValues(rtbox,   XtNlabel, "", XtNsensitive, False, NULL);
 | |
|         XtVaSetValues(origbox, XtNlabel, "", XtNsensitive, False, NULL);
 | |
|         XtVaSetValues(edbutton,              XtNsensitive, False, NULL);
 | |
|         XtVaSetValues(ddbutton,              XtNsensitive, False, NULL);
 | |
|     } else {
 | |
|         name = dmxConfigCurrentDisplay->name;
 | |
|         XmuSnprintf(nambuf, sizeof(nambuf), "%s", name ? name : "");
 | |
|         XmuSnprintf(dimbuf, sizeof(dimbuf), "%dx%d%c%d%c%d",
 | |
|                     dmxConfigCurrentDisplay->scrnWidth,
 | |
|                     dmxConfigCurrentDisplay->scrnHeight,
 | |
|                     dmxConfigCurrentDisplay->scrnXSign < 0 ? '-' : '+',
 | |
|                     dmxConfigCurrentDisplay->scrnX,
 | |
|                     dmxConfigCurrentDisplay->scrnYSign < 0 ? '-' : '+',
 | |
|                     dmxConfigCurrentDisplay->scrnY);
 | |
|         XmuSnprintf(rtbuf, sizeof(dimbuf), "%dx%d%c%d%c%d",
 | |
|                     dmxConfigCurrentDisplay->rootWidth,
 | |
|                     dmxConfigCurrentDisplay->rootHeight,
 | |
|                     dmxConfigCurrentDisplay->rootXSign < 0 ? '-' : '+',
 | |
|                     dmxConfigCurrentDisplay->rootX,
 | |
|                     dmxConfigCurrentDisplay->rootYSign < 0 ? '-' : '+',
 | |
|                     dmxConfigCurrentDisplay->rootY);
 | |
|         XmuSnprintf(offbuf, sizeof(offbuf), "@%dx%d",
 | |
|                     dmxConfigCurrentDisplay->rootXOrigin,
 | |
|                     dmxConfigCurrentDisplay->rootYOrigin);
 | |
|         XtVaSetValues(namebox, XtNlabel, nambuf, XtNsensitive, True, NULL);
 | |
|         XtVaSetValues(dimbox,  XtNlabel, dimbuf, XtNsensitive, True, NULL);
 | |
|         XtVaSetValues(rtbox,   XtNlabel, rtbuf,  XtNsensitive, True, NULL);
 | |
|         XtVaSetValues(origbox, XtNlabel, offbuf, XtNsensitive, True, NULL);
 | |
|         XtVaSetValues(edbutton,                  XtNsensitive, True, NULL);
 | |
|         XtVaSetValues(ddbutton,                  XtNsensitive, True, NULL);
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void dmxConfigCanvasUpdate(void)
 | |
| {
 | |
|     DMXConfigSubPtr pt;
 | |
|     Display         *dpy     = XtDisplay(canvas);
 | |
|     Window          win      = XtWindow(canvas);
 | |
|     GContext        gcontext = XGContextFromGC(dmxConfigGC);
 | |
|     XFontStruct     *fs;
 | |
|     int             w, h;
 | |
| 
 | |
|     XFillRectangle(dpy, win, dmxConfigGCRev,
 | |
|                    0, 0, dmxConfigWidgetWidth, dmxConfigWidgetHeight);
 | |
|     dmxConfigDataUpdate();
 | |
|     if (!dmxConfigCurrent) return;
 | |
| 
 | |
|     w = scalex(dmxConfigWallWidth);
 | |
|     h = scaley(dmxConfigWallHeight);
 | |
|     if (w > dmxConfigWidgetWidth - 1)  w = dmxConfigWidgetWidth - 1;
 | |
|     if (h > dmxConfigWidgetHeight - 1) h = dmxConfigWidgetHeight - 1;
 | |
|     XDrawRectangle(dpy, win, dmxConfigGC, 0, 0, w, h);
 | |
|     fs = XQueryFont(dpy, gcontext);
 | |
|     for (pt = dmxConfigCurrent->subentry; pt; pt = pt->next) {
 | |
|         int x, y, len;
 | |
|         int xo = 3, yo = fs->ascent + fs->descent + 2;
 | |
|         GC  gc;
 | |
| 
 | |
|         if (pt->type != dmxConfigDisplay) continue;
 | |
|         gc  = (pt->display == dmxConfigCurrentDisplay
 | |
|                ? dmxConfigGCHL
 | |
|                : dmxConfigGC);
 | |
|         x   = scalex(pt->display->rootXOrigin);
 | |
|         y   = scaley(pt->display->rootYOrigin);
 | |
|         w   = scalex(pt->display->scrnWidth);
 | |
|         h   = scaley(pt->display->scrnHeight);
 | |
|         len = pt->display->name ? strlen(pt->display->name) : 0;
 | |
|         if (x > dmxConfigWidgetWidth - 1)  x = dmxConfigWidgetWidth - 1;
 | |
|         if (y > dmxConfigWidgetHeight - 1) y = dmxConfigWidgetHeight - 1;
 | |
|         XDrawRectangle(dpy, win, gc, x, y, w, h);
 | |
|         if (fs && len) {
 | |
|             while (len && XTextWidth(fs, pt->display->name, len) >= w - 2 * xo)
 | |
|                 --len;
 | |
|             if (len)
 | |
|                 XDrawString(dpy, win, gc, x+xo, y+yo, pt->display->name, len);
 | |
|         }
 | |
|     }
 | |
|     if (fs) XFreeFontInfo(NULL, fs, 0);
 | |
| }
 | |
| 
 | |
| static void dmxConfigCanvasDraw(Region region)
 | |
| {
 | |
|     Display *dpy = XtDisplay(canvas);
 | |
|     int     maxWidth, maxHeight;
 | |
|     
 | |
|     dmxConfigCanvasGCs();
 | |
|     if (region) {
 | |
|         XSetRegion(dpy, dmxConfigGC,    region);
 | |
|         XSetRegion(dpy, dmxConfigGCRev, region);
 | |
|         XSetRegion(dpy, dmxConfigGCHL,  region);
 | |
|     }
 | |
|     XtVaGetValues(canvas,
 | |
|                   XtNwidth, &dmxConfigWidgetWidth,
 | |
|                   XtNheight, &dmxConfigWidgetHeight,
 | |
|                   NULL);
 | |
|     dmxConfigGetDims(&maxWidth, &maxHeight);
 | |
|     dmxConfigScaleX = (double)dmxConfigWidgetWidth  / maxWidth;
 | |
|     dmxConfigScaleY = (double)dmxConfigWidgetHeight / maxHeight;
 | |
|     if (dmxConfigScaleX > dmxConfigScaleY) dmxConfigScaleX = dmxConfigScaleY;
 | |
|     if (dmxConfigScaleY > dmxConfigScaleX) dmxConfigScaleY = dmxConfigScaleX;
 | |
|     dmxConfigCanvasUpdate();
 | |
|     if (region) {
 | |
|         XSetClipMask(dpy, dmxConfigGC,    None);
 | |
|         XSetClipMask(dpy, dmxConfigGCRev, None);
 | |
|         XSetClipMask(dpy, dmxConfigGCHL,  None);
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void dmxConfigSelectCallback(Widget w, XtPointer closure,
 | |
|                                     XtPointer callData)
 | |
| {
 | |
|     dmxConfigCurrent = closure;
 | |
|     dmxConfigVirtualPrint(stdout, dmxConfigCurrent);
 | |
|     dmxConfigCanvasDraw(NULL);
 | |
| }
 | |
| 
 | |
| static void dmxConfigCopystrings(void)
 | |
| {
 | |
|     DMXConfigEntryPtr pt;
 | |
|     DMXConfigSubPtr   sub;
 | |
| 
 | |
|     if (!dmxConfigCurrent) return;
 | |
| 
 | |
|                                 /* FIXME: this is all a per-config file
 | |
|                                  * memory leak */
 | |
|     for (pt = dmxConfigEntry; pt; pt = pt->next) {
 | |
|         if (pt->type == dmxConfigVirtual) {
 | |
|             pt->virtual->name = XtNewString(pt->virtual->name
 | |
|                                             ? pt->virtual->name
 | |
|                                             : "");
 | |
| 
 | |
|             for (sub = pt->virtual->subentry; sub; sub = sub->next) {
 | |
|                 if (sub->type != dmxConfigDisplay) continue;
 | |
|                 sub->display->name = XtNewString(sub->display->name
 | |
|                                                  ? sub->display->name
 | |
|                                                  : "");
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void dmxConfigGetValueString(char **d, Widget w)
 | |
| {
 | |
|     const char *tmp = XawDialogGetValueString(w);
 | |
|     if (*d) XtFree(*d);
 | |
|     *d = XtNewString(tmp);
 | |
| }
 | |
| 
 | |
| static void dmxConfigSetupCnamemenu(void)
 | |
| {
 | |
|     static Widget     cnamemenu = NULL;
 | |
|     Widget            w;
 | |
|     DMXConfigEntryPtr pt;
 | |
| 
 | |
|     if (cnamemenu) XtDestroyWidget(cnamemenu);
 | |
|     cnamemenu = NULL;
 | |
| 
 | |
|     if (!dmxConfigCurrent) return;
 | |
|     cnamemenu = XtVaCreatePopupShell("cnamemenu", simpleMenuWidgetClass,
 | |
|                                      cnamebox,
 | |
|                                      NULL);
 | |
|     
 | |
|     for (pt = dmxConfigEntry; pt; pt = pt->next) {
 | |
|         if (pt->type == dmxConfigVirtual) {
 | |
|             w = XtVaCreateManagedWidget(pt->virtual->name
 | |
|                                         ? pt->virtual->name
 | |
|                                         : "",
 | |
|                                         smeBSBObjectClass, cnamemenu,
 | |
|                                         NULL);
 | |
|             XtAddCallback(w, XtNcallback,
 | |
|                           dmxConfigSelectCallback, pt->virtual);
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void dmxConfigReadFile(void)
 | |
| {
 | |
|     FILE              *str;
 | |
|     DMXConfigEntryPtr pt;
 | |
| 
 | |
|     if (!(str = fopen(dmxConfigFilename, "r"))) {
 | |
|         dmxLog(dmxWarning, "Unable to read configuration file %s\n",
 | |
|                dmxConfigFilename);
 | |
|         return;
 | |
|     }
 | |
|     yyin    = str;
 | |
|     yydebug = 0;
 | |
|     yyparse();
 | |
|     fclose(str);
 | |
|     dmxLog(dmxInfo, "Read configuration file %s\n", dmxConfigFilename);
 | |
| 
 | |
|     for (pt = dmxConfigEntry; pt; pt = pt->next) {
 | |
|         if (pt->type == dmxConfigVirtual) {
 | |
|             dmxConfigCurrent = pt->virtual;
 | |
|             break;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     
 | |
|     
 | |
|     if (XtIsRealized(canvas)) {
 | |
|         dmxConfigCopystrings();
 | |
|         dmxConfigSetupCnamemenu();
 | |
|         dmxConfigCanvasDraw(NULL);
 | |
|     }
 | |
|     dmxConfigVirtualPrint(stdout, dmxConfigCurrent);
 | |
| }
 | |
| 
 | |
| static void dmxConfigWriteFile(void)
 | |
| {
 | |
|     FILE              *str;
 | |
| 
 | |
|     if (!(str = fopen(dmxConfigFilename, "w"))) {
 | |
|         dmxLog(dmxWarning, "Unable to write configuration file %s\n",
 | |
|                dmxConfigFilename);
 | |
|         return;
 | |
|     }
 | |
|     dmxConfigPrint(str, dmxConfigEntry);
 | |
|     fclose(str);
 | |
| }
 | |
| 
 | |
| static DMXConfigDisplayPtr dmxConfigFindDisplay(int x, int y)
 | |
| {
 | |
|     DMXConfigSubPtr pt;
 | |
| 
 | |
|     if (!dmxConfigCurrent) return NULL;
 | |
|     for (pt = dmxConfigCurrent->subentry; pt; pt = pt->next) {
 | |
|         DMXConfigDisplayPtr d = pt->display;
 | |
|         if (pt->type != dmxConfigDisplay) continue;
 | |
|         if (x >= scalex(d->rootXOrigin)
 | |
|             && x <= scalex(d->rootXOrigin + d->scrnWidth)
 | |
|             && y >= scaley(d->rootYOrigin)
 | |
|             && y <= scaley(d->rootYOrigin + d->scrnHeight)) return d;
 | |
|     }
 | |
|     return NULL;
 | |
| }
 | |
| 
 | |
| static void dmxConfigSetPopupPosition(Widget popup)
 | |
| {
 | |
|     Position     x, y;
 | |
|     Window       t1, t2;
 | |
|     int          root_x, root_y;
 | |
|     int          temp_x, temp_y;
 | |
|     unsigned int temp;
 | |
| 
 | |
| 
 | |
|     XtRealizeWidget(popup);
 | |
|     if (!XQueryPointer(XtDisplay(popup), XtWindow(popup), &t1, &t2,
 | |
|                        &root_x, &root_y, &temp_x, &temp_y, &temp))
 | |
|         root_x = root_y = 0;
 | |
| 
 | |
|     x = root_x - 5;
 | |
|     y = root_y - 5;
 | |
|     XtVaSetValues(popup, XtNx, x, XtNy, y, NULL);
 | |
| }
 | |
| 
 | |
| static void dmxConfigPlaceMenu(Widget w, XEvent *event,
 | |
|                                String *params, Cardinal *num_params)
 | |
| {
 | |
|     dmxConfigSetPopupPosition(buttonpopup);
 | |
| }
 | |
| 
 | |
| static void dmxConfigMove(int deltaX, int deltaY)
 | |
| {
 | |
|     dmxConfigCurrentDisplay->rootXOrigin += deltaX;
 | |
|     dmxConfigCurrentDisplay->rootYOrigin += deltaY;
 | |
|     if (dmxConfigCurrentDisplay->rootXOrigin < 0)
 | |
|         dmxConfigCurrentDisplay->rootXOrigin = 0;
 | |
|     if (dmxConfigCurrentDisplay->rootYOrigin < 0)
 | |
|         dmxConfigCurrentDisplay->rootYOrigin = 0;
 | |
|     if (dmxConfigWallWidth && dmxConfigWallHeight) {
 | |
|         if (dmxConfigCurrentDisplay->rootXOrigin >= dmxConfigWallWidth)
 | |
|             dmxConfigCurrentDisplay->rootXOrigin = dmxConfigWallWidth - 1;
 | |
|         if (dmxConfigCurrentDisplay->rootYOrigin >= dmxConfigWallHeight)
 | |
|             dmxConfigCurrentDisplay->rootYOrigin = dmxConfigWallHeight - 1;
 | |
|     }
 | |
|     dmxConfigCanvasUpdate();
 | |
|     dmxConfigNotSaved = 1;
 | |
| }
 | |
| 
 | |
| static void dmxConfigCanvasInput(Widget w, XtPointer closure,
 | |
|                                  XtPointer callData)
 | |
| {
 | |
|     XEvent              *e      = (XEvent *)callData;
 | |
|     DMXConfigDisplayPtr display = NULL;
 | |
| 
 | |
|     switch (e->type) {
 | |
|     case ButtonPress:
 | |
|         if (e->xbutton.button == Button1) {
 | |
|             dmxConfigGrabbed     = 1;
 | |
|             dmxConfigGrabbedFine = 0;
 | |
|             dmxConfigGrabbedX    = e->xbutton.x;
 | |
|             dmxConfigGrabbedY    = e->xbutton.y;
 | |
|         }
 | |
|         if (e->xbutton.button == Button2) {
 | |
|             dmxConfigGrabbed     = 1;
 | |
|             dmxConfigGrabbedFine = 1;
 | |
|             dmxConfigGrabbedX    = e->xbutton.x;
 | |
|             dmxConfigGrabbedY    = e->xbutton.y;
 | |
|         }
 | |
|         break;
 | |
|     case ButtonRelease:
 | |
|         if (e->xbutton.button == Button1) dmxConfigGrabbed = 0;
 | |
|         if (e->xbutton.button == Button2) dmxConfigGrabbed = 0;
 | |
|         break;
 | |
|     case MotionNotify:
 | |
|         if (dmxConfigGrabbed && dmxConfigCurrentDisplay) {
 | |
|             int deltaX = e->xmotion.x - dmxConfigGrabbedX;
 | |
|             int deltaY = e->xmotion.y - dmxConfigGrabbedY;
 | |
|             dmxConfigMove(dmxConfigGrabbedFine ? deltaX : unscalex(deltaX),
 | |
|                           dmxConfigGrabbedFine ? deltaY : unscaley(deltaY));
 | |
|             dmxConfigGrabbedX = e->xmotion.x;
 | |
|             dmxConfigGrabbedY = e->xmotion.y;
 | |
|         } else {
 | |
|             display = dmxConfigFindDisplay(e->xmotion.x, e->xmotion.y);
 | |
|             if (display != dmxConfigCurrentDisplay) {
 | |
|                 dmxConfigCurrentDisplay = display;
 | |
|                 dmxConfigCanvasUpdate();
 | |
|             }
 | |
|         }
 | |
|         break;
 | |
|     case KeyPress:
 | |
|         switch (XLookupKeysym(&e->xkey, 0)) {
 | |
|         case XK_Right: dmxConfigMove(1,0);  break;
 | |
|         case XK_Left:  dmxConfigMove(-1,0); break;
 | |
|         case XK_Down:  dmxConfigMove(0,1);  break;
 | |
|         case XK_Up:    dmxConfigMove(0,-1); break;
 | |
|         }
 | |
|         break;
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void dmxConfigCanvasResize(Widget w, XtPointer closure,
 | |
|                                   XtPointer callData)
 | |
| {
 | |
|     dmxConfigCanvasDraw(NULL);
 | |
| }
 | |
| 
 | |
| static void dmxConfigCanvasExpose(Widget w, XtPointer closure,
 | |
|                                   XtPointer callData)
 | |
| {
 | |
|     CanvasExposeDataPtr data = (CanvasExposeDataPtr)callData;
 | |
| 
 | |
|     dmxConfigCanvasDraw(data->region);
 | |
| }
 | |
| 
 | |
| static void dmxConfigOpenCallback(Widget w, XtPointer closure,
 | |
|                                   XtPointer callData)
 | |
| {
 | |
|     dmxConfigState = dmxConfigStateOpen;
 | |
|     XtVaSetValues(okbutton, XtNlabel, "Open", NULL);
 | |
|     dmxConfigSetPopupPosition(openpopup);
 | |
|     XtPopup(openpopup, XtGrabExclusive);
 | |
| }
 | |
| 
 | |
| static void dmxConfigSaveCallback(Widget w, XtPointer closure,
 | |
|                                   XtPointer callData)
 | |
| {
 | |
|     dmxConfigState = dmxConfigStateSave;
 | |
|     XtVaSetValues(okbutton, XtNlabel, "Save", NULL);
 | |
|     dmxConfigSetPopupPosition(openpopup);
 | |
|     XtPopup(openpopup, XtGrabExclusive);
 | |
| }
 | |
| 
 | |
| static void dmxConfigOkCallback(Widget w, XtPointer closure,
 | |
|                                 XtPointer callData)
 | |
| {
 | |
|     dmxConfigGetValueString(&dmxConfigFilename, opendialog);
 | |
|     XtPopdown(openpopup);
 | |
|     if (dmxConfigState == dmxConfigStateOpen) dmxConfigReadFile();
 | |
|     else                                      dmxConfigWriteFile();
 | |
|     dmxConfigNotSaved = 0;
 | |
| }
 | |
| 
 | |
| static void dmxConfigCanCallback(Widget w, XtPointer closure,
 | |
|                                  XtPointer callData)
 | |
| {
 | |
|     XtPopdown(openpopup);
 | |
| }
 | |
| 
 | |
| static void dmxConfigECCallback(Widget w, XtPointer closure,
 | |
|                                 XtPointer callData)
 | |
| {
 | |
|     char buf[256];              /* RATS: Only used in XmuSnprintf */
 | |
|     
 | |
|     if (!dmxConfigCurrent) return;
 | |
|     dmxConfigSetPopupPosition(ecpopup);
 | |
|     XtVaSetValues(ecdialog0, XtNvalue,
 | |
|                   dmxConfigCurrent->name ? dmxConfigCurrent->name : "",
 | |
|                   NULL);
 | |
|     XmuSnprintf(buf, sizeof(buf), "%dx%d",
 | |
|                 dmxConfigCurrent->width, dmxConfigCurrent->height);
 | |
|     XtVaSetValues(ecdialog1, XtNvalue, buf, NULL);
 | |
|     XtPopup(ecpopup, XtGrabExclusive);
 | |
| }
 | |
| 
 | |
| static void dmxConfigNCCallback(Widget w, XtPointer closure,
 | |
|                                 XtPointer callData)
 | |
| {
 | |
|     int width = 1280*2, height = 1024*2;
 | |
| 
 | |
|     if (dmxConfigCurrent) {
 | |
|         width  = dmxConfigCurrent->width;
 | |
|         height = dmxConfigCurrent->height;
 | |
|     }
 | |
| 
 | |
|     dmxConfigCurrent         = dmxConfigCreateVirtual(NULL, NULL, NULL,
 | |
|                                                       NULL, NULL, NULL);
 | |
|     dmxConfigNewVirtual      = dmxConfigCurrent;
 | |
|     dmxConfigCurrent->width  = width;
 | |
|     dmxConfigCurrent->height = height;
 | |
|     dmxConfigEntry = dmxConfigAddEntry(dmxConfigEntry, dmxConfigVirtual, NULL,
 | |
|                                        dmxConfigCurrent);
 | |
|     dmxConfigECCallback(w, closure, callData);
 | |
| }
 | |
| 
 | |
| static void dmxConfigDCCallback(Widget w, XtPointer closure,
 | |
|                                 XtPointer callData)
 | |
| {
 | |
|     DMXConfigEntryPtr pt;
 | |
| 
 | |
|     if (!dmxConfigEntry) return;
 | |
|     if (dmxConfigEntry
 | |
|         && dmxConfigEntry->type == dmxConfigVirtual
 | |
|         && dmxConfigEntry->virtual == dmxConfigCurrent) {
 | |
|         dmxConfigEntry = dmxConfigEntry->next;
 | |
|     } else {
 | |
|         for (pt = dmxConfigEntry; pt && pt->next; pt = pt->next)
 | |
|             if (pt->next->type == dmxConfigVirtual
 | |
|                 && pt->next->virtual == dmxConfigCurrent) {
 | |
|                 pt->next = pt->next->next;
 | |
|                 break;
 | |
|             }
 | |
|     }
 | |
|     dmxConfigFreeVirtual(dmxConfigCurrent);
 | |
|     dmxConfigCurrent        = NULL;
 | |
|     dmxConfigCurrentDisplay = NULL;
 | |
| 
 | |
|                                 /* Make the first entry current */
 | |
|     for (pt = dmxConfigEntry; pt; pt = pt->next) {
 | |
|         if (pt->type == dmxConfigVirtual) {
 | |
|             dmxConfigCurrent = pt->virtual;
 | |
|             break;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     dmxConfigSetupCnamemenu();
 | |
|     dmxConfigCanvasDraw(NULL);
 | |
| }
 | |
| 
 | |
| static void dmxConfigECOkCallback(Widget w, XtPointer closure,
 | |
|                                   XtPointer callData)
 | |
| {
 | |
|     const char *value;
 | |
|     char       *endpt;
 | |
| 
 | |
|     dmxConfigGetValueString((char **)&dmxConfigCurrent->name, ecdialog0);
 | |
|     value                    = XawDialogGetValueString(ecdialog1);
 | |
|     dmxConfigCurrent->width  = strtol(value, &endpt, 10);
 | |
|     dmxConfigCurrent->height = strtol(endpt+1, NULL, 10);
 | |
|     XtPopdown(ecpopup);
 | |
|     dmxConfigCurrentDisplay = NULL;
 | |
|     dmxConfigNewVirtual     = NULL;
 | |
|     dmxConfigSetupCnamemenu();
 | |
|     dmxConfigCanvasDraw(NULL);
 | |
|     dmxConfigNotSaved = 1;
 | |
| }
 | |
| 
 | |
| static void dmxConfigECCanCallback(Widget w, XtPointer closure,
 | |
|                                    XtPointer callData)
 | |
| {
 | |
|     if (dmxConfigNewVirtual) dmxConfigDCCallback(w, closure, callData);
 | |
|     dmxConfigNewVirtual     = NULL;
 | |
|     XtPopdown(ecpopup);
 | |
| }
 | |
| 
 | |
| static void dmxConfigEDCallback(Widget w, XtPointer closure,
 | |
|                                 XtPointer callData)
 | |
| {
 | |
|     char buf[256];              /* RATS: Only used in XmuSnprintf */
 | |
|     
 | |
|     if (!dmxConfigCurrent || !dmxConfigCurrentDisplay) return;
 | |
|     dmxConfigSetPopupPosition(edpopup);
 | |
|     XtVaSetValues(eddialog0, XtNvalue,
 | |
|                   dmxConfigCurrentDisplay->name
 | |
|                   ? dmxConfigCurrentDisplay->name
 | |
|                   : "",
 | |
|                   NULL);
 | |
|     XmuSnprintf(buf, sizeof(buf), "%dx%d%c%d%c%d",
 | |
|                 dmxConfigCurrentDisplay->scrnWidth,
 | |
|                 dmxConfigCurrentDisplay->scrnHeight,
 | |
|                 dmxConfigCurrentDisplay->scrnXSign < 0 ? '-' : '+',
 | |
|                 dmxConfigCurrentDisplay->scrnY,
 | |
|                 dmxConfigCurrentDisplay->scrnYSign < 0 ? '-' : '+',
 | |
|                 dmxConfigCurrentDisplay->scrnY);
 | |
|     XtVaSetValues(eddialog1, XtNvalue, buf, NULL);
 | |
|     XmuSnprintf(buf, sizeof(buf), "@%dx%d",
 | |
|                 dmxConfigCurrentDisplay->rootXOrigin,
 | |
|                 dmxConfigCurrentDisplay->rootYOrigin);
 | |
|     XtVaSetValues(eddialog2, XtNvalue, buf, NULL);
 | |
|     XtPopup(edpopup, XtGrabExclusive);
 | |
| }
 | |
| 
 | |
| static void dmxConfigNDCallback(Widget w, XtPointer closure,
 | |
|                                 XtPointer callData)
 | |
| {
 | |
|     int width = 1280, height = 1024;
 | |
| 
 | |
|     if (!dmxConfigCurrent) return;
 | |
|     if (dmxConfigCurrentDisplay) {
 | |
|         width  = dmxConfigCurrentDisplay->scrnWidth;
 | |
|         height = dmxConfigCurrentDisplay->scrnHeight;
 | |
|     }
 | |
|     dmxConfigCurrentDisplay = dmxConfigCreateDisplay(NULL, NULL, NULL,
 | |
|                                                      NULL, NULL);
 | |
|     dmxConfigNewDisplay     = dmxConfigCurrentDisplay;
 | |
|     dmxConfigCurrentDisplay->scrnWidth  = width;
 | |
|     dmxConfigCurrentDisplay->scrnHeight = height;
 | |
|     
 | |
|     dmxConfigCurrent->subentry
 | |
|         = dmxConfigAddSub(dmxConfigCurrent->subentry,
 | |
|                           dmxConfigSubDisplay(dmxConfigCurrentDisplay));
 | |
|     dmxConfigEDCallback(w, closure, callData);
 | |
| }
 | |
| 
 | |
| static void dmxConfigDDCallback(Widget w, XtPointer closure,
 | |
|                                 XtPointer callData)
 | |
| {
 | |
|     DMXConfigSubPtr pt;
 | |
| 
 | |
|     if (!dmxConfigCurrent || !dmxConfigCurrentDisplay) return;
 | |
|                                 /* First */
 | |
|     if (dmxConfigCurrent->subentry
 | |
|         && dmxConfigCurrent->subentry->type == dmxConfigDisplay
 | |
|         && dmxConfigCurrent->subentry->display == dmxConfigCurrentDisplay) {
 | |
|         dmxConfigCurrent->subentry = dmxConfigCurrent->subentry->next;
 | |
|     } else {
 | |
|         for (pt = dmxConfigCurrent->subentry; pt && pt->next; pt = pt->next)
 | |
|             if (pt->next->type == dmxConfigDisplay
 | |
|                 && pt->next->display == dmxConfigCurrentDisplay) {
 | |
|                 pt->next = pt->next->next;
 | |
|                 break;
 | |
|             }
 | |
|     }
 | |
|     dmxConfigFreeDisplay(dmxConfigCurrentDisplay);
 | |
|     dmxConfigCurrentDisplay = NULL;
 | |
|     dmxConfigSetupCnamemenu();
 | |
|     dmxConfigCanvasDraw(NULL);
 | |
| }
 | |
| 
 | |
| static void dmxConfigAboutCallback(Widget w, XtPointer closure,
 | |
|                                    XtPointer callData)
 | |
| {
 | |
|     dmxConfigSetPopupPosition(aboutpopup);
 | |
|     XtPopup(aboutpopup, XtGrabExclusive);
 | |
| }
 | |
| 
 | |
| static void dmxConfigAboutOkCallback(Widget w, XtPointer closure,
 | |
|                                      XtPointer CallData)
 | |
| {
 | |
|     XtPopdown(aboutpopup);
 | |
| }
 | |
| 
 | |
| static void dmxConfigQuitCallback(Widget w, XtPointer closure,
 | |
|                                   XtPointer callData)
 | |
| {
 | |
|     if (dmxConfigNotSaved) {
 | |
|         dmxConfigSetPopupPosition(quitpopup);
 | |
|         XtPopup(quitpopup, XtGrabExclusive);
 | |
|         return;
 | |
|     }
 | |
|     exit(0);
 | |
| }
 | |
| 
 | |
| static void dmxConfigQuitOkCallback(Widget w, XtPointer closure,
 | |
|                                     XtPointer callData)
 | |
| {
 | |
|     XtPopdown(quitpopup);
 | |
|     exit(0);
 | |
| }
 | |
| 
 | |
| static void dmxConfigQuitCanCallback(Widget w, XtPointer closure,
 | |
|                                      XtPointer callData)
 | |
| {
 | |
|     XtPopdown(quitpopup);
 | |
| }
 | |
| 
 | |
| static void dmxConfigEDOkCallback(Widget w, XtPointer closure,
 | |
|                                   XtPointer callData)
 | |
| {
 | |
|     char *value;
 | |
|     char *endpt;
 | |
|     
 | |
|     dmxConfigNewDisplay = NULL;
 | |
|     dmxConfigGetValueString((char **)&dmxConfigCurrentDisplay->name,
 | |
|                             eddialog0);
 | |
|     value                           = XawDialogGetValueString(eddialog1);
 | |
|     if (*value == '-' || *value == '+') {
 | |
|         dmxConfigCurrentDisplay->scrnWidth  = 0;
 | |
|         dmxConfigCurrentDisplay->scrnHeight = 0;
 | |
|         endpt                               = value;
 | |
|     } else {
 | |
|         dmxConfigCurrentDisplay->scrnWidth  = strtol(value, &endpt, 10);
 | |
|         dmxConfigCurrentDisplay->scrnHeight = strtol(endpt+1, &endpt, 10);
 | |
|     }
 | |
|     if (*endpt) {
 | |
|         dmxConfigCurrentDisplay->scrnXSign  = (*endpt == '-') ? -1 : 1;
 | |
|         dmxConfigCurrentDisplay->scrnX      = strtol(endpt+1, &endpt, 10);
 | |
|         dmxConfigCurrentDisplay->scrnYSign  = (*endpt == '-') ? -1 : 1;
 | |
|         dmxConfigCurrentDisplay->scrnY      = strtol(endpt+1, NULL, 10);
 | |
|     }
 | |
|     if (dmxConfigCurrentDisplay->scrnX < 0)
 | |
|         dmxConfigCurrentDisplay->scrnX = -dmxConfigCurrentDisplay->scrnX;
 | |
|     if (dmxConfigCurrentDisplay->scrnY < 0)
 | |
|         dmxConfigCurrentDisplay->scrnY = -dmxConfigCurrentDisplay->scrnY;
 | |
|     value                                 = XawDialogGetValueString(eddialog2);
 | |
|     dmxConfigCurrentDisplay->rootXOrigin  = strtol(value+1, &endpt, 10);
 | |
|     dmxConfigCurrentDisplay->rootYOrigin  = strtol(endpt+1, NULL, 10);
 | |
|     XtPopdown(edpopup);
 | |
|     dmxConfigSetupCnamemenu();
 | |
|     dmxConfigCanvasDraw(NULL);
 | |
|     dmxConfigNotSaved = 1;
 | |
| }
 | |
| 
 | |
| static void dmxConfigEDCanCallback(Widget w, XtPointer closure,
 | |
|                                    XtPointer callData)
 | |
| {
 | |
|     if (dmxConfigNewDisplay) dmxConfigDDCallback(w, closure, callData);
 | |
|     dmxConfigNewDisplay = NULL;
 | |
|     XtPopdown(edpopup);
 | |
| }
 | |
| 
 | |
| static void dmxConfigOkAction(Widget w, XEvent *event,
 | |
|                               String *params, Cardinal *num_params)
 | |
| {
 | |
|     Widget p = XtParent(w);
 | |
|     Widget t;
 | |
| 
 | |
|     if (p == opendialog) dmxConfigOkCallback(w, NULL, NULL);
 | |
| 
 | |
|     if (p == ecdialog0) {
 | |
|         t = XtNameToWidget(ecdialog1, "value");
 | |
|         XWarpPointer(XtDisplay(t), None, XtWindow(t), 0, 0, 0, 0, 0, 10);
 | |
|     }
 | |
|     if (p == ecdialog1) dmxConfigECOkCallback(w, NULL, NULL);
 | |
| 
 | |
|     if (p == eddialog0) {
 | |
|         t = XtNameToWidget(eddialog1, "value");
 | |
|         XWarpPointer(XtDisplay(t), None, XtWindow(t), 0, 0, 0, 0, 0, 10);
 | |
|     }
 | |
|     if (p == eddialog1) {
 | |
|         t = XtNameToWidget(eddialog2, "value");
 | |
|         XWarpPointer(XtDisplay(t), None, XtWindow(t), 0, 0, 0, 0, 0, 10);
 | |
|     }
 | |
|     if (p == eddialog2) dmxConfigEDOkCallback(w, NULL, NULL);
 | |
| }
 | |
| 
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|     XtAppContext   appContext;
 | |
|     Widget         toplevel;
 | |
|     Widget         parent, menubox, bottombox, databox, canvasbox;
 | |
|     Widget         filebutton, helpbutton;
 | |
|     Widget         filemenu, openbutton, savebutton, quitbutton;
 | |
|     Widget         helpmenu, aboutbutton, aboutbox, abouttext, aboutok;
 | |
|     Widget         quitbox, quittext, quitok, quitcan;
 | |
|     Widget         ncbutton;
 | |
|     Widget         canbutton;
 | |
|     Widget         ecbox, ecokbutton, eccanbutton;
 | |
|     Widget         edbox, edokbutton;
 | |
|     Widget         edcanbutton;
 | |
|                                 /* FIXME: add meta-i, ctrl,meta-z,v? */
 | |
|     const char     *opentrans = "<Key>Return: openOk()\n\
 | |
|                                  <Key>Linefeed: openOk()\n\
 | |
|                                  Ctrl<Key>M: openOk()\n\
 | |
|                                  Ctrl<Key>J: openOk()\n\
 | |
|                                  Ctrl<Key>O: noop()\n\
 | |
|                                  Ctrl<Key>N: noop()\n\
 | |
|                                  Ctrl<Key>P: noop()";
 | |
|     const char     *canvastrans =
 | |
|         "<Btn3Down>: placeMenu() XtMenuPopup(buttonpopup)";
 | |
|     XtActionsRec   actiontable[] = {
 | |
|         { "openOk",        dmxConfigOkAction },
 | |
|         { "placeMenu",     dmxConfigPlaceMenu },
 | |
|         { "noop",          NULL }
 | |
|     };
 | |
| 
 | |
|     dmxConfigFilename = XtNewString((argc >= 2) ? argv[1] : "");
 | |
| 
 | |
|     toplevel    = XtVaAppInitialize(&appContext, "XDmxconfig",
 | |
|                                     NULL, 0,
 | |
|                                     &argc, argv,
 | |
|                                     NULL,
 | |
|                                     NULL);
 | |
| 
 | |
|                                 /* Main boxes */
 | |
|     parent      = XtVaCreateManagedWidget("parent", formWidgetClass, toplevel,
 | |
|                                           XtNorientation, XtorientVertical,
 | |
|                                           XtNwidth, DMX_MAIN_WIDTH,
 | |
|                                           XtNheight, DMX_MAIN_HEIGHT,
 | |
|                                           NULL);
 | |
|     menubox     = XtVaCreateManagedWidget("menubox", boxWidgetClass, parent,
 | |
|                                           XtNborderWidth, 0,
 | |
|                                           XtNorientation, XtorientHorizontal,
 | |
|                                           XtNtop, XtChainTop,
 | |
|                                           NULL);
 | |
|     bottombox   = XtVaCreateManagedWidget("bottombox", formWidgetClass, parent,
 | |
|                                           XtNborderWidth, 0,
 | |
|                                           XtNfromVert, menubox,
 | |
|                                           XtNorientation, XtorientHorizontal,
 | |
|                                           NULL);
 | |
|     databox     = XtVaCreateManagedWidget("databox", formWidgetClass,
 | |
|                                           bottombox,
 | |
|                                           XtNborderWidth, 0,
 | |
|                                           XtNhorizDistance, 0,
 | |
|                                           XtNwidth, DMX_DATA_WIDTH,
 | |
|                                           XtNheight, DMX_DATA_HEIGHT,
 | |
|                                           XtNleft, XtChainLeft,
 | |
|                                           XtNorientation, XtorientVertical,
 | |
|                                           NULL);
 | |
| 
 | |
|                                 /* Data */
 | |
|     cnamebox    = XtVaCreateManagedWidget("cnamebox", menuButtonWidgetClass,
 | |
|                                           databox,
 | |
|                                           XtNtop, XtChainTop,
 | |
|                                           XtNjustify, XtJustifyLeft,
 | |
|                                           XtNwidth, DMX_DATA_WIDTH,
 | |
|                                           XtNlabel, "",
 | |
|                                           XtNmenuName, "cnamemenu",
 | |
|                                           NULL);
 | |
|     cdimbox     = XtVaCreateManagedWidget("cdimbox", labelWidgetClass,
 | |
|                                           databox,
 | |
|                                           XtNfromVert, cnamebox,
 | |
|                                           XtNjustify, XtJustifyLeft,
 | |
|                                           XtNwidth, DMX_DATA_WIDTH,
 | |
|                                           XtNlabel, "",
 | |
|                                           NULL);
 | |
|     namebox     = XtVaCreateManagedWidget("namebox", labelWidgetClass, databox,
 | |
|                                           XtNfromVert, cdimbox,
 | |
|                                           XtNjustify, XtJustifyLeft,
 | |
|                                           XtNwidth, DMX_DATA_WIDTH,
 | |
|                                           XtNlabel, "",
 | |
|                                           NULL);
 | |
|     dimbox      = XtVaCreateManagedWidget("dimbox", labelWidgetClass,
 | |
|                                           databox,
 | |
|                                           XtNfromVert, namebox,
 | |
|                                           XtNjustify, XtJustifyLeft,
 | |
|                                           XtNwidth, DMX_DATA_WIDTH,
 | |
|                                           XtNlabel, "",
 | |
|                                           NULL);
 | |
|     rtbox       = XtVaCreateManagedWidget("rtbox", labelWidgetClass,
 | |
|                                           databox,
 | |
|                                           XtNfromVert, dimbox,
 | |
|                                           XtNjustify, XtJustifyLeft,
 | |
|                                           XtNwidth, DMX_DATA_WIDTH,
 | |
|                                           XtNlabel, "",
 | |
|                                           NULL);
 | |
|     origbox     = XtVaCreateManagedWidget("origbox", labelWidgetClass,
 | |
|                                           databox,
 | |
|                                           XtNfromVert, rtbox,
 | |
|                                           XtNjustify, XtJustifyLeft,
 | |
|                                           XtNwidth, DMX_DATA_WIDTH,
 | |
|                                           XtNlabel, "",
 | |
|                                           NULL);
 | |
| 
 | |
|                                 /* Canvas */
 | |
|     canvasbox   = XtVaCreateManagedWidget("canvasbox", boxWidgetClass,
 | |
|                                           bottombox,
 | |
|                                           XtNborderWidth, 0,
 | |
|                                           XtNwidth, DMX_CANVAS_WIDTH,
 | |
|                                           XtNheight, DMX_CANVAS_HEIGHT,
 | |
|                                           XtNfromHoriz, databox,
 | |
|                                           NULL);
 | |
| 
 | |
|     canvas      = XtVaCreateManagedWidget("canvas", canvasWidgetClass,
 | |
|                                           canvasbox,
 | |
|                                           XtNwidth, DMX_CANVAS_WIDTH,
 | |
|                                           XtNheight, DMX_CANVAS_HEIGHT,
 | |
|                                           NULL);
 | |
| 
 | |
|     
 | |
|                                 /* Main menu buttons */
 | |
|     filebutton  = XtVaCreateManagedWidget("File", menuButtonWidgetClass,
 | |
|                                           menubox,
 | |
|                                           XtNmenuName, "filemenu",
 | |
|                                           NULL);
 | |
|     helpbutton  = XtVaCreateManagedWidget("Help", menuButtonWidgetClass,
 | |
|                                           menubox,
 | |
|                                           XtNmenuName, "helpmenu",
 | |
|                                           NULL);
 | |
| 
 | |
|     
 | |
|                                 /* File submenu buttons */
 | |
|     filemenu     = XtVaCreatePopupShell("filemenu", simpleMenuWidgetClass,
 | |
|                                         filebutton, NULL);
 | |
|     openbutton   = XtVaCreateManagedWidget("Open File", smeBSBObjectClass,
 | |
|                                            filemenu, NULL);
 | |
|     savebutton   = XtVaCreateManagedWidget("Save File", smeBSBObjectClass,
 | |
|                                            filemenu,
 | |
|                                            NULL);
 | |
|     ncbutton     = XtVaCreateManagedWidget("New Global", smeBSBObjectClass,
 | |
|                                            filemenu, NULL);
 | |
|     ecbutton     = XtVaCreateManagedWidget("Edit Global", smeBSBObjectClass,
 | |
|                                            filemenu,
 | |
|                                            NULL);
 | |
|     dcbutton     = XtVaCreateManagedWidget("Delete Global", smeBSBObjectClass,
 | |
|                                            filemenu,
 | |
|                                            NULL);
 | |
|     ndbutton0    = XtVaCreateManagedWidget("New Display", smeBSBObjectClass,
 | |
|                                            filemenu,
 | |
|                                            NULL);
 | |
|     quitbutton   = XtVaCreateManagedWidget("Quit", smeBSBObjectClass,
 | |
|                                            filemenu, NULL);
 | |
| 
 | |
|                                 /* Help submenu button */
 | |
|     helpmenu     = XtVaCreatePopupShell("helpmenu", simpleMenuWidgetClass,
 | |
|                                         helpbutton, NULL);
 | |
|     aboutbutton  = XtVaCreateManagedWidget("About", smeBSBObjectClass,
 | |
|                                            helpmenu, NULL);
 | |
|     
 | |
|                                 /* Open popup */
 | |
|     openpopup    = XtVaCreatePopupShell("openpopup", transientShellWidgetClass,
 | |
|                                         toplevel, NULL);
 | |
|     opendialog   = XtVaCreateManagedWidget("opendialog", dialogWidgetClass,
 | |
|                                            openpopup,
 | |
|                                            XtNlabel, "Filename: ",
 | |
|                                            XtNvalue, dmxConfigFilename,
 | |
|                                            NULL);
 | |
|     okbutton     = XtVaCreateManagedWidget("Open", commandWidgetClass,
 | |
|                                            opendialog, NULL);
 | |
|     canbutton    = XtVaCreateManagedWidget("Cancel", commandWidgetClass,
 | |
|                                            opendialog, NULL);
 | |
| 
 | |
|                                 /* EC popup */
 | |
|     ecpopup      = XtVaCreatePopupShell("ecpopup", transientShellWidgetClass,
 | |
|                                         toplevel, NULL);
 | |
|     ecbox        = XtVaCreateManagedWidget("ecbox", boxWidgetClass,
 | |
|                                            ecpopup, NULL);
 | |
|     ecdialog0    = XtVaCreateManagedWidget("ecdialog0", dialogWidgetClass,
 | |
|                                            ecbox,
 | |
|                                            XtNlabel, "Name:              ",
 | |
|                                            XtNvalue, "",
 | |
|                                            NULL);
 | |
|     ecdialog1    = XtVaCreateManagedWidget("ecdialog1", dialogWidgetClass,
 | |
|                                            ecbox,
 | |
|                                            XtNlabel, "Dimension:         ",
 | |
|                                            XtNvalue, "",
 | |
|                                            NULL);
 | |
|     ecokbutton   = XtVaCreateManagedWidget("OK", commandWidgetClass,
 | |
|                                            ecbox, NULL);
 | |
|     eccanbutton  = XtVaCreateManagedWidget("Cancel", commandWidgetClass,
 | |
|                                            ecbox, NULL);
 | |
| 
 | |
|                                 /* ED popup */
 | |
|     edpopup      = XtVaCreatePopupShell("edpopup", transientShellWidgetClass,
 | |
|                                         toplevel, NULL);
 | |
|     edbox        = XtVaCreateManagedWidget("edbox", boxWidgetClass,
 | |
|                                            edpopup, NULL);
 | |
|     eddialog0    = XtVaCreateManagedWidget("eddialog0", dialogWidgetClass,
 | |
|                                            edbox,
 | |
|                                            XtNlabel, "Display Name:      ",
 | |
|                                            XtNvalue, "",
 | |
|                                            NULL);
 | |
|     eddialog1    = XtVaCreateManagedWidget("eddialog1", dialogWidgetClass,
 | |
|                                            edbox,
 | |
|                                            XtNlabel, "Geometry:          ",
 | |
|                                            XtNvalue, "",
 | |
|                                            NULL);
 | |
|     eddialog2    = XtVaCreateManagedWidget("eddialog2", dialogWidgetClass,
 | |
|                                            edbox,
 | |
|                                            XtNlabel, "Offset:            ",
 | |
|                                            XtNvalue, "",
 | |
|                                            NULL);
 | |
|     edokbutton   = XtVaCreateManagedWidget("OK", commandWidgetClass,
 | |
|                                            edbox, NULL);
 | |
|     edcanbutton  = XtVaCreateManagedWidget("Cancel", commandWidgetClass,
 | |
|                                            edbox, NULL);
 | |
| 
 | |
|                                 /* About popup */
 | |
|     aboutpopup   = XtVaCreatePopupShell("aboutpopup",transientShellWidgetClass,
 | |
|                                         toplevel, NULL);
 | |
|     aboutbox     = XtVaCreateManagedWidget("aboutbox", boxWidgetClass,
 | |
|                                            aboutpopup, NULL);
 | |
|     abouttext    = XtVaCreateManagedWidget("abouttext", labelWidgetClass,
 | |
|                                            aboutbox,
 | |
|                                            XtNlabel, DMX_INFO,
 | |
|                                            NULL);
 | |
|     aboutok      = XtVaCreateManagedWidget("OK", commandWidgetClass,
 | |
|                                            aboutbox, NULL);
 | |
| 
 | |
|                                 /* Quit popup */
 | |
|     quitpopup    = XtVaCreatePopupShell("quitpopup",transientShellWidgetClass,
 | |
|                                         toplevel, NULL);
 | |
|     quitbox      = XtVaCreateManagedWidget("quitbox", boxWidgetClass,
 | |
|                                            quitpopup, NULL);
 | |
|     quittext     = XtVaCreateManagedWidget("quittext", labelWidgetClass,
 | |
|                                            quitbox,
 | |
|                                            XtNlabel,
 | |
|                                            "Changes to the configuration\n"
 | |
|                                            "been made that have not yet\n"
 | |
|                                            "been saved.  Do you want to\n"
 | |
|                                            "quit without saving?",
 | |
|                                            NULL);
 | |
|     quitok       = XtVaCreateManagedWidget("Quit WITHOUT Saving",
 | |
|                                            commandWidgetClass,
 | |
|                                            quitbox, NULL);
 | |
|     quitcan      = XtVaCreateManagedWidget("Continue Editing",
 | |
|                                            commandWidgetClass,
 | |
|                                            quitbox, NULL);
 | |
| 
 | |
|                                 /* Button popup */
 | |
|     buttonpopup  = XtVaCreatePopupShell("buttonpopup", simpleMenuWidgetClass,
 | |
|                                         toplevel, NULL);
 | |
|     ndbutton1    = XtVaCreateManagedWidget("New Display", smeBSBObjectClass,
 | |
|                                            buttonpopup,
 | |
|                                            NULL);
 | |
|     edbutton     = XtVaCreateManagedWidget("Edit Display", smeBSBObjectClass,
 | |
|                                            buttonpopup,
 | |
|                                            NULL);
 | |
|     ddbutton     = XtVaCreateManagedWidget("Delete Display", smeBSBObjectClass,
 | |
|                                            buttonpopup,
 | |
|                                            NULL);
 | |
| 
 | |
|                                 /* Callbacks */
 | |
|     XtAddCallback(openbutton,  XtNcallback, dmxConfigOpenCallback,       NULL);
 | |
|     XtAddCallback(savebutton,  XtNcallback, dmxConfigSaveCallback,       NULL);
 | |
|     XtAddCallback(okbutton,    XtNcallback, dmxConfigOkCallback,         NULL);
 | |
|     XtAddCallback(canbutton,   XtNcallback, dmxConfigCanCallback,        NULL);
 | |
|     
 | |
|     XtAppAddActions(appContext, actiontable, XtNumber(actiontable));
 | |
|     XtOverrideTranslations(canvas, XtParseTranslationTable(canvastrans));
 | |
|     XtOverrideTranslations(XtNameToWidget(opendialog, "value"),
 | |
|                                           XtParseTranslationTable(opentrans));
 | |
|     XtOverrideTranslations(XtNameToWidget(ecdialog0, "value"),
 | |
|                                           XtParseTranslationTable(opentrans));
 | |
|     XtOverrideTranslations(XtNameToWidget(ecdialog1, "value"),
 | |
|                                           XtParseTranslationTable(opentrans));
 | |
|     XtOverrideTranslations(XtNameToWidget(eddialog0, "value"),
 | |
|                                           XtParseTranslationTable(opentrans));
 | |
|     XtOverrideTranslations(XtNameToWidget(eddialog1, "value"),
 | |
|                                           XtParseTranslationTable(opentrans));
 | |
|     XtOverrideTranslations(XtNameToWidget(eddialog2, "value"),
 | |
|                                           XtParseTranslationTable(opentrans));
 | |
|     
 | |
|     XtAddCallback(ncbutton,    XtNcallback, dmxConfigNCCallback,         NULL);
 | |
|     XtAddCallback(ecbutton,    XtNcallback, dmxConfigECCallback,         NULL);
 | |
|     XtAddCallback(ecokbutton,  XtNcallback, dmxConfigECOkCallback,       NULL);
 | |
|     XtAddCallback(eccanbutton, XtNcallback, dmxConfigECCanCallback,      NULL);
 | |
|     XtAddCallback(dcbutton,    XtNcallback, dmxConfigDCCallback,         NULL);
 | |
| 
 | |
|     XtAddCallback(ndbutton0,   XtNcallback, dmxConfigNDCallback,         NULL);
 | |
|     XtAddCallback(ndbutton1,   XtNcallback, dmxConfigNDCallback,         NULL);
 | |
|     XtAddCallback(edbutton,    XtNcallback, dmxConfigEDCallback,         NULL);
 | |
|     XtAddCallback(ddbutton,    XtNcallback, dmxConfigDDCallback,         NULL);
 | |
|     XtAddCallback(edokbutton,  XtNcallback, dmxConfigEDOkCallback,       NULL);
 | |
|     XtAddCallback(edcanbutton, XtNcallback, dmxConfigEDCanCallback,      NULL);
 | |
| 
 | |
|     XtAddCallback(aboutbutton, XtNcallback, dmxConfigAboutCallback,      NULL);
 | |
|     XtAddCallback(aboutok,     XtNcallback, dmxConfigAboutOkCallback,    NULL);
 | |
|     XtAddCallback(quitok,      XtNcallback, dmxConfigQuitOkCallback,     NULL);
 | |
|     XtAddCallback(quitcan,     XtNcallback, dmxConfigQuitCanCallback,    NULL);
 | |
|     
 | |
|     XtAddCallback(quitbutton,  XtNcallback, dmxConfigQuitCallback,       NULL);
 | |
|     
 | |
|     XtAddCallback(canvas, XtNcallback,             dmxConfigCanvasInput, NULL);
 | |
|     XtAddCallback(canvas, XtNcanvasExposeCallback, dmxConfigCanvasExpose,NULL);
 | |
|     XtAddCallback(canvas, XtNcanvasResizeCallback, dmxConfigCanvasResize,NULL);
 | |
| 
 | |
|     if (dmxConfigFilename) dmxConfigReadFile();
 | |
|     
 | |
|     XtRealizeWidget(toplevel);
 | |
|     dmxConfigCopystrings();
 | |
|     dmxConfigSetupCnamemenu();
 | |
|     XtAppMainLoop(appContext);
 | |
|     return 0;
 | |
| }
 |