From 5a7e0de0d15a5e5a0cab7ed9f9783cbf532381c2 Mon Sep 17 00:00:00 2001 From: Stephen Heumann Date: Wed, 10 Apr 2019 22:07:37 -0500 Subject: [PATCH] Set things up so that events on the window are handled similarly to an NDA. At this point, the controls in the window are active (but do nothing), and the window can be closed. --- diskbrowser.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 75 insertions(+), 2 deletions(-) diff --git a/diskbrowser.c b/diskbrowser.c index ec9dd39..802fcfd 100644 --- a/diskbrowser.c +++ b/diskbrowser.c @@ -1,5 +1,6 @@ #pragma rtl +#include #include #include #include @@ -72,6 +73,62 @@ void DrawContents(void) { } #pragma databank 0 +#pragma databank 1 +void CloseBrowserWindow(void) { + if (windowOpened) { + CloseWindow(window); + windowOpened = false; + window = NULL; + } + + if (resourceFileOpened && !windowOpened) { + CloseResourceFile(resourceFileID); + resourceFileOpened = false; + } +} +#pragma databank 0 + +/* NDA-style action routine for our window */ +#pragma databank 1 +int ActionProc(EventRecord *eventRec, int actionCode) { + static WmTaskRec taskRec; + int handledEvent = 0; + + switch (actionCode) { + case eventAction: + /* Copy basic event rec & use our own wmTaskMask, as per IIgs TN 84 */ + memset(&taskRec, sizeof(taskRec), 0); + memmove(&taskRec, eventRec, 16); + taskRec.wmTaskMask = 0x1F7FFF; /* everything except tmInfo */ + + TaskMasterDA(0, &taskRec); + break; + + case cursorAction: + break; + + case cutAction: // TODO + break; + case copyAction: + break; + case pasteAction: + break; + case clearAction: + break; + } + + return handledEvent; +} +#pragma databank 0 + +asm void actionProcWrapper(void) { + pha + phy + phx + jsl ActionProc + rtl +} + void ShowBrowserWindow(void) { if (windowOpened) { BringToFront(window); @@ -100,10 +157,26 @@ void ShowBrowserWindow(void) { windowOpened = true; SetSysWindow(window); + + AuxWindInfoRecord *auxWindInfo = GetAuxWindInfo(window); + if (toolerror()) { + CloseWindow(window); + windowOpened = false; + window = NULL; + goto cleanup; + } + + memset(&sysWindRecord, sizeof(sysWindRecord), 0); + sysWindRecord.closeProc = (ProcPtr)CloseBrowserWindow; + sysWindRecord.actionProc = (ProcPtr)actionProcWrapper; + sysWindRecord.eventMask = 0xFFFF; //0x03FF; + sysWindRecord.memoryID = myUserID; + auxWindInfo->NDASysWindPtr = (Ptr)&sysWindRecord; cleanup: - if (resourceFileOpened) { - //CloseResourceFile(resourceFileID); // FIXME OK to do here ?? + if (resourceFileOpened && !windowOpened) { + CloseResourceFile(resourceFileID); + resourceFileOpened = false; } SetCurResourceApp(origResourceApp);