Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!uwm.edu!gem.mps.ohio-state.edu!think!snorkelwacker!bloom-beacon!eru!luth!sunic!infovax!bl From: bl@infovax.UUCP (Bj|rn Larsson) Newsgroups: comp.sys.ibm.pc Subject: Re: pccurses v1.3 mvwin() problem Message-ID: <307@infovax.UUCP> Date: 11 Nov 89 23:38:26 GMT References: <16679@dartvax.Dartmouth.EDU> <306@infovax.UUCP> Reply-To: bl@infovax.UUCP (Bj|rn Larsson) Organization: Infovox AB, SOLNA, Sweden Lines: 175 In article <306@infovax.UUCP> bl@infovax.UUCP I write: >In article <16679@dartvax.Dartmouth.EDU> pete@othello.dartmouth.edu (Pete Schmitt) writes: > >Below is a modified version of the example, which works with pccurses. Forget that! Just after posting I realized my example more or less emu- lates overwrite(), not overlay(). Please no flames... instead I rewrote the overlay/overwrite module to make it behave like Pete (and others) wants. The revised version is for a (possibly) upcoming version 1.4. I have not checked that it compiles, links and works correctly with the 1.3 package (I tested it with a 1.4a temporary version) but it should. If there are any problems, they should not be worse than compiler warnings. Just rebuild the pccurses libraries with the below overlay.c module replacing the 1.3 version: /****************************************************************/ /* Overlay() and overwrite() functions of the PCcurses package */ /* */ /****************************************************************/ /* This version of curses is based on ncurses, a curses version */ /* originally written by Pavel Curtis at Cornell University. */ /* I have made substantial changes to make it run on IBM PC's, */ /* and therefore consider myself free to make it public domain. */ /* Bjorn Larsson (...mcvax!enea!infovax!bl) */ /****************************************************************/ /* 1.4b: Overlaying window will not line up with over- */ /* layed window's origin, but at it's 'own' origin */ /* relative to the overlayed's origin: 891111 */ /* 1.4a: Portability improvements: 890408 */ /* 1.3: MSC -W3, Turbo'C' -w -w-pro checks: 881005 */ /* 1.2: Max limits off by 1. Fixed thanks to S. Creps: 881002 */ /* 1.0: Release: 870515 */ /****************************************************************/ #include #include char _curses_overlay_rcsid[] = "@(#)overlay.c v.1.4b - 891111"; /****************************************************************/ /* Overlay() overwrites 'win1' upon 'win2', with 'win1' appea- */ /* ring in 'win2' at it own origin relative to 'win2's origin. */ /* This is a departure, but a desirable one, from the initial */ /* definition of this function. Overlay is transparent; blanks */ /* from 'win1' are not copied to 'win2'. */ /****************************************************************/ void overlay(win1, win2) WINDOW *win1, *win2; { int *minchng; int *maxchng; int *w1ptr; int *w2ptr; int attrs; int col; int line; int last_line; int last_col; last_col = min(win1->_maxx + win1->_begx, win2->_maxx) - 1; last_line = min(win1->_maxy + win1->_begy, win2->_maxy) - 1; attrs = win2->_attrs & ATR_MSK; minchng = win2->_minchng + win1->_begy; maxchng = win2->_maxchng + win1->_begy; for(line = win1->_begy; line <= last_line; line++) { register short fc, lc; w1ptr = win1->_line[line - win1->_begy]; w2ptr = win2->_line[line] + win1->_begx; fc = _NO_CHANGE; for(col = win1->_begx; col <= last_col; col++) { if ((*w1ptr & CHR_MSK) != ' ') { *w2ptr = (*w1ptr & CHR_MSK) | attrs; if (fc == _NO_CHANGE) fc = col; lc = col; } /* if */ w1ptr++; w2ptr++; } /* for */ if (*minchng == _NO_CHANGE) { *minchng = fc; *maxchng = lc; } /* if */ else if (fc != _NO_CHANGE) { if (fc < *minchng) *minchng = fc; if (lc > *maxchng) *maxchng = lc; } /* else if */ minchng++; maxchng++; } /* for */ } /* overlay */ /****************************************************************/ /* Overwrite() overwrites 'win1' upon 'win2', with 'win1' ap- */ /* pearing in 'win2' at it own origin relative to 'win2's ori- */ /* gin. This is a departure, but a desirable one, from the */ /* initial definition of this function. Overwrite is non-trans- */ /* parent; blanks from 'win1' are copied to 'win2'. */ /****************************************************************/ void overwrite(win1, win2) WINDOW *win1, *win2; { int *minchng; int *maxchng; int *w1ptr; int *w2ptr; int attrs; int col; int line; int last_line; int last_col; last_col = min(win1->_maxx + win1->_begx, win2->_maxx) - 1; last_line = min(win1->_maxy + win1->_begy, win2->_maxy) - 1; attrs = win2->_attrs & ATR_MSK; minchng = win2->_minchng + win1->_begy; maxchng = win2->_maxchng + win1->_begy; for(line = win1->_begy; line <= last_line; line++) { register short fc, lc; w1ptr = win1->_line[line - win1->_begy]; w2ptr = win2->_line[line] + win1->_begx; fc = _NO_CHANGE; for(col = win1->_begx; col <= last_col; col++) { if ((*w1ptr & CHR_MSK) != (*w2ptr & CHR_MSK)) { *w2ptr = (*w1ptr & CHR_MSK) | attrs; if (fc == _NO_CHANGE) fc = col; lc = col; } /* if */ w1ptr++; w2ptr++; } /* for */ if (*minchng == _NO_CHANGE) { *minchng = fc; *maxchng = lc; } /* if */ else if (fc != _NO_CHANGE) { if (fc < *minchng) *minchng = fc; if (lc > *maxchng) *maxchng = lc; } /* else if */ minchng++; maxchng++; } /* for */ } /* overwrite */ -- ====================== InfoVox = Speech Technology ======================= Bjorn Larsson, INFOVOX AB : ...seismo!mcvax!kth!sunic!infovax!bl Box 2503 : bl@infovox.se S-171 02 Solna, Sweden : Phone (+46) 8 735 80 90