/*
 * Set_Prefs.c
 *
 * This example changes the printer device's COPY of preferences (as obtained
 * when the printer device was opened by a task via OpenDevice()).  Note that
 * it only changes the printer device's copy of preferences, not the preferences
 * as set by the user via the preference editor(s).
 *
 * Compile with SAS C 5.10: LC -b1 -cfistq -v -y -L
 *
 * Run from CLI only
 */
#include <exec/types.h>
#include <devices/printer.h>
#include <devices/prtbase.h>
#include <intuition/intuition.h>
#include <intuition/screens.h>
#include <intuition/preferences.h>
#include <clib/exec_protos.h>
#include <clib/alib_protos.h>
#include <clib/alib_stdio_protos.h>
#include <clib/graphics_protos.h>
#include <clib/intuition_protos.h>
struct Library *IntuitionBase;
struct Library *GfxBase;
union printerIO
{
    struct IOStdReq    ios;
    struct IODRPReq    iodrp;
    struct IOPrtCmdReq iopc;
};
struct MsgPort *PrintMP;
union printerIO *pio;
char message[] = "\
This is a test message to see how this looks when printed\n\
using various printer settings.\n\n";
VOID main(VOID);
VOID DoPrinter(VOID);
int DoTest(VOID);
VOID main(VOID)
{
if (IntuitionBase = OpenLibrary("intuition.library",0L))
    {
    if (GfxBase = OpenLibrary("graphics.library",0L))
        {
        DoPrinter();
        CloseLibrary(GfxBase);
        }
    CloseLibrary(IntuitionBase);
    }
}
VOID DoPrinter(VOID)
{
if (PrintMP = CreatePort(0L,0L))
    {
    if (pio = (union printerIO *)CreateExtIO(PrintMP,sizeof(union printerIO)))
        {
        if (!(OpenDevice("printer.device",0L,(struct IORequest *)pio,0L)))
            {
            DoTest();
            CloseDevice((struct IORequest *)pio);
            }
        DeleteExtIO((struct IORequest *)pio);
        }
    DeletePort(PrintMP);
    }
}
DoTest(VOID)
{
struct PrinterData *PD;
struct Preferences *prefs;
UWORD newpitch;
UWORD newspacing;
/* Send INIT sequence - make sure printer is inited - some      */
/* printers may eject the current page if necessary when inited */
pio->ios.io_Command = CMD_WRITE;
pio->ios.io_Data = "\033#1";
pio->ios.io_Length = -1L;
if (DoIO((struct IORequest *)pio))
    return(FALSE);
/* Print some text using the default settings from Preferences */
pio->ios.io_Command = CMD_WRITE;
pio->ios.io_Data = message;
pio->ios.io_Length = -1L;
if(DoIO((struct IORequest *)pio))
   return(FALSE);
/* Now try changing some settings
 * Note that we could just as well send the printer.device escape
 * sequences to change these settings, but this is an example program.
 */
/* Get pointer to printer data  */
PD = (struct PrinterData *) pio->ios.io_Device;
/* Get pointer to printer's copy of preferences
 * Note that the printer.device makes a copy of preferences when
 * the printer.device is successfully opened via OpenDevice(),
 * so we are only going to change the COPY of preferences
 */
prefs = &PD->pd_Preferences;
/* Change a couple of settings                          */
if (prefs->PrintSpacing == SIX_LPI)
    newspacing = EIGHT_LPI;
if (prefs->PrintSpacing == EIGHT_LPI)
    newspacing = SIX_LPI;
if (prefs->PrintPitch == PICA)
    newpitch = ELITE;
if (prefs->PrintPitch == ELITE)
    newpitch = FINE;
if (prefs->PrintPitch == FINE)
    newpitch = PICA;
/* And let's change the margins too for this example */
prefs->PrintLeftMargin = 20;
prefs->PrintRightMargin = 40;
prefs->PrintPitch = newpitch;
prefs->PrintSpacing = newspacing;
/* Send INIT sequence so that these settings are used */
pio->ios.io_Command = CMD_WRITE;
pio->ios.io_Data = "\033#1";
pio->ios.io_Length = -1L;
if(DoIO((struct IORequest *)pio))
   return(FALSE);
pio->ios.io_Command = CMD_WRITE;
pio->ios.io_Data = message;
pio->ios.io_Length = -1L;
if(DoIO((struct IORequest *)pio))
   return(FALSE);
/* Send FormFeed so page is ejected  */
pio->ios.io_Command = CMD_WRITE;
pio->ios.io_Data = "\014";
pio->ios.io_Length = -1L;
if(DoIO((struct IORequest *)pio))
   return(FALSE);
return(TRUE);
}