home *** CD-ROM | disk | FTP | other *** search
/ Shareware Supreme Volume 6 #1 / swsii.zip / swsii / 215 / DDJ9206.ZIP / DFLT12.ZIP / APPLICAT.C next >
Text File  |  1992-04-17  |  21KB  |  712 lines

  1. /* ------------- applicat.c ------------- */
  2.  
  3. #include "dflat.h"
  4.  
  5. static int ScreenHeight;
  6. static BOOL AltDown = FALSE;
  7.  
  8. extern DBOX Display;
  9. extern DBOX Windows;
  10.  
  11. #ifdef INCLUDE_LOGGING
  12. extern DBOX Log;
  13. #endif
  14.  
  15. #ifdef INCLUDE_SHELLDOS
  16. static void ShellDOS(WINDOW);
  17. #endif
  18. static void CreateMenu(WINDOW);
  19. static void CreateStatusBar(WINDOW);
  20. static void SelectColors(WINDOW);
  21. static void SetScreenHeight(int);
  22. static void SelectLines(WINDOW);
  23.  
  24. #ifdef INCLUDE_WINDOWOPTIONS
  25. static void SelectTexture(void);
  26. static void SelectBorder(WINDOW);
  27. static void SelectTitle(WINDOW);
  28. static void SelectStatusBar(WINDOW);
  29. #endif
  30.  
  31. static WINDOW oldFocus;
  32. #ifdef INCLUDE_MULTI_WINDOWS
  33. static void CloseAll(WINDOW, int);
  34. static void MoreWindows(WINDOW);
  35. static void ChooseWindow(WINDOW, int);
  36. static int WindowSel;
  37. static char *Menus[9] = {
  38.     "~1.                      ",
  39.     "~2.                      ",
  40.     "~3.                      ",
  41.     "~4.                      ",
  42.     "~5.                      ",
  43.     "~6.                      ",
  44.     "~7.                      ",
  45.     "~8.                      ",
  46.     "~9.                      "
  47. };
  48. #endif
  49.  
  50. /* --------------- CREATE_WINDOW Message -------------- */
  51. static int CreateWindowMsg(WINDOW wnd)
  52. {
  53.     int rtn;
  54.     static BOOL DisplayModified = FALSE;
  55.     ScreenHeight = SCREENHEIGHT;
  56.     if (!isVGA() && !DisplayModified)    {
  57.         /* ---- modify Display Dialog Box for EGA, CGA ---- */
  58.         CTLWINDOW *ct, *ct1;
  59.         int i;
  60.         ct = FindCommand(&Display, ID_OK, BUTTON);
  61.         if (isEGA())
  62.             ct1 = FindCommand(&Display,ID_50LINES,RADIOBUTTON);
  63.         else    {
  64.             CTLWINDOW *ct2;
  65.             ct2 = FindCommand(&Display,ID_COLOR,RADIOBUTTON)-1;
  66.             ct2->dwnd.w++;
  67.             for (i = 0; i < 7; i++)
  68.                 (ct2+i)->dwnd.x += 8;
  69.             ct1 = FindCommand(&Display,ID_25LINES,RADIOBUTTON)-1;
  70.         }
  71.         for (i = 0; i < 4; i++)
  72.             *ct1++ = *ct++;
  73.         DisplayModified = TRUE;
  74.     }
  75. #ifdef INCLUDE_WINDOWOPTIONS
  76.     if (cfg.Border)
  77.         SetCheckBox(&Display, ID_BORDER);
  78.     if (cfg.Title)
  79.         SetCheckBox(&Display, ID_TITLE);
  80.     if (cfg.StatusBar)
  81.         SetCheckBox(&Display, ID_STATUSBAR);
  82.     if (cfg.Texture)
  83.         SetCheckBox(&Display, ID_TEXTURE);
  84. #endif
  85.     if (cfg.mono == 1)
  86.         PushRadioButton(&Display, ID_MONO);
  87.     else if (cfg.mono == 2)
  88.         PushRadioButton(&Display, ID_REVERSE);
  89.     else
  90.         PushRadioButton(&Display, ID_COLOR);
  91.     if (cfg.ScreenLines == 25)
  92.         PushRadioButton(&Display, ID_25LINES);
  93.     else if (cfg.ScreenLines == 43)
  94.         PushRadioButton(&Display, ID_43LINES);
  95.     else if (cfg.ScreenLines == 50)
  96.         PushRadioButton(&Display, ID_50LINES);
  97.     if (SCREENHEIGHT != cfg.ScreenLines)    {
  98.         SetScreenHeight(cfg.ScreenLines);
  99.         if (WindowHeight(wnd) == ScreenHeight ||
  100.                 SCREENHEIGHT-1 < GetBottom(wnd))    {
  101.             WindowHeight(wnd) = SCREENHEIGHT-1;
  102.             GetBottom(wnd) = GetTop(wnd)+WindowHeight(wnd)-1;
  103.             wnd->RestoredRC = WindowRect(wnd);
  104.         }
  105.     }
  106.     SelectColors(wnd);
  107. #ifdef INCLUDE_WINDOWOPTIONS
  108.     SelectBorder(wnd);
  109.     SelectTitle(wnd);
  110.     SelectStatusBar(wnd);
  111. #endif
  112.     rtn = BaseWndProc(APPLICATION, wnd, CREATE_WINDOW, 0, 0);
  113.     if (wnd->extension != NULL)
  114.         CreateMenu(wnd);
  115.     CreateStatusBar(wnd);
  116.     LoadHelpFile();
  117.     SendMessage(NULL, SHOW_MOUSE, 0, 0);
  118.     return rtn;
  119. }
  120.  
  121. /* --------- ADDSTATUS Message ---------- */
  122. static void AddStatusMsg(WINDOW wnd, PARAM p1)
  123. {
  124.     if (wnd->StatusBar != NULL)    {
  125.         if (p1 && *(char *)p1)
  126.             SendMessage(wnd->StatusBar, SETTEXT, p1, 0);
  127.         else 
  128.             SendMessage(wnd->StatusBar, CLEARTEXT, 0, 0);
  129.         SendMessage(wnd->StatusBar, PAINT, 0, 0);
  130.     }
  131. }
  132.  
  133. /* -------- SETFOCUS Message -------- */
  134. static void SetFocusMsg(WINDOW wnd, BOOL p1)
  135. {
  136.     if (p1)
  137.         SendMessage(inFocus, SETFOCUS, FALSE, 0);
  138.     /* --- remove window from list --- */
  139.     RemoveFocusWindow(wnd);
  140.     /* --- move window to end/beginning of list --- */
  141.     p1 ? AppendFocusWindow(wnd) : PrependFocusWindow(wnd);
  142.     inFocus = p1 ? wnd : NULL;
  143.     if (isVisible(wnd))
  144.         SendMessage(wnd, BORDER, 0, 0);
  145.     else 
  146.         SendMessage(wnd, SHOW_WINDOW, 0, 0);
  147. }
  148.  
  149. /* ------- SIZE Message -------- */
  150. static void SizeMsg(WINDOW wnd, PARAM p1, PARAM p2)
  151. {
  152.     BOOL WasVisible;
  153.     WasVisible = isVisible(wnd);
  154.     if (WasVisible)
  155.         SendMessage(wnd, HIDE_WINDOW, TRUE, 0);
  156.     if (p1-GetLeft(wnd) < 30)
  157.         p1 = GetLeft(wnd) + 30;
  158.     BaseWndProc(APPLICATION, wnd, SIZE, p1, p2);
  159.     CreateMenu(wnd);
  160.     CreateStatusBar(wnd);
  161.     if (WasVisible)
  162.         SendMessage(wnd, SHOW_WINDOW, 0, 0);
  163. }
  164.  
  165. /* ----------- KEYBOARD Message ------------ */
  166. static int KeyboardMsg(WINDOW wnd, PARAM p1, PARAM p2)
  167. {
  168.     AltDown = FALSE;
  169.     if (WindowMoving || WindowSizing || (int) p1 == F1)
  170.         return BaseWndProc(APPLICATION, wnd, KEYBOARD, p1, p2);
  171.     switch ((int) p1)    {
  172.         case ALT_F4:
  173.             PostMessage(wnd, CLOSE_WINDOW, 0, 0);
  174.             return TRUE;
  175. #ifdef INCLUDE_MULTI_WINDOWS
  176.         case ALT_F6:
  177.             SetNextFocus(inFocus);
  178.             SkipSystemWindows(FALSE);
  179.             return TRUE;
  180. #endif
  181.         case ALT_HYPHEN:
  182.             BuildSystemMenu(wnd);
  183.             return TRUE;
  184.         default:
  185.             break;
  186.     }
  187.     PostMessage(wnd->MenuBarWnd, KEYBOARD, p1, p2);
  188.     return TRUE;
  189. }
  190.  
  191. /* --------- SHIFT_CHANGED Message -------- */
  192. static void ShiftChangedMsg(WINDOW wnd, PARAM p1)
  193. {
  194.     if ((int)p1 & ALTKEY)
  195.         AltDown = TRUE;
  196.     else if (AltDown)    {
  197.         AltDown = FALSE;
  198.         if (wnd->MenuBarWnd != inFocus)
  199.             SendMessage(NULL, HIDE_CURSOR, 0, 0);
  200.         SendMessage(wnd->MenuBarWnd, KEYBOARD, F10, 0);
  201.     }
  202. }
  203.  
  204. /* -------- COMMAND Message ------- */
  205. static void CommandMsg(WINDOW wnd, PARAM p1, PARAM p2)
  206. {
  207.     switch ((int)p1)    {
  208.         case ID_HELP:
  209.             DisplayHelp(wnd, DFlatApplication);
  210.             break;
  211.         case ID_HELPHELP:
  212.             DisplayHelp(wnd, "HelpHelp");
  213.             break;
  214.         case ID_EXTHELP:
  215.             DisplayHelp(wnd, "ExtHelp");
  216.             break;
  217.         case ID_KEYSHELP:
  218.             DisplayHelp(wnd, "KeysHelp");
  219.             break;
  220.         case ID_HELPINDEX:
  221.             DisplayHelp(wnd, "HelpIndex");
  222.             break;
  223. #ifdef TESTING_DFLAT
  224.         case ID_LOADHELP:
  225.             LoadHelpFile();
  226.             break;
  227. #endif
  228. #ifdef INCLUDE_LOGGING
  229.         case ID_LOG:
  230.             MessageLog(wnd);
  231.             break;
  232. #endif
  233. #ifdef INCLUDE_SHELLDOS
  234.         case ID_DOS:
  235.             ShellDOS(wnd);
  236.             break;
  237. #endif
  238.         case ID_EXIT:
  239.         case ID_SYSCLOSE:
  240.             PostMessage(wnd, CLOSE_WINDOW, 0, 0);
  241.             break;
  242.         case ID_DISPLAY:
  243.             if (DialogBox(wnd, &Display, TRUE, NULL))    {
  244.                 oldFocus = inFocus;
  245.                 SendMessage(wnd, HIDE_WINDOW, TRUE, 0);
  246.                 SelectColors(wnd);
  247.                 SelectLines(wnd);
  248. #ifdef INCLUDE_WINDOWOPTIONS
  249.                 SelectBorder(wnd);
  250.                 SelectTitle(wnd);
  251.                 SelectStatusBar(wnd);
  252.                 SelectTexture();
  253. #endif
  254.                 CreateMenu(wnd);
  255.                 CreateStatusBar(wnd);
  256.                 SendMessage(wnd, SHOW_WINDOW, 0, 0);
  257.                 SendMessage(oldFocus, SETFOCUS, TRUE, 0);
  258.             }
  259.             break;
  260.         case ID_SAVEOPTIONS:
  261.             SaveConfig();
  262.             break;
  263. #ifdef INCLUDE_MULTI_WINDOWS
  264.         case ID_WINDOW:
  265.             ChooseWindow(wnd, (int)p2-2);
  266.             break;
  267.         case ID_CLOSEALL:
  268.             CloseAll(wnd, FALSE);
  269.             break;
  270.         case ID_MOREWINDOWS:
  271.             MoreWindows(wnd);
  272.             break;
  273. #endif
  274. #ifdef INCLUDE_RESTORE
  275.         case ID_SYSRESTORE:
  276. #endif
  277.         case ID_SYSMOVE:
  278.         case ID_SYSSIZE:
  279. #ifdef INCLUDE_MINIMIZE
  280.         case ID_SYSMINIMIZE:
  281. #endif
  282. #ifdef INCLUDE_MAXIMIZE
  283.         case ID_SYSMAXIMIZE:
  284. #endif
  285.             BaseWndProc(APPLICATION, wnd, COMMAND, p1, p2);
  286.             break;
  287.         default:
  288.             if (inFocus != wnd->MenuBarWnd && inFocus != wnd)
  289.                 PostMessage(inFocus, COMMAND, p1, p2);
  290.             break;
  291.     }
  292. }
  293.  
  294. /* --------- CLOSE_WINDOW Message -------- */
  295. static int CloseWindowMsg(WINDOW wnd)
  296. {
  297.     int rtn;
  298. #ifdef INCLUDE_MULTI_WINDOWS
  299.     CloseAll(wnd, TRUE);
  300. #endif
  301.     PostMessage(NULL, STOP, 0, 0);
  302.     rtn = BaseWndProc(APPLICATION, wnd, CLOSE_WINDOW, 0, 0);
  303.     if (ScreenHeight != SCREENHEIGHT)
  304.         SetScreenHeight(ScreenHeight);
  305.     UnLoadHelpFile();
  306.     return rtn;
  307. }
  308.  
  309. /* --- APPLICATION Window Class window processing module --- */
  310. int ApplicationProc(WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2)
  311. {
  312.     switch (msg)    {
  313.         case CREATE_WINDOW:
  314.             return CreateWindowMsg(wnd);
  315.         case HIDE_WINDOW:
  316.             if (wnd == inFocus)
  317.                 inFocus = NULL;
  318.             break;
  319.         case ADDSTATUS:
  320.             AddStatusMsg(wnd, p1);
  321.             return TRUE;
  322.         case SETFOCUS:
  323.             if ((int)p1 == (inFocus != wnd))    {
  324.                 SetFocusMsg(wnd, (BOOL) p1);
  325.                 return TRUE;
  326.             }
  327.             break;
  328.         case SIZE:
  329.             SizeMsg(wnd, p1, p2);
  330.             return TRUE;
  331. #ifdef INCLUDE_MINIMIZE
  332.         case MINIMIZE:
  333.             return TRUE;
  334. #endif
  335.         case KEYBOARD:
  336.             return KeyboardMsg(wnd, p1, p2);
  337.         case SHIFT_CHANGED:
  338.             ShiftChangedMsg(wnd, p1);
  339.             return TRUE;
  340.         case PAINT:
  341.             if (isVisible(wnd))    {
  342. #ifdef INCLUDE_WINDOWOPTIONS
  343.                 int cl = cfg.Texture ? APPLCHAR : ' ';
  344. #else
  345.                 int cl = APPLCHAR;
  346. #endif
  347.                 ClearWindow(wnd, (RECT *)p1, cl);
  348.             }
  349.             return TRUE;
  350.         case COMMAND:
  351.             CommandMsg(wnd, p1, p2);
  352.             return TRUE;
  353.         case CLOSE_WINDOW:
  354.             return CloseWindowMsg(wnd);
  355.         default:
  356.             break;
  357.     }
  358.     return BaseWndProc(APPLICATION, wnd, msg, p1, p2);
  359. }
  360.  
  361. #ifdef INCLUDE_SHELLDOS
  362. static void SwitchCursor(void)
  363. {
  364.     SendMessage(NULL, SAVE_CURSOR, 0, 0);
  365.     SwapCursorStack();
  366.     SendMessage(NULL, RESTORE_CURSOR, 0, 0);
  367. }
  368.  
  369. /* ------- Shell out to DOS ---------- */
  370. static void ShellDOS(WINDOW wnd)
  371. {
  372.     oldFocus = inFocus;
  373.     SendMessage(wnd, HIDE_WINDOW, 0, 0);
  374.     SwitchCursor();
  375.     if (ScreenHeight != SCREENHEIGHT)
  376.         SetScreenHeight(ScreenHeight);
  377.     SendMessage(NULL, HIDE_MOUSE, 0, 0);
  378.     printf("To return to %s, execute the DOS exit command.",
  379.                     DFlatApplication);
  380.     fflush(stdout);
  381.     spawnl(P_WAIT, getenv("COMSPEC"), NULL);
  382.     if (SCREENHEIGHT != cfg.ScreenLines)
  383.         SetScreenHeight(cfg.ScreenLines);
  384.     SwitchCursor();
  385.     SendMessage(wnd, SHOW_WINDOW, 0, 0);
  386.     SendMessage(oldFocus, SETFOCUS, TRUE, 0);
  387.     SendMessage(NULL, SHOW_MOUSE, 0, 0);
  388. }
  389. #endif
  390.  
  391. /* -------- Create the menu bar -------- */
  392. static void CreateMenu(WINDOW wnd)
  393. {
  394.     AddAttribute(wnd, HASMENUBAR);
  395.     if (wnd->MenuBarWnd != NULL)
  396.         SendMessage(wnd->MenuBarWnd, CLOSE_WINDOW, 0, 0);
  397.     wnd->MenuBarWnd = CreateWindow(MENUBAR,
  398.                         NULL,
  399.                         GetClientLeft(wnd),
  400.                         GetClientTop(wnd)-1,
  401.                         1,
  402.                         ClientWidth(wnd),
  403.                         NULL,
  404.                         wnd,
  405.                         NULL,
  406.                         0);
  407.     SendMessage(wnd->MenuBarWnd,BUILDMENU,
  408.         (PARAM)wnd->extension,0);
  409.     AddAttribute(wnd->MenuBarWnd, VISIBLE);
  410. }
  411.  
  412. /* ----------- Create the status bar ------------- */
  413. static void CreateStatusBar(WINDOW wnd)
  414. {
  415.     if (wnd->StatusBar != NULL)    {
  416.         SendMessage(wnd->StatusBar, CLOSE_WINDOW, 0, 0);
  417.         wnd->StatusBar = NULL;
  418.     }
  419.     if (TestAttribute(wnd, HASSTATUSBAR))    {
  420.         wnd->StatusBar = CreateWindow(STATUSBAR,
  421.                             NULL,
  422.                             GetClientLeft(wnd),
  423.                             GetBottom(wnd),
  424.                             1,
  425.                             ClientWidth(wnd),
  426.                             NULL,
  427.                             wnd,
  428.                             NULL,
  429.                             0);
  430.         AddAttribute(wnd->StatusBar, VISIBLE);
  431.     }
  432. }
  433.  
  434. #ifdef INCLUDE_MULTI_WINDOWS
  435. /* -------- return the name of a document window ------- */
  436. static char *WindowName(WINDOW wnd)
  437. {
  438.     if (GetTitle(wnd) == NULL)    {
  439.         if (GetClass(wnd) == DIALOG)
  440.             return ((DBOX *)(wnd->extension))->HelpName;
  441.         else 
  442.             return "Untitled";
  443.     }
  444.     else
  445.         return GetTitle(wnd);
  446. }
  447.  
  448. /* ----------- Prepare the Window menu ------------ */
  449. void PrepWindowMenu(void *w, struct Menu *mnu)
  450. {
  451.     WINDOW wnd = w;
  452.     struct PopDown *p0 = mnu->Selections;
  453.     struct PopDown *pd = mnu->Selections + 2;
  454.     struct PopDown *ca = mnu->Selections + 13;
  455.     int MenuNo = 0;
  456.     WINDOW cwnd;
  457.     mnu->Selection = 0;
  458.     oldFocus = NULL;
  459.     if (GetClass(wnd) != APPLICATION)    {
  460.         int i;
  461.         oldFocus = wnd;
  462.         /* ----- point to the APPLICATION window ----- */
  463.         while (GetClass(wnd) != APPLICATION)
  464.             if ((wnd = GetParent(wnd)) == NULL)
  465.                 return;
  466.         /* ----- get the first 9 document windows ----- */
  467.         for (i = 0; i < wnd->ChildCt && MenuNo < 9; i++)    {
  468.             cwnd = *(wnd->Children + i);
  469.             if (GetClass(cwnd) != MENUBAR &&
  470.                     GetClass(cwnd) != STATUSBAR) {
  471.                 /* --- add the document window to the menu --- */
  472.                 strncpy(Menus[MenuNo]+4, WindowName(cwnd), 20);
  473.                 pd->SelectionTitle = Menus[MenuNo];
  474.                 if (cwnd == oldFocus)    {
  475.                     /* -- mark the current document -- */
  476.                     pd->Attrib |= CHECKED;
  477.                     mnu->Selection = MenuNo+2;
  478.                 }
  479.                 else
  480.                     pd->Attrib &= ~CHECKED;
  481.                 pd++;
  482.                 MenuNo++;
  483.             }
  484.         }
  485.     }
  486.     if (MenuNo)
  487.         p0->SelectionTitle = "~Close all";
  488.     else
  489.         p0->SelectionTitle = NULL;
  490.     if (MenuNo >= 9)    {
  491.         *pd++ = *ca;
  492.         if (mnu->Selection == 0)
  493.             mnu->Selection = 11;
  494.     }
  495.     pd->SelectionTitle = NULL;
  496. }
  497.  
  498. /* window processing module for the More Windows dialog box */
  499. static int WindowPrep(WINDOW wnd,MESSAGE msg,PARAM p1,PARAM p2)
  500. {
  501.     switch (msg)    {
  502.         case INITIATE_DIALOG:    {
  503.             WINDOW wnd1;
  504.             WINDOW cwnd = ControlWindow(&Windows,ID_WINDOWLIST);
  505.             WINDOW pwnd = GetParent(wnd);
  506.             int sel = 0, i;
  507.             if (cwnd == NULL)
  508.                 return FALSE;
  509.             for (i = 0; i < pwnd->ChildCt; i++)    {
  510.                 wnd1 = *(pwnd->Children + i);
  511.                 if (wnd1 != wnd && GetClass(wnd1) != MENUBAR &&
  512.                         GetClass(wnd1) != STATUSBAR)    {
  513.                     if (wnd1 == oldFocus)
  514.                         WindowSel = sel;
  515.                     SendMessage(cwnd, ADDTEXT,
  516.                         (PARAM) WindowName(wnd1), 0);
  517.                     sel++;
  518.                 }
  519.             }
  520.             SendMessage(cwnd, LB_SETSELECTION, WindowSel, 0);
  521.             AddAttribute(cwnd, VSCROLLBAR);
  522.             PostMessage(cwnd, SHOW_WINDOW, 0, 0);
  523.             break;
  524.         }
  525.         case COMMAND:
  526.             switch ((int) p1)    {
  527.                 case ID_OK:
  528.                     if ((int)p2 == 0)
  529.                         WindowSel = SendMessage(
  530.                                     ControlWindow(&Windows,
  531.                                     ID_WINDOWLIST),
  532.                                     LB_CURRENTSELECTION, 0, 0);
  533.                     break;
  534.                 case ID_WINDOWLIST:
  535.                     if ((int) p2 == LB_CHOOSE)
  536.                         SendMessage(wnd, COMMAND, ID_OK, 0);
  537.                     break;
  538.                 default:
  539.                     break;
  540.             }
  541.             break;
  542.         default:
  543.             break;
  544.     }
  545.     return DefaultWndProc(wnd, msg, p1, p2);
  546. }
  547.  
  548. /* ---- the More Windows command on the Window menu ---- */
  549. static void MoreWindows(WINDOW wnd)
  550. {
  551.     if (DialogBox(wnd, &Windows, TRUE, WindowPrep))
  552.         ChooseWindow(wnd, WindowSel);
  553. }
  554.  
  555. /* ----- user chose a window from the Window menu
  556.         or the More Window dialog box ----- */
  557. static void ChooseWindow(WINDOW wnd, int WindowNo)
  558. {
  559.     int i;
  560.     WINDOW cwnd;
  561.     for (i = 0; i < wnd->ChildCt; i++)    {
  562.         cwnd = *(wnd->Children + i);
  563.         if (GetClass(cwnd) != MENUBAR &&
  564.                 GetClass(cwnd) != STATUSBAR)
  565.             if (WindowNo-- == 0)
  566.                 break;
  567.     }
  568.     if (wnd->ChildCt)    {
  569.         SendMessage(cwnd, SETFOCUS, TRUE, 0);
  570.         if (cwnd->condition == ISMINIMIZED)
  571.             SendMessage(cwnd, RESTORE, 0, 0);
  572.     }
  573. }
  574.  
  575. /* ----- Close all document windows ----- */
  576. static void CloseAll(WINDOW wnd, int closing)
  577. {
  578.     WINDOW wnd1;
  579.     int i;
  580.     SendMessage(wnd, SETFOCUS, TRUE, 0);
  581.     for (i = wnd->ChildCt; i > 0; --i)    {
  582.         wnd1 = *(wnd->Children + i - 1);
  583.         if (GetClass(wnd1) != MENUBAR &&
  584.                 GetClass(wnd1) != STATUSBAR)    {
  585.             ClearVisible(wnd1);
  586.             SendMessage(wnd1, CLOSE_WINDOW, 0, 0);
  587.         }
  588.     }
  589.     if (!closing)
  590.         SendMessage(wnd, PAINT, 0, 0);
  591. }
  592.  
  593. #endif    /* #ifdef INCLUDE_MULTI_WINDOWS */
  594.  
  595. static void DoWindowColors(WINDOW wnd)
  596. {
  597.     WINDOW cwnd;
  598.     int i;
  599.     InitWindowColors(wnd);
  600.     for (i = 0; i < wnd->ChildCt; i++)    {
  601.         cwnd = *(wnd->Children + i);
  602.         DoWindowColors(cwnd);
  603.         if (GetClass(cwnd) == TEXT && GetText(cwnd) != NULL)
  604.             SendMessage(cwnd, CLEARTEXT, 0, 0);
  605.     }
  606. }
  607.  
  608. /* ----- set up colors for the application window ------ */
  609. static void SelectColors(WINDOW wnd)
  610. {
  611.     if (RadioButtonSetting(&Display, ID_MONO))
  612.         cfg.mono = 1;
  613.     else if (RadioButtonSetting(&Display, ID_REVERSE))
  614.         cfg.mono = 2;
  615.     else
  616.         cfg.mono = 0;
  617.     if ((ismono() || video_mode == 2) && cfg.mono == 0)
  618.         cfg.mono = 1;
  619.  
  620.     if (cfg.mono == 1)
  621.         memcpy(cfg.clr, bw, sizeof bw);
  622.     else if (cfg.mono == 2)
  623.         memcpy(cfg.clr, reverse, sizeof reverse);
  624.     else
  625.         memcpy(cfg.clr, color, sizeof color);
  626.     DoWindowColors(wnd);
  627. }
  628.  
  629. /* ---- select screen lines ---- */
  630. static void SelectLines(WINDOW wnd)
  631. {
  632.     cfg.ScreenLines = 25;
  633.     if (isEGA() || isVGA())    {
  634.         if (RadioButtonSetting(&Display, ID_43LINES))
  635.             cfg.ScreenLines = 43;
  636.         else if (RadioButtonSetting(&Display, ID_50LINES))
  637.             cfg.ScreenLines = 50;
  638.     }
  639.     if (SCREENHEIGHT != cfg.ScreenLines)    {
  640.         int FullScreen = WindowHeight(wnd) == SCREENHEIGHT;
  641.         SetScreenHeight(cfg.ScreenLines);
  642.         if (FullScreen || SCREENHEIGHT-1 < GetBottom(wnd))
  643.             SendMessage(wnd, SIZE, (PARAM) GetRight(wnd),
  644.                 SCREENHEIGHT-1);
  645.     }
  646. }
  647.  
  648. /* ---- set the screen height in the video hardware ---- */
  649. static void SetScreenHeight(int height)
  650. {
  651.     if (isEGA() || isVGA())    {
  652.         SendMessage(NULL, SAVE_CURSOR, 0, 0);
  653.         switch (height)    {
  654.             case 25:
  655.                 Set25();
  656.                 break;
  657.             case 43:
  658.                 Set43();
  659.                 break;
  660.             case 50:
  661.                 Set50();
  662.                 break;
  663.             default:
  664.                 break;
  665.         }
  666.         SendMessage(NULL, RESTORE_CURSOR, 0, 0);
  667.         SendMessage(NULL, RESET_MOUSE, 0, 0);
  668.         SendMessage(NULL, SHOW_MOUSE, 0, 0);
  669.     }
  670. }
  671.  
  672. #ifdef INCLUDE_WINDOWOPTIONS
  673.  
  674. /* ----- select the screen texture ----- */
  675. static void SelectTexture(void)
  676. {
  677.     cfg.Texture = CheckBoxSetting(&Display, ID_TEXTURE);
  678. }
  679.  
  680. /* -- select whether the application screen has a border -- */
  681. static void SelectBorder(WINDOW wnd)
  682. {
  683.     cfg.Border = CheckBoxSetting(&Display, ID_BORDER);
  684.     if (cfg.Border)
  685.         AddAttribute(wnd, HASBORDER);
  686.     else
  687.         ClearAttribute(wnd, HASBORDER);
  688. }
  689.  
  690. /* select whether the application screen has a status bar */
  691. static void SelectStatusBar(WINDOW wnd)
  692. {
  693.     cfg.StatusBar = CheckBoxSetting(&Display, ID_STATUSBAR);
  694.     if (cfg.StatusBar)
  695.         AddAttribute(wnd, HASSTATUSBAR);
  696.     else
  697.         ClearAttribute(wnd, HASSTATUSBAR);
  698. }
  699.  
  700. /* select whether the application screen has a title bar */
  701. static void SelectTitle(WINDOW wnd)
  702. {
  703.     cfg.Title = CheckBoxSetting(&Display, ID_TITLE);
  704.     if (cfg.Title)
  705.         AddAttribute(wnd, HASTITLEBAR);
  706.     else
  707.         ClearAttribute(wnd, HASTITLEBAR);
  708. }
  709.  
  710. #endif
  711.  
  712.