From 285700eced1e87cbd9b4573a13083bd0a43b2f4d Mon Sep 17 00:00:00 2001 From: Chris Young Date: Tue, 23 Nov 2021 16:10:13 +0000 Subject: [PATCH 1/2] Add an AppMenuItem for "Eject ADF" This adds an "Eject ADF" item to the Workbench Tools menu. With any number of disk icons selected, choosing Eject ADF will attempt to eject them. --- src/includes.h | 115 ++++++++++++++++--------------- src/main.c | 184 +++++++++++++++++++++++++++++++++---------------- 2 files changed, 184 insertions(+), 115 deletions(-) diff --git a/src/includes.h b/src/includes.h index 4ebae9b..8ff617b 100644 --- a/src/includes.h +++ b/src/includes.h @@ -1,57 +1,58 @@ -#ifndef INCLUDES_H -#define INCLUDES_H - -#define STREQUAL(s1, s2) (strcmp(s1, s2) == 0) - -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#define ALL_REACTION_MACROS -#define ALL_REACTION_CLASSES -#include -#include - -#define ASM __asm -#define REG(x) register __ ## x - -#define BASEDEF(base) struct Library *base##Base = NULL -#define OPENLIB(base,name) if (!((base##Base) = OpenLibrary ((name),0))) CloseLibs() -#define CLOSELIB(base) if (base##Base) {CloseLibrary (base##Base); base##Base=NULL;} - -#define NAME_MAX 0X020 -#define PATH_MAX 0X100 -#define MAX_LISTED_ADF 0X200 -#define BUFFERSIZE 0X200 - -#include - -#endif \ No newline at end of file +#ifndef INCLUDES_H +#define INCLUDES_H + +#define STREQUAL(s1, s2) (strcmp(s1, s2) == 0) + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define ALL_REACTION_MACROS +#define ALL_REACTION_CLASSES +#include +#include + +#define ASM __asm +#define REG(x) register __ ## x + +#define BASEDEF(base) struct Library *base##Base = NULL +#define OPENLIB(base,name) if (!((base##Base) = OpenLibrary ((name),0))) CloseLibs() +#define CLOSELIB(base) if (base##Base) {CloseLibrary (base##Base); base##Base=NULL;} + +#define NAME_MAX 0X020 +#define PATH_MAX 0X100 +#define MAX_LISTED_ADF 0X200 +#define BUFFERSIZE 0X200 + +#include + +#endif diff --git a/src/main.c b/src/main.c index 7882f63..02918d3 100644 --- a/src/main.c +++ b/src/main.c @@ -188,10 +188,68 @@ int makeMenu(APTR MenuVisualInfo) return( 0L ); } +void ejectADFMenu(struct AppMessage *EjectADFMsg) +{ + ULONG i = 0, j = 0; + char VolName[104]; + int index = -1; + + /* Make sure our list is up-to-date before searching it */ + createADFList(); + + for(i = 0; i < EjectADFMsg->am_NumArgs; i++) { + NameFromLock(EjectADFMsg->am_ArgList[i].wa_Lock, &VolName, 104); + VolName[strlen(VolName)-1] = 0; + for(j = 0; j < MAX_LISTED_ADF; j++) { + if(strcmp(col2[j], VolName) == 0) { + index = j; + break; + } + } + if(index>=0) Eject(col1[index]); + } + + createADFList(); +} + +void removeEjectADFMenu(struct AppMenuItem *ejectADFItem, struct MsgPort *EjectADFMP) +{ + struct AppMessage *appmsg = NULL; + + RemoveAppMenuItem(ejectADFItem); + + while(appmsg = (struct AppMessage *)GetMsg(EjectADFMP)) { + ReplyMsg((struct Message *)appmsg); + } + DeleteMsgPort(EjectADFMP); +} + +struct MsgPort *addEjectADFMenu(struct AppMenuItem **ejectADFItem) +{ + struct MsgPort *EjectADFMP = NULL; + struct AppMenuItem *appmenuitem = NULL; + + if(EjectADFMP = CreateMsgPort()) { + appmenuitem = AddAppMenuItemA(0L, 0, "Eject ADF", EjectADFMP, NULL); + if(appmenuitem == NULL) { + DeleteMsgPort(EjectADFMP); + EjectADFMP = NULL; + } + } + + *ejectADFItem = appmenuitem; + return EjectADFMP; +} + int appMain() { ULONG result; UWORD code; + ULONG wait = 0; + struct MsgPort *EjectADFMP = NULL; + struct AppMenuItem *EjectADFItem = NULL; + ULONG EjectADFSignal = 0; + struct AppMessage *EjectADFMsg; ScreenPtr = LockPubScreen(NULL); VisualInfoPtr = GetVisualInfo(ScreenPtr, NULL); @@ -328,80 +386,89 @@ int appMain() makeMenu(VisualInfoPtr); SetMenuStrip(WindowPtr, dacMenu); createADFList(); - + EjectADFMP = addEjectADFMenu(&EjectADFItem); + EjectADFSignal = (1 << EjectADFMP->mp_SigBit); + GetAttr(WINDOW_SigMask, WindowObjectPtr, &signal); while(!done) { - Wait(signal | (1 << WindowPtr->UserPort->mp_SigBit)); - - while ((result = DoMethod(WindowObjectPtr, WM_HANDLEINPUT, &code)) != WMHI_LASTMSG) - { switch (result & WMHI_CLASSMASK) - { - case WMHI_CLOSEWINDOW: - done = TRUE; - break; - - case WMHI_GADGETUP: - switch(result & WMHI_GADGETMASK) - { + wait = Wait(signal | (1 << WindowPtr->UserPort->mp_SigBit) | EjectADFSignal); + + if(wait & EjectADFSignal) { + while(EjectADFMsg = (struct AppMessage *)GetMsg(EjectADFMP)) { + ejectADFMenu(EjectADFMsg); + ReplyMsg((struct Message *)EjectADFMsg); + } + } else { + while ((result = DoMethod(WindowObjectPtr, WM_HANDLEINPUT, &code)) != WMHI_LASTMSG) + { switch (result & WMHI_CLASSMASK) + { + case WMHI_CLOSEWINDOW: + done = TRUE; + break; + + case WMHI_GADGETUP: + switch(result & WMHI_GADGETMASK) + { - case IDLOADCHANGE: - loadChangeAdfWin(); - break; + case IDLOADCHANGE: + loadChangeAdfWin(); + break; - case IDCREATE: - createAdfWin(); - break; + case IDCREATE: + createAdfWin(); + break; - case IDEJECT: - clickEject(); - break; + case IDEJECT: + clickEject(); + break; - case IDEJECTALL: - clickEjectAll(); - break; - - case IDREFRESH: - createADFList(); - break; - - case IDLISTBROWSER: - selectedIndex = code; - break; - - default: - break; - } - break; + case IDEJECTALL: + clickEjectAll(); + break; + + case IDREFRESH: + createADFList(); + break; + + case IDLISTBROWSER: + selectedIndex = code; + break; + + default: + break; + } + break; - case WMHI_ICONIFY: /* iconify / uniconify */ - iconify(); - break; + case WMHI_ICONIFY: /* iconify / uniconify */ + iconify(); + break; - case WMHI_MENUPICK: - ProcessMenuIDCMPdacMenu(code); - break; + case WMHI_MENUPICK: + ProcessMenuIDCMPdacMenu(code); + break; - case WMHI_RAWKEY: - switch(code) - { - case 0x45: // press ESC to quit - done=TRUE; - break; + case WMHI_RAWKEY: + switch(code) + { + case 0x45: // press ESC to quit + done=TRUE; + break; - default: + default: + break; + } break; - } - break; - default: - break; + default: + break; + } } - } + } } - + appTop = WindowPtr->TopEdge; appLeft = WindowPtr->LeftEdge; appWidth = WindowPtr->Width; @@ -411,7 +478,8 @@ int appMain() freeList(&adfList); ClearMenuStrip(WindowPtr); FreeVisualInfo(VisualInfoPtr); - + removeEjectADFMenu(EjectADFItem, EjectADFMP); + // delete log file Execute("Delete RAM:dacgui.log >NIL:", NULL, NULL); From 1de93fc36219f02cded6772fcb74f41116a436ba Mon Sep 17 00:00:00 2001 From: Chris Young Date: Tue, 23 Nov 2021 16:28:22 +0000 Subject: [PATCH 2/2] Only try to eject disks Check name is '' before searching list --- src/main.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main.c b/src/main.c index 02918d3..70cb43e 100644 --- a/src/main.c +++ b/src/main.c @@ -198,15 +198,17 @@ void ejectADFMenu(struct AppMessage *EjectADFMsg) createADFList(); for(i = 0; i < EjectADFMsg->am_NumArgs; i++) { - NameFromLock(EjectADFMsg->am_ArgList[i].wa_Lock, &VolName, 104); - VolName[strlen(VolName)-1] = 0; - for(j = 0; j < MAX_LISTED_ADF; j++) { - if(strcmp(col2[j], VolName) == 0) { - index = j; - break; + if(EjectADFMsg->am_ArgList[i].wa_Name[0] = 0) { + NameFromLock(EjectADFMsg->am_ArgList[i].wa_Lock, &VolName, 104); + VolName[strlen(VolName)-1] = 0; + for(j = 0; j < MAX_LISTED_ADF; j++) { + if(strcmp(col2[j], VolName) == 0) { + index = j; + break; + } } + if(index>=0) Eject(col1[index]); } - if(index>=0) Eject(col1[index]); } createADFList(); @@ -1338,4 +1340,4 @@ void iconify(void) { done = TRUE; } -} \ No newline at end of file +}