amiga-request@abcfd20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (10/10/90)
Submitted-by: nick@chopin.uucp (Dominic Giampaolo) Posting-number: Volume 90, Issue 269 Archive-name: libraries/ezlib/part01 [ uuencoded library and executable enclosed ...tad ] Here is a link time library I have written. This library makes writing programs that access Amiga specific features somewhat easier. There are readme files that go into more detail in the archive. Essentially the library provides abstract access to the creation of screens, window, and boolean gadgets (and some other things) - i.e. you don't have to worry about all the gory details any more. #!/bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 1 (of 2)." # Contents: README demo_src demo_src/frac demo_src/frac/frac.c # demo_src/frac/makefile demo_src/sin demo_src/sin/makefile # demo_src/sin/sin.c doc doc/closelibs.doc doc/create_boolgadget.doc # doc/createwindow.doc doc/defines.doc doc/free_bitmap.doc # doc/getbitmap.doc doc/getfont.doc doc/getstring.doc doc/getyn.doc # doc/killgadget.doc doc/killscreen.doc doc/killwindow.doc # doc/laced_wb.doc doc/makeboolgadget.doc doc/makescreen.doc # doc/makewindow.doc doc/openlibs.doc ezlib.h src src/ezlib.h # src/gadg.c src/gadget.c src/getfont.c src/getyn.c src/include # src/include/includes.h src/makefile src/openlibs.c src/window.c # Wrapped by tadguy@abcfd20 on Tue Oct 9 20:59:50 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'README' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'README'\" else echo shar: Extracting \"'README'\" \(5223 characters\) sed "s/^X//" >'README' <<'END_OF_FILE' X Ez Lib X A link time library to make life easy X ------------------------------------- X X Howdy. You have just gotten your greedy little hands on a library Xcalled Ez.lib. Ez.lib is a link time library which provides numerous calls Xto access many Intuition features without the normal hassle. There are Xsingle line calls to open any type of screen, window, or boolean gadget. X X This library is my effort at making the Amiga a little bit less of a Xbear to program. You can now do something like this: X X struct Screen *screen; X X screen = makescreen(HIRES|LACE, 4); /* 640x400x16 color */ X if (screen == NULL) X error_no_screen(); X X As you can see from the above code, you will save yourself HOURS of Xtime with a single function call. No more hassling around worrying about XBitMap structures etc.... The makescreen() call will even check to make Xsure that Graphics.library and Intuition.library are opened. Working with Xscreens, windows, and boolean gadgets now becomes trivial. X X In addition there are two "widgets" in the library. The first widget Xis getyn(). It will simply return true or false depending on how the user Xclicked the AutoRequest(). NOTE: this function was taken from M. Dillon's XDME, however I did enhance it somewhat. X The other "widget", getstring() will pop open a small window to get a Xstring of input from the user. It is about as difficult to use as fgets() Xor similar - making it easy to create Intuitionized programs. X X For the more hacker types there are a few lower level functions Xwhich you can call if you wish. These provide access to properly allocated Xand filled in BitMaps, Gadgets, and other things. X X X X X Installing and Using Ez.lib X --------------------------- X X What do you have to do to use all these nifty and wonderful things? X X Not much. The included library is for Manx 3.6. If you have Manx 5.0 Xyou will just have to recompile the modules and use LB to make the library. XYou can find out more about this by looking at the makefile in the SRC Xdirectory. X X If you have Lattice, you will have to recompile the modules and then Xuse whatever tool is provided with Lattice to make a link time library. I Xdon't have Lattice so I can't help you too much. Basically all there is in Xthe SRC directory is a bunch of individual source modules which need to be Xcompiled. Granted the code isn't ANSI C, but it should compile without too Xmany warnings (I hope ;^) X X After you have the correct version of the library, you simply need to Xput it where your compiler will find it. Same thing for the header file. XYou can just put these wherever your setup looks for them. X X Then, when you write a program that uses Ez.lib, you just X X #include <ezlib.h> X Xat the beginning of your program. When you get to the linking stage, Xsimply link with ez.lib (e.g. "ln -o demo demo.o -lez -lc") and you are Xdone. That's it, no more no less. X X X X X Other things of interest X ------------------------ X X The full docs for each of the functions in Ez.lib are in the DOC Xdirectory. Poke around there for more info. X X The SRC directory just contains the individual files that provide the Xfunctionality. You can sniff through here if you don't trust my coding or Xto see if I did something wrong (hey, if I did I'd like to hear about it, Xas I certainly don't want trashy code floating around with my name on it :) X X The demo that is in the root level is just a simple demo which Xexercises each of the features in Ez.lib. As you can see it is less than X9K and does a fair amount. BTW, it looks for a font. If you don't have it Xit's no big deal, but just so you know. X X The DEMOS directory contains a few programs that show how to use the Xlibrary. They are all very simple, purposely, so that you can see how the Xlibrary is used. X X X X Final Notes X ----------- X X At the moment the gadget creation facilities are somewhat plain. They Xjust create simple box affairs. I'm looking into changing this to a more X3-D'ish look. Don't worry though as the changes would be transparent to Xyou - they would just require a re-compile. X X I'm going to continue to add functionality to this library as needed. XI'd like access to string gadgets and ideally prop gadgets too (but I Xunderstand this is much easier in 2.0, so I may not bother). I'm probably Xgoing to add some Rexx code that I have written (to send/receive rexx Xmessages in an abstract way - i.e. send_rxmsg(string) ). I also have a few Xroutines to work with ARP, and chances are they will be in the next Xrelease too. X X I hope that this library will now make it easy for you to say - "Hey XI've got this neat idea, let me do it." Instead of (what I used to do) X"Aww man, it's too much hassle to open a {window,screen,gadget}". X X I would also like feedback on these routines and ways to improve them. XThey work fine for me, but maybe not for you. If so, lemme know. X X X--dominic giampaolo X Appt. # 8067 West X 4201 Mass. Ave. X Washington, D.C. 20016 X XE-Mail : nick@chopin.uunet.uu.net > X or | X uunet!chopin!nick >---- preferred X or | X chopin!nick@uunet.uu.net > X or X giampal@auvm.bitnet X X END_OF_FILE if test 5223 -ne `wc -c <'README'`; then echo shar: \"'README'\" unpacked with wrong size! fi # end of 'README' fi if test ! -d 'demo_src' ; then echo shar: Creating directory \"'demo_src'\" mkdir 'demo_src' fi if test ! -d 'demo_src/frac' ; then echo shar: Creating directory \"'demo_src/frac'\" mkdir 'demo_src/frac' fi if test -f 'demo_src/frac/frac.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'demo_src/frac/frac.c'\" else echo shar: Extracting \"'demo_src/frac/frac.c'\" \(1451 characters\) sed "s/^X//" >'demo_src/frac/frac.c' <<'END_OF_FILE' X/* this program generates psuedo-fractal mountains using a X * random midpoint displacement algorithim (sounds fancy eh :) X * X * It is taken from Pokorny & Gerald, _Computer Graphics_ (the chapter X * on fractals) X * X * D.B.G. August 90. X */ X#include <ezlib.h> X#include <math.h> X X#define MAX 640 X X/* NOTE: It is **very** important to declare functions that return doubles X * as double. If not, Manx gleefully fucks up your code by converting X * everything to int. X */ Xdouble ran(); X Xdouble line[MAX]; Xdouble rug = 0.3; Xstruct Screen *screen = NULL; X Xmain() X{ X struct RastPort *rp; X int i, j; X double temp1; X X srand(time(0L)); /* I think this may be wrong here.... */ X X line[0] = line[MAX-1] = (double) ((rand() % 50)+100); /* seed it */ X X fracline(0, MAX-1); /* generate the "mountain" */ X X screen = makescreen(HIRES, 2); /* get a custom screen */ X if (screen == NULL) X { closelibs(); MSG("Opening Screen failed.\n"); exit(10); } X X rp = &screen->RastPort; X X Move(rp, 0L, (int) line[0]); X for (i=1; i < MAX; i++) X Draw(rp, i, (int) line[i]); X X Delay(100); X killscreen(screen); X closelibs(); X X exit(0); X} X Xfracline(a, b) X int a, b; X{ X register int mid; X double temp1, temp2; X X if ( (b - a) > 1 ) { X mid = (a + b) / 2; X X temp1 = (double) ((line[a] + line[b]) / 2); X temp2 = (ran() * 2.0) - 1.0; X temp2 = temp2 * ((double)(b - a)) * rug; X line[mid] = (double) (temp1 + temp2); X X fracline(a, mid); X fracline(mid, b); X } X} X X END_OF_FILE if test 1451 -ne `wc -c <'demo_src/frac/frac.c'`; then echo shar: \"'demo_src/frac/frac.c'\" unpacked with wrong size! fi # end of 'demo_src/frac/frac.c' fi if test -f 'demo_src/frac/makefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'demo_src/frac/makefile'\" else echo shar: Extracting \"'demo_src/frac/makefile'\" \(87 characters\) sed "s/^X//" >'demo_src/frac/makefile' <<'END_OF_FILE' Xfrac : frac.c X cc +L +Ivd0:include/header.h frac.c X ln +Q -o frac frac.o -lez -lm -lc X END_OF_FILE if test 87 -ne `wc -c <'demo_src/frac/makefile'`; then echo shar: \"'demo_src/frac/makefile'\" unpacked with wrong size! fi # end of 'demo_src/frac/makefile' fi if test ! -d 'demo_src/sin' ; then echo shar: Creating directory \"'demo_src/sin'\" mkdir 'demo_src/sin' fi if test -f 'demo_src/sin/makefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'demo_src/sin/makefile'\" else echo shar: Extracting \"'demo_src/sin/makefile'\" \(82 characters\) sed "s/^X//" >'demo_src/sin/makefile' <<'END_OF_FILE' Xsin : sin.c X cc +ff +L +Ivd0:include/header.h sin.c X ln -o sin sin.o -lez -lm -lc END_OF_FILE if test 82 -ne `wc -c <'demo_src/sin/makefile'`; then echo shar: \"'demo_src/sin/makefile'\" unpacked with wrong size! fi # end of 'demo_src/sin/makefile' fi if test -f 'demo_src/sin/sin.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'demo_src/sin/sin.c'\" else echo shar: Extracting \"'demo_src/sin/sin.c'\" \(3150 characters\) sed "s/^X//" >'demo_src/sin/sin.c' <<'END_OF_FILE' X/* This program draws Lissajous curves. It is taken directly from the X * chapter 3 exercises in a book called _Computer Graphics: The Principles X * Behind the Art and Science_. That book is written by Pokorny & X * Gerald. X * X * Believe it or not the Amiga is actually mentioned in that book! ;^) X */ X X#include <stdio.h> X#include <math.h> X#include <ezlib.h> X X#define MAX 320 X Xdouble sin_tab[360], cos_tab[360]; X X/* first we allocate two screens, set up some colors and make sure that X * all worked. X * X * Then we fill in a table so we don't have keep calling the sin() function X * when draw the actual curves. X * X * Finally we scroll the picture off the screen using a simple double X * buffering technique. X */ X Xmain() X{ X register int i; X int j, count = 0; X double ang, step, hold_x, hold_y; X struct Screen *screen1, *screen2; X struct BitMap *bm1, *bm2; X struct RastPort *rp, *rp2; X X screen2 = makescreen(HIRES, 3); X if (screen2 == NULL) X exit(10L); X X setcolor(screen2, 0, BLACK); setcolor(screen2, 1, WHITE); X setcolor(screen2, 2, BLUE); setcolor(screen2, 5, GREEN); X setcolor(screen2, 3, PINK); setcolor(screen2, 4, ORANGE); X setcolor(screen2, 6, GREY); setcolor(screen2, 7, RED); X X screen1 = makescreen(HIRES, 3); X if (screen1 == NULL) X { killscreen(screen2); exit(10L); } X X setcolor(screen1, 0, BLACK); setcolor(screen1, 1, WHITE); X setcolor(screen1, 2, BLUE); setcolor(screen1, 5, GREEN); X setcolor(screen1, 3, PINK); setcolor(screen1, 4, ORANGE); X setcolor(screen1, 6, GREY); setcolor(screen1, 7, RED); X X rp = &screen1->RastPort; rp2 = &screen2->RastPort; X bm1 = &screen1->BitMap; bm2 = &screen2->BitMap; X X /* this loop fills up a table with a sine curve */ X /* the magic number 0.01745 is radians per degree */ X for(i=0; i < 360; i++) { X sin_tab[i] = sin(0.01745 * (double)i); X cos_tab[i] = cos(0.01745 * (double)i); X } X X step = (double)360 / (double)MAX; X Move(rp, 320, 100+90); X for(j=90; j > 30; j -= 2) { X ang = 0.0; X for(i=0; i < MAX; i++) { X hold_x = sin_tab[ (2 * (int)ang) % 360] * (double)j * 2.0; X hold_y = cos_tab[ (3 * (int)ang) % 360] * (double)j; X Draw(rp, 320+ (int)hold_x, 100+(int)hold_y); X ang = ang + step; X } X SetAPen(rp, (count++ % 8)); X } X X Delay(125); X X /* now the curve has been fully drawn to the screen. X * First we'll copy it to the second screen behind this one, then X * we'll double buffer it off the screen X */ X X /* scroll curve smoothly off the screen using double buffering */ X for(i=140; i > 4; i-=8) { X WaitTOF(); X BltBitMap(bm1, i,0, bm2, i-4,0, 380,200, 0x0c0,0xff); X ScreenToFront(screen2); X WaitTOF(); X BltBitMap(bm2, i-4,0, bm1, i-8,0, 380,200, 0x0c0,0xff); X ScreenToFront(screen1); X } X X /* reached left edge, so from here we do things slightly different X * than above X */ X for(i=2; i < 70 ; i++) { X WaitTOF(); X BltBitMap(bm1, i,0, bm2, 0,0, 380-i,200, 0x0c0,0xff); X ScreenToFront(screen2); X WaitTOF(); X BltBitMap(bm2, i,0, bm1, 0,0, 380-i,200, 0x0c0,0xff); X ScreenToFront(screen1); X } X X /* de-allocate everything and exit. Simple eh? ;^) */ X killscreen(screen1); X killscreen(screen2); X X closelibs(); X exit(0L); X} X END_OF_FILE if test 3150 -ne `wc -c <'demo_src/sin/sin.c'`; then echo shar: \"'demo_src/sin/sin.c'\" unpacked with wrong size! fi # end of 'demo_src/sin/sin.c' fi if test ! -d 'doc' ; then echo shar: Creating directory \"'doc'\" mkdir 'doc' fi if test -f 'doc/closelibs.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'doc/closelibs.doc'\" else echo shar: Extracting \"'doc/closelibs.doc'\" \(419 characters\) sed "s/^X//" >'doc/closelibs.doc' <<'END_OF_FILE' XFUNCTION closelibs() - close any previously opened libraries X X closelibs() X XThis function will close any previously opened libraries. If you can Xopen it with openlibs() - this function will close it. Doesn't take Xany parameters and all it does is call CloseLibrary() for each currently Xopened library. X X XTODO : Need to support the other libraries that I eventually support in X openlibs(). X X XBUGS : None. X X END_OF_FILE if test 419 -ne `wc -c <'doc/closelibs.doc'`; then echo shar: \"'doc/closelibs.doc'\" unpacked with wrong size! fi # end of 'doc/closelibs.doc' fi if test -f 'doc/create_boolgadget.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'doc/create_boolgadget.doc'\" else echo shar: Extracting \"'doc/create_boolgadget.doc'\" \(2082 characters\) sed "s/^X//" >'doc/create_boolgadget.doc' <<'END_OF_FILE' XFUNCTION create_boolgadget() - create a fully spec'ed Boolean gadget X Xstruct Gadget *create_boolgadget(l_edge, t_edge, flags, activation, text, id) X SHORT l_edge, t_edge; X USHORT flags, activation; X UBYTE *text; X USHORT id; X X This function gives you total control for easily creating boxed boolean Xgadgets of all types. You specify exactly the flags and activation types Xof the gadget and where the top corner should be, and the rest is taken Xcare of. The text you specify is centered in the gadget and the gadget has Xthe ID you give. X X You can specify any types of flags you would like, however not much Xerror checking is done on these values. Be careful for silly combinations. XYou should also remember that you MUST specify either GADGHBOX or GADGHCOMP Xfor the flags argument. It is also useful to at minimum specify RELVERIFY Xfor the Activation argument. Finally, you should make sure that your Xwindow is listening for Gadget messages (either gadget UP or gadget DOWN). X X This function will NOT add the gadget to your window. This is Xsomething you must do afterwards else you will never see your gadget. The Xonly thing this function does is to allocate space and return a pointer to Xthe properly filled out structure. X X The following example will create a boolean gadget at 100,25 Xwhich is highlighted by a box. The text inside the gadget will be X"Don't have a cow dude" and the gadget will have an id of 42. X X struct Window *win; /* assume opened earlier */ X struct Gadget *gadg; X char *string = "Don't have a cow dude"; X X gadg = create_boolgadget(100,25, GADGHBOX, RELVERIFY, string, 42); X if (gadg == NULL) X error_no_gadg(); X X /* add it to the window and make it appear */ X AddGadget(gadg, win, NULL); X RefreshGList(gadg, win, NULL, 1); X X XTODO : should provide a way for specifying custom imagery. Most likely X that will have to be a seperate call. X XBUGS : maybe, maybe not (preferably the latter). X XSEE ALSO : makeboolgadget(), killgadget(), getyn(), getstring(), X makewindow() X X END_OF_FILE if test 2082 -ne `wc -c <'doc/create_boolgadget.doc'`; then echo shar: \"'doc/create_boolgadget.doc'\" unpacked with wrong size! fi # end of 'doc/create_boolgadget.doc' fi if test -f 'doc/createwindow.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'doc/createwindow.doc'\" else echo shar: Extracting \"'doc/createwindow.doc'\" \(2118 characters\) sed "s/^X//" >'doc/createwindow.doc' <<'END_OF_FILE' XFUNCTION createwindow() - create a fully spec'ed Intuition window X X struct Window *createwindow(screen, flags, idcmp, X leftedge, topedge, X width, height) X struct Screen *screen; X ULONG flags, idcmp; X int leftedge, topedge, width, height; X X This function allows you the most flexibility over specifying a window. XEssentially, you can create any type of window you would like with this Xcall. Flags and idcmp are exactly as you would specify in a NewWindow Xstructure, and are passed directly through. If you specify screen as Xnon-NULL, the window will be opened on that screen. X X Some error checking of your position variables is done, however it is Xstill possible to screw yourself if you get too outlandish (like negative Xleftedge, etc). Keep this in mind if passing negative numbers could be a Xproblem. X X A pointer to the freshly created window will be returned, or NULL if Xthe window could not be opened. You should definitely error check the Xreturn from this function. X X To open a simple window with only a title bar, disk inserted messages Xfrom Intuition, at 100,50 and 200 pixels wide by 75 pixels high, you would Xdo the following : X X struct Window *win; X X win = createwindow(NULL, WINDOWDRAG, DISKINSERTED, 100,50, 200, 75) X if (win == NULL) X no_window(); X X The function call above simply asks for a window with a title bar, and Xan Intuition port to which DISKINSERTED messages will arrive. The window Xwould have a top corner at 100,50, and would be 200 pixels wide and 75 Xpixels high. X X Of course you can specify any combination of flags and idcmp messages. XYou must make sure they make sense to your application however. For Xexample it would not make much sense to ask for CLOSEWINDOW Intuition Xmessages if you have not asked for a Close Gadget in the flags variable. X X XTODO : probably should error check the flags/idcmp arguments and modify the X flags argument to agree with the idcmp arg. This would be to take X care of problems such as in the last paragraph. X XBUGS : bunny? X XSEE ALSO : makewindow(), makescreen() X X X X END_OF_FILE if test 2118 -ne `wc -c <'doc/createwindow.doc'`; then echo shar: \"'doc/createwindow.doc'\" unpacked with wrong size! fi # end of 'doc/createwindow.doc' fi if test -f 'doc/defines.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'doc/defines.doc'\" else echo shar: Extracting \"'doc/defines.doc'\" \(3968 characters\) sed "s/^X//" >'doc/defines.doc' <<'END_OF_FILE' XMACROS this file describes several macros that have been defined X in ezlib.h X X The file ezlib.h contains a few macros to 1) in general make life a Xlittle easier, and 2) to facilitate working with ez.lib. X X As mentioned in openlibs.doc, there are several numbers defined to Xspecify which libraries to open in a call to openlibs(). They are: X X #define GFX 0x001 X #define INTUI 0x002 X #define INTUITION 0x002 X #define ARP 0x004 X #define DFONT 0x008 X #define DISKFONT 0x008 X #define TRANSLATOR 0x010 X #define REXX 0x100 X X As you can see, they are readily or'ed together to open several X libraries at once. Not much else to say here. X X---------------------------------------------------------------------- X X Next there is the MSG() macro taken from an old Transactor. This is a Xsimple macro to put out a string onto whatever output stream may be Xattatched to your program (i.e. whether from WorkBench or the CLI). It is Xdefined as follows : X X #define MSG(a) (Write(Output(), a, strlen(a))) X X Again, it will simply dump out a string onto your output stream. Note Xthat it is NOT the same as a printf() call and does NOT take formatting Xarguments as does printf(). X X---------------------------------------------------------------------- X X X Following are macros to set the colors on a custom screen. Several X"colors" have also been defined. The macro is setcolor() and is called Xlike this : X X setcolor(screen, num, color) X XScreen is the pointer to your custom screen which you opened earlier with Xmakescreen() or similar. X XNum is the number of the color register you wish to set. The highest color Xregister which you can set is dependent on the depth of the depth (in Xbitplanes) of your screen. In any case, it will never be more than 32. X XColor is the actual color you wish to set. It is a number between 0 and X4,095. Essentially, only the first twelve (12) bits matter. The color Xdefined by your number is as follows: The first 4 bits (0-3) are BLUE. XThe next 4 bits (4-7) are GREEN, and the next 4 bits (8-11) are RED. To Xdefine a pure blue color, you would specify (in hex) 0x00f. A nice purple Xwould be (again in hex) 0xf0f. To save you the hassle of figuring out what Xcolor is what, I have defined the following colors in ezlib.h : X X BLACK WHITE RED GREEN BLUE YELLOW X PINK PURPLE GREY0 GREY1 GREY2 GREY3 X ORANGE INDIGO CYAN GOLD X X For example to set the background color of your screen to GREEN, all Xyou need do (after having opened a screen) is the following: X X setcolor(screen, 0, GREEN); X X For the curious, setcolor() calls SetRGB4(). X X---------------------------------------------------------------------- X X X The are 5 more #defines. They are : X X initgfx() - simply a call to openlibs(GFX) X closegfx() - simply a call to closelibs (be careful as X this will also close everything else) X X Print(rp, string) - Call this with a RastPort pointer and a X a string. That string will be printed X starting at the current pen location in X that RastPort. X X Circle(rp, x, y, rad) - Draw a circle at x,y with radius rad in the X rastport pointed to by rp. X X Line(rp, x1, y1, x2, y2) - Draw a line from x1,y1 to x2,y2. Believe it or X not, there is no function like this in Gfxlib. X You are supposed to Move() then Draw(). This X macro takes care of that for you. X X Remember, the last 3 "functions" are really just #defines, so there is Xno overhead in calling them. X X---------------------------------------------------------------------- X X X That about covers the ezlib.h file. I have also defined some Xfunctions and their return values, but not having an ANSI compiler I Xhaven't prototyped them. This would be a *very* good idea to do (so would Xgetting an ANSI compiler ;-). X X XTODO - can't think of anything X XBUGS - in a #define ? ;-) X X END_OF_FILE if test 3968 -ne `wc -c <'doc/defines.doc'`; then echo shar: \"'doc/defines.doc'\" unpacked with wrong size! fi # end of 'doc/defines.doc' fi if test -f 'doc/free_bitmap.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'doc/free_bitmap.doc'\" else echo shar: Extracting \"'doc/free_bitmap.doc'\" \(741 characters\) sed "s/^X//" >'doc/free_bitmap.doc' <<'END_OF_FILE' XFUNCTION free_bitmap() - Free up a previously allocated bitmap struct X X free_bitmap(bm, width, height) X struct BitMap *bm; X int width, height; X X This function will simply free up all the resources taken by the given Xbitmap. The BitMap structure itself is freed, and should no longer be used Xafter this function. X X Just make sure to call this function on a previously allocated bitmap, Xand not something like your custom screen bitmap. Preferably you would Xhave used something like getbitmap() to allocate the bitmap you wish to Xfree. X XTODO : maybe get rid of the width,height arguments? could calculate it X internally, but I might be off X XBUGS : roaches, ants, gnats, etc... X XSEE ALSO : getbitmap(), makescreen() X END_OF_FILE if test 741 -ne `wc -c <'doc/free_bitmap.doc'`; then echo shar: \"'doc/free_bitmap.doc'\" unpacked with wrong size! fi # end of 'doc/free_bitmap.doc' fi if test -f 'doc/getbitmap.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'doc/getbitmap.doc'\" else echo shar: Extracting \"'doc/getbitmap.doc'\" \(1244 characters\) sed "s/^X//" >'doc/getbitmap.doc' <<'END_OF_FILE' XFUNCTION getbitmap() - allocate and initialize an arbitrary bitmap X X struct BitMap *getbitmap(depth, width, height) X int depth, width, height; X X This function will return a pointer to a bitmap of your specified Xdepth, width, and height. It will return NULL if any of the memory Xallocations fail (of course taking care to free any memory it has already Xallocated). X X Note that the depth variable has a maximum value of 8. If you ask for Xmore, the call will fail immediately. X X In this example, we will allocate a secondary 3 bitplane bitmap of X100x75 pixels. This could be very useful for calls to BltBitMap() : X X struct BitMap *bm; X X bm = getbitmap(3, 100, 75); X if (bm == NULL) X no_bitmap(); X X /* continue doing stuff ... */ X X /* free up all that allocated memory */ X free_bitmap(bm, 100, 75); X X This call is basically useful for allocating backup storage for making Xcalls to BltBitMap() (or its cousins). Just remember to check the error Xreturn, and other than that you get a fully initialized and allocated Xbitmap structure to your specs! ;^) X XTODO : can't think of much else.... X XBUGS : what's up doc? X XELMER FUDD : come here you silly wabbit! X XSEE ALSO : free_bitmap(), makescreen() X END_OF_FILE if test 1244 -ne `wc -c <'doc/getbitmap.doc'`; then echo shar: \"'doc/getbitmap.doc'\" unpacked with wrong size! fi # end of 'doc/getbitmap.doc' fi if test -f 'doc/getfont.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'doc/getfont.doc'\" else echo shar: Extracting \"'doc/getfont.doc'\" \(2293 characters\) sed "s/^X//" >'doc/getfont.doc' <<'END_OF_FILE' XFUNCTION getfont() - open a disk font for use. X X struct TextFont *getfont(name size) X char *name; X int size; X X Getfont() gives you easy access to the disk based fonts of the Amiga. XAll you have to do is pass the name (a character string) of the font and Xthe size you would like. If opening the font succeeds, you will be able to Ximmediately SetFont(rp, text_font) in your current window and use it from Xthen on (with the Text() function). This function returns NULL if anything Xfails. X X The name you pass to getfont() can have a ".font" extension or not. If Xit doesn't, then it will be appended. Also be aware that if you specify a Xfull pathname for name, that font need NOT be in the current FONTS: Xdirectory. This is a little known but true fact. X X Size should simply be the point size of the font you want. For example Xif you want Times 17, you would use size == 17. X X To open a font called "helvetica" in a 23 point size you would do this: X X struct Window *wind; /* assume we opened it earlier */ X struct TextFont *tf; X X /* open the font and error check the result */ X tf = getfont("helvetica", 23); X if (tf == NULL) X no_font(); X X SetFont(wind->RPort, tf); /* from now on we can use the font */ X X ..... /* do other stuff */ X X CloseFont(tf); /* do this BEFORE calling killwindow() */ X X XNOTE : You should call CloseFont() before calling killwindow(). This will X prevent fonts from being kept in memory unnecessarily. It is best X if you can call CloseFont() as soon as you are done with the font. X This prevents wasting memory. X X X Essentially, there are 3 steps to using a disk font. Open the font Xwith getfont(). Then call SetFont() for the window/screen you wish to use Xthe font on. Then use the graphics library text routines for whatever you Xwant. Finally call CloseFont() when you are done. Nice and easy. X X X XTODO : should probably be some sort of resource tracking so that you don't X have to call CloseFont(). X X would be nice if there was a single call you could make to open and X set the font for a window (and then not have to worry about after X that because of the item above). X X XBUGS : ha! c'mon -(;-) (smiley with a mohawk!) X XSEE ALSO : makewindow(); makescreen(); X X END_OF_FILE if test 2293 -ne `wc -c <'doc/getfont.doc'`; then echo shar: \"'doc/getfont.doc'\" unpacked with wrong size! fi # end of 'doc/getfont.doc' fi if test -f 'doc/getstring.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'doc/getstring.doc'\" else echo shar: Extracting \"'doc/getstring.doc'\" \(2475 characters\) sed "s/^X//" >'doc/getstring.doc' <<'END_OF_FILE' XFUNCTION getstring() - Get a string from the user, using a window X X char *getstring(screen, title, def_string) X struct Screen *screen; X char *title; X char *def_string; X X This function will pop open a window to prompt the user for a string. XThe window has o.k. and cancel gadgets, and in addition, a Close gadget. XThe string you wish to get should be less than 256 characters (the default Xbuffer size). X X The screen argument is a pointer to a screen on which to open the Xnew window. The screen argument can be NULL in which case the window will Xsimply appear on the Workbench screen. The title argument will be the Xtitle of the new window. The def_string argument is a pointer to the Xdefault string that will appear in the string gadget. X X This function will return NULL if the user clicks the Close Gadget or Xclicks the cancel gadget. If they click the "OK" gadget or press return in Xthe string gadget, you will get a pointer to a string back. The string is Xdynamically allocated and you must free it when you are done with a call to XFreeMem() (see below). X X Here is an example that gets back the users name and prints it in the X CLI window. In this example, the window will appear on workbench, X have a window title "Please enter your name", and there will be no X default string. X X char *string; X X string = getstring(NULL, "Please enter your name", NULL); X X if (string == NULL) X printf("User does not have a name.\n"); X else { X printf("Your name is %s.\n", string); X X /* for this example we are done with the string, so we will free X * it now. X * !!!!!! ** NOTICE ** !!!!!! X * You should be very careful to make sure that you free the X * proper amount of memory using the following style call. X * The size you MUST free is the length of the string + 1. X * This is VERY IMPORTANT as otherwise you mess up memory. X */ X FreeMem(string, strlen(string)+1); X } /* ^^^^ The +1 is _very_ important! */ X X X Again, if you want this window to appear on a custom screen (opened by Xa call to makescreen() or similar) you should pass it the screen pointer Xinstead of NULL as the first argument. X X You should also check to make sure you didn't get back an empty string. X X X XTODO : Probably should (again) make this into a higher level routine with X lower level support routines. For now this works however. X XBUGS : None to the best of my knowledge. X XSEE ALSO : getyn(); makewindow() X END_OF_FILE if test 2475 -ne `wc -c <'doc/getstring.doc'`; then echo shar: \"'doc/getstring.doc'\" unpacked with wrong size! fi # end of 'doc/getstring.doc' fi if test -f 'doc/getyn.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'doc/getyn.doc'\" else echo shar: Extracting \"'doc/getyn.doc'\" \(1990 characters\) sed "s/^X//" >'doc/getyn.doc' <<'END_OF_FILE' XFUNCTION getyn() - get a yes or no answer using a requestor X X getyn(window, string) X struct Window *window; X char *string; X X This function will get a simple yes or no answer from a user. You pass Xgetyn() a string which is put into an AutoRequest(). If the user clicks Xo.k., TRUE is returned, otherwise FALSE. This function is useful in many Xsituations to just let the user know what is going on, and of course for Xyes/no questions. X X If you pass getyn() a NULL window pointer, it will return NULL to you. XIf for any reason the AutoRequest() can not be made, this function will Xalso return NULL. Therefore you should keep this in mind when you use Xgetyn(). Also note that if there isn't enough memory for a full XAutoRequest() (similar to the Insert Volume xxx requestors), the getyn() Xfunction will degenerate into a display alert (a recoverable guru box!). XThis can be scary for novice users, but only happens in *very* low memory Xconditions. X X The string you pass getyn() should fit horizontally on one line across Xthe display. If not, the AutoRequest() will not open and you will get XNULL back. X X Here is an example of using getyn() to find out if the user is really a Xweenie: X X struct Window *wind; /* assume it was opened earlier */ X int value; X X value = getyn(wind, " Are you a weenie? "); X if (value == TRUE) X user_is_a_weenie(); X else X user_is_cool(); X X X Likewise, if you would just like to inform the user that something has Xhappened or is about to happen, you can do the following: X X struct Window *wind; /* again, assume it was opened earlier */ X X /* doing some processing and something occurs */ X X getyn(wind, " Did you know that XXX just happened? "); X X /* keep going .... */ X X X XTODO : would be nice if you could do multi-line requestors using some X sort of embedded character to signify a line break. X XBUGS : None at time of publication. X XSEE ALSO : getstring(); makewin(); makescreen(); X X END_OF_FILE if test 1990 -ne `wc -c <'doc/getyn.doc'`; then echo shar: \"'doc/getyn.doc'\" unpacked with wrong size! fi # end of 'doc/getyn.doc' fi if test -f 'doc/killgadget.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'doc/killgadget.doc'\" else echo shar: Extracting \"'doc/killgadget.doc'\" \(1305 characters\) sed "s/^X//" >'doc/killgadget.doc' <<'END_OF_FILE' XFUNCTION killgadget() - Remove and de-allocate a gadget X X killgadget(win, gadg) X struct Window *win; X struct Gadget *gadg; X X This function will remove a gadget from your window and de-allocate all Xof its resources. After this call, gadg will be invalid and will no Xlonger appear in your window. X X Unfortunately this call is not orthogonal to the rest of the kill() Xfunctions, as it needs to know the window from whence it came (to be able Xto make the gadget go away). X X In case you would want to do this on your own, the memory that is freed Xis as follows (in reverse order from how it was allocated) : X X gadg->GadgetRender->XY : 10 * sizeof(SHORT) X gadg->GadgetRender : sizeof(struct Border) X gadg->IText : sizeof(struct IntuiText) X gadg : sizeof(struct Gadget) X X X You should make sure that any dynamically allocated text that may be in Xyour gadget is managed properly (by having a backup pointer or freeing it Xbefore this call). X X After this call, the specified gadget should no longer appear in your Xwindow. X XTODO : maybe not require the window pointer. could stuff the value in the X user data field, but then the user can't use that field. X XBUGS : shouldn't be X XSEE ALSO : makeboolgadet(), create_boolgadget(), getyn(), getstring() X X END_OF_FILE if test 1305 -ne `wc -c <'doc/killgadget.doc'`; then echo shar: \"'doc/killgadget.doc'\" unpacked with wrong size! fi # end of 'doc/killgadget.doc' fi if test -f 'doc/killscreen.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'doc/killscreen.doc'\" else echo shar: Extracting \"'doc/killscreen.doc'\" \(1213 characters\) sed "s/^X//" >'doc/killscreen.doc' <<'END_OF_FILE' XFUNCTION killscreen() - (safely) Close a previously opened screen X X killscreen(screen) X struct Screen *screen; X X This function will close the screen you pass it. If the screen has a Xdepth of greater than 2 (depth > 2) the bitmap data will be freed also. If Xyou have changed the screen->ExtData field from what it originally was Xjust after you called makescreen(), you should put it back to the Xoriginal value BEFORE you make this call. (The ExtData field points to Xthe BitMap structure that was allocated when creating the screen - and Xnote: this is not the same BitMap structure that is in your Screen struct). X X If there are any windows left on the screen, this function will Xwait for them to go away before closing. Note that killscreen() will Xkeep waiting forever until the windows are gone, so make sure that any Xwindows without close gadgets/menus on them are closed before you call Xthis. Else you will be in an infinite (but slow) loop. The point Xhere is that if you have a borderless backdrop window on a screen, and Xyou call killscreen() - you are screwed, glued, and tatooed unless Xsomeone else closes that window for you. X X XTODO : nothing X XBUGS : nope. X XSEE ALSO : killwindow() X X X END_OF_FILE if test 1213 -ne `wc -c <'doc/killscreen.doc'`; then echo shar: \"'doc/killscreen.doc'\" unpacked with wrong size! fi # end of 'doc/killscreen.doc' fi if test -f 'doc/killwindow.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'doc/killwindow.doc'\" else echo shar: Extracting \"'doc/killwindow.doc'\" \(912 characters\) sed "s/^X//" >'doc/killwindow.doc' <<'END_OF_FILE' XFUNCTION killwindow() - (safely) Close a previoulsy opened window X X killwindow(window) X struct Window *window; X X This function will close the window you pass it. If you have menus Xattatched to the window, they will be cleared before the window closes. XHowever if you have already cleared the menus yourself (with XClearMenuStrip() ), then you must NULL out the window->MenuStrip field Xbefore you call killwindow(). X X There are no return values from this function. X X It is safe to pass a NULL pointer to this function (it checks for Xthat). This function will also reply to any existing messages that are at Xyour window->UserPort (making it safe to call anytime). X XTODO : Not really much else I can do. Might possibly want to do some sort X of resource tracking using the UserData field (for gadgets etc). X XBUGS : you kidding? ;-) X XSEE ALSO : makewindow(); killscreen(); makescreen(); X X X END_OF_FILE if test 912 -ne `wc -c <'doc/killwindow.doc'`; then echo shar: \"'doc/killwindow.doc'\" unpacked with wrong size! fi # end of 'doc/killwindow.doc' fi if test -f 'doc/laced_wb.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'doc/laced_wb.doc'\" else echo shar: Extracting \"'doc/laced_wb.doc'\" \(335 characters\) sed "s/^X//" >'doc/laced_wb.doc' <<'END_OF_FILE' XFUNCTION laced_wb() - Return true/false if WB is interlaced or not X X int laced_wb() X X This function will return TRUE if the current Workbench screen is Xinterlaced, or FALSE if the current Workbench screen is non-interlaced. X XTODO : what else could there be for this one? X XBUGS : ha! X XSEE ALSO : makewindow(), makescreen() X END_OF_FILE if test 335 -ne `wc -c <'doc/laced_wb.doc'`; then echo shar: \"'doc/laced_wb.doc'\" unpacked with wrong size! fi # end of 'doc/laced_wb.doc' fi if test -f 'doc/makeboolgadget.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'doc/makeboolgadget.doc'\" else echo shar: Extracting \"'doc/makeboolgadget.doc'\" \(2662 characters\) sed "s/^X//" >'doc/makeboolgadget.doc' <<'END_OF_FILE' XFUNCTION makeboolgadget() - create an autosizing boolean gadget X X struct Gadget *makeboolgadget(win, l_edge, t_edge, text, id) X struct Window *win; X SHORT l_edge, t_edge; X UBYTE *text; X USHORT id; X X This function will create a boolean gadget in your window. The gadget Xwill have your specified text, and id. The size is calculated Xautomatically to nicely fit the given text (although there is a minimum Xsize of 30 pixels). The return value is a pointer to the created gadget. XYou should keep this pointer so that you can later remove the gadget with a Xcall to killgadget(). X X The gadget returned is dynamically allocated, so take care to call Xkillgadget() when you are done with the gadget. Note that you should call Xkillgadget() before you call killwindow(). X X The created gadget will have the id you specify so that you will be Xable to determine from your Intuition messages which gadget was pressed. XYou should take care to make sure that you will receive the GADGETUP Xmessages in your window. Windows created with makewindow() do not receive Xthese types of messages, however, you can use the Intuition function XModifyIDCMP() to change this behavior. X X The gadgets created by this call are simple box affairs with the Xhighlight mode set to COMPLEMENT. The text is centered and should be Xoffset nicely. The gadgets are not crowded or otherwise unsightly, except Xfor being rather plain. X X To create a boolean gadget with the text "Click Me", you would do the Xfollowing (assuming an already opened window) : X X struct Window *win; /* opened beforehand */ X struct Gadget *click_me; X X click_me = makeboolgadget(win, 100, 25, "Click Me", 43); X X /* do whatever we want (i.e. main loop, etc...) */ X X /* free up gadget resources (i.e. memory) */ X killgadget(win, click_me); X X The previous code will create and cause to be displayed an autosized Xboolean gadget at 100, 25 which contains the text "Click Me", and has a Xgadget ID of 43. makeboolgadget() WILL take care of making sure the Xgadget is displayed, so you need not do anything after the return from the Xfunction. You should however keep track of the allocated gadgets so that Xyou can properly free their allocated memory. X X For the curious, this function calls the lower level function Xcreate_boolgadget() with appropriate values. It then calls AddGList() and XRefreshGList() to cause the gadget to display. X XTODO : Really need to make the gadgets more 3d'ish. They look kinda plain X now. X XBUGS : could be, but none that I've seen (fingers crossed) X XSEE ALSO : create_boolgadget(), killgadget(), makewindow(), getyn(), X getstring() X END_OF_FILE if test 2662 -ne `wc -c <'doc/makeboolgadget.doc'`; then echo shar: \"'doc/makeboolgadget.doc'\" unpacked with wrong size! fi # end of 'doc/makeboolgadget.doc' fi if test -f 'doc/makescreen.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'doc/makescreen.doc'\" else echo shar: Extracting \"'doc/makescreen.doc'\" \(2593 characters\) sed "s/^X//" >'doc/makescreen.doc' <<'END_OF_FILE' XFUNCTION makescreen() - Easily create a custom screen X X struct Screen *makescreen(modes, depth) X int modes; X int depth; X X This function will create a custom screen of the specified modes and Xdepth for you. makescreen() will return NULL if something couldn't be Xallocated or created. Check the return value to make sure you have a Xvalid screen pointer. Valid modes are defined in graphics/view.h. The Xmore common ones are : X X LORES - open a 320x200 screen X HIRES - open a hires (640 pixels across) screen X LACE - make the screen interlace (400 vertical lines) X EXTRA_HALFBRITE - specify extra half bright mode (64 colors) X HAM - make a HAM (hold and modify) 4096 color screen. X X If you specify NULL for modes, you will get a standard 320x200 screen. X X Some checking is done to make sure that you don't screw yourself. XIf graphics.library and intuition.library aren't opened before you call Xthis function, they WILL be opened for you. X X If you specify a depth of greater than 2 (depth > 2), the bitmap data Xyou need will be allocated. However, the ExtData field of the screen Xstructure will be used to hold some information needed for later when you Xcall killscreen(). This is a warning that you should not use the Xscreen->ExtData field, or if you do, you should save its value and put it Xback BEFORE you call killscreen(). X X Also be advised that some programs illegally modify the Xscreen->UserData field of your PRIVATE custom screen. QMouse was caught Xblatantly doing this horrendous crime (at least as far as I could tell). XThis is definitely a bug in QMouse, but since I really like QMouse, I Xchanged Ez.lib to use the screen->ExtData field. BTW, you wanna talk about Xa hard to find bug, try tracking that one down! X X To open a HIRES 3 bitplane screen you would do the following : X X struct Screen *screen; X X screen = makescreen(HIRES, 3); X if (screen == NULL) X no_screen(); X X To open a LORES (320x200) 5 bitplane screen, do this : X X struct Screen *screen; X X screen = makescreen(LORES, 5); X if (screen == NULL) X no_screen(); X X To open a LORES, interlaced, extra half-brite screen of X 6 bitplanes, do this : X X struct Screen *screen; X X screen = makescreen(LORES|LACE|EXTRA_HALFBRITE, 6); X if (screen == NULL) X no_screen(); X X XTODO : maybe more error checking on the modes field. Everything should be X covered however. Probably should #define LORES 0 in lib.h so that X the calls to makescreen are more readable. X XBUGS : None X XSEE ALSO : killscreen(screen); makewindow(); X X X X END_OF_FILE if test 2593 -ne `wc -c <'doc/makescreen.doc'`; then echo shar: \"'doc/makescreen.doc'\" unpacked with wrong size! fi # end of 'doc/makescreen.doc' fi if test -f 'doc/makewindow.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'doc/makewindow.doc'\" else echo shar: Extracting \"'doc/makewindow.doc'\" \(1855 characters\) sed "s/^X//" >'doc/makewindow.doc' <<'END_OF_FILE' XFUNCTION makewindow() - Easily create an Intution window X X struct Window *makewindow(screen, leftedge, topedge, width, height) X struct Screen *screen; X int leftedge, topedge; X int width, height; X X X This function will open a standard Intuition window for you. You Xspecify a screen pointer if you would like this window to appear on a Xcustom screen or NULL if you would like it to appear on the workbench. The Xleftedge, topedge, width, and height variables specify the new window's Xdimensions. They are error checked for sanity. X X The window that is opened has a Close Gadget, TitleBar, Depth Gadget, Xand a Sizing Gadget. The window is also SMART_REFRESH, therefore you Xdon't have to worry about refreshing your display. This is a very high Xlevel routine, that doesn't give you much flexibility over the appearance Xof the window, but quickly and painlessly gets you a window. X X Since there is a Close Gadget on this window, you will receive XIntuition messages (which you can safely ignore if you want). However it Xis better if you do check to see if the user has clicked the Close Gadget Xin that window. NOTE: the flags which this window is opened with will only Xsend you a CLOSEWINDOW Intuition Message. If you wish to receive other Xwindow messages (like DISKINSERTED or something), you should use XModifyIDCMP() to tell Intuition you want those messages. X X X Final note, if graphics.library and intuition.library haven't been Xopened yet, this routine will open them for you. X X X This example opens a 200x100 window at 0, 0 on the workbench screen: X X struct Window *window; X X window = makewindow(NULL, 0,0, 200, 100); X if (window == NULL) X no_window() X X X XTODO : none at the moment. Lets hope software rot doesn't set in. X XBUGS : none that I know of. X XSEE ALSO : killwindow(); makescreen(); killscreen(); X X END_OF_FILE if test 1855 -ne `wc -c <'doc/makewindow.doc'`; then echo shar: \"'doc/makewindow.doc'\" unpacked with wrong size! fi # end of 'doc/makewindow.doc' fi if test -f 'doc/openlibs.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'doc/openlibs.doc'\" else echo shar: Extracting \"'doc/openlibs.doc'\" \(1890 characters\) sed "s/^X//" >'doc/openlibs.doc' <<'END_OF_FILE' XFUNCTION openlibs() - Easily open any of several system libraries X X openlibs( which_ones ) X int which_ones; X X This function takes an integer argument which specifies which libraries Xyou would like to have opened for your program. The libraries you can open Xare: X X GFX : graphics.library X INTUI or INTUITION : intuition.library X DFONT or DISKFONT : diskfont.library X ARP : arp.library X TRANSLATOR : translator.library X REXX : rexxsyslib.library X X XThese values are simply numeric #define's, which can be or'ed together. X X XTo open the graphics.library, you would simply do the following: X X success = openlibs(GFX); X if (success == NULL) X deal_with_failure(); X XYou can open multiple libraries with a single call by doing the following: X X success = openlibs(GFX | ARP | INTUITION | DISKFONT); X if (success == NULL) X deal_with_failure(); X X The above opens the graphics.library, arp.library, intuition.library, Xand diskfont.library all in a single call. X X If any of the libraries fail to open, openlibs() will print an error Xmessage to your output stream saying which library didn't open and it Xwill return NULL. X X openlibs() will close any libraries it opened if a succesive XOpenLibrary() call fails. Therefore, you don't have to worry about opened Xlibraries sitting around and never being closed. This is to say that if Xyou ask for GFX | INTUI | ARP, and graphics.library and intuition.library Xopen, but arp.library doesn't, graphics and intuition will be closed down Xfor you and NULL returned. X X X XTODO : Shouldn't be much else. Maybe a way to add more libraries that X can be opened without having to recompile. Possibly a name/variable X combo.... X XBUGS : can only support 32 different libraries to be opened. That's not X too much of a restriction, but it still is one. X X END_OF_FILE if test 1890 -ne `wc -c <'doc/openlibs.doc'`; then echo shar: \"'doc/openlibs.doc'\" unpacked with wrong size! fi # end of 'doc/openlibs.doc' fi if test -f 'ezlib.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'ezlib.h'\" else echo shar: Extracting \"'ezlib.h'\" \(1698 characters\) sed "s/^X//" >'ezlib.h' <<'END_OF_FILE' X/* Header file for use with ez.lib */ X X#define GFX 0x001 X#define INTUI 0x002 X#define INTUITION 0x002 X#define ARP 0x004 X#define DFONT 0x008 X#define DISKFONT 0x008 X#define TRANSLATOR 0x010 X#define ICONBASE 0x080 X#define REXX 0x100 X X#define MSG(a) (Write(Output(), a, strlen(a))) X Xstruct Screen *makescreen(); Xstruct Window *makewindow(); Xstruct Window *createwindow(); Xstruct Gadget *makeboolgadget(); Xstruct Gadget *create_boolgadget(); Xstruct BitMap *getbitmap(); Xstruct TextFont *getfont(); Xchar *getstring(); X X/* these functions (and closelibs()) should properly be void, however X * manx 3.6a seems to think I'm redeclaring the function when a function X * is defined here as void. As int it works fine.... X */ Xint killscreen(); Xint killwindow(); Xint free_bitmap(); Xint getyn(); Xint openlibs(); Xint closelibs(); X X#define setcolor(screen, num, color) (SetRGB4(&screen->ViewPort, num, (0x0f00&color)>>8, (0x00f0&color)>>4, (0x000f&color) )) X#define BLACK 0x0000 X#define WHITE 0x0fff X#define RED 0x0f00 X#define GREEN 0x00f0 X#define BLUE 0x000f X#define YELLOW 0x0ff0 X#define CYAN 0x00ff X#define PINK 0x0f09 X#define PURPLE 0x0f0f X#define GREY0 0x0ccc X#define GREY 0x0aaa X#define GREY1 0x0888 X#define GREY2 0x0666 X#define GREY3 0x0444 X#define GOLD 0x0ea1 X#define ORANGE 0x0f70 X#define INDIGO 0x070e X X#define initgfx() (openlibs(GFX)) X#define closegfx() (closelibs()) X X#define Print(rp, b) (Text(rp, b, strlen(b))) X#define Line(rp, a, b, c, d) { Move(rp, a, b); Draw(rp, c, d); } X#define Circle(rp, x, y, rad) (DrawEllipse(rp, x, y, rad, rad)) X X/* just a quickie to make calls to makescreen() a little more clear */ X#define LORES 0x0000 X END_OF_FILE if test 1698 -ne `wc -c <'ezlib.h'`; then echo shar: \"'ezlib.h'\" unpacked with wrong size! fi # end of 'ezlib.h' fi if test ! -d 'src' ; then echo shar: Creating directory \"'src'\" mkdir 'src' fi if test -f 'src/ezlib.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'src/ezlib.h'\" else echo shar: Extracting \"'src/ezlib.h'\" \(1659 characters\) sed "s/^X//" >'src/ezlib.h' <<'END_OF_FILE' X#define GFX 0x001 X#define INTUI 0x002 X#define INTUITION 0x002 X#define ARP 0x004 X#define DFONT 0x008 X#define DISKFONT 0x008 X#define TRANSLATOR 0x010 X#define ICONBASE 0x080 X#define REXX 0x100 X X#define MSG(a) (Write(Output(), a, strlen(a))) X Xstruct Screen *makescreen(); Xstruct Window *makewindow(); Xstruct Window *createwindow(); Xstruct Gadget *makeboolgadget(); Xstruct Gadget *create_boolgadget(); Xstruct BitMap *getbitmap(); Xstruct TextFont *getfont(); Xchar *getstring(); X X/* these functions (and closelibs()) should properly be void, however X * manx 3.6a seems to think I'm redeclaring the function when a function X * is defined here as void. As int it works fine.... X */ Xint killscreen(); Xint killwindow(); Xint free_bitmap(); Xint getyn(); Xint openlibs(); Xint closelibs(); X X#define setcolor(screen, num, color) (SetRGB4(&screen->ViewPort, num, (0x0f00&color)>>8, (0x00f0&color)>>4, (0x000f&color) )) X#define BLACK 0x0000 X#define WHITE 0x0fff X#define RED 0x0f00 X#define GREEN 0x00f0 X#define BLUE 0x000f X#define YELLOW 0x0ff0 X#define CYAN 0x00ff X#define PINK 0x0f09 X#define PURPLE 0x0f0f X#define GREY0 0x0ccc X#define GREY 0x0aaa X#define GREY1 0x0888 X#define GREY2 0x0666 X#define GREY3 0x0444 X#define GOLD 0x0ea1 X#define ORANGE 0x0f70 X#define INDIGO 0x070e X X#define initgfx() (openlibs(GFX)) X#define closegfx() (closelibs()) X X#define Print(rp, b) (Text(rp, b, strlen(b))) X#define Line(rp, a, b, c, d) { Move(rp, a, b); Draw(rp, c, d); } X#define Circle(rp, x, y, rad) (DrawEllipse(rp, x, y, rad, rad)) X X/* just a quickie to make calls to makescreen() a little more clear */ X#define LORES 0x0000 X END_OF_FILE if test 1659 -ne `wc -c <'src/ezlib.h'`; then echo shar: \"'src/ezlib.h'\" unpacked with wrong size! fi # end of 'src/ezlib.h' fi if test -f 'src/gadg.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'src/gadg.c'\" else echo shar: Extracting \"'src/gadg.c'\" \(989 characters\) sed "s/^X//" >'src/gadg.c' <<'END_OF_FILE' X#include "ezlib.h" X Xmain() X{ X struct Window *win; X struct Gadget *test, *test2; X struct IntuiMessage *msg, *GetMsg(); X int id; X X win = makewindow(NULL, 0, 0, 300, 100); X if (win == NULL) X exit(10); X X test = makeboolgadget(win, 100, 25, "Hey there!", 43); X test2 = create_boolgadget(100, 50, GADGHBOX, RELVERIFY, "X", 44); X AddGadget(win, test2, (USHORT)~0); X RefreshGadgets(test2, win, NULL); X X ModifyIDCMP(win, CLOSEWINDOW|GADGETUP); X X while(1) { X WaitPort(win->UserPort); X msg = GetMsg(win->UserPort); X X switch(msg->Class){ X case GADGETUP : id = ((struct Gadget*)msg->IAddress)->GadgetID; X if (id == 43){ X Move(win->RPort, 50, 50); X Print(win->RPort, "Got a click!"); X } X else if (id == 44) { X Move(win->RPort, 80, 20); X Print(win->RPort, "Hehehehehehee"); X } X X break; X X case CLOSEWINDOW : killgadget(win, test); X killgadget(win, test2); X killwindow(win); X exit(0); X X default : break; X } X ReplyMsg(msg); X } X} X END_OF_FILE if test 989 -ne `wc -c <'src/gadg.c'`; then echo shar: \"'src/gadg.c'\" unpacked with wrong size! fi # end of 'src/gadg.c' fi if test -f 'src/gadget.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'src/gadget.c'\" else echo shar: Extracting \"'src/gadget.c'\" \(3247 characters\) sed "s/^X//" >'src/gadget.c' <<'END_OF_FILE' X#include "ezlib.h" X Xextern struct GfxBase *GfxBase; Xvoid *AllocMem(); X X/* These functions deal with gadgets and adding them to your window */ X Xstruct Gadget *create_boolgadget(l_edge, t_edge, flags, activation, text, id) X SHORT l_edge, t_edge; X USHORT flags, activation; X UBYTE *text; X USHORT id; X{ X struct Gadget *gadg = NULL; X struct IntuiText *i_text = NULL; X struct Border *bord = NULL; X int i,j; X X if ( (flags & GADGHIMAGE) != NULL) X return NULL; X X if ( (flags & GADGHBOX) == NULL && (flags & GADGHCOMP) == NULL) X flags |= GADGHCOMP; X X /* get everything allocated first, and fail if any of this does */ X gadg = (struct Gadget *) AllocMem(sizeof(struct Gadget), MEMF_CLEAR); X i_text = (struct IntuiText*) AllocMem(sizeof(struct IntuiText), MEMF_CLEAR); X bord = (struct Border *) AllocMem(sizeof(struct Border), MEMF_CLEAR); X if (bord) X bord->XY = (SHORT *)AllocMem(10 * sizeof(SHORT), 0L); X X if (gadg == NULL || i_text == NULL || bord == NULL || bord->XY == NULL){ X if (gadg) X FreeMem(gadg, sizeof(struct Gadget)); X if (i_text) X FreeMem(i_text, sizeof(struct IntuiText)); X if (bord) { X if (bord->XY) X FreeMem(bord->XY, 10*sizeof(SHORT)); X FreeMem(bord, sizeof(struct Border)); X } X return NULL; X } X X /* do some generic setup stuff */ X gadg->LeftEdge = l_edge; gadg->TopEdge = t_edge; X gadg->Flags = flags; gadg->Activation = activation; X gadg->GadgetID = id; gadg->GadgetType = BOOLGADGET; X gadg->GadgetText = i_text; gadg->GadgetRender = (APTR)bord; X X /* fill in the Itext struct */ X i_text->FrontPen = 2; i_text->DrawMode = JAM1; X i_text->LeftEdge = 10; i_text->TopEdge = 3; X i_text->IText = text; X X /* calculate where the box should be and fill in the border struct */ X bord->LeftEdge = -1; bord->TopEdge = -1; X bord->FrontPen = 1; bord->BackPen = 0; X bord->DrawMode = JAM1; bord->Count = 5; X X /* here we calculate where everything should go... */ X i = IntuiTextLength(i_text) + 22; X if (i < 30) X i = 30; X j = GfxBase->DefaultFont->tf_YSize + 6; X X bord->XY[0] = 0; bord->XY[1] = 0; X bord->XY[2] = i; bord->XY[3] = 0; X bord->XY[4] = i; bord->XY[5] = j; X bord->XY[6] = 0; bord->XY[7] = j; X bord->XY[8] = 0; bord->XY[9] = 0; X gadg->Width = i - 1; gadg->Height = j - 1; X X return gadg; X} X X Xstruct Gadget *makeboolgadget(window, l_edge, t_edge, text, id) X struct Window *window; X SHORT l_edge, t_edge; X UBYTE *text; X USHORT id; X{ X USHORT flags, activation; X struct Gadget *gadg; X X flags = GADGHCOMP; X activation = RELVERIFY; X X gadg = create_boolgadget(l_edge, t_edge, flags, activation, text, id); X if (gadg == NULL) X return NULL; X X AddGadget(window, gadg, (USHORT)~0); X RefreshGList(gadg, window, NULL, 1); X X return gadg; X} X X X/* this routine will free up the gadget for you */ X Xkillgadget(win, gadg) X struct Window *win; X struct Gadget *gadg; X{ X int i; X X RemoveGadget(win, gadg); X RefreshGadgets( win->FirstGadget, win, NULL); X X FreeMem(((struct Border *)gadg->GadgetRender)->XY, 10*sizeof(SHORT)); X FreeMem(gadg->GadgetRender, sizeof(struct Border)); X FreeMem(gadg->GadgetText, sizeof(struct IntuiText)); X FreeMem(gadg, sizeof(struct Gadget)); X} X END_OF_FILE if test 3247 -ne `wc -c <'src/gadget.c'`; then echo shar: \"'src/gadget.c'\" unpacked with wrong size! fi # end of 'src/gadget.c' fi if test -f 'src/getfont.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'src/getfont.c'\" else echo shar: Extracting \"'src/getfont.c'\" \(1456 characters\) sed "s/^X//" >'src/getfont.c' <<'END_OF_FILE' X/* This file contains a routine to open a disk based font. It returns X * a pointer to a TextFont structure, which if isn't NULL can be immediatly X * SetFont()'ed into your rastport. X * X * It tries to be smart about font names taking care if you didn't append X * a ".font" to the font name. X */ X X#include "ezlib.h" X Xextern struct Library *DiskfontBase; X Xvoid *AllocMem(); X Xstruct TextFont *getfont( name, size ) X char *name; X int size; X{ X struct Library *OpenLibrary(); X struct TextFont *OpenDiskFont(); X struct TextFont *txfont; X struct TextAttr txattr; X LONG len; X char *fontname, *test, *ext = ".font", *rindex(); X UBYTE pre_opened=FALSE; X X if (DiskfontBase < 100) X DiskfontBase = (struct Library *)OpenLibrary("diskfont.library",0L); X else X pre_opened = TRUE; X X if (DiskfontBase == NULL) /* just a quickie failsafe.... */ X return NULL; X X len = strlen(name) + 6; X fontname = (char *)AllocMem(len, 0L); X if (fontname == NULL) X return NULL; X X strcpy(fontname, name); X test = rindex(fontname, '.'); X /* if true, then they are not equal */ X if (test == NULL || strcmp(test, ext)) X strcat(fontname, ext); X X txattr.ta_Name = (STRPTR)fontname; X txattr.ta_YSize = (UWORD)size; X txattr.ta_Style = FS_NORMAL; X txattr.ta_Flags = FPF_DISKFONT; X X txfont = OpenDiskFont(&txattr); X X FreeMem(fontname, len); X if (pre_opened == FALSE) { X CloseLibrary(DiskfontBase); X DiskfontBase = NULL; X } X return txfont; X} X END_OF_FILE if test 1456 -ne `wc -c <'src/getfont.c'`; then echo shar: \"'src/getfont.c'\" unpacked with wrong size! fi # end of 'src/getfont.c' fi if test -f 'src/getyn.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'src/getyn.c'\" else echo shar: Extracting \"'src/getyn.c'\" \(1418 characters\) sed "s/^X//" >'src/getyn.c' <<'END_OF_FILE' X/* This function will get a yes or no answer from a users. It tries X * to be smart about how it opens the autorequest(). X * X * Also you should know that this some of this code came from the DME X * source code of the same function. However I have changed it a fair X * amount.... X */ X X#include "ezlib.h" X Xvoid *AllocMem(); X Xgetyn(win, text) Xstruct Window *win; Xchar *text; X{ X int result, width; X struct IntuiText *body, *pos, *neg; X X if (win <= 100) /* quick sanity check */ X return NULL; X X /* this is a sneaky way to only have to do a single AllocMem instead X * of 3 seperate ones (each with error checking). X */ X body = (struct IntuiText *)AllocMem( (3*sizeof(struct IntuiText)), MEMF_CLEAR); X if (body == NULL) X return NULL; X X pos = &body[1]; neg = &body[2]; X X body->BackPen = pos->BackPen = neg->BackPen = 1; X body->DrawMode = pos->DrawMode = neg->DrawMode = AUTODRAWMODE; X body->LeftEdge = 10; X body->TopEdge = 12; X body->IText = (UBYTE *)text; X pos->LeftEdge = pos->TopEdge = AUTOTOPEDGE; X pos->IText = (UBYTE *)" OK "; X neg->LeftEdge = neg->TopEdge = AUTOTOPEDGE; X neg->IText = (UBYTE *)" CANCEL"; X X width = IntuiTextLength(body) + 50; X if (width < 150) X width = 225; X result = AutoRequest(win, body, pos, neg, 0, 0, width, 58); X FreeMem(body, (3*sizeof(struct IntuiText))); X X return(result); X} X END_OF_FILE if test 1418 -ne `wc -c <'src/getyn.c'`; then echo shar: \"'src/getyn.c'\" unpacked with wrong size! fi # end of 'src/getyn.c' fi if test ! -d 'src/include' ; then echo shar: Creating directory \"'src/include'\" mkdir 'src/include' fi if test -f 'src/include/includes.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'src/include/includes.h'\" else echo shar: Extracting \"'src/include/includes.h'\" \(629 characters\) sed "s/^X//" >'src/include/includes.h' <<'END_OF_FILE' X#include <ctype.h> X#include <exec/exec.h> X#include <libraries/dos.h> X#include <libraries/dosextens.h> X/**************** NOT NEEDED #include <libraries/arpbase.h> *************/ X#include <graphics/rastport.h> X#include <graphics/text.h> X#include <graphics/view.h> X#include <graphics/gfx.h> X#include <graphics/gfxbase.h> X#include <graphics/gfxmacros.h> X#include <intuition/intuition.h> X#include <intuition/intuitionbase.h> X#include <intuition/preferences.h> X#include <intuition/screens.h> X/***************** NOT NEEDED #include <arpfunctions.h>****************/ X#include <workbench/workbench.h> X#include <workbench/startup.h> X X END_OF_FILE if test 629 -ne `wc -c <'src/include/includes.h'`; then echo shar: \"'src/include/includes.h'\" unpacked with wrong size! fi # end of 'src/include/includes.h' fi if test -f 'src/makefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'src/makefile'\" else echo shar: Extracting \"'src/makefile'\" \(1411 characters\) sed "s/^X//" >'src/makefile' <<'END_OF_FILE' X# this is a somewhat stupid makefile. I still haven't learned the X# subtleties of the .c.o rules... sigh X# X# This will compile and make the library. I make use of a pre-compiled X# header file as it makes compile times *much* faster. Everything should X# work as is if you have to rebuild the library (at least I hope so). X# X# Oh BTW, the demo that is in the directory above this one is created in X# this makefile. This is to test out the library, and if you make changes X# you should make sure that the demo still works X# X X# header.h is actually the precompiled header file XCFLAGS = +L +Iinclude/header.h X XOBJS= getstring.o getfont.o getyn.o gadget.o window.o screen.o openlibs.o X Xall : demo ez.lib include/header.h X Xinclude/header.h : include/includes.h X cc +L +Hinclude/header.h includes.h X Xdemo : ez.lib demo.o X ln -o demo demo.o ez.lib -lc X Xdemo.o : demo.c X cc $(CFLAGS) demo.c X Xez.lib : $(OBJS) X lb ez $(OBJS) X Xopenlibs.o : openlibs.c ezlib.h X cc $(CFLAGS) openlibs.c X Xscreen.o : screen.c ezlib.h X cc $(CFLAGS) screen.c X Xwindow.o : window.c ezlib.h X cc $(CFLAGS) window.c X Xgadget.o : gadget.c ezlib.h X cc $(CFLAGS) gadget.c X Xgetyn.o : getyn.c ezlib.h X cc $(CFLAGS) getyn.c X Xgetfilename.o : getfilename.c ezlib.h X cc $(CFLAGS) getfilename.c X Xgetfont.o : getfont.c ezlib.h X cc $(CFLAGS) getfont.c X Xgetstring.o : getstring.c ezlib.h X cc $(CFLAGS) getstring.c X END_OF_FILE if test 1411 -ne `wc -c <'src/makefile'`; then echo shar: \"'src/makefile'\" unpacked with wrong size! fi # end of 'src/makefile' fi if test -f 'src/openlibs.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'src/openlibs.c'\" else echo shar: Extracting \"'src/openlibs.c'\" \(2268 characters\) sed "s/^X//" >'src/openlibs.c' <<'END_OF_FILE' X/* This file contains the routines for opening and closing libraries. X * Notice that all the library bases are defined here. You can access X * them in your code if you wish, but they are defined here. X * X * Oh, it *is* important that they be initialized to zero. X */ X X#include "ezlib.h" X Xstruct GfxBase *GfxBase = NULL; Xstruct IntuitionBase *IntuitionBase = NULL; Xstruct Library *DiskfontBase = NULL; Xstruct ArpBase *ArpBase = NULL; Xstruct Library *TranslatorBase = NULL; Xstruct RxsLib *RexxSysBase = NULL; Xvoid *OpenLibrary(); X Xopenlibs( which_ones ) X register int which_ones; X{ X register int errs = NULL; X X if (which_ones & GFX) X if ( (GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0L)) == NULL) X { MSG("No Graphics.library.\n"); errs = 1; } X X if (which_ones & INTUI) X if ( (IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 0L)) == NULL) X { MSG("No Intuition.library.\n"); errs = 1; } X X if (which_ones & ARP) X if ( (ArpBase = (struct ArpBase *)OpenLibrary("arp.library", 34)) == NULL) X { MSG("No Arp.library in your LIBS directory.\n");errs = 1; } X X if (which_ones & DISKFONT) X if ( (DiskfontBase = (struct Library *)OpenLibrary("diskfont.library", 0L)) == NULL) X { MSG("No Diskfont.library in your LIBS: directory.\n"); errs = 1; } X X if (which_ones & TRANSLATOR) X if ( (TranslatorBase = (struct Library *)OpenLibrary("translator.library", 0L)) == NULL) X { MSG("No Translator.library in your LIBS: directory.\n"); errs = 1; } X X if (which_ones & REXX) X if ( (RexxSysBase = (struct RxsLib *)OpenLibrary("rexxsyslib.library", 0L)) == NULL) X { MSG("No rexxsyslib.library in your LIBS: directory.\n"); errs = 1; } X X if ( errs ) X { closelibs(); return NULL; } X X return 1; X} X Xcloselibs() X{ X if (DiskfontBase > 100) X { CloseLibrary(DiskfontBase); DiskfontBase = NULL; } X X if (ArpBase > 100) X { CloseLibrary(ArpBase); ArpBase = NULL; } X X if (IntuitionBase > 100) X { CloseLibrary(IntuitionBase); IntuitionBase = NULL; } X X if (GfxBase > 100) X { CloseLibrary(GfxBase); GfxBase = NULL; } X X if (TranslatorBase > 100) X { CloseLibrary(TranslatorBase); TranslatorBase = NULL; } X X if (RexxSysBase > 100) X { CloseLibrary(RexxSysBase); RexxSysBase = NULL; } X} X END_OF_FILE if test 2268 -ne `wc -c <'src/openlibs.c'`; then echo shar: \"'src/openlibs.c'\" unpacked with wrong size! fi # end of 'src/openlibs.c' fi if test -f 'src/window.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'src/window.c'\" else echo shar: Extracting \"'src/window.c'\" \(3360 characters\) sed "s/^X//" >'src/window.c' <<'END_OF_FILE' X#include "ezlib.h" X Xextern struct GfxBase *GfxBase; Xextern struct IntuitionBase *IntuitionBase; Xextern int openlibs(); Xvoid *AllocMem(); X X Xstruct Window *createwindow(screen, flags, idcmp, leftedge, topedge, width, height) X struct Screen *screen; X ULONG flags, idcmp; X int leftedge, topedge, width, height; X{ X struct Window *OpenWindow(); X int wb_height; X struct NewWindow *tempwin; X struct Window *win; X X /* some sanity checking - short and fast */ X if(GfxBase == NULL || IntuitionBase == NULL) X if ( openlibs(GFX | INTUITION) == NULL) X return NULL; X X tempwin = (struct NewWindow *)AllocMem(sizeof(struct NewWindow), MEMF_CLEAR); X if (tempwin == NULL) X return NULL; X X if (width < 0) /* more checking */ X width = GfxBase->NormalDisplayColumns; X if (height < 0) X height = 1500; X X tempwin->Flags = flags; tempwin->IDCMPFlags = idcmp; X tempwin->LeftEdge = (SHORT)leftedge; tempwin->Width = (SHORT)width; X tempwin->TopEdge = (SHORT)topedge; tempwin->Height = (SHORT)height; X tempwin->MinWidth = 60; tempwin->MinHeight = 30; X tempwin->DetailPen= -1; tempwin->BlockPen = -1; X tempwin->Type = WBENCHSCREEN; X tempwin->Screen = screen; /* if it's null that's o.k. too */ X X /* if user has a custom screen, open up on that screen */ X if (screen) { X tempwin->Type = CUSTOMSCREEN; X if (leftedge + width > screen->Width) X tempwin->Width = (screen->Width - leftedge); X X if (topedge + height > screen->Height) X tempwin->Height = (screen->Height - topedge); X } X else { X if (leftedge+width > GfxBase->NormalDisplayColumns) X tempwin->Width = (GfxBase->NormalDisplayColumns - leftedge); X X /* gotta make sure to check for interlace */ X wb_height = (GfxBase->NormalDisplayRows * (1 + laced_wb()) ); X if (topedge + height > wb_height ) X tempwin->Height = wb_height - topedge; X } X X win = OpenWindow(tempwin); X X FreeMem(tempwin, sizeof(struct NewWindow)); X return win; X} /* end of makewindow() */ X X X X/* return TRUE (1) if wb screen is interlaced otherwise, X * we return FALSE (0) if it is NOT interlaced X */ Xlaced_wb() X{ X struct Preferences prefs; X X GetPrefs(&prefs, sizeof(struct Preferences)); X if (prefs.LaceWB) X return 1; X else X return 0; X} /* end of laced_wb() */ X X Xkillwindow(window) X register struct Window *window; X{ X register struct IntuiMessage *msg, *GetMsg(); X X if (window < 100) X return; X X /* make sure this is NULL if you have already cleared out your menus. */ X if (window->MenuStrip != NULL) X ClearMenuStrip(window); X X /* make sure there aren't any junk messages hanging here */ X while(window->UserPort != NULL && (msg = GetMsg(window->UserPort)) != NULL ) X ReplyMsg(msg); X X /* then just close the window */ X CloseWindow(window); X} X X/* this routine will make your standard Intuition Window. It creates X * a window with all the standard system gadgets on it, and makes it X * the appropriate size (with sanity checking) X */ X Xstruct Window *makewindow(screen, leftedge, topedge, width, height) X struct Screen *screen; X int leftedge, topedge, width, height; X{ X static ULONG idcmp = CLOSEWINDOW, /* IDCMP Classes */ X /* system flags */ X flags = WINDOWCLOSE|WINDOWDEPTH|WINDOWDRAG|WINDOWSIZING|NOCAREREFRESH|SMART_REFRESH|ACTIVATE; X X return (struct Window *)createwindow(screen, flags, idcmp, leftedge, topedge, width, height); X} X X END_OF_FILE if test 3360 -ne `wc -c <'src/window.c'`; then echo shar: \"'src/window.c'\" unpacked with wrong size! fi # end of 'src/window.c' fi echo shar: End of archive 1 \(of 2\). cp /dev/null ark1isdone MISSING="" for I in 1 2 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked both archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- Mail submissions (sources or binaries) to <amiga@uunet.uu.net>. Mail comments to the moderator at <amiga-request@uunet.uu.net>. Post requests for sources, and general discussion to comp.sys.amiga.