The end of a program may occur in various situations:
void ap_term_( void) { /* Close all windows: see the previous section */ while( wglb.first) { ApplWrite( wglb.first, WM_DESTROY); EvntWindom( MU_MESAG); } /* Free all ressource */ /* if you have install extended object type ...*/ RsrcXtype( 0, NULL, 0); /* ... and free the ressource */ RsrcFree(); /* Others ressources to free */ ... /* Quit WinDom environment */ ApplExit(); /* Finish Application */ exit( 0); }Now your application should handle the message AP_TERM. As we nowadays have multitasking OS, handling this message is a general rule for any GEM application. You can attribute the ap_term() function to this message like that:
EvntAttach( NULL, AP_TERM, ap_term);Then the ap_term() function is invoqued when EvntWindom() recieves an AP_TERM message.
You can deal with your application crashing by trapping the MiNT signals sent with the function Psignal():
Psignal( SIGQUIT, ap_term); Psignal( SIGBUS, ap_term); etc ...Note: MiNT signals are available with MagiC.
If your application does not install a desktop menu, the main function may look like:
int main( void) { ApplInit(); EvntAttach( NULL, AP_TERM, ap_term); Psignal( SIGQUIT, ap_term); /* ... others signals ... */ /* Main loop event */ while( wglb.first) EvntWindom( MU_MESAG); }And if your application has a desktop menu:
/* * This function manages the desktop menu * The evnt.buff variable is a WinDom global variable * that contains the AES buffer message returned by * evnt_multi() after a MU_MESAG event. */ void do_menu( void) { int title = evnt.buff[3]; switch( evnt.buff[4]) { case QUIT: ApplWrite( NULL, AP_TERM); break; } MenuTnormal( NULL, title, 1); } int main( void) { OBJECT *menu; ApplInit(); /* Install the menu */ RsrcLoad( "myrsc.rsc"); rsrc_gaddr( 0, DESKTOP_MENU, &tree); MenuBar( tree, 1); EvntAttach( NULL, AP_TERM, ap_term); Psignal( SIGQUIT, ap_term); /* ... others signals ... */ /* trap the menu selections */ EvntAttach( NULL, MN_SELECTED, do_menu); /* Main loop event */ while(1) EvntWindom( MU_MESAG); }Remark 1:
The EvntAttach() is more powerfull than, for example, a simple test on the message gets by EvntWindom() :
do EvntWindom( MU_MESAG); while( evnt.buff[3] != AP_TERM) apterm();In this case, the action of ap_term() is local. With the EvntAttach() method, the ap_term() function will be always called by any EvntWindom() invocation. It is more global because some WinDom functions call EvntWindom() and the ap_term() function may have then to be invoked. It is the case with the font selector or the popup menu manager.
More about AP_TERM
This message indicates:
After a system shutdown or a screen resolution change, if your
application cannot finish, you have to inform AES by sending a
AP_TFAIL(51) message by using the shel_write() function with the
mode=SWM_NEWMSG(9). At beginning of your application you have to
inform AES that your application understands the AP_TERM message like
that:
if( has_appl_getinfo()) { int val1, dum; appl_getinfo( 12, &val1, &dum, &dum, &dum); if( val1 & 0x8) shel_write( 9, 1, 1, NULL, NULL); }