/******************************************************************** * 1.10* * WinLIB PRO Revision II: Initialize and Terminate * * by Ken Hollis * * * * Copyright (c) 1994, Bitgate Software. All Rights Reserved. * * * * These are the startup and termination routines. These will be * * fixed for MultiTOS (if they ever get their act together), but * * as of now, they are not compatible. I may take a look at * * Enhanced GEM's routines and incorporate some ideas... * * * * (Yes, I have MultiTOS 4.1 and it DOES NOT WORK WITH XAES!!!) * * * ********************************************************************/ #include #include #include #include #include "xaes.h" #include "nkcc.h" const char __ident_xaes[] = "$Id: XAES Version 1.00 R1 $"; MFDB screen; int GenevaInstalled; int colorsave1, colorsave2, colorsave3; GLOBAL int WInit(int DeskWndDispatcher(WINDOW *, int[]), int MainDispatcher(int[]), int KeyDispatcher(int), char *prgname, char *header, BOOL HandleCallBacks) { int extnd_out[57], attr[10], work_out[57], i; static int work_in[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2}; Ap_ID = appl_init(); work_in[0] = graf_handle(&gr_cw, &gr_ch, &gr_bw, &gr_bh); v_opnvwk(work_in, &VDIhandle, work_out); for (i = 0; i < MAX_WINDOWS; i++) { owned_winds[i].handle = i; owned_winds[i].owner = W_NOTOWNER; } if (CheckMultitask()) { form_alert(1, "[1][Sorry, WinLIB does not work|under the MultiTOS|environment. It may|in a later release, but|not now!][ Oh well ]"); appl_exit(); v_clsvwk(VDIhandle); exit(FAIL); } /* Geneva REALLY does some WIERD shit with VDI. This is a fix. */ GenevaInstalled = (find_cookie('Gnva') != NULL) ? TRUE : FALSE; if (!(WindowChain = malloc(sizeof(WINDOW)))) /* Allocate memory for WindowChain */ return FALSE; WindowChain->next = NULL; WindowChain->prev = NULL; wind_get(0, WF_WORKXYWH, &desk.g_x, &desk.g_y, &desk.g_w, &desk.g_h); wind_get(0, WF_CURRXYWH, &WindowChain->size.g_x, &WindowChain->size.g_y, &WindowChain->size.g_w, &WindowChain->size.g_h); WindowChain->WndDispatcher = malloc(sizeof(DeskWndDispatcher)); WindowChain->WndDispatcher = DeskWndDispatcher; WindowChain->handle = 0; WindowChain->state = W_OPEN | W_DESKTOP; WindowChain->tree = NULL; WindowChain->wind = NULL; WindowChain->timer.status = T_NOTEXIST; WindowChain->style = 0; WindowChain->kind = 0; VDIhandle = graf_handle(&gr_cw, &gr_ch, &gr_bw, &gr_bh); _MainDispatcher = malloc(sizeof(MainDispatcher)); _MainKeyDispatcher = malloc(sizeof(KeyDispatcher)); _MainDispatcher = MainDispatcher; _MainKeyDispatcher = KeyDispatcher; Life = TRUE; if (gr_cw < 7 || gr_ch < 7) { image_w = gr_cw << 1; image_h = gr_ch; big_img = FAIL; } else if (gr_ch > 14) { image_w = image_h = 16; big_img = TRUE; } else { image_w = 16; image_h = 8; big_img = FALSE; } /* Since there are no internal images yet, there will not be this option for the time being. */ /* init_images(); */ ReadConfig(); vq_extnd(VDIhandle, 1, extnd_out); init_mfdb(&screen, NULL, desk.g_w, desk.g_h, 0, work_out[4]); vqt_attributes(VDIhandle, attr); num_planes = extnd_out[4]; num_colors = work_out[13]; large_font = attr[7]; color_font = attr[1]; small_font = work_out[46]; if (header) { prgnameheader = malloc(strlen(header) + 2); strcpy(prgnameheader, header); strcat(prgnameheader, ": "); } else prgnameheader = strdup(""); if (AES_VERSION >= 0x0400) { shel_write(9, 0, 0x01, NULL, NULL); if (_app && prgname) menu_register(Ap_ID, prgname); } WindowChain->tree = NULL; WInitCustomWindow(); WSetupWinPopups(); nkc_init(NKI_NO200HZ, VDIhandle); if (HandleCallBacks) { XCallInitializeCallback; XCallStartupCallback; } colorsave1 = colorsave2 = colorsave3 = 0; if ((num_colors == 4) && (xaes.config1 & X_MEDEMUL)) { colorsave1 = Setcolor(3, 0x333); colorsave2 = Setcolor(2, 0x555); colorsave3 = Setcolor(1, 0x777); } /* Nice little debugging check by yours truly... :-) */ #ifdef DEBUG if (!(xaes.config1 & X_MEDEMUL)) { int cs1, cs2, cs3; cs1 = Setcolor(3, -1); cs2 = Setcolor(2, -1); cs3 = Setcolor(1, -1); if ((cs1 == 0x333) && (cs2 == 0x555) && (cs3 == 0x777)) form_alert(1, "[3][Hmmm... These colors look|familiar. Did XAES|possibly just recently|crash on you?][ Okay ]"); } #endif return TRUE; } GLOBAL void WBoot() { GlobInits.Initialize = NULL; GlobInits.Deinitialize = NULL; GlobInits.Startup = NULL; GlobInits.Exit = NULL; } GLOBAL int WTerm(BOOL HandleCallBacks) { WKillAllWindows(K_NO_STOP); if (prgnameheader) free(prgnameheader); if (_MainDispatcher) free(_MainDispatcher); if (_MainKeyDispatcher) free(_MainKeyDispatcher); if (WindowChain) free(WindowChain); if (HandleCallBacks) { XCallDeinitializeCallback; XCallExitCallback; } ClearCallbacks(); vsl_color(VDIhandle, BLACK); if ((num_colors == 4) && (xaes.config1 & X_MEDEMUL)) { Setcolor(3, colorsave1); Setcolor(2, colorsave2); Setcolor(1, colorsave3); } v_clsvwk(VDIhandle); if (!appl_exit()) { if (CheckMultitask() || CheckPowerDOS()) form_alert(1, "[3][Cannot close terminate|parent process!][ Okay ]"); else form_alert(1, "[3][Cannot terminate this|program!][ Okay ]"); return FALSE; } if (nkc_exit()) form_alert(1, "[3][Cannot terminate: |NKCC not de-initialized][OK]"); exit(Return); return TRUE; } GLOBAL void WDie(int returns) { switch(returns) { case FORCE_EXIT: if (form_alert(1, "[3][Force exit| |Are you sure?][ Okay | Cancel ]") == 1) { Life = FALSE; Return = 0; } break; case FORCE_EXIT_ABS: Life = FALSE; Return = 0; break; default: Life = FALSE; Return = returns; break; } }