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