#include <exec/memory.h>
#include <intuition/intuition.h>
#include <workbench/startup.h>
#include <workbench/workbench.h>

#ifdef LATTICE
#include <stdio.h>
  int CXBRK(void){ return (0); }
  int chkabort(void){ return (0); }

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

struct IntuitionBase *IntuitionBase=NULL;
struct WorkbenchBase *WorkbenchBase=NULL;

USHORT IconImageDaten[] = {
  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  0x0000,0x0040,0x0000,0x0000,0x0000,0x0000,0x0000,0x00C0,
  0x0000,0x1000,0x0000,0x0000,0x0000,0x00C0,0x0000,0x3000,
  0x0000,0x0000,0x0000,0x01C0,0x0000,0x7000,0x0000,0x0000,
  0x0000,0x07C0,0x0000,0xF000,0x0000,0x0000,0x0000,0x1FC0,
  0x0001,0xF000,0x0000,0x0000,0x0000,0x7FC0,0x0003,0x7000,
  0x0000,0x0000,0x0001,0xFFC0,0x0007,0x700F,0x8000,0x0000,
  0x0007,0xFFC0,0x000E,0x700C,0xC000,0x0000,0x001F,0xFFC0,
  0x001F,0xF00C,0xDB1E,0x3B6C,0x78FF,0xFFC0,0x0038,0x700F,
  0x9DB3,0x6676,0x0DFF,0xFFC0,0x0070,0x700C,0x19B3,0x6666,
  0x7FFF,0xFFC0,0x00E0,0x700C,0x1833,0x3C60,0xDFFF,0xFFC0,
  0x01F1,0xF80C,0x181E,0xC660,0x7FFF,0xFFC0,0x0000,0x0000,
  0x0000,0x7C01,0xFFFF,0xFFC0,0x0000,0x0000,0x0000,0x0007,
  0xFFFF,0xFFC0,0x0000,0x0000,0x0000,0x001F,0xFFFF,0xFFC0,
  0x07FF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFC0,0x0000,0x0000,
  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  0x0000,0x0000,0x0000,0x0000,0x0FFF,0xFFFF,0xFFFF,0xFFFF,
  0xFFFF,0xFF80,0x0D55,0x5555,0x5555,0x5555,0x5555,0x5500,
  0x0D55,0x4555,0x5555,0x5555,0x5555,0x5500,0x0D55,0x4555,
  0x5555,0x5555,0x5555,0x5500,0x0D55,0x0555,0x5555,0x5555,
  0x5555,0x5700,0x0D55,0x0555,0x5555,0x5555,0x5555,0x5F00,
  0x0D54,0x0555,0x5555,0x5555,0x5555,0x7F00,0x0D54,0x0555,
  0x5555,0x5555,0x5555,0xFF00,0x0D50,0x0550,0x5555,0x5555,
  0x5557,0xFF00,0x0D51,0x0551,0x1555,0x5555,0x555F,0xFF00,
  0x0D40,0x0551,0x0441,0x4411,0x0533,0x3300,0x0D45,0x0550,
  0x4044,0x1101,0x5111,0x1100,0x0D05,0x0551,0x4444,0x1111,
  0x0329,0x2900,0x0D15,0x0551,0x4544,0x4115,0x1339,0x3900,
  0x0C04,0x0551,0x4541,0x1115,0x0339,0x3900,0x0D55,0x5555,
  0x5555,0x0155,0xFFFF,0xFF00,0x0D55,0x5555,0x5555,0x5557,
  0xFFFF,0xFF00,0x0D55,0x5555,0x5555,0x555F,0xFFFF,0xFF00,
  0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
};

struct Image IconImage = {
  0,0,
  94,24,
  2,
  IconImageDaten,
  0x0003,0x0000,
  NULL
};

struct DiskObject AmigaAppIcon = {
  NULL, NULL,
  {
    NULL, 0, 0, 94, 24,
    GADGHIMAGE,
    NULL, NULL,
    (APTR) &IconImage,
    (APTR) &IconImage,
    NULL, NULL, NULL, 0,
    NULL,
  },
  NULL, NULL, NULL,
  NO_ICON_POSITION,
  NO_ICON_POSITION,
  NULL, NULL, NULL
};

void main() {
  struct MsgPort *msgport;
  struct Window  *window;
  struct AppIcon *appicon;
  struct IntuiMessage *imsg;
  struct AppMessage *appmsg;
  struct WBArg   *argptr;
  ULONG  IconID = 1, UserData = 0;
  BOOL   ABORT = FALSE;
  UBYTE  i;

  if( IntuitionBase=OpenLibrary("intuition.library", 37)) {
    if( WorkbenchBase=OpenLibrary("workbench.library", 37)) {
      /*
       * Den benötigten Message-Port erstellen
       */
      if( msgport=CreateMsgPort() ) {
        if( window=OpenWindowTags( NULL, WA_Left,  10,   WA_Top, 10,
                                         WA_Width, 320, WA_Height, 50,
                                         WA_IDCMP, CLOSEWINDOW,
                                         WA_Flags, WINDOWCLOSE | WINDOWDRAG,
                                         WA_Title, "AmigaAppWindow", TAG_END)) {
          /*
           * Hier erfolgt der Eintrag des Application-Icons
           */
          if( appicon=AddAppIcon(IconID, UserData, "AmigaAppIcon", msgport, NULL, &AmigaAppIcon, NULL)) {
            do {
              /*
               * Nun warten wir entweder auf eine IDCMP-Message
               * oder eine AppMessage
               */
              Wait(1 << window->UserPort->mp_SigBit | 1 << msgport->mp_SigBit);
              while( imsg=(struct IntuiMessage *)GetMsg(window->UserPort)) {
                if( imsg->Class=CLOSEWINDOW )
                  ABORT=TRUE;
                  ReplyMsg((struct Message *) imsg);
              }
              while( appmsg=(struct AppMessage *)GetMsg(msgport)) {
                /*
                 * Die AppMessage kann nur vom Typ MTYPE_APPWINDOW sein.
                 * ID und userdata sind die von uns vorgegebenen Werte.
                 * Mit NumArgs lassen sich die Workbench-Argumente aus-
                 * lesen.
                 */
                printf("AppMsg=%lx, Typ=%ld, ID=%ld, UserData=%ld, NumArgs=%ld\n",
                              appmsg, appmsg->am_Type, appmsg->am_ID,
                              appmsg->am_UserData, appmsg->am_NumArgs);

                /*
                 * Jetzt die Argumente auswerten. Ist am->NumArgs 0, wurde
                 * ein Doppelklick auf das Icon ausgeübt, ansonsten wurden
                 * ein oder mehrere Icons auf das Symbol gezogen.
                 */

                argptr = appmsg->am_ArgList;
                for(i = 0; i < appmsg->am_NumArgs; i++) {
                   printf("Argument(%ld): Name='%s', Lock=%lx\n",
                                i, argptr->wa_Name, argptr->wa_Lock);
                   argptr++;
                }
                ReplyMsg((struct Message *)appmsg);
              }
            } while (ABORT == FALSE);
            RemoveAppIcon(appicon);
          } else printf("Das AppIcon konnt nicht eingerichtet werden\n");
          CloseWindow(window);
        } else printf("Konnte Fenster nicht öffnen\n");
        DeleteMsgPort(msgport);
      } else printf("Konnte Message-Port nicht einrichten\n");
      CloseLibrary(WorkbenchBase);
    } else printf("Konnte workbench.library nicht öffnen\n");
    CloseLibrary(IntuitionBase);
  } else printf("Konnte intuition.library nicht öffnen\n");
}
