/* This example shows a simple Intuition program that works with
* Release 2 (V36) and later versions of the Amiga operating system.
*/
/* easyintuition37.c -- Simple Intuition program for V37 */
/* (Release 2) and later versions of the operating system. */
/* Compiled with Lattice C v5.04: lc -L easyintuition37.c */
#include <exec/types.h> /* The Amiga data types file. */
#include <intuition/intuition.h> /* Intuition data strucutres, etc. */
#include <graphics/displayinfo.h> /* Release 2 Amiga display mode ID's */
#include <libraries/dos.h> /* Official return codes defined here */
#include <clib/exec_protos.h> /* Exec function prototypes */
#include <clib/intuition_protos.h> /* Intuition function prototypes */
/* Force use of new variable names to help prevent errors */
#define INTUI_V36_NAMES_ONLY
#ifdef LATTICE /* Disable Ctrl-C handling in SAS/C */
int CXBRK(void) {return(0);}
void chkabort(void) {return;}
#endif
/* Use lowest non-obsolete version that supplies the functions needed. */
#define INTUITION_REV 37
/* Declare the prototypes of our own functions. Prototypes for system */
/* functions are declared in the header files in the clib directory. */
VOID cleanExit( struct Screen *, struct Window *, LONG );
BOOL handleIDCMP( struct Window *);
struct Library *IntuitionBase = NULL;
/* Position and sizes for our window */
#define WIN_LEFTEDGE 20
#define WIN_TOPEDGE 20
#define WIN_WIDTH 400
#define WIN_MINWIDTH 80
#define WIN_HEIGHT 150
#define WIN_MINHEIGHT 20
VOID main(int argc, char *argv[])
{
/* Declare variables here */
ULONG signalmask, winsignal, signals;
BOOL done = FALSE;
UWORD pens[]={~0};
struct Screen *screen1 = NULL;
struct Window *window1 = NULL;
/* Open the Intuition Library */
IntuitionBase = OpenLibrary( "intuition.library",INTUITION_REV );
if (IntuitionBase == NULL)
cleanExit(screen1, window1, RETURN_WARN);
/* Open any other required libraries and make */
/* any assignments that were postponed above */
/* Open the screen */
screen1 = OpenScreenTags(NULL,
SA_Pens, (ULONG)pens,
SA_DisplayID, HIRES_KEY,
SA_Depth, 2,
SA_Title, (ULONG)"Our Screen",
TAG_DONE);
if (screen1 == NULL)
cleanExit(screen1, window1, RETURN_WARN);
/* ... and open the window */
window1 = OpenWindowTags(NULL,
/* Specify window dimensions and limits */
WA_Left, WIN_LEFTEDGE,
WA_Top, WIN_TOPEDGE,
WA_Width, WIN_WIDTH,
WA_Height, WIN_HEIGHT,
WA_MinWidth, WIN_MINWIDTH,
WA_MinHeight, WIN_MINHEIGHT,
WA_MaxWidth, ~0,
WA_MaxHeight, ~0,
/* Specify the system gadgets we want */
WA_CloseGadget, TRUE,
WA_SizeGadget, TRUE,
WA_DepthGadget, TRUE,
WA_DragBar, TRUE,
/* Specify other attributes */
WA_Activate, TRUE,
WA_NoCareRefresh,TRUE,
/* Specify the events we want to know about */
WA_IDCMP, IDCMP_CLOSEWINDOW,
/* Attach the window to the open screen ...*/
WA_CustomScreen, screen1,
WA_Title, "EasyWindow",
WA_ScreenTitle, "Our Screen - EasyWindow is Active",
TAG_DONE);
if (window1 == NULL)
cleanExit(screen1, window1, RETURN_WARN);
/* Set up the signals for the events we want to hear about ... */
winsignal = 1L << window1->UserPort->mp_SigBit; /* window IDCMP */
signalmask = winsignal; /* we are only waiting on IDCMP events */
/* Here's the main input event loop where we wait for events. */
/* We have asked Intuition to send us CLOSEWINDOW IDCMP events */
/* Exec will wake us if any event we are waiting for occurs. */
while( !done )
{
signals = Wait(signalmask);
/* An event occurred - now act on the signal(s) we received.*/
/* We were only waiting on one signal (winsignal) in our */
/* signalmask, so we actually know we received winsignal. */
if(signals & winsignal)
done = handleIDCMP(window1); /* done if close gadget */
}
cleanExit(screen1, window1, RETURN_OK); /* Exit the program */
}
BOOL handleIDCMP( struct Window *win )
{
BOOL done = FALSE;
struct IntuiMessage *message = NULL;
ULONG class;
/* Examine pending messages */
while( message = (struct IntuiMessage *)GetMsg(win->UserPort) )
{
class = message->Class; /* get all data we need from message */
/* When we're through with a message, reply */
ReplyMsg( (struct Message *)message);
/* See what events occurred */
switch( class )
{
case IDCMP_CLOSEWINDOW:
done = TRUE;
break;
default:
break;
}
}
return(done);
}
VOID cleanExit( struct Screen *scrn, struct Window *wind, LONG returnValue )
{
/* Close things in the reverse order of opening */
if (wind) CloseWindow( wind ); /* Close window if opened */
if (scrn) CloseScreen( scrn ); /* Close screen if opened */
/* Close the library, and then exit */
if (IntuitionBase) CloseLibrary( IntuitionBase );
exit(returnValue);
}
[Back to Amiga Developer Docs]