From 427ac1368ff78c0eb76bab67ccd2f1f28ef873f7 Mon Sep 17 00:00:00 2001 From: John Bintz Date: Tue, 4 Oct 2022 08:08:15 -0400 Subject: [PATCH] this is close enough --- main | Bin 8204 -> 8976 bytes main.c | 193 ++++++++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 170 insertions(+), 23 deletions(-) diff --git a/main b/main index b1040bdb147b05e23b707fc0ab2bd7c871b655c5..a11839ace799be79e8b033a8fc5e89643cce2d3f 100755 GIT binary patch delta 4654 zcma)A4Qx}_6+Z91o5XdU#7*7Eq$as@-OP3$wu>T~qO5%}Y4Kd+1RAk0p<-vj4xJ%x zNKhJO_>m%pCR7C;tx$y~R8>$-7Da#%L##_HG^Gels6r^JP=hKaewO~ILsQBi*>|6v zG?XyS(RuIQbMHC#+;hKk&VAXVjl4Wk9WL8NBzcLbgh;tbRJJQ}efzX0;-O#u04}Km z#8#rE9P1_C1V&RruK#59*vwsDD{J$`mD77Wyg3#-mRCBu+PSK9l|WzGh`?UtYP|JgJ=HJK{(0c@lC!^R+7D zpiAIh_Lvt0?ITfX1Y0k+=oO1y%#U)=GUE^9DWQ$~%o z(o@n|V^C_zu|$wO8uybY?Nl?$Nv^r!16X>$}!$e9$z;x)*e4o z>51woTl`EF%Tj{zATdvdwLML~jB=61gtyk^mGPpDR$;Tb4;IKM<6LDOX~wm9ZX|xD zVp>ctPOOUNm2+vE*f_*52$4V(&b*qoxiiWYF%u>QqS$Vl3xnM%Tb~xZ!^N>7H_VM6 zo!*tG5*)~mrY(>?E9CG#iLp*z7n{g!kM|pACuyIWVI!D&8jku- zoEGf?_b|A-!Tk!{+u&|P|G?fcsFK0C22NM_2-m>X-L056-1;psj7(u98a@&}k|dk% z*Vt{f@Ck%$o8T}b}ZLhTu50^(a-{lR6{R?BK8wS!$n0U3o6>P zfTEC4Br}U~tkh}ZvD_KC9$Ly_D*(=q>nW#Ol~j+)yeD_0Y#vn#)vGLYYB=47{e(bj zkg(f*kqm20QpGLc&k;T%dgf}6@{DrVol$Ox6ME--y};;Y%(3}0l9zEjp&8E*3&nC1 zF`K~Hx+2DGZwD&`qMjY1N5~~w;SY(6_s@n%Dc8t@h;tONw^ZFAWKD=T3J|fy0S|YQ z?j{frlWq;B2r~|3XWaD8c_2Ls&ZIEzo%7k5_|e>STau=47pLjQXRtLNn`kkCZz{GG z6hHcJVVH6QqLT%MB5Z^*u}er@nP-f%DD!FLI$tVq^sCVpis+Hi=QZGN4Ls#cQrUWh zQqJk7uXpUzJ<>mi_wTqqd`bU$_)?y^d|{~pX_kY$ppfZ0kLfzqbX~*q0I9Sb#{aFO zHGza6pk}(?3vbav?liA~MN+U{ z^<|hx!g(^_0?!616h_P>>E0pC{TS3acStP-zgY8yI98So

eERyY(cZ18Km90f&6 zkn{mUys_xox9c^8q=jnmtRxqnR^lSm!yl1bL^ML6-b?@?aQ$WiP=i)La)2arJ2t@e zeY5o_e`UqDv@~1p5wQF!C$Q_;P_H4XTnJAq!qfGD=&6N7|1ZgN|4TAx<+)Yv9%?E8 zY8IiM4Hy8|y{drG={C;>zDoF_08hS|)@I4>rOIBCJ_$(Cms4?GR*Z>H(fdZsDEjU+ z3T_l-;0u&p$2vW2V>+%LcT?j-QsNTNslk%rDgsea&0HR#9W%_TCZ(n2ddm3dP8_u!;~D+ zXnL7x6Jg+Ng6MMnW^!dI^bFObpjlpp&ESqArvHTZX#i`_b|8d~V$KqB0_`?oC=AMa zwB}pn4z`g4{&R3Ure!~(!4HMonK)M5&X`Ty*^p7E%*6At;0hF>oaKu6ot~O4JhSIh z(pxAxMW>#}5sA4X4A0LiH}(S1N?JtFl`Tus?OI%yt$1G)xsHhQsygXCDiz>l8U8r|W zA|dI!W>b=%c**GR(_VALEq0B&{ak|bzoeNLRjar?{^u~N**K=}N}m>mGkqKpdo7U{ zicv~#6a&vpKS}!6_ht&ZDuV7rtUNBYDD4SnRApT$7X5w73Uk}}>i9^2I`U|t7ad7m zU4+WXx_DWjF5Vx1V_j=AKD1<4V0YTi-$cu4d|6R#lN-RW6d1=VOC?!eZCLCvnY9~h z?e1!&8y`T__q)Agmxi}_S4=9|m6OWO6K~rslApCPO}ZV>;&-M;h&Vo0f|R6htisCp z8-PeP(xM$zz1tXlEM;NciT42XZX-}tjqe-OKSz=z4)@z}Zdqe()dx#icd8Vf1ipR1 z@#vK3yHnvuxVFMhB*{hWdC!Rt}ul_W1iHRVYw=K_>) z;Cttw;a}vES)UPEv_@tLr)u zKpv1xWS;`h0kRgx2)xQ|Xyd1R54wfMWP49GIr#If#tPRja?PDR{e8S`)8Jr|w{P0K zv6sk;zwcr&w$Dhko%VW|*`3gtkDcXG@^any@iK2ZRs1NzV3~i zwsiGx?d#pt)4#Ph+1a_NFYue5%|x9WGnqi+)@=i{fEK=lKU@-?!N=m_2t7kC{9nO! z1GF2A4+|DPp`k5!V|aV<;R$E_Pbsi_Oer5&&41eaY>Z-x({I4qr zWd%i9juZ|-*6>E%kQ+e_AQc3yG7etmAQ#994K@%CPSHW_XreC(=S_nII0OJLgARlC RfwIQ2x*D0;jSF?!e*tmNIK=<} delta 3845 zcmZ`+e{2)i9sk}v+qlLg#&aVVLO8CT7rU;VB9w+HqZc(uhe>6;;uM8iZH^UJ4P47-f*`^Ufy9 zfI9l#z4v|J&-Zama4FD1ru7&x zYA2}?jCD!T`}ylba}RtiY`_<1)}yVpS=M_tFAnV3ECs{?OAb;wpTg?oMiNMfpPBn< zG^dj21TQeZ+B*V-O!l4RA=f)@tX2D(nEP0s)iq5qmvkV0=AkDk1{Lg63-W*~NqN>= zMws||IL`(%Bp;nyR%uFGGCPt)Mc;4eB)g#33Q`5jj~sY2Cn_*jVGezZ@VsEx_X*8e zHW(t0BKgUqx&s z+;PCGIV2c`c%5pOH5TBKFewPBK~>@g%K>&l<-ES~S|{WN<7Z|MC7qlDtV6YeXXiM) zAv?QWS{WP9?vL-)FN#&j+1pfcDKbfxrYTB5=?#bu!v6@*7IlNW1Kg|NUIRAW2N`A~XM@cmyw04AFL(pBUEhEInlN8@8Rlc4(ivobzR&F+Y)YKYT zDI?c$gujg{q$R4=*k(;@3uF?itz;q$?8JNxVhWSvB~Knc04t)}ILnB@Im}}V=Z`k; zxrn;nQ8Hl3;g27X2S#|CZc~8!uh*EKUzrF+Xjw>O3G#$@QBB4XQb>BGlWvfcM^jIl z+#>7I_nB6hH}jzDADL>LbVo&<2o_+gl2(lD`eoD0&${>=Sb=Jy8r@0T@SM@z<_&AB z`ASA8>lUe|EZj}LX9~_6%kGFVq_&hA}$&uUnoG=^pDKJX4YC4B8NpG`zs1L zuw9_M5qqkl`ll$G&~p|j+V+^D#SJX?L^bA$=QFwqP z{$ABdY>7f1DAvlgw>t0^#~LN#DwW7HvnUTaMGulF_C{F&lAAG|nUm?nFpf|ZoJMZk ziQ&v#{7iN>k)qj|ve=mZ6>QDN#+!}8Hx%2;iu(-18USr9DTK0Su8eyL)RhIsxXYOK z$fUHI*U>Ku%@oN+3TqYA-6ljTlOnTS3b1TOrtc0M%Xx%U_V~hd z3vIRolmi_$Lf2`8?w}F6?zOx~XJGu7tu0A31YT-J_-kQQEBEm6@EbA{^D^7GOm<;@ z41wajK#~hAT*qd&K*wU^F;jf+-==s|u=bz_chWUH57Gpl-Bb+Y%%teyX~DjyH1Y z%-T*9bl=r4E|$Y|4aj9BoKK+%%<79N4g@@aGns<$GKfVsf;AiQx%9F!CtH#F`MiPRK_5ENFC(;OFf5}TatMM@d9+)IJRsN z_PQI+P;9*IYJ6|}xAE`k{2wYe2+d+|(j5)3i)mBzgS1W7#9rz3cu$a8^B7?k?MYvK z4n2%rlokb7a_H8UCR}+1EqGXUNbh0PrU#c+*@c5(SWAraiKP}n6#l5UI%6Ws>wQkS zO5}G@+Vi`kL!({q*1kF=7S>ORqvyYMS_MBFFe$=JP>J84?IGg##t@}w`j@ROd_yF? z3O&ey23yb_uC$dElBc8qCi`7gPBw(Qtt&->Btr%s59xib-qoy-wqP=dYbaR02>T*M z*013{A#GcbcHq^jXr2wJj!ijK$&lXpY(x}qod5FKPs~m>n6?ErpbowWQqt8lB~I!4 zmRF1HvVL;;CXo&5Q_D3cyIe}y!!e|L1T?Duy4qjQMpf7R#cTUfzWE4flvh-!;??`) z$L0&69DYR~=FlroK*s)V`nW*7cg7dG_#eFuiN%9z&>^tVECTTJ`#sp_fbR zh7f;1G5#0hkNKZw@Qz@PIxPP(dTP~j{jV!`E8E}Jv|z*TcRP%g3XN#lJ)-Bv@IDD@ zfK#m{kaHSi&g%e;f!vrkoF9{HI2LXC^;O;~$39q)pPK`~gg@iw=+PzFpB1lS=`tb% z4Z?8{j1js)hd~EH_y`HmEWjZl1A-+&8#F8iA)Mj}s25{|l?ot!IsX*ILkoSh1C#&- YLHHSA#lN>?4pju+BSx%EACZ;+0cQVoeEUserPort->mp_SigBit; + + while (!closeAbout) { + Wait(windowSignal); + + while (!closeAbout && (iMessage = GT_GetIMsg(aboutWindow->UserPort))) { + switch (iMessage->Class) { + case IDCMP_CLOSEWINDOW: + closeAbout = TRUE; + break; + case IDCMP_REFRESHWINDOW: + GT_BeginRefresh(window); + GT_EndRefresh(window, TRUE); + break; + } + } + } + + RemoveGList(aboutWindow, glist, -1); + FreeGadgets(glist); + CloseWindow(aboutWindow); + + return 0; +} /** * Process a single Intuition message. @@ -514,8 +630,8 @@ void handleIntuitionMessage(struct IntuiMessage *iMessage) { break; } - break; + // We picked a menu item. case IDCMP_MENUPICK: // https://en.wikibooks.org/wiki/Aros/Developer/Docs/Libraries/GadTools @@ -526,11 +642,20 @@ void handleIntuitionMessage(struct IntuiMessage *iMessage) { switch (menuData->id) { // I originally tried to use MENU_QUIT.id here // https://stackoverflow.com/questions/14069737/switch-case-error-case-label-does-not-reduce-to-an-integer-constant + // This is why there's a bunch more overhead for building + // the menu userdata. case MENU_QUIT_ID: terminated = TRUE; break; + case MENU_ABOUT_ID: + // yes, this blocks, deal with it + // it also returns non-zero if something goes wrong. + // in that case, kill the program + if (openAboutWindow()) terminated = TRUE; + break; } break; + // We've moved the mouse. In slider gadget talk, we've changed // the value of the slider. case IDCMP_MOUSEMOVE: @@ -554,8 +679,8 @@ void handleIntuitionMessage(struct IntuiMessage *iMessage) { if (rerenderTimer) setTimerText(); break; - // bye bye case IDCMP_CLOSEWINDOW: + // bye bye terminated = TRUE; break; @@ -568,12 +693,15 @@ void handleIntuitionMessage(struct IntuiMessage *iMessage) { } } -void endTimer(void) { - // TODO: play an included IFF 8SVX sound - APTR bellSound = NULL; + +/** + * Start playing a bell sound, and start a timer to tear down + * the bell data once it's done. + */ +void startBellSound(void) { struct dtTrigger myTrigger; struct MsgPort *TimerPort; - ULONG soundPlayResult, timerSignal; + ULONG soundPlayResult; if (bellSound = NewDTObject(BELL_FILENAME, DTA_GroupID, GID_SOUND, TAG_END)) { myTrigger.MethodID = DTM_TRIGGER; @@ -592,7 +720,30 @@ void endTimer(void) { TimerIO->tr_time.tv_micro = 0; SendIO((struct IORequest *)TimerIO); } +} +/** + * Tear down the bell once the timer runs out. + */ +void waitForBellToFinish(void) { + struct MsgPort *TimerPort; + ULONG timerSignal; + + if (bellSound) { + TimerPort = TimerIO->tr_node.io_Message.mn_ReplyPort; + + timerSignal = 1L << TimerPort->mp_SigBit; + Wait(timerSignal); + + DisposeDTObject(bellSound); + } +} + +/** + * Handle the timer running out of time. + */ +void endTimer(void) { + startBellSound(); DisplayBeep(screen); uiHours = uiMinutes = uiSeconds = 0; @@ -604,12 +755,7 @@ void endTimer(void) { clearUI(); renderUI(); - if (bellSound) { - timerSignal = 1L << TimerPort->mp_SigBit; - Wait(timerSignal); - - DisposeDTObject(bellSound); - } + waitForBellToFinish(); } void handleTimerMessage(void) { @@ -648,7 +794,6 @@ void clearMenu(void) { } int main() { - // TODO: Menu bar with about menu and change the title to match the time struct IntuiMessage *iMessage; struct MsgPort *TimerPort; ULONG windowSignal, timerSignal, foundSignals; @@ -671,14 +816,16 @@ int main() { return 1; } + // http://amigadev.elowar.com/read/ADCD_2.1/Includes_and_Autodocs_3._guide/node03F8.html + SetWindowTitles(window, (UBYTE *) ~0, "Topaz's Pizza Timer - theindustriousrabbit.com"); + buildMenu(); + // these create the bit mask for Wait() to listen to events on windowSignal = 1L << window->UserPort->mp_SigBit; timerSignal = 1L << TimerPort->mp_SigBit; renderUI(); - buildMenu(); - while (!terminated) { // 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