;/* iconexample.c - Execute me to compile me with SAS C 5.10
LC -b1 -cfistq -v -y -j73 iconexample.c
Blink FROM LIB:c.o,iconexample.o TO iconexample LIBRARY LIB:LC.lib,LIB:Amiga.lib
quit
**
** The following example demonstrates icon creation, icon reading and
** Tool Type parsing in the Workbench environment. When called from the
** Shell, the example creates a small data file in RAM: and creates or
** updates a project icon for the data file. The created project icon
** points to this example as its default tool. When the new project
** icon is double-clicked, Workbench will invoke the default tool (this
** example) as a Workbench process, and pass it a description of the
** project data file as a Workbench argument (WBArg) in the WBStartup
** message.
**
** iconexample.c - Workbench icon startup, creation, and parsing example
*/
#include <exec/types.h>
#include <libraries/dos.h>
#include <workbench/workbench.h>
#include <workbench/startup.h>
#include <clib/alib_protos.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/icon_protos.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#ifdef LATTICE
int CXBRK(void) { return(0); } /* Disable SAS Lattice CTRL/C handling */
int chkabort(void) { return(0); }/* really */
#endif
/* our functions */
void cleanexit(UBYTE *,LONG);
void cleanup(void);
void message(UBYTE *);
BOOL makeIcon(UBYTE *, char **, char *);
BOOL showToolTypes(struct WBArg *);
UBYTE *projname = "RAM:Example_Project";
UBYTE *conwinname = "CON:10/10/620/180/iconexample";
UBYTE deftoolname[] = {"iconexample"};
USHORT IconImageData1[] = {
/* Plane 0 */
0x0000,0x0000,0x0000,0x1000,0x0000,0x0000,0x0000,0x3000,
0x0FFF,0xFFFC,0x0000,0x3000,0x0800,0x0004,0x0000,0x3000,
0x0800,0x07FF,0xFFC0,0x3000,0x08A8,0xA400,0x00A0,0x3000,
0x0800,0x0400,0x0090,0x3000,0x08AA,0xA400,0x0088,0x3000,
0x0800,0x042A,0xA0FC,0x3000,0x082A,0xA400,0x0002,0x3000,
0x0800,0x0400,0x0002,0x3000,0x0800,0xA42A,0xA0A2,0x3000,
0x0800,0x0400,0x0002,0x3000,0x0950,0xA42A,0x8AA2,0x3000,
0x0800,0x0400,0x0002,0x3000,0x082A,0xA400,0x0002,0x3000,
0x0800,0x042A,0x2AA2,0x3000,0x0FFF,0xFC00,0x0002,0x3000,
0x0000,0x0400,0x0002,0x3000,0x0000,0x07FF,0xFFFE,0x3000,
0x0000,0x0000,0x0000,0x3000,0x7FFF,0xFFFF,0xFFFF,0xF000,
/* Plane 1 */
0xFFFF,0xFFFF,0xFFFF,0xE000,0xD555,0x5555,0x5555,0x4000,
0xD000,0x0001,0x5555,0x4000,0xD7FF,0xFFF9,0x5555,0x4000,
0xD7FF,0xF800,0x0015,0x4000,0xD757,0x5BFF,0xFF55,0x4000,
0xD7FF,0xFBFF,0xFF65,0x4000,0xD755,0x5BFF,0xFF75,0x4000,
0xD7FF,0xFBD5,0x5F01,0x4000,0xD7D5,0x5BFF,0xFFFD,0x4000,
0xD7FF,0xFBFF,0xFFFD,0x4000,0xD7FF,0x5BD5,0x5F5D,0x4000,
0xD7FF,0xFBFF,0xFFFD,0x4000,0xD6AF,0x5BD5,0x755D,0x4000,
0xD7FF,0xFBFF,0xFFFD,0x4000,0xD7D5,0x5BFF,0xFFFD,0x4000,
0xD7FF,0xFBD5,0xD55D,0x4000,0xD000,0x03FF,0xFFFD,0x4000,
0xD555,0x53FF,0xFFFD,0x4000,0xD555,0x5000,0x0001,0x4000,
0xD555,0x5555,0x5555,0x4000,0x8000,0x0000,0x0000,0x0000,
};
struct Image iconImage1 =
{
0, 0, /* Top Corner */
52, 22, 2, /* Width, Height, Depth */
&IconImageData1[0], /* Image Data */
0x003, 0x000, /* PlanePick,PlaneOnOff */
NULL /* Next Image */
};
UBYTE *toolTypes[] =
{
"FILETYPE=text",
"FLAGS=BOLD|ITALICS",
NULL
};
struct DiskObject projIcon =
{
WB_DISKMAGIC, /* Magic Number */
WB_DISKVERSION, /* Version */
{ /* Embedded Gadget Structure */
NULL, /* Next Gadget Pointer */
97,12,52,23, /* Left,Top,Width,Height */
GADGIMAGE|GADGHBOX, /* Flags */
GADGIMMEDIATE|RELVERIFY, /* Activation Flags */
BOOLGADGET, /* Gadget Type */
(APTR)&iconImage1, /* Render Image */
NULL, /* Select Image */
NULL, /* Gadget Text */
NULL, /* Mutual Exclude */
NULL, /* Special Info */
0, /* Gadget ID */
NULL /* User Data */
},
WBPROJECT, /* Icon Type */
deftoolname, /* Default Tool */
toolTypes, /* Tool Type Array */
NO_ICON_POSITION, /* Current X */
NO_ICON_POSITION, /* Current Y */
NULL, /* Drawer Structure */
NULL, /* Tool Window */
4000 /* Stack Size */
};
/* Opens and allocations we must clean up */
struct Library *IconBase = NULL;
FILE *conwin = NULL;
LONG olddir = -1;
BOOL FromWb;
void main(int argc, char **argv)
{
struct WBStartup *WBenchMsg;
struct WBArg *wbarg;
FILE *file;
LONG wLen;
SHORT i;
FromWb = (argc==0) ? TRUE : FALSE;
/* Open icon.library */
if(!(IconBase = OpenLibrary("icon.library",33)))
cleanexit("Can't open icon.library\n",RETURN_FAIL);
/* If started from CLI, this example will create a small text
* file RAM:Example_Project, and create an icon for the file
* which points to this program as its default tool.
*/
if(!FromWb)
{
/* Make a sample project (data) file */
wLen = -1;
if(file=fopen(projname,"w"))
{
wLen = fprintf(file,"Have a nice day\n");
fclose(file);
}
if(wLen < 0) cleanexit("Error writing data file\n",RETURN_FAIL);
/* Now save/update icon for this data file */
if(makeIcon(projname, toolTypes, deftoolname))
{
printf("%s data file and icon saved.\n",projname);
printf("Use Workbench menu Icon Information to examine the icon.\n");
printf("Then copy this example (iconexample) to RAM:\n");
printf("and double-click the %s project icon\n",projname);
}
else cleanexit("Error writing icon\n",RETURN_FAIL);
}
else /* Else we are FromWb - ie. we were either
* started by a tool icon, or as in this case,
* by being the default tool of a project icon.
*/
{
if(!(conwin = fopen(conwinname,"r+")))
cleanexit("Can't open output window\n",RETURN_FAIL);
WBenchMsg = (struct WBStartup *)argv;
/* Note wbarg++ at end of FOR statement steps through wbargs.
* First arg is our executable (tool). Any additional args
* are projects/icons passed to us via either extend select
* or default tool method.
*/
for(i=0, wbarg=WBenchMsg->sm_ArgList;
i < WBenchMsg->sm_NumArgs;
i++, wbarg++)
{
/* if there's a directory lock for this wbarg, CD there */
olddir = -1;
if((wbarg->wa_Lock)&&(*wbarg->wa_Name))
olddir = CurrentDir(wbarg->wa_Lock);
showToolTypes(wbarg);
if((i>0)&&(*wbarg->wa_Name))
fprintf(conwin,"In Main. We could open the %s file here\n",
wbarg->wa_Name);
if(olddir != -1) CurrentDir(olddir); /* CD back where we were */
}
Delay(500);
}
cleanup();
exit(RETURN_OK);
}
BOOL makeIcon(UBYTE *name, char **newtooltypes, char *newdeftool)
{
struct DiskObject *dobj;
char *olddeftool;
char **oldtooltypes;
BOOL success = FALSE;
if(dobj=GetDiskObject(name))
{
/* If file already has an icon, we will save off any fields we
* need to update, update those fields, put the object, restore
* the old field pointers and then free the object. This will
* preserve any custom imagery the user has, and the user's
* current placement of the icon. If your application does
* not know where the user currently keeps your application,
* you should not update his dobj->do_DefaultTool.
*/
oldtooltypes = dobj->do_ToolTypes;
olddeftool = dobj->do_DefaultTool;
dobj->do_ToolTypes = newtooltypes;
dobj->do_DefaultTool = newdeftool;
success = PutDiskObject(name,dobj);
/* we must restore the original pointers before freeing */
dobj->do_ToolTypes = oldtooltypes;
dobj->do_DefaultTool = olddeftool;
FreeDiskObject(dobj);
}
/* Else, put our default icon */
if(!success) success = PutDiskObject(name,&projIcon);
return(success);
}
BOOL showToolTypes(struct WBArg *wbarg)
{
struct DiskObject *dobj;
char **toolarray;
char *s;
BOOL success = FALSE;
fprintf(conwin,"\nWBArg Lock=0x%lx, Name=%s\n",
wbarg->wa_Lock,wbarg->wa_Name);
if((*wbarg->wa_Name) && (dobj=GetDiskObject(wbarg->wa_Name)))
{
fprintf(conwin," We have read the DiskObject (icon) for this arg\n");
toolarray = (char **)dobj->do_ToolTypes;
if(s=(char *)FindToolType(toolarray,"FILETYPE"))
{
fprintf(conwin," Found tooltype FILETYPE with value %s\n",s);
}
if(s=(char *)FindToolType(toolarray,"FLAGS"))
{
fprintf(conwin," Found tooltype FLAGS with value %s\n",s);
if(MatchToolValue(s,"BOLD"))
fprintf(conwin," BOLD flag requested\n");
if(MatchToolValue(s,"ITALICS"))
fprintf(conwin," ITALICS flag requested\n");
}
/* Free the diskobject we got */
FreeDiskObject(dobj);
success = TRUE;
}
else if(!(*wbarg->wa_Name))
fprintf(conwin," Must be a disk or drawer icon\n");
else
fprintf(conwin," Can't find any DiskObject (icon) for this WBArg\n");
return(success);
}
/* Workbench-started programs with no output window may want to display
* messages in a different manner (requester, window title, etc)
*/
void message(UBYTE *s)
{
if(FromWb && conwin) fprintf(conwin,s,strlen(s));
else if (!FromWb) printf(s);
}
void cleanexit(UBYTE *s, LONG n)
{
if(*s) message(s);
cleanup();
exit(n);
}
void cleanup()
{
if(conwin) fclose(conwin);
if(IconBase) CloseLibrary(IconBase);
}