;/* 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);
}