[BACK]Return to window.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / mg

Diff for /src/usr.bin/mg/window.c between version 1.2 and 1.3

version 1.2, 2000/02/26 22:53:16 version 1.3, 2000/04/13 06:12:18
Line 13 
Line 13 
  * If GOSREC is defined, with no argument it defaults to 1   * If GOSREC is defined, with no argument it defaults to 1
  * and works like in Gosling.   * and works like in Gosling.
  */   */
 /*ARGSUSED*/  /* ARGSUSED */
 reposition(f, n)  reposition(f, n)
 {  {
 #ifndef GOSREC  #ifndef GOSREC
         curwp->w_force = (f & FFARG) ? (n>=0 ? n+1 : n) : 0;          curwp->w_force = (f & FFARG) ? (n >= 0 ? n + 1 : n) : 0;
 #else  #else
         curwp->w_force = n;          curwp->w_force = n;
 #endif  #endif
Line 41 
Line 41 
  * the window bigger again, and send another command,   * the window bigger again, and send another command,
  * everything will get fixed!   * everything will get fixed!
  */   */
 /*ARGSUSED*/  /* ARGSUSED */
 refresh(f, n)  refresh(f, n)
 {  {
         register MGWIN *wp;          register MGWIN *wp;
         register int    oldnrow;          register int    oldnrow;
         register int    oldncol;          register int    oldncol;
   
         oldnrow = nrow;          oldnrow = nrow;
         oldncol = ncol;          oldncol = ncol;
         ttresize();          ttresize();
         if (nrow!=oldnrow || ncol!=oldncol) {          if (nrow != oldnrow || ncol != oldncol) {
                 wp = wheadp;                    /* Find last.           */                  wp = wheadp;    /* Find last.            */
                 while (wp->w_wndp != NULL)                  while (wp->w_wndp != NULL)
                         wp = wp->w_wndp;                          wp = wp->w_wndp;
                 if (nrow < wp->w_toprow+3) {    /* Check if too small.  */                  if (nrow < wp->w_toprow + 3) {  /* Check if too small.   */
                         ewprintf("Display unusable");                          ewprintf("Display unusable");
                         return (FALSE);                          return (FALSE);
                 }                  }
                 wp->w_ntrows = nrow-wp->w_toprow-2;                  wp->w_ntrows = nrow - wp->w_toprow - 2;
                 sgarbf = TRUE;                  sgarbf = TRUE;
                 update();                  update();
                 ewprintf("New size %d by %d", nrow, ncol);                  ewprintf("New size %d by %d", nrow, ncol);
Line 76 
Line 76 
  * nothing if there is only 1 window on   * nothing if there is only 1 window on
  * the screen.   * the screen.
  */   */
 /*ARGSUSED*/  /* ARGSUSED */
 nextwind(f, n)  nextwind(f, n)
 {  {
         register MGWIN *wp;          register MGWIN *wp;
   
         if ((wp=curwp->w_wndp) == NULL)          if ((wp = curwp->w_wndp) == NULL)
                 wp = wheadp;                  wp = wheadp;
         curwp = wp;          curwp = wp;
         curbp = wp->w_bufp;          curbp = wp->w_bufp;
Line 97 
Line 97 
  * although the command does not do a lot   * although the command does not do a lot
  * if there is 1 window.   * if there is 1 window.
  */   */
 /*ARGSUSED*/  /* ARGSUSED */
 prevwind(f, n)  prevwind(f, n)
 {  {
         register MGWIN *wp1;          register MGWIN *wp1;
Line 126 
Line 126 
  * distruction of a window makes a buffer   * distruction of a window makes a buffer
  * become undisplayed.   * become undisplayed.
  */   */
 /*ARGSUSED*/  /* ARGSUSED */
 onlywind(f, n)  onlywind(f, n)
 {  {
         register MGWIN *wp;          register MGWIN *wp;
         register LINE   *lp;          register LINE  *lp;
         register int    i;          register int    i;
   
         while (wheadp != curwp) {          while (wheadp != curwp) {
                 wp = wheadp;                  wp = wheadp;
                 wheadp = wp->w_wndp;                  wheadp = wp->w_wndp;
                 if (--wp->w_bufp->b_nwnd == 0) {                  if (--wp->w_bufp->b_nwnd == 0) {
                         wp->w_bufp->b_dotp  = wp->w_dotp;                          wp->w_bufp->b_dotp = wp->w_dotp;
                         wp->w_bufp->b_doto  = wp->w_doto;                          wp->w_bufp->b_doto = wp->w_doto;
                         wp->w_bufp->b_markp = wp->w_markp;                          wp->w_bufp->b_markp = wp->w_markp;
                         wp->w_bufp->b_marko = wp->w_marko;                          wp->w_bufp->b_marko = wp->w_marko;
                 }                  }
Line 148 
Line 148 
                 wp = curwp->w_wndp;                  wp = curwp->w_wndp;
                 curwp->w_wndp = wp->w_wndp;                  curwp->w_wndp = wp->w_wndp;
                 if (--wp->w_bufp->b_nwnd == 0) {                  if (--wp->w_bufp->b_nwnd == 0) {
                         wp->w_bufp->b_dotp  = wp->w_dotp;                          wp->w_bufp->b_dotp = wp->w_dotp;
                         wp->w_bufp->b_doto  = wp->w_doto;                          wp->w_bufp->b_doto = wp->w_doto;
                         wp->w_bufp->b_markp = wp->w_markp;                          wp->w_bufp->b_markp = wp->w_markp;
                         wp->w_bufp->b_marko = wp->w_marko;                          wp->w_bufp->b_marko = wp->w_marko;
                 }                  }
                 free((char *) wp);                  free((char *) wp);
         }          }
         lp = curwp->w_linep;          lp = curwp->w_linep;
         i  = curwp->w_toprow;          i = curwp->w_toprow;
         while (i!=0 && lback(lp)!=curbp->b_linep) {          while (i != 0 && lback(lp) != curbp->b_linep) {
                 --i;                  --i;
                 lp = lback(lp);                  lp = lback(lp);
         }          }
         curwp->w_toprow = 0;          curwp->w_toprow = 0;
         curwp->w_ntrows = nrow-2;               /* 2 = mode, echo.      */          curwp->w_ntrows = nrow - 2;     /* 2 = mode, echo.       */
         curwp->w_linep  = lp;          curwp->w_linep = lp;
         curwp->w_flag  |= WFMODE|WFHARD;          curwp->w_flag |= WFMODE | WFHARD;
         return TRUE;          return TRUE;
 }  }
   
Line 175 
Line 175 
  * a "malloc" failure allocating the structure   * a "malloc" failure allocating the structure
  * for the new window.   * for the new window.
  */   */
 /*ARGSUSED*/  /* ARGSUSED */
 splitwind(f, n)  splitwind(f, n)
 {  {
         register MGWIN *wp;          register MGWIN *wp;
         register LINE   *lp;          register LINE  *lp;
         register int    ntru;          register int    ntru;
         register int    ntrd;          register int    ntrd;
         int             ntrl;          int             ntrl;
         MGWIN           *wp1, *wp2;          MGWIN          *wp1, *wp2;
   
         if (curwp->w_ntrows < 3) {          if (curwp->w_ntrows < 3) {
                 ewprintf("Cannot split a %d line window", curwp->w_ntrows);                  ewprintf("Cannot split a %d line window", curwp->w_ntrows);
                 return (FALSE);                  return (FALSE);
         }          }
         if ((wp = (MGWIN *)malloc(sizeof(MGWIN))) == NULL) {          if ((wp = (MGWIN *) malloc(sizeof(MGWIN))) == NULL) {
                 ewprintf("Can't get %d", sizeof(MGWIN));                  ewprintf("Can't get %d", sizeof(MGWIN));
                 return (FALSE);                  return (FALSE);
         }          }
         ++curbp->b_nwnd;                        /* Displayed twice.     */          ++curbp->b_nwnd;        /* Displayed twice.      */
         wp->w_bufp  = curbp;          wp->w_bufp = curbp;
         wp->w_dotp  = curwp->w_dotp;          wp->w_dotp = curwp->w_dotp;
         wp->w_doto  = curwp->w_doto;          wp->w_doto = curwp->w_doto;
         wp->w_markp = curwp->w_markp;          wp->w_markp = curwp->w_markp;
         wp->w_marko = curwp->w_marko;          wp->w_marko = curwp->w_marko;
         wp->w_flag  = 0;          wp->w_flag = 0;
         wp->w_force = 0;          wp->w_force = 0;
         ntru = (curwp->w_ntrows-1) / 2;         /* Upper size           */          ntru = (curwp->w_ntrows - 1) / 2;       /* Upper size            */
         ntrl = (curwp->w_ntrows-1) - ntru;      /* Lower size           */          ntrl = (curwp->w_ntrows - 1) - ntru;    /* Lower size            */
         lp = curwp->w_linep;          lp = curwp->w_linep;
         ntrd = 0;          ntrd = 0;
         while (lp != curwp->w_dotp) {          while (lp != curwp->w_dotp) {
Line 210 
Line 210 
                 lp = lforw(lp);                  lp = lforw(lp);
         }          }
         lp = curwp->w_linep;          lp = curwp->w_linep;
         if (ntrd <= ntru) {                     /* Old is upper window. */          if (ntrd <= ntru) {     /* Old is upper window. */
                 if (ntrd == ntru)               /* Hit mode line.       */                  if (ntrd == ntru)       /* Hit mode line.        */
                         lp = lforw(lp);                          lp = lforw(lp);
                 curwp->w_ntrows = ntru;                  curwp->w_ntrows = ntru;
                 wp->w_wndp = curwp->w_wndp;                  wp->w_wndp = curwp->w_wndp;
                 curwp->w_wndp = wp;                  curwp->w_wndp = wp;
                 wp->w_toprow = curwp->w_toprow+ntru+1;                  wp->w_toprow = curwp->w_toprow + ntru + 1;
                 wp->w_ntrows = ntrl;                  wp->w_ntrows = ntrl;
         } else {                                /* Old is lower window  */          } else {                /* Old is lower window   */
                 wp1 = NULL;                  wp1 = NULL;
                 wp2 = wheadp;                  wp2 = wheadp;
                 while (wp2 != curwp) {                  while (wp2 != curwp) {
Line 229 
Line 229 
                         wheadp = wp;                          wheadp = wp;
                 else                  else
                         wp1->w_wndp = wp;                          wp1->w_wndp = wp;
                 wp->w_wndp   = curwp;                  wp->w_wndp = curwp;
                 wp->w_toprow = curwp->w_toprow;                  wp->w_toprow = curwp->w_toprow;
                 wp->w_ntrows = ntru;                  wp->w_ntrows = ntru;
                 ++ntru;                         /* Mode line.           */                  ++ntru;         /* Mode line.            */
                 curwp->w_toprow += ntru;                  curwp->w_toprow += ntru;
                 curwp->w_ntrows  = ntrl;                  curwp->w_ntrows = ntrl;
                 while (ntru--)                  while (ntru--)
                         lp = lforw(lp);                          lp = lforw(lp);
         }          }
         curwp->w_linep = lp;                    /* Adjust the top lines */          curwp->w_linep = lp;    /* Adjust the top lines */
         wp->w_linep = lp;                       /* if necessary.        */          wp->w_linep = lp;       /* if necessary.         */
         curwp->w_flag |= WFMODE|WFHARD;          curwp->w_flag |= WFMODE | WFHARD;
         wp->w_flag |= WFMODE|WFHARD;          wp->w_flag |= WFMODE | WFHARD;
         return TRUE;          return TRUE;
 }  }
   
Line 253 
Line 253 
  * hard work. You don't just set "force reframe"   * hard work. You don't just set "force reframe"
  * because dot would move.   * because dot would move.
  */   */
 /*ARGSUSED*/  /* ARGSUSED */
 enlargewind(f, n)  enlargewind(f, n)
 {  {
         register MGWIN *adjwp;          register MGWIN *adjwp;
         register LINE   *lp;          register LINE  *lp;
         register int    i;          register int    i;
   
         if (n < 0)          if (n < 0)
                 return shrinkwind(f, -n);                  return shrinkwind(f, -n);
Line 266 
Line 266 
                 ewprintf("Only one window");                  ewprintf("Only one window");
                 return FALSE;                  return FALSE;
         }          }
         if ((adjwp=curwp->w_wndp) == NULL) {          if ((adjwp = curwp->w_wndp) == NULL) {
                 adjwp = wheadp;                  adjwp = wheadp;
                 while (adjwp->w_wndp != curwp)                  while (adjwp->w_wndp != curwp)
                         adjwp = adjwp->w_wndp;                          adjwp = adjwp->w_wndp;
Line 275 
Line 275 
                 ewprintf("Impossible change");                  ewprintf("Impossible change");
                 return FALSE;                  return FALSE;
         }          }
         if (curwp->w_wndp == adjwp) {           /* Shrink below.        */          if (curwp->w_wndp == adjwp) {   /* Shrink below.         */
                 lp = adjwp->w_linep;                  lp = adjwp->w_linep;
                 for (i=0; i<n && lp!=adjwp->w_bufp->b_linep; ++i)                  for (i = 0; i < n && lp != adjwp->w_bufp->b_linep; ++i)
                         lp = lforw(lp);                          lp = lforw(lp);
                 adjwp->w_linep  = lp;                  adjwp->w_linep = lp;
                 adjwp->w_toprow += n;                  adjwp->w_toprow += n;
         } else {                                /* Shrink above.        */          } else {                /* Shrink above.         */
                 lp = curwp->w_linep;                  lp = curwp->w_linep;
                 for (i=0; i<n && lback(lp)!=curbp->b_linep; ++i)                  for (i = 0; i < n && lback(lp) != curbp->b_linep; ++i)
                         lp = lback(lp);                          lp = lback(lp);
                 curwp->w_linep  = lp;                  curwp->w_linep = lp;
                 curwp->w_toprow -= n;                  curwp->w_toprow -= n;
         }          }
         curwp->w_ntrows += n;          curwp->w_ntrows += n;
         adjwp->w_ntrows -= n;          adjwp->w_ntrows -= n;
         curwp->w_flag |= WFMODE|WFHARD;          curwp->w_flag |= WFMODE | WFHARD;
         adjwp->w_flag |= WFMODE|WFHARD;          adjwp->w_flag |= WFMODE | WFHARD;
         return TRUE;          return TRUE;
 }  }
   
Line 304 
Line 304 
 shrinkwind(f, n)  shrinkwind(f, n)
 {  {
         register MGWIN *adjwp;          register MGWIN *adjwp;
         register LINE   *lp;          register LINE  *lp;
         register int    i;          register int    i;
   
         if (n < 0)          if (n < 0)
                 return enlargewind(f, -n);                  return enlargewind(f, -n);
Line 317 
Line 317 
          * Bit of flakiness - KRANDOM means it was an internal call, and           * Bit of flakiness - KRANDOM means it was an internal call, and
          * to be trusted implicitly about sizes.           * to be trusted implicitly about sizes.
          */           */
         if ( !(f & FFRAND) && curwp->w_ntrows <= n) {          if (!(f & FFRAND) && curwp->w_ntrows <= n) {
                 ewprintf("Impossible change");                  ewprintf("Impossible change");
                 return (FALSE);                  return (FALSE);
         }          }
         if ((adjwp=curwp->w_wndp) == NULL) {          if ((adjwp = curwp->w_wndp) == NULL) {
                 adjwp = wheadp;                  adjwp = wheadp;
                 while (adjwp->w_wndp != curwp)                  while (adjwp->w_wndp != curwp)
                         adjwp = adjwp->w_wndp;                          adjwp = adjwp->w_wndp;
         }          }
         if (curwp->w_wndp == adjwp) {           /* Grow below.          */          if (curwp->w_wndp == adjwp) {   /* Grow below.           */
                 lp = adjwp->w_linep;                  lp = adjwp->w_linep;
                 for (i=0; i<n && lback(lp)!=adjwp->w_bufp->b_linep; ++i)                  for (i = 0; i < n && lback(lp) != adjwp->w_bufp->b_linep; ++i)
                         lp = lback(lp);                          lp = lback(lp);
                 adjwp->w_linep  = lp;                  adjwp->w_linep = lp;
                 adjwp->w_toprow -= n;                  adjwp->w_toprow -= n;
         } else {                                /* Grow above.          */          } else {                /* Grow above.           */
                 lp = curwp->w_linep;                  lp = curwp->w_linep;
                 for (i=0; i<n && lp!=curbp->b_linep; ++i)                  for (i = 0; i < n && lp != curbp->b_linep; ++i)
                         lp = lforw(lp);                          lp = lforw(lp);
                 curwp->w_linep  = lp;                  curwp->w_linep = lp;
                 curwp->w_toprow += n;                  curwp->w_toprow += n;
         }          }
         curwp->w_ntrows -= n;          curwp->w_ntrows -= n;
         adjwp->w_ntrows += n;          adjwp->w_ntrows += n;
         curwp->w_flag |= WFMODE|WFHARD;          curwp->w_flag |= WFMODE | WFHARD;
         adjwp->w_flag |= WFMODE|WFHARD;          adjwp->w_flag |= WFMODE | WFHARD;
         return (TRUE);          return (TRUE);
 }  }
   
Line 350 
Line 350 
  * Delete current window. Call shrink-window to do the screen   * Delete current window. Call shrink-window to do the screen
  * updating, then throw away the window.   * updating, then throw away the window.
  */   */
 /*ARGSUSED*/  /* ARGSUSED */
 delwind(f, n)  delwind(f, n)
 {  {
         register MGWIN *wp, *nwp;          register MGWIN *wp, *nwp;
   
         wp = curwp;                     /* Cheap...             */          wp = curwp;             /* Cheap...              */
         /* shrinkwind returning false means only one window... */          /* shrinkwind returning false means only one window... */
         if (shrinkwind(FFRAND, wp->w_ntrows + 1) == FALSE)          if (shrinkwind(FFRAND, wp->w_ntrows + 1) == FALSE)
                 return FALSE;                  return FALSE;
         if (--wp->w_bufp->b_nwnd == 0) {          if (--wp->w_bufp->b_nwnd == 0) {
                 wp->w_bufp->b_dotp  = wp->w_dotp;                  wp->w_bufp->b_dotp = wp->w_dotp;
                 wp->w_bufp->b_doto  = wp->w_doto;                  wp->w_bufp->b_doto = wp->w_doto;
                 wp->w_bufp->b_markp = wp->w_markp;                  wp->w_bufp->b_markp = wp->w_markp;
                 wp->w_bufp->b_marko = wp->w_marko;                  wp->w_bufp->b_marko = wp->w_marko;
         }          }
         /* since shrinkwind did't crap out, we know we have a second window */          /* since shrinkwind did't crap out, we know we have a second window */
         if (wp == wheadp) wheadp = curwp = wp->w_wndp;          if (wp == wheadp)
         else if ((curwp = wp->w_wndp) == NULL) curwp = wheadp;                  wheadp = curwp = wp->w_wndp;
           else if ((curwp = wp->w_wndp) == NULL)
                   curwp = wheadp;
         curbp = curwp->w_bufp;          curbp = curwp->w_bufp;
         for (nwp = wheadp; nwp != NULL; nwp = nwp->w_wndp)          for (nwp = wheadp; nwp != NULL; nwp = nwp->w_wndp)
                 if (nwp->w_wndp == wp) {                  if (nwp->w_wndp == wp) {
                         nwp->w_wndp = wp->w_wndp;                          nwp->w_wndp = wp->w_wndp;
                         break ;                          break;
                 }                  }
         free((char *) wp);          free((char *) wp);
         return TRUE;          return TRUE;
Line 385 
Line 387 
  * might be better. Return a pointer, or   * might be better. Return a pointer, or
  * NULL on error.   * NULL on error.
  */   */
 MGWIN   *  MGWIN *
 wpopup() {  wpopup()
   {
         register MGWIN *wp;          register MGWIN *wp;
   
         if (wheadp->w_wndp == NULL          if (wheadp->w_wndp == NULL
         && splitwind(FFRAND, 0) == FALSE)              && splitwind(FFRAND, 0) == FALSE)
                 return NULL;                  return NULL;
         wp = wheadp;                            /* Find window to use   */          wp = wheadp;            /* Find window to use    */
         while (wp!=NULL && wp==curwp)          while (wp != NULL && wp == curwp)
                 wp = wp->w_wndp;                  wp = wp->w_wndp;
         return wp;          return wp;
 }  }

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.3