/* Here's the same example as above written for both Release 2 and
* earlier versions of the operating system. The main difference
* here is that this example avoids using any new Release 2
* functions, but does pass extended structures to the older
* Intuition functions so that some new Release 2 features may be
* accessed in a backward-compatible manner.
*/
/* easyintuition.c Simple backward-compatible V37 Intuition example */
/* */
/* This example uses extended structures with the pre-V37 OpenScreen() */
/* and OpenWindow() functions to compatibly open an Intuition display. */
/* Enhanced V37 options specified via tags are ignored on 1.3 systems. */
/* Compiled with Lattice C v5.10: lc -L easyintuition.c */
/* Force use of new variable names to help prevent errors */
#define INTUI_V36_NAMES_ONLY
#include <exec/types.h> /* The Amiga data types file. */
#include <intuition/intuition.h> /* Intuition data strucutres, etc. */
#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 */
#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 33L
/* 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;
/* We can specify that we want the V37-compatible 3D look when
* running under V37 by adding an SA_Pens tag.
*/
WORD pens[] = {~0}; /* empty pen array to get default 3D look */
struct TagItem ourscreentags[] = {
{ SA_Pens, (ULONG)pens },
{ TAG_DONE }};
/* ExtNewScreen is an extended NewScreen structure.
* NS_EXTENDED flags that there is a tag pointer to additional
* tag information at the end of this structure. The tags will
* be parsed by Release 2 but ignored by earlier OS versions.
*/
struct ExtNewScreen fullHires =
{
0, /* LeftEdge must be zero prior to Release 2 */
0, /* TopEdge */
640, /* Width (high-resolution) */
STDSCREENHEIGHT, /* Height (non-interlace) */
2, /* Depth (4 colors will be available) */
0,1, /* Default DetailPen and BlockPen */
HIRES, /* the high-resolution display mode */
CUSTOMSCREEN | NS_EXTENDED, /* the screen type */
NULL, /* no special font */
"Our Screen", /* the screen title */
NULL, /* no custom screen gadgets (not supported) */
NULL, /* no CustomBitMap */
ourscreentags /* tags for additional V37 features */
};
/* 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
/* Under V37, we'll get a special screen title when our window is active */
UBYTE activetitle[] = {"Our Screen - EasyWindow is Active"};
struct TagItem ourwindowtags[] = {
{ WA_ScreenTitle, (ULONG)&activetitle[0] },
{ TAG_DONE }};
/* ExtNewWindow is an extended NewWindow structure.
* NW_EXTENDED indicates that there is a tag pointer to additional tag
* information at the end of this structure. The tags will be parsed
* by Release 2 but ignored by earlier OS versions.
*/
struct ExtNewWindow easyWindow =
{
WIN_LEFTEDGE,
WIN_TOPEDGE,
WIN_WIDTH,
WIN_HEIGHT,
-1,-1, /* Means use the screen's Detail and Block pens */
IDCMP_CLOSEWINDOW, /* This field specifies the events we want to get */
/* These flags specify system gadgets and other window attributes */
/* including the EXTENDED flag which flags this as an ExtNewWindow */
WFLG_CLOSEGADGET | WFLG_SMART_REFRESH | WFLG_ACTIVATE | WFLG_DRAGBAR |
WFLG_DEPTHGADGET | WFLG_SIZEGADGET | WFLG_NOCAREREFRESH |
WFLG_NW_EXTENDED,
NULL, /* Pointer to the first gadget */
NULL, /* No checkmark. */
"EasyWindow", /* Window title. */
NULL, /* Attach a screen later. */
NULL, /* Let Intuition set up BitMap */
WIN_MINWIDTH, /* Minimum width. */
WIN_MINHEIGHT, /* Minimum height. */
-1, /* Maximum width (screen size) */
-1, /* Maximum height (screen size) */
CUSTOMSCREEN, /* A screen of our own. */
ourwindowtags /* tags for additional V37 features */
};
VOID main(int argc, char *argv[])
{
/* Declare variables here */
ULONG signalmask, winsignal, signals;
BOOL done = FALSE;
struct Screen *screen1 = NULL;
struct Window *window1 = NULL;
/* Open Intuition Library. NOTE - We are accepting version 33 (1.2)
* or higher because we are opening our display in a compatible manner.
* However - If you add to this example, do NOT use any NEW V37
* functions unless IntuitionBase->lib_Version is >= 37
*/
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 = OpenScreen(&fullHires);
if (screen1 == NULL)
cleanExit(screen1, window1, RETURN_WARN);
/* Attach the window to the open screen ... */
easyWindow.Screen = screen1;
/* ... and open the window */
window1 = OpenWindow(&easyWindow);
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 will only wait 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;
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]