;/* updatestrgad.c - Execute me to compile me with SAS C 5.10 LC -b1 -cfistq -v -y -j73 updatestrgad.c Blink FROM LIB:c.o,updatestrgad.o TO updatestrgad LIBRARY LIB:LC.lib,LIB:Amiga.lib quit ** ** The values of a string gadget may be updated by removing the gadget, ** modifying the information in the StringInfo structure, adding the ** gadget back and refreshing its imagery. ** ** updatestrgad.c - Show the use of a string gadget. Shows both the use ** of ActivateGadget() and how to properly modify the contents of a string ** gadget. */ #define INTUI_V36_NAMES_ONLY #include <exec/types.h> #include <intuition/intuition.h> #include <intuition/intuitionbase.h> #include <clib/exec_protos.h> #include <clib/dos_protos.h> #include <clib/intuition_protos.h> #include <string.h> #include <stdio.h> #ifdef LATTICE int CXBRK(void) { return(0); } /* Disable Lattice CTRL/C handling */ int chkabort(void) { return(0); } /* really */ #endif /* our function prototypes */ VOID updateStrGad(struct Window *win, struct Gadget *gad, UBYTE *newstr); VOID handleWindow(struct Window *win, struct Gadget *gad); struct Library *IntuitionBase; /* NOTE that the use of constant size and positioning values are ** not recommended; it just makes it easy to show what is going on. ** The position of the gadget should be dynamically adjusted depending ** on the height of the font in the title bar of the window. This ** example adapts the gadget height to the screen font. Alternately, ** you could specify your font under V37 with the StringExtend structure. */ #define BUFSIZE (100) #define MYSTRGADWIDTH (200) #define MYSTRGADHEIGHT (8) UWORD strBorderData[] = { 0,0, MYSTRGADWIDTH + 3,0, MYSTRGADWIDTH + 3,MYSTRGADHEIGHT + 3, 0,MYSTRGADHEIGHT + 3, 0,0, }; struct Border strBorder = { -2,-2,1,0,JAM1,5,strBorderData,NULL, }; UBYTE strBuffer[BUFSIZE]; UBYTE strUndoBuffer[BUFSIZE]; struct StringInfo strInfo = { strBuffer,strUndoBuffer,0,BUFSIZE, /* compiler sets remaining fields to zero */ }; struct Gadget strGad = { NULL, 20,20,MYSTRGADWIDTH,MYSTRGADHEIGHT, GFLG_GADGHCOMP, GACT_RELVERIFY | GACT_STRINGCENTER, GTYP_STRGADGET, &strBorder, NULL, NULL,0,&strInfo,0,NULL, }; #define ANSCNT 4 UBYTE *answers[ANSCNT] = {"Try again","Sorry","Perhaps","A Winner"}; int ansnum = 0; UBYTE *activated_txt = "Activated"; /* main - show the use of a string gadget. */ VOID main(int argc, char **argv) { struct Window *win; /* make sure to get intuition version 37, for OpenWindowTags() */ IntuitionBase = OpenLibrary("intuition.library", 37); if (IntuitionBase) { /* Load a value into the string gadget buffer. ** This will be displayed when the gadget is first created. */ strcpy(strBuffer, "START"); if (win = OpenWindowTags(NULL, WA_Width, 400, WA_Height, 100, WA_Title,"Activate Window, Enter Text", WA_Gadgets, &strGad, WA_CloseGadget, TRUE, WA_IDCMP, IDCMP_ACTIVEWINDOW | IDCMP_CLOSEWINDOW | IDCMP_GADGETUP, TAG_END)) { handleWindow(win,&strGad); CloseWindow(win); } CloseLibrary(IntuitionBase); } } /* ** Process messages received by the window. Quit when the close gadget ** is selected, activate the gadget when the window becomes active. */ VOID handleWindow(struct Window *win, struct Gadget *gad) { struct IntuiMessage *msg; struct Gadget *gadget; ULONG class; for (;;) { Wait(1L << win->UserPort->mp_SigBit); while (msg = (struct IntuiMessage *)GetMsg(win->UserPort)) { /* Stash message contents and reply, important when message ** triggers some lengthy processing */ class = msg->Class; /* If it's a gadget message, IAddress points to Gadget */ if((class == IDCMP_GADGETUP)||(class == IDCMP_GADGETDOWN)) gadget = (struct Gadget *)msg->IAddress; ReplyMsg((struct Message *)msg); switch (class) { case IDCMP_ACTIVEWINDOW: /* activate the string gadget. This is how to activate a ** string gadget in a new window--wait for the window to ** become active by waiting for the IDCMP_ACTIVEWINDOW ** event, then activate the gadget. Here we report on ** the success or failure. */ if(ActivateGadget(gad,win,NULL)) updateStrGad(win,gad,activated_txt); break; case IDCMP_CLOSEWINDOW: /* here is the way out of the loop and the routine. ** be sure that the message was replied... */ return; break; case IDCMP_GADGETUP: /* If user hit RETURN in our string gadget for demonstration, ** we will change what he entered. We only have 1 gadget, ** so we don't have to check which gadget. */ updateStrGad(win, &strGad, answers[ansnum]); if(++ansnum > ANSCNT) ansnum = 0; /* point to next answer */ break; } } } } /* ** Routine to update the value in the string gadget's buffer, then ** activate the gadget. */ VOID updateStrGad(struct Window *win, struct Gadget *gad, UBYTE *newstr) { /* first, remove the gadget from the window. this must be done before ** modifying any part of the gadget!!! */ RemoveGList(win,gad,1); /* For fun, change the value in the buffer, as well as the cursor and ** initial display position. */ strcpy(((struct StringInfo *)(gad->SpecialInfo))->Buffer, newstr); ((struct StringInfo *)(gad->SpecialInfo))->BufferPos = 0; ((struct StringInfo *)(gad->SpecialInfo))->DispPos = 0; /* Add the gadget back, placing it at the end of the list (~0) ** and refresh its imagery. */ AddGList(win,gad,~0,1,NULL); RefreshGList(gad,win,NULL,1); /* Activate the string gadget */ ActivateGadget(gad,win,NULL); }