/* Events.c */

#include "Constants.h"
#include "Locale.h"

#include <exec/types.h>
#include <exec/memory.h>
#include <exec/libraries.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <intuition/gadgetclass.h>
#include <libraries/gadtools.h>
#include <libraries/commodities.h>
#include <libraries/asl.h>
#include <devices/scsidisk.h>
#include <devices/cd.h>
#include <graphics/rastport.h>
#include <libraries/screennotify.h>
#include <pragma/screennotify_lib.h>
#include <workbench/workbench.h>
#include "AsmLib/CD-ROM.h"
#include "Structures/Application.h"
#include "Structures/DirNode.h"
#include "Structures/MyPubScreenNode.h"

#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/commodities_protos.h>
#include <clib/intuition_protos.h>
#include <clib/gadtools_protos.h>
#include <string.h>
#include <stdlib.h>
#include "ACDPlay_protos.h"

extern char *ls[ANZ_MSG];
extern struct Library *IntuitionBase;

BOOL HandleEvents(Application *app)
{
        struct IntuiMessage *imsg;
        struct Gadget *gad;
        struct Window *actwin;
        USHORT code, qualifier;
        ULONG class, seconds, micros;
        BOOL done = FALSE;
        BOOL exitloop = FALSE;
        BOOL changegui = FALSE;
        WORD win;
        int i;

        while (imsg = GT_GetIMsg(app->idcmp))
        {
                /* Daten auslesen, damit Msg beantwortet werden kann */
                class   = imsg->Class;
                code    = imsg->Code;
                qualifier = imsg->Qualifier;
                seconds = imsg->Seconds;
                micros  = imsg->Micros;
                gad             = (Gadget *)imsg->IAddress;

                actwin  = imsg->IDCMPWindow;

                /* Windownummer rausfinden */
                for (i = 0; i < ANZ_WINDOWS; i++)
                        if (app->appwin[i].window == actwin)
                        {
                                win = i;
                                break;
                        }

                /* Msg beantworten */
                GT_ReplyIMsg(imsg);

                switch (class)
                {
                        case IDCMP_MENUPICK:
                                while (code != MENUNULL)
                                {
                                        switch (MENUNUM(code))  /* Menu-Nummer ermitteln */
                                        {
                                                case 0:         /* Projekt */
                                                        switch (ITEMNUM(code))
                                                        {
                                                                case 0:         /* "Über..."-Fenster */
                                                                        OpenAppWin(app, WINDOW_ABOUT);
                                                                        break;
                                                                case 2:         /* "Verbergen" */
                                                                        CloseApplication(app);
                                                                        CreateAppIcon(app);
                                                                        exitloop = TRUE;
                                                                        break;
                                                                case 3:         /* "Entfernen" */
                                                                        done = TRUE;
                                                                        break;
                                                        }
                                                        break;

                                                case 1:         /* CD */
                                                        switch (ITEMNUM(code))
                                                        {
                                                                case 0: /* Titelauswahlfenster */
                                                                        OpenAppWin(app, WINDOW_TITLES);
                                                                        break;
                                                                case 1: /* Titelprogrammierung */
                                                                        OpenAppWin(app, WINDOW_PROGRAM);
                                                                        break;
                                                                case 2: /* Titeleingabe */
                                                                        OpenAppWin(app, WINDOW_EDIT);
                                                                        break;
                                                                case 4: /* Lautstärke */
                                                                        OpenAppWin(app, WINDOW_VOLUME);
                                                                        break;
                                                                case 5: /* A-B-Repeat */
                                                                        OpenAppWin(app, WINDOW_AB);
                                                                        break;
                                                                case 7: /* Informationen */
                                                                        OpenAppWin(app, WINDOW_CDINFO);
                                                                        break;
                                                        }
                                                        break;

                                                case 2:         /* Laufwerk */
                                                        switch (ITEMNUM(code))
                                                        {
                                                                case 0: /* LUN */
                                                                case 1: /* Unit */
                                                                        {
                                                                                struct CDxRequest *cdx = app->cdstr->cdx;
                                                                                BOOL suc;

                                                                                if (ITEMNUM(code)==1)
                                                                                        suc = CDChangeDeviceA(cdx, SUBNUM(code), cdx->cdx_LUN);  /* neue Unit */
                                                                                else
                                                                                        suc = CDChangeDeviceA(cdx, cdx->cdx_Unit, SUBNUM(code)); /* neue LUN */

                                                                                if (!suc)       /* Wechsel nicht erfolgreich? */
                                                                                {
                                                                                        DisplayBeep(NULL);

                                                                                        RemoveMenus(app);
                                                                                        ItemAddress(app->menustrip, code)->Flags &= ~CHECKED;
                                                                                        ItemAddress(app->menustrip, FULLMENUNUM(2,0,cdx->cdx_LUN))->Flags |= CHECKED;
                                                                                        ItemAddress(app->menustrip, FULLMENUNUM(2,1,cdx->cdx_Unit))->Flags |= CHECKED;
                                                                                        AttachMenus(app);
                                                                                }
                                                                                else
                                                                                {
                                                                                        UpdateUnitLUN(app);
                                                                                }
                                                                        }
                                                                        break;
                                                                case 2: /* Laufwerkssperre */
                                                                        CDLockA(app->cdstr->cdx, (ItemAddress(app->menustrip, code)->Flags) & CHECKED);
                                                                        break;
                                                                case 4: /* Öffnen */
                                                                        CDEjectA(app->cdstr->cdx, TRUE);
                                                                        break;
                                                                case 5: /* Schließen */
                                                                        CDEjectA(app->cdstr->cdx, FALSE);
                                                                        break;
                                                                case 6: /* Stoppen */
                                                                        StopButton(app);
                                                                        break;
                                                                case 8: /* Informationen */
                                                                        OpenAppWin(app, WINDOW_DRIVEINFO);
                                                                        break;
                                                        }
                                                        break;

                                                case 3:         /* GUI */
                                                        switch (ITEMNUM(code))
                                                        {
                                                                case 0: /* Magic-WB-Modus */
                                                                        app->magicwbmode = (ItemAddress(app->menustrip, code)->Flags) & CHECKED;
                                                                        changegui = TRUE;
                                                                        break;
                                                                case 1:         /* GUI-Elemente */
                                                                        switch (SUBNUM(code))
                                                                        {
                                                                                case 0: /* Direktwahl 1-10 */
                                                                                        app->flag_main ^= FLAG_MAIN_DIRECTCHOICE0;
                                                                                        break;
                                                                                case 1: /* Direktwahl 11-20 */
                                                                                        app->flag_main ^= FLAG_MAIN_DIRECTCHOICE1;
                                                                                        break;
                                                                                case 2: /* Titel */
                                                                                        app->flag_main ^= FLAG_MAIN_TITLE;
                                                                                        break;
                                                                                case 3: /* Index/Spur/Zeit */
                                                                                        app->flag_main ^= FLAG_MAIN_TIME;
                                                                                        break;
                                                                                case 4: /* Spielmodus/Wiederholung */
                                                                                        app->flag_main ^= FLAG_MAIN_MODE;
                                                                                        break;
                                                                                case 5: /* Bedienungspanel */
                                                                                        app->flag_main ^= FLAG_MAIN_PANEL;
                                                                                        break;
                                                                                case 6: /* Trackslider */
                                                                                        app->flag_main ^= FLAG_MAIN_TRACKSLIDER;
                                                                                        break;
                                                                        }
                                                                        changegui = TRUE;
                                                                        break;
                                                                case 3:         /* Public Screen */
                                                                        OpenAppWin(app, WINDOW_PUBSCREEN);
                                                                        break;
                                                                case 5:         /* Fixieren */
                                                                        if (!SaveConfig(app, "ENVARC:acdplay.cfg") || !SaveConfig(app, "ENV:acdplay.cfg"))
                                                                                ShowMsgA(ls[MSG_ERROR_TITLE], ls[MSG_NO_SAVECFGFILE], NULL);
                                                                        break;
                                                        }
                                                        break;

                                                case 4: /* ARexx */
                                                        MakeBusy(app, TRUE);
                                                        ActivateCxObj(app->broker, 0L);
                                                        if (ITEMNUM(code) == 0)
                                                        {
                                                                if (GetFileName(app, ASL_AREXX))
                                                                {
                                                                        ExecuteARexxA(app->appasl[ASL_AREXX].pathname, app->arexx_mp, app);
                                                                        exitloop = TRUE;
                                                                }
                                                        }
                                                        else
                                                        {
                                                                char command[45];       /* 30 + "ARexx/" + Nullbyte */
                                                                strcpy(command, "ARexx/");
                                                                AddPart(command, ((struct DirNode *)FindNode(app->arexxdir, ITEMNUM(code) - 2))->dn_Name, 45);
                                                                ExecuteARexxA(command, app->arexx_mp, app);
                                                                exitloop = TRUE;
                                                        }
                                                        ActivateCxObj(app->broker, 1L);
                                                        CDReadTOCA(app->cdstr->cdx);
                                                        CDUpdateA(app->cdstr->cdx);
                                                        MakeBusy(app, FALSE);
                                                        break;
                                        }

                                        if ((!exitloop) && (!done))
                                                code = (ItemAddress(app->menustrip, code))->NextSelect;
                                        else
                                                code = MENUNULL;
                                }

                                if (changegui)          /* Fenster schließen und öffnen, um Änderungen */
                                {                                       /* am Layout durchzuführen */
                                        CloseAppWin(app, WINDOW_MAIN, FALSE);
                                        OpenAppWin(app, WINDOW_MAIN);
                                        actwin = app->appwin[WINDOW_MAIN].window
                                }
                                break;

                        case IDCMP_CHANGEWINDOW:
                                if (actwin->Flags & WFLG_ZOOMED)
                                {
                                        app->appwin[win].minsize[LEFT]  = actwin->LeftEdge;
                                        app->appwin[win].minsize[TOP]   = actwin->TopEdge;

                                }
                                else
                                {
                                        app->appwin[win].maxsize[LEFT]  = actwin->LeftEdge;
                                        app->appwin[win].maxsize[TOP]   = actwin->TopEdge;
                                }
                                break;

                        case IDCMP_REFRESHWINDOW:
                                GT_BeginRefresh(actwin);
                                GT_EndRefresh(actwin, TRUE);
                                break;
                }

                switch (win)
                {
                        case WINDOW_MAIN:               /* Hauptfenster */
                                switch (class)
                                {
                                        static BOOL backward_pressed, forward_pressed;
                                        static WORD searched;

                                        case IDCMP_RAWKEY:
                                                switch (code)
                                                {
                                                        case 76:        /* Cursor hoch */
                                                                JumpBackwardButton(app);
                                                                break;
                                                        case 77:        /* Cursor runter */
                                                                JumpForwardButton(app);
                                                                break;
                                                        case 78:        /* Cursor rechts */
                                                                SearchForwardButton(app, 10);
                                                                break;
                                                        case 79:        /* Cursor links */
                                                                SearchBackwardButton(app, 10);
                                                                break;
                                                }
                                                break;

                                        case IDCMP_VANILLAKEY:
                                                switch (code)
                                                {
                                                        case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
                                                                if ((qualifier & IEQUALIFIER_LSHIFT) || (qualifier & IEQUALIFIER_RSHIFT))
                                                                        DirectChoice(app, code - 48 + 10);
                                                                else if ((qualifier & IEQUALIFIER_LALT) || (qualifier & IEQUALIFIER_RALT))
                                                                        DirectChoice(app, code - 48 + 20);
                                                                else
                                                                        DirectChoice(app, code - 48);
                                                                break;
                                                        case '0':
                                                                if ((qualifier & IEQUALIFIER_LSHIFT) || (qualifier & IEQUALIFIER_RSHIFT))
                                                                        DirectChoice(app, 20);
                                                                else if ((qualifier & IEQUALIFIER_LALT) || (qualifier & IEQUALIFIER_RALT))
                                                                        DirectChoice(app, 30);
                                                                else
                                                                        DirectChoice(app, 10);
                                                                break;
                                                }
                                                break;

                                        case IDCMP_GADGETUP:
                                                switch (gad->GadgetID)
                                                {
                                                        case GADGET_MAIN_DIRECTCHOICE0: case GADGET_MAIN_DIRECTCHOICE0 + 1: case GADGET_MAIN_DIRECTCHOICE0 + 2: case GADGET_MAIN_DIRECTCHOICE0 + 3: case GADGET_MAIN_DIRECTCHOICE0 + 4: case GADGET_MAIN_DIRECTCHOICE0 + 5: case GADGET_MAIN_DIRECTCHOICE0 + 6: case GADGET_MAIN_DIRECTCHOICE0 + 7: case GADGET_MAIN_DIRECTCHOICE0 + 8: case GADGET_MAIN_DIRECTCHOICE0 + 9:
                                                        case GADGET_MAIN_DIRECTCHOICE1: case GADGET_MAIN_DIRECTCHOICE1 + 1: case GADGET_MAIN_DIRECTCHOICE1 + 2: case GADGET_MAIN_DIRECTCHOICE1 + 3: case GADGET_MAIN_DIRECTCHOICE1 + 4: case GADGET_MAIN_DIRECTCHOICE1 + 5: case GADGET_MAIN_DIRECTCHOICE1 + 6: case GADGET_MAIN_DIRECTCHOICE1 + 7: case GADGET_MAIN_DIRECTCHOICE1 + 8: case GADGET_MAIN_DIRECTCHOICE1 + 9:
                                                                DirectChoice(app, gad->GadgetID + 1 - GADGET_MAIN_DIRECTCHOICE0);
                                                                break;

                                                        case GADGET_MAIN_TIMESHOW:
                                                                app->cdstr->timemode++;
                                                                if (app->cdstr->timemode > TIMEMODE_ALLREM)
                                                                        app->cdstr->timemode = TIMEMODE_TRACKCUR;

                                                                DoTimeBuffer(app);
                                                                ChangeButtonText(app, WINDOW_MAIN, GADGET_MAIN_TIMESHOW, app->timeshowbuf);
                                                                // app->appwin[WINDOW_MAIN].gadget[GADGET_MAIN_TIMESHOW] = ChangeButtonTextA(app, actwin, app->appwin[WINDOW_MAIN].gadget[GADGET_MAIN_TIMESHOW - 1], app->timeshowbuf);
                                                                break;

                                                        case GADGET_MAIN_PLAYMODE:
                                                                if (code != app->cdstr->playmode)
                                                                {
                                                                        /* Gegebenenfalls Reinitialisieren der Flags */
                                                                        switch (app->cdstr->playmode)
                                                                        {
                                                                                case PLAYMODE_RNDCD:
                                                                                        InitRandomTracks(app->cdstr->cdtitles);
                                                                                        break;
                                                                                case PLAYMODE_RNDPRG:
                                                                                        InitRandomTracks(app->cdstr->progtitles);
                                                                                        break;
                                                                        }

                                                                        app->cdstr->playmode = code;

                                                                        switch (app->cdstr->playmode)
                                                                        {
                                                                                case PLAYMODE_CD:
                                                                                        switch (app->cdstr->active)
                                                                                        {
                                                                                                case AUDIO_STAT_PLAYING:
                                                                                                case AUDIO_STAT_PAUSED:
                                                                                                        CDPlayA(app->cdstr->cdx, app->cdstr->cdx->cdx_TOCData->FirstAudioTrack, 1);
                                                                                                        if (app->cdstr->active == AUDIO_STAT_PAUSED)
                                                                                                                CDPauseA(app->cdstr->cdx, TRUE);
                                                                                                        app->cdstr->useraction = TRUE;
                                                                                                        break;
                                                                                        }
                                                                                        break;

                                                                                case PLAYMODE_RNDCD:
                                                                                        switch(app->cdstr->active)
                                                                                        {
                                                                                                case AUDIO_STAT_PLAYING:
                                                                                                case AUDIO_STAT_PAUSED:
                                                                                                        CDPlayA(app->cdstr->cdx, GetRandomTrack(app), 1);
                                                                                                        if (app->cdstr->active == AUDIO_STAT_PAUSED)
                                                                                                                CDPauseA(app->cdstr->cdx, TRUE);
                                                                                                        app->cdstr->useraction = TRUE;
                                                                                                        break;
                                                                                        }
                                                                                        break;

                                                                                case PLAYMODE_PRG:
                                                                                case PLAYMODE_RNDPRG:
                                                                                        switch (app->cdstr->active)
                                                                                        {
                                                                                                case AUDIO_STAT_PLAYING:
                                                                                                case AUDIO_STAT_PAUSED:
                                                                                                        if (IsListEmpty(app->cdstr->progtitles))
                                                                                                                CDStopA(app->cdstr->cdx);
                                                                                                        else
                                                                                                                ProgramStart(app);
                                                                                                        if (app->cdstr->active == AUDIO_STAT_PAUSED)
                                                                                                                CDPauseA(app->cdstr->cdx, TRUE);
                                                                                                        app->cdstr->useraction = TRUE;
                                                                                                        break;
                                                                                        }
                                                                                        break;
                                                                        }
                                                                }
                                                                break;
                                                        case GADGET_MAIN_REPEATMODE:
                                                                app->cdstr->repeatmode = code;
                                                                break;

                                                        case GADGET_MAIN_CDOUT:
                                                                EjectButton(app);
                                                                break;
                                                        case GADGET_MAIN_JUMPBWRD:
                                                                JumpBackwardButton(app);
                                                                break;
                                                        case GADGET_MAIN_JUMPFWRD:
                                                                JumpForwardButton(app);
                                                                break;
                                                        case GADGET_MAIN_SRCHBWRD:
                                                        case GADGET_MAIN_SRCHFWRD:
                                                                searched = 0;
                                                                if (app->cdstr->searchmode == SEARCHMODE_STANDARD)
                                                                {
                                                                        backward_pressed = FALSE;
                                                                        forward_pressed = FALSE;
                                                                }
                                                                else
                                                                        CDFastModeA(app->cdstr->cdx, FASTMODE_OFF, app->cdstr->searchmode-1);
                                                                break;
                                                        case GADGET_MAIN_STOP:
                                                                StopButton(app);
                                                                break;
                                                        case GADGET_MAIN_PAUSE:
                                                                PauseButton(app);
                                                                break;
                                                        case GADGET_MAIN_PLAY:
                                                                PlayButton(app);
                                                                break;
                                                /*      case GADGET_MAIN_TRACKSLIDER:
                                                                Trackslider(app, code);
                                                                break;*/
                                                }
                                                break;

                                        case IDCMP_GADGETDOWN:
                                                switch (gad->GadgetID)
                                                {
                                                        case GADGET_MAIN_SRCHBWRD:
                                                                if (app->cdstr->searchmode == SEARCHMODE_STANDARD)
                                                                        backward_pressed = TRUE;
                                                                else
                                                                {
                                                                        CDFastModeA(app->cdstr->cdx, FASTMODE_BACKWARD, app->cdstr->searchmode-1);
                                                                        searched = 1;
                                                                }
                                                                break;
                                                        case GADGET_MAIN_SRCHFWRD:
                                                                if (app->cdstr->searchmode == SEARCHMODE_STANDARD)
                                                                        forward_pressed = TRUE;
                                                                else
                                                                {
                                                                        CDFastModeA(app->cdstr->cdx, FASTMODE_FORWARD, app->cdstr->searchmode-1);
                                                                        searched = 1;
                                                                }
                                                                break;
                                                }
                                                break;

                                        case IDCMP_MOUSEBUTTONS:
                                                if (code == SELECTUP)
                                                {
                                                        if (app->cdstr->searchmode == SEARCHMODE_STANDARD)
                                                        {
                                                                backward_pressed = FALSE;
                                                                forward_pressed = FALSE;
                                                        }
                                                        else if (searched)
                                                                CDFastModeA(app->cdstr->cdx, FASTMODE_OFF, app->cdstr->searchmode-1);
                                                        searched = 0;
                                                }
                                                break;

                                        case IDCMP_CLOSEWINDOW:
                                                if (app->flag_tool & FLAG_TOOL_QUITONCLOSE)
                                                {
                                                        done = TRUE;
                                                }
                                                else
                                                {
                                                        CloseApplication(app);
                                                        CreateAppIcon(app);
                                                        exitloop = TRUE;
                                                }
                                                break;

                                        case IDCMP_MOUSEMOVE:
                                                if (gad->GadgetID == GADGET_MAIN_TRACKSLIDER)
                                                {
                                                        Trackslider(app, code);
                                                }
                                                break;

                                        case IDCMP_INTUITICKS:
                                                if (backward_pressed || forward_pressed)
                                                {
                                                        WORD value;
                                                        if (searched < 10)
                                                                value = 2;
                                                        else if (searched > 9 && searched < 20)
                                                                value = 4;
                                                        else if (searched > 19 && searched < 30)
                                                                value = 8;
                                                        else if (searched > 29 && searched < 40)
                                                                value = 16;
                                                        else if (searched > 39 && searched < 50)
                                                                value = 32;
                                                        else
                                                                value = 64;

                                                        searched++;

                                                        if (backward_pressed) SearchBackwardButton(app, value);
                                                        else SearchForwardButton(app, value);
                                                }

                                                /* Hier wird alles ziemlich aktualisiert.          */
                                                /* Ich denke, daß das ziemlich wichtig ist.                */
                                                /* Man hat dann wirklich das Gefühl, daß schneller */
                                                /* gespult wird. */
                                                /* Ich hoffe, es ist nicht zu rechenzeitintensiv.. */
                                                /* Allerdings spult man ja auch nicht andauernd... */

                                                if (searched)
                                                {
                                                        CDUpdateA(app->cdstr->cdx);
                                                        UpdateGadgets(app);
                                                }
                                                break;
                                }
                                break;

                        case WINDOW_ABOUT:              /* Über-Fenster */
                                switch (class)
                                {
                                        case IDCMP_GADGETUP:
                                        case IDCMP_CLOSEWINDOW:
                                                CloseAppWin(app, WINDOW_ABOUT, TRUE);
                                                exitloop = TRUE;        /* Damit nicht mehr auf den IDCMP zugegriffen
                                                                                        wird, sprich, damit ACDPlay nicht abstürzt */
                                                break;

                                        case IDCMP_INTUITICKS:
                                                UpdateScrollObject(app->scroller, app->appwin[WINDOW_ABOUT].window);
                                                break;
                                }
                                break;

                        case WINDOW_CDINFO:             /* CD-Fenster */
                                switch (class)
                                {
                                        case IDCMP_GADGETUP:
                                        case IDCMP_CLOSEWINDOW:
                                                CloseAppWin(app, WINDOW_CDINFO, TRUE);
                                                exitloop = TRUE;        /* Damit nicht mehr auf den IDCMP zugegriffen
                                                                                        wird, sprich, damit ACDPlay nicht abstürzt */
                                                break;

                                        case IDCMP_NEWSIZE:
                                                ManageNewSize(app, WINDOW_CDINFO);
                                                break;
                                }
                                break;

                        case WINDOW_DRIVEINFO:          /* Laufwerks-Fenster */
                                switch (class)
                                {
                                        case IDCMP_GADGETUP:
                                        case IDCMP_CLOSEWINDOW:
                                                CloseAppWin(app, WINDOW_DRIVEINFO, TRUE);
                                                exitloop = TRUE;        /* Damit nicht mehr auf den IDCMP zugegriffen
                                                                                        wird, sprich, damit ACDPlay nicht abstürzt */
                                                break;

                                        case IDCMP_NEWSIZE:
                                                ManageNewSize(app, WINDOW_DRIVEINFO);
                                                break;
                                }
                                break;

                        case WINDOW_PUBSCREEN:          /* Pubscreen-Fenster */
                                switch (class)
                                {
                                        case IDCMP_GADGETUP:
                                                switch (gad->GadgetID)
                                                {
                                                        case GADGET_PUBSCREEN_LISTVIEW:
                                                                {
                                                                        static ULONG startseconds, startmicros;

                                                                        if (DoubleClick(startseconds, startmicros, seconds, micros))
                                                                        {
                                                                                if (strcmp(app->pubscreenname, ((MyPubScreenNode *)FindNode(app->pubscreenlist, code))->mpsn_pubscreenname))
                                                                                {
                                                                                        strcpy(app->pubscreenname, ((MyPubScreenNode *)FindNode(app->pubscreenlist, code))->mpsn_pubscreenname);
                                                                                        CloseAppWin(app, WINDOW_PUBSCREEN, TRUE);
                                                                                        CloseApplication(app);
                                                                                        OpenApplication(app);
                                                                                }
                                                                                else CloseAppWin(app, WINDOW_PUBSCREEN, TRUE);
                                                                                exitloop = TRUE;
                                                                        }
                                                                        else
                                                                        {
                                                                                startseconds    = seconds;
                                                                                startmicros             = micros;
                                                                        }
                                                                }
                                                                break;

                                                        case GADGET_PUBSCREEN_UPDATE:
                                                                GetPubScreenList(app);
                                                                break;
                                                }
                                                break;
                                        case IDCMP_CLOSEWINDOW:
                                                CloseAppWin(app, WINDOW_PUBSCREEN, TRUE);
                                                exitloop = TRUE;        /* Damit nicht mehr auf den IDCMP zugegriffen
                                                                                        wird, sprich, damit ACDPlay nicht abstürzt */
                                                break;
                                        case IDCMP_NEWSIZE:
                                                ManageNewSize(app, WINDOW_PUBSCREEN);
                                                break;
                                }
                                break;

                        case WINDOW_TITLES:             /* Titelauswahl-Fenster */
                                switch (class)
                                {
                                        case IDCMP_GADGETUP:
                                                {
                                                        static ULONG startseconds, startmicros;

                                                        if (DoubleClick(startseconds, startmicros, seconds, micros))
                                                                DirectChoice(app, code + 1);
                                                        else
                                                        {
                                                                startseconds    = seconds;
                                                                startmicros             = micros;
                                                        }
                                                }
                                                break;
                                        case IDCMP_CLOSEWINDOW:
                                                CloseAppWin(app, WINDOW_TITLES, TRUE);
                                                exitloop = TRUE;        /* Damit nicht mehr auf den IDCMP zugegriffen
                                                                                        wird, sprich, damit ACDPlay nicht abstürzt */
                                                break;
                                        case IDCMP_NEWSIZE:
                                                ManageNewSize(app, WINDOW_TITLES);
                                                break;
                                }
                                break;

                        case WINDOW_EDIT:               /* Titeleingabe-Fenster */
                                switch (class)
                                {
                                        case IDCMP_GADGETUP:
                                                {
                                                        SHORT anzvisible;               /* Wieviele Einträge im LV zu sehen */

                                                        switch(gad->GadgetID)   /* Eintrag merken */
                                                        {
                                                                case GADGET_EDIT_TITLE:
                                                                        if (app->appwin[WINDOW_CDINFO].window)
                                                                                GT_SetGadgetAttrs(app->appwin[WINDOW_CDINFO].gadget[GADGET_CDINFO_TITLE], app->appwin[WINDOW_CDINFO].window, NULL, GTTX_Text, NULL, TAG_END);
                                                                        strncpy(app->cdstr->cdname, ((struct StringInfo *)gad->SpecialInfo)->Buffer, MAXCDNAME);
                                                                        if (app->appwin[WINDOW_CDINFO].window)
                                                                                GT_SetGadgetAttrs(app->appwin[WINDOW_CDINFO].gadget[GADGET_CDINFO_TITLE], app->appwin[WINDOW_CDINFO].window, NULL, GTTX_Text, app->cdstr->cdname, TAG_END);
                                                                        break;
                                                                case GADGET_EDIT_ARTIST:
                                                                        if (app->appwin[WINDOW_CDINFO].window)
                                                                                GT_SetGadgetAttrs(app->appwin[WINDOW_CDINFO].gadget[GADGET_CDINFO_AUTHOR], app->appwin[WINDOW_CDINFO].window, NULL, GTTX_Text, NULL, TAG_END);
                                                                        strncpy(app->cdstr->artistname, ((struct StringInfo *)gad->SpecialInfo)->Buffer, MAXARTISTNAME);
                                                                        if (app->appwin[WINDOW_CDINFO].window)
                                                                                GT_SetGadgetAttrs(app->appwin[WINDOW_CDINFO].gadget[GADGET_CDINFO_AUTHOR], app->appwin[WINDOW_CDINFO].window, NULL, GTTX_Text, app->cdstr->artistname, TAG_END);
                                                                        break;
                                                                case GADGET_EDIT_LISTVIEW:
                                                                        if (app->appwin[WINDOW_EDIT].gadget[GADGET_EDIT_TRACKTITLE]->Flags & GFLG_DISABLED)
                                                                                GT_SetGadgetAttrs(app->appwin[WINDOW_EDIT].gadget[GADGET_EDIT_TRACKTITLE], app->appwin[WINDOW_EDIT].window, NULL, GA_Disabled, FALSE, TAG_END);
                                                                        ActivateGadget(app->appwin[WINDOW_EDIT].gadget[GADGET_EDIT_TRACKTITLE], app->appwin[WINDOW_EDIT].window, NULL);

                                                                        /* String ggf. löschen */
                                                                        if (IsDefaultTitle(((struct StringInfo *)app->appwin[WINDOW_EDIT].gadget[GADGET_EDIT_TRACKTITLE]->SpecialInfo)->Buffer, code + 1))
                                                                                GT_SetGadgetAttrs(app->appwin[WINDOW_EDIT].gadget[GADGET_EDIT_TRACKTITLE], app->appwin[WINDOW_EDIT].window, NULL, GTST_String, NULL, TAG_END);

                                                                        app->edit_pos = code;
                                                                        break;
                                                                case GADGET_EDIT_TRACKTITLE:
                                                                        /* Titel-Gadget in WINDOW_MAIN */
                                                                        if (app->appwin[WINDOW_MAIN].gadget[GADGET_MAIN_TITLESHOW] && (app->edit_pos + 1) == app->cdstr->cur_track)
                                                                                GT_SetGadgetAttrs(app->appwin[WINDOW_MAIN].gadget[GADGET_MAIN_TITLESHOW], app->appwin[WINDOW_MAIN].window, NULL, GTTX_Text, NULL, TAG_END);
                                                                        /* Listen */
                                                                        if (app->appwin[WINDOW_TITLES].window) GT_SetGadgetAttrs(app->appwin[WINDOW_TITLES].gadget[GADGET_TITLES_LISTVIEW], app->appwin[WINDOW_TITLES].window, NULL, GTLV_Labels, ~0, TAG_END);
                                                                        GT_SetGadgetAttrs(app->appwin[WINDOW_EDIT].gadget[GADGET_EDIT_LISTVIEW], app->appwin[WINDOW_EDIT].window, NULL, GTLV_Labels, ~0, TAG_END);
                                                                        if (app->appwin[WINDOW_PROGRAM].window)
                                                                        {
                                                                                GT_SetGadgetAttrs(app->appwin[WINDOW_PROGRAM].gadget[GADGET_PROGRAM_LVCD], app->appwin[WINDOW_PROGRAM].window, NULL, GTLV_Labels, ~0, TAG_END);
                                                                                GT_SetGadgetAttrs(app->appwin[WINDOW_PROGRAM].gadget[GADGET_PROGRAM_LVPRG], app->appwin[WINDOW_PROGRAM].window, NULL, GTLV_Labels, ~0, TAG_END);
                                                                        }
                                                                        strncpy(FindNode(app->cdstr->cdtitles, app->edit_pos)->ln_Name, ((struct StringInfo *)gad->SpecialInfo)->Buffer, MAXTITLENAME);
                                                                        /* Listen */
                                                                        if (app->appwin[WINDOW_TITLES].window) GT_SetGadgetAttrs(app->appwin[WINDOW_TITLES].gadget[GADGET_TITLES_LISTVIEW], app->appwin[WINDOW_TITLES].window, NULL, GTLV_Labels, app->cdstr->cdtitles, TAG_END);
                                                                        GT_SetGadgetAttrs(app->appwin[WINDOW_EDIT].gadget[GADGET_EDIT_LISTVIEW], app->appwin[WINDOW_EDIT].window, NULL, GTLV_Labels, app->cdstr->cdtitles, TAG_END);
                                                                        if (app->appwin[WINDOW_PROGRAM].window)
                                                                        {
                                                                                GT_SetGadgetAttrs(app->appwin[WINDOW_PROGRAM].gadget[GADGET_PROGRAM_LVCD], app->appwin[WINDOW_PROGRAM].window, NULL, GTLV_Labels, app->cdstr->cdtitles, TAG_END);
                                                                                GT_SetGadgetAttrs(app->appwin[WINDOW_PROGRAM].gadget[GADGET_PROGRAM_LVPRG], app->appwin[WINDOW_PROGRAM].window, NULL, GTLV_Labels, app->cdstr->progtitles, TAG_END);
                                                                        }
                                                                        /* Titel-Gadget in WINDOW_MAIN */
                                                                        if (app->appwin[WINDOW_MAIN].gadget[GADGET_MAIN_TITLESHOW] && (app->edit_pos + 1) == app->cdstr->cur_track)
                                                                                GT_SetGadgetAttrs(app->appwin[WINDOW_MAIN].gadget[GADGET_MAIN_TITLESHOW], app->appwin[WINDOW_MAIN].window, NULL, GTTX_Text, (FindNode(app->cdstr->cdtitles, app->cdstr->cur_track - 1))->ln_Name, TAG_END);

                                                                        if (app->edit_pos + 1 < app->cdstr->num_track)
                                                                        {
                                                                                app->edit_pos++;

                                                                                anzvisible = (app->appwin[WINDOW_EDIT].maxsize[HEIGHT] - YOFFSET - 4 * BUTTONHEIGHT - 4 * INTERHEIGHT - 2 - 4) / app->font->ta_YSize;

                                                                                GT_SetGadgetAttrs(app->appwin[WINDOW_EDIT].gadget[GADGET_EDIT_LISTVIEW], app->appwin[WINDOW_EDIT].window, NULL, GTLV_Selected, app->edit_pos, TAG_END);
                                                                                if (app->edit_pos > anzvisible - 1)
                                                                                        GT_SetGadgetAttrs(app->appwin[WINDOW_EDIT].gadget[GADGET_EDIT_LISTVIEW], app->appwin[WINDOW_EDIT].window, NULL, GTLV_Top, app->edit_pos - anzvisible + 1, TAG_END);
                                                                                ActivateGadget(app->appwin[WINDOW_EDIT].gadget[GADGET_EDIT_TRACKTITLE], app->appwin[WINDOW_EDIT].window, NULL);

                                                                                /* String ggf. löschen */
                                                                                if (IsDefaultTitle(((struct StringInfo *)app->appwin[WINDOW_EDIT].gadget[GADGET_EDIT_TRACKTITLE]->SpecialInfo)->Buffer, app->edit_pos + 1))
                                                                                        GT_SetGadgetAttrs(app->appwin[WINDOW_EDIT].gadget[GADGET_EDIT_TRACKTITLE], app->appwin[WINDOW_EDIT].window, NULL, GTST_String, NULL, TAG_END);
                                                                        }
                                                                        break;
                                                                case GADGET_EDIT_SAVE:
                                                                        if (SaveTitles(app))
                                                                        {
                                                                                CloseAppWin(app, WINDOW_EDIT, TRUE);
                                                                                exitloop = TRUE;
                                                                        }
                                                                        else
                                                                                ShowMsgA(ls[MSG_ERROR_TITLE], ls[MSG_NOSAVE_TITLES], NULL);

                                                                        break;
                                                        }
                                                        if (gad->GadgetID == GADGET_EDIT_TITLE || gad->GadgetID == GADGET_EDIT_ARTIST)
                                                        {
                                                                /* Window-Titel updaten */
                                                                UpdateWinTitle(app);
                                                        }
                                                }
                                                break;
                                        case IDCMP_CLOSEWINDOW:
                                                CloseAppWin(app, WINDOW_EDIT, TRUE);
                                                exitloop = TRUE;        /* Damit nicht mehr auf den IDCMP zugegriffen
                                                                                        wird, sprich, damit ACDPlay nicht abstürzt */
                                                break;

                                        case IDCMP_NEWSIZE:
                                                ManageNewSize(app, WINDOW_EDIT);
                                                break;
                                }
                                break;

                        case WINDOW_PROGRAM:            /* Programmierfenster */
                                switch (class)
                                {
                                        case IDCMP_GADGETUP:
                                                switch(gad->GadgetID)
                                                {
                                                        case GADGET_PROGRAM_LVCD:
                                                                {
                                                                        static ULONG startseconds, startmicros;

                                                                        if (DoubleClick(startseconds, startmicros, seconds, micros))
                                                                                ProgramAppendElement(app, code + 1);
                                                                        else
                                                                        {
                                                                                startseconds    = seconds;
                                                                                startmicros             = micros;
                                                                        }
                                                                }
                                                                break;

                                                        case GADGET_PROGRAM_LVPRG:
                                                                {
                                                                        static ULONG startseconds, startmicros;

                                                                        if (DoubleClick(startseconds, startmicros, seconds, micros))
                                                                                ProgramDeleteElement(app, code);
                                                                        else
                                                                        {
                                                                                startseconds    = seconds;
                                                                                startmicros             = micros;
                                                                        }
                                                                }
                                                                break;

                                                        case GADGET_PROGRAM_COPYALL:
                                                                ProgramCopyAll(app);
                                                                break;
                                                        case GADGET_PROGRAM_DEL:
                                                                ProgramDelete(app);
                                                                break;
                                                        case GADGET_PROGRAM_LOAD:
                                                                ProgramLoad(app);
                                                                break;
                                                        case GADGET_PROGRAM_SAVE:
                                                                if (!ProgramSave(app))
                                                                        ShowMsgA(ls[MSG_ERROR_TITLE], ls[MSG_NOSAVE_PROGRAM], NULL);
                                                                break;
                                                }
                                                break;
                                        case IDCMP_CLOSEWINDOW:
                                                CloseAppWin(app, WINDOW_PROGRAM, TRUE);
                                                exitloop = TRUE;
                                                break;

                                        case IDCMP_NEWSIZE:
                                                ManageNewSize(app, WINDOW_PROGRAM);
                                                break;
                                }
                                break;

                        case WINDOW_VOLUME:
                                switch (class)
                                {
                                        case IDCMP_MOUSEMOVE:
                                                switch (gad->GadgetID)
                                                {
                                                        case GADGET_VOLUME_LEFT:
                                                                app->cdstr->cdx->cdx_Volume[0] = code;
                                                                break;
                                                        case GADGET_VOLUME_RIGHT:
                                                                app->cdstr->cdx->cdx_Volume[1] = code;
                                                                break;
                                                        case GADGET_VOLUME_MASTER:
                                                                {
                                                                        /* Differenz die für links/rechts zum Masterslider addiert/subtrahiert wird */
                                                                        WORD diff = (code && code!=255)?(app->cdstr->cdx->cdx_Volume[0] - app->cdstr->cdx->cdx_Volume[1])/2:0;
                                                                        app->cdstr->cdx->cdx_Volume[0] = (app->cdstr->cdx->cdx_Flags & SPECIALF_ATAPI)?(UBYTE)code:(UBYTE)FitInteger(code + diff, 0, 255);
                                                                        app->cdstr->cdx->cdx_Volume[1] = (app->cdstr->cdx->cdx_Flags & SPECIALF_ATAPI)?(UBYTE)code:(UBYTE)FitInteger(code - diff, 0, 255);
                                                                        GT_SetGadgetAttrs(app->appwin[WINDOW_VOLUME].gadget[GADGET_VOLUME_LEFT], app->appwin[WINDOW_VOLUME].window, NULL, GTSL_Level, app->cdstr->cdx->cdx_Volume[0], TAG_END);
                                                                        GT_SetGadgetAttrs(app->appwin[WINDOW_VOLUME].gadget[GADGET_VOLUME_RIGHT], app->appwin[WINDOW_VOLUME].window, NULL, GTSL_Level, app->cdstr->cdx->cdx_Volume[1], TAG_END);
                                                                }
                                                                break;
                                                }
                                                if (gad->GadgetID != GADGET_VOLUME_MASTER)
                                                        GT_SetGadgetAttrs(app->appwin[WINDOW_VOLUME].gadget[GADGET_VOLUME_MASTER], app->appwin[WINDOW_VOLUME].window, NULL, GTSL_Level, (app->cdstr->cdx->cdx_Volume[0]+app->cdstr->cdx->cdx_Volume[1])/2, TAG_END);

                                                CDVolumeA(app->cdstr->cdx, SET_VOLUME);
                                                break;
                                        case IDCMP_CLOSEWINDOW:
                                                CloseAppWin(app, WINDOW_VOLUME, TRUE);
                                                exitloop = TRUE;
                                                break;
                                        case IDCMP_NEWSIZE:
                                                ManageNewSize(app, WINDOW_VOLUME);
                                                /* RefreshGList() reicht nicht */
                                                GT_RefreshWindow(app->appwin[WINDOW_VOLUME].window, NULL);
                                                break;
                                }
                                break;

                        case WINDOW_AB:
                                switch (class)
                                {
                                        case IDCMP_GADGETUP:
                                                switch(gad->GadgetID)
                                                {
                                                        case GADGET_AB_A:
                                                                CDUpdateA(app->cdstr->cdx);
                                                                app->cdstr->a_track = app->cdstr->cdx->cdx_CurrentTrack;
                                                                app->cdstr->a_adr       = app->cdstr->cdx->cdx_CurrentRelAddr + app->cdstr->cdx->cdx_TOCData->Entry[app->cdstr->a_track].Address;
                                                                break;
                                                        case GADGET_AB_B:
                                                                CDUpdateA(app->cdstr->cdx);
                                                                app->cdstr->b_track = app->cdstr->cdx->cdx_CurrentTrack;
                                                                app->cdstr->b_adr       = app->cdstr->cdx->cdx_CurrentRelAddr + app->cdstr->cdx->cdx_TOCData->Entry[app->cdstr->b_track].Address;
                                                                break;
                                                        case GADGET_AB_A_TIME:
                                                        case GADGET_AB_B_TIME:
                                                                {
                                                                        char *str = (char *)((struct StringInfo *)gad->SpecialInfo)->Buffer;
                                                                        short mins, secs, frms;

                                                                        str[2] = 0;
                                                                        mins = FitInteger(atoi(str), 0, 99);
                                                                        str[5] = 0;
                                                                        secs = FitInteger(atoi(str + 3), 0, 59);
                                                                        frms = FitInteger(atoi(str + 6), 0, 74);

                                                                        if (gad->GadgetID == GADGET_AB_A_TIME)
                                                                                app->cdstr->a_adr = FitInteger(mins * 60 * 75 + secs * 75 + frms, 0, app->cdstr->cdx->cdx_TOCData->Entry[app->cdstr->a_track + 1].Address - app->cdstr->cdx->cdx_TOCData->Entry[app->cdstr->a_track].Address) + app->cdstr->cdx->cdx_TOCData->Entry[app->cdstr->a_track].Address;
                                                                        else
                                                                                app->cdstr->b_adr = FitInteger(mins * 60 * 75 + secs * 75 + frms, 0, app->cdstr->cdx->cdx_TOCData->Entry[app->cdstr->b_track + 1].Address - app->cdstr->cdx->cdx_TOCData->Entry[app->cdstr->b_track].Address) + app->cdstr->cdx->cdx_TOCData->Entry[app->cdstr->b_track].Address;
                                                                }
                                                                break;
                                                        case GADGET_AB_A_TRACK:
                                                        case GADGET_AB_B_TRACK:
                                                                {
                                                                        short entry = FitInteger(((struct StringInfo *)gad->SpecialInfo)->LongInt, 1, app->cdstr->num_track);

                                                                        /* Überprüfen, ob die Zeit-Angabe noch stimmt */
                                                                        if (gad->GadgetID == GADGET_AB_A_TRACK)
                                                                        {
                                                                                app->cdstr->a_adr = FitInteger(app->cdstr->a_adr - app->cdstr->cdx->cdx_TOCData->Entry[app->cdstr->a_track].Address, 0, app->cdstr->cdx->cdx_TOCData->Entry[entry + 1].Address - app->cdstr->cdx->cdx_TOCData->Entry[entry].Address) + app->cdstr->cdx->cdx_TOCData->Entry[entry].Address;
                                                                                app->cdstr->a_track = entry;
                                                                        }
                                                                        else
                                                                        {
                                                                                app->cdstr->b_adr = FitInteger(app->cdstr->b_adr - app->cdstr->cdx->cdx_TOCData->Entry[app->cdstr->b_track].Address, 0,  app->cdstr->cdx->cdx_TOCData->Entry[entry + 1].Address - app->cdstr->cdx->cdx_TOCData->Entry[entry].Address) + app->cdstr->cdx->cdx_TOCData->Entry[entry].Address;
                                                                                app->cdstr->b_track = entry;
                                                                        }
                                                                }
                                                                break;
                                                }

                                                /* Anzeigen aktualisieren */
                                                DoABBuffer(app);
                                                DoSizeBuffer(app);
                                                break;

                                        case IDCMP_CLOSEWINDOW:
                                                CloseAppWin(app, WINDOW_AB, TRUE);
                                                exitloop = TRUE;
                                                break;
                                        case IDCMP_NEWSIZE:
                                                {
                                                        /* Alles retten */
                                                        char time_a[9], time_b[9];
                                                        UBYTE track_a = ((struct StringInfo *)app->appwin[WINDOW_AB].gadget[GADGET_AB_A_TRACK]->SpecialInfo)->LongInt;
                                                        UBYTE track_b = ((struct StringInfo *)app->appwin[WINDOW_AB].gadget[GADGET_AB_B_TRACK]->SpecialInfo)->LongInt;
                                                        strcpy(time_a, ((struct StringInfo *)app->appwin[WINDOW_AB].gadget[GADGET_AB_A_TIME]->SpecialInfo)->Buffer);
                                                        strcpy(time_b, ((struct StringInfo *)app->appwin[WINDOW_AB].gadget[GADGET_AB_B_TIME]->SpecialInfo)->Buffer);

                                                        ManageNewSize(app, WINDOW_AB);

                                                        /* Alles restaurieren */
                                                        GT_SetGadgetAttrs(app->appwin[WINDOW_AB].gadget[GADGET_AB_A_TRACK], app->appwin[WINDOW_AB].window, NULL, GTIN_Number, track_a, TAG_END);
                                                        GT_SetGadgetAttrs(app->appwin[WINDOW_AB].gadget[GADGET_AB_B_TRACK], app->appwin[WINDOW_AB].window, NULL, GTIN_Number, track_b, TAG_END);
                                                        GT_SetGadgetAttrs(app->appwin[WINDOW_AB].gadget[GADGET_AB_A_TIME], app->appwin[WINDOW_AB].window, NULL, GTST_String, time_a, TAG_END);
                                                        GT_SetGadgetAttrs(app->appwin[WINDOW_AB].gadget[GADGET_AB_B_TIME], app->appwin[WINDOW_AB].window, NULL, GTST_String, time_b, TAG_END);
                                                }
                                                break;
                                }
                                break;
                }

                if (exitloop || done) break;            /* while-Schleife gegebenenfalls beenden */
        }
        return (done);
}

BOOL HandleCommodityEvents(Application *app)
{
        CxMsg   *cmsg;
        ULONG   msgid, msgtype;
        static  UWORD delaycount = 0;
        BOOL    done = FALSE;

        while (cmsg = (CxMsg *)GetMsg(app->broker_mp))
        {
                msgid = CxMsgID(cmsg);                          /* Informationen auslesen, damit die */
                msgtype = CxMsgType(cmsg);                      /* Message möglichst schnell beantwortet */
                ReplyMsg((struct Message *)cmsg);       /* werden kann... */

                switch (msgtype)
                {
                        case CXM_COMMAND:                               /* Ein Kommando wurde gesandt */
                                switch (msgid)
                                {
                                        case CXCMD_DISABLE:             /* Abschalten */
                                                ActivateCxObj(app->broker, 0L);
                                                break;
                                        case CXCMD_ENABLE:              /* Anschalten */
                                                ActivateCxObj(app->broker, 1L);
                                                CDReadTOCA(app->cdstr->cdx);
                                                CDUpdateA(app->cdstr->cdx);
                                                break;
                                        case CXCMD_KILL:                /* Entfernen */
                                                done = TRUE;
                                                break;
                                        case CXCMD_APPEAR:              /* Fenster öffnen */
                                                FreeAppIcon(app);
                                                OpenApplication(app);
                                                break;
                                        case CXCMD_DISAPPEAR:   /* Fenster schließen */
                                                CloseApplication(app);
                                                CreateAppIcon(app);
                                                break;
                                }
                                break;
                        case CXM_IEVENT:
                                switch (msgid)
                                {
                                        case EVENT_HOTKEYPRESSED:
                                                if (app->screen == NULL)
                                                {
                                                        FreeAppIcon(app);
                                                        OpenApplication(app);
                                                }
                                                else
                                                        switch (app->hotkeymode)
                                                        {
                                                                case HOTKEYMODE_SCREENTOFRONT:
                                                                        OpenApplication(app);
                                                                        break;
                                                                case HOTKEYMODE_FRONTMOST:
                                                                        {
                                                                                /* Zuerst locken... */
                                                                                ULONG lockreturn = LockIBase(0);

                                                                                if (((struct IntuitionBase *)IntuitionBase)->FirstScreen == app->screen)
                                                                                        OpenApplication(app);
                                                                                else
                                                                                {
                                                                                        if (GetPubScreenName(((struct IntuitionBase *)IntuitionBase)->FirstScreen, app->pubscreenname))
                                                                                        {
                                                                                                /* Hier wird zuerst der Screenname überschrieben, und dann die Application */
                                                                                                /* geschlossen. Ich hoffe, das ist in Ordnung... */
                                                                                                CloseApplication(app);
                                                                                                OpenApplication(app);
                                                                                        }
                                                                                        else
                                                                                        {
                                                                                                DisplayBeep(((struct IntuitionBase *)IntuitionBase)->FirstScreen);
                                                                                        }
                                                                                }
                                                                                UnlockIBase(lockreturn);
                                                                        }
                                                                        break;
                                                                case HOTKEYMODE_HIDE:
                                                                        CloseApplication(app);
                                                                        break;
                                                        }
                                                break;
                                        case EVENT_TIMER:
                                                if (++delaycount == app->cdstr->updatedelay)
                                                {
                                                        /* Sicherheitshalber, damit die Diskdaten in jedem Fall stimmen */
                                                        if (app->cdstr->updatedelay > 30)
                                                                CDReadTOCA(app->cdstr->cdx);
                                                        CDUpdateA(app->cdstr->cdx);
                                                        UpdateGadgets(app);

                                                        delaycount = 0;
                                                }
                                                break;
                                }
                                break;
                }
        }
        return (done);
}

void HandleScreenNotify(Application *app)
{
        struct ScreenNotifyMessage *smsg;

        while (smsg = (struct ScreenNotifyMessage *)GetMsg(app->scrnotify_mp))
        {
                if ((smsg->snm_Type == SCREENNOTIFY_TYPE_WORKBENCH) && (app->Flags & APPF_WORKBENCH))
                        if (smsg->snm_Value)
                        {
                                /* Nur öffnen wenn auch durch CloseWorkBench() geschlossen */
                                if ((!app->screen) && (app->Flags & APPF_SNCLOSED))
                                {
                                        OpenApplication(app);
                                        /* Application ist jetzt wieder offen: */
                                        /* Flag wird in OpenApplication gelöscht */
                                }
                        }
                        else
                        {
                                if (app->screen)
                                {
                                        CloseApplication(app);
                                        /* Application wurde durch CloseWorkBench() geschlossen: */
                                        /* Kann also durch OpenWorkBench() wieder geöffnet werden */
                                        app->Flags |= APPF_SNCLOSED;
                                }
                        }

                /* Erst antworten wenn alle Fenster geschlossen/offen sind */
                ReplyMsg((struct Message *)smsg);
        }
}

void HandleAppIconEvents(struct Application *app)
{
        struct AppMessage *appmsg       = NULL;
        LONG num;

        while (appmsg = (struct AppMessage *)GetMsg(app->appicon_mp))
        {
                num = appmsg->am_NumArgs;
                ReplyMsg((struct Message *)appmsg);

                if (!num)
                {
                        FreeAppIcon(app);
                        OpenApplication(app);
                        break;
                }
        }
}
