home *** CD-ROM | disk | FTP | other *** search
- /**
- *
- * Name wnhide -- Conceal window but leave it attached to
- * video display device and page.
- *
- * Synopsis presult = wnhide(pwin);
- *
- * BWINDOW *presult Pointer to newly-hidden BWINDOW
- * structure, or NIL if failure.
- * BWINDOW *pwin Pointer to BWINDOW structure to
- * conceal.
- *
- * Description This function makes a currently-displayed window
- * invisible and restores the previous contents of the
- * screen. The window's location and border remain set so
- * the window may later be redisplayed via WNUNHIDE.
- *
- * An error occurs if pwin does not point to a valid window
- * structure, or if the window has been designated "not
- * removable", or if the window is not currently displayed.
- *
- * Use WNREMOVE to remove the window and detach it from its
- * location and border. Use WNFORGET to detach it from its
- * location and border without restoring the screen.
- *
- * Returns presult Pointer to newly-hidden BWINDOW
- * structure, or NIL if failure.
- * *pwin Several fields altered.
- * b_pactnode[][] Window node with active cursor.
- * b_wnerr Possible values:
- * (No change) Success.
- * WN_BAD_WIN *pwin is invalid.
- * WN_NOT_SHOWN Not currently shown.
- * WN_CANT_HIDE Not removable.
- * WN_BAD_NODE Internal error.
- * WN_BAD_DEV Internal error.
- * WN_ILL_DIM Internal error.
- * WN_NULL_PTR Internal error.
- *
- * Version 3.0 (C)Copyright Blaise Computing Inc. 1986
- *
- **/
-
- #include <bwindow.h>
-
- /* Internal functions defined below: */
-
- /* Hide covering windows. */
- static WIN_NODE *undisp(WIN_NODE *,LOC *,DIM *);
- /* Mark lower windows uncovered.*/
- static WIN_NODE *uncovr(WIN_NODE *,LOC *,DIM *);
- /* Check for covering windows. */
- static int upcovr(WIN_NODE *,LOC *,DIM *);
- /* Redisplay covering windows. */
- static WIN_NODE *redisp(WIN_NODE *);
-
- BWINDOW *wnhide(pwin)
- BWINDOW *pwin;
- {
- int old_dev,old_page,old_npage;
- int mode,columns,act_page;
- BWINDOW *presult;
- int dev,page;
- int row,col,high,low;
- WIN_NODE *pnode;
-
- if (wnvalwin(pwin) == NIL) /* Validate window structure */
- {
- wnerror(WN_BAD_WIN);
- return NIL;
- }
-
- if (pwin->options.hidden) /* Quit if already invisible */
- return pwin;
-
- if (!pwin->options.removable)
- {
- wnerror(WN_CANT_HIDE); /* Error if not removable */
- return NIL;
- }
-
- old_page = b_curpage; /* Note current page on former */
- /* device. */
-
- /* Note former device. */
- old_dev = scmode(&mode,&columns,&act_page);
-
- if (wnseldev(&pwin->where_prev,&pwin->prev.dim,&old_npage))
- { /* Validate and select device */
- wnerror(WN_NOT_SHOWN); /* and page. */
- return NIL;
- }
-
- presult = pwin; /* Temporarily remove higher */
- /* windows which cover this one.*/
- if (NIL == undisp(pwin->pnode,
- &pwin->where_prev.corner,
- &pwin->prev.dim))
- presult = NIL;
-
- pwin->internals.temp_hid = 0; /* Correct internal flag: */
- /* this window was un-displayed */
- /* by UNDISP but NOT temporarily*/
-
- pwin->options.hidden = 1;
- /* Mark lower windows if */
- /* uncovered. */
- if (uncovr(pwin->pnode,
- &pwin->where_prev.corner,
- &pwin->prev.dim) == NIL)
- presult = NIL;
-
- dev = pwin->where_shown.dev;
- page = pwin->where_shown.page;
- if (b_pactnode[dev][page]->pwin == pwin)
- { /* Then this window is the one */
- /* whose cursor is active. */
- b_pactnode[dev][page] = NIL;
- /* Now no window has an active */
- /* cursor. */
- sccurst(&row,&col,&high,&low);/* Retrieve cursor size. */
- scpgcur(1,high,low,CUR_NO_ADJUST); /* Turn cursor off. */
- }
- pwin->internals.cur_frozen = 1;
-
- /* Redisplay higher windows. */
- if (redisp(pwin->pnode) == NIL) /* (also mark lower windows */
- presult = NIL; /* if covered). */
-
- /* Since we may have just */
- /* exposed some windows, update */
- /* each lower window on this */
- /* display page */
- for (pnode = b_wnlist[dev][pwin->where_shown.page];
- pnode != NIL;
- pnode = pnode->below)
- { /* (except for the ones that */
- if (!pnode->pwin->options.delayed) /* are delayed.) */
- if (wnupdate(pnode->pwin) == NIL)
- {
- presult = NIL;
- break;
- }
- }
-
- scpage(old_npage); /* Restore current page on new */
- /* device. */
-
- scchgdev(old_dev); /* Restore old device. */
-
- scpage(old_page); /* Restore current page on old */
- /* device. */
-
- return presult;
- }
-
- /**
- *
- * Name undisp -- Temporarily remove ("un-display") windows
- * covering a rectangular region on the screen.
- *
- * Synopsis presult = *undisp(pnode,pcorner,pdim);
- *
- * WIN_NODE *presult Copy of pnode, or NIL if failure.
- * WIN_NODE *pnode Pointer to node of lowermost window
- * to (possibly) remove.
- * LOC *pcorner Pointer to structure containing
- * upper left corner of region.
- * DIM *pdim Pointer to structure containing
- * dimensions of region.
- *
- * Description This function finds all windows covering (directly or
- * indirectly) a rectangular region on a display screen and
- * attempts to temporarily remove them. The windows
- * removed are flagged.
- *
- * Hidden windows are not affected.
- *
- * Non-removable windows are not actually removed.
- *
- * Returns presult Pointer to newly-hidden BWINDOW
- * structure, or NIL if failure.
- * b_wnerr Possible values:
- * (No change) Success.
- * WN_BAD_NODE Bad pnode or internal
- * error.
- * WN_BAD_DEV Internal error.
- * WN_NULL_PTR Internal error.
- * WN_ILL_DIM Internal error.
- *
- **/
-
- static WIN_NODE *undisp(pnode,pcorner,pdim)
- WIN_NODE *pnode;
- LOC *pcorner;
- DIM *pdim;
- {
- WIN_NODE *presult;
- BWINDOW *pwin;
-
- if (wnvalnod(pnode) == NIL) /* Validate node. */
- {
- wnerror(WN_BAD_NODE);
- return NIL;
- }
-
- presult = pnode;
- pwin = pnode->pwin;
-
- if (pnode->above != NIL) /* First un-display higher */
- { /* windows that cover */
- /* this rectangle. */
- if (NIL == undisp(pnode->above,
- pcorner,
- pdim))
- presult = NIL;
- }
-
- /* If this window covers the */
- /* rectangle, */
- if ( (!pwin->options.hidden)
- && (!pwin->internals.temp_hid)
- && wnovrlap(pcorner, pdim,
- &pwin->where_prev.corner,&pwin->prev.dim))
- { /* then un-display this window. */
-
- if (pnode->above != NIL) /* First un-display covering */
- { /* windows. */
- if (NIL == undisp(pnode->above,
- &pwin->where_prev.corner,
- &pwin->prev.dim))
- presult = NIL;
- }
-
- /* Replace previous screen data */
- if (pwin->options.removable)
- if (wnputimg(&pwin->prev,&pwin->where_prev) == NIL)
- presult = NIL;
-
- pwin->internals.temp_hid = 1; /* Temporarily hidden. */
- pwin->internals.dirty = 0; /* No longer out-of-date. */
- }
-
- return presult;
- }
-
- /**
- *
- * Name uncovr -- Mark windows uncovered which are below a given
- * window and are overlapped by a given
- * rectangular region but by no other windows.
- *
- * Synopsis presult = *uncovr(pnode,pcorner,pdim);
- *
- * WIN_NODE *presult Copy of pnode, or NIL if failure.
- * WIN_NODE *pnode Pointer to node of uppermost window
- * to (possibly) flag.
- * LOC *pcorner Pointer to structure containing
- * upper left corner of region.
- * DIM *pdim Pointer to structure containing
- * dimensions of region.
- *
- * Description This function marks those windows as uncovered which are
- * at or below a given window and are overlapped by a given
- * rectangular region but by no other windows.
- *
- * Returns presult Pointer to newly-hidden BWINDOW
- * structure, or NIL if failure.
- * b_wnerr Possible values:
- * (No change) Success.
- * WN_BAD_NODE Bad pnode or internal
- * error.
- *
- **/
-
- static WIN_NODE *uncovr(pnode,pcorner,pdim)
- WIN_NODE *pnode;
- LOC *pcorner;
- DIM *pdim;
- {
- WIN_NODE *presult;
- BWINDOW *pwin;
-
- if (wnvalnod(pnode) == NIL)
- {
- wnerror(WN_BAD_NODE);
- return NIL;
- }
-
- pwin = pnode->pwin;
- if (wnovrlap(pcorner, /* If rectangle overlaps this */
- pdim, /* window, */
- &pwin->where_shown.corner,
- &pwin->img.dim))
- {
- if (pnode->above == NIL /* (unless higher windows */
- || !upcovr(pnode->above, /* overlap this one) */
- &pwin->where_shown.corner,
- &pwin->img.dim))
- pwin->internals.frozen = /* mark this win- */
- pwin->internals.any_data_covered = 0; /* dow "uncovered".*/
- }
-
- presult = pnode;
- if (pnode->below != NIL) /* Continue with lower windows. */
- if (uncovr(pnode->below,pcorner,pdim) == NIL)
- presult = NIL;
-
- return presult;
- }
-
- /**
- *
- * Name upcovr -- Check whether higher windows overlap a
- * rectangular region.
- *
- * Synopsis result = *upcovr(pnode,pcorner,pdim);
- *
- * WIN_NODE *presult Copy of pnode, or NIL if failure.
- * WIN_NODE *pnode Pointer to node of window.
- * LOC *pcorner Pointer to structure containing
- * upper left corner of region.
- * DIM *pdim Pointer to structure containing
- * dimensions of region.
- *
- * Description Given a window node and the rectangle defined by *pdim
- * and *pcorner, this function tells whether this window or
- * any higher window overlaps this rectangle.
- *
- * Returns presult Pointer to newly-hidden BWINDOW
- * structure, or NIL if failure.
- * b_wnerr Possible values:
- * (No change) Success.
- * WN_BAD_NODE Bad pnode or internal
- * error.
- *
- **/
-
- static int upcovr(pnode,pcorner,pdim)
- WIN_NODE *pnode;
- LOC *pcorner;
- DIM *pdim;
- {
- int result;
-
- if (wnvalnod(pnode) == NIL) /* Quit if invalid node. */
- {
- wnerror(WN_BAD_NODE);
- return 0;
- }
-
- if (!pnode->pwin->options.hidden
- && wnovrlap(pcorner, /* Check for rectangle overlap. */
- pdim,
- &(pnode->pwin->where_prev.corner),
- &(pnode->pwin->prev.dim)))
- result = 1; /* Overlap. */
-
- else if (pnode->above != NIL) /* No overlap, so look higher. */
- result = upcovr(pnode->above,pcorner,pdim);
-
- else /* No higher windows to check, */
- result = 0; /* so answer is "no". */
-
-
- return result;
- }
-
- /**
- *
- * Name redisp -- Redisplay windows at or above a given window
- * window which have been temporarily hidden.
- *
- * Synopsis presult = *redisp(pnode,pcorner,pdim);
- *
- * WIN_NODE *presult Copy of pnode, or NIL if failure.
- * WIN_NODE *pnode Pointer to node of lowermost window
- * to (possibly) redisplay.
- *
- * Description This function redisplays windows at or above a given
- * window window which have been temporarily hidden.
- *
- * Hidden windows are not affected.
- *
- * Non-removable windows are redisplayed if they are
- * flagged as having been temporarily removed.
- *
- * Returns presult Pointer to newly-hidden BWINDOW
- * structure, or NIL if failure.
- * b_wnerr Possible values:
- * (No change) Success.
- * WN_BAD_NODE Bad pnode or internal
- * error.
- * WN_BAD_DEV Internal error.
- * WN_NULL_PTR Internal error.
- * WN_ILL_DIM Internal error.
- *
- **/
-
- static WIN_NODE *redisp(pnode)
- WIN_NODE *pnode;
- {
- BWINDOW *pwin;
-
- if (wnvalnod(pnode) == NIL) /* Validate node. */
- {
- wnerror(WN_BAD_NODE);
- return NIL;
- }
-
- pwin = pnode->pwin;
-
- if ( (!pwin->options.hidden) /* Skip if hidden by user */
- /* or if not temporarily hidden.*/
- && ( pwin->internals.temp_hid))
- {
- /* Read previous screen contents*/
- if (pwin->options.removable)
- if (wngetimg(&pwin->prev,
- &pwin->where_prev) == NIL)
- return NIL;
-
- wnputbor(&pwin->img.dim, /* Write border. */
- &pwin->bord,
- &pwin->where_shown);
-
- if (wnputimg(&pwin->img, /* Write data. */
- &pwin->where_shown) == NIL)
- return NIL;
-
- pwin->internals.dirty = /* Output is now up-to-date. */
- pwin->internals.temp_hid = 0; /* No longer hidden. */
-
- if (pnode->below != NIL) /* Mark lower windows as covered*/
- if (wncover(pnode->below,
- &pwin->where_shown.corner,
- &pwin->prev.dim) == NIL)
- return NIL;
- }
-
- if (pnode->above != NIL) /* Continue with higher windows.*/
- if (redisp(pnode->above) == NIL)
- return NIL;
-
- return pnode;
- }