home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 5
/
FreshFish_July-August1994.bin
/
bbs
/
dev
/
rkrm.lha
/
RKRM
/
Intuition
/
Windows
/
lines.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-09-03
|
13KB
|
428 lines
;/* lines.c - Execute me to compile me with SAS C 5.10
LC -b1 -cfistq -v -y -j73 lines.c
Blink FROM LIB:c.o,lines.o TO lines LIBRARY LIB:LC.lib,LIB:Amiga.lib
quit
*/
/*
Copyright (c) 1992 Commodore-Amiga, Inc.
This example is provided in electronic form by Commodore-Amiga, Inc. for
use with the "Amiga ROM Kernel Reference Manual: Libraries", 3rd Edition,
published by Addison-Wesley (ISBN 0-201-56774-1).
The "Amiga ROM Kernel Reference Manual: Libraries" contains additional
information on the correct usage of the techniques and operating system
functions presented in these examples. The source and executable code
of these examples may only be distributed in free electronic form, via
bulletin board or as part of a fully non-commercial and freely
redistributable diskette. Both the source and executable code (including
comments) must be included, without modification, in any copy. This
example may not be published in printed form or distributed with any
commercial product. However, the programming techniques and support
routines set forth in these examples may be used in the development
of original executable software products for Commodore Amiga computers.
All other rights reserved.
This example is provided "as-is" and is subject to change; no
warranties are made. All use is at your own risk. No liability or
responsibility is assumed.
*/
/*
** lines.c -- implements a superbitmap with scroll gadgets
** This program requires V37, as it uses calls to OpenWindowTags(),
** LockPubScreen().
*/
/* Enforces use of new prefixed Intuition flag names */
#define INTUI_V36_NAMES_ONLY
#include <exec/types.h>
#include <exec/memory.h>
#include <intuition/intuition.h>
#include <clib/exec_protos.h>
#include <clib/layers_protos.h>
#include <clib/graphics_protos.h>
#include <clib/intuition_protos.h>
/* Random number function in amiga.lib (see amiga.lib.doc) */
UWORD RangeRand( unsigned long maxValue );
#ifdef LATTICE
int CXBRK(void) { return(0); } /* Disable Lattice CTRL/C handling */
int chkabort(void) { return(0); } /* really */
#endif
#define WIDTH_SUPER (800)
#define HEIGHT_SUPER (600)
#define UP_DOWN_GADGET (0)
#define LEFT_RIGHT_GADGET (1)
#define NO_GADGET (2)
#define MAXPROPVAL (0xFFFFL)
#define GADGETID(x) (((struct Gadget *)(msg->IAddress))->GadgetID)
#define LAYERXOFFSET(x) (x->RPort->Layer->Scroll_X)
#define LAYERYOFFSET(x) (x->RPort->Layer->Scroll_Y)
/* A string with this format will be found by the version command
** supplied by Commodore. This will allow users to give version
** numbers with error reports.
*/
UBYTE vers[] = "$VER: lines 37.2";
struct Library *GfxBase;
struct Library *IntuitionBase;
struct Library *LayersBase;
struct Window *Win = NULL; /* window pointer */
struct PropInfo BotGadInfo = {0};
struct Image BotGadImage = {0};
struct Gadget BotGad = {0};
struct PropInfo SideGadInfo = {0};
struct Image SideGadImage = {0};
struct Gadget SideGad = {0};
/* Prototypes for our functions */
VOID initBorderProps(struct Screen *myscreen);
VOID doNewSize(void);
VOID doDrawStuff(void);
VOID doMsgLoop(void);
VOID superWindow(struct Screen *myscreen);
/*
** main
** Open all required libraries and get a pointer to the default public screen.
** Cleanup when done or on error.
*/
VOID main(int argc, char **argv)
{
struct Screen *myscreen;
/* open all of the required libraries for the program.
**
** require version 37 of the Intuition library.
*/
if (IntuitionBase = OpenLibrary("intuition.library",37L))
{
if (GfxBase = OpenLibrary("graphics.library",33L))
{
if (LayersBase = OpenLibrary("layers.library",33L))
{
/* LockPubScreen()/UnlockPubScreen is only available under V36
** and later... Use GetScreenData() under V34 systems to get a
** copy of the screen structure...
*/
if (NULL != (myscreen = LockPubScreen(NULL)))
{
superWindow(myscreen);
UnlockPubScreen(NULL,myscreen);
}
CloseLibrary(LayersBase);
}
CloseLibrary(GfxBase);
}
CloseLibrary(IntuitionBase);
}
}
/*
** Create, initialize and process the super bitmap window.
** Cleanup if any error.
*/
VOID superWindow(struct Screen *myscreen)
{
struct BitMap *bigBitMap;
WORD planeNum;
WORD allocatedBitMaps;
/* set-up the border prop gadgets for the OpenWindow() call. */
initBorderProps(myscreen);
/* The code relies on the allocation of the BitMap structure with
** the MEMF_CLEAR flag. This allows the assumption that all of the
** bitmap pointers are NULL, except those successfully allocated
** by the program.
*/
if (bigBitMap = AllocMem(sizeof(struct BitMap), MEMF_PUBLIC | MEMF_CLEAR))
{
InitBitMap(bigBitMap, myscreen->BitMap.Depth, WIDTH_SUPER, HEIGHT_SUPER);
allocatedBitMaps = TRUE;
for (planeNum = 0;
(planeNum < myscreen->BitMap.Depth) && (allocatedBitMaps == TRUE);
planeNum++)
{
bigBitMap->Planes[planeNum] = AllocRaster(WIDTH_SUPER, HEIGHT_SUPER);
if (NULL == bigBitMap->Planes[planeNum])
allocatedBitMaps = FALSE;
}
/* Only open the window if the bitplanes were successfully
** allocated. Fail silently if they were not.
*/
if (TRUE == allocatedBitMaps)
{
/* OpenWindowTags() and OpenWindowTagList() are only available
** when the library version is at least V36. Under earlier
** versions of Intuition, use OpenWindow() with a NewWindow
** structure.
*/
if (NULL != (Win = OpenWindowTags(NULL,
WA_Width, 150,
WA_Height, 4 * (myscreen->WBorTop + myscreen->Font->ta_YSize + 1),
WA_MaxWidth, WIDTH_SUPER,
WA_MaxHeight, HEIGHT_SUPER,
WA_IDCMP, IDCMP_GADGETUP | IDCMP_GADGETDOWN |
IDCMP_NEWSIZE | IDCMP_INTUITICKS | IDCMP_CLOSEWINDOW,
WA_Flags, WFLG_SIZEGADGET | WFLG_SIZEBRIGHT | WFLG_SIZEBBOTTOM |
WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET |
WFLG_SUPER_BITMAP | WFLG_GIMMEZEROZERO | WFLG_NOCAREREFRESH,
WA_Gadgets, &(SideGad),
WA_Title, &vers[6], /* take title from version string */
WA_PubScreen, myscreen,
WA_SuperBitMap, bigBitMap,
TAG_DONE)))
{
/* set-up the window display */
SetRast(Win->RPort,0); /* clear the bitplanes */
SetDrMd(Win->RPort,JAM1);
doNewSize(); /* adjust props to represent portion visible */
doDrawStuff();
/* process the window, return on IDCMP_CLOSEWINDOW */
doMsgLoop();
CloseWindow(Win);
}
}
for (planeNum = 0; planeNum < myscreen->BitMap.Depth; planeNum++)
{
/* free only the bitplanes actually allocated... */
if (NULL != bigBitMap->Planes[planeNum])
FreeRaster(bigBitMap->Planes[planeNum], WIDTH_SUPER, HEIGHT_SUPER);
}
FreeMem(bigBitMap,sizeof(struct BitMap));
}
}
/*
** Set-up the prop gadgets--initialize them to values that fit
** into the window border. The height of the prop gadget on the side
** of the window takes the height of the title bar into account in its
** set-up. note the initialization assumes a fixed size "sizing" gadget.
**
** Note also, that the size of the sizing gadget is dependent on the
** screen resolution. The numbers given here are only valid if the
** screen is NOT lo-res. These values must be re-worked slightly
** for lo-res screens.
**
** The PROPNEWLOOK flag is ignored by 1.3.
*/
VOID initBorderProps(struct Screen *myscreen)
{
/* initializes the two prop gadgets.
**
** Note where the PROPNEWLOOK flag goes. Adding this flag requires
** no extra storage, but tells the system that our program is
** expecting the new-look prop gadgets under 2.0.
*/
BotGadInfo.Flags = AUTOKNOB | FREEHORIZ | PROPNEWLOOK;
BotGadInfo.HorizPot = 0;
BotGadInfo.VertPot = 0;
BotGadInfo.HorizBod