From b1ddbf523110db58dad518a2ccf6e71fd7ea0e7f Mon Sep 17 00:00:00 2001 From: Wei-ju Wu Date: Mon, 11 Jan 2016 23:16:31 -0800 Subject: [PATCH] added requesters sub project --- requesters/Makefile | 12 +++ requesters/README.md | 6 ++ requesters/filereq.c | 131 ++++++++++++++++++++++++++++++ requesters/filereq.h | 10 +++ requesters/main | Bin 0 -> 11320 bytes requesters/main.c | 189 +++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 348 insertions(+) create mode 100644 requesters/Makefile create mode 100644 requesters/README.md create mode 100644 requesters/filereq.c create mode 100644 requesters/filereq.h create mode 100755 requesters/main create mode 100644 requesters/main.c diff --git a/requesters/Makefile b/requesters/Makefile new file mode 100644 index 0000000..63e0796 --- /dev/null +++ b/requesters/Makefile @@ -0,0 +1,12 @@ +#CC=vc +aos68k +CC=vc +kick13 +CFLAGS=-c99 -I$(NDK_INC) -DDEBUG + +all: main + +clean: + rm -f *.o main + +main: main.o filereq.o + $(CC) $(CFLAGS) $^ -lamiga -lauto -o $@ + diff --git a/requesters/README.md b/requesters/README.md new file mode 100644 index 0000000..3231623 --- /dev/null +++ b/requesters/README.md @@ -0,0 +1,6 @@ +# Requesters + +## Description + +a project to design standard requesters that will work under any +Amiga operating system version diff --git a/requesters/filereq.c b/requesters/filereq.c new file mode 100644 index 0000000..74815eb --- /dev/null +++ b/requesters/filereq.c @@ -0,0 +1,131 @@ +#include +#include +#include + +#include + +#include "filereq.h" + +#define REQ_TEXT_XOFFSET 10 +#define REQ_WIDTH 240 +#define REQ_HEIGHT 170 +#define TOPAZ_BASELINE 8 + +#define BUTTON_Y 140 +#define BUTTON_HEIGHT 18 + +#define BUTTON_TEXT_XOFFSET 14 +#define OK_BUTTON_X 20 +#define CANCEL_BUTTON_X 160 +#define OK_BUTTON_WIDTH 40 +#define CANCEL_BUTTON_WIDTH 60 + +#define STR_GADGET_X 90 +#define STR_GADGET_Y 120 +#define PATH_GADGET_WIDTH 100 + + +struct Requester requester; +struct IntuiText labels[] = { + {1, 0, JAM2, REQ_TEXT_XOFFSET, STR_GADGET_Y, NULL, "Enter file path", NULL}, + {1, 0, JAM2, 10, TOPAZ_BASELINE - 4, NULL, "Ok", NULL}, + {1, 0, JAM2, 10, TOPAZ_BASELINE - 4, NULL, "Cancel", NULL} /* TOPAZ_BASELINE is 8 */ +}; +WORD gadget_border_points[3][10] = { + {0, 0, OK_BUTTON_WIDTH, 0, OK_BUTTON_WIDTH, BUTTON_HEIGHT, 0, BUTTON_HEIGHT, 0, 0}, + {0, 0, CANCEL_BUTTON_WIDTH, 0, CANCEL_BUTTON_WIDTH, BUTTON_HEIGHT, 0, BUTTON_HEIGHT, 0, 0}, + /* the -2 is the margin to set to avoid that the string gadget will overdraw the + borders */ + {-2, -2, PATH_GADGET_WIDTH, -2, PATH_GADGET_WIDTH, 10, -2, 10, -2, -2} +}; +struct Border gadget_borders[] = { + {0, 0, 1, 0, JAM1, 5, gadget_border_points[0], NULL}, + {0, 0, 1, 0, JAM1, 5, gadget_border_points[1], NULL}, + {0, 0, 1, 0, JAM1, 5, gadget_border_points[2], NULL} +}; + +WORD req_border_points[] = { + 0, 0, REQ_WIDTH - 1, 0, REQ_WIDTH - 1, REQ_HEIGHT - 1, 0, REQ_HEIGHT - 1, 0, 0 +}; +struct Border req_border = {0, 0, 1, 0, JAM1, 5, req_border_points, NULL}; + +UBYTE buffer[81], undobuffer[81]; +struct StringInfo strinfo = {buffer, undobuffer, 0, 80, 0, 0, 0, 0, 0, 0, NULL, 0, NULL}; + +/* + Note: Cancel does not specify the GACT_ENDGADGET flag, it seems that + IDCMP_REQCLEAR is not fired when Intuition closes the requester automatically +*/ +struct Gadget gadgets[] = { + {&gadgets[1], OK_BUTTON_X, BUTTON_Y, OK_BUTTON_WIDTH, BUTTON_HEIGHT, GFLG_GADGHCOMP, + GACT_RELVERIFY, GTYP_BOOLGADGET | GTYP_REQGADGET, &gadget_borders[0], NULL, + &labels[1], 0, NULL, REQ_OK_BUTTON_ID, NULL}, + {&gadgets[2], CANCEL_BUTTON_X, BUTTON_Y, CANCEL_BUTTON_WIDTH, BUTTON_HEIGHT, GFLG_GADGHCOMP, + GACT_RELVERIFY, GTYP_BOOLGADGET | GTYP_REQGADGET, &gadget_borders[1], NULL, + &labels[2], 0, NULL, REQ_CANCEL_BUTTON_ID, NULL}, + {NULL, STR_GADGET_X, STR_GADGET_Y, PATH_GADGET_WIDTH, 10, + GFLG_GADGHCOMP, GACT_RELVERIFY, GTYP_STRGADGET, &gadget_borders[2], NULL, + &labels[3], 0, &strinfo, 103, NULL}, +}; + +BOOL initialized = 0; +#define PATHBUFFER_SIZE 200 +char dirname[PATHBUFFER_SIZE + 1]; +BPTR flock; +LONG error; +struct FileInfoBlock fileinfo; + +void print_fileinfo(struct FileInfoBlock *fileinfo) +{ + if (fileinfo->fib_DirEntryType > 0) { + printf("dir: '%s'\n", fileinfo->fib_FileName); + } else { + printf("file: '%s'\n", fileinfo->fib_FileName); + } +} + +struct Requester *open_file(struct Window *window) +{ + BOOL result; + if (!initialized) { + InitRequester(&requester); + requester.LeftEdge = 20; + requester.TopEdge = 20; + requester.Width = REQ_WIDTH; + requester.Height = REQ_HEIGHT; + requester.Flags = 0; + requester.BackFill = 0; + requester.ReqGadget = &gadgets[0]; + requester.ReqBorder = &req_border; + requester.ReqText = &labels[0]; + + /* scan current directory */ + /* + on AmigaOS versions before 36 (essentially all 1.x versions), the + function GetCurrentDirName() does not exist, but it's obtainable + by calling Cli() and querying the returned CommandLineInterface + structure + */ + puts("scanning directory..."); + /* + // on AmigaOS 1.x, this function does not exist !!! + GetCurrentDirName(dirname, PATHBUFFER_SIZE); + printf("current dir: '%s'\n", dirname); + flock = Lock(dirname, SHARED_LOCK); + if (Examine(flock, &fileinfo)) { + while (ExNext(flock, &fileinfo)) { + print_fileinfo(&fileinfo); + } + error = IoErr(); + if (error != ERROR_NO_MORE_ENTRIES) { + puts("unknown I/O error, TODO handle"); + } + } + UnLock(flock); + */ + + initialized = 1; + } + result = Request(&requester, window); + return result ? &requester : NULL; +} diff --git a/requesters/filereq.h b/requesters/filereq.h new file mode 100644 index 0000000..8e7a28e --- /dev/null +++ b/requesters/filereq.h @@ -0,0 +1,10 @@ +#pragma once +#ifndef __FILEREQ_H__ +#define __FILEREQ_H__ + +extern struct Requester *open_file(struct Window *window); + +#define REQ_OK_BUTTON_ID 101 +#define REQ_CANCEL_BUTTON_ID 102 + +#endif /* __FILEREQ_H__ */ diff --git a/requesters/main b/requesters/main new file mode 100755 index 0000000000000000000000000000000000000000..fe9fcf7a6eefc11e5df8645dc177ded13222888d GIT binary patch literal 11320 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 MIE~AQjIsFt0o~S~(f|Me literal 0 HcmV?d00001 diff --git a/requesters/main.c b/requesters/main.c new file mode 100644 index 0000000..e3c4ea9 --- /dev/null +++ b/requesters/main.c @@ -0,0 +1,189 @@ +/* main.c - requester demo application + + This file is part of amiga-stuff. + + amiga-stuff is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + amiga-stuff is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with amiga30yrs. If not, see . + */ +#include + +#include +#include + +#include +#include +#include +#include + +#ifdef __VBCC__ +#include +#endif +#include "filereq.h" + +#define WIN_LEFT 10 +#define WIN_TOP 10 +#define WIN_WIDTH 340 +#define WIN_HEIGHT 220 +#define WIN_TITLE "IFF Viewer" +#define WIN_MIN_WIDTH 10 +#define WIN_MIN_HEIGHT 10 +#define WIN_MAX_WIDTH WIN_WIDTH +#define WIN_MAX_HEIGHT WIN_HEIGHT + +#define FILE_MENU_NUM 0 +#define NUM_FILE_MENU_ITEMS 2 + +#define OPEN_MENU_ITEM_NUM 0 +#define QUIT_MENU_ITEM_NUM 1 + +struct NewWindow newwin = { + WIN_LEFT, WIN_TOP, WIN_WIDTH, WIN_HEIGHT, 0, 1, + IDCMP_CLOSEWINDOW | IDCMP_MENUPICK | IDCMP_GADGETUP | IDCMP_REQCLEAR, + WINDOWCLOSE | SMART_REFRESH | ACTIVATE | WINDOWSIZING | WINDOWDRAG | WINDOWDEPTH | NOCAREREFRESH, + NULL, NULL, WIN_TITLE, + NULL, NULL, + WIN_MIN_WIDTH, WIN_MIN_HEIGHT, + WIN_MAX_WIDTH, WIN_MAX_HEIGHT, + WBENCHSCREEN +}; + +struct IntuiText menutext[] = { + {0, 1, JAM2, 0, 1, NULL, "Open...", NULL}, + {0, 1, JAM2, 0, 1, NULL, "Quit", NULL} +}; + +struct MenuItem fileMenuItems[] = { + {&fileMenuItems[1], 0, 0, 0, 0, ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ, 0, + &menutext[0], NULL, 'O', NULL, 0}, + {NULL, 0, 0, 0, 0, ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ, 0, + &menutext[1], NULL, 'Q', NULL, 0} +}; + +struct Menu menus[] = { + {NULL, 20, 0, 0, 0, MENUENABLED | MIDRAWN, "File", &fileMenuItems[0], 0, 0, 0, 0} +}; + +struct Window *window; + +void cleanup() +{ + if (window) { + ClearMenuStrip(window); + CloseWindow(window); + } +} + +struct Requester *filereq; + +BOOL handle_menu(UWORD menuNum, UWORD itemNum, UWORD subItemNum) +{ + printf("menu, menu num: %d, item num: %d, sub item num: %d\n", + (int) menuNum, (int) itemNum, (int) subItemNum); + if (menuNum == FILE_MENU_NUM && itemNum == QUIT_MENU_ITEM_NUM) { + /* quit */ + return TRUE; + } + if (menuNum == FILE_MENU_NUM && itemNum == OPEN_MENU_ITEM_NUM) { + filereq = open_file(window); + } + return FALSE; +} + +void handle_events() +{ + BOOL done = FALSE; + struct IntuiMessage *msg; + ULONG msgClass; + UWORD menuCode; + int buttonId; + + while (!done) { + Wait(1 << window->UserPort->mp_SigBit); + if (msg = (struct IntuiMessage *) GetMsg(window->UserPort)) { + msgClass = msg->Class; + switch (msgClass) { + case IDCMP_CLOSEWINDOW: + done = TRUE; + break; + case IDCMP_MENUPICK: + menuCode = msg->Code; + done = handle_menu(MENUNUM(menuCode), ITEMNUM(menuCode), SUBNUM(menuCode)); + break; + case IDCMP_GADGETUP: + buttonId = (int) ((struct Gadget *) (msg->IAddress))->GadgetID; + if (buttonId == REQ_OK_BUTTON_ID && filereq) EndRequest(filereq, window); + else if (buttonId == REQ_CANCEL_BUTTON_ID && filereq) EndRequest(filereq, window); + break; + case IDCMP_REQCLEAR: + puts("requester closed"); + break; + default: + break; + } + ReplyMsg((struct Message *) msg); + } + } +} + +void setup_menu() +{ + UWORD txWidth, txHeight, txBaseline, txSpacing, itemWidth, itemHeight, numItems; + struct RastPort *rp = &window->WScreen->RastPort; + int i; + + txWidth = rp->TxWidth; + txHeight = rp->TxHeight; + txBaseline = rp->TxBaseline; + txSpacing = rp->TxSpacing; + printf("TxWidth: %d, TxHeight: %d, TxBaseline: %d, TxSpacing: %d\n", + (int) txWidth, (int) txHeight, (int) txBaseline, (int) txSpacing); + + /* Set file menu bounds */ + menus[0].Width = TextLength(rp, "File", strlen("File")) + txWidth; + menus[0].Height = txHeight; + + /* Set file menu items bounds */ + /* We actually need to know what the command uses up */ + itemWidth = txWidth * strlen("Open...") + 50; + itemHeight = txHeight + 2; /* 2 pixels adjustment */ + + numItems = sizeof(fileMenuItems) / sizeof(struct MenuItem); + printf("# file items: %d\n", (int) numItems); + for (i = 0; i < numItems; i++) { + fileMenuItems[i].TopEdge = i * itemHeight; + fileMenuItems[i].Height = itemHeight; + fileMenuItems[i].Width = itemWidth; + } + + SetMenuStrip(window, &menus[0]); +} + +/* Defined automatically in VBCC */ +extern struct Library *DOSBase; + +int main(int argc, char **argv) +{ + /* version: e.g. 34, revision e.g. 3 for Kickstart 1.3 */ + printf("DOS, version: %d, revision: %d\n", + (int) DOSBase->lib_Version, (int) DOSBase->lib_Revision); + + /* Adjust the new screen according to the IFF image */ + if (window = OpenWindow(&newwin)) { + setup_menu(); + // Note: rastport is the entire window, including title bars + //DrawImage(window->RPort, &image, 2, 10); + handle_events(); + } + cleanup(); + return 1; +}