Initial commit
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,318 @@
|
||||
;/* String Example
|
||||
sc link stringexample.c lib lib:classact.lib
|
||||
quit
|
||||
*/
|
||||
|
||||
/**
|
||||
** StringExample.c -- String class Example.
|
||||
**
|
||||
** This is a simple example testing some of the capabilities of the
|
||||
** String gadget class.
|
||||
**
|
||||
** This code opens a window and then creates 2 String gadgets which
|
||||
** are subsequently attached to the window's gadget list. One uses
|
||||
** and edit hook, and the other does not. Notice that you can tab
|
||||
** cycle between them.
|
||||
**/
|
||||
|
||||
/* system includes
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <exec/types.h>
|
||||
#include <exec/memory.h>
|
||||
#include <intuition/intuition.h>
|
||||
#include <intuition/gadgetclass.h>
|
||||
#include <intuition/sghooks.h> /* required for string hooks */
|
||||
#include <graphics/gfxbase.h>
|
||||
#include <graphics/text.h>
|
||||
#include <graphics/gfxmacros.h>
|
||||
#include <utility/tagitem.h>
|
||||
#include <workbench/startup.h>
|
||||
#include <workbench/workbench.h>
|
||||
|
||||
#include <proto/intuition.h>
|
||||
#include <proto/graphics.h>
|
||||
#include <proto/exec.h>
|
||||
#include <proto/dos.h>
|
||||
#include <proto/utility.h>
|
||||
#include <proto/wb.h>
|
||||
#include <proto/icon.h>
|
||||
|
||||
/* ClassAct includes
|
||||
*/
|
||||
#include <classact.h>
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
GID_MAIN=0,
|
||||
GID_STRING1,
|
||||
GID_STRING2,
|
||||
GID_DOWN,
|
||||
GID_UP,
|
||||
GID_QUIT,
|
||||
GID_LAST
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
WID_MAIN=0,
|
||||
WID_LAST
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
OID_MAIN=0,
|
||||
OID_LAST
|
||||
};
|
||||
|
||||
|
||||
/* hook function typedef
|
||||
*/
|
||||
typedef ULONG (*HookFunction)(VOID);
|
||||
|
||||
/* hook function prototype
|
||||
*/
|
||||
ULONG __saveds __asm PasswordHook(
|
||||
register __a0 struct Hook *hook,
|
||||
register __a2 struct SGWork *sgw,
|
||||
register __a1 ULONG *msg);
|
||||
|
||||
#define SMAX 24
|
||||
|
||||
#define PASSWORDCHAR '*'
|
||||
|
||||
UBYTE initialstring[] = "Testing";
|
||||
|
||||
int main(void)
|
||||
{
|
||||
struct MsgPort *AppPort;
|
||||
|
||||
struct Window *windows[WID_LAST];
|
||||
|
||||
struct Gadget *gadgets[GID_LAST];
|
||||
|
||||
Object *objects[OID_LAST];
|
||||
|
||||
/* make sure our classes opened... */
|
||||
if (!ButtonBase || !StringBase || !WindowBase || !LayoutBase)
|
||||
return(30);
|
||||
else if ( AppPort = CreateMsgPort() )
|
||||
{
|
||||
struct Hook edithook1;
|
||||
STRPTR hookdata1;
|
||||
|
||||
/* The password edit hook needs special care, we need to look at
|
||||
* edithook.h_Data to set/get the real password text. Additionally,
|
||||
* we need to Alloc/Free maxchars bytes for its buffer!
|
||||
*/
|
||||
hookdata1 = (STRPTR)AllocVec( (SMAX + 2), MEMF_ANY | MEMF_CLEAR);
|
||||
|
||||
if (hookdata1)
|
||||
{
|
||||
CA_SetUpHook(edithook1, PasswordHook, (STRPTR)hookdata1);
|
||||
|
||||
/* copy real string data into the hidden buffer */
|
||||
strcpy(hookdata1, (STRPTR)initialstring);
|
||||
|
||||
/* re-initialize real/visible string with password chars */
|
||||
memset((void *)initialstring, PASSWORDCHAR, strlen((STRPTR)initialstring));
|
||||
|
||||
/* Create the window object.
|
||||
*/
|
||||
objects[OID_MAIN] = WindowObject,
|
||||
WA_ScreenTitle, "ClassAct Release 2.0",
|
||||
WA_Title, "ClassAct String Example",
|
||||
WA_Activate, TRUE,
|
||||
WA_DepthGadget, TRUE,
|
||||
WA_DragBar, TRUE,
|
||||
WA_CloseGadget, TRUE,
|
||||
WA_SizeGadget, TRUE,
|
||||
WINDOW_IconifyGadget, TRUE,
|
||||
WINDOW_IconTitle, "String",
|
||||
WINDOW_AppPort, AppPort,
|
||||
WINDOW_Position, WPOS_CENTERMOUSE,
|
||||
WINDOW_ParentGroup, gadgets[GID_MAIN] = VGroupObject,
|
||||
LAYOUT_SpaceOuter, TRUE,
|
||||
LAYOUT_DeferLayout, TRUE,
|
||||
|
||||
LAYOUT_AddChild, gadgets[GID_STRING1] = StringObject,
|
||||
GA_ID, GID_STRING1,
|
||||
GA_RelVerify, TRUE,
|
||||
GA_TabCycle, TRUE,
|
||||
STRINGA_MinVisible, 10,
|
||||
STRINGA_MaxChars, SMAX,
|
||||
StringEnd,
|
||||
CHILD_NominalSize, TRUE,
|
||||
CHILD_Label, LabelObject, LABEL_Text, "String _1", LabelEnd,
|
||||
|
||||
LAYOUT_AddChild, gadgets[GID_STRING2] = StringObject,
|
||||
GA_ID, GID_STRING2,
|
||||
GA_RelVerify, TRUE,
|
||||
GA_TabCycle, TRUE,
|
||||
STRINGA_MinVisible, 10,
|
||||
STRINGA_MaxChars, SMAX,
|
||||
STRINGA_EditHook, &edithook1,
|
||||
STRINGA_TextVal, initialstring,
|
||||
StringEnd,
|
||||
CHILD_Label, LabelObject, LABEL_Text, "String _2", LabelEnd,
|
||||
|
||||
LAYOUT_AddChild, ButtonObject,
|
||||
GA_ID, GID_QUIT,
|
||||
GA_RelVerify, TRUE,
|
||||
GA_Text,"_Quit",
|
||||
ButtonEnd,
|
||||
CHILD_WeightedHeight, 0,
|
||||
|
||||
EndGroup,
|
||||
EndWindow;
|
||||
|
||||
/* Object creation sucessful?
|
||||
*/
|
||||
if (objects[OID_MAIN])
|
||||
{
|
||||
/* Open the window.
|
||||
*/
|
||||
if (windows[WID_MAIN] = (struct Window *) CA_OpenWindow(objects[OID_MAIN]))
|
||||
{
|
||||
ULONG wait, signal, app = (1L << AppPort->mp_SigBit);
|
||||
ULONG done = FALSE;
|
||||
ULONG result;
|
||||
UWORD code;
|
||||
|
||||
/* Obtain the window wait signal mask.
|
||||
*/
|
||||
GetAttr(WINDOW_SigMask, objects[OID_MAIN], &signal);
|
||||
|
||||
/* Activate the first string gadget!
|
||||
*/
|
||||
ActivateLayoutGadget( gadgets[GID_MAIN], windows[WID_MAIN], NULL, gadgets[GID_STRING1] );
|
||||
|
||||
/* Input Event Loop
|
||||
*/
|
||||
while (!done)
|
||||
{
|
||||
wait = Wait( signal | SIGBREAKF_CTRL_C | app );
|
||||
|
||||
if ( wait & SIGBREAKF_CTRL_C )
|
||||
{
|
||||
done = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
while ( (result = CA_HandleInput(objects[OID_MAIN], &code) ) != WMHI_LASTMSG )
|
||||
{
|
||||
switch (result & WMHI_CLASSMASK)
|
||||
{
|
||||
case WMHI_CLOSEWINDOW:
|
||||
windows[WID_MAIN] = NULL;
|
||||
done = TRUE;
|
||||
break;
|
||||
|
||||
case WMHI_GADGETUP:
|
||||
switch (result & WMHI_GADGETMASK)
|
||||
{
|
||||
case GID_STRING1:
|
||||
printf( "Contents: %s\n", ((struct StringInfo *)(gadgets[GID_STRING1]->SpecialInfo))->Buffer);
|
||||
|
||||
break;
|
||||
|
||||
case GID_STRING2:
|
||||
printf( "Contents: %s\n", hookdata1 );
|
||||
break;
|
||||
|
||||
case GID_QUIT:
|
||||
done = TRUE;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case WMHI_ICONIFY:
|
||||
CA_Iconify(objects[OID_MAIN]);
|
||||
windows[WID_MAIN] = NULL;
|
||||
break;
|
||||
|
||||
case WMHI_UNICONIFY:
|
||||
windows[WID_MAIN] = (struct Window *) CA_OpenWindow(objects[OID_MAIN]);
|
||||
|
||||
if (windows[WID_MAIN])
|
||||
{
|
||||
GetAttr(WINDOW_SigMask, objects[OID_MAIN], &signal);
|
||||
}
|
||||
else
|
||||
{
|
||||
done = TRUE; // error re-opening window!
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Disposing of the window object will also close the window if it is
|
||||
* already opened, and it will dispose of the layout object attached to it.
|
||||
*/
|
||||
DisposeObject(objects[OID_MAIN]);
|
||||
}
|
||||
|
||||
/* free the password hook buffer
|
||||
*/
|
||||
FreeVec(hookdata1);
|
||||
}
|
||||
|
||||
DeleteMsgPort(AppPort);
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** Password Entry Hook
|
||||
**/
|
||||
|
||||
ULONG __saveds __asm PasswordHook(register __a0 struct Hook *hook, register __a2 struct SGWork *sgw, register __a1 ULONG *msg)
|
||||
{
|
||||
STRPTR pass_ptr = (STRPTR)hook->h_Data;
|
||||
|
||||
sgw->BufferPos = sgw->NumChars;
|
||||
|
||||
if(*msg == SGH_KEY)
|
||||
{
|
||||
switch (sgw->EditOp)
|
||||
{
|
||||
case EO_INSERTCHAR:
|
||||
if(pass_ptr)
|
||||
{
|
||||
pass_ptr[sgw->BufferPos - 1] = sgw->WorkBuffer[sgw->BufferPos - 1];
|
||||
pass_ptr[sgw->BufferPos] = '\0';
|
||||
}
|
||||
sgw->WorkBuffer[sgw->BufferPos - 1] = (UBYTE)PASSWORDCHAR;
|
||||
break;
|
||||
|
||||
case EO_DELBACKWARD:
|
||||
if(pass_ptr)
|
||||
{
|
||||
pass_ptr[sgw->BufferPos] = '\0';
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
sgw->Actions &= ~SGA_USE;
|
||||
break;
|
||||
}
|
||||
|
||||
sgw->Actions |= SGA_REDISPLAY;
|
||||
return (~0L);
|
||||
}
|
||||
if(*msg == SGH_CLICK)
|
||||
{
|
||||
sgw->BufferPos = sgw->NumChars;
|
||||
return (~0L);
|
||||
}
|
||||
return(0L);
|
||||
}
|
||||
Binary file not shown.
Reference in New Issue
Block a user