From 3c6cc29c52c42f20bbbe139ed1381b2f9b6285ec Mon Sep 17 00:00:00 2001 From: John Bintz Date: Sun, 2 Oct 2022 16:59:06 -0400 Subject: [PATCH] hacking away at this --- .gitignore | 1 + Makefile | 2 + main | Bin 0 -> 10656 bytes main.c | 423 +++++++++++++++++++++++++++++++++++++++++++++++++++++ main.lnk | 4 + 5 files changed, 430 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100755 main create mode 100644 main.c create mode 100644 main.lnk diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5761abc --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.o diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..335111b --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +main: *.c + vamos -c ../.vamosc sc main.c LINK diff --git a/main b/main new file mode 100755 index 0000000000000000000000000000000000000000..df9ca7385441b01e6621ab0524a2c338d6467b6a GIT binary patch literal 10656 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
  • 5hZjddbMe&hYrHtxSCKri5)+XJ~)ef8^Kb+qmNcAnIm+c+-0 zn{mPA_a$OH8RtYLh?@`kj<0gy9#pM+b`bZV{YVGIh&$px2>gBH__s~qk8Rl88c(*hk6*;D2izKfZ^J)1Qj!EgRO~O8;B8;qM3jxBeu4@$K|z4*!=&Ch*@L zOEBbf^fvs5f&Zw$54~XC{0h>VQrfYuP4%g5$GY0^olZWA)52##Y*2kDHGipuwyKm> z~O{MD#j(%IH}k=mEZ&DG53_B}%{f)FWb7IsYrg z&4^VcK!xz(VhU!BbAk8MW3U|sfP(|j-;|*+!LO$G(OAM{X$i~pJ0-@jr|E24Jr z5CyG>?jxEg)+IE|@de!!!+uC3y&&T3$X^PKup#6F$Uj6rggfnrC=cM?t)hGi=^WCC z@Xymz*$E>rW@n7Ngk8wq>rcRkCuyl+O*rBU2}BIIR^lilp0Q@IE+1hx4?=oJ|NiHO zoy%G*-TVBYV-g@!oRj)}r4)CpxGw1iCj4@NCGcI&>BcW7CT!W6Jv?DLW5q8j$li?a z!t!X&`aM5*X0M1eUO8k$VG$|D-k8N#RKu=D>5>(Z&O&^%Q5;x<;Txz;-~kk|g;Bsi zc1+G%;7lCYpqsD2$$A-74aSRLug*FwIgTtNB(r~e{v>SMU?%F~^b4!W{RWoL@T-pl z?D9Pu$wCJ(@_-{33lVtF#{GajHID79>I2?)grtz4$YMZ0^x8Py>ykl3<3#;oL?Coh z`s5hmL^wUthz?Ky8sn#6u+N0w`j|RX65jumlJWbOS5Z2Fe8Bi##ljtR9qoEYJI==C zwTlQhJ#W#?(Vu$~>@pcvHv9xmrV)Z6K*GcE3mWK*Q7@PUOJ9bB`lM07>_`QfHfRe? zI)XAD(-ovoQTSbBQjc!qjT<&Kr$lc%T}D_Em}MP7gCe8ztuN8T=+!R9RtOtzbXg4P z(k-xh+(&W`K5w91%v2F;-m+nRv#76azzFe^~RrcDDfOSr{TzbC2oDe*@q!CTIWv literal 0 HcmV?d00001 diff --git a/main.c b/main.c new file mode 100644 index 0000000..042edab --- /dev/null +++ b/main.c @@ -0,0 +1,423 @@ +#include + +// this is the manual for the original intuition stuff. +// not much here is different: https://ia801905.us.archive.org/33/items/Amiga_Intuition_Reference_Manaual_1985_Adn-Wesley_Publishing_Company/Amiga_Intuition_Reference_Manaual_1985_Addison-Wesley_Publishing_Company.pdf +#include +#include +#include +#include + +#include +#include + +// gadtools gives a proper set of components for building UIs. +// http://amigadev.elowar.com/read/ADCD_2.1/Libraries_Manual_guide/node0278.html +#include +#include + +#define WINDOW_WIDTH (240) +#define WINDOW_HEIGHT (100) +#define WINDOW_TITLE "Topaz Timer" + +#define WINDOW_CHROME_WIDTH (4) + +struct NewWindow winlayout = { + 20, 20, // x, y + WINDOW_WIDTH, WINDOW_HEIGHT, // w, h + 0, 1, // detailpen, blockpen, + // you have to add the different gadget types you're looking for + // http://amigadev.elowar.com/read/ADCD_2.1/Includes_and_Autodocs_2._guide/node0106.html + IDCMP_CLOSEWINDOW | BUTTONIDCMP | SLIDERIDCMP, // IDCMP flags + WFLG_SMART_REFRESH | WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET | WFLG_ACTIVATE, // window flag from Window struct + NULL, // FirstGadget + NULL, // menu checkmark + WINDOW_TITLE, // title + NULL, // default screen + NULL, // bitmap + WINDOW_WIDTH, WINDOW_HEIGHT, // min size + WINDOW_WIDTH, WINDOW_HEIGHT, // max size, + WBENCHSCREEN // screen where you want the window to open +}; + +struct TextAttr Topaz80 = { "topaz.font", 8, 0, 0 }; + +// There's no native 16 pixel Topaz font so we'll use +// diskfont.library to make one. +struct TextAttr Topaz160 = { "topaz.font", 16, 0, 0 }; + +#define START_STOP_BUTTON_ID 0 +#define RESET_BUTTON_ID 1 +#define HOURS_SLIDER_ID 2 +#define MINUTES_SLIDER_ID 3 +#define SECONDS_SLIDER_ID 5 + +#define TIMER_COUNTDOWN_COUNT 3 + +struct Window *window; +struct TextFont *topaz80Font; +struct TextFont *topaz160Font; +struct Screen *screen; +void *visualInfo; + +struct Gadget *timerGadget; + +unsigned int uiHours = 0; +unsigned int uiMinutes = 12; +unsigned int uiSeconds = 0; + +unsigned int activeHours; +unsigned int activeMinutes; +unsigned int activeSeconds; + +char timerText[9]; + +BOOL timerIsRunning; + +struct Device *TimerBase; +static struct IORequest timereq; + +/** + * Initialize system stuff. + */ +int setup() { + // http://amigadev.elowar.com/read/ADCD_2.1/Includes_and_Autodocs_3._guide/node0308.html + // make sure the font exists on the computer + if (NULL == (topaz80Font = OpenFont(&Topaz80))) { + return 0; + } + + if (NULL == (topaz160Font = OpenDiskFont(&Topaz160))) { + return 0; + } + + if (NULL == (screen = LockPubScreen(NULL))) { + return 0; + } + + if (NULL == (visualInfo = GetVisualInfo(screen, TAG_END))) { + return 0; + } + + if (0 != (OpenDevice("timer.device", 0, &timereq, 0))) { + return 0; + } + + TimerBase = timereq.io_Device; + + activeHours = uiHours; + activeMinutes = uiMinutes; + activeSeconds = uiSeconds; + + return 1; +} + +/** + * Tear down system stuff. + */ +void teardown() { + if (visualInfo) FreeVisualInfo(visualInfo); + if (screen) UnlockPubScreen(NULL, screen); + if (topaz80Font) CloseFont(topaz80Font); + if (topaz160Font) CloseFont(topaz160Font); + if (timereq.io_Device) CloseDevice(&timereq); +} + +struct Gadget *buildUI() { + struct NewGadget ng; + struct Gadget *currentGadget; + struct Gadget *glist; + + currentGadget = CreateContext(&glist); + + ng.ng_LeftEdge = WINDOW_CHROME_WIDTH; + // TODO: constantize these + ng.ng_TopEdge = 11; + ng.ng_Height = 12; + + ng.ng_Width = 0; + ng.ng_GadgetText = NULL; + ng.ng_TextAttr = &Topaz80; + ng.ng_VisualInfo = visualInfo; + + // TODO: use constants to indicate which gadget is which + ng.ng_GadgetID = NULL; + ng.ng_Flags = PLACETEXT_IN; + + // Timer display + ng.ng_Width = WINDOW_WIDTH - WINDOW_CHROME_WIDTH * 2; + ng.ng_TextAttr = &Topaz160; + ng.ng_Height = 20; + + timerGadget = currentGadget = CreateGadget( + TEXT_KIND, + currentGadget, + &ng, + GTTX_Text, "", + GTTX_Justification, GTJ_CENTER, + GTTX_Border, TRUE, + TAG_END + ); + + ng.ng_TextAttr = &Topaz80; + ng.ng_Height = 12; + + ng.ng_Width = (WINDOW_WIDTH - WINDOW_CHROME_WIDTH * 2) / 2; + ng.ng_TopEdge += 18; + if (timerIsRunning) { + ng.ng_GadgetText = "_Stop"; + } else { + ng.ng_GadgetText = "_Start"; + } + + ng.ng_GadgetID = START_STOP_BUTTON_ID; + + currentGadget = CreateGadget( + BUTTON_KIND, + currentGadget, + &ng, + GT_Underscore, '_', + TAG_END + ); + + ng.ng_LeftEdge += (WINDOW_WIDTH - WINDOW_CHROME_WIDTH * 2) / 2; + ng.ng_GadgetText = "_Reset"; + ng.ng_GadgetID = RESET_BUTTON_ID; + + currentGadget = CreateGadget( + BUTTON_KIND, + currentGadget, + &ng, + GT_Underscore, '_', + GA_Disabled, timerIsRunning, + TAG_END + ); + + ng.ng_LeftEdge = 85; + ng.ng_Width = (WINDOW_WIDTH - WINDOW_CHROME_WIDTH * 2) - 85 + 4; + ng.ng_TopEdge += 12; + ng.ng_GadgetText = "Hours: "; + ng.ng_Flags = PLACETEXT_LEFT; + ng.ng_GadgetID = HOURS_SLIDER_ID; + + currentGadget = CreateGadget( + SLIDER_KIND, + currentGadget, + &ng, + GT_Underscore, '_', + GTSL_Min, 0, + GTSL_Max, 23, + GTSL_Level, uiHours, + GTSL_MaxLevelLen, 2, + GTSL_LevelFormat, "%2ld", + GA_Disabled, timerIsRunning, + TAG_END + ); + + ng.ng_TopEdge += 12; + ng.ng_GadgetText = "Mins: "; + ng.ng_GadgetID = MINUTES_SLIDER_ID; + + currentGadget = CreateGadget( + SLIDER_KIND, + currentGadget, + &ng, + GT_Underscore, '_', + GTSL_Min, 0, + GTSL_Max, 59, + GTSL_Level, uiMinutes, + GTSL_MaxLevelLen, 2, + GTSL_LevelFormat, "%2ld", + GA_Disabled, timerIsRunning, + TAG_END + ); + + ng.ng_TopEdge += 12; + ng.ng_GadgetText = "Secs: "; + ng.ng_GadgetID = SECONDS_SLIDER_ID; + + currentGadget = CreateGadget( + SLIDER_KIND, + currentGadget, + &ng, + GT_Underscore, '_', + GTSL_Min, 0, + GTSL_Max, 59, + GTSL_Level, uiSeconds, + GTSL_MaxLevelLen, 2, + GTSL_LevelFormat, "%2ld", + GA_Disabled, timerIsRunning, + TAG_END + ); + + return glist; +} + +void setTimerText() { + // TODO: don't rerender if the time hasn't changed + sprintf(timerText, "%02d:%02d:%02d", activeHours, activeMinutes, activeSeconds); + GT_SetGadgetAttrs( + timerGadget, + window, + NULL, + GTTX_Text, &timerText, + TAG_DONE + ); +} + +int main() { + struct Gadget *gad; + + BOOL terminated = FALSE; + BOOL rerenderTimer = FALSE; + + struct IntuiMessage *iMessage; + struct Gadget *targetGadget; + struct timeval currentSystemTime; + + unsigned int timerRerenderCountdown = 0; + + // timeval tv_secs is ULONG and that will let us have accurate + // time counting via timer.device. + ULONG timerStartTime, timerDistance, timerBuild; + + timerIsRunning = FALSE; + + if (0 == setup()) { + teardown(); + return 1; + } + + GetSysTime(¤tSystemTime); + timerStartTime = currentSystemTime.tv_secs; + + window = OpenWindow(&winlayout); + + gad = buildUI(); + + // use -1 for working with all gadgets + AddGList(window, gad, -1, -1, NULL); + RefreshGList(gad, window, NULL, -1); + GT_RefreshWindow(window, NULL); + + setTimerText(); + + // what the fuck, you have to set the labels afterwards? + // you know what, it's better if it's explicit rather than the + // pointer shit it was trying to do before. + //GT_SetGadgetAttrs(one, window, NULL, GTTX_Text, "wow", TAG_DONE); + + // after doing anything with gadgets, you need to refresh them + //RefreshGList(gad, window, NULL, 3); + + // you son of a bitch, this is what you need + printf("sig signal %d\n", window->UserPort->mp_SigBit); + while (!terminated) { + // what is a userport on a window + // http://amigadev.elowar.com/read/ADCD_2.1/Libraries_Manual_guide/node02EB.html + // http://www.amigadev.elowar.com/read/ADCD_2.1/Includes_and_Autodocs_2._guide/node038A.html + //WaitPort(window->UserPort); + // but we need a timer + + // this shoud be responsive enoug + Delay(4); + + if (timerIsRunning) { + timerRerenderCountdown += 1; + if (timerRerenderCountdown > TIMER_COUNTDOWN_COUNT) { + timerRerenderCountdown = 0; + + GetSysTime(¤tSystemTime); + + timerDistance = currentSystemTime.tv_secs - timerStartTime; + + timerBuild = (uiHours * 3600 + uiMinutes * 60 + uiSeconds) - timerDistance; + + activeHours = timerBuild / 3600; + activeMinutes = timerBuild / 60 % 60; + activeSeconds = timerBuild % 60; + + setTimerText(); + } + } + + while ((!terminated) && (iMessage = GT_GetIMsg(window->UserPort))) { + switch (iMessage->Class) { + case IDCMP_GADGETUP: + targetGadget = (struct Gadget *)iMessage->IAddress; + + switch (targetGadget->GadgetID) { + case START_STOP_BUTTON_ID: + timerIsRunning = !timerIsRunning; + + if (timerIsRunning) { + GetSysTime(¤tSystemTime); + + timerStartTime = currentSystemTime.tv_secs; + timerRerenderCountdown = 0; + rerenderTimer = TRUE; + } + + RemoveGList(window, gad, -1); + FreeGadgets(gad); + + gad = buildUI(); + AddGList(window, gad, -1, -1, NULL); + RefreshGList(gad, window, NULL, -1); + GT_RefreshWindow(window, NULL); + + break; + case RESET_BUTTON_ID: + rerenderTimer = TRUE; + activeHours = uiHours; + activeMinutes = uiMinutes; + activeSeconds = uiSeconds; + break; + } + + break; + case IDCMP_MOUSEMOVE: + targetGadget = (struct Gadget *)iMessage->IAddress; + + switch (targetGadget->GadgetID) { + case HOURS_SLIDER_ID: + activeHours = uiHours = iMessage->Code; + rerenderTimer = TRUE; + break; + case MINUTES_SLIDER_ID: + activeMinutes = uiMinutes = iMessage->Code; + rerenderTimer = TRUE; + break; + case SECONDS_SLIDER_ID: + activeSeconds = uiSeconds = iMessage->Code; + rerenderTimer = TRUE; + break; + } + break; + + case IDCMP_CLOSEWINDOW: + terminated = TRUE; + break; + case IDCMP_REFRESHWINDOW: + GT_BeginRefresh(window); + GT_EndRefresh(window, TRUE); + break; + } + + if (rerenderTimer) { + setTimerText(); + rerenderTimer = FALSE; + } + } + } + + RemoveGList(window, gad, -1); + FreeGadgets(gad); + + if (window) { + CloseWindow(window); + } + + teardown(); + + return 0; +} diff --git a/main.lnk b/main.lnk new file mode 100644 index 0000000..7468083 --- /dev/null +++ b/main.lnk @@ -0,0 +1,4 @@ +FROM LIB:c.o "main.o" +TO "main" +LIB LIB:sc.lib LIB:amiga.lib +