#include <exec/types.h>
#include <workbench/workbench.h>
#include <workbench/startup.h>
#include <exec/libraries.h>
#include <stdio.h>

#include <clib/icon_protos.h>
#include <clib/exec_protos.h>
#include <clib/wb_protos.h>

void cleanexit(char *msg);

struct Library *IconBase = NULL;
struct Library *WorkbenchBase = NULL;
struct MsgPort    *myport = NULL;
struct AppIcon   *appicon = NULL;
struct AppMessage *appmsg = NULL;
struct DiskObject   *dobj = NULL;

void main(int argc, char **argv)
{
  ULONG i;
  BOOL finito = FALSE;

  /* Apro le librerie necessarie */
  IconBase = OpenLibrary("icon.library",37);
  if(! IconBase) cleanexit("Non si apre la icon.library\n");
  WorkbenchBase = OpenLibrary("workbench.library",37);
  if (!WorkbenchBase) cleanexit("Non si apre la workbench.library\n");

  /* Per comodità in questo esempio utilizzo un'icona di default */
  /* prelevata tramite la funzione GetDefDiskObject()            */
  dobj=GetDefDiskObject(WBDISK);
  if(! dobj) cleanexit("Non trovo l'icona di default per WBDISK\n");
  /* Per le AppIcon il tipo del DiskObject deve essere posto a NULL */
  dobj->do_Type = NULL;

  /* Creo la porta messaggi */
  myport = CreateMsgPort();
  if(! myport) cleanexit("Non posso creare la porta messaggi\n");

  /* Finalmente pongo l'icona sullo schermo Workbench */
  appicon = AddAppIconA(0L,0L,"Mia_Icona",myport,NULL,dobj,NULL);

  if(! appicon) cleanexit("Non posso creare l'AppIcon\n");
  /* In questo esempio esco appena viene eseguito un doppio click */
  /* sull'icona, mentre mostro i nomi delle icone rilasciate su  */
  /* di essa. */
  do
  {
    WaitPort(myport);
    while(appmsg=(struct AppMessage *)GetMsg(myport))
    {
      printf("Type = %d\n",appmsg->am_Type);
      if(appmsg->am_NumArgs==0L)
        /* Se NumArgs è 0 l'AppIcon è stata attivata direttamente */
        finito = TRUE;
      else if(appmsg->am_NumArgs > 0L)
      {
        /* Se NumArgs è >0 l'AppIcon è stata attivata rilasciando */
        /*  una o più icone su di essa */
        printf("%d icone rilasciate\n",appmsg->am_NumArgs);
        for(i = 0; i < appmsg->am_NumArgs; i++)
          printf("%ld icona='%s'\n",i+1,appmsg->am_ArgList[i].wa_Name);
      }
    }
  } while (!finito);
  cleanexit(NULL);
}


void cleanexit(char *msg)
{
  struct AppMessage *amsg;
  if (msg) printf(msg);
  if (appicon) RemoveAppIcon(appicon);
  if (myport)
  {
    while(amsg=(struct AppMessage *)GetMsg(myport))
      ReplyMsg((struct Message *)amsg);
    DeleteMsgPort(myport);
  }
  if (dobj) FreeDiskObject(dobj);
  if (WorkbenchBase) CloseLibrary(WorkbenchBase);
  if (IconBase) CloseLibrary(IconBase);
}


