/* WXOPEN.C   -    opens an exploding window */

#include <stdlib.h>
#include "cxldef.h"
#include "cxlvid.h"
#include "cxlwin.h"
#include "cxlxwin.h"

static void error_exit    (int errnum);
/* error message table */
static char *error_text[]= {
    NULL,                               /* errnum =  0, no error	    */
    NULL,                               /* errnum == 1, windowing error */
    "Syntax:  CXLDEMO [-switches]\n\n"
        "\t -c = CGA snow reduction\n"
        "\t -b = BIOS screen writing\n"
        "\t -m = force monochrome text attributes",
    "Memory allocation error"
};


WINDOW wxopen(int srow,int scol,int erow,int ecol,int btype,int battr,int wattr)
{
   struct _wxrec_t *wxrec;
   register int count;
   int tone = 500;
   int xsrow, xscol, xerow, xecol, delta;
   WINDOW xwindow;

    /* allocate memory for new record */
    wxrec = malloc(sizeof(struct _wxrec_t));
    if(wxrec == NULL) {
       return(0);
    }

    /* add new record to linked list */
    if(_wxinfo.active != NULL)_wxinfo.active->next = wxrec;
    wxrec->prev = _wxinfo.active;
    wxrec->next = NULL;
    _wxinfo.active = wxrec;
    _wxinfo.total++;
    _wxinfo.active->wxnum = 0;

    /* calculate number of windows to explode */
    count = (erow - srow)/2;
    delta = (ecol - scol)/(count * 2);

    /* explode each window */
    for(--count;count > 0 ;count--) {
       xsrow = srow + count;
       xscol = scol + (delta * count);
       xerow = erow - count;
       xecol = ecol - (delta * count);
       if(!wopen(xsrow,xscol,xerow,xecol,btype,battr,wattr))error_exit(1); 
       sound_(tone+=100,1);
       _wxinfo.active->wxnum++;
    }  

    if(!(xwindow=wopen(srow,scol,erow,ecol,btype,battr,wattr)))error_exit(1); 
    _wxinfo.active->wxnum++;
    _wxinfo.active->wxtone = tone;
    sound_(tone,1);
 
    /* Normal return */
    return(xwindow);
}

/*---------------------------------------------------------------------------*/
/* this function handles abnormal termination.  If it is passed an  */
/* error code of 1, then it is a windowing system error.  Otherwise */
/* the error message is looked up in the error message table.       */

static void error_exit(int errnum)
{
    if(errnum) {
        printf("\n%s\n",(errnum==1)?werrmsg():error_text[errnum]);
	exit(errnum);
    }
}

