|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T w
Length: 3611 (0xe1b) Types: TextFile Names: »wlist.c«
└─⟦87ddcff64⟧ Bits:30001253 CPHDIST85 Tape, 1985 Autumn Conference Copenhagen └─⟦this⟧ »cph85dist/wm/wlist.c«
/* ************* * DISTRIBUTION NOTICE July 30 1985 * A Revised Edition of WM, by Matt Lennon and Tom Truscott, * Research Triangle Institute, (919) 541-7005. * Based on the original by Robert Jacob (decvax!nrl-css!jacob), * Naval Research Laboratory, (202) 767-3365. * No claims or warranties of any sort are made for this distribution. * General permission is granted to copy, but not for profit, * any of this distribution, provided that this notice * is always included in the copies. ************* */ /* * Code for rearranging window display order */ #include "wm.h" /* * Make window 'w' the new top window. * Insert 'w' into window list (keeps track * of redraw order). * 'topw' (pointer to the top window) is set to 'w'. * Recompute obscured window status. */ WListAdd(w) register int w; { register int wt; /* temporary window pointer */ /* Add w to empty list. */ if (botw < 0) botw=w; /* Add w to top of nonempty list. */ else { for (wt=botw; win[wt].next>=0; wt=win[wt].next) ; win[wt].next=w; } win[w].next = -1; topw = w; /* Recompute obscured window status */ WObscure(); } /* * Delete window 'w'. * Remove it from window list. * Recompute obscured windows. */ WListDelete(w) register int w; { register int wt; /* temporary window pointer */ if ( ! iswindow(w)) return; /* Don't read from this window any more. */ DisablePty(w); /* Delete w from list. */ if (botw==w) botw=win[botw].next; else { for (wt=botw; wt>=0; wt=win[wt].next) if (win[wt].next==w) break; if (wt>=0) win[wt].next=win[win[wt].next].next; } /* Find new topw. */ wt=botw; while (wt>=0 && win[wt].next>=0) wt=win[wt].next; topw=wt; /* Recompute obscured window info */ WObscure(); } /* * Recompute obscured ('blocked') and 'covers' information * Enable/Disable ptys appropriately. */ WObscure() { register int w, wt, i; for (w = botw; w >= 0; w = win[w].next) { EnablePty(w); win[w].flags &= ~BLOCKED; for (i = 0; i < MAXWINDOWS; i++) win[w].covers[i] = FALSE; for (wt = botw; wt != w; wt = win[wt].next) { if (!overlap(w, wt)) continue; win[w].covers[wt] = TRUE; win[wt].flags |= BLOCKED; /* We could disable the obscured window's pty at this point, * but we'll wait and do it in 'readptys()'. */ /* (we should probably disable it now if it was previously) */ } } } /* Note: the arithmetic 'bottom' is actual the visual 'top'! * Also, RIGHT and TOP are the index of the column (row) just past * the index of the window's actual right (top). */ #define BOTTOM(wp) (wbegy(wp)) #define TOP(wp) (BOTTOM(wp)+wlines(wp)) #define LEFT(wp) (wbegx(wp)) #define RIGHT(wp) (LEFT(wp)+wcols(wp)) /* * Determine if two windows overlap. * Windows must have at least a row (column) separating them * to permit the border lines to be drawn. */ overlap(w1, w2) int w1, w2; { register WINDOW *wp1, *wp2; wp1 = win[w1].wptr; wp2 = win[w2].wptr; return(LEFT(wp1) <= RIGHT(wp2) && LEFT(wp2) <= RIGHT(wp1) && BOTTOM(wp1) <= TOP(wp2) && BOTTOM(wp2) <= TOP(wp1)); } /* * Returns 1 if a window (or its border) above w cover point (y,x), * otherwise returns 0. */ covers(w, y, x) int w; register int y, x; { register int wt; register WINDOW *wp; for (wt = w; (wt = win[wt].next) >= 0;) { wp = win[wt].wptr; if (LEFT(wp) <= x+1 && x <= RIGHT(wp) && BOTTOM(wp) <= y+1 && y <= TOP(wp)) return(1); } return(0); }