#include "defs.h"

extern char ID[];

/*
 *  Status Window routines
 *
 */
int
openwindow(struct DevUnit *unit)
{
struct TagItem windowtags[] = {
    {   WA_Left,          unit->du_WindowSize[0]},
    {   WA_Top,           unit->du_WindowSize[1]},
    {   WA_Width,         unit->du_WindowSize[2]},
    {   WA_Height,        unit->du_WindowSize[3]},
    {   WA_CloseGadget,   TRUE                  },
    {   WA_DragBar,       TRUE                  },
    {   WA_DepthGadget,   TRUE                  },
    {   WA_Zoom,          unit->du_ZoomSize     },
    {   WA_SmartRefresh,  TRUE                  },
    {   WA_NoCareRefresh, TRUE                  },
    {   WA_IDCMP,         IDCMP_CLOSEWINDOW     },
    {   WA_Title,         unit->du_WindowTitle  },
    {   WA_ScreenTitle,   &ID[6]                },
    {   TAG_DONE,         NULL                  },
    };
struct Library *IntuitionBase = unit->du_IntuitionBase;

    sprintf(unit->du_WindowTitle, "%s, unit %ld", unit->du_SerName, unit->du_SerUnit);

    if( unit->du_Window = OpenWindowTagList(NULL, windowtags) ) {
    struct IOStdReq *cio = &unit->du_cio;

        /* initialise the console io message */
        cio->io_Message.mn_Node.ln_Type = NT_MESSAGE;
        cio->io_Message.mn_Length = sizeof(struct IOStdReq);
        cio->io_Message.mn_ReplyPort = &unit->du_MsgPort;

        cio->io_Data = unit->du_Window;
        cio->io_Length = sizeof(struct Window);

        if( OpenDevice("console.device", CONU_STANDARD, (struct IORequest *)cio, 0) == 0 ) {
            return(TRUE);
        }

        CloseWindow(unit->du_Window);
    }

    return(FALSE);
}

void
closewindow(struct DevUnit *unit)
{
struct Library *IntuitionBase = unit->du_IntuitionBase;  /* need it named thus for the CloseWindow call */

    CloseDevice((struct IORequest *)&unit->du_cio);
    CloseWindow(unit->du_Window);
}

void
display_char(struct DevUnit *unit, UBYTE c)
{
struct IOStdReq *cio = &unit->du_cio;

    cio->io_Command = CMD_WRITE;
    cio->io_Data = &c;
    cio->io_Length = 1;

    DoIO((struct IORequest *)cio);
}

void
display_string(struct DevUnit *unit, char *str)
{
    while( *str )
        display_char(unit, *str++);
}

int
check_abort(struct DevUnit *unit)
{
struct IntuiMessage *msg;

    while( msg = (struct Message *)GetMsg(unit->du_Window->UserPort) ) {
        if( msg->Class == IDCMP_CLOSEWINDOW ) unit->du_Aborting = TRUE;
        ReplyMsg((struct Message *)msg);
    }

    return(unit->du_Aborting);
}
