1233 lines
		
	
	
		
			44 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			1233 lines
		
	
	
		
			44 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
 * 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 "Canvas.h"
 | 
						|
 | 
						|
#include "dmxparse.h"
 | 
						|
#include "dmxprint.h"
 | 
						|
#include "dmxlog.h"
 | 
						|
 | 
						|
extern int yyparse(void);
 | 
						|
extern int yydebug;
 | 
						|
extern FILE *yyin;
 | 
						|
 | 
						|
#define DMX_INFO "xdmxconfig v0.9\nCopyright 2002 Red Hat Inc.\n"
 | 
						|
 | 
						|
#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;
 | 
						|
    *maxHeight = 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;
 | 
						|
        snprintf(cnambuf, sizeof(cnambuf), "%s", name ? name : "");
 | 
						|
        snprintf(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;
 | 
						|
        snprintf(nambuf, sizeof(nambuf), "%s", name ? name : "");
 | 
						|
        snprintf(dimbuf, sizeof(dimbuf), "%dx%d%c%d%c%d",
 | 
						|
                 dmxConfigCurrentDisplay->scrnWidth,
 | 
						|
                 dmxConfigCurrentDisplay->scrnHeight,
 | 
						|
                 dmxConfigCurrentDisplay->scrnXSign < 0 ? '-' : '+',
 | 
						|
                 dmxConfigCurrentDisplay->scrnX,
 | 
						|
                 dmxConfigCurrentDisplay->scrnYSign < 0 ? '-' : '+',
 | 
						|
                 dmxConfigCurrentDisplay->scrnY);
 | 
						|
        snprintf(rtbuf, sizeof(dimbuf), "%dx%d%c%d%c%d",
 | 
						|
                 dmxConfigCurrentDisplay->rootWidth,
 | 
						|
                 dmxConfigCurrentDisplay->rootHeight,
 | 
						|
                 dmxConfigCurrentDisplay->rootXSign < 0 ? '-' : '+',
 | 
						|
                 dmxConfigCurrentDisplay->rootX,
 | 
						|
                 dmxConfigCurrentDisplay->rootYSign < 0 ? '-' : '+',
 | 
						|
                 dmxConfigCurrentDisplay->rootY);
 | 
						|
        snprintf(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;
 | 
						|
        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) {
 | 
						|
            int xo = 3, yo = fs->ascent + fs->descent + 2;
 | 
						|
 | 
						|
            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 snprintf */
 | 
						|
 | 
						|
    if (!dmxConfigCurrent)
 | 
						|
        return;
 | 
						|
    dmxConfigSetPopupPosition(ecpopup);
 | 
						|
    XtVaSetValues(ecdialog0, XtNvalue,
 | 
						|
                  dmxConfigCurrent->name ? dmxConfigCurrent->name : "", NULL);
 | 
						|
    snprintf(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 snprintf */
 | 
						|
 | 
						|
    if (!dmxConfigCurrent || !dmxConfigCurrentDisplay)
 | 
						|
        return;
 | 
						|
    dmxConfigSetPopupPosition(edpopup);
 | 
						|
    XtVaSetValues(eddialog0, XtNvalue,
 | 
						|
                  dmxConfigCurrentDisplay->name
 | 
						|
                  ? dmxConfigCurrentDisplay->name : "", NULL);
 | 
						|
    snprintf(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);
 | 
						|
    snprintf(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, aboutok;
 | 
						|
    Widget quitbox, 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[] = {
 | 
						|
        {(char *) "openOk", dmxConfigOkAction},
 | 
						|
        {(char *) "placeMenu", dmxConfigPlaceMenu},
 | 
						|
        {(char *) "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);
 | 
						|
    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);
 | 
						|
    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;
 | 
						|
}
 |