home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c005 / 5.ddi / C / WNCURSOR.C < prev    next >
Encoding:
C/C++ Source or Header  |  1986-08-05  |  3.3 KB  |  124 lines

  1. /**
  2. *
  3. * Name        wncursor -- Activate a window's cursor and deactivate
  4. *                the cursors of all other windows showing on
  5. *                that display page.
  6. *
  7. * Synopsis    presult = wncursor(pwindow);
  8. *
  9. *        BWINDOW *presult  Pointer to newly-selected BWINDOW
  10. *                  structure, or NIL if failure.
  11. *        BWINDOW *pwindow  Pointer to BWINDOW structure to
  12. *                  select.
  13. *
  14. * Description    The window's cursor is activated (although the cursor
  15. *        may be invisible).  The cursors of other windows on that
  16. *        page are deactivated.
  17. *
  18. *        An error occurs if pwindow does not point to a valid
  19. *        window structure, if the window is hidden or not
  20. *        currently displayed, or if some portion of the window's
  21. *        data area is covered by another window.
  22. *
  23. * Returns    presult       Pointer to newly-selected BWINDOW
  24. *                  structure, or NIL if failure.
  25. *        b_wnerr       Possible values:
  26. *                  (No change)       Success.
  27. *                  WN_BAD_WIN       *pwindow is invalid.
  28. *                  WN_NOT_SHOWN       Hidden or not
  29. *                           currently shown.
  30. *                  WN_COVERED       Data area partly
  31. *                           covered.
  32. *                  WN_BAD_NODE       Internal error.
  33. *
  34. * Version    3.0  (C)Copyright Blaise Computing Inc. 1986
  35. *
  36. **/
  37.  
  38. #include <bwindow.h>
  39.  
  40.                   /* The window (on each page) selected   */
  41.                   /* to have a visible cursor.          */
  42. WIN_NODE *(b_pactnode[MAX_DEVICES][MAX_PAGES]) = {0};
  43.  
  44. BWINDOW *wncursor(pwindow)
  45. BWINDOW *pwindow;
  46. {
  47.     int old_dev,old_page,old_npage;
  48.     int mode,columns,act_page;
  49.     int dev,page;
  50.  
  51.     if (wnvalwin(pwindow) == NIL)
  52.     {
  53.     wnerror(WN_BAD_WIN);
  54.     return NIL;
  55.     }
  56.  
  57.     if (wnvalnod(pwindow->pnode) == NIL)
  58.     {
  59.     wnerror(WN_BAD_NODE);
  60.     return NIL;
  61.     }
  62.  
  63.     if (pwindow->internals.any_data_covered)
  64.     {
  65.     wnerror(WN_COVERED);
  66.     return NIL;
  67.     }
  68.  
  69.     if (pwindow->options.hidden)
  70.     {
  71.     wnerror(WN_NOT_SHOWN);
  72.     return NIL;
  73.     }
  74.  
  75.                       /* Note former device.          */
  76.     old_dev  = scmode(&mode,&columns,&act_page);
  77.  
  78.     old_page = b_curpage;          /* Note current page on former  */
  79.                       /* device.              */
  80.  
  81.                       /* Select and validate device   */
  82.                       /* and page.              */
  83.     if (wnseldev(&pwindow->where_shown,&pwindow->img.dim,&old_npage))
  84.     {
  85.     wnerror(WN_NOT_SHOWN);
  86.     return NIL;
  87.     }
  88.  
  89.     dev  = pwindow->where_shown.dev;
  90.     page = pwindow->where_shown.page;
  91.  
  92.                       /* If a window on this page is  */
  93.                       /* currently designated to      */
  94.                       /* control the cursor,          */
  95.     if (b_pactnode[dev][page] != NIL)
  96.                       /* deactivate it.           */
  97.     b_pactnode[dev][page]->pwin->internals.cur_frozen = 1;
  98.  
  99.                       /* Activate this window instead.*/
  100.     b_pactnode[dev][page] = pwindow->pnode;
  101.  
  102.     pwindow->internals.cur_frozen = 0;
  103.  
  104.                       /* Move the cursor.          */
  105.     sccurset(pwindow->where_shown.corner.row + pwindow->cur_loc.row,
  106.          pwindow->where_shown.corner.col + pwindow->cur_loc.col);
  107.  
  108.                       /* Set cursor type.          */
  109.     scpgcur(pwindow->options.cur_off,
  110.         pwindow->cur_type.high,
  111.         pwindow->cur_type.low,
  112.         CUR_ADJUST);
  113.  
  114.     scpage(old_npage);              /* Restore current page on new  */
  115.                       /* device.              */
  116.  
  117.     scchgdev(old_dev);              /* Restore old device.          */
  118.  
  119.     scpage(old_page);              /* Restore current page on old  */
  120.                       /* device.              */
  121.  
  122.     return pwindow;
  123. }
  124.