home *** CD-ROM | disk | FTP | other *** search
/ Piper's Pit BBS/FTP: ibm 0040 - 0049 / ibm0040-0049 / ibm0040.tar / ibm0040 / ZINC_5.ZIP / WINSRC.ZIP / WINDOW.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1991-06-01  |  17.1 KB  |  597 lines

  1. //    Zinc Interface Library - WINDOW.CPP
  2. //    COPYRIGHT (C) 1990, 1991.  All Rights Reserved.
  3. //    Zinc Software Incorporated.  Pleasant Grove, Utah  USA
  4.  
  5. #include "ui_win.hpp"
  6. #include <string.h>
  7.  
  8. int UI_WINDOW_MANAGER::FindNumberID(void *object, void *matchName)
  9. {
  10.     return ((((UI_WINDOW_OBJECT *)object)->search.numberID == *(USHORT *)matchName) ? 0 : -1);
  11. }
  12.  
  13. int UI_WINDOW_MANAGER::FindStringID(void *object, void *matchName)
  14. {
  15.     return (strcmpi(((UI_WINDOW_OBJECT *)object)->search.stringID, (char *)matchName));
  16. }
  17.  
  18. UI_WINDOW_MANAGER::UI_WINDOW_MANAGER(UI_DISPLAY *_display,
  19.     UI_EVENT_MANAGER *_eventManager,
  20.     int (*_exitFunction)(UI_DISPLAY *display, UI_EVENT_MANAGER *eventManager,
  21.         UI_WINDOW_MANAGER *windowManager)) :
  22.     UI_LIST(), display(_display), eventManager(_eventManager),
  23.     exitFunction(_exitFunction)
  24. {
  25. }
  26.  
  27. UI_WINDOW_MANAGER::~UI_WINDOW_MANAGER(void)
  28. {
  29.     // Remove all non-destroy objects from the window manager.
  30.     for (UI_WINDOW_OBJECT *object = First(); object; )
  31.     {
  32.         UI_EVENT event;
  33.         event.type = S_CLEAR;
  34.         object->Event(event);
  35.         object->display = 0;
  36.         object->eventManager = 0;
  37.         object->windowManager = 0;
  38.         object = (FlagSet(object->woAdvancedFlags, WOAF_NO_DESTROY)) ?
  39.             (UI_WINDOW_OBJECT *)UI_LIST::Subtract(object) : object->Next();
  40.     }
  41.  
  42.     // Delete the temporary holding window and any extra objects on it.
  43. }
  44.  
  45. #pragma argsused
  46. void UI_WINDOW_MANAGER::Add(UI_WINDOW_OBJECT *object)
  47. {
  48.     // Fix the coordinate system.
  49.     int offset;
  50.     UI_REGION region = object->true;
  51.     display->RegionConvert(object->true, &object->woStatus, WOS_GRAPHICS);
  52.  
  53.     // Only new window objects have a screenID of 0.
  54.     if (object->screenID == 0)
  55.     {
  56.         int tLeft = region.left;
  57.         region.left = (region.left >= 0) ? object->true.left :
  58.             display->columns + region.left * display->cellWidth - 1;
  59.         int tTop = region.top;
  60.         region.top = (region.top >= 0) ? object->true.top :
  61.             display->lines + region.top * display->cellHeight - 1;
  62.         if (tLeft >= 0 && region.right > 0)
  63.             region.right = object->true.right;
  64.         else if (region.right <= 0)
  65.             region.right = display->columns + region.right * display->cellWidth - 1;
  66.         else
  67.             region.right = region.left + region.right * display->cellWidth - 1;
  68.         if (tTop >= 0 && region.bottom > 0)
  69.             region.bottom = object->true.bottom;
  70.         else if (region.bottom <= 0)
  71.             region.bottom = display->lines + region.bottom * display->cellHeight - 1;
  72.         else
  73.             region.bottom = region.top + region.bottom * display->cellHeight - 1;
  74.         if (region.left < 0)
  75.             offset = -region.left;
  76.         else if (region.right >= display->columns)
  77.             offset = display->columns - region.right;
  78.         else
  79.             offset = 0;
  80.         if (region.left + offset >= 0)
  81.         {
  82.             region.left += offset;
  83.             region.right += offset;
  84.         }
  85.         if (region.top < 0)
  86.             offset = -region.top;
  87.         else if (region.bottom >= display->lines)
  88.             offset = display->lines - region.bottom;
  89.         else
  90.             offset = 0;
  91.         if (region.top + offset >= 0)
  92.         {
  93.             region.top += offset;
  94.             region.bottom += offset;
  95.         }
  96.         object->true = object->relative = region;
  97.     }
  98.  
  99.     // Make sure the window object is on the screen.
  100.     region = object->true;
  101.     if (region.left >= display->columns)
  102.     {
  103.         offset = region.left - display->columns + 1;
  104.         region.left -= offset;
  105.         region.right -= offset;
  106.     }
  107.     if (region.top >= display->lines)
  108.     {
  109.         offset = region.top - display->lines + 1;
  110.         region.top -= offset;
  111.         region.bottom -= offset;
  112.     }
  113.  
  114.     // Initialize the window object and bring it to the screen front.
  115.     object->display = display;
  116.     object->eventManager = eventManager;
  117.     object->windowManager = this;
  118.     object->woFlags |= WOF_NON_FIELD_REGION;
  119.     object->woAdvancedStatus &= ~WOAS_INVALID_REGION;
  120.     object->relative = object->true = region;
  121.  
  122.     // Paint the new window object.
  123.     UI_EVENT event;
  124.     event.type = S_CREATE;
  125.     object->Event(event);
  126.     ToFront(object, TRUE, TRUE);
  127. }
  128.  
  129. #pragma argsused
  130. void UI_WINDOW_MANAGER::Erase(UI_WINDOW_OBJECT *object,
  131.     const UI_REGION *newRegion)
  132. {
  133.     // Redraw the affected screen objects.
  134.     UI_WINDOW_OBJECT *tObject;
  135.     UI_EVENT event;
  136.     event.region = object->true;
  137.  
  138.     // Update the front window object.
  139.     event.type = S_CURRENT;
  140.     if (object == First() && object->next && !newRegion)
  141.     {
  142.         object = object->Next();
  143.         object->Event(event);
  144.         if (object->true.left <= event.region.left &&
  145.             object->true.top <= event.region.top &&
  146.             object->true.right >= event.region.right &&
  147.             object->true.bottom >= event.region.bottom)
  148.             return;
  149.     }
  150.  
  151.     event.type = FlagSet(object->woAdvancedFlags, WOAF_TEMPORARY) ?
  152.         S_DISPLAY_ACTIVE : S_DISPLAY_INACTIVE;
  153.     for (tObject = object->Next(); tObject; tObject = tObject->Next())
  154.     {
  155.         if (tObject->Overlap(event.region))
  156.             tObject->Event(event);
  157.         if (tObject->true.left <= event.region.left &&
  158.             tObject->true.top <= event.region.top &&
  159.             tObject->true.right >= event.region.right &&
  160.             tObject->true.bottom >= event.region.bottom)
  161.             return;
  162.         if (event.type == S_DISPLAY_ACTIVE &&
  163.             !FlagSet(tObject->woAdvancedFlags, WOAF_TEMPORARY))
  164.             event.type = S_DISPLAY_INACTIVE;
  165.     }
  166. }
  167.  
  168. #pragma argsused
  169. int UI_WINDOW_MANAGER::Event(const UI_EVENT &event)
  170. {
  171.     // Make sure there is an object.
  172.     int ccode = MapEvent(eventMapTable, event, ID_WINDOW_MANAGER,
  173.         ID_WINDOW_MANAGER, ID_WINDOW_MANAGER, ID_WINDOW_MANAGER,
  174.         ID_WINDOW_MANAGER, ID_WINDOW_MANAGER);
  175.     UI_WINDOW_OBJECT *firstObject = First();
  176.     if (!firstObject && ccode == L_EXIT)
  177.         return (L_EXIT);
  178.     else if (!firstObject && ccode != S_REDISPLAY && ccode != L_EXIT_FUNCTION)
  179.         return (S_NO_OBJECT);
  180.  
  181.     // Switch on the event type.
  182.     UI_EVENT tEvent = event;
  183.     UI_WINDOW_OBJECT *object = 0;
  184.     switch (ccode)
  185.     {
  186.     case S_RESET_DISPLAY:
  187.         while (firstObject && FlagSet(firstObject->woAdvancedFlags, WOAF_TEMPORARY))
  188.         {
  189.             UI_WINDOW_MANAGER::Subtract(firstObject);
  190.             if (!FlagSet(firstObject->woAdvancedFlags, WOAF_NO_DESTROY))
  191.                 delete firstObject;
  192.             firstObject = First();
  193.         }
  194.         if (!event.data)
  195.             break;
  196.         display = (UI_DISPLAY *)event.data;
  197.         UI_WINDOW_OBJECT *tObject = Last();
  198.         first = current = last = NULL;
  199.         while (tObject)
  200.         {
  201.             object = tObject;
  202.             tObject = object->Previous();
  203.             UI_WINDOW_MANAGER::Add(object);
  204.         }
  205.         break;
  206.  
  207.     case L_MOVE:
  208.     case L_SIZE:
  209.         while (firstObject && FlagSet(firstObject->woAdvancedFlags, WOAF_TEMPORARY))
  210.         {
  211.             UI_WINDOW_MANAGER::Subtract(firstObject);
  212.             if (!FlagSet(firstObject->woAdvancedFlags, WOAF_NO_DESTROY))
  213.                 delete firstObject;
  214.             firstObject = First();
  215.         }
  216.         object = First();
  217.         if (ccode == L_MOVE)
  218.         {
  219.             tEvent.type = S_MOVE;
  220.             tEvent.position.column = object->true.left;
  221.             tEvent.position.line = object->true.top;
  222.         }
  223.         else
  224.         {
  225.             tEvent.type = S_SIZE;
  226.             tEvent.rawCode = M_RIGHT_CHANGE | M_BOTTOM_CHANGE;
  227.             tEvent.position.column = object->true.right;
  228.             tEvent.position.line = object->true.bottom;
  229.         }
  230.         Modify(object, tEvent);
  231.         break;
  232.  
  233.     case S_MOVE:
  234.     case S_SIZE:
  235.     case S_CHANGE:
  236.         object = First();
  237.         if (ccode == S_MOVE && event.rawCode == 0xFFFF)
  238.         {
  239.             tEvent.position.column = object->true.left;
  240.             tEvent.position.line = object->true.top;
  241.         }
  242.         else if (ccode == S_SIZE && event.rawCode == 0xFFFF)
  243.         {
  244.             tEvent.rawCode = M_RIGHT_CHANGE | M_BOTTOM_CHANGE;
  245.             tEvent.position.column = object->true.right;
  246.             tEvent.position.line = object->true.bottom;
  247.         }
  248.         Modify(object, event);
  249.         break;
  250.  
  251.     case S_MAXIMIZE:
  252.     case S_MINIMIZE:
  253.         object = First();
  254.         object->Event(event);
  255.         break;
  256.  
  257.     case S_CLOSE:
  258.     case S_CLOSE_TEMPORARY:
  259.         // Delete any temporary windows.
  260.         while (firstObject && FlagSet(firstObject->woAdvancedFlags, WOAF_TEMPORARY))
  261.         {
  262.             UI_WINDOW_MANAGER::Subtract(firstObject);
  263.             if (!FlagSet(firstObject->woAdvancedFlags, WOAF_NO_DESTROY))
  264.                 delete firstObject;
  265.             if (ccode == S_CLOSE_TEMPORARY)
  266.                 return (ccode);
  267.             firstObject = First();
  268.         }
  269.         if (ccode == S_CLOSE_TEMPORARY)
  270.             return (ccode);
  271.  
  272.         // Try to delete the top window.
  273.         object = First();
  274.         if (!object)
  275.             return (S_ERROR);
  276.         else if (FlagSet(object->woAdvancedFlags, WOAF_LOCKED))
  277.             return (ccode);
  278.         UI_WINDOW_MANAGER::Subtract(object);
  279.         if (!FlagSet(object->woAdvancedFlags, WOAF_NO_DESTROY))
  280.             delete object;
  281.         ccode = First() ? S_CLOSE : S_NO_OBJECT;
  282.         break;
  283.  
  284.     case S_CLEAR:
  285.         for (object = First(); object; )
  286.         {
  287.             UI_WINDOW_OBJECT *tObject = object->Next();
  288.             if (!FlagSet(object->woAdvancedFlags, WOAF_LOCKED))
  289.                 UI_LIST::Subtract(object);
  290.             if (!FlagSet(object->woAdvancedFlags, WOAF_LOCKED | WOAF_NO_DESTROY))
  291.                 delete object;
  292.             object = tObject;
  293.         }
  294.         // Continue to S_CASCADE.
  295.  
  296.     case S_CASCADE:
  297.         {
  298.         firstObject = First();
  299.         while (firstObject && FlagSet(firstObject->woAdvancedFlags, WOAF_TEMPORARY))
  300.         {
  301.             UI_WINDOW_MANAGER::Subtract(firstObject);
  302.             if (!FlagSet(firstObject->woAdvancedFlags, WOAF_NO_DESTROY))
  303.                 delete firstObject;
  304.             firstObject = First();
  305.         }
  306.         int column = 0;
  307.         int line = 0;
  308.         UI_EVENT tEvent;
  309.         for (object = Last(); object; object = object->Previous())
  310.         {
  311.             if (!FlagSet(object->woAdvancedStatus, WOAS_MINIMIZED))
  312.             {
  313.                 if (column + object->true.right - object->true.left > display->columns)
  314.                     column = 0;
  315.                 if (line + object->true.bottom - object->true.top > display->lines)
  316.                     line = 0;
  317.                 tEvent.type = S_MOVE;
  318.                 tEvent.position.column = column - object->true.left;
  319.                 tEvent.position.line = line - object->true.top;
  320.                 object->true.left += tEvent.position.column;
  321.                 object->true.top += tEvent.position.line;
  322.                 object->true.right += tEvent.position.column;
  323.                 object->true.bottom += tEvent.position.line;
  324.                 object->relative = object->true;
  325.                 object->Event(tEvent);
  326.                 column += display->cellWidth * 3;
  327.                 line += display->cellHeight * 3 / 2;
  328.             }
  329.         }
  330.         }
  331.         // Continue to S_REDISPLAY.
  332.  
  333.     case S_REDISPLAY:
  334.         firstObject = First();
  335.         while (firstObject && FlagSet(firstObject->woAdvancedFlags, WOAF_TEMPORARY))
  336.         {
  337.             UI_WINDOW_MANAGER::Subtract(firstObject);
  338.             if (!FlagSet(firstObject->woAdvancedFlags, WOAF_NO_DESTROY))
  339.                 delete firstObject;
  340.             firstObject = First();
  341.         }
  342.         for (object = Last(); object; object = object->Previous())
  343.         {
  344.             tEvent.type = S_CREATE;
  345.             object->Event(tEvent);
  346.             tEvent.type = (object == First()) ? S_CURRENT : S_DISPLAY_INACTIVE;
  347.             tEvent.region = object->true;
  348.             object->Event(tEvent);
  349.         }
  350.         break;
  351.  
  352.     case L_EXIT_FUNCTION:
  353.         while (firstObject && FlagSet(firstObject->woAdvancedFlags, WOAF_TEMPORARY))
  354.         {
  355.             UI_WINDOW_MANAGER::Subtract(firstObject);
  356.             if (!FlagSet(firstObject->woAdvancedFlags, WOAF_NO_DESTROY))
  357.                 delete firstObject;
  358.             firstObject = First();
  359.         }
  360.         if (exitFunction)
  361.         {
  362.             ccode = (*exitFunction)(display, eventManager, this);
  363.             break;
  364.         }
  365.         else
  366.             ccode = L_EXIT;
  367.         break;
  368.  
  369.     case L_EXIT:
  370.         break;
  371.  
  372.     case L_NEXT:
  373.         // See if it is a modal window.
  374.         if (FlagSet(firstObject->woAdvancedFlags, WOAF_MODAL))
  375.         {
  376.             _errorSystem->Beep();
  377.             break;
  378.         }
  379.  
  380.         // Move to the proper window.
  381.         object = Last();
  382.         while (object->Previous() &&
  383.             (FlagSet(object->woFlags, WOF_NON_SELECTABLE) ||
  384.              FlagSet(object->woAdvancedFlags, WOAF_NON_CURRENT)))
  385.             object = object->Previous();
  386.         if (First() != object &&
  387.             !FlagSet(object->woFlags, WOF_NON_SELECTABLE) &&
  388.             !FlagSet(object->woAdvancedFlags, WOAF_NON_CURRENT))
  389.             ToFront(object, TRUE, FALSE);
  390.         break;
  391.  
  392.     case L_HELP:
  393.         _helpSystem->DisplayHelp(this, NO_HELP_CONTEXT);
  394.         break;
  395.  
  396.     case L_VIEW:
  397.     case L_BEGIN_SELECT:
  398.     case L_CONTINUE_SELECT:
  399.     case L_END_SELECT:
  400.         // Find the proper screen object.
  401.         for (object = First(); object; object = object->Next())
  402.             if (object->Overlap(event.position))
  403.                 break;
  404.             else if (FlagSet(object->woAdvancedFlags, WOAF_MODAL))
  405.             {
  406.                 if (ccode == L_BEGIN_SELECT)
  407.                     _errorSystem->Beep();
  408.                 object = NULL;
  409.                 break;
  410.             }
  411.  
  412.         // See which object should be current, if any.
  413.         if (object != firstObject &&
  414.             FlagSet(firstObject->woAdvancedFlags, WOAF_MODAL))
  415.         {
  416.             eventManager->DeviceState(event.type, DM_VIEW);
  417.             break;
  418.         }
  419.         else if (ccode == L_BEGIN_SELECT && object && object != First() &&
  420.             !FlagSet(object->woFlags, WOF_NON_SELECTABLE) &&
  421.             !FlagSet(object->woAdvancedFlags, WOAF_NON_CURRENT))
  422.             ToFront(object, TRUE, FALSE);
  423.         else if (ccode != L_BEGIN_SELECT && event.rawCode != 0)
  424.             object = First();
  425.         if (!object)
  426.         {
  427.             eventManager->DeviceState(event.type, DM_VIEW);
  428.             break;
  429.         }
  430.         // Continue to default.
  431.  
  432.     default:
  433.         // Get the front object.
  434.         if (!object)
  435.             object = First();
  436.         ccode = object->Event(event);
  437.         if (ccode != S_UNKNOWN && ccode != S_ERROR)
  438.             break;
  439.  
  440.         // Check for hot key matches.
  441.         int tHotKey = E_KEY;
  442.         if (!FlagSet(firstObject->woAdvancedFlags, WOAF_MODAL) &&
  443.             event.type == E_KEY && FlagSet(event.key.shiftState, S_ALT) &&
  444.             (tHotKey = MapEvent(_hotKeyMapTable, tEvent, ID_WINDOW_OBJECT)) != E_KEY)
  445.         {
  446.             tEvent.type = S_CHECK_HOT_KEY;
  447.             tEvent.key.value = tHotKey;
  448.             for (object = firstObject->Next(); object; object = object->Next())
  449.                 if (object->hotKey != 0 &&
  450.                     (tHotKey == object->hotKey ||
  451.                      (object->hotKey == HOT_KEY_SUB_WINDOW && object->Event(tEvent))))
  452.                 {
  453.                     ToFront(object, TRUE, FALSE);
  454.                     ccode = object->Event(event);
  455.                     break;
  456.                 }
  457.         }
  458.         break;
  459.     }
  460.  
  461.     // Return the control code.
  462.     return (ccode);
  463. }
  464.  
  465. #pragma argsused
  466. void UI_WINDOW_MANAGER::Modify(UI_WINDOW_OBJECT *object, const UI_EVENT &event)
  467. {
  468.     // Make sure the object can be sized or moved.
  469.     int ccode = event.type;
  470.     if (ccode == S_SIZE && FlagSet(object->woAdvancedFlags, WOAF_NO_SIZE) ||
  471.         ccode == S_MOVE && FlagSet(object->woAdvancedFlags, WOAF_NO_MOVE))
  472.         return;
  473.  
  474.     // Process S_CHANGE messages. This will result in a SIZE message also
  475.     // being sent to the window.
  476.     for (object = First(); object; object = object->Next())
  477.         if (object->hWnd == event.rawCode)
  478.             break;
  479.  
  480.     if (object && object->hWnd)
  481.     {
  482.         if (ccode == S_SIZE || ccode == S_MOVE)
  483.             PostMessage(object->hWnd, WM_SYSCOMMAND, (ccode == S_MOVE) ? SC_MOVE : SC_SIZE, 0L);
  484.         else
  485.         {
  486.             RECT windowSize;
  487.             GetWindowRect(object->hWnd, &windowSize);
  488.             if (event.region.left != windowSize.left || event.region.top != windowSize.top ||
  489.                 event.region.right != windowSize.right || event.region.bottom != windowSize.bottom)
  490.             {
  491.                 MoveWindow(object->hWnd, event.region.left, event.region.top,
  492.                     event.region.right - event.region.left,
  493.                     event.region.bottom - event.region.top, 0);
  494.             }
  495.             else if (event.region.left != object->true.left || event.region.top != object->true.top ||
  496.                 event.region.right != object->true.right || event.region.bottom != object->true.bottom)
  497.             {
  498.                 UI_EVENT tEvent;
  499.                 tEvent.type = S_SIZE;
  500.                 tEvent.region = event.region;
  501.                 object->relative = event.region;
  502.                 object->true = event.region;
  503.                 object->Event(tEvent);
  504.                 ToFront(object, FALSE, TRUE);
  505.             }
  506.         }
  507.     }
  508. }
  509.  
  510. #pragma argsused
  511. void UI_WINDOW_MANAGER::Subtract(UI_WINDOW_OBJECT *object)
  512. {
  513.     // Make sure the object is in the window list.
  514.     if (UI_LIST::Index(object) != -1)
  515.     {
  516.         UI_LIST::Subtract(object);
  517.         if (object == current)
  518.             current = NULL;
  519.     }
  520.     eventManager->DeviceState(E_DEVICE, DM_VIEW);
  521.  
  522.     UI_EVENT event;
  523.     event.type = S_CLEAR;
  524.     object->Event(event);
  525.     object->display = 0;
  526.     object->eventManager = 0;
  527.     object->windowManager = 0;
  528.  
  529.     // Redraw the affected screen objects.
  530.     UI_WINDOW_OBJECT *tObject = First();
  531.     if (!tObject)
  532.         return;
  533.  
  534.     // Update the front window object.
  535.     event.region = object->true;
  536.     event.type = S_CURRENT;
  537.     object->Event(event);
  538.  
  539.     event.type = S_DISPLAY_INACTIVE;
  540.     for (tObject = First(); tObject; tObject = tObject->Next())
  541.         if (tObject->Overlap(event.region))
  542.             tObject->Event(event);
  543. }
  544.  
  545. #pragma argsused
  546. void UI_WINDOW_MANAGER::ToFront(UI_WINDOW_OBJECT *object, int refreshOld,
  547.     int newWindow)
  548. {
  549.     // Find the Maximum update region.
  550.     UI_REGION region = { 0x0FFF, 0x0FFF, 0x0000, 0x0000 };
  551.     for (UI_WINDOW_OBJECT *tObject = First();
  552.         tObject && tObject != object; tObject = tObject->Next())
  553.         if (object->Overlap(tObject->true))
  554.         {
  555.             region.left = Min(region.left, tObject->true.left);
  556.             region.top = Min(region.top, tObject->true.top);
  557.             region.right = Max(region.right, tObject->true.right);
  558.             region.bottom = Max(region.bottom, tObject->true.bottom);
  559.         }
  560.  
  561.     // Delete any temporary windows.
  562.     UI_WINDOW_OBJECT *firstObject = First();
  563.     if (firstObject && FlagSet(firstObject->woAdvancedFlags, WOAF_TEMPORARY))
  564.     {
  565.         firstObject->woStatus &= ~WOS_CURRENT;
  566.         UI_WINDOW_MANAGER::Erase(firstObject, 0);
  567.         UI_LIST::Subtract(firstObject);
  568.         firstObject = First();
  569.         if (!firstObject)
  570.             return;
  571.     }
  572.  
  573.     // Bring the object to the front of the object queue.
  574.     if (firstObject != object)
  575.     {
  576.         if (UI_LIST::Index(object) != -1)
  577.             UI_LIST::Subtract(object);
  578.         UI_LIST::Add(firstObject, object);
  579.     }
  580.  
  581.     // Inactivate the old object, then activate the new object.
  582.     UI_EVENT event;
  583.     if (refreshOld && firstObject && firstObject != object &&
  584.         !FlagSet(object->woAdvancedFlags, WOAF_TEMPORARY))
  585.     {
  586.         event.type = S_DISPLAY_INACTIVE;
  587.         event.region.left = event.region.top = event.region.right =
  588.             event.region.bottom = -1;
  589.         firstObject->Event(event);
  590.     }
  591.     object->woStatus |= WOS_CURRENT;
  592.     event.type = S_CURRENT;
  593.     event.region = object->true;
  594.     object->Event(event);
  595. }
  596.  
  597.