View Raw SPL
/* pdc magnify command */

static maxstate = 10;

static xl, xr, yb, yt, curmax;
static win     = -1;
static state   = -1;
static winsave = 1;

static ymin, ymax, xmin, xmax;


/* magnify function with callback */
_winmagnify()
{
        local x = inf, save;

        if (_winmagnify_changed())
        {
                /* data has changed, reset and save */
                _winmagnify_reset();
                _winmagnify_save();
        }

        /* magnify */
        x = magnify(0, -1, -1, -1, "_winmagnify_onrclick");

        /* inf indicates cancel */
        if (winsave && not(isinf(x)))
        {
                _winmagnify_save();
        }

        winsave = 1;
        
}


/* no saving - for callback recursion from magnify.men */
_winmagnify_nosave()
{
        winsave = 0;
}


/* save or initialize state */
_winmagnify_save()
{
        if (state < 0)
        {
                /* initialize */
                xl  = xr = yb = yt = zeros(maxstate, 1);
                win = w0.wnum;

                ymin = fastmin(w0);
                ymax = fastmax(w0);

                (xmin, xmax) = xminmax(w0);

                state  = 0;
                curmax = 0;
        }

        if (state < maxstate)
        {
                state++;
        }

        /* save coords */
        xl[state] = getxl(w0);
        xr[state] = getxr(w0);
        yb[state] = getyb(w0);
        yt[state] = getyt(w0);

        curmax = state;
}


/* undo coords */
_winmagnify_undo()
{
        if (not(_winmagnify_changed()))
        {
                state--;

                if (state > 0)
                {
                        setxy(w0, xl[state], xr[state], yb[state], yt[state]);
                        plotmode(w0, 1);
                }
                else
                {
                        state = 1;
                }
        }
}


/* redo coords */        
_winmagnify_redo()
{
        if (not(_winmagnify_changed()))
        {
                if (state < curmax)
                {
                        state++;

                        setxy(w0, xl[state], xr[state], yb[state], yt[state]);
                        plotmode(w0, 1);
                }
        }
}


/* reset state */
_winmagnify_reset()
{
        win     = -1;
        state   = -1;
        curmax  = -1;
        winsave =  1;
}


/* check data range to indicate data has changed */        
_winmagnify_changed()
{
        local minx, maxx, changed = 1;

        if (win == w0.wnum)
        {
                if (fastmax(w0) == ymax && fastmin(w0) == ymin)
                {
                        (minx, maxx) = xminmax(w0);

                        changed = not(minx == xmin && maxx == xmax);
                }
        }

        return(changed);
}