Hex Artifact Content

Artifact feedd960b5dfbb181d3b5dff2be9b872e3d788c7:


0000: 2f 2a 20 0a 20 2a 20 74 6b 54 65 78 74 44 69 73  /* . * tkTextDis
0010: 70 2e 63 20 28 43 54 6b 29 20 2d 2d 0a 20 2a 0a  p.c (CTk) --. *.
0020: 20 2a 09 54 68 69 73 20 6d 6f 64 75 6c 65 20 70   *.This module p
0030: 72 6f 76 69 64 65 73 20 66 61 63 69 6c 69 74 69  rovides faciliti
0040: 65 73 20 74 6f 20 64 69 73 70 6c 61 79 20 74 65  es to display te
0050: 78 74 20 77 69 64 67 65 74 73 2e 20 20 49 74 20  xt widgets.  It 
0060: 69 73 0a 20 2a 09 74 68 65 20 6f 6e 6c 79 20 70  is. *.the only p
0070: 6c 61 63 65 20 77 68 65 72 65 20 69 6e 66 6f 72  lace where infor
0080: 6d 61 74 69 6f 6e 20 69 73 20 6b 65 70 74 20 61  mation is kept a
0090: 62 6f 75 74 20 74 68 65 20 73 63 72 65 65 6e 20  bout the screen 
00a0: 6c 61 79 6f 75 74 0a 20 2a 09 6f 66 20 74 65 78  layout. *.of tex
00b0: 74 20 77 69 64 67 65 74 73 2e 0a 20 2a 0a 20 2a  t widgets.. *. *
00c0: 20 43 6f 70 79 72 69 67 68 74 20 28 63 29 20 31   Copyright (c) 1
00d0: 39 39 32 2d 31 39 39 34 20 54 68 65 20 52 65 67  992-1994 The Reg
00e0: 65 6e 74 73 20 6f 66 20 74 68 65 20 55 6e 69 76  ents of the Univ
00f0: 65 72 73 69 74 79 20 6f 66 20 43 61 6c 69 66 6f  ersity of Califo
0100: 72 6e 69 61 2e 0a 20 2a 20 43 6f 70 79 72 69 67  rnia.. * Copyrig
0110: 68 74 20 28 63 29 20 31 39 39 34 2d 31 39 39 35  ht (c) 1994-1995
0120: 20 53 75 6e 20 4d 69 63 72 6f 73 79 73 74 65 6d   Sun Microsystem
0130: 73 2c 20 49 6e 63 2e 0a 20 2a 20 43 6f 70 79 72  s, Inc.. * Copyr
0140: 69 67 68 74 20 28 63 29 20 31 39 39 35 20 43 6c  ight (c) 1995 Cl
0150: 65 76 65 6c 61 6e 64 20 43 6c 69 6e 69 63 20 46  eveland Clinic F
0160: 6f 75 6e 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20  oundation. *. * 
0170: 53 65 65 20 74 68 65 20 66 69 6c 65 20 22 6c 69  See the file "li
0180: 63 65 6e 73 65 2e 74 65 72 6d 73 22 20 66 6f 72  cense.terms" for
0190: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
01a0: 75 73 61 67 65 20 61 6e 64 20 72 65 64 69 73 74  usage and redist
01b0: 72 69 62 75 74 69 6f 6e 0a 20 2a 20 6f 66 20 74  ribution. * of t
01c0: 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 66 6f  his file, and fo
01d0: 72 20 61 20 44 49 53 43 4c 41 49 4d 45 52 20 4f  r a DISCLAIMER O
01e0: 46 20 41 4c 4c 20 57 41 52 52 41 4e 54 49 45 53  F ALL WARRANTIES
01f0: 2e 0a 20 2a 0a 20 2a 20 40 28 23 29 20 24 49 64  .. *. * @(#) $Id
0200: 3a 20 63 74 6b 2e 73 68 61 72 2c 76 20 31 2e 35  : ctk.shar,v 1.5
0210: 30 20 31 39 39 36 2f 30 31 2f 31 35 20 31 34 3a  0 1996/01/15 14:
0220: 34 37 3a 31 36 20 61 6e 64 72 65 77 6d 20 45 78  47:16 andrewm Ex
0230: 70 20 61 6e 64 72 65 77 6d 20 24 0a 20 2a 2f 0a  p andrewm $. */.
0240: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6b 50 6f  ..#include "tkPo
0250: 72 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  rt.h".#include "
0260: 74 6b 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  tkInt.h".#includ
0270: 65 20 22 74 6b 54 65 78 74 2e 68 22 0a 0a 2f 2a  e "tkText.h"../*
0280: 0a 20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  . * The followin
0290: 67 20 73 74 72 75 63 74 75 72 65 20 64 65 73 63  g structure desc
02a0: 72 69 62 65 73 20 68 6f 77 20 74 6f 20 64 69 73  ribes how to dis
02b0: 70 6c 61 79 20 61 20 72 61 6e 67 65 20 6f 66 20  play a range of 
02c0: 63 68 61 72 61 63 74 65 72 73 2e 0a 20 2a 20 54  characters.. * T
02d0: 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
02e0: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 73  s generated by s
02f0: 63 61 6e 6e 69 6e 67 20 61 6c 6c 20 6f 66 20 74  canning all of t
0300: 68 65 20 74 61 67 73 20 61 73 73 6f 63 69 61 74  he tags associat
0310: 65 64 0a 20 2a 20 77 69 74 68 20 74 68 65 20 63  ed. * with the c
0320: 68 61 72 61 63 74 65 72 73 20 61 6e 64 20 63 6f  haracters and co
0330: 6d 62 69 6e 69 6e 67 20 74 68 61 74 20 77 69 74  mbining that wit
0340: 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d  h default inform
0350: 61 74 69 6f 6e 20 66 6f 72 0a 20 2a 20 74 68 65  ation for. * the
0360: 20 6f 76 65 72 61 6c 6c 20 77 69 64 67 65 74 2e   overall widget.
0370: 20 20 54 68 65 73 65 20 73 74 72 75 63 74 75 72    These structur
0380: 65 73 20 66 6f 72 6d 20 74 68 65 20 68 61 73 68  es form the hash
0390: 20 6b 65 79 73 20 66 6f 72 0a 20 2a 20 64 49 6e   keys for. * dIn
03a0: 66 6f 50 74 72 2d 3e 73 74 79 6c 65 54 61 62 6c  foPtr->styleTabl
03b0: 65 2e 0a 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20  e.. */..typedef 
03c0: 73 74 72 75 63 74 20 53 74 79 6c 65 56 61 6c 75  struct StyleValu
03d0: 65 73 20 7b 0a 20 20 20 20 69 6e 74 20 6a 75 73  es {.    int jus
03e0: 74 69 66 79 3b 09 09 2f 2a 20 4a 75 73 74 69 66  tify;../* Justif
03f0: 69 63 61 74 69 6f 6e 20 73 74 79 6c 65 20 66 6f  ication style fo
0400: 72 20 74 65 78 74 2e 20 2a 2f 0a 20 20 20 20 69  r text. */.    i
0410: 6e 74 20 6c 4d 61 72 67 69 6e 31 3b 09 09 2f 2a  nt lMargin1;../*
0420: 20 4c 65 66 74 20 6d 61 72 67 69 6e 2c 20 69 6e   Left margin, in
0430: 20 70 69 78 65 6c 73 2c 20 66 6f 72 20 66 69 72   pixels, for fir
0440: 73 74 20 64 69 73 70 6c 61 79 0a 09 09 09 09 20  st display..... 
0450: 2a 20 6c 69 6e 65 20 6f 66 20 65 61 63 68 20 74  * line of each t
0460: 65 78 74 20 6c 69 6e 65 2e 20 2a 2f 0a 20 20 20  ext line. */.   
0470: 20 69 6e 74 20 6c 4d 61 72 67 69 6e 32 3b 09 09   int lMargin2;..
0480: 2f 2a 20 4c 65 66 74 20 6d 61 72 67 69 6e 2c 20  /* Left margin, 
0490: 69 6e 20 70 69 78 65 6c 73 2c 20 66 6f 72 20 73  in pixels, for s
04a0: 65 63 6f 6e 64 20 61 6e 64 0a 09 09 09 09 20 2a  econd and..... *
04b0: 20 6c 61 74 65 72 20 64 69 73 70 6c 61 79 20 6c   later display l
04c0: 69 6e 65 73 20 6f 66 20 65 61 63 68 20 74 65 78  ines of each tex
04d0: 74 20 6c 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 69  t line. */.    i
04e0: 6e 74 20 6f 66 66 73 65 74 3b 09 09 09 2f 2a 20  nt offset;.../* 
04f0: 4f 66 66 73 65 74 20 69 6e 20 70 69 78 65 6c 73  Offset in pixels
0500: 20 6f 66 20 62 61 73 65 6c 69 6e 65 2c 20 72 65   of baseline, re
0510: 6c 61 74 69 76 65 20 74 6f 0a 09 09 09 09 20 2a  lative to..... *
0520: 20 62 61 73 65 6c 69 6e 65 20 6f 66 20 6c 69 6e   baseline of lin
0530: 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 4d  e. */.    int rM
0540: 61 72 67 69 6e 3b 09 09 2f 2a 20 52 69 67 68 74  argin;../* Right
0550: 20 6d 61 72 67 69 6e 2c 20 69 6e 20 70 69 78 65   margin, in pixe
0560: 6c 73 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ls. */.    int s
0570: 70 61 63 69 6e 67 31 3b 09 09 2f 2a 20 53 70 61  pacing1;../* Spa
0580: 63 69 6e 67 20 61 62 6f 76 65 20 66 69 72 73 74  cing above first
0590: 20 64 6c 69 6e 65 20 69 6e 20 74 65 78 74 20 6c   dline in text l
05a0: 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ine. */.    int 
05b0: 73 70 61 63 69 6e 67 32 3b 09 09 2f 2a 20 53 70  spacing2;../* Sp
05c0: 61 63 69 6e 67 20 62 65 74 77 65 65 6e 20 6c 69  acing between li
05d0: 6e 65 73 20 6f 66 20 64 6c 69 6e 65 2e 20 2a 2f  nes of dline. */
05e0: 0a 20 20 20 20 69 6e 74 20 73 70 61 63 69 6e 67  .    int spacing
05f0: 33 3b 09 09 2f 2a 20 53 70 61 63 69 6e 67 20 62  3;../* Spacing b
0600: 65 6c 6f 77 20 6c 61 73 74 20 64 6c 69 6e 65 20  elow last dline 
0610: 69 6e 20 74 65 78 74 20 6c 69 6e 65 2e 20 2a 2f  in text line. */
0620: 0a 20 20 20 20 54 6b 54 65 78 74 54 61 62 41 72  .    TkTextTabAr
0630: 72 61 79 20 2a 74 61 62 41 72 72 61 79 50 74 72  ray *tabArrayPtr
0640: 3b 2f 2a 20 4c 6f 63 61 74 69 6f 6e 73 20 61 6e  ;/* Locations an
0650: 64 20 74 79 70 65 73 20 6f 66 20 74 61 62 20 73  d types of tab s
0660: 74 6f 70 73 20 28 6d 61 79 0a 09 09 09 09 20 2a  tops (may..... *
0670: 20 62 65 20 4e 55 4c 4c 29 2e 20 2a 2f 0a 20 20   be NULL). */.  
0680: 20 20 69 6e 74 20 75 6e 64 65 72 6c 69 6e 65 3b    int underline;
0690: 09 09 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 6d 65  ../* Non-zero me
06a0: 61 6e 73 20 64 72 61 77 20 75 6e 64 65 72 6c 69  ans draw underli
06b0: 6e 65 20 75 6e 64 65 72 6e 65 61 74 68 0a 09 09  ne underneath...
06c0: 09 09 20 2a 20 74 65 78 74 2e 20 2a 2f 0a 20 20  .. * text. */.  
06d0: 20 20 54 6b 5f 55 69 64 20 77 72 61 70 4d 6f 64    Tk_Uid wrapMod
06e0: 65 3b 09 09 2f 2a 20 48 6f 77 20 74 6f 20 68 61  e;../* How to ha
06f0: 6e 64 6c 65 20 77 72 61 70 2d 61 72 6f 75 6e 64  ndle wrap-around
0700: 20 66 6f 72 20 74 68 69 73 20 74 61 67 2e 0a 09   for this tag...
0710: 09 09 09 20 2a 20 4f 6e 65 20 6f 66 20 74 6b 54  ... * One of tkT
0720: 65 78 74 43 68 61 72 55 69 64 2c 20 74 6b 54 65  extCharUid, tkTe
0730: 78 74 4e 6f 6e 65 55 69 64 2c 0a 09 09 09 09 20  xtNoneUid,..... 
0740: 2a 20 6f 72 20 74 6b 54 65 78 74 57 6f 72 64 55  * or tkTextWordU
0750: 69 64 2e 20 2a 2f 0a 7d 20 53 74 79 6c 65 56 61  id. */.} StyleVa
0760: 6c 75 65 73 3b 0a 0a 2f 2a 0a 20 2a 20 54 68 65  lues;../*. * The
0770: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
0780: 74 75 72 65 20 65 78 74 65 6e 64 73 20 74 68 65  ture extends the
0790: 20 53 74 79 6c 65 56 61 6c 75 65 73 20 73 74 72   StyleValues str
07a0: 75 63 74 75 72 65 20 61 62 6f 76 65 20 77 69 74  ucture above wit
07b0: 68 0a 20 2a 20 74 68 65 20 43 54 6b 20 73 74 79  h. * the CTk sty
07c0: 6c 65 20 75 73 65 64 20 74 6f 20 61 63 74 75 61  le used to actua
07d0: 6c 6c 79 20 64 72 61 77 20 74 68 65 20 63 68 61  lly draw the cha
07e0: 72 61 63 74 65 72 73 2e 20 20 54 68 65 20 65 6e  racters.  The en
07f0: 74 72 69 65 73 0a 20 2a 20 69 6e 20 64 49 6e 66  tries. * in dInf
0800: 6f 50 74 72 2d 3e 73 74 79 6c 65 54 61 62 6c 65  oPtr->styleTable
0810: 20 70 6f 69 6e 74 20 74 6f 20 73 74 72 75 63 74   point to struct
0820: 75 72 65 73 20 6f 66 20 74 68 69 73 20 74 79 70  ures of this typ
0830: 65 2e 0a 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20  e.. */..typedef 
0840: 73 74 72 75 63 74 20 53 74 79 6c 65 20 7b 0a 20  struct Style {. 
0850: 20 20 20 69 6e 74 20 72 65 66 43 6f 75 6e 74 3b     int refCount;
0860: 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74  ../* Number of t
0870: 69 6d 65 73 20 74 68 69 73 20 73 74 72 75 63 74  imes this struct
0880: 75 72 65 20 69 73 0a 09 09 09 09 20 2a 20 72 65  ure is..... * re
0890: 66 65 72 65 6e 63 65 64 20 69 6e 20 43 68 75 6e  ferenced in Chun
08a0: 6b 73 2e 20 2a 2f 0a 20 20 20 20 43 74 6b 5f 53  ks. */.    Ctk_S
08b0: 74 79 6c 65 20 63 74 6b 53 74 79 6c 65 3b 0a 20  tyle ctkStyle;. 
08c0: 20 20 20 53 74 79 6c 65 56 61 6c 75 65 73 20 2a     StyleValues *
08d0: 73 56 61 6c 75 65 50 74 72 3b 09 2f 2a 20 52 61  sValuePtr;./* Ra
08e0: 77 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  w information fr
08f0: 6f 6d 20 77 68 69 63 68 20 47 43 73 20 77 65 72  om which GCs wer
0900: 65 0a 09 09 09 09 20 2a 20 64 65 72 69 76 65 64  e..... * derived
0910: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 48 61 73  . */.    Tcl_Has
0920: 68 45 6e 74 72 79 20 2a 68 50 74 72 3b 09 2f 2a  hEntry *hPtr;./*
0930: 20 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e 74 72   Pointer to entr
0940: 79 20 69 6e 20 73 74 79 6c 65 54 61 62 6c 65 2e  y in styleTable.
0950: 20 20 55 73 65 64 0a 09 09 09 09 20 2a 20 74 6f    Used..... * to
0960: 20 64 65 6c 65 74 65 20 65 6e 74 72 79 2e 20 2a   delete entry. *
0970: 2f 0a 7d 20 53 74 79 6c 65 3b 0a 0a 2f 2a 0a 20  /.} Style;../*. 
0980: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
0990: 73 74 72 75 63 74 75 72 65 20 64 65 73 63 72 69  structure descri
09a0: 62 65 73 20 6f 6e 65 20 6c 69 6e 65 20 6f 66 20  bes one line of 
09b0: 74 68 65 20 64 69 73 70 6c 61 79 2c 20 77 68 69  the display, whi
09c0: 63 68 20 6d 61 79 0a 20 2a 20 62 65 20 65 69 74  ch may. * be eit
09d0: 68 65 72 20 70 61 72 74 20 6f 72 20 61 6c 6c 20  her part or all 
09e0: 6f 66 20 6f 6e 65 20 6c 69 6e 65 20 6f 66 20 74  of one line of t
09f0: 68 65 20 74 65 78 74 2e 0a 20 2a 2f 0a 0a 74 79  he text.. */..ty
0a00: 70 65 64 65 66 20 73 74 72 75 63 74 20 44 4c 69  pedef struct DLi
0a10: 6e 65 20 7b 0a 20 20 20 20 54 6b 54 65 78 74 49  ne {.    TkTextI
0a20: 6e 64 65 78 20 69 6e 64 65 78 3b 09 09 2f 2a 20  ndex index;../* 
0a30: 49 64 65 6e 74 69 66 69 65 73 20 66 69 72 73 74  Identifies first
0a40: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 65   character in te
0a50: 78 74 0a 09 09 09 09 20 2a 20 74 68 61 74 20 69  xt..... * that i
0a60: 73 20 64 69 73 70 6c 61 79 65 64 20 6f 6e 20 74  s displayed on t
0a70: 68 69 73 20 6c 69 6e 65 2e 20 2a 2f 0a 20 20 20  his line. */.   
0a80: 20 69 6e 74 20 63 6f 75 6e 74 3b 09 09 09 2f 2a   int count;.../*
0a90: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
0aa0: 63 74 65 72 73 20 61 63 63 6f 75 6e 74 65 64 20  cters accounted 
0ab0: 66 6f 72 20 62 79 20 74 68 69 73 0a 09 09 09 09  for by this.....
0ac0: 20 2a 20 64 69 73 70 6c 61 79 20 6c 69 6e 65 2c   * display line,
0ad0: 20 69 6e 63 6c 75 64 69 6e 67 20 61 20 74 72 61   including a tra
0ae0: 69 6c 69 6e 67 20 73 70 61 63 65 0a 09 09 09 09  iling space.....
0af0: 20 2a 20 6f 72 20 6e 65 77 6c 69 6e 65 20 74 68   * or newline th
0b00: 61 74 20 69 73 6e 27 74 20 61 63 74 75 61 6c 6c  at isn't actuall
0b10: 79 20 64 69 73 70 6c 61 79 65 64 2e 20 2a 2f 0a  y displayed. */.
0b20: 20 20 20 20 69 6e 74 20 79 3b 09 09 09 2f 2a 20      int y;.../* 
0b30: 59 2d 70 6f 73 69 74 69 6f 6e 20 61 74 20 77 68  Y-position at wh
0b40: 69 63 68 20 6c 69 6e 65 20 69 73 20 73 75 70 70  ich line is supp
0b50: 6f 73 65 64 20 74 6f 0a 09 09 09 09 20 2a 20 62  osed to..... * b
0b60: 65 20 64 72 61 77 6e 20 28 74 6f 70 6d 6f 73 74  e drawn (topmost
0b70: 20 70 69 78 65 6c 20 6f 66 20 72 65 63 74 61 6e   pixel of rectan
0b80: 67 75 6c 61 72 0a 09 09 09 09 20 2a 20 61 72 65  gular..... * are
0b90: 61 20 6f 63 63 75 70 69 65 64 20 62 79 20 6c 69  a occupied by li
0ba0: 6e 65 29 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ne). */.    int 
0bb0: 6f 6c 64 59 3b 09 09 09 2f 2a 20 59 2d 70 6f 73  oldY;.../* Y-pos
0bc0: 69 74 69 6f 6e 20 61 74 20 77 68 69 63 68 20 6c  ition at which l
0bd0: 69 6e 65 20 63 75 72 72 65 6e 74 6c 79 0a 09 09  ine currently...
0be0: 09 09 20 2a 20 61 70 70 65 61 72 73 20 6f 6e 20  .. * appears on 
0bf0: 64 69 73 70 6c 61 79 2e 20 20 2d 31 20 6d 65 61  display.  -1 mea
0c00: 6e 73 20 6c 69 6e 65 20 69 73 6e 27 74 0a 09 09  ns line isn't...
0c10: 09 09 20 2a 20 63 75 72 72 65 6e 74 6c 79 20 76  .. * currently v
0c20: 69 73 69 62 6c 65 20 6f 6e 20 64 69 73 70 6c 61  isible on displa
0c30: 79 20 61 6e 64 20 6d 75 73 74 20 62 65 0a 09 09  y and must be...
0c40: 09 09 20 2a 20 72 65 64 72 61 77 6e 2e 20 20 54  .. * redrawn.  T
0c50: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 6d  his is used to m
0c60: 6f 76 65 20 6c 69 6e 65 73 20 62 79 0a 09 09 09  ove lines by....
0c70: 09 20 2a 20 73 63 72 6f 6c 6c 69 6e 67 20 72 61  . * scrolling ra
0c80: 74 68 65 72 20 74 68 61 6e 20 72 65 2d 64 72 61  ther than re-dra
0c90: 77 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  wing. */.    int
0ca0: 20 68 65 69 67 68 74 3b 09 09 09 2f 2a 20 48 65   height;.../* He
0cb0: 69 67 68 74 20 6f 66 20 6c 69 6e 65 2c 20 69 6e  ight of line, in
0cc0: 20 70 69 78 65 6c 73 2e 20 2a 2f 0a 20 20 20 20   pixels. */.    
0cd0: 69 6e 74 20 73 70 61 63 65 41 62 6f 76 65 3b 09  int spaceAbove;.
0ce0: 09 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65 78 74  ./* How much ext
0cf0: 72 61 20 73 70 61 63 65 20 77 61 73 20 61 64 64  ra space was add
0d00: 65 64 20 74 6f 20 74 68 65 0a 09 09 09 09 20 2a  ed to the..... *
0d10: 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 69 6e 65   top of the line
0d20: 20 62 65 63 61 75 73 65 20 6f 66 20 73 70 61 63   because of spac
0d30: 69 6e 67 0a 09 09 09 09 20 2a 20 6f 70 74 69 6f  ing..... * optio
0d40: 6e 73 2e 20 20 54 68 69 73 20 69 73 20 69 6e 63  ns.  This is inc
0d50: 6c 75 64 65 64 20 69 6e 20 68 65 69 67 68 74 0a  luded in height.
0d60: 09 09 09 09 20 2a 20 61 6e 64 20 62 61 73 65 6c  .... * and basel
0d70: 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ine. */.    int 
0d80: 73 70 61 63 65 42 65 6c 6f 77 3b 09 09 2f 2a 20  spaceBelow;../* 
0d90: 48 6f 77 20 6d 75 63 68 20 65 78 74 72 61 20 73  How much extra s
0da0: 70 61 63 65 20 77 61 73 20 61 64 64 65 64 20 74  pace was added t
0db0: 6f 20 74 68 65 0a 09 09 09 09 20 2a 20 62 6f 74  o the..... * bot
0dc0: 74 6f 6d 20 6f 66 20 74 68 65 20 6c 69 6e 65 20  tom of the line 
0dd0: 62 65 63 61 75 73 65 20 6f 66 20 73 70 61 63 69  because of spaci
0de0: 6e 67 0a 09 09 09 09 20 2a 20 6f 70 74 69 6f 6e  ng..... * option
0df0: 73 2e 20 20 54 68 69 73 20 69 73 20 69 6e 63 6c  s.  This is incl
0e00: 75 64 65 64 20 69 6e 20 68 65 69 67 68 74 2e 20  uded in height. 
0e10: 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 67 74  */.    int lengt
0e20: 68 3b 09 09 09 2f 2a 20 54 6f 74 61 6c 20 6c 65  h;.../* Total le
0e30: 6e 67 74 68 20 6f 66 20 6c 69 6e 65 2c 20 69 6e  ngth of line, in
0e40: 20 70 69 78 65 6c 73 2e 20 2a 2f 0a 20 20 20 20   pixels. */.    
0e50: 54 6b 54 65 78 74 44 69 73 70 43 68 75 6e 6b 20  TkTextDispChunk 
0e60: 2a 63 68 75 6e 6b 50 74 72 3b 09 2f 2a 20 50 6f  *chunkPtr;./* Po
0e70: 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 63  inter to first c
0e80: 68 75 6e 6b 20 69 6e 20 6c 69 73 74 20 6f 66 20  hunk in list of 
0e90: 61 6c 6c 0a 09 09 09 09 20 2a 20 6f 66 20 74 68  all..... * of th
0ea0: 6f 73 65 20 74 68 61 74 20 61 72 65 20 64 69 73  ose that are dis
0eb0: 70 6c 61 79 65 64 20 6f 6e 20 74 68 69 73 0a 09  played on this..
0ec0: 09 09 09 20 2a 20 6c 69 6e 65 20 6f 66 20 74 68  ... * line of th
0ed0: 65 20 73 63 72 65 65 6e 2e 20 2a 2f 0a 20 20 20  e screen. */.   
0ee0: 20 73 74 72 75 63 74 20 44 4c 69 6e 65 20 2a 6e   struct DLine *n
0ef0: 65 78 74 50 74 72 3b 09 2f 2a 20 4e 65 78 74 20  extPtr;./* Next 
0f00: 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 64  in list of all d
0f10: 69 73 70 6c 61 79 20 6c 69 6e 65 73 20 66 6f 72  isplay lines for
0f20: 0a 09 09 09 09 20 2a 20 74 68 69 73 20 77 69 6e  ..... * this win
0f30: 64 6f 77 2e 20 20 20 54 68 65 20 6c 69 73 74 20  dow.   The list 
0f40: 69 73 20 73 6f 72 74 65 64 20 69 6e 0a 09 09 09  is sorted in....
0f50: 09 20 2a 20 6f 72 64 65 72 20 66 72 6f 6d 20 74  . * order from t
0f60: 6f 70 20 74 6f 20 62 6f 74 74 6f 6d 2e 20 20 4e  op to bottom.  N
0f70: 6f 74 65 3a 20 20 74 68 65 0a 09 09 09 09 20 2a  ote:  the..... *
0f80: 20 6e 65 78 74 20 44 4c 69 6e 65 20 64 6f 65 73   next DLine does
0f90: 6e 27 74 20 61 6c 77 61 79 73 20 63 6f 72 72 65  n't always corre
0fa0: 73 70 6f 6e 64 0a 09 09 09 09 20 2a 20 74 6f 20  spond..... * to 
0fb0: 74 68 65 20 6e 65 78 74 20 6c 69 6e 65 20 6f 66  the next line of
0fc0: 20 74 65 78 74 3a 20 20 28 61 29 20 63 61 6e 20   text:  (a) can 
0fd0: 68 61 76 65 0a 09 09 09 09 20 2a 20 6d 75 6c 74  have..... * mult
0fe0: 69 70 6c 65 20 44 4c 69 6e 65 73 20 66 6f 72 20  iple DLines for 
0ff0: 6f 6e 65 20 74 65 78 74 20 6c 69 6e 65 2c 20 61  one text line, a
1000: 6e 64 0a 09 09 09 09 20 2a 20 28 62 29 20 63 61  nd..... * (b) ca
1010: 6e 20 68 61 76 65 20 67 61 70 73 20 77 68 65 72  n have gaps wher
1020: 65 20 44 4c 69 6e 65 27 73 20 68 61 76 65 20 62  e DLine's have b
1030: 65 65 6e 0a 09 09 09 09 20 2a 20 64 65 6c 65 74  een..... * delet
1040: 65 64 20 62 65 63 61 75 73 65 20 74 68 65 79 27  ed because they'
1050: 72 65 20 6f 75 74 20 6f 66 20 64 61 74 65 2e 20  re out of date. 
1060: 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  */.    int flags
1070: 3b 09 09 09 2f 2a 20 56 61 72 69 6f 75 73 20 66  ;.../* Various f
1080: 6c 61 67 20 62 69 74 73 3a 20 20 73 65 65 20 62  lag bits:  see b
1090: 65 6c 6f 77 20 66 6f 72 20 76 61 6c 75 65 73 2e  elow for values.
10a0: 20 2a 2f 0a 7d 20 44 4c 69 6e 65 3b 0a 0a 2f 2a   */.} DLine;../*
10b0: 0a 20 2a 20 46 6c 61 67 20 62 69 74 73 20 66 6f  . * Flag bits fo
10c0: 72 20 44 4c 69 6e 65 20 73 74 72 75 63 74 75 72  r DLine structur
10d0: 65 73 3a 0a 20 2a 0a 20 2a 20 4e 45 57 5f 4c 41  es:. *. * NEW_LA
10e0: 59 4f 55 54 20 2d 09 09 09 4e 6f 6e 2d 7a 65 72  YOUT -...Non-zer
10f0: 6f 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  o means that the
1100: 20 6c 69 6e 65 20 68 61 73 20 62 65 65 6e 0a 20   line has been. 
1110: 2a 09 09 09 09 72 65 2d 6c 61 79 65 64 20 6f 75  *....re-layed ou
1120: 74 20 73 69 6e 63 65 20 74 68 65 20 6c 61 73 74  t since the last
1130: 20 74 69 6d 65 20 74 68 65 0a 20 2a 09 09 09 09   time the. *....
1140: 64 69 73 70 6c 61 79 20 77 61 73 20 75 70 64 61  display was upda
1150: 74 65 64 2e 0a 20 2a 20 54 4f 50 5f 4c 49 4e 45  ted.. * TOP_LINE
1160: 20 2d 09 09 09 4e 6f 6e 2d 7a 65 72 6f 20 6d 65   -...Non-zero me
1170: 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 77 61  ans that this wa
1180: 73 20 74 68 65 20 74 6f 70 20 6c 69 6e 65 0a 20  s the top line. 
1190: 2a 09 09 09 09 69 6e 20 74 68 65 20 77 69 6e 64  *....in the wind
11a0: 6f 77 20 74 68 65 20 6c 61 73 74 20 74 69 6d 65  ow the last time
11b0: 20 74 68 61 74 20 74 68 65 20 77 69 6e 64 6f 77   that the window
11c0: 0a 20 2a 09 09 09 09 77 61 73 20 6c 61 69 64 20  . *....was laid 
11d0: 6f 75 74 2e 20 20 54 68 69 73 20 69 73 20 69 6d  out.  This is im
11e0: 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 0a  portant because.
11f0: 20 2a 09 09 09 09 61 20 6c 69 6e 65 20 6d 61 79   *....a line may
1200: 20 62 65 20 64 69 73 70 6c 61 79 65 64 20 64 69   be displayed di
1210: 66 66 65 72 65 6e 74 6c 79 20 69 66 20 69 74 73  fferently if its
1220: 0a 20 2a 09 09 09 09 61 74 20 74 68 65 20 74 6f  . *....at the to
1230: 70 20 6f 72 20 62 6f 74 74 6f 6d 20 74 68 61 6e  p or bottom than
1240: 20 69 66 20 69 74 27 73 20 69 6e 20 74 68 65 0a   if it's in the.
1250: 20 2a 09 09 09 09 6d 69 64 64 6c 65 20 28 65 2e   *....middle (e.
1260: 67 2e 20 62 65 76 65 6c 65 64 20 65 64 67 65 73  g. beveled edges
1270: 20 61 72 65 6e 27 74 20 64 69 73 70 6c 61 79 65   aren't displaye
1280: 64 0a 20 2a 09 09 09 09 66 6f 72 20 6d 69 64 64  d. *....for midd
1290: 6c 65 20 6c 69 6e 65 73 20 69 66 20 74 68 65 20  le lines if the 
12a0: 61 64 6a 61 63 65 6e 74 20 6c 69 6e 65 20 68 61  adjacent line ha
12b0: 73 0a 20 2a 09 09 09 09 61 20 73 69 6d 69 6c 61  s. *....a simila
12c0: 72 20 62 61 63 6b 67 72 6f 75 6e 64 29 2e 0a 20  r background).. 
12d0: 2a 20 42 4f 54 54 4f 4d 5f 4c 49 4e 45 20 2d 09  * BOTTOM_LINE -.
12e0: 09 4e 6f 6e 2d 7a 65 72 6f 20 6d 65 61 6e 73 20  .Non-zero means 
12f0: 74 68 61 74 20 74 68 69 73 20 77 61 73 20 74 68  that this was th
1300: 65 20 62 6f 74 74 6f 6d 20 6c 69 6e 65 0a 20 2a  e bottom line. *
1310: 09 09 09 09 69 6e 20 74 68 65 20 77 69 6e 64 6f  ....in the windo
1320: 77 20 74 68 65 20 6c 61 73 74 20 74 69 6d 65 20  w the last time 
1330: 74 68 61 74 20 74 68 65 20 77 69 6e 64 6f 77 0a  that the window.
1340: 20 2a 09 09 09 09 77 61 73 20 6c 61 69 64 20 6f   *....was laid o
1350: 75 74 2e 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65  ut.. */..#define
1360: 20 4e 45 57 5f 4c 41 59 4f 55 54 09 32 0a 23 64   NEW_LAYOUT.2.#d
1370: 65 66 69 6e 65 20 54 4f 50 5f 4c 49 4e 45 09 34  efine TOP_LINE.4
1380: 0a 23 64 65 66 69 6e 65 20 42 4f 54 54 4f 4d 5f  .#define BOTTOM_
1390: 4c 49 4e 45 09 38 0a 0a 2f 2a 0a 20 2a 20 4f 76  LINE.8../*. * Ov
13a0: 65 72 61 6c 6c 20 64 69 73 70 6c 61 79 20 69 6e  erall display in
13b0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
13c0: 74 65 78 74 20 77 69 64 67 65 74 3a 0a 20 2a 2f  text widget:. */
13d0: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
13e0: 20 44 49 6e 66 6f 20 7b 0a 20 20 20 20 54 63 6c   DInfo {.    Tcl
13f0: 5f 48 61 73 68 54 61 62 6c 65 20 73 74 79 6c 65  _HashTable style
1400: 54 61 62 6c 65 3b 09 2f 2a 20 48 61 73 68 20 74  Table;./* Hash t
1410: 61 62 6c 65 20 74 68 61 74 20 6d 61 70 73 20 66  able that maps f
1420: 72 6f 6d 20 53 74 79 6c 65 56 61 6c 75 65 73 0a  rom StyleValues.
1430: 09 09 09 09 20 2a 20 74 6f 20 53 74 79 6c 65 73  .... * to Styles
1440: 20 66 6f 72 20 74 68 69 73 20 77 69 64 67 65 74   for this widget
1450: 2e 20 2a 2f 0a 20 20 20 20 44 4c 69 6e 65 20 2a  . */.    DLine *
1460: 64 4c 69 6e 65 50 74 72 3b 09 09 2f 2a 20 46 69  dLinePtr;../* Fi
1470: 72 73 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 61  rst in list of a
1480: 6c 6c 20 64 69 73 70 6c 61 79 20 6c 69 6e 65 73  ll display lines
1490: 20 66 6f 72 0a 09 09 09 09 20 2a 20 74 68 69 73   for..... * this
14a0: 20 77 69 64 67 65 74 2c 20 69 6e 20 6f 72 64 65   widget, in orde
14b0: 72 20 66 72 6f 6d 20 74 6f 70 20 74 6f 20 62 6f  r from top to bo
14c0: 74 74 6f 6d 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  ttom. */.    int
14d0: 20 78 3b 09 09 09 2f 2a 20 46 69 72 73 74 20 78   x;.../* First x
14e0: 2d 63 6f 6f 72 64 69 6e 61 74 65 20 74 68 61 74  -coordinate that
14f0: 20 6d 61 79 20 62 65 20 75 73 65 64 20 66 6f 72   may be used for
1500: 0a 09 09 09 09 20 2a 20 61 63 74 75 61 6c 6c 79  ..... * actually
1510: 20 64 69 73 70 6c 61 79 69 6e 67 20 6c 69 6e 65   displaying line
1520: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 09 09   information....
1530: 09 09 20 2a 20 4c 65 61 76 65 73 20 73 70 61 63  .. * Leaves spac
1540: 65 20 66 6f 72 20 62 6f 72 64 65 72 2c 20 65 74  e for border, et
1550: 63 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 79 3b  c. */.    int y;
1560: 09 09 09 2f 2a 20 46 69 72 73 74 20 79 2d 63 6f  .../* First y-co
1570: 6f 72 64 69 6e 61 74 65 20 74 68 61 74 20 6d 61  ordinate that ma
1580: 79 20 62 65 20 75 73 65 64 20 66 6f 72 0a 09 09  y be used for...
1590: 09 09 20 2a 20 61 63 74 75 61 6c 6c 79 20 64 69  .. * actually di
15a0: 73 70 6c 61 79 69 6e 67 20 6c 69 6e 65 20 69 6e  splaying line in
15b0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 09 09 09 09 20  formation...... 
15c0: 2a 20 4c 65 61 76 65 73 20 73 70 61 63 65 20 66  * Leaves space f
15d0: 6f 72 20 62 6f 72 64 65 72 2c 20 65 74 63 2e 20  or border, etc. 
15e0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 58 3b  */.    int maxX;
15f0: 09 09 09 2f 2a 20 46 69 72 73 74 20 78 2d 63 6f  .../* First x-co
1600: 6f 72 64 69 6e 61 74 65 20 74 6f 20 72 69 67 68  ordinate to righ
1610: 74 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 09  t of available..
1620: 09 09 09 20 2a 20 73 70 61 63 65 20 66 6f 72 20  ... * space for 
1630: 64 69 73 70 6c 61 79 69 6e 67 20 6c 69 6e 65 73  displaying lines
1640: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78  . */.    int max
1650: 59 3b 09 09 09 2f 2a 20 46 69 72 73 74 20 79 2d  Y;.../* First y-
1660: 63 6f 6f 72 64 69 6e 61 74 65 20 62 65 6c 6f 77  coordinate below
1670: 20 61 76 61 69 6c 61 62 6c 65 0a 09 09 09 09 20   available..... 
1680: 2a 20 73 70 61 63 65 20 66 6f 72 20 64 69 73 70  * space for disp
1690: 6c 61 79 69 6e 67 20 6c 69 6e 65 73 2e 20 2a 2f  laying lines. */
16a0: 0a 20 20 20 20 69 6e 74 20 74 6f 70 4f 66 45 6f  .    int topOfEo
16b0: 66 3b 09 09 2f 2a 20 54 6f 70 2d 6d 6f 73 74 20  f;../* Top-most 
16c0: 70 69 78 65 6c 20 28 6c 6f 77 65 73 74 20 79 2d  pixel (lowest y-
16d0: 76 61 6c 75 65 29 20 74 68 61 74 20 68 61 73 0a  value) that has.
16e0: 09 09 09 09 20 2a 20 62 65 65 6e 20 64 72 61 77  .... * been draw
16f0: 6e 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  n in the appropr
1700: 69 61 74 65 20 66 61 73 68 69 6f 6e 20 66 6f 72  iate fashion for
1710: 0a 09 09 09 09 20 2a 20 74 68 65 20 70 6f 72 74  ..... * the port
1720: 69 6f 6e 20 6f 66 20 74 68 65 20 77 69 6e 64 6f  ion of the windo
1730: 77 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  w after the last
1740: 0a 09 09 09 09 20 2a 20 6c 69 6e 65 20 6f 66 20  ..... * line of 
1750: 74 68 65 20 74 65 78 74 2e 20 20 54 68 69 73 20  the text.  This 
1760: 66 69 65 6c 64 20 69 73 20 75 73 65 64 20 74 6f  field is used to
1770: 0a 09 09 09 09 20 2a 20 66 69 67 75 72 65 20 6f  ..... * figure o
1780: 75 74 20 77 68 65 6e 20 74 6f 20 72 65 64 72 61  ut when to redra
1790: 77 20 70 61 72 74 20 6f 72 20 61 6c 6c 20 6f 66  w part or all of
17a0: 0a 09 09 09 09 20 2a 20 74 68 65 20 65 6f 66 20  ..... * the eof 
17b0: 66 69 65 6c 64 2e 20 2a 2f 0a 0a 20 20 20 20 2f  field. */..    /
17c0: 2a 0a 20 20 20 20 20 2a 20 49 6e 66 6f 72 6d 61  *.     * Informa
17d0: 74 69 6f 6e 20 75 73 65 64 20 66 6f 72 20 73 63  tion used for sc
17e0: 72 6f 6c 6c 69 6e 67 3a 0a 20 20 20 20 20 2a 2f  rolling:.     */
17f0: 0a 0a 20 20 20 20 69 6e 74 20 6e 65 77 43 68 61  ..    int newCha
1800: 72 4f 66 66 73 65 74 3b 09 09 2f 2a 20 44 65 73  rOffset;../* Des
1810: 69 72 65 64 20 78 20 73 63 72 6f 6c 6c 20 70 6f  ired x scroll po
1820: 73 69 74 69 6f 6e 2c 20 6d 65 61 73 75 72 65 64  sition, measured
1830: 20 61 73 20 74 68 65 0a 09 09 09 09 20 2a 20 6e   as the..... * n
1840: 75 6d 62 65 72 20 6f 66 20 61 76 65 72 61 67 65  umber of average
1850: 2d 73 69 7a 65 20 63 68 61 72 61 63 74 65 72 73  -size characters
1860: 20 6f 66 66 2d 73 63 72 65 65 6e 0a 09 09 09 09   off-screen.....
1870: 20 2a 20 74 6f 20 74 68 65 20 6c 65 66 74 20 66   * to the left f
1880: 6f 72 20 61 20 6c 69 6e 65 20 77 69 74 68 20 6e  or a line with n
1890: 6f 20 6c 65 66 74 0a 09 09 09 09 20 2a 20 6d 61  o left..... * ma
18a0: 72 67 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  rgin. */.    int
18b0: 20 63 75 72 50 69 78 65 6c 4f 66 66 73 65 74 3b   curPixelOffset;
18c0: 09 09 2f 2a 20 41 63 74 75 61 6c 20 78 20 73 63  ../* Actual x sc
18d0: 72 6f 6c 6c 20 70 6f 73 69 74 69 6f 6e 2c 20 6d  roll position, m
18e0: 65 61 73 75 72 65 64 20 61 73 20 74 68 65 0a 09  easured as the..
18f0: 09 09 09 20 2a 20 6e 75 6d 62 65 72 20 6f 66 20  ... * number of 
1900: 70 69 78 65 6c 73 20 6f 66 66 2d 73 63 72 65 65  pixels off-scree
1910: 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2e 20 2a  n to the left. *
1920: 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 65 6e  /.    int maxLen
1930: 67 74 68 3b 09 09 2f 2a 20 4c 65 6e 67 74 68 20  gth;../* Length 
1940: 69 6e 20 70 69 78 65 6c 73 20 6f 66 20 6c 6f 6e  in pixels of lon
1950: 67 65 73 74 20 6c 69 6e 65 20 74 68 61 74 27 73  gest line that's
1960: 0a 09 09 09 09 20 2a 20 76 69 73 69 62 6c 65 20  ..... * visible 
1970: 69 6e 20 77 69 6e 64 6f 77 20 28 6c 65 6e 67 74  in window (lengt
1980: 68 20 6d 61 79 20 65 78 63 65 65 64 20 77 69 6e  h may exceed win
1990: 64 6f 77 0a 09 09 09 09 20 2a 20 73 69 7a 65 29  dow..... * size)
19a0: 2e 20 20 49 66 20 74 68 65 72 65 27 73 20 6e 6f  .  If there's no
19b0: 20 77 72 61 70 70 69 6e 67 2c 20 74 68 69 73 20   wrapping, this 
19c0: 77 69 6c 6c 0a 09 09 09 09 20 2a 20 62 65 20 7a  will..... * be z
19d0: 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 64 6f 75 62  ero. */.    doub
19e0: 6c 65 20 78 53 63 72 6f 6c 6c 46 69 72 73 74 2c  le xScrollFirst,
19f0: 20 78 53 63 72 6f 6c 6c 4c 61 73 74 3b 0a 09 09   xScrollLast;...
1a00: 09 09 2f 2a 20 4d 6f 73 74 20 72 65 63 65 6e 74  ../* Most recent
1a10: 20 76 61 6c 75 65 73 20 72 65 70 6f 72 74 65 64   values reported
1a20: 20 74 6f 20 68 6f 72 69 7a 6f 6e 74 61 6c 0a 09   to horizontal..
1a30: 09 09 09 20 2a 20 73 63 72 6f 6c 6c 62 61 72 3b  ... * scrollbar;
1a40: 20 20 75 73 65 64 20 74 6f 20 65 6c 69 6d 69 6e    used to elimin
1a50: 61 74 65 20 75 6e 6e 65 63 65 73 73 61 72 79 0a  ate unnecessary.
1a60: 09 09 09 09 20 2a 20 72 65 70 6f 72 74 73 2e 20  .... * reports. 
1a70: 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 79 53  */.    double yS
1a80: 63 72 6f 6c 6c 46 69 72 73 74 2c 20 79 53 63 72  crollFirst, yScr
1a90: 6f 6c 6c 4c 61 73 74 3b 0a 09 09 09 09 2f 2a 20  ollLast;...../* 
1aa0: 4d 6f 73 74 20 72 65 63 65 6e 74 20 76 61 6c 75  Most recent valu
1ab0: 65 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 76  es reported to v
1ac0: 65 72 74 69 63 61 6c 0a 09 09 09 09 20 2a 20 73  ertical..... * s
1ad0: 63 72 6f 6c 6c 62 61 72 3b 20 20 75 73 65 64 20  crollbar;  used 
1ae0: 74 6f 20 65 6c 69 6d 69 6e 61 74 65 20 75 6e 6e  to eliminate unn
1af0: 65 63 65 73 73 61 72 79 0a 09 09 09 09 20 2a 20  ecessary..... * 
1b00: 72 65 70 6f 72 74 73 2e 20 2a 2f 0a 0a 20 20 20  reports. */..   
1b10: 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 69 73 63 65   /*.     * Misce
1b20: 6c 6c 61 6e 65 6f 75 73 20 69 6e 66 6f 72 6d 61  llaneous informa
1b30: 74 69 6f 6e 3a 0a 20 20 20 20 20 2a 2f 0a 0a 20  tion:.     */.. 
1b40: 20 20 20 69 6e 74 20 64 4c 69 6e 65 73 49 6e 76     int dLinesInv
1b50: 61 6c 69 64 61 74 65 64 3b 09 2f 2a 20 54 68 69  alidated;./* Thi
1b60: 73 20 76 61 6c 75 65 20 69 73 20 73 65 74 20 74  s value is set t
1b70: 6f 20 31 20 77 68 65 6e 65 76 65 72 20 73 6f 6d  o 1 whenever som
1b80: 65 74 68 69 6e 67 0a 09 09 09 09 20 2a 20 68 61  ething..... * ha
1b90: 70 70 65 6e 73 20 74 68 61 74 20 69 6e 76 61 6c  ppens that inval
1ba0: 69 64 61 74 65 73 20 69 6e 66 6f 72 6d 61 74 69  idates informati
1bb0: 6f 6e 20 69 6e 0a 09 09 09 09 20 2a 20 44 4c 69  on in..... * DLi
1bc0: 6e 65 20 73 74 72 75 63 74 75 72 65 73 3b 20 20  ne structures;  
1bd0: 69 66 20 61 20 72 65 64 69 73 70 6c 61 79 0a 09  if a redisplay..
1be0: 09 09 09 20 2a 20 69 73 20 69 6e 20 70 72 6f 67  ... * is in prog
1bf0: 72 65 73 73 2c 20 69 74 20 77 69 6c 6c 20 73 65  ress, it will se
1c00: 65 20 74 68 69 73 20 61 6e 64 0a 09 09 09 09 20  e this and..... 
1c10: 2a 20 61 62 6f 72 74 20 74 68 65 20 72 65 64 69  * abort the redi
1c20: 73 70 6c 61 79 2e 20 20 54 68 69 73 20 69 73 20  splay.  This is 
1c30: 6e 65 65 64 65 64 0a 09 09 09 09 20 2a 20 62 65  needed..... * be
1c40: 63 61 75 73 65 2c 20 66 6f 72 20 65 78 61 6d 70  cause, for examp
1c50: 6c 65 2c 20 61 6e 20 65 6d 62 65 64 64 65 64 20  le, an embedded 
1c60: 77 69 6e 64 6f 77 0a 09 09 09 09 20 2a 20 63 6f  window..... * co
1c70: 75 6c 64 20 63 68 61 6e 67 65 20 69 74 73 20 73  uld change its s
1c80: 69 7a 65 20 77 68 65 6e 20 69 74 20 69 73 20 66  ize when it is f
1c90: 69 72 73 74 0a 09 09 09 09 20 2a 20 64 69 73 70  irst..... * disp
1ca0: 6c 61 79 65 64 2c 20 69 6e 76 61 6c 69 64 61 74  layed, invalidat
1cb0: 69 6e 67 20 74 68 65 20 44 4c 69 6e 65 20 74 68  ing the DLine th
1cc0: 61 74 0a 09 09 09 09 20 2a 20 69 73 20 63 75 72  at..... * is cur
1cd0: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 64 69 73  rently being dis
1ce0: 70 6c 61 79 65 64 2e 20 20 49 66 20 72 65 64 69  played.  If redi
1cf0: 73 70 6c 61 79 0a 09 09 09 09 20 2a 20 63 6f 6e  splay..... * con
1d00: 74 69 6e 75 65 73 2c 20 69 74 20 77 69 6c 6c 20  tinues, it will 
1d10: 75 73 65 20 66 72 65 65 64 20 6d 65 6d 6f 72 79  use freed memory
1d20: 20 61 6e 64 0a 09 09 09 09 20 2a 20 63 6f 75 6c   and..... * coul
1d30: 64 20 64 75 6d 70 20 63 6f 72 65 2e 20 2a 2f 0a  d dump core. */.
1d40: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 09 09      int flags;..
1d50: 09 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67  ./* Various flag
1d60: 20 76 61 6c 75 65 73 3a 20 20 73 65 65 20 62 65   values:  see be
1d70: 6c 6f 77 20 66 6f 72 0a 09 09 09 09 20 2a 20 64  low for..... * d
1d80: 65 66 69 6e 69 74 69 6f 6e 73 2e 20 2a 2f 0a 7d  efinitions. */.}
1d90: 20 44 49 6e 66 6f 3b 0a 0a 2f 2a 0a 20 2a 20 49   DInfo;../*. * I
1da0: 6e 20 54 6b 54 65 78 74 44 69 73 70 43 68 75 6e  n TkTextDispChun
1db0: 6b 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  k structures for
1dc0: 20 63 68 61 72 61 63 74 65 72 20 73 65 67 6d 65   character segme
1dd0: 6e 74 73 2c 20 74 68 65 20 63 6c 69 65 6e 74 44  nts, the clientD
1de0: 61 74 61 0a 20 2a 20 66 69 65 6c 64 20 70 6f 69  ata. * field poi
1df0: 6e 74 73 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68  nts to one of th
1e00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
1e10: 63 74 75 72 65 73 3a 0a 20 2a 2f 0a 0a 74 79 70  ctures:. */..typ
1e20: 65 64 65 66 20 73 74 72 75 63 74 20 43 68 61 72  edef struct Char
1e30: 49 6e 66 6f 20 7b 0a 20 20 20 20 69 6e 74 20 6e  Info {.    int n
1e40: 75 6d 43 68 61 72 73 3b 09 09 2f 2a 20 4e 75 6d  umChars;../* Num
1e50: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
1e60: 73 20 74 6f 20 64 69 73 70 6c 61 79 2e 20 2a 2f  s to display. */
1e70: 0a 20 20 20 20 63 68 61 72 20 63 68 61 72 73 5b  .    char chars[
1e80: 34 5d 3b 09 09 2f 2a 20 43 68 61 72 61 63 74 65  4];../* Characte
1e90: 72 73 20 74 6f 20 64 69 73 70 6c 61 79 2e 20 20  rs to display.  
1ea0: 41 63 74 75 61 6c 20 73 69 7a 65 0a 09 09 09 09  Actual size.....
1eb0: 20 2a 20 77 69 6c 6c 20 62 65 20 6e 75 6d 43 68   * will be numCh
1ec0: 61 72 73 2c 20 6e 6f 74 20 34 2e 20 20 54 48 49  ars, not 4.  THI
1ed0: 53 20 4d 55 53 54 20 42 45 0a 09 09 09 09 20 2a  S MUST BE..... *
1ee0: 20 54 48 45 20 4c 41 53 54 20 46 49 45 4c 44 20   THE LAST FIELD 
1ef0: 49 4e 20 54 48 45 20 53 54 52 55 43 54 55 52 45  IN THE STRUCTURE
1f00: 2e 20 2a 2f 0a 7d 20 43 68 61 72 49 6e 66 6f 3b  . */.} CharInfo;
1f10: 0a 0a 2f 2a 0a 20 2a 20 46 6c 61 67 20 76 61 6c  ../*. * Flag val
1f20: 75 65 73 20 66 6f 72 20 44 49 6e 66 6f 20 73 74  ues for DInfo st
1f30: 72 75 63 74 75 72 65 73 3a 0a 20 2a 0a 20 2a 20  ructures:. *. * 
1f40: 44 49 4e 46 4f 5f 4f 55 54 5f 4f 46 5f 44 41 54  DINFO_OUT_OF_DAT
1f50: 45 3a 09 09 4e 6f 6e 2d 7a 65 72 6f 20 6d 65 61  E:..Non-zero mea
1f60: 6e 73 20 74 68 61 74 20 74 68 65 20 44 4c 69 6e  ns that the DLin
1f70: 65 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 09  e structures. *.
1f80: 09 09 09 66 6f 72 20 74 68 69 73 20 77 69 6e 64  ...for this wind
1f90: 6f 77 20 61 72 65 20 70 61 72 74 69 61 6c 6c 79  ow are partially
1fa0: 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20   or completely. 
1fb0: 2a 09 09 09 09 6f 75 74 20 6f 66 20 64 61 74 65  *....out of date
1fc0: 20 61 6e 64 20 6e 65 65 64 20 74 6f 20 62 65 20   and need to be 
1fd0: 72 65 63 6f 6d 70 75 74 65 64 2e 0a 20 2a 20 52  recomputed.. * R
1fe0: 45 44 52 41 57 5f 50 45 4e 44 49 4e 47 3a 09 09  EDRAW_PENDING:..
1ff0: 4d 65 61 6e 73 20 74 68 61 74 20 61 20 77 68 65  Means that a whe
2000: 6e 2d 69 64 6c 65 20 68 61 6e 64 6c 65 72 20 68  n-idle handler h
2010: 61 73 20 62 65 65 6e 0a 20 2a 09 09 09 09 73 63  as been. *....sc
2020: 68 65 64 75 6c 65 64 20 74 6f 20 75 70 64 61 74  heduled to updat
2030: 65 20 74 68 65 20 64 69 73 70 6c 61 79 2e 0a 20  e the display.. 
2040: 2a 20 52 45 44 52 41 57 5f 42 4f 52 44 45 52 53  * REDRAW_BORDERS
2050: 3a 09 09 4d 65 61 6e 73 20 77 69 6e 64 6f 77 20  :..Means window 
2060: 62 6f 72 64 65 72 20 6f 72 20 70 61 64 20 61 72  border or pad ar
2070: 65 61 20 68 61 73 0a 20 2a 09 09 09 09 70 6f 74  ea has. *....pot
2080: 65 6e 74 69 61 6c 6c 79 20 62 65 65 6e 20 64 61  entially been da
2090: 6d 61 67 65 64 20 61 6e 64 20 6d 75 73 74 20 62  maged and must b
20a0: 65 20 72 65 64 72 61 77 6e 2e 0a 20 2a 2f 0a 0a  e redrawn.. */..
20b0: 23 64 65 66 69 6e 65 20 44 49 4e 46 4f 5f 4f 55  #define DINFO_OU
20c0: 54 5f 4f 46 5f 44 41 54 45 09 31 0a 23 64 65 66  T_OF_DATE.1.#def
20d0: 69 6e 65 20 52 45 44 52 41 57 5f 50 45 4e 44 49  ine REDRAW_PENDI
20e0: 4e 47 09 09 32 0a 23 64 65 66 69 6e 65 20 52 45  NG..2.#define RE
20f0: 44 52 41 57 5f 42 4f 52 44 45 52 53 09 09 34 0a  DRAW_BORDERS..4.
2100: 0a 2f 2a 0a 20 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*. * The follo
2110: 77 69 6e 67 20 63 6f 75 6e 74 65 72 73 20 6b 65  wing counters ke
2120: 65 70 20 73 74 61 74 69 73 74 69 63 73 20 61 62  ep statistics ab
2130: 6f 75 74 20 72 65 64 69 73 70 6c 61 79 20 74 68  out redisplay th
2140: 61 74 20 63 61 6e 20 62 65 0a 20 2a 20 63 68 65  at can be. * che
2150: 63 6b 65 64 20 74 6f 20 73 65 65 20 68 6f 77 20  cked to see how 
2160: 63 6c 65 76 65 72 20 74 68 69 73 20 63 6f 64 65  clever this code
2170: 20 69 73 20 61 74 20 72 65 64 75 63 69 6e 67 20   is at reducing 
2180: 72 65 64 69 73 70 6c 61 79 73 2e 0a 20 2a 2f 0a  redisplays.. */.
2190: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 75 6d 52  .static int numR
21a0: 65 64 69 73 70 6c 61 79 73 3b 09 2f 2a 20 4e 75  edisplays;./* Nu
21b0: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
21c0: 20 44 69 73 70 6c 61 79 54 65 78 74 2e 20 2a 2f   DisplayText. */
21d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 65  .static int line
21e0: 73 52 65 64 72 61 77 6e 3b 09 2f 2a 20 4e 75 6d  sRedrawn;./* Num
21f0: 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20  ber of calls to 
2200: 44 69 73 70 6c 61 79 44 4c 69 6e 65 2e 20 2a 2f  DisplayDLine. */
2210: 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 20  ../*. * Forward 
2220: 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f 72  declarations for
2230: 20 70 72 6f 63 65 64 75 72 65 73 20 64 65 66 69   procedures defi
2240: 6e 65 64 20 6c 61 74 65 72 20 69 6e 20 74 68 69  ned later in thi
2250: 73 20 66 69 6c 65 3a 0a 20 2a 2f 0a 0a 73 74 61  s file:. */..sta
2260: 74 69 63 20 76 6f 69 64 09 09 41 64 6a 75 73 74  tic void..Adjust
2270: 46 6f 72 54 61 62 20 5f 41 4e 53 49 5f 41 52 47  ForTab _ANSI_ARG
2280: 53 5f 28 28 54 6b 54 65 78 74 20 2a 74 65 78 74  S_((TkText *text
2290: 50 74 72 2c 0a 09 09 09 20 20 20 20 54 6b 54 65  Ptr,....    TkTe
22a0: 78 74 54 61 62 41 72 72 61 79 20 2a 74 61 62 41  xtTabArray *tabA
22b0: 72 72 61 79 50 74 72 2c 20 69 6e 74 20 69 6e 64  rrayPtr, int ind
22c0: 65 78 2c 0a 09 09 09 20 20 20 20 54 6b 54 65 78  ex,....    TkTex
22d0: 74 44 69 73 70 43 68 75 6e 6b 20 2a 63 68 75 6e  tDispChunk *chun
22e0: 6b 50 74 72 29 29 3b 0a 73 74 61 74 69 63 20 76  kPtr));.static v
22f0: 6f 69 64 09 09 43 68 61 72 42 62 6f 78 50 72 6f  oid..CharBboxPro
2300: 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 54  c _ANSI_ARGS_((T
2310: 6b 54 65 78 74 44 69 73 70 43 68 75 6e 6b 20 2a  kTextDispChunk *
2320: 63 68 75 6e 6b 50 74 72 2c 0a 09 09 09 20 20 20  chunkPtr,....   
2330: 20 69 6e 74 20 69 6e 64 65 78 2c 20 69 6e 74 20   int index, int 
2340: 79 2c 0a 09 09 09 20 20 20 20 69 6e 74 20 2a 78  y,....    int *x
2350: 50 74 72 2c 20 69 6e 74 20 2a 79 50 74 72 2c 20  Ptr, int *yPtr, 
2360: 69 6e 74 20 2a 77 69 64 74 68 50 74 72 2c 0a 09  int *widthPtr,..
2370: 09 09 20 20 20 20 69 6e 74 20 2a 68 65 69 67 68  ..    int *heigh
2380: 74 50 74 72 29 29 3b 0a 73 74 61 74 69 63 20 76  tPtr));.static v
2390: 6f 69 64 09 09 43 68 61 72 44 69 73 70 6c 61 79  oid..CharDisplay
23a0: 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f  Proc _ANSI_ARGS_
23b0: 28 28 54 6b 54 65 78 74 44 69 73 70 43 68 75 6e  ((TkTextDispChun
23c0: 6b 20 2a 63 68 75 6e 6b 50 74 72 2c 0a 09 09 09  k *chunkPtr,....
23d0: 20 20 20 20 69 6e 74 20 78 2c 20 69 6e 74 20 79      int x, int y
23e0: 2c 20 54 6b 5f 57 69 6e 64 6f 77 20 77 69 6e 29  , Tk_Window win)
23f0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 43  );.static int..C
2400: 68 61 72 4d 65 61 73 75 72 65 50 72 6f 63 20 5f  harMeasureProc _
2410: 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 6b 54 65  ANSI_ARGS_((TkTe
2420: 78 74 44 69 73 70 43 68 75 6e 6b 20 2a 63 68 75  xtDispChunk *chu
2430: 6e 6b 50 74 72 2c 0a 09 09 09 20 20 20 20 69 6e  nkPtr,....    in
2440: 74 20 78 29 29 3b 0a 73 74 61 74 69 63 20 76 6f  t x));.static vo
2450: 69 64 09 09 43 68 61 72 55 6e 64 69 73 70 6c 61  id..CharUndispla
2460: 79 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53  yProc _ANSI_ARGS
2470: 5f 28 28 54 6b 54 65 78 74 20 2a 74 65 78 74 50  _((TkText *textP
2480: 74 72 2c 0a 09 09 09 20 20 20 20 54 6b 54 65 78  tr,....    TkTex
2490: 74 44 69 73 70 43 68 75 6e 6b 20 2a 63 68 75 6e  tDispChunk *chun
24a0: 6b 50 74 72 29 29 3b 0a 73 74 61 74 69 63 20 76  kPtr));.static v
24b0: 6f 69 64 09 09 44 69 73 70 6c 61 79 44 4c 69 6e  oid..DisplayDLin
24c0: 65 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 54  e _ANSI_ARGS_((T
24d0: 6b 54 65 78 74 20 2a 74 65 78 74 50 74 72 2c 0a  kText *textPtr,.
24e0: 09 09 09 20 20 20 20 44 4c 69 6e 65 20 2a 64 6c  ...    DLine *dl
24f0: 50 74 72 2c 20 44 4c 69 6e 65 20 2a 70 72 65 76  Ptr, DLine *prev
2500: 50 74 72 29 29 3b 0a 73 74 61 74 69 63 20 76 6f  Ptr));.static vo
2510: 69 64 09 09 44 69 73 70 6c 61 79 54 65 78 74 20  id..DisplayText 
2520: 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 43 6c 69  _ANSI_ARGS_((Cli
2530: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
2540: 74 61 29 29 3b 0a 73 74 61 74 69 63 20 44 4c 69  ta));.static DLi
2550: 6e 65 20 2a 09 09 46 69 6e 64 44 4c 69 6e 65 20  ne *..FindDLine 
2560: 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 44 4c 69  _ANSI_ARGS_((DLi
2570: 6e 65 20 2a 64 6c 50 74 72 2c 0a 09 09 09 20 20  ne *dlPtr,....  
2580: 20 20 54 6b 54 65 78 74 49 6e 64 65 78 20 2a 69    TkTextIndex *i
2590: 6e 64 65 78 50 74 72 29 29 3b 0a 73 74 61 74 69  ndexPtr));.stati
25a0: 63 20 76 6f 69 64 09 09 46 72 65 65 44 4c 69 6e  c void..FreeDLin
25b0: 65 73 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28  es _ANSI_ARGS_((
25c0: 54 6b 54 65 78 74 20 2a 74 65 78 74 50 74 72 2c  TkText *textPtr,
25d0: 0a 09 09 09 20 20 20 20 44 4c 69 6e 65 20 2a 66  ....    DLine *f
25e0: 69 72 73 74 50 74 72 2c 20 44 4c 69 6e 65 20 2a  irstPtr, DLine *
25f0: 6c 61 73 74 50 74 72 2c 20 69 6e 74 20 75 6e 6c  lastPtr, int unl
2600: 69 6e 6b 29 29 3b 0a 73 74 61 74 69 63 20 76 6f  ink));.static vo
2610: 69 64 09 09 46 72 65 65 53 74 79 6c 65 20 5f 41  id..FreeStyle _A
2620: 4e 53 49 5f 41 52 47 53 5f 28 28 54 6b 54 65 78  NSI_ARGS_((TkTex
2630: 74 20 2a 74 65 78 74 50 74 72 2c 0a 09 09 09 20  t *textPtr,.... 
2640: 20 20 20 53 74 79 6c 65 20 2a 73 74 79 6c 65 50     Style *styleP
2650: 74 72 29 29 3b 0a 73 74 61 74 69 63 20 53 74 79  tr));.static Sty
2660: 6c 65 20 2a 09 09 47 65 74 53 74 79 6c 65 20 5f  le *..GetStyle _
2670: 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 6b 54 65  ANSI_ARGS_((TkTe
2680: 78 74 20 2a 74 65 78 74 50 74 72 2c 0a 09 09 09  xt *textPtr,....
2690: 20 20 20 20 54 6b 54 65 78 74 49 6e 64 65 78 20      TkTextIndex 
26a0: 2a 69 6e 64 65 78 50 74 72 29 29 3b 0a 73 74 61  *indexPtr));.sta
26b0: 74 69 63 20 76 6f 69 64 09 09 47 65 74 58 56 69  tic void..GetXVi
26c0: 65 77 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28  ew _ANSI_ARGS_((
26d0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
26e0: 72 70 2c 0a 09 09 09 20 20 20 20 54 6b 54 65 78  rp,....    TkTex
26f0: 74 20 2a 74 65 78 74 50 74 72 2c 20 69 6e 74 20  t *textPtr, int 
2700: 72 65 70 6f 72 74 29 29 3b 0a 73 74 61 74 69 63  report));.static
2710: 20 76 6f 69 64 09 09 47 65 74 59 56 69 65 77 20   void..GetYView 
2720: 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 63 6c  _ANSI_ARGS_((Tcl
2730: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2740: 0a 09 09 09 20 20 20 20 54 6b 54 65 78 74 20 2a  ....    TkText *
2750: 74 65 78 74 50 74 72 2c 20 69 6e 74 20 72 65 70  textPtr, int rep
2760: 6f 72 74 29 29 3b 0a 73 74 61 74 69 63 20 44 4c  ort));.static DL
2770: 69 6e 65 20 2a 09 09 4c 61 79 6f 75 74 44 4c 69  ine *..LayoutDLi
2780: 6e 65 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28  ne _ANSI_ARGS_((
2790: 54 6b 54 65 78 74 20 2a 74 65 78 74 50 74 72 2c  TkText *textPtr,
27a0: 0a 09 09 09 20 20 20 20 54 6b 54 65 78 74 49 6e  ....    TkTextIn
27b0: 64 65 78 20 2a 69 6e 64 65 78 50 74 72 29 29 3b  dex *indexPtr));
27c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 09 09 4d 65  .static void..Me
27d0: 61 73 75 72 65 55 70 20 5f 41 4e 53 49 5f 41 52  asureUp _ANSI_AR
27e0: 47 53 5f 28 28 54 6b 54 65 78 74 20 2a 74 65 78  GS_((TkText *tex
27f0: 74 50 74 72 2c 0a 09 09 09 20 20 20 20 54 6b 54  tPtr,....    TkT
2800: 65 78 74 49 6e 64 65 78 20 2a 73 72 63 50 74 72  extIndex *srcPtr
2810: 2c 20 69 6e 74 20 64 69 73 74 61 6e 63 65 2c 0a  , int distance,.
2820: 09 09 09 20 20 20 20 54 6b 54 65 78 74 49 6e 64  ...    TkTextInd
2830: 65 78 20 2a 64 73 74 50 74 72 29 29 3b 0a 73 74  ex *dstPtr));.st
2840: 61 74 69 63 20 76 6f 69 64 09 09 55 70 64 61 74  atic void..Updat
2850: 65 44 69 73 70 6c 61 79 49 6e 66 6f 20 5f 41 4e  eDisplayInfo _AN
2860: 53 49 5f 41 52 47 53 5f 28 28 54 6b 54 65 78 74  SI_ARGS_((TkText
2870: 20 2a 74 65 78 74 50 74 72 29 29 3b 0a 73 74 61   *textPtr));.sta
2880: 74 69 63 20 76 6f 69 64 09 09 53 63 72 6f 6c 6c  tic void..Scroll
2890: 42 79 4c 69 6e 65 73 20 5f 41 4e 53 49 5f 41 52  ByLines _ANSI_AR
28a0: 47 53 5f 28 28 54 6b 54 65 78 74 20 2a 74 65 78  GS_((TkText *tex
28b0: 74 50 74 72 2c 0a 09 09 09 20 20 20 20 69 6e 74  tPtr,....    int
28c0: 20 6f 66 66 73 65 74 29 29 3b 0a 73 74 61 74 69   offset));.stati
28d0: 63 20 69 6e 74 09 09 53 69 7a 65 4f 66 54 61 62  c int..SizeOfTab
28e0: 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 6b   _ANSI_ARGS_((Tk
28f0: 54 65 78 74 20 2a 74 65 78 74 50 74 72 2c 0a 09  Text *textPtr,..
2900: 09 09 20 20 20 20 54 6b 54 65 78 74 54 61 62 41  ..    TkTextTabA
2910: 72 72 61 79 20 2a 74 61 62 41 72 72 61 79 50 74  rray *tabArrayPt
2920: 72 2c 20 69 6e 74 20 69 6e 64 65 78 2c 20 69 6e  r, int index, in
2930: 74 20 78 2c 0a 09 09 09 20 20 20 20 69 6e 74 20  t x,....    int 
2940: 6d 61 78 58 29 29 3b 0a 0c 0a 2f 2a 0a 20 2a 2d  maxX));.../*. *-
2950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2990: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6b 54 65  -----. *. * TkTe
29a0: 78 74 43 72 65 61 74 65 44 49 6e 66 6f 20 2d 2d  xtCreateDInfo --
29b0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
29c0: 65 64 75 72 65 20 69 73 20 63 61 6c 6c 65 64 20  edure is called 
29d0: 77 68 65 6e 20 61 20 6e 65 77 20 74 65 78 74 20  when a new text 
29e0: 77 69 64 67 65 74 20 69 73 20 63 72 65 61 74 65  widget is create
29f0: 64 2e 0a 20 2a 09 49 74 73 20 6a 6f 62 20 69 73  d.. *.Its job is
2a00: 20 74 6f 20 73 65 74 20 75 70 20 64 69 73 70 6c   to set up displ
2a10: 61 79 2d 72 65 6c 61 74 65 64 20 69 6e 66 6f 72  ay-related infor
2a20: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 77  mation for the w
2a30: 69 64 67 65 74 2e 0a 20 2a 0a 20 2a 20 52 65 73  idget.. *. * Res
2a40: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ults:. *.None.. 
2a50: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
2a60: 73 3a 0a 20 2a 09 41 20 44 49 6e 66 6f 20 64 61  s:. *.A DInfo da
2a70: 74 61 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ta structure is 
2a80: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 6e  allocated and in
2a90: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 61 74  itialized and at
2aa0: 74 61 63 68 65 64 0a 20 2a 09 74 6f 20 74 65 78  tached. *.to tex
2ab0: 74 50 74 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  tPtr.. *. *-----
2ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b00: 2d 0a 20 2a 2f 0a 0a 76 6f 69 64 0a 54 6b 54 65  -. */..void.TkTe
2b10: 78 74 43 72 65 61 74 65 44 49 6e 66 6f 28 74 65  xtCreateDInfo(te
2b20: 78 74 50 74 72 29 0a 20 20 20 20 54 6b 54 65 78  xtPtr).    TkTex
2b30: 74 20 2a 74 65 78 74 50 74 72 3b 09 09 2f 2a 20  t *textPtr;../* 
2b40: 4f 76 65 72 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  Overall informat
2b50: 69 6f 6e 20 66 6f 72 20 74 65 78 74 20 77 69 64  ion for text wid
2b60: 67 65 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 72 65  get. */.{.    re
2b70: 67 69 73 74 65 72 20 44 49 6e 66 6f 20 2a 64 49  gister DInfo *dI
2b80: 6e 66 6f 50 74 72 3b 0a 0a 20 20 20 20 64 49 6e  nfoPtr;..    dIn
2b90: 66 6f 50 74 72 20 3d 20 28 44 49 6e 66 6f 20 2a  foPtr = (DInfo *
2ba0: 29 20 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  ) ckalloc(sizeof
2bb0: 28 44 49 6e 66 6f 29 29 3b 0a 20 20 20 20 54 63  (DInfo));.    Tc
2bc0: 6c 5f 49 6e 69 74 48 61 73 68 54 61 62 6c 65 28  l_InitHashTable(
2bd0: 26 64 49 6e 66 6f 50 74 72 2d 3e 73 74 79 6c 65  &dInfoPtr->style
2be0: 54 61 62 6c 65 2c 20 73 69 7a 65 6f 66 28 53 74  Table, sizeof(St
2bf0: 79 6c 65 56 61 6c 75 65 73 29 2f 73 69 7a 65 6f  yleValues)/sizeo
2c00: 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 64 49 6e  f(int));.    dIn
2c10: 66 6f 50 74 72 2d 3e 64 4c 69 6e 65 50 74 72 20  foPtr->dLinePtr 
2c20: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 49 6e 66  = NULL;.    dInf
2c30: 6f 50 74 72 2d 3e 74 6f 70 4f 66 45 6f 66 20 3d  oPtr->topOfEof =
2c40: 20 30 3b 0a 20 20 20 20 64 49 6e 66 6f 50 74 72   0;.    dInfoPtr
2c50: 2d 3e 6e 65 77 43 68 61 72 4f 66 66 73 65 74 20  ->newCharOffset 
2c60: 3d 20 30 3b 0a 20 20 20 20 64 49 6e 66 6f 50 74  = 0;.    dInfoPt
2c70: 72 2d 3e 63 75 72 50 69 78 65 6c 4f 66 66 73 65  r->curPixelOffse
2c80: 74 20 3d 20 30 3b 0a 20 20 20 20 64 49 6e 66 6f  t = 0;.    dInfo
2c90: 50 74 72 2d 3e 6d 61 78 4c 65 6e 67 74 68 20 3d  Ptr->maxLength =
2ca0: 20 30 3b 0a 20 20 20 20 64 49 6e 66 6f 50 74 72   0;.    dInfoPtr
2cb0: 2d 3e 78 53 63 72 6f 6c 6c 46 69 72 73 74 20 3d  ->xScrollFirst =
2cc0: 20 2d 31 3b 0a 20 20 20 20 64 49 6e 66 6f 50 74   -1;.    dInfoPt
2cd0: 72 2d 3e 78 53 63 72 6f 6c 6c 4c 61 73 74 20 3d  r->xScrollLast =
2ce0: 20 2d 31 3b 0a 20 20 20 20 64 49 6e 66 6f 50 74   -1;.    dInfoPt
2cf0: 72 2d 3e 79 53 63 72 6f 6c 6c 46 69 72 73 74 20  r->yScrollFirst 
2d00: 3d 20 2d 31 3b 0a 20 20 20 20 64 49 6e 66 6f 50  = -1;.    dInfoP
2d10: 74 72 2d 3e 79 53 63 72 6f 6c 6c 4c 61 73 74 20  tr->yScrollLast 
2d20: 3d 20 2d 31 3b 0a 20 20 20 20 64 49 6e 66 6f 50  = -1;.    dInfoP
2d30: 74 72 2d 3e 64 4c 69 6e 65 73 49 6e 76 61 6c 69  tr->dLinesInvali
2d40: 64 61 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 64  dated = 0;.    d
2d50: 49 6e 66 6f 50 74 72 2d 3e 66 6c 61 67 73 20 3d  InfoPtr->flags =
2d60: 20 44 49 4e 46 4f 5f 4f 55 54 5f 4f 46 5f 44 41   DINFO_OUT_OF_DA
2d70: 54 45 3b 0a 20 20 20 20 74 65 78 74 50 74 72 2d  TE;.    textPtr-
2d80: 3e 64 49 6e 66 6f 50 74 72 20 3d 20 64 49 6e 66  >dInfoPtr = dInf
2d90: 6f 50 74 72 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  oPtr;.}.../*. *-
2da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2de0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6b 54 65  -----. *. * TkTe
2df0: 78 74 46 72 65 65 44 49 6e 66 6f 20 2d 2d 0a 20  xtFreeDInfo --. 
2e00: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
2e10: 75 72 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ure is called to
2e20: 20 66 72 65 65 20 75 70 20 61 6c 6c 20 6f 66 20   free up all of 
2e30: 74 68 65 20 70 72 69 76 61 74 65 20 64 69 73 70  the private disp
2e40: 6c 61 79 0a 20 2a 09 69 6e 66 6f 72 6d 61 74 69  lay. *.informati
2e50: 6f 6e 20 6b 65 70 74 20 62 79 20 74 68 69 73 20  on kept by this 
2e60: 66 69 6c 65 20 66 6f 72 20 61 20 74 65 78 74 20  file for a text 
2e70: 77 69 64 67 65 74 2e 0a 20 2a 0a 20 2a 20 52 65  widget.. *. * Re
2e80: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  sults:. *.None..
2e90: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
2ea0: 74 73 3a 0a 20 2a 09 4c 6f 74 73 20 6f 66 20 72  ts:. *.Lots of r
2eb0: 65 73 6f 75 72 63 65 73 20 67 65 74 20 66 72 65  esources get fre
2ec0: 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ed.. *. *-------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2f10: 20 2a 2f 0a 0a 76 6f 69 64 0a 54 6b 54 65 78 74   */..void.TkText
2f20: 46 72 65 65 44 49 6e 66 6f 28 74 65 78 74 50 74  FreeDInfo(textPt
2f30: 72 29 0a 20 20 20 20 54 6b 54 65 78 74 20 2a 74  r).    TkText *t
2f40: 65 78 74 50 74 72 3b 09 09 2f 2a 20 4f 76 65 72  extPtr;../* Over
2f50: 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
2f60: 66 6f 72 20 74 65 78 74 20 77 69 64 67 65 74 2e  for text widget.
2f70: 20 2a 2f 0a 7b 0a 20 20 20 20 72 65 67 69 73 74   */.{.    regist
2f80: 65 72 20 44 49 6e 66 6f 20 2a 64 49 6e 66 6f 50  er DInfo *dInfoP
2f90: 74 72 20 3d 20 74 65 78 74 50 74 72 2d 3e 64 49  tr = textPtr->dI
2fa0: 6e 66 6f 50 74 72 3b 0a 0a 20 20 20 20 2f 2a 0a  nfoPtr;..    /*.
2fb0: 20 20 20 20 20 2a 20 42 65 20 63 61 72 65 66 75       * Be carefu
2fc0: 6c 20 74 6f 20 66 72 65 65 20 75 70 20 73 74 79  l to free up sty
2fd0: 6c 65 54 61 62 6c 65 20 2a 61 66 74 65 72 2a 20  leTable *after* 
2fe0: 66 72 65 65 69 6e 67 20 75 70 20 61 6c 6c 20 74  freeing up all t
2ff0: 68 65 0a 20 20 20 20 20 2a 20 44 4c 69 6e 65 73  he.     * DLines
3000: 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20 68 61  , so that the ha
3010: 73 68 20 74 61 62 6c 65 20 69 73 20 73 74 69 6c  sh table is stil
3020: 6c 20 69 6e 74 61 63 74 20 74 6f 20 66 72 65 65  l intact to free
3030: 20 75 70 20 74 68 65 0a 20 20 20 20 20 2a 20 73   up the.     * s
3040: 74 79 6c 65 2d 72 65 6c 61 74 65 64 20 69 6e 66  tyle-related inf
3050: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
3060: 65 20 6c 69 6e 65 73 2e 20 20 4f 6e 63 65 20 74  e lines.  Once t
3070: 68 65 20 6c 69 6e 65 73 20 61 72 65 0a 20 20 20  he lines are.   
3080: 20 20 2a 20 61 6c 6c 20 66 72 65 65 20 74 68 65    * all free the
3090: 6e 20 73 74 79 6c 65 54 61 62 6c 65 20 77 69 6c  n styleTable wil
30a0: 6c 20 62 65 20 65 6d 70 74 79 2e 0a 20 20 20 20  l be empty..    
30b0: 20 2a 2f 0a 0a 20 20 20 20 46 72 65 65 44 4c 69   */..    FreeDLi
30c0: 6e 65 73 28 74 65 78 74 50 74 72 2c 20 64 49 6e  nes(textPtr, dIn
30d0: 66 6f 50 74 72 2d 3e 64 4c 69 6e 65 50 74 72 2c  foPtr->dLinePtr,
30e0: 20 28 44 4c 69 6e 65 20 2a 29 20 4e 55 4c 4c 2c   (DLine *) NULL,
30f0: 20 31 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 6c   1);.    Tcl_Del
3100: 65 74 65 48 61 73 68 54 61 62 6c 65 28 26 64 49  eteHashTable(&dI
3110: 6e 66 6f 50 74 72 2d 3e 73 74 79 6c 65 54 61 62  nfoPtr->styleTab
3120: 6c 65 29 3b 0a 20 20 20 20 69 66 20 28 64 49 6e  le);.    if (dIn
3130: 66 6f 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 52  foPtr->flags & R
3140: 45 44 52 41 57 5f 50 45 4e 44 49 4e 47 29 20 7b  EDRAW_PENDING) {
3150: 0a 09 54 63 6c 5f 43 61 6e 63 65 6c 49 64 6c 65  ..Tcl_CancelIdle
3160: 43 61 6c 6c 28 44 69 73 70 6c 61 79 54 65 78 74  Call(DisplayText
3170: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 74  , (ClientData) t
3180: 65 78 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20  extPtr);.    }. 
3190: 20 20 20 63 6b 66 72 65 65 28 28 63 68 61 72 20     ckfree((char 
31a0: 2a 29 20 64 49 6e 66 6f 50 74 72 29 3b 0a 7d 0a  *) dInfoPtr);.}.
31b0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
31c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
3200: 0a 20 2a 20 47 65 74 53 74 79 6c 65 20 2d 2d 0a  . * GetStyle --.
3210: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
3220: 64 75 72 65 20 63 72 65 61 74 65 73 20 61 6c 6c  dure creates all
3230: 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
3240: 20 6e 65 65 64 65 64 20 74 6f 20 64 69 73 70 6c   needed to displ
3250: 61 79 0a 20 2a 09 74 65 78 74 20 61 74 20 61 20  ay. *.text at a 
3260: 70 61 72 74 69 63 75 6c 61 72 20 6c 6f 63 61 74  particular locat
3270: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ion.. *. * Resul
3280: 74 73 3a 0a 20 2a 09 54 68 65 20 72 65 74 75 72  ts:. *.The retur
3290: 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69  n value is a poi
32a0: 6e 74 65 72 20 74 6f 20 61 20 53 74 79 6c 65 20  nter to a Style 
32b0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 0a 20  structure that. 
32c0: 2a 09 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  *.corresponds to
32d0: 20 2a 73 56 61 6c 75 65 50 74 72 2e 0a 20 2a 0a   *sValuePtr.. *.
32e0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
32f0: 0a 20 2a 09 41 20 6e 65 77 20 65 6e 74 72 79 20  . *.A new entry 
3300: 6d 61 79 20 62 65 20 63 72 65 61 74 65 64 20 69  may be created i
3310: 6e 20 74 68 65 20 73 74 79 6c 65 20 74 61 62 6c  n the style tabl
3320: 65 20 66 6f 72 20 74 68 65 20 77 69 64 67 65 74  e for the widget
3330: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
3340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
3380: 2f 0a 0a 73 74 61 74 69 63 20 53 74 79 6c 65 20  /..static Style 
3390: 2a 0a 47 65 74 53 74 79 6c 65 28 74 65 78 74 50  *.GetStyle(textP
33a0: 74 72 2c 20 69 6e 64 65 78 50 74 72 29 0a 20 20  tr, indexPtr).  
33b0: 20 20 54 6b 54 65 78 74 20 2a 74 65 78 74 50 74    TkText *textPt
33c0: 72 3b 09 09 2f 2a 20 4f 76 65 72 61 6c 6c 20 69  r;../* Overall i
33d0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
33e0: 20 74 65 78 74 20 77 69 64 67 65 74 2e 20 2a 2f   text widget. */
33f0: 0a 20 20 20 20 54 6b 54 65 78 74 49 6e 64 65 78  .    TkTextIndex
3400: 20 2a 69 6e 64 65 78 50 74 72 3b 09 2f 2a 20 54   *indexPtr;./* T
3410: 68 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  he character in 
3420: 74 68 65 20 74 65 78 74 20 66 6f 72 20 77 68 69  the text for whi
3430: 63 68 0a 09 09 09 09 20 2a 20 64 69 73 70 6c 61  ch..... * displa
3440: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  y information is
3450: 20 77 61 6e 74 65 64 2e 20 2a 2f 0a 7b 0a 20 20   wanted. */.{.  
3460: 20 20 54 6b 54 65 78 74 54 61 67 20 2a 2a 74 61    TkTextTag **ta
3470: 67 50 74 72 73 3b 0a 20 20 20 20 72 65 67 69 73  gPtrs;.    regis
3480: 74 65 72 20 54 6b 54 65 78 74 54 61 67 20 2a 74  ter TkTextTag *t
3490: 61 67 50 74 72 3b 0a 20 20 20 20 53 74 79 6c 65  agPtr;.    Style
34a0: 56 61 6c 75 65 73 20 73 74 79 6c 65 56 61 6c 75  Values styleValu
34b0: 65 73 3b 0a 20 20 20 20 53 74 79 6c 65 20 2a 73  es;.    Style *s
34c0: 74 79 6c 65 50 74 72 3b 0a 20 20 20 20 54 63 6c  tylePtr;.    Tcl
34d0: 5f 48 61 73 68 45 6e 74 72 79 20 2a 68 50 74 72  _HashEntry *hPtr
34e0: 3b 0a 20 20 20 20 69 6e 74 20 6e 75 6d 54 61 67  ;.    int numTag
34f0: 73 2c 20 6e 65 77 2c 20 69 3b 0a 0a 20 20 20 20  s, new, i;..    
3500: 2f 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 76 61  /*.     * The va
3510: 72 69 61 62 6c 65 73 20 62 65 6c 6f 77 20 6b 65  riables below ke
3520: 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ep track of the 
3530: 68 69 67 68 65 73 74 2d 70 72 69 6f 72 69 74 79  highest-priority
3540: 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 0a 20   specification. 
3550: 20 20 20 20 2a 20 74 68 61 74 20 68 61 73 20 6f      * that has o
3560: 63 63 75 72 72 65 64 20 66 6f 72 20 65 61 63 68  ccurred for each
3570: 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20   of the various 
3580: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 74  fields of the St
3590: 79 6c 65 56 61 6c 75 65 73 2e 0a 20 20 20 20 20  yleValues..     
35a0: 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 75 6e 64 65  */..    int unde
35b0: 72 6c 69 6e 65 50 72 69 6f 2c 20 6a 75 73 74 69  rlinePrio, justi
35c0: 66 79 50 72 69 6f 2c 20 6f 66 66 73 65 74 50 72  fyPrio, offsetPr
35d0: 69 6f 3b 0a 20 20 20 20 69 6e 74 20 6c 4d 61 72  io;.    int lMar
35e0: 67 69 6e 31 50 72 69 6f 2c 20 6c 4d 61 72 67 69  gin1Prio, lMargi
35f0: 6e 32 50 72 69 6f 2c 20 72 4d 61 72 67 69 6e 50  n2Prio, rMarginP
3600: 72 69 6f 3b 0a 20 20 20 20 69 6e 74 20 73 70 61  rio;.    int spa
3610: 63 69 6e 67 31 50 72 69 6f 2c 20 73 70 61 63 69  cing1Prio, spaci
3620: 6e 67 32 50 72 69 6f 2c 20 73 70 61 63 69 6e 67  ng2Prio, spacing
3630: 33 50 72 69 6f 3b 0a 20 20 20 20 69 6e 74 20 74  3Prio;.    int t
3640: 61 62 50 72 69 6f 2c 20 77 72 61 70 50 72 69 6f  abPrio, wrapPrio
3650: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
3660: 20 46 69 6e 64 20 6f 75 74 20 77 68 61 74 20 74   Find out what t
3670: 61 67 73 20 61 72 65 20 70 72 65 73 65 6e 74 20  ags are present 
3680: 66 6f 72 20 74 68 65 20 63 68 61 72 61 63 74 65  for the characte
3690: 72 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 0a  r, then compute.
36a0: 20 20 20 20 20 2a 20 61 20 53 74 79 6c 65 56 61       * a StyleVa
36b0: 6c 75 65 73 20 73 74 72 75 63 74 75 72 65 20 63  lues structure c
36c0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
36d0: 74 68 6f 73 65 20 74 61 67 73 20 28 73 63 61 6e  those tags (scan
36e0: 0a 20 20 20 20 20 2a 20 74 68 72 6f 75 67 68 20  .     * through 
36f0: 61 6c 6c 20 6f 66 20 74 68 65 20 74 61 67 73 2c  all of the tags,
3700: 20 73 61 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74   saving informat
3710: 69 6f 6e 20 66 6f 72 20 74 68 65 20 68 69 67 68  ion for the high
3720: 65 73 74 2d 0a 20 20 20 20 20 2a 20 70 72 69 6f  est-.     * prio
3730: 72 69 74 79 20 74 61 67 29 2e 0a 20 20 20 20 20  rity tag)..     
3740: 2a 2f 0a 0a 20 20 20 20 74 61 67 50 74 72 73 20  */..    tagPtrs 
3750: 3d 20 54 6b 42 54 72 65 65 47 65 74 54 61 67 73  = TkBTreeGetTags
3760: 28 69 6e 64 65 78 50 74 72 2c 20 26 6e 75 6d 54  (indexPtr, &numT
3770: 61 67 73 29 3b 0a 20 20 20 20 75 6e 64 65 72 6c  ags);.    underl
3780: 69 6e 65 50 72 69 6f 20 3d 20 6a 75 73 74 69 66  inePrio = justif
3790: 79 50 72 69 6f 20 3d 20 6f 66 66 73 65 74 50 72  yPrio = offsetPr
37a0: 69 6f 20 3d 20 2d 31 3b 0a 20 20 20 20 6c 4d 61  io = -1;.    lMa
37b0: 72 67 69 6e 31 50 72 69 6f 20 3d 20 6c 4d 61 72  rgin1Prio = lMar
37c0: 67 69 6e 32 50 72 69 6f 20 3d 20 72 4d 61 72 67  gin2Prio = rMarg
37d0: 69 6e 50 72 69 6f 20 3d 20 2d 31 3b 0a 20 20 20  inPrio = -1;.   
37e0: 20 73 70 61 63 69 6e 67 31 50 72 69 6f 20 3d 20   spacing1Prio = 
37f0: 73 70 61 63 69 6e 67 32 50 72 69 6f 20 3d 20 73  spacing2Prio = s
3800: 70 61 63 69 6e 67 33 50 72 69 6f 20 3d 20 2d 31  pacing3Prio = -1
3810: 3b 0a 20 20 20 20 74 61 62 50 72 69 6f 20 3d 20  ;.    tabPrio = 
3820: 77 72 61 70 50 72 69 6f 20 3d 20 2d 31 3b 0a 20  wrapPrio = -1;. 
3830: 20 20 20 6d 65 6d 73 65 74 28 28 56 4f 49 44 20     memset((VOID 
3840: 2a 29 20 26 73 74 79 6c 65 56 61 6c 75 65 73 2c  *) &styleValues,
3850: 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 79 6c 65   0, sizeof(Style
3860: 56 61 6c 75 65 73 29 29 3b 0a 20 20 20 20 73 74  Values));.    st
3870: 79 6c 65 56 61 6c 75 65 73 2e 6a 75 73 74 69 66  yleValues.justif
3880: 79 20 3d 20 54 4b 5f 4a 55 53 54 49 46 59 5f 4c  y = TK_JUSTIFY_L
3890: 45 46 54 3b 0a 20 20 20 20 73 74 79 6c 65 56 61  EFT;.    styleVa
38a0: 6c 75 65 73 2e 73 70 61 63 69 6e 67 31 20 3d 20  lues.spacing1 = 
38b0: 74 65 78 74 50 74 72 2d 3e 73 70 61 63 69 6e 67  textPtr->spacing
38c0: 31 3b 0a 20 20 20 20 73 74 79 6c 65 56 61 6c 75  1;.    styleValu
38d0: 65 73 2e 73 70 61 63 69 6e 67 32 20 3d 20 74 65  es.spacing2 = te
38e0: 78 74 50 74 72 2d 3e 73 70 61 63 69 6e 67 32 3b  xtPtr->spacing2;
38f0: 0a 20 20 20 20 73 74 79 6c 65 56 61 6c 75 65 73  .    styleValues
3900: 2e 73 70 61 63 69 6e 67 33 20 3d 20 74 65 78 74  .spacing3 = text
3910: 50 74 72 2d 3e 73 70 61 63 69 6e 67 33 3b 0a 20  Ptr->spacing3;. 
3920: 20 20 20 73 74 79 6c 65 56 61 6c 75 65 73 2e 74     styleValues.t
3930: 61 62 41 72 72 61 79 50 74 72 20 3d 20 74 65 78  abArrayPtr = tex
3940: 74 50 74 72 2d 3e 74 61 62 41 72 72 61 79 50 74  tPtr->tabArrayPt
3950: 72 3b 0a 20 20 20 20 73 74 79 6c 65 56 61 6c 75  r;.    styleValu
3960: 65 73 2e 77 72 61 70 4d 6f 64 65 20 3d 20 74 65  es.wrapMode = te
3970: 78 74 50 74 72 2d 3e 77 72 61 70 4d 6f 64 65 3b  xtPtr->wrapMode;
3980: 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 20  .    for (i = 0 
3990: 3b 20 69 20 3c 20 6e 75 6d 54 61 67 73 3b 20 69  ; i < numTags; i
39a0: 2b 2b 29 20 7b 0a 09 74 61 67 50 74 72 20 3d 20  ++) {..tagPtr = 
39b0: 74 61 67 50 74 72 73 5b 69 5d 3b 0a 09 69 66 20  tagPtrs[i];..if 
39c0: 28 28 74 61 67 50 74 72 2d 3e 6a 75 73 74 69 66  ((tagPtr->justif
39d0: 79 53 74 72 69 6e 67 20 21 3d 20 4e 55 4c 4c 29  yString != NULL)
39e0: 0a 09 09 26 26 20 28 74 61 67 50 74 72 2d 3e 70  ...&& (tagPtr->p
39f0: 72 69 6f 72 69 74 79 20 3e 20 6a 75 73 74 69 66  riority > justif
3a00: 79 50 72 69 6f 29 29 20 7b 0a 09 20 20 20 20 73  yPrio)) {..    s
3a10: 74 79 6c 65 56 61 6c 75 65 73 2e 6a 75 73 74 69  tyleValues.justi
3a20: 66 79 20 3d 20 74 61 67 50 74 72 2d 3e 6a 75 73  fy = tagPtr->jus
3a30: 74 69 66 79 3b 0a 09 20 20 20 20 6a 75 73 74 69  tify;..    justi
3a40: 66 79 50 72 69 6f 20 3d 20 74 61 67 50 74 72 2d  fyPrio = tagPtr-
3a50: 3e 70 72 69 6f 72 69 74 79 3b 0a 09 7d 0a 09 69  >priority;..}..i
3a60: 66 20 28 28 74 61 67 50 74 72 2d 3e 6c 4d 61 72  f ((tagPtr->lMar
3a70: 67 69 6e 31 53 74 72 69 6e 67 20 21 3d 20 4e 55  gin1String != NU
3a80: 4c 4c 29 0a 09 09 26 26 20 28 74 61 67 50 74 72  LL)...&& (tagPtr
3a90: 2d 3e 70 72 69 6f 72 69 74 79 20 3e 20 6c 4d 61  ->priority > lMa
3aa0: 72 67 69 6e 31 50 72 69 6f 29 29 20 7b 0a 09 20  rgin1Prio)) {.. 
3ab0: 20 20 20 73 74 79 6c 65 56 61 6c 75 65 73 2e 6c     styleValues.l
3ac0: 4d 61 72 67 69 6e 31 20 3d 20 74 61 67 50 74 72  Margin1 = tagPtr
3ad0: 2d 3e 6c 4d 61 72 67 69 6e 31 3b 0a 09 20 20 20  ->lMargin1;..   
3ae0: 20 6c 4d 61 72 67 69 6e 31 50 72 69 6f 20 3d 20   lMargin1Prio = 
3af0: 74 61 67 50 74 72 2d 3e 70 72 69 6f 72 69 74 79  tagPtr->priority
3b00: 3b 0a 09 7d 0a 09 69 66 20 28 28 74 61 67 50 74  ;..}..if ((tagPt
3b10: 72 2d 3e 6c 4d 61 72 67 69 6e 32 53 74 72 69 6e  r->lMargin2Strin
3b20: 67 20 21 3d 20 4e 55 4c 4c 29 0a 09 09 26 26 20  g != NULL)...&& 
3b30: 28 74 61 67 50 74 72 2d 3e 70 72 69 6f 72 69 74  (tagPtr->priorit
3b40: 79 20 3e 20 6c 4d 61 72 67 69 6e 32 50 72 69 6f  y > lMargin2Prio
3b50: 29 29 20 7b 0a 09 20 20 20 20 73 74 79 6c 65 56  )) {..    styleV
3b60: 61 6c 75 65 73 2e 6c 4d 61 72 67 69 6e 32 20 3d  alues.lMargin2 =
3b70: 20 74 61 67 50 74 72 2d 3e 6c 4d 61 72 67 69 6e   tagPtr->lMargin
3b80: 32 3b 0a 09 20 20 20 20 6c 4d 61 72 67 69 6e 32  2;..    lMargin2
3b90: 50 72 69 6f 20 3d 20 74 61 67 50 74 72 2d 3e 70  Prio = tagPtr->p
3ba0: 72 69 6f 72 69 74 79 3b 0a 09 7d 0a 09 69 66 20  riority;..}..if 
3bb0: 28 28 74 61 67 50 74 72 2d 3e 6f 66 66 73 65 74  ((tagPtr->offset
3bc0: 53 74 72 69 6e 67 20 21 3d 20 4e 55 4c 4c 29 0a  String != NULL).
3bd0: 09 09 26 26 20 28 74 61 67 50 74 72 2d 3e 70 72  ..&& (tagPtr->pr
3be0: 69 6f 72 69 74 79 20 3e 20 6f 66 66 73 65 74 50  iority > offsetP
3bf0: 72 69 6f 29 29 20 7b 0a 09 20 20 20 20 73 74 79  rio)) {..    sty
3c00: 6c 65 56 61 6c 75 65 73 2e 6f 66 66 73 65 74 20  leValues.offset 
3c10: 3d 20 74 61 67 50 74 72 2d 3e 6f 66 66 73 65 74  = tagPtr->offset
3c20: 3b 0a 09 20 20 20 20 6f 66 66 73 65 74 50 72 69  ;..    offsetPri
3c30: 6f 20 3d 20 74 61 67 50 74 72 2d 3e 70 72 69 6f  o = tagPtr->prio
3c40: 72 69 74 79 3b 0a 09 7d 0a 09 69 66 20 28 28 74  rity;..}..if ((t
3c50: 61 67 50 74 72 2d 3e 72 4d 61 72 67 69 6e 53 74  agPtr->rMarginSt
3c60: 72 69 6e 67 20 21 3d 20 4e 55 4c 4c 29 0a 09 09  ring != NULL)...
3c70: 26 26 20 28 74 61 67 50 74 72 2d 3e 70 72 69 6f  && (tagPtr->prio
3c80: 72 69 74 79 20 3e 20 72 4d 61 72 67 69 6e 50 72  rity > rMarginPr
3c90: 69 6f 29 29 20 7b 0a 09 20 20 20 20 73 74 79 6c  io)) {..    styl
3ca0: 65 56 61 6c 75 65 73 2e 72 4d 61 72 67 69 6e 20  eValues.rMargin 
3cb0: 3d 20 74 61 67 50 74 72 2d 3e 72 4d 61 72 67 69  = tagPtr->rMargi
3cc0: 6e 3b 0a 09 20 20 20 20 72 4d 61 72 67 69 6e 50  n;..    rMarginP
3cd0: 72 69 6f 20 3d 20 74 61 67 50 74 72 2d 3e 70 72  rio = tagPtr->pr
3ce0: 69 6f 72 69 74 79 3b 0a 09 7d 0a 09 69 66 20 28  iority;..}..if (
3cf0: 28 74 61 67 50 74 72 2d 3e 73 70 61 63 69 6e 67  (tagPtr->spacing
3d00: 31 53 74 72 69 6e 67 20 21 3d 20 4e 55 4c 4c 29  1String != NULL)
3d10: 0a 09 09 26 26 20 28 74 61 67 50 74 72 2d 3e 70  ...&& (tagPtr->p
3d20: 72 69 6f 72 69 74 79 20 3e 20 73 70 61 63 69 6e  riority > spacin
3d30: 67 31 50 72 69 6f 29 29 20 7b 0a 09 20 20 20 20  g1Prio)) {..    
3d40: 73 74 79 6c 65 56 61 6c 75 65 73 2e 73 70 61 63  styleValues.spac
3d50: 69 6e 67 31 20 3d 20 74 61 67 50 74 72 2d 3e 73  ing1 = tagPtr->s
3d60: 70 61 63 69 6e 67 31 3b 0a 09 20 20 20 20 73 70  pacing1;..    sp
3d70: 61 63 69 6e 67 31 50 72 69 6f 20 3d 20 74 61 67  acing1Prio = tag
3d80: 50 74 72 2d 3e 70 72 69 6f 72 69 74 79 3b 0a 09  Ptr->priority;..
3d90: 7d 0a 09 69 66 20 28 28 74 61 67 50 74 72 2d 3e  }..if ((tagPtr->
3da0: 73 70 61 63 69 6e 67 32 53 74 72 69 6e 67 20 21  spacing2String !
3db0: 3d 20 4e 55 4c 4c 29 0a 09 09 26 26 20 28 74 61  = NULL)...&& (ta
3dc0: 67 50 74 72 2d 3e 70 72 69 6f 72 69 74 79 20 3e  gPtr->priority >
3dd0: 20 73 70 61 63 69 6e 67 32 50 72 69 6f 29 29 20   spacing2Prio)) 
3de0: 7b 0a 09 20 20 20 20 73 74 79 6c 65 56 61 6c 75  {..    styleValu
3df0: 65 73 2e 73 70 61 63 69 6e 67 32 20 3d 20 74 61  es.spacing2 = ta
3e00: 67 50 74 72 2d 3e 73 70 61 63 69 6e 67 32 3b 0a  gPtr->spacing2;.
3e10: 09 20 20 20 20 73 70 61 63 69 6e 67 32 50 72 69  .    spacing2Pri
3e20: 6f 20 3d 20 74 61 67 50 74 72 2d 3e 70 72 69 6f  o = tagPtr->prio
3e30: 72 69 74 79 3b 0a 09 7d 0a 09 69 66 20 28 28 74  rity;..}..if ((t
3e40: 61 67 50 74 72 2d 3e 73 70 61 63 69 6e 67 33 53  agPtr->spacing3S
3e50: 74 72 69 6e 67 20 21 3d 20 4e 55 4c 4c 29 0a 09  tring != NULL)..
3e60: 09 26 26 20 28 74 61 67 50 74 72 2d 3e 70 72 69  .&& (tagPtr->pri
3e70: 6f 72 69 74 79 20 3e 20 73 70 61 63 69 6e 67 33  ority > spacing3
3e80: 50 72 69 6f 29 29 20 7b 0a 09 20 20 20 20 73 74  Prio)) {..    st
3e90: 79 6c 65 56 61 6c 75 65 73 2e 73 70 61 63 69 6e  yleValues.spacin
3ea0: 67 33 20 3d 20 74 61 67 50 74 72 2d 3e 73 70 61  g3 = tagPtr->spa
3eb0: 63 69 6e 67 33 3b 0a 09 20 20 20 20 73 70 61 63  cing3;..    spac
3ec0: 69 6e 67 33 50 72 69 6f 20 3d 20 74 61 67 50 74  ing3Prio = tagPt
3ed0: 72 2d 3e 70 72 69 6f 72 69 74 79 3b 0a 09 7d 0a  r->priority;..}.
3ee0: 09 69 66 20 28 28 74 61 67 50 74 72 2d 3e 74 61  .if ((tagPtr->ta
3ef0: 62 53 74 72 69 6e 67 20 21 3d 20 4e 55 4c 4c 29  bString != NULL)
3f00: 0a 09 09 26 26 20 28 74 61 67 50 74 72 2d 3e 70  ...&& (tagPtr->p
3f10: 72 69 6f 72 69 74 79 20 3e 20 74 61 62 50 72 69  riority > tabPri
3f20: 6f 29 29 20 7b 0a 09 20 20 20 20 73 74 79 6c 65  o)) {..    style
3f30: 56 61 6c 75 65 73 2e 74 61 62 41 72 72 61 79 50  Values.tabArrayP
3f40: 74 72 20 3d 20 74 61 67 50 74 72 2d 3e 74 61 62  tr = tagPtr->tab
3f50: 41 72 72 61 79 50 74 72 3b 0a 09 20 20 20 20 74  ArrayPtr;..    t
3f60: 61 62 50 72 69 6f 20 3d 20 74 61 67 50 74 72 2d  abPrio = tagPtr-
3f70: 3e 70 72 69 6f 72 69 74 79 3b 0a 09 7d 0a 09 69  >priority;..}..i
3f80: 66 20 28 28 74 61 67 50 74 72 2d 3e 75 6e 64 65  f ((tagPtr->unde
3f90: 72 6c 69 6e 65 53 74 72 69 6e 67 20 21 3d 20 4e  rlineString != N
3fa0: 55 4c 4c 29 0a 09 09 26 26 20 28 74 61 67 50 74  ULL)...&& (tagPt
3fb0: 72 2d 3e 70 72 69 6f 72 69 74 79 20 3e 20 75 6e  r->priority > un
3fc0: 64 65 72 6c 69 6e 65 50 72 69 6f 29 29 20 7b 0a  derlinePrio)) {.
3fd0: 09 20 20 20 20 73 74 79 6c 65 56 61 6c 75 65 73  .    styleValues
3fe0: 2e 75 6e 64 65 72 6c 69 6e 65 20 3d 20 74 61 67  .underline = tag
3ff0: 50 74 72 2d 3e 75 6e 64 65 72 6c 69 6e 65 3b 0a  Ptr->underline;.
4000: 09 20 20 20 20 75 6e 64 65 72 6c 69 6e 65 50 72  .    underlinePr
4010: 69 6f 20 3d 20 74 61 67 50 74 72 2d 3e 70 72 69  io = tagPtr->pri
4020: 6f 72 69 74 79 3b 0a 09 7d 0a 09 69 66 20 28 28  ority;..}..if ((
4030: 74 61 67 50 74 72 2d 3e 77 72 61 70 4d 6f 64 65  tagPtr->wrapMode
4040: 20 21 3d 20 4e 55 4c 4c 29 0a 09 09 26 26 20 28   != NULL)...&& (
4050: 74 61 67 50 74 72 2d 3e 70 72 69 6f 72 69 74 79  tagPtr->priority
4060: 20 3e 20 77 72 61 70 50 72 69 6f 29 29 20 7b 0a   > wrapPrio)) {.
4070: 09 20 20 20 20 73 74 79 6c 65 56 61 6c 75 65 73  .    styleValues
4080: 2e 77 72 61 70 4d 6f 64 65 20 3d 20 74 61 67 50  .wrapMode = tagP
4090: 74 72 2d 3e 77 72 61 70 4d 6f 64 65 3b 0a 09 20  tr->wrapMode;.. 
40a0: 20 20 20 77 72 61 70 50 72 69 6f 20 3d 20 74 61     wrapPrio = ta
40b0: 67 50 74 72 2d 3e 70 72 69 6f 72 69 74 79 3b 0a  gPtr->priority;.
40c0: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .}.    }.    if 
40d0: 28 74 61 67 50 74 72 73 20 21 3d 20 4e 55 4c 4c  (tagPtrs != NULL
40e0: 29 20 7b 0a 09 63 6b 66 72 65 65 28 28 63 68 61  ) {..ckfree((cha
40f0: 72 20 2a 29 20 74 61 67 50 74 72 73 29 3b 0a 20  r *) tagPtrs);. 
4100: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
4110: 20 20 2a 20 55 73 65 20 61 6e 20 65 78 69 73 74    * Use an exist
4120: 69 6e 67 20 73 74 79 6c 65 20 69 66 20 74 68 65  ing style if the
4130: 72 65 27 73 20 6f 6e 65 20 61 72 6f 75 6e 64 20  re's one around 
4140: 74 68 61 74 20 6d 61 74 63 68 65 73 2e 0a 20 20  that matches..  
4150: 20 20 20 2a 2f 0a 0a 20 20 20 20 68 50 74 72 20     */..    hPtr 
4160: 3d 20 54 63 6c 5f 43 72 65 61 74 65 48 61 73 68  = Tcl_CreateHash
4170: 45 6e 74 72 79 28 26 74 65 78 74 50 74 72 2d 3e  Entry(&textPtr->
4180: 64 49 6e 66 6f 50 74 72 2d 3e 73 74 79 6c 65 54  dInfoPtr->styleT
4190: 61 62 6c 65 2c 0a 09 20 20 20 20 28 63 68 61 72  able,..    (char
41a0: 20 2a 29 20 26 73 74 79 6c 65 56 61 6c 75 65 73   *) &styleValues
41b0: 2c 20 26 6e 65 77 29 3b 0a 20 20 20 20 69 66 20  , &new);.    if 
41c0: 28 21 6e 65 77 29 20 7b 0a 09 73 74 79 6c 65 50  (!new) {..styleP
41d0: 74 72 20 3d 20 28 53 74 79 6c 65 20 2a 29 20 54  tr = (Style *) T
41e0: 63 6c 5f 47 65 74 48 61 73 68 56 61 6c 75 65 28  cl_GetHashValue(
41f0: 68 50 74 72 29 3b 0a 09 73 74 79 6c 65 50 74 72  hPtr);..stylePtr
4200: 2d 3e 72 65 66 43 6f 75 6e 74 2b 2b 3b 0a 09 72  ->refCount++;..r
4210: 65 74 75 72 6e 20 73 74 79 6c 65 50 74 72 3b 0a  eturn stylePtr;.
4220: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
4230: 20 20 20 2a 20 4e 6f 20 65 78 69 73 74 69 6e 67     * No existing
4240: 20 73 74 79 6c 65 20 6d 61 74 63 68 65 64 2e 20   style matched. 
4250: 20 4d 61 6b 65 20 61 20 6e 65 77 20 6f 6e 65 2e   Make a new one.
4260: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 73 74  .     */..    st
4270: 79 6c 65 50 74 72 20 3d 20 28 53 74 79 6c 65 20  ylePtr = (Style 
4280: 2a 29 20 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f  *) ckalloc(sizeo
4290: 66 28 53 74 79 6c 65 29 29 3b 0a 20 20 20 20 73  f(Style));.    s
42a0: 74 79 6c 65 50 74 72 2d 3e 72 65 66 43 6f 75 6e  tylePtr->refCoun
42b0: 74 20 3d 20 31 3b 0a 20 20 20 20 73 74 79 6c 65  t = 1;.    style
42c0: 50 74 72 2d 3e 63 74 6b 53 74 79 6c 65 20 3d 20  Ptr->ctkStyle = 
42d0: 73 74 79 6c 65 56 61 6c 75 65 73 2e 75 6e 64 65  styleValues.unde
42e0: 72 6c 69 6e 65 20 3f 0a 20 20 20 20 09 20 20 20  rline ?.    .   
42f0: 20 43 54 4b 5f 55 4e 44 45 52 4c 49 4e 45 5f 53   CTK_UNDERLINE_S
4300: 54 59 4c 45 20 3a 20 43 54 4b 5f 50 4c 41 49 4e  TYLE : CTK_PLAIN
4310: 5f 53 54 59 4c 45 3b 0a 20 20 20 20 73 74 79 6c  _STYLE;.    styl
4320: 65 50 74 72 2d 3e 73 56 61 6c 75 65 50 74 72 20  ePtr->sValuePtr 
4330: 3d 20 28 53 74 79 6c 65 56 61 6c 75 65 73 20 2a  = (StyleValues *
4340: 29 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 48 61  )..    Tcl_GetHa
4350: 73 68 4b 65 79 28 26 74 65 78 74 50 74 72 2d 3e  shKey(&textPtr->
4360: 64 49 6e 66 6f 50 74 72 2d 3e 73 74 79 6c 65 54  dInfoPtr->styleT
4370: 61 62 6c 65 2c 20 68 50 74 72 29 3b 0a 20 20 20  able, hPtr);.   
4380: 20 73 74 79 6c 65 50 74 72 2d 3e 68 50 74 72 20   stylePtr->hPtr 
4390: 3d 20 68 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f  = hPtr;.    Tcl_
43a0: 53 65 74 48 61 73 68 56 61 6c 75 65 28 68 50 74  SetHashValue(hPt
43b0: 72 2c 20 73 74 79 6c 65 50 74 72 29 3b 0a 20 20  r, stylePtr);.  
43c0: 20 20 72 65 74 75 72 6e 20 73 74 79 6c 65 50 74    return stylePt
43d0: 72 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  r;.}.../*. *----
43e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4420: 2d 2d 0a 20 2a 0a 20 2a 20 46 72 65 65 53 74 79  --. *. * FreeSty
4430: 6c 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  le --. *. *.This
4440: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 63 61   procedure is ca
4450: 6c 6c 65 64 20 77 68 65 6e 20 61 20 53 74 79 6c  lled when a Styl
4460: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6e  e structure is n
4470: 6f 20 6c 6f 6e 67 65 72 0a 20 2a 09 6e 65 65 64  o longer. *.need
4480: 65 64 2e 20 20 49 74 20 64 65 63 72 65 6d 65 6e  ed.  It decremen
4490: 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ts the reference
44a0: 20 63 6f 75 6e 74 20 61 6e 64 20 66 72 65 65 73   count and frees
44b0: 20 75 70 20 74 68 65 0a 20 2a 09 73 70 61 63 65   up the. *.space
44c0: 20 66 6f 72 20 74 68 65 20 73 74 79 6c 65 20 73   for the style s
44d0: 74 72 75 63 74 75 72 65 20 69 66 20 74 68 65 20  tructure if the 
44e0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
44f0: 69 73 20 30 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  is 0.. *. * Resu
4500: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  lts:. *.None.. *
4510: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
4520: 3a 0a 20 2a 09 54 68 65 20 73 74 6f 72 61 67 65  :. *.The storage
4530: 20 61 6e 64 20 6f 74 68 65 72 20 72 65 73 6f 75   and other resou
4540: 72 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  rces associated 
4550: 77 69 74 68 20 74 68 65 20 73 74 79 6c 65 0a 20  with the style. 
4560: 2a 09 61 72 65 20 66 72 65 65 64 20 75 70 20 69  *.are freed up i
4570: 66 20 6e 6f 2d 6f 6e 65 27 73 20 73 74 69 6c 6c  f no-one's still
4580: 20 75 73 69 6e 67 20 69 74 2e 0a 20 2a 0a 20 2a   using it.. *. *
4590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
45e0: 69 63 20 76 6f 69 64 0a 46 72 65 65 53 74 79 6c  ic void.FreeStyl
45f0: 65 28 74 65 78 74 50 74 72 2c 20 73 74 79 6c 65  e(textPtr, style
4600: 50 74 72 29 0a 20 20 20 20 54 6b 54 65 78 74 20  Ptr).    TkText 
4610: 2a 74 65 78 74 50 74 72 3b 09 09 2f 2a 20 49 6e  *textPtr;../* In
4620: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
4630: 6f 76 65 72 61 6c 6c 20 77 69 64 67 65 74 2e 20  overall widget. 
4640: 2a 2f 0a 20 20 20 20 72 65 67 69 73 74 65 72 20  */.    register 
4650: 53 74 79 6c 65 20 2a 73 74 79 6c 65 50 74 72 3b  Style *stylePtr;
4660: 09 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20  ./* Information 
4670: 61 62 6f 75 74 20 73 74 79 6c 65 20 74 6f 20 62  about style to b
4680: 65 20 66 72 65 65 64 2e 20 2a 2f 0a 0a 7b 0a 20  e freed. */..{. 
4690: 20 20 20 73 74 79 6c 65 50 74 72 2d 3e 72 65 66     stylePtr->ref
46a0: 43 6f 75 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 20  Count--;.    if 
46b0: 28 73 74 79 6c 65 50 74 72 2d 3e 72 65 66 43 6f  (stylePtr->refCo
46c0: 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 54 63 6c  unt == 0) {..Tcl
46d0: 5f 44 65 6c 65 74 65 48 61 73 68 45 6e 74 72 79  _DeleteHashEntry
46e0: 28 73 74 79 6c 65 50 74 72 2d 3e 68 50 74 72 29  (stylePtr->hPtr)
46f0: 3b 0a 09 63 6b 66 72 65 65 28 28 63 68 61 72 20  ;..ckfree((char 
4700: 2a 29 20 73 74 79 6c 65 50 74 72 29 3b 0a 20 20  *) stylePtr);.  
4710: 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d    }.}.../*. *---
4720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4760: 2d 2d 2d 0a 20 2a 0a 20 2a 20 4c 61 79 6f 75 74  ---. *. * Layout
4770: 44 4c 69 6e 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54  DLine --. *. *.T
4780: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 67 65  his procedure ge
4790: 6e 65 72 61 74 65 73 20 61 20 73 69 6e 67 6c 65  nerates a single
47a0: 20 44 4c 69 6e 65 20 73 74 72 75 63 74 75 72 65   DLine structure
47b0: 20 66 6f 72 20 61 20 64 69 73 70 6c 61 79 0a 20   for a display. 
47c0: 2a 09 6c 69 6e 65 20 77 68 6f 73 65 20 6c 65 66  *.line whose lef
47d0: 74 6d 6f 73 74 20 63 68 61 72 61 63 74 65 72 20  tmost character 
47e0: 69 73 20 67 69 76 65 6e 20 62 79 20 69 6e 64 65  is given by inde
47f0: 78 50 74 72 2e 0a 20 2a 09 0a 20 2a 20 52 65 73  xPtr.. *.. * Res
4800: 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 72 65 74  ults:. *.The ret
4810: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70  urn value is a p
4820: 6f 69 6e 74 65 72 20 74 6f 20 61 20 44 4c 69 6e  ointer to a DLin
4830: 65 20 73 74 72 75 63 74 75 72 65 20 64 65 73 72  e structure desr
4840: 69 62 69 6e 67 20 74 68 65 0a 20 2a 09 64 69 73  ibing the. *.dis
4850: 70 6c 61 79 20 6c 69 6e 65 2e 20 20 41 6c 6c 20  play line.  All 
4860: 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c 6c 65  fields are fille
4870: 64 20 69 6e 20 61 6e 64 20 63 6f 72 72 65 63 74  d in and correct
4880: 20 65 78 63 65 70 74 20 66 6f 72 0a 20 2a 09 79   except for. *.y
4890: 20 61 6e 64 20 6e 65 78 74 50 74 72 2e 0a 20 2a   and nextPtr.. *
48a0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
48b0: 3a 0a 20 2a 09 53 74 6f 72 61 67 65 20 69 73 20  :. *.Storage is 
48c0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
48d0: 65 20 6e 65 77 20 44 4c 69 6e 65 2e 0a 20 2a 0a  e new DLine.. *.
48e0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
48f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4920: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
4930: 61 74 69 63 20 44 4c 69 6e 65 20 2a 0a 4c 61 79  atic DLine *.Lay
4940: 6f 75 74 44 4c 69 6e 65 28 74 65 78 74 50 74 72  outDLine(textPtr
4950: 2c 20 69 6e 64 65 78 50 74 72 29 0a 20 20 20 20  , indexPtr).    
4960: 54 6b 54 65 78 74 20 2a 74 65 78 74 50 74 72 3b  TkText *textPtr;
4970: 09 09 2f 2a 20 4f 76 65 72 61 6c 6c 20 69 6e 66  ../* Overall inf
4980: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
4990: 65 78 74 20 77 69 64 67 65 74 2e 20 2a 2f 0a 20  ext widget. */. 
49a0: 20 20 20 54 6b 54 65 78 74 49 6e 64 65 78 20 2a     TkTextIndex *
49b0: 69 6e 64 65 78 50 74 72 3b 09 2f 2a 20 42 65 67  indexPtr;./* Beg
49c0: 69 6e 6e 69 6e 67 20 6f 66 20 64 69 73 70 6c 61  inning of displa
49d0: 79 20 6c 69 6e 65 2e 20 20 4d 61 79 20 6e 6f 74  y line.  May not
49e0: 0a 09 09 09 09 20 2a 20 6e 65 63 65 73 73 61 72  ..... * necessar
49f0: 69 6c 79 20 70 6f 69 6e 74 20 74 6f 20 61 20 63  ily point to a c
4a00: 68 61 72 61 63 74 65 72 20 73 65 67 6d 65 6e 74  haracter segment
4a10: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 72 65 67 69 73  . */.{.    regis
4a20: 74 65 72 20 44 4c 69 6e 65 20 2a 64 6c 50 74 72  ter DLine *dlPtr
4a30: 3b 09 09 2f 2a 20 4e 65 77 20 64 69 73 70 6c 61  ;../* New displa
4a40: 79 20 6c 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 54  y line. */.    T
4a50: 6b 54 65 78 74 53 65 67 6d 65 6e 74 20 2a 73 65  kTextSegment *se
4a60: 67 50 74 72 3b 09 09 2f 2a 20 43 75 72 72 65 6e  gPtr;../* Curren
4a70: 74 20 73 65 67 6d 65 6e 74 20 69 6e 20 74 65 78  t segment in tex
4a80: 74 2e 20 2a 2f 0a 20 20 20 20 54 6b 54 65 78 74  t. */.    TkText
4a90: 44 69 73 70 43 68 75 6e 6b 20 2a 6c 61 73 74 43  DispChunk *lastC
4aa0: 68 75 6e 6b 50 74 72 3b 09 2f 2a 20 4c 61 73 74  hunkPtr;./* Last
4ab0: 20 63 68 75 6e 6b 20 61 6c 6c 6f 63 61 74 65 64   chunk allocated
4ac0: 20 73 6f 20 66 61 72 0a 09 09 09 09 09 20 2a 20   so far...... * 
4ad0: 66 6f 72 20 6c 69 6e 65 2e 20 2a 2f 0a 20 20 20  for line. */.   
4ae0: 20 54 6b 54 65 78 74 44 69 73 70 43 68 75 6e 6b   TkTextDispChunk
4af0: 20 2a 63 68 75 6e 6b 50 74 72 3b 09 09 2f 2a 20   *chunkPtr;../* 
4b00: 43 75 72 72 65 6e 74 20 63 68 75 6e 6b 2e 20 2a  Current chunk. *
4b10: 2f 0a 20 20 20 20 54 6b 54 65 78 74 49 6e 64 65  /.    TkTextInde
4b20: 78 20 63 75 72 49 6e 64 65 78 3b 0a 20 20 20 20  x curIndex;.    
4b30: 54 6b 54 65 78 74 44 69 73 70 43 68 75 6e 6b 20  TkTextDispChunk 
4b40: 2a 62 72 65 61 6b 43 68 75 6e 6b 50 74 72 3b 09  *breakChunkPtr;.
4b50: 2f 2a 20 43 68 75 6e 6b 20 63 6f 6e 74 61 69 6e  /* Chunk contain
4b60: 69 6e 67 20 62 65 73 74 20 77 6f 72 64 20 62 72  ing best word br
4b70: 65 61 6b 0a 09 09 09 09 09 20 2a 20 70 6f 69 6e  eak...... * poin
4b80: 74 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20  t, if any. */.  
4b90: 20 20 54 6b 54 65 78 74 49 6e 64 65 78 20 62 72    TkTextIndex br
4ba0: 65 61 6b 49 6e 64 65 78 3b 09 09 2f 2a 20 49 6e  eakIndex;../* In
4bb0: 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 68 61  dex of first cha
4bc0: 72 61 63 74 65 72 20 69 6e 0a 09 09 09 09 09 20  racter in...... 
4bd0: 2a 20 62 72 65 61 6b 43 68 75 6e 6b 50 74 72 2e  * breakChunkPtr.
4be0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 72 65 61   */.    int brea
4bf0: 6b 43 68 61 72 4f 66 66 73 65 74 3b 09 09 2f 2a  kCharOffset;../*
4c00: 20 43 68 61 72 61 63 74 65 72 20 77 69 74 68 69   Character withi
4c10: 6e 20 62 72 65 61 6b 43 68 75 6e 6b 50 74 72 20  n breakChunkPtr 
4c20: 6a 75 73 74 0a 09 09 09 09 09 20 2a 20 74 6f 20  just...... * to 
4c30: 72 69 67 68 74 20 6f 66 20 62 65 73 74 20 62 72  right of best br
4c40: 65 61 6b 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20  eak point. */.  
4c50: 20 20 69 6e 74 20 6e 6f 43 68 61 72 73 59 65 74    int noCharsYet
4c60: 3b 09 09 09 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20  ;.../* Non-zero 
4c70: 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 63 68  means that no ch
4c80: 61 72 61 63 74 65 72 73 0a 09 09 09 09 09 20 2a  aracters...... *
4c90: 20 68 61 76 65 20 62 65 65 6e 20 70 6c 61 63 65   have been place
4ca0: 64 20 6f 6e 20 74 68 65 20 6c 69 6e 65 20 79 65  d on the line ye
4cb0: 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 75  t. */.    int ju
4cc0: 73 74 69 66 79 3b 09 09 09 2f 2a 20 48 6f 77 20  stify;.../* How 
4cd0: 74 6f 20 6a 75 73 74 69 66 79 20 6c 69 6e 65 3a  to justify line:
4ce0: 20 74 61 6b 65 6e 20 66 72 6f 6d 0a 09 09 09 09   taken from.....
4cf0: 09 20 2a 20 73 74 79 6c 65 20 66 6f 72 20 66 69  . * style for fi
4d00: 72 73 74 20 63 68 61 72 61 63 74 65 72 20 69 6e  rst character in
4d10: 20 6c 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 6e   line. */.    in
4d20: 74 20 6a 49 6e 64 65 6e 74 3b 09 09 09 2f 2a 20  t jIndent;.../* 
4d30: 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 64 65 6e  Additional inden
4d40: 74 61 74 69 6f 6e 20 28 62 65 79 6f 6e 64 0a 09  tation (beyond..
4d50: 09 09 09 09 20 2a 20 6d 61 72 67 69 6e 73 29 20  .... * margins) 
4d60: 64 75 65 20 74 6f 20 6a 75 73 74 69 66 69 63 61  due to justifica
4d70: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  tion. */.    int
4d80: 20 72 4d 61 72 67 69 6e 3b 09 09 09 2f 2a 20 52   rMargin;.../* R
4d90: 69 67 68 74 20 6d 61 72 67 69 6e 20 77 69 64 74  ight margin widt
4da0: 68 20 66 6f 72 20 6c 69 6e 65 2e 20 2a 2f 0a 20  h for line. */. 
4db0: 20 20 20 54 6b 5f 55 69 64 20 77 72 61 70 4d 6f     Tk_Uid wrapMo
4dc0: 64 65 3b 09 09 09 2f 2a 20 57 72 61 70 20 6d 6f  de;.../* Wrap mo
4dd0: 64 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  de to use for th
4de0: 69 73 20 6c 69 6e 65 2e 20 2a 2f 0a 20 20 20 20  is line. */.    
4df0: 69 6e 74 20 78 20 3d 20 30 2c 20 6d 61 78 58 20  int x = 0, maxX 
4e00: 3d 20 30 3b 09 09 2f 2a 20 49 6e 69 74 69 61 6c  = 0;../* Initial
4e10: 69 7a 61 74 69 6f 6e 73 20 6e 65 65 64 65 64 20  izations needed 
4e20: 6f 6e 6c 79 20 74 6f 0a 09 09 09 09 09 20 2a 20  only to...... * 
4e30: 73 74 6f 70 20 63 6f 6d 70 69 6c 65 72 20 77 61  stop compiler wa
4e40: 72 6e 69 6e 67 73 2e 20 2a 2f 0a 20 20 20 20 69  rnings. */.    i
4e50: 6e 74 20 77 68 6f 6c 65 4c 69 6e 65 3b 09 09 09  nt wholeLine;...
4e60: 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 6d 65 61 6e  /* Non-zero mean
4e70: 73 20 74 68 69 73 20 64 69 73 70 6c 61 79 20 6c  s this display l
4e80: 69 6e 65 0a 09 09 09 09 09 20 2a 20 72 75 6e 73  ine...... * runs
4e90: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
4ea0: 68 65 20 74 65 78 74 20 6c 69 6e 65 2e 20 2a 2f  he text line. */
4eb0: 0a 20 20 20 20 69 6e 74 20 74 61 62 49 6e 64 65  .    int tabInde
4ec0: 78 3b 09 09 09 2f 2a 20 49 6e 64 65 78 20 6f 66  x;.../* Index of
4ed0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
4ee0: 20 73 74 6f 70 2e 20 2a 2f 0a 20 20 20 20 69 6e   stop. */.    in
4ef0: 74 20 67 6f 74 54 61 62 3b 09 09 09 09 2f 2a 20  t gotTab;..../* 
4f00: 4e 6f 6e 2d 7a 65 72 6f 20 6d 65 61 6e 73 20 74  Non-zero means t
4f10: 68 65 20 63 75 72 72 65 6e 74 20 63 68 75 6e 6b  he current chunk
4f20: 0a 09 09 09 09 09 20 2a 20 63 6f 6e 74 61 69 6e  ...... * contain
4f30: 73 20 61 20 74 61 62 2e 20 2a 2f 0a 20 20 20 20  s a tab. */.    
4f40: 54 6b 54 65 78 74 44 69 73 70 43 68 75 6e 6b 20  TkTextDispChunk 
4f50: 2a 74 61 62 43 68 75 6e 6b 50 74 72 3b 09 2f 2a  *tabChunkPtr;./*
4f60: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
4f70: 63 68 75 6e 6b 20 63 6f 6e 74 61 69 6e 69 6e 67  chunk containing
4f80: 0a 09 09 09 09 09 20 2a 20 74 68 65 20 70 72 65  ...... * the pre
4f90: 76 69 6f 75 73 20 74 61 62 20 73 74 6f 70 2e 20  vious tab stop. 
4fa0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 43 68  */.    int maxCh
4fb0: 61 72 73 3b 09 09 09 2f 2a 20 4d 61 78 69 6d 75  ars;.../* Maximu
4fc0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  m number of char
4fd0: 61 63 74 65 72 73 20 74 6f 0a 09 09 09 09 09 20  acters to...... 
4fe0: 2a 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68 69  * include in thi
4ff0: 73 20 63 68 75 6e 6b 2e 20 2a 2f 0a 20 20 20 20  s chunk. */.    
5000: 54 6b 54 65 78 74 54 61 62 41 72 72 61 79 20 2a  TkTextTabArray *
5010: 74 61 62 41 72 72 61 79 50 74 72 3b 09 2f 2a 20  tabArrayPtr;./* 
5020: 54 61 62 20 73 74 6f 70 73 20 66 6f 72 20 6c 69  Tab stops for li
5030: 6e 65 3b 20 20 74 61 6b 65 6e 20 66 72 6f 6d 0a  ne;  taken from.
5040: 09 09 09 09 09 20 2a 20 73 74 79 6c 65 20 66 6f  ..... * style fo
5050: 72 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65  r first characte
5060: 72 20 6f 6e 20 6c 69 6e 65 2e 20 2a 2f 0a 20 20  r on line. */.  
5070: 20 20 69 6e 74 20 74 61 62 53 69 7a 65 3b 09 09    int tabSize;..
5080: 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 69  ./* Number of pi
5090: 78 65 6c 73 20 63 6f 6e 73 75 6d 65 64 20 62 79  xels consumed by
50a0: 20 63 75 72 72 65 6e 74 0a 09 09 09 09 09 20 2a   current...... *
50b0: 20 74 61 62 20 73 74 6f 70 2e 20 2a 2f 0a 20 20   tab stop. */.  
50c0: 20 20 54 6b 54 65 78 74 44 69 73 70 43 68 75 6e    TkTextDispChun
50d0: 6b 20 2a 6c 61 73 74 43 68 61 72 43 68 75 6e 6b  k *lastCharChunk
50e0: 50 74 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72  Ptr;  /* Pointer
50f0: 20 74 6f 20 6c 61 73 74 20 63 68 75 6e 6b 20 69   to last chunk i
5100: 6e 20 64 69 73 70 6c 61 79 0a 09 09 09 09 09 20  n display...... 
5110: 2a 20 6c 69 6e 65 73 20 77 69 74 68 20 6e 75 6d  * lines with num
5120: 43 68 61 72 73 20 3e 20 30 2e 20 20 55 73 65 64  Chars > 0.  Used
5130: 20 74 6f 0a 09 09 09 09 09 20 2a 20 64 72 6f 70   to...... * drop
5140: 20 30 2d 73 69 7a 65 64 20 63 68 75 6e 6b 73 20   0-sized chunks 
5150: 66 72 6f 6d 20 74 68 65 20 65 6e 64 0a 09 09 09  from the end....
5160: 09 09 20 2a 20 6f 66 20 74 68 65 20 6c 69 6e 65  .. * of the line
5170: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 66 66  . */.    int off
5180: 73 65 74 2c 20 63 6f 64 65 3b 0a 20 20 20 20 53  set, code;.    S
5190: 74 79 6c 65 56 61 6c 75 65 73 20 2a 73 56 61 6c  tyleValues *sVal
51a0: 75 65 50 74 72 3b 0a 0a 20 20 20 20 2f 2a 0a 20  uePtr;..    /*. 
51b0: 20 20 20 20 2a 20 43 72 65 61 74 65 20 61 6e 64      * Create and
51c0: 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
51d0: 77 20 44 4c 69 6e 65 20 73 74 72 75 63 74 75 72  w DLine structur
51e0: 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  e..     */..    
51f0: 64 6c 50 74 72 20 3d 20 28 44 4c 69 6e 65 20 2a  dlPtr = (DLine *
5200: 29 20 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  ) ckalloc(sizeof
5210: 28 44 4c 69 6e 65 29 29 3b 0a 20 20 20 20 64 6c  (DLine));.    dl
5220: 50 74 72 2d 3e 69 6e 64 65 78 20 3d 20 2a 69 6e  Ptr->index = *in
5230: 64 65 78 50 74 72 3b 0a 20 20 20 20 64 6c 50 74  dexPtr;.    dlPt
5240: 72 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  r->count = 0;.  
5250: 20 20 64 6c 50 74 72 2d 3e 79 20 3d 20 30 3b 0a    dlPtr->y = 0;.
5260: 20 20 20 20 64 6c 50 74 72 2d 3e 6f 6c 64 59 20      dlPtr->oldY 
5270: 3d 20 2d 31 3b 0a 20 20 20 20 64 6c 50 74 72 2d  = -1;.    dlPtr-
5280: 3e 68 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 20  >height = 0;.   
5290: 20 64 6c 50 74 72 2d 3e 63 68 75 6e 6b 50 74 72   dlPtr->chunkPtr
52a0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 6c 50   = NULL;.    dlP
52b0: 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20 4e 55  tr->nextPtr = NU
52c0: 4c 4c 3b 0a 20 20 20 20 64 6c 50 74 72 2d 3e 66  LL;.    dlPtr->f
52d0: 6c 61 67 73 20 3d 20 4e 45 57 5f 4c 41 59 4f 55  lags = NEW_LAYOU
52e0: 54 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  T;..    /*.     
52f0: 2a 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e  * Each iteration
5300: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 65 6c   of the loop bel
5310: 6f 77 20 63 72 65 61 74 65 73 20 6f 6e 65 20 54  ow creates one T
5320: 6b 54 65 78 74 44 69 73 70 43 68 75 6e 6b 20 66  kTextDispChunk f
5330: 6f 72 0a 20 20 20 20 20 2a 20 74 68 65 20 6e 65  or.     * the ne
5340: 77 20 64 69 73 70 6c 61 79 20 6c 69 6e 65 2e 20  w display line. 
5350: 20 54 68 65 20 6c 69 6e 65 20 77 69 6c 6c 20 61   The line will a
5360: 6c 77 61 79 73 20 68 61 76 65 20 61 74 20 6c 65  lways have at le
5370: 61 73 74 20 6f 6e 65 0a 20 20 20 20 20 2a 20 63  ast one.     * c
5380: 68 75 6e 6b 20 28 66 6f 72 20 74 68 65 20 6e 65  hunk (for the ne
5390: 77 6c 69 6e 65 20 63 68 61 72 61 63 74 65 72 20  wline character 
53a0: 61 74 20 74 68 65 20 65 6e 64 2c 20 69 66 20 74  at the end, if t
53b0: 68 65 72 65 27 73 20 6e 6f 74 68 69 6e 67 0a 20  here's nothing. 
53c0: 20 20 20 20 2a 20 65 6c 73 65 20 61 76 61 69 6c      * else avail
53d0: 61 62 6c 65 29 2e 0a 20 20 20 20 20 2a 2f 0a 0a  able)..     */..
53e0: 20 20 20 20 63 75 72 49 6e 64 65 78 20 3d 20 2a      curIndex = *
53f0: 69 6e 64 65 78 50 74 72 3b 0a 20 20 20 20 6c 61  indexPtr;.    la
5400: 73 74 43 68 75 6e 6b 50 74 72 20 3d 20 4e 55 4c  stChunkPtr = NUL
5410: 4c 3b 0a 20 20 20 20 63 68 75 6e 6b 50 74 72 20  L;.    chunkPtr 
5420: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 6e 6f 43 68  = NULL;.    noCh
5430: 61 72 73 59 65 74 20 3d 20 31 3b 0a 20 20 20 20  arsYet = 1;.    
5440: 62 72 65 61 6b 43 68 75 6e 6b 50 74 72 20 3d 20  breakChunkPtr = 
5450: 4e 55 4c 4c 3b 0a 20 20 20 20 62 72 65 61 6b 43  NULL;.    breakC
5460: 68 61 72 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  harOffset = 0;. 
5470: 20 20 20 6a 75 73 74 69 66 79 20 3d 20 54 4b 5f     justify = TK_
5480: 4a 55 53 54 49 46 59 5f 4c 45 46 54 3b 0a 20 20  JUSTIFY_LEFT;.  
5490: 20 20 74 61 62 49 6e 64 65 78 20 3d 20 2d 31 3b    tabIndex = -1;
54a0: 0a 20 20 20 20 74 61 62 43 68 75 6e 6b 50 74 72  .    tabChunkPtr
54b0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 74 61 62   = NULL;.    tab
54c0: 41 72 72 61 79 50 74 72 20 3d 20 4e 55 4c 4c 3b  ArrayPtr = NULL;
54d0: 0a 20 20 20 20 72 4d 61 72 67 69 6e 20 3d 20 30  .    rMargin = 0
54e0: 3b 0a 20 20 20 20 77 72 61 70 4d 6f 64 65 20 3d  ;.    wrapMode =
54f0: 20 74 6b 54 65 78 74 43 68 61 72 55 69 64 3b 0a   tkTextCharUid;.
5500: 20 20 20 20 74 61 62 53 69 7a 65 20 3d 20 30 3b      tabSize = 0;
5510: 0a 20 20 20 20 6c 61 73 74 43 68 61 72 43 68 75  .    lastCharChu
5520: 6e 6b 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  nkPtr = NULL;.. 
5530: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 46 69 6e     /*.     * Fin
5540: 64 20 74 68 65 20 66 69 72 73 74 20 73 65 67 6d  d the first segm
5550: 65 6e 74 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  ent to consider 
5560: 66 6f 72 20 74 68 65 20 6c 69 6e 65 2e 20 20 43  for the line.  C
5570: 61 6e 27 74 20 63 61 6c 6c 0a 20 20 20 20 20 2a  an't call.     *
5580: 20 54 6b 54 65 78 74 49 6e 64 65 78 54 6f 53 65   TkTextIndexToSe
5590: 67 20 66 6f 72 20 74 68 69 73 20 62 65 63 61 75  g for this becau
55a0: 73 65 20 69 74 20 77 6f 6e 27 74 20 72 65 74 75  se it won't retu
55b0: 72 6e 20 61 20 73 65 67 6d 65 6e 74 0a 20 20 20  rn a segment.   
55c0: 20 20 2a 20 77 69 74 68 20 7a 65 72 6f 20 73 69    * with zero si
55d0: 7a 65 20 28 73 75 63 68 20 61 73 20 74 68 65 20  ze (such as the 
55e0: 69 6e 73 65 72 74 69 6f 6e 20 63 75 72 73 6f 72  insertion cursor
55f0: 27 73 20 6d 61 72 6b 29 2e 0a 20 20 20 20 20 2a  's mark)..     *
5600: 2f 0a 0a 20 20 20 20 66 6f 72 20 28 6f 66 66 73  /..    for (offs
5610: 65 74 20 3d 20 63 75 72 49 6e 64 65 78 2e 63 68  et = curIndex.ch
5620: 61 72 49 6e 64 65 78 2c 20 73 65 67 50 74 72 20  arIndex, segPtr 
5630: 3d 20 63 75 72 49 6e 64 65 78 2e 6c 69 6e 65 50  = curIndex.lineP
5640: 74 72 2d 3e 73 65 67 50 74 72 3b 0a 09 20 20 20  tr->segPtr;..   
5650: 20 28 6f 66 66 73 65 74 20 3e 20 30 29 20 26 26   (offset > 0) &&
5660: 20 28 6f 66 66 73 65 74 20 3e 3d 20 73 65 67 50   (offset >= segP
5670: 74 72 2d 3e 73 69 7a 65 29 3b 0a 09 20 20 20 20  tr->size);..    
5680: 6f 66 66 73 65 74 20 2d 3d 20 73 65 67 50 74 72  offset -= segPtr
5690: 2d 3e 73 69 7a 65 2c 20 73 65 67 50 74 72 20 3d  ->size, segPtr =
56a0: 20 73 65 67 50 74 72 2d 3e 6e 65 78 74 50 74 72   segPtr->nextPtr
56b0: 29 20 7b 0a 09 2f 2a 20 45 6d 70 74 79 20 6c 6f  ) {../* Empty lo
56c0: 6f 70 20 62 6f 64 79 2e 20 2a 2f 0a 20 20 20 20  op body. */.    
56d0: 7d 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 73 65  }..    while (se
56e0: 67 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  gPtr != NULL) {.
56f0: 09 69 66 20 28 73 65 67 50 74 72 2d 3e 74 79 70  .if (segPtr->typ
5700: 65 50 74 72 2d 3e 6c 61 79 6f 75 74 50 72 6f 63  ePtr->layoutProc
5710: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   == NULL) {..   
5720: 20 73 65 67 50 74 72 20 3d 20 73 65 67 50 74 72   segPtr = segPtr
5730: 2d 3e 6e 65 78 74 50 74 72 3b 0a 09 20 20 20 20  ->nextPtr;..    
5740: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 09 20 20 20  offset = 0;..   
5750: 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 7d 0a 09 69   continue;..}..i
5760: 66 20 28 63 68 75 6e 6b 50 74 72 20 3d 3d 20 4e  f (chunkPtr == N
5770: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 63 68 75 6e  ULL) {..    chun
5780: 6b 50 74 72 20 3d 20 28 54 6b 54 65 78 74 44 69  kPtr = (TkTextDi
5790: 73 70 43 68 75 6e 6b 20 2a 29 20 63 6b 61 6c 6c  spChunk *) ckall
57a0: 6f 63 28 73 69 7a 65 6f 66 28 54 6b 54 65 78 74  oc(sizeof(TkText
57b0: 44 69 73 70 43 68 75 6e 6b 29 29 3b 0a 09 20 20  DispChunk));..  
57c0: 20 20 63 68 75 6e 6b 50 74 72 2d 3e 6e 65 78 74    chunkPtr->next
57d0: 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 09  Ptr = NULL;..}..
57e0: 63 68 75 6e 6b 50 74 72 2d 3e 73 74 79 6c 65 50  chunkPtr->styleP
57f0: 74 72 20 3d 20 47 65 74 53 74 79 6c 65 28 74 65  tr = GetStyle(te
5800: 78 74 50 74 72 2c 20 26 63 75 72 49 6e 64 65 78  xtPtr, &curIndex
5810: 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 53 61 76 65  );.../*.. * Save
5820: 20 73 74 79 6c 65 20 69 6e 66 6f 72 6d 61 74 69   style informati
5830: 6f 6e 20 73 75 63 68 20 61 73 20 6a 75 73 74 69  on such as justi
5840: 66 69 63 61 74 69 6f 6e 20 61 6e 64 20 69 6e 64  fication and ind
5850: 65 6e 74 61 74 69 6f 6e 2c 0a 09 20 2a 20 75 70  entation,.. * up
5860: 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
5870: 20 63 68 61 72 61 63 74 65 72 20 69 73 20 65 6e   character is en
5880: 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
5890: 72 65 74 61 69 6e 20 74 68 61 74 0a 09 20 2a 20  retain that.. * 
58a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
58b0: 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
58c0: 6c 69 6e 65 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20  line... */...if 
58d0: 28 6e 6f 43 68 61 72 73 59 65 74 29 20 7b 0a 09  (noCharsYet) {..
58e0: 20 20 20 20 74 61 62 41 72 72 61 79 50 74 72 20      tabArrayPtr 
58f0: 3d 20 63 68 75 6e 6b 50 74 72 2d 3e 73 74 79 6c  = chunkPtr->styl
5900: 65 50 74 72 2d 3e 73 56 61 6c 75 65 50 74 72 2d  ePtr->sValuePtr-
5910: 3e 74 61 62 41 72 72 61 79 50 74 72 3b 0a 09 20  >tabArrayPtr;.. 
5920: 20 20 20 6a 75 73 74 69 66 79 20 3d 20 63 68 75     justify = chu
5930: 6e 6b 50 74 72 2d 3e 73 74 79 6c 65 50 74 72 2d  nkPtr->stylePtr-
5940: 3e 73 56 61 6c 75 65 50 74 72 2d 3e 6a 75 73 74  >sValuePtr->just
5950: 69 66 79 3b 0a 09 20 20 20 20 72 4d 61 72 67 69  ify;..    rMargi
5960: 6e 20 3d 20 63 68 75 6e 6b 50 74 72 2d 3e 73 74  n = chunkPtr->st
5970: 79 6c 65 50 74 72 2d 3e 73 56 61 6c 75 65 50 74  ylePtr->sValuePt
5980: 72 2d 3e 72 4d 61 72 67 69 6e 3b 0a 09 20 20 20  r->rMargin;..   
5990: 20 77 72 61 70 4d 6f 64 65 20 3d 20 63 68 75 6e   wrapMode = chun
59a0: 6b 50 74 72 2d 3e 73 74 79 6c 65 50 74 72 2d 3e  kPtr->stylePtr->
59b0: 73 56 61 6c 75 65 50 74 72 2d 3e 77 72 61 70 4d  sValuePtr->wrapM
59c0: 6f 64 65 3b 0a 09 20 20 20 20 78 20 3d 20 28 28  ode;..    x = ((
59d0: 63 75 72 49 6e 64 65 78 2e 63 68 61 72 49 6e 64  curIndex.charInd
59e0: 65 78 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 3f  ex == 0)...    ?
59f0: 20 63 68 75 6e 6b 50 74 72 2d 3e 73 74 79 6c 65   chunkPtr->style
5a00: 50 74 72 2d 3e 73 56 61 6c 75 65 50 74 72 2d 3e  Ptr->sValuePtr->
5a10: 6c 4d 61 72 67 69 6e 31 0a 09 09 20 20 20 20 3a  lMargin1...    :
5a20: 20 63 68 75 6e 6b 50 74 72 2d 3e 73 74 79 6c 65   chunkPtr->style
5a30: 50 74 72 2d 3e 73 56 61 6c 75 65 50 74 72 2d 3e  Ptr->sValuePtr->
5a40: 6c 4d 61 72 67 69 6e 32 29 3b 0a 09 20 20 20 20  lMargin2);..    
5a50: 69 66 20 28 77 72 61 70 4d 6f 64 65 20 3d 3d 20  if (wrapMode == 
5a60: 74 6b 54 65 78 74 4e 6f 6e 65 55 69 64 29 20 7b  tkTextNoneUid) {
5a70: 0a 09 09 6d 61 78 58 20 3d 20 49 4e 54 5f 4d 41  ...maxX = INT_MA
5a80: 58 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b  X;..    } else {
5a90: 0a 09 09 6d 61 78 58 20 3d 20 74 65 78 74 50 74  ...maxX = textPt
5aa0: 72 2d 3e 64 49 6e 66 6f 50 74 72 2d 3e 6d 61 78  r->dInfoPtr->max
5ab0: 58 20 2d 20 74 65 78 74 50 74 72 2d 3e 64 49 6e  X - textPtr->dIn
5ac0: 66 6f 50 74 72 2d 3e 78 0a 09 09 09 2d 20 72 4d  foPtr->x....- rM
5ad0: 61 72 67 69 6e 3b 0a 09 09 69 66 20 28 6d 61 78  argin;...if (max
5ae0: 58 20 3c 20 78 29 20 7b 0a 09 09 20 20 20 20 6d  X < x) {...    m
5af0: 61 78 58 20 3d 20 78 3b 0a 09 09 7d 0a 09 20 20  axX = x;...}..  
5b00: 20 20 7d 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20    }..}.../*.. * 
5b10: 53 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20  See if there is 
5b20: 61 20 74 61 62 20 69 6e 20 74 68 65 20 63 75 72  a tab in the cur
5b30: 72 65 6e 74 20 63 68 75 6e 6b 3b 20 69 66 20 73  rent chunk; if s
5b40: 6f 2c 20 6f 6e 6c 79 0a 09 20 2a 20 6c 61 79 6f  o, only.. * layo
5b50: 75 74 20 63 68 61 72 61 63 74 65 72 73 20 75 70  ut characters up
5b60: 20 74 6f 20 28 61 6e 64 20 69 6e 63 6c 75 64 69   to (and includi
5b70: 6e 67 29 20 74 68 65 20 74 61 62 2e 0a 09 20 2a  ng) the tab... *
5b80: 2f 0a 0a 09 67 6f 74 54 61 62 20 3d 20 30 3b 0a  /...gotTab = 0;.
5b90: 09 6d 61 78 43 68 61 72 73 20 3d 20 73 65 67 50  .maxChars = segP
5ba0: 74 72 2d 3e 73 69 7a 65 20 2d 20 6f 66 66 73 65  tr->size - offse
5bb0: 74 3b 0a 09 69 66 20 28 6a 75 73 74 69 66 79 20  t;..if (justify 
5bc0: 3d 3d 20 54 4b 5f 4a 55 53 54 49 46 59 5f 4c 45  == TK_JUSTIFY_LE
5bd0: 46 54 29 20 7b 0a 09 20 20 20 20 69 66 20 28 73  FT) {..    if (s
5be0: 65 67 50 74 72 2d 3e 74 79 70 65 50 74 72 20 3d  egPtr->typePtr =
5bf0: 3d 20 26 74 6b 54 65 78 74 43 68 61 72 54 79 70  = &tkTextCharTyp
5c00: 65 29 20 7b 0a 09 09 63 68 61 72 20 2a 70 3b 0a  e) {...char *p;.
5c10: 0a 09 09 66 6f 72 20 28 70 20 3d 20 73 65 67 50  ...for (p = segP
5c20: 74 72 2d 3e 62 6f 64 79 2e 63 68 61 72 73 20 20  tr->body.chars  
5c30: 2b 20 6f 66 66 73 65 74 3b 20 2a 70 20 21 3d 20  + offset; *p != 
5c40: 30 3b 20 70 2b 2b 29 20 7b 0a 09 09 20 20 20 20  0; p++) {...    
5c50: 69 66 20 28 2a 70 20 3d 3d 20 27 5c 74 27 29 20  if (*p == '\t') 
5c60: 7b 0a 09 09 09 6d 61 78 43 68 61 72 73 20 3d 20  {....maxChars = 
5c70: 28 70 20 2b 20 31 20 2d 20 73 65 67 50 74 72 2d  (p + 1 - segPtr-
5c80: 3e 62 6f 64 79 2e 63 68 61 72 73 29 20 2d 20 6f  >body.chars) - o
5c90: 66 66 73 65 74 3b 0a 09 09 09 67 6f 74 54 61 62  ffset;....gotTab
5ca0: 20 3d 20 31 3b 0a 09 09 09 62 72 65 61 6b 3b 0a   = 1;....break;.
5cb0: 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20  ..    }...}..   
5cc0: 20 7d 0a 09 7d 0a 0a 09 63 68 75 6e 6b 50 74 72   }..}...chunkPtr
5cd0: 2d 3e 78 20 3d 20 78 3b 0a 09 63 6f 64 65 20 3d  ->x = x;..code =
5ce0: 20 28 2a 73 65 67 50 74 72 2d 3e 74 79 70 65 50   (*segPtr->typeP
5cf0: 74 72 2d 3e 6c 61 79 6f 75 74 50 72 6f 63 29 28  tr->layoutProc)(
5d00: 74 65 78 74 50 74 72 2c 20 26 63 75 72 49 6e 64  textPtr, &curInd
5d10: 65 78 2c 20 73 65 67 50 74 72 2c 0a 09 09 6f 66  ex, segPtr,...of
5d20: 66 73 65 74 2c 20 6d 61 78 58 2d 74 61 62 53 69  fset, maxX-tabSi
5d30: 7a 65 2c 20 6d 61 78 43 68 61 72 73 2c 20 6e 6f  ze, maxChars, no
5d40: 43 68 61 72 73 59 65 74 2c 20 77 72 61 70 4d 6f  CharsYet, wrapMo
5d50: 64 65 2c 0a 09 09 63 68 75 6e 6b 50 74 72 29 3b  de,...chunkPtr);
5d60: 0a 09 69 66 20 28 63 6f 64 65 20 3c 3d 20 30 29  ..if (code <= 0)
5d70: 20 7b 0a 09 20 20 20 20 46 72 65 65 53 74 79 6c   {..    FreeStyl
5d80: 65 28 74 65 78 74 50 74 72 2c 20 63 68 75 6e 6b  e(textPtr, chunk
5d90: 50 74 72 2d 3e 73 74 79 6c 65 50 74 72 29 3b 0a  Ptr->stylePtr);.
5da0: 09 20 20 20 20 69 66 20 28 63 6f 64 65 20 3c 20  .    if (code < 
5db0: 30 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 54  0) {.../*... * T
5dc0: 68 69 73 20 73 65 67 6d 65 6e 74 20 64 6f 65 73  his segment does
5dd0: 6e 27 74 20 77 69 73 68 20 74 6f 20 64 69 73 70  n't wish to disp
5de0: 6c 61 79 20 69 74 73 65 6c 66 20 28 65 2e 67 2e  lay itself (e.g.
5df0: 20 6d 6f 73 74 0a 09 09 20 2a 20 6d 61 72 6b 73   most... * marks
5e00: 29 2e 0a 09 09 20 2a 2f 0a 0a 09 09 73 65 67 50  ).... */....segP
5e10: 74 72 20 3d 20 73 65 67 50 74 72 2d 3e 6e 65 78  tr = segPtr->nex
5e20: 74 50 74 72 3b 0a 09 09 6f 66 66 73 65 74 20 3d  tPtr;...offset =
5e30: 20 30 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a   0;...continue;.
5e40: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f 2a 0a  .    }...    /*.
5e50: 09 20 20 20 20 20 2a 20 4e 6f 20 63 68 61 72 61  .     * No chara
5e60: 63 74 65 72 73 20 66 72 6f 6d 20 74 68 69 73 20  cters from this 
5e70: 73 65 67 6d 65 6e 74 20 66 69 74 20 69 6e 20 74  segment fit in t
5e80: 68 65 20 77 69 6e 64 6f 77 3a 20 74 68 69 73 0a  he window: this.
5e90: 09 20 20 20 20 20 2a 20 6d 65 61 6e 73 20 77 65  .     * means we
5ea0: 27 72 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  're at the end o
5eb0: 66 20 74 68 65 20 64 69 73 70 6c 61 79 20 6c 69  f the display li
5ec0: 6e 65 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20  ne...     */... 
5ed0: 20 20 20 69 66 20 28 63 68 75 6e 6b 50 74 72 20     if (chunkPtr 
5ee0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 6b 66  != NULL) {...ckf
5ef0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 63 68 75  ree((char *) chu
5f00: 6e 6b 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 09  nkPtr);..    }..
5f10: 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 09 69      break;..}..i
5f20: 66 20 28 63 68 75 6e 6b 50 74 72 2d 3e 6e 75 6d  f (chunkPtr->num
5f30: 43 68 61 72 73 20 3e 20 30 29 20 7b 0a 09 20 20  Chars > 0) {..  
5f40: 20 20 6e 6f 43 68 61 72 73 59 65 74 20 3d 20 30    noCharsYet = 0
5f50: 3b 0a 09 20 20 20 20 6c 61 73 74 43 68 61 72 43  ;..    lastCharC
5f60: 68 75 6e 6b 50 74 72 20 3d 20 63 68 75 6e 6b 50  hunkPtr = chunkP
5f70: 74 72 3b 0a 09 7d 0a 09 69 66 20 28 6c 61 73 74  tr;..}..if (last
5f80: 43 68 75 6e 6b 50 74 72 20 3d 3d 20 4e 55 4c 4c  ChunkPtr == NULL
5f90: 29 20 7b 0a 09 20 20 20 20 64 6c 50 74 72 2d 3e  ) {..    dlPtr->
5fa0: 63 68 75 6e 6b 50 74 72 20 3d 20 63 68 75 6e 6b  chunkPtr = chunk
5fb0: 50 74 72 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  Ptr;..} else {..
5fc0: 20 20 20 20 6c 61 73 74 43 68 75 6e 6b 50 74 72      lastChunkPtr
5fd0: 2d 3e 6e 65 78 74 50 74 72 20 3d 20 63 68 75 6e  ->nextPtr = chun
5fe0: 6b 50 74 72 3b 0a 09 7d 0a 09 6c 61 73 74 43 68  kPtr;..}..lastCh
5ff0: 75 6e 6b 50 74 72 20 3d 20 63 68 75 6e 6b 50 74  unkPtr = chunkPt
6000: 72 3b 0a 09 78 20 2b 3d 20 63 68 75 6e 6b 50 74  r;..x += chunkPt
6010: 72 2d 3e 77 69 64 74 68 3b 0a 09 69 66 20 28 63  r->width;..if (c
6020: 68 75 6e 6b 50 74 72 2d 3e 62 72 65 61 6b 49 6e  hunkPtr->breakIn
6030: 64 65 78 20 3e 20 30 29 20 7b 0a 09 20 20 20 20  dex > 0) {..    
6040: 62 72 65 61 6b 43 68 61 72 4f 66 66 73 65 74 20  breakCharOffset 
6050: 3d 20 63 68 75 6e 6b 50 74 72 2d 3e 62 72 65 61  = chunkPtr->brea
6060: 6b 49 6e 64 65 78 3b 0a 09 20 20 20 20 62 72 65  kIndex;..    bre
6070: 61 6b 49 6e 64 65 78 20 3d 20 63 75 72 49 6e 64  akIndex = curInd
6080: 65 78 3b 0a 09 20 20 20 20 62 72 65 61 6b 43 68  ex;..    breakCh
6090: 75 6e 6b 50 74 72 20 3d 20 63 68 75 6e 6b 50 74  unkPtr = chunkPt
60a0: 72 3b 0a 09 7d 0a 09 69 66 20 28 63 68 75 6e 6b  r;..}..if (chunk
60b0: 50 74 72 2d 3e 6e 75 6d 43 68 61 72 73 20 21 3d  Ptr->numChars !=
60c0: 20 6d 61 78 43 68 61 72 73 29 20 7b 0a 09 20 20   maxChars) {..  
60d0: 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a    break;..}.../*
60e0: 0a 09 20 2a 20 49 66 20 77 65 27 72 65 20 61 74  .. * If we're at
60f0: 20 61 20 6e 65 77 20 74 61 62 2c 20 61 64 6a 75   a new tab, adju
6100: 73 74 20 74 68 65 20 6c 61 79 6f 75 74 20 66 6f  st the layout fo
6110: 72 20 61 6c 6c 20 74 68 65 20 63 68 75 6e 6b 73  r all the chunks
6120: 0a 09 20 2a 20 70 65 72 74 61 69 6e 69 6e 67 20  .. * pertaining 
6130: 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
6140: 74 61 62 2e 20 20 41 6c 73 6f 20 61 64 6a 75 73  tab.  Also adjus
6150: 74 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a  t the amount of.
6160: 09 20 2a 20 73 70 61 63 65 20 6c 65 66 74 20 69  . * space left i
6170: 6e 20 74 68 65 20 6c 69 6e 65 20 74 6f 20 61 63  n the line to ac
6180: 63 6f 75 6e 74 20 66 6f 72 20 73 70 61 63 65 20  count for space 
6190: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 65 61 74  that will be eat
61a0: 65 6e 0a 09 20 2a 20 75 70 20 62 79 20 74 68 65  en.. * up by the
61b0: 20 74 61 62 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20   tab... */...if 
61c0: 28 67 6f 74 54 61 62 29 20 7b 0a 09 20 20 20 20  (gotTab) {..    
61d0: 69 66 20 28 74 61 62 49 6e 64 65 78 20 3e 3d 20  if (tabIndex >= 
61e0: 30 29 20 7b 0a 09 09 41 64 6a 75 73 74 46 6f 72  0) {...AdjustFor
61f0: 54 61 62 28 74 65 78 74 50 74 72 2c 20 74 61 62  Tab(textPtr, tab
6200: 41 72 72 61 79 50 74 72 2c 20 74 61 62 49 6e 64  ArrayPtr, tabInd
6210: 65 78 2c 20 74 61 62 43 68 75 6e 6b 50 74 72 29  ex, tabChunkPtr)
6220: 3b 0a 09 09 78 20 3d 20 63 68 75 6e 6b 50 74 72  ;...x = chunkPtr
6230: 2d 3e 78 20 2b 20 63 68 75 6e 6b 50 74 72 2d 3e  ->x + chunkPtr->
6240: 77 69 64 74 68 3b 0a 09 20 20 20 20 7d 0a 09 20  width;..    }.. 
6250: 20 20 20 74 61 62 49 6e 64 65 78 2b 2b 3b 0a 09     tabIndex++;..
6260: 20 20 20 20 74 61 62 43 68 75 6e 6b 50 74 72 20      tabChunkPtr 
6270: 3d 20 63 68 75 6e 6b 50 74 72 3b 0a 09 20 20 20  = chunkPtr;..   
6280: 20 74 61 62 53 69 7a 65 20 3d 20 53 69 7a 65 4f   tabSize = SizeO
6290: 66 54 61 62 28 74 65 78 74 50 74 72 2c 20 74 61  fTab(textPtr, ta
62a0: 62 41 72 72 61 79 50 74 72 2c 20 74 61 62 49 6e  bArrayPtr, tabIn
62b0: 64 65 78 2c 20 78 2c 20 6d 61 78 58 29 3b 0a 09  dex, x, maxX);..
62c0: 20 20 20 20 69 66 20 28 74 61 62 53 69 7a 65 20      if (tabSize 
62d0: 3e 3d 20 28 6d 61 78 58 20 2d 20 78 29 29 20 7b  >= (maxX - x)) {
62e0: 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d  ...break;..    }
62f0: 0a 09 7d 0a 09 63 75 72 49 6e 64 65 78 2e 63 68  ..}..curIndex.ch
6300: 61 72 49 6e 64 65 78 20 2b 3d 20 63 68 75 6e 6b  arIndex += chunk
6310: 50 74 72 2d 3e 6e 75 6d 43 68 61 72 73 3b 0a 09  Ptr->numChars;..
6320: 6f 66 66 73 65 74 20 2b 3d 20 63 68 75 6e 6b 50  offset += chunkP
6330: 74 72 2d 3e 6e 75 6d 43 68 61 72 73 3b 0a 09 69  tr->numChars;..i
6340: 66 20 28 6f 66 66 73 65 74 20 3e 3d 20 73 65 67  f (offset >= seg
6350: 50 74 72 2d 3e 73 69 7a 65 29 20 7b 0a 09 20 20  Ptr->size) {..  
6360: 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 09 20    offset = 0;.. 
6370: 20 20 20 73 65 67 50 74 72 20 3d 20 73 65 67 50     segPtr = segP
6380: 74 72 2d 3e 6e 65 78 74 50 74 72 3b 0a 09 7d 0a  tr->nextPtr;..}.
6390: 09 63 68 75 6e 6b 50 74 72 20 3d 20 4e 55 4c 4c  .chunkPtr = NULL
63a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
63b0: 6e 6f 43 68 61 72 73 59 65 74 29 20 7b 0a 09 70  noCharsYet) {..p
63c0: 61 6e 69 63 28 22 4c 61 79 6f 75 74 44 4c 69 6e  anic("LayoutDLin
63d0: 65 20 63 6f 75 6c 64 6e 27 74 20 70 6c 61 63 65  e couldn't place
63e0: 20 61 6e 79 20 63 68 61 72 61 63 74 65 72 73 20   any characters 
63f0: 6f 6e 20 61 20 6c 69 6e 65 22 29 3b 0a 20 20 20  on a line");.   
6400: 20 7d 0a 20 20 20 20 77 68 6f 6c 65 4c 69 6e 65   }.    wholeLine
6410: 20 3d 20 28 73 65 67 50 74 72 20 3d 3d 20 4e 55   = (segPtr == NU
6420: 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  LL);..    /*.   
6430: 20 20 2a 20 57 65 27 72 65 20 61 74 20 74 68 65    * We're at the
6440: 20 65 6e 64 20 6f 66 20 74 68 65 20 64 69 73 70   end of the disp
6450: 6c 61 79 20 6c 69 6e 65 2e 20 20 54 68 72 6f 77  lay line.  Throw
6460: 20 61 77 61 79 20 65 76 65 72 79 74 68 69 6e 67   away everything
6470: 0a 20 20 20 20 20 2a 20 61 66 74 65 72 20 74 68  .     * after th
6480: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 77 6f  e most recent wo
6490: 72 64 20 62 72 65 61 6b 2c 20 69 66 20 74 68 65  rd break, if the
64a0: 72 65 20 69 73 20 6f 6e 65 3b 20 20 74 68 69 73  re is one;  this
64b0: 20 6d 61 79 0a 20 20 20 20 20 2a 20 70 6f 74 65   may.     * pote
64c0: 6e 74 69 61 6c 6c 79 20 72 65 71 75 69 72 65 20  ntially require 
64d0: 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 74  the last chunk t
64e0: 6f 20 62 65 20 6c 61 79 65 64 20 6f 75 74 20 61  o be layed out a
64f0: 67 61 69 6e 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  gain..     */.. 
6500: 20 20 20 69 66 20 28 62 72 65 61 6b 43 68 75 6e     if (breakChun
6510: 6b 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  kPtr == NULL) {.
6520: 09 2f 2a 0a 09 20 2a 20 54 68 69 73 20 63 6f 64  ./*.. * This cod
6530: 65 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61  e makes sure tha
6540: 74 20 77 65 20 64 6f 6e 27 74 20 61 63 63 69 64  t we don't accid
6550: 65 6e 74 61 6c 6c 79 20 64 69 73 70 6c 61 79 0a  entally display.
6560: 09 20 2a 20 63 68 75 6e 6b 73 20 77 69 74 68 20  . * chunks with 
6570: 6e 6f 20 63 68 61 72 61 63 74 65 72 73 20 61 74  no characters at
6580: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
6590: 6c 69 6e 65 20 28 73 75 63 68 20 61 73 0a 09 20  line (such as.. 
65a0: 2a 20 74 68 65 20 69 6e 73 65 72 74 69 6f 6e 20  * the insertion 
65b0: 63 75 72 73 6f 72 29 2e 20 20 54 68 65 73 65 20  cursor).  These 
65c0: 63 68 75 6e 6b 73 20 62 65 6c 6f 6e 67 20 6f 6e  chunks belong on
65d0: 20 74 68 65 20 6e 65 78 74 0a 09 20 2a 20 6c 69   the next.. * li
65e0: 6e 65 2e 20 20 53 6f 2c 20 74 68 72 6f 77 20 61  ne.  So, throw a
65f0: 77 61 79 20 65 76 65 72 79 74 68 69 6e 67 20 61  way everything a
6600: 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 63 68  fter the last ch
6610: 75 6e 6b 20 74 68 61 74 0a 09 20 2a 20 68 61 73  unk that.. * has
6620: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 69   characters in i
6630: 74 2e 0a 09 20 2a 2f 0a 0a 09 62 72 65 61 6b 43  t... */...breakC
6640: 68 75 6e 6b 50 74 72 20 3d 20 6c 61 73 74 43 68  hunkPtr = lastCh
6650: 61 72 43 68 75 6e 6b 50 74 72 3b 0a 09 62 72 65  arChunkPtr;..bre
6660: 61 6b 43 68 61 72 4f 66 66 73 65 74 20 3d 20 62  akCharOffset = b
6670: 72 65 61 6b 43 68 75 6e 6b 50 74 72 2d 3e 6e 75  reakChunkPtr->nu
6680: 6d 43 68 61 72 73 3b 0a 20 20 20 20 7d 0a 20 20  mChars;.    }.  
6690: 20 20 69 66 20 28 28 62 72 65 61 6b 43 68 75 6e    if ((breakChun
66a0: 6b 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 26 26  kPtr != NULL) &&
66b0: 20 28 28 6c 61 73 74 43 68 75 6e 6b 50 74 72 20   ((lastChunkPtr 
66c0: 21 3d 20 62 72 65 61 6b 43 68 75 6e 6b 50 74 72  != breakChunkPtr
66d0: 29 0a 09 20 20 20 20 7c 7c 20 28 62 72 65 61 6b  )..    || (break
66e0: 43 68 61 72 4f 66 66 73 65 74 20 21 3d 20 6c 61  CharOffset != la
66f0: 73 74 43 68 75 6e 6b 50 74 72 2d 3e 6e 75 6d 43  stChunkPtr->numC
6700: 68 61 72 73 29 29 29 20 7b 0a 09 77 68 69 6c 65  hars))) {..while
6710: 20 28 31 29 20 7b 0a 09 20 20 20 20 63 68 75 6e   (1) {..    chun
6720: 6b 50 74 72 20 3d 20 62 72 65 61 6b 43 68 75 6e  kPtr = breakChun
6730: 6b 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b 0a 09  kPtr->nextPtr;..
6740: 20 20 20 20 69 66 20 28 63 68 75 6e 6b 50 74 72      if (chunkPtr
6750: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 62 72   == NULL) {...br
6760: 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  eak;..    }..   
6770: 20 62 72 65 61 6b 43 68 75 6e 6b 50 74 72 2d 3e   breakChunkPtr->
6780: 6e 65 78 74 50 74 72 20 3d 20 63 68 75 6e 6b 50  nextPtr = chunkP
6790: 74 72 2d 3e 6e 65 78 74 50 74 72 3b 0a 09 20 20  tr->nextPtr;..  
67a0: 20 20 28 2a 63 68 75 6e 6b 50 74 72 2d 3e 75 6e    (*chunkPtr->un
67b0: 64 69 73 70 6c 61 79 50 72 6f 63 29 28 74 65 78  displayProc)(tex
67c0: 74 50 74 72 2c 20 63 68 75 6e 6b 50 74 72 29 3b  tPtr, chunkPtr);
67d0: 0a 09 20 20 20 20 63 6b 66 72 65 65 28 28 63 68  ..    ckfree((ch
67e0: 61 72 20 2a 29 20 63 68 75 6e 6b 50 74 72 29 3b  ar *) chunkPtr);
67f0: 0a 09 7d 0a 09 69 66 20 28 62 72 65 61 6b 43 68  ..}..if (breakCh
6800: 61 72 4f 66 66 73 65 74 20 21 3d 20 62 72 65 61  arOffset != brea
6810: 6b 43 68 75 6e 6b 50 74 72 2d 3e 6e 75 6d 43 68  kChunkPtr->numCh
6820: 61 72 73 29 20 7b 0a 09 20 20 20 20 28 2a 62 72  ars) {..    (*br
6830: 65 61 6b 43 68 75 6e 6b 50 74 72 2d 3e 75 6e 64  eakChunkPtr->und
6840: 69 73 70 6c 61 79 50 72 6f 63 29 28 74 65 78 74  isplayProc)(text
6850: 50 74 72 2c 20 62 72 65 61 6b 43 68 75 6e 6b 50  Ptr, breakChunkP
6860: 74 72 29 3b 0a 09 20 20 20 20 73 65 67 50 74 72  tr);..    segPtr
6870: 20 3d 20 54 6b 54 65 78 74 49 6e 64 65 78 54 6f   = TkTextIndexTo
6880: 53 65 67 28 26 62 72 65 61 6b 49 6e 64 65 78 2c  Seg(&breakIndex,
6890: 20 26 6f 66 66 73 65 74 29 3b 0a 09 20 20 20 20   &offset);..    
68a0: 28 2a 73 65 67 50 74 72 2d 3e 74 79 70 65 50 74  (*segPtr->typePt
68b0: 72 2d 3e 6c 61 79 6f 75 74 50 72 6f 63 29 28 74  r->layoutProc)(t
68c0: 65 78 74 50 74 72 2c 20 26 62 72 65 61 6b 49 6e  extPtr, &breakIn
68d0: 64 65 78 2c 0a 09 09 20 20 20 20 73 65 67 50 74  dex,...    segPt
68e0: 72 2c 20 6f 66 66 73 65 74 2c 20 6d 61 78 58 2c  r, offset, maxX,
68f0: 20 62 72 65 61 6b 43 68 61 72 4f 66 66 73 65 74   breakCharOffset
6900: 2c 20 30 2c 0a 09 09 20 20 20 20 77 72 61 70 4d  , 0,...    wrapM
6910: 6f 64 65 2c 20 62 72 65 61 6b 43 68 75 6e 6b 50  ode, breakChunkP
6920: 74 72 29 3b 0a 09 7d 0a 09 6c 61 73 74 43 68 75  tr);..}..lastChu
6930: 6e 6b 50 74 72 20 3d 20 62 72 65 61 6b 43 68 75  nkPtr = breakChu
6940: 6e 6b 50 74 72 3b 0a 09 77 68 6f 6c 65 4c 69 6e  nkPtr;..wholeLin
6950: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 0;.    }..  
6960: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b 65    /*.     * Make
6970: 20 74 61 62 20 61 64 6a 75 73 74 6d 65 6e 74 73   tab adjustments
6980: 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 74 61   for the last ta
6990: 62 20 73 74 6f 70 2c 20 69 66 20 74 68 65 72 65  b stop, if there
69a0: 20 69 73 20 6f 6e 65 2e 0a 20 20 20 20 20 2a 2f   is one..     */
69b0: 0a 0a 20 20 20 20 69 66 20 28 28 74 61 62 49 6e  ..    if ((tabIn
69c0: 64 65 78 20 3e 3d 20 30 29 20 26 26 20 28 74 61  dex >= 0) && (ta
69d0: 62 43 68 75 6e 6b 50 74 72 20 21 3d 20 4e 55 4c  bChunkPtr != NUL
69e0: 4c 29 29 20 7b 0a 09 41 64 6a 75 73 74 46 6f 72  L)) {..AdjustFor
69f0: 54 61 62 28 74 65 78 74 50 74 72 2c 20 74 61 62  Tab(textPtr, tab
6a00: 41 72 72 61 79 50 74 72 2c 20 74 61 62 49 6e 64  ArrayPtr, tabInd
6a10: 65 78 2c 20 74 61 62 43 68 75 6e 6b 50 74 72 29  ex, tabChunkPtr)
6a20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
6a30: 20 20 20 20 20 2a 20 4d 61 6b 65 20 6f 6e 65 20       * Make one 
6a40: 6d 6f 72 65 20 70 61 73 73 20 6f 76 65 72 20 74  more pass over t
6a50: 68 65 20 6c 69 6e 65 20 74 6f 20 72 65 63 6f 6d  he line to recom
6a60: 70 75 74 65 20 76 61 72 69 6f 75 73 20 74 68 69  pute various thi
6a70: 6e 67 73 0a 20 20 20 20 20 2a 20 6c 69 6b 65 20  ngs.     * like 
6a80: 69 74 73 20 68 65 69 67 68 74 2c 20 6c 65 6e 67  its height, leng
6a90: 74 68 2c 20 61 6e 64 20 74 6f 74 61 6c 20 6e 75  th, and total nu
6aa0: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
6ab0: 72 73 2e 20 20 41 6c 73 6f 0a 20 20 20 20 20 2a  rs.  Also.     *
6ac0: 20 6d 6f 64 69 66 79 20 74 68 65 20 78 2d 6c 6f   modify the x-lo
6ad0: 63 61 74 69 6f 6e 73 20 6f 66 20 63 68 75 6e 6b  cations of chunk
6ae0: 73 20 74 6f 20 72 65 66 6c 65 63 74 20 6a 75 73  s to reflect jus
6af0: 74 69 66 69 63 61 74 69 6f 6e 2e 0a 20 20 20 20  tification..    
6b00: 20 2a 20 49 66 20 77 65 27 72 65 20 6e 6f 74 20   * If we're not 
6b10: 77 72 61 70 70 69 6e 67 2c 20 49 27 6d 20 6e 6f  wrapping, I'm no
6b20: 74 20 73 75 72 65 20 77 68 61 74 20 69 73 20 74  t sure what is t
6b30: 68 65 20 62 65 73 74 20 77 61 79 20 74 6f 0a 20  he best way to. 
6b40: 20 20 20 20 2a 20 68 61 6e 64 6c 65 20 6c 65 66      * handle lef
6b50: 74 20 61 6e 64 20 63 65 6e 74 65 72 20 6a 75 73  t and center jus
6b60: 74 69 66 69 63 61 74 69 6f 6e 3a 20 20 73 68 6f  tification:  sho
6b70: 75 6c 64 20 74 68 65 20 74 6f 74 61 6c 20 6c 65  uld the total le
6b80: 6e 67 74 68 2c 0a 20 20 20 20 20 2a 20 66 6f 72  ngth,.     * for
6b90: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 6a 75 73   purposes of jus
6ba0: 74 69 66 69 63 61 74 69 6f 6e 2c 20 62 65 20 28  tification, be (
6bb0: 61 29 20 74 68 65 20 77 69 6e 64 6f 77 20 77 69  a) the window wi
6bc0: 64 74 68 2c 20 28 62 29 0a 20 20 20 20 20 2a 20  dth, (b).     * 
6bd0: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
6be0: 65 20 6c 6f 6e 67 65 73 74 20 6c 69 6e 65 20 69  e longest line i
6bf0: 6e 20 74 68 65 20 77 69 6e 64 6f 77 2c 20 6f 72  n the window, or
6c00: 20 28 63 29 20 74 68 65 20 6c 65 6e 67 74 68 0a   (c) the length.
6c10: 20 20 20 20 20 2a 20 6f 66 20 74 68 65 20 6c 6f       * of the lo
6c20: 6e 67 65 73 74 20 6c 69 6e 65 20 69 6e 20 74 68  ngest line in th
6c30: 65 20 74 65 78 74 3f 20 20 28 63 29 20 69 73 6e  e text?  (c) isn
6c40: 27 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 28 62  't available, (b
6c50: 29 20 73 65 65 6d 73 0a 20 20 20 20 20 2a 20 77  ) seems.     * w
6c60: 65 69 72 64 2c 20 73 69 6e 63 65 20 69 74 20 63  eird, since it c
6c70: 61 6e 20 63 68 61 6e 67 65 20 77 69 74 68 20 76  an change with v
6c80: 65 72 74 69 63 61 6c 20 73 63 72 6f 6c 6c 69 6e  ertical scrollin
6c90: 67 2c 20 73 6f 20 28 61 29 20 69 73 0a 20 20 20  g, so (a) is.   
6ca0: 20 20 2a 20 77 68 61 74 20 69 73 20 69 6d 70 6c    * what is impl
6cb0: 65 6d 65 6e 74 65 64 20 62 65 6c 6f 77 2e 0a 20  emented below.. 
6cc0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28      */..    if (
6cd0: 77 72 61 70 4d 6f 64 65 20 3d 3d 20 74 6b 54 65  wrapMode == tkTe
6ce0: 78 74 4e 6f 6e 65 55 69 64 29 20 7b 0a 09 6d 61  xtNoneUid) {..ma
6cf0: 78 58 20 3d 20 74 65 78 74 50 74 72 2d 3e 64 49  xX = textPtr->dI
6d00: 6e 66 6f 50 74 72 2d 3e 6d 61 78 58 20 2d 20 74  nfoPtr->maxX - t
6d10: 65 78 74 50 74 72 2d 3e 64 49 6e 66 6f 50 74 72  extPtr->dInfoPtr
6d20: 2d 3e 78 20 2d 20 72 4d 61 72 67 69 6e 3b 0a 20  ->x - rMargin;. 
6d30: 20 20 20 7d 0a 20 20 20 20 64 6c 50 74 72 2d 3e     }.    dlPtr->
6d40: 6c 65 6e 67 74 68 20 3d 20 6c 61 73 74 43 68 75  length = lastChu
6d50: 6e 6b 50 74 72 2d 3e 78 20 2b 20 6c 61 73 74 43  nkPtr->x + lastC
6d60: 68 75 6e 6b 50 74 72 2d 3e 77 69 64 74 68 3b 0a  hunkPtr->width;.
6d70: 20 20 20 20 69 66 20 28 6a 75 73 74 69 66 79 20      if (justify 
6d80: 3d 3d 20 54 4b 5f 4a 55 53 54 49 46 59 5f 4c 45  == TK_JUSTIFY_LE
6d90: 46 54 29 20 7b 0a 09 6a 49 6e 64 65 6e 74 20 3d  FT) {..jIndent =
6da0: 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69   0;.    } else i
6db0: 66 20 28 6a 75 73 74 69 66 79 20 3d 3d 20 54 4b  f (justify == TK
6dc0: 5f 4a 55 53 54 49 46 59 5f 52 49 47 48 54 29 20  _JUSTIFY_RIGHT) 
6dd0: 7b 0a 09 6a 49 6e 64 65 6e 74 20 3d 20 6d 61 78  {..jIndent = max
6de0: 58 20 2d 20 64 6c 50 74 72 2d 3e 6c 65 6e 67 74  X - dlPtr->lengt
6df0: 68 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  h;.    } else {.
6e00: 09 6a 49 6e 64 65 6e 74 20 3d 20 28 6d 61 78 58  .jIndent = (maxX
6e10: 20 2d 20 64 6c 50 74 72 2d 3e 6c 65 6e 67 74 68   - dlPtr->length
6e20: 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  )/2;.    }.    f
6e30: 6f 72 20 28 63 68 75 6e 6b 50 74 72 20 3d 20 64  or (chunkPtr = d
6e40: 6c 50 74 72 2d 3e 63 68 75 6e 6b 50 74 72 3b 20  lPtr->chunkPtr; 
6e50: 63 68 75 6e 6b 50 74 72 20 21 3d 20 4e 55 4c 4c  chunkPtr != NULL
6e60: 3b 0a 09 20 20 20 20 63 68 75 6e 6b 50 74 72 20  ;..    chunkPtr 
6e70: 3d 20 63 68 75 6e 6b 50 74 72 2d 3e 6e 65 78 74  = chunkPtr->next
6e80: 50 74 72 29 20 7b 0a 09 63 68 75 6e 6b 50 74 72  Ptr) {..chunkPtr
6e90: 2d 3e 78 20 2b 3d 20 6a 49 6e 64 65 6e 74 3b 0a  ->x += jIndent;.
6ea0: 09 64 6c 50 74 72 2d 3e 63 6f 75 6e 74 20 2b 3d  .dlPtr->count +=
6eb0: 20 63 68 75 6e 6b 50 74 72 2d 3e 6e 75 6d 43 68   chunkPtr->numCh
6ec0: 61 72 73 3b 0a 09 69 66 20 28 63 68 75 6e 6b 50  ars;..if (chunkP
6ed0: 74 72 2d 3e 6d 69 6e 48 65 69 67 68 74 20 3e 20  tr->minHeight > 
6ee0: 64 6c 50 74 72 2d 3e 68 65 69 67 68 74 29 20 7b  dlPtr->height) {
6ef0: 0a 09 20 20 20 20 64 6c 50 74 72 2d 3e 68 65 69  ..    dlPtr->hei
6f00: 67 68 74 20 3d 20 63 68 75 6e 6b 50 74 72 2d 3e  ght = chunkPtr->
6f10: 6d 69 6e 48 65 69 67 68 74 3b 0a 09 7d 0a 20 20  minHeight;..}.  
6f20: 20 20 7d 0a 20 20 20 20 73 56 61 6c 75 65 50 74    }.    sValuePt
6f30: 72 20 3d 20 64 6c 50 74 72 2d 3e 63 68 75 6e 6b  r = dlPtr->chunk
6f40: 50 74 72 2d 3e 73 74 79 6c 65 50 74 72 2d 3e 73  Ptr->stylePtr->s
6f50: 56 61 6c 75 65 50 74 72 3b 0a 20 20 20 20 69 66  ValuePtr;.    if
6f60: 20 28 64 6c 50 74 72 2d 3e 69 6e 64 65 78 2e 63   (dlPtr->index.c
6f70: 68 61 72 49 6e 64 65 78 20 3d 3d 20 30 29 20 7b  harIndex == 0) {
6f80: 0a 09 64 6c 50 74 72 2d 3e 73 70 61 63 65 41 62  ..dlPtr->spaceAb
6f90: 6f 76 65 20 3d 20 73 56 61 6c 75 65 50 74 72 2d  ove = sValuePtr-
6fa0: 3e 73 70 61 63 69 6e 67 31 3b 0a 20 20 20 20 7d  >spacing1;.    }
6fb0: 20 65 6c 73 65 20 7b 0a 09 64 6c 50 74 72 2d 3e   else {..dlPtr->
6fc0: 73 70 61 63 65 41 62 6f 76 65 20 3d 20 73 56 61  spaceAbove = sVa
6fd0: 6c 75 65 50 74 72 2d 3e 73 70 61 63 69 6e 67 32  luePtr->spacing2
6fe0: 20 2d 20 73 56 61 6c 75 65 50 74 72 2d 3e 73 70   - sValuePtr->sp
6ff0: 61 63 69 6e 67 32 2f 32 3b 0a 20 20 20 20 7d 0a  acing2/2;.    }.
7000: 20 20 20 20 69 66 20 28 77 68 6f 6c 65 4c 69 6e      if (wholeLin
7010: 65 29 20 7b 0a 09 64 6c 50 74 72 2d 3e 73 70 61  e) {..dlPtr->spa
7020: 63 65 42 65 6c 6f 77 20 3d 20 73 56 61 6c 75 65  ceBelow = sValue
7030: 50 74 72 2d 3e 73 70 61 63 69 6e 67 33 3b 0a 20  Ptr->spacing3;. 
7040: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 64 6c 50     } else {..dlP
7050: 74 72 2d 3e 73 70 61 63 65 42 65 6c 6f 77 20 3d  tr->spaceBelow =
7060: 20 73 56 61 6c 75 65 50 74 72 2d 3e 73 70 61 63   sValuePtr->spac
7070: 69 6e 67 32 2f 32 3b 0a 20 20 20 20 7d 0a 20 20  ing2/2;.    }.  
7080: 20 20 64 6c 50 74 72 2d 3e 68 65 69 67 68 74 20    dlPtr->height 
7090: 3d 20 31 20 2b 20 64 6c 50 74 72 2d 3e 73 70 61  = 1 + dlPtr->spa
70a0: 63 65 41 62 6f 76 65 20 2b 20 64 6c 50 74 72 2d  ceAbove + dlPtr-
70b0: 3e 73 70 61 63 65 42 65 6c 6f 77 3b 0a 0a 20 20  >spaceBelow;..  
70c0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 52 65 63 6f    /*.     * Reco
70d0: 6d 70 75 74 65 20 6c 69 6e 65 20 6c 65 6e 67 74  mpute line lengt
70e0: 68 3a 20 20 6d 61 79 20 68 61 76 65 20 63 68 61  h:  may have cha
70f0: 6e 67 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  nged because of 
7100: 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 2e 0a 20  justification.. 
7110: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 64 6c 50 74      */..    dlPt
7120: 72 2d 3e 6c 65 6e 67 74 68 20 3d 20 6c 61 73 74  r->length = last
7130: 43 68 75 6e 6b 50 74 72 2d 3e 78 20 2b 20 6c 61  ChunkPtr->x + la
7140: 73 74 43 68 75 6e 6b 50 74 72 2d 3e 77 69 64 74  stChunkPtr->widt
7150: 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 64 6c  h;.    return dl
7160: 50 74 72 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  Ptr;.}.../*. *--
7170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71b0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 70 64 61 74  ----. *. * Updat
71c0: 65 44 69 73 70 6c 61 79 49 6e 66 6f 20 2d 2d 0a  eDisplayInfo --.
71d0: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
71e0: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  dure is invoked 
71f0: 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 73 6f 6d  to recompute som
7200: 65 20 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a  e or all of the.
7210: 20 2a 09 44 4c 69 6e 65 20 73 74 72 75 63 74 75   *.DLine structu
7220: 72 65 73 20 66 6f 72 20 61 20 74 65 78 74 20 77  res for a text w
7230: 69 64 67 65 74 2e 20 20 41 74 20 74 68 65 20 74  idget.  At the t
7240: 69 6d 65 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ime it is called
7250: 0a 20 2a 09 74 68 65 20 44 4c 69 6e 65 20 73 74  . *.the DLine st
7260: 72 75 63 74 75 72 65 73 20 73 74 69 6c 6c 20 6c  ructures still l
7270: 65 66 74 20 69 6e 20 74 68 65 20 77 69 64 67 65  eft in the widge
7280: 74 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  t are guaranteed
7290: 0a 20 2a 09 74 6f 20 62 65 20 63 6f 72 72 65 63  . *.to be correc
72a0: 74 20 65 78 63 65 70 74 20 74 68 61 74 20 28 61  t except that (a
72b0: 29 20 74 68 65 20 79 2d 63 6f 6f 72 64 69 6e 61  ) the y-coordina
72c0: 74 65 73 20 61 72 65 6e 27 74 0a 20 2a 09 6e 65  tes aren't. *.ne
72d0: 63 65 73 73 61 72 69 6c 79 20 63 6f 72 72 65 63  cessarily correc
72e0: 74 2c 20 28 62 29 20 74 68 65 72 65 20 6d 61 79  t, (b) there may
72f0: 20 62 65 20 6d 69 73 73 69 6e 67 20 73 74 72 75   be missing stru
7300: 63 74 75 72 65 73 0a 20 2a 09 28 74 68 65 20 44  ctures. *.(the D
7310: 4c 69 6e 65 20 73 74 72 75 63 74 75 72 65 73 20  Line structures 
7320: 67 65 74 20 72 65 6d 6f 76 65 64 20 61 73 20 73  get removed as s
7330: 6f 6f 6e 20 61 73 20 74 68 65 79 20 61 72 65 20  oon as they are 
7340: 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 2a 09 6f  potentially. *.o
7350: 75 74 2d 6f 66 2d 64 61 74 65 29 2c 20 61 6e 64  ut-of-date), and
7360: 20 28 63 29 20 44 4c 69 6e 65 20 73 74 72 75 63   (c) DLine struc
7370: 74 75 72 65 73 20 74 68 61 74 20 64 6f 6e 27 74  tures that don't
7380: 20 73 74 61 72 74 20 61 74 20 74 68 65 0a 20 2a   start at the. *
7390: 09 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20  .beginning of a 
73a0: 6c 69 6e 65 20 6d 61 79 20 62 65 20 69 6e 63 6f  line may be inco
73b0: 72 72 65 63 74 20 69 66 20 70 72 65 76 69 6f 75  rrect if previou
73c0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  s information in
73d0: 0a 20 2a 09 74 68 65 20 73 61 6d 65 20 6c 69 6e  . *.the same lin
73e0: 65 20 63 68 61 6e 67 65 64 20 73 69 7a 65 20 69  e changed size i
73f0: 6e 20 61 20 77 61 79 20 74 68 61 74 20 6d 6f 76  n a way that mov
7400: 65 64 20 61 20 6c 69 6e 65 20 62 6f 75 6e 64 61  ed a line bounda
7410: 72 79 0a 20 2a 09 28 44 4c 69 6e 65 73 20 66 6f  ry. *.(DLines fo
7420: 72 20 61 6e 79 20 69 6e 66 6f 20 74 68 61 74 20  r any info that 
7430: 63 68 61 6e 67 65 64 20 77 69 6c 6c 20 68 61 76  changed will hav
7440: 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20  e been deleted, 
7450: 62 75 74 0a 20 2a 09 6e 6f 74 20 44 4c 69 6e 65  but. *.not DLine
7460: 73 20 66 6f 72 20 75 6e 63 68 61 6e 67 65 64 20  s for unchanged 
7470: 69 6e 66 6f 20 69 6e 20 74 68 65 20 73 61 6d 65  info in the same
7480: 20 74 65 78 74 20 6c 69 6e 65 29 2e 0a 20 2a 0a   text line).. *.
7490: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
74a0: 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  one.. *. * Side 
74b0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 55 70 6f 6e  effects:. *.Upon
74c0: 20 72 65 74 75 72 6e 2c 20 74 68 65 20 44 4c 69   return, the DLi
74d0: 6e 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ne information f
74e0: 6f 72 20 74 65 78 74 50 74 72 20 63 6f 72 72 65  or textPtr corre
74f0: 63 74 6c 79 20 72 65 66 6c 65 63 74 73 0a 20 2a  ctly reflects. *
7500: 09 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 77  .the positions w
7510: 68 65 72 65 20 63 68 61 72 61 63 74 65 72 73 20  here characters 
7520: 77 69 6c 6c 20 62 65 20 64 69 73 70 6c 61 79 65  will be displaye
7530: 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 74 68 69  d.  However, thi
7540: 73 0a 20 2a 09 70 72 6f 63 65 64 75 72 65 20 64  s. *.procedure d
7550: 6f 65 73 6e 27 74 20 61 63 74 75 61 6c 6c 79 20  oesn't actually 
7560: 62 72 69 6e 67 20 74 68 65 20 64 69 73 70 6c 61  bring the displa
7570: 79 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 20 2a  y up-to-date.. *
7580: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
7590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
75d0: 74 61 74 69 63 20 76 6f 69 64 0a 55 70 64 61 74  tatic void.Updat
75e0: 65 44 69 73 70 6c 61 79 49 6e 66 6f 28 74 65 78  eDisplayInfo(tex
75f0: 74 50 74 72 29 0a 20 20 20 20 54 6b 54 65 78 74  tPtr).    TkText
7600: 20 2a 74 65 78 74 50 74 72 3b 09 09 09 2f 2a 20   *textPtr;.../* 
7610: 54 65 78 74 20 77 69 64 67 65 74 20 74 6f 20 75  Text widget to u
7620: 70 64 61 74 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20  pdate. */.{.    
7630: 72 65 67 69 73 74 65 72 20 44 49 6e 66 6f 20 2a  register DInfo *
7640: 64 49 6e 66 6f 50 74 72 20 3d 20 74 65 78 74 50  dInfoPtr = textP
7650: 74 72 2d 3e 64 49 6e 66 6f 50 74 72 3b 0a 20 20  tr->dInfoPtr;.  
7660: 20 20 72 65 67 69 73 74 65 72 20 44 4c 69 6e 65    register DLine
7670: 20 2a 64 6c 50 74 72 2c 20 2a 70 72 65 76 50 74   *dlPtr, *prevPt
7680: 72 3b 0a 20 20 20 20 54 6b 54 65 78 74 49 6e 64  r;.    TkTextInd
7690: 65 78 20 69 6e 64 65 78 3b 0a 20 20 20 20 54 6b  ex index;.    Tk
76a0: 54 65 78 74 4c 69 6e 65 20 2a 6c 61 73 74 4c 69  TextLine *lastLi
76b0: 6e 65 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 79  nePtr;.    int y
76c0: 2c 20 6d 61 78 59 2c 20 70 69 78 65 6c 4f 66 66  , maxY, pixelOff
76d0: 73 65 74 2c 20 6d 61 78 4f 66 66 73 65 74 3b 0a  set, maxOffset;.
76e0: 0a 20 20 20 20 69 66 20 28 21 28 64 49 6e 66 6f  .    if (!(dInfo
76f0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 44 49 4e  Ptr->flags & DIN
7700: 46 4f 5f 4f 55 54 5f 4f 46 5f 44 41 54 45 29 29  FO_OUT_OF_DATE))
7710: 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20   {..return;.    
7720: 7d 0a 20 20 20 20 64 49 6e 66 6f 50 74 72 2d 3e  }.    dInfoPtr->
7730: 66 6c 61 67 73 20 26 3d 20 7e 44 49 4e 46 4f 5f  flags &= ~DINFO_
7740: 4f 55 54 5f 4f 46 5f 44 41 54 45 3b 0a 0a 20 20  OUT_OF_DATE;..  
7750: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 44 65 6c 65    /*.     * Dele
7760: 74 65 20 61 6e 79 20 44 4c 69 6e 65 73 20 74 68  te any DLines th
7770: 61 74 20 61 72 65 20 6e 6f 77 20 61 62 6f 76 65  at are now above
7780: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
7790: 77 69 6e 64 6f 77 2e 0a 20 20 20 20 20 2a 2f 0a  window..     */.
77a0: 0a 20 20 20 20 69 6e 64 65 78 20 3d 20 74 65 78  .    index = tex
77b0: 74 50 74 72 2d 3e 74 6f 70 49 6e 64 65 78 3b 0a  tPtr->topIndex;.
77c0: 20 20 20 20 64 6c 50 74 72 20 3d 20 46 69 6e 64      dlPtr = Find
77d0: 44 4c 69 6e 65 28 64 49 6e 66 6f 50 74 72 2d 3e  DLine(dInfoPtr->
77e0: 64 4c 69 6e 65 50 74 72 2c 20 26 69 6e 64 65 78  dLinePtr, &index
77f0: 29 3b 0a 20 20 20 20 69 66 20 28 28 64 6c 50 74  );.    if ((dlPt
7800: 72 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 28 64  r != NULL) && (d
7810: 6c 50 74 72 20 21 3d 20 64 49 6e 66 6f 50 74 72  lPtr != dInfoPtr
7820: 2d 3e 64 4c 69 6e 65 50 74 72 29 29 20 7b 0a 09  ->dLinePtr)) {..
7830: 46 72 65 65 44 4c 69 6e 65 73 28 74 65 78 74 50  FreeDLines(textP
7840: 74 72 2c 20 64 49 6e 66 6f 50 74 72 2d 3e 64 4c  tr, dInfoPtr->dL
7850: 69 6e 65 50 74 72 2c 20 64 6c 50 74 72 2c 20 31  inePtr, dlPtr, 1
7860: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
7870: 0a 20 20 20 20 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .     *---------
7880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78b0: 2d 2d 2d 2d 2d 0a 20 20 20 20 20 2a 20 53 63 61  -----.     * Sca
78c0: 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f  n through the co
78d0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 77 69  ntents of the wi
78e0: 6e 64 6f 77 20 66 72 6f 6d 20 74 6f 70 20 74 6f  ndow from top to
78f0: 20 62 6f 74 74 6f 6d 2c 0a 20 20 20 20 20 2a 20   bottom,.     * 
7900: 72 65 63 6f 6d 70 75 74 69 6e 67 20 69 6e 66 6f  recomputing info
7910: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6c 69 6e 65  rmation for line
7920: 73 20 74 68 61 74 20 61 72 65 20 6d 69 73 73 69  s that are missi
7930: 6e 67 2e 0a 20 20 20 20 20 2a 2d 2d 2d 2d 2d 2d  ng..     *------
7940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7970: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 20 20 20 2a 2f  --------.     */
7980: 0a 0a 20 20 20 20 6c 61 73 74 4c 69 6e 65 50 74  ..    lastLinePt
7990: 72 20 3d 20 54 6b 42 54 72 65 65 46 69 6e 64 4c  r = TkBTreeFindL
79a0: 69 6e 65 28 74 65 78 74 50 74 72 2d 3e 74 72 65  ine(textPtr->tre
79b0: 65 2c 0a 09 20 20 20 20 54 6b 42 54 72 65 65 4e  e,..    TkBTreeN
79c0: 75 6d 4c 69 6e 65 73 28 74 65 78 74 50 74 72 2d  umLines(textPtr-
79d0: 3e 74 72 65 65 29 29 3b 0a 20 20 20 20 64 6c 50  >tree));.    dlP
79e0: 74 72 20 3d 20 64 49 6e 66 6f 50 74 72 2d 3e 64  tr = dInfoPtr->d
79f0: 4c 69 6e 65 50 74 72 3b 0a 20 20 20 20 70 72 65  LinePtr;.    pre
7a00: 76 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  vPtr = NULL;.   
7a10: 20 79 20 3d 20 64 49 6e 66 6f 50 74 72 2d 3e 79   y = dInfoPtr->y
7a20: 3b 0a 20 20 20 20 6d 61 78 59 20 3d 20 64 49 6e  ;.    maxY = dIn
7a30: 66 6f 50 74 72 2d 3e 6d 61 78 59 3b 0a 20 20 20  foPtr->maxY;.   
7a40: 20 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 72 65   while (1) {..re
7a50: 67 69 73 74 65 72 20 44 4c 69 6e 65 20 2a 6e 65  gister DLine *ne
7a60: 77 50 74 72 3b 0a 0a 09 69 66 20 28 69 6e 64 65  wPtr;...if (inde
7a70: 78 2e 6c 69 6e 65 50 74 72 20 3d 3d 20 6c 61 73  x.linePtr == las
7a80: 74 4c 69 6e 65 50 74 72 29 20 7b 0a 09 20 20 20  tLinePtr) {..   
7a90: 20 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 0a   break;..}.../*.
7aa0: 09 20 2a 20 54 68 65 72 65 20 61 72 65 20 74 68  . * There are th
7ab0: 72 65 65 20 70 6f 73 73 69 62 69 6c 69 74 69 65  ree possibilitie
7ac0: 73 20 72 69 67 68 74 20 6e 6f 77 3a 0a 09 20 2a  s right now:.. *
7ad0: 20 28 61 29 20 74 68 65 20 6e 65 78 74 20 44 4c   (a) the next DL
7ae0: 69 6e 65 20 28 64 6c 50 74 72 29 20 63 6f 72 72  ine (dlPtr) corr
7af0: 65 73 70 6f 6e 64 73 20 65 78 61 63 74 6c 79 20  esponds exactly 
7b00: 74 6f 20 74 68 65 20 6e 65 78 74 0a 09 20 2a 20  to the next.. * 
7b10: 20 20 20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20      information 
7b20: 77 65 20 77 61 6e 74 20 74 6f 20 64 69 73 70 6c  we want to displ
7b30: 61 79 3a 20 6a 75 73 74 20 75 73 65 20 69 74 20  ay: just use it 
7b40: 61 73 2d 69 73 2e 0a 09 20 2a 20 28 62 29 20 74  as-is... * (b) t
7b50: 68 65 20 6e 65 78 74 20 44 4c 69 6e 65 20 63 6f  he next DLine co
7b60: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 20 64  rresponds to a d
7b70: 69 66 66 65 72 65 6e 74 20 6c 69 6e 65 2c 20 6f  ifferent line, o
7b80: 72 20 74 6f 0a 09 20 2a 20 20 20 20 20 61 20 73  r to.. *     a s
7b90: 65 67 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c  egment that will
7ba0: 20 62 65 20 63 6f 6d 69 6e 67 20 6c 61 74 65 72   be coming later
7bb0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6c 69 6e   in the same lin
7bc0: 65 3a 0a 09 20 2a 20 20 20 20 20 6c 65 61 76 65  e:.. *     leave
7bd0: 20 74 68 69 73 20 44 4c 69 6e 65 20 61 6c 6f 6e   this DLine alon
7be0: 65 20 69 6e 20 74 68 65 20 68 6f 70 65 73 20 74  e in the hopes t
7bf0: 68 61 74 20 77 65 27 6c 6c 20 62 65 20 61 62 6c  hat we'll be abl
7c00: 65 0a 09 20 2a 20 20 20 20 20 74 6f 20 75 73 65  e.. *     to use
7c10: 20 69 74 20 6c 61 74 65 72 2c 20 74 68 65 6e 20   it later, then 
7c20: 63 72 65 61 74 65 20 61 20 6e 65 77 20 44 4c 69  create a new DLi
7c30: 6e 65 20 69 6e 20 66 72 6f 6e 74 20 6f 66 0a 09  ne in front of..
7c40: 20 2a 20 20 20 20 20 69 74 2e 0a 09 20 2a 20 28   *     it... * (
7c50: 63 29 20 74 68 65 20 6e 65 78 74 20 44 4c 69 6e  c) the next DLin
7c60: 65 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  e corresponds to
7c70: 20 61 20 73 65 67 6d 65 6e 74 20 69 6e 20 74 68   a segment in th
7c80: 65 20 6c 69 6e 65 20 77 65 0a 09 20 2a 20 20 20  e line we.. *   
7c90: 20 20 77 61 6e 74 2c 20 62 75 74 20 69 74 27 73    want, but it's
7ca0: 20 61 20 73 65 67 6d 65 6e 74 20 74 68 61 74 20   a segment that 
7cb0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
7cc0: 20 70 72 6f 63 65 73 73 65 64 0a 09 20 2a 20 20   processed.. *  
7cd0: 20 20 20 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72     or will never
7ce0: 20 62 65 20 70 72 6f 63 65 73 73 65 64 2e 20 20   be processed.  
7cf0: 44 65 6c 65 74 65 20 74 68 65 20 44 4c 69 6e 65  Delete the DLine
7d00: 20 61 6e 64 20 74 72 79 0a 09 20 2a 20 20 20 20   and try.. *    
7d10: 20 61 67 61 69 6e 2e 0a 09 20 2a 0a 09 20 2a 20   again... *.. * 
7d20: 4f 6e 65 20 6f 74 68 65 72 20 74 77 69 73 74 20  One other twist 
7d30: 6f 6e 20 61 6c 6c 20 74 68 69 73 2e 20 20 49 74  on all this.  It
7d40: 27 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  's possible for 
7d50: 33 44 20 62 6f 72 64 65 72 73 0a 09 20 2a 20 74  3D borders.. * t
7d60: 6f 20 69 6e 74 65 72 61 63 74 20 62 65 74 77 65  o interact betwe
7d70: 65 6e 20 6c 69 6e 65 73 20 28 73 65 65 20 44 69  en lines (see Di
7d80: 73 70 6c 61 79 4c 69 6e 65 42 61 63 6b 67 72 6f  splayLineBackgro
7d90: 75 6e 64 29 20 73 6f 20 69 66 0a 09 20 2a 20 61  und) so if.. * a
7da0: 20 6c 69 6e 65 20 69 73 20 72 65 6c 61 79 65 64   line is relayed
7db0: 20 6f 75 74 20 61 6e 64 20 68 61 73 20 73 74 79   out and has sty
7dc0: 6c 65 73 20 77 69 74 68 20 33 44 20 62 6f 72 64  les with 3D bord
7dd0: 65 72 73 2c 20 69 74 73 0a 09 20 2a 20 6e 65 69  ers, its.. * nei
7de0: 67 68 62 6f 72 73 20 68 61 76 65 20 74 6f 20 62  ghbors have to b
7df0: 65 20 72 65 64 72 61 77 6e 20 69 66 20 74 68 65  e redrawn if the
7e00: 79 20 68 61 76 65 20 33 44 20 62 6f 72 64 65 72  y have 3D border
7e10: 73 20 74 6f 6f 2c 0a 09 20 2a 20 73 69 6e 63 65  s too,.. * since
7e20: 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e   the interaction
7e30: 73 20 63 6f 75 6c 64 20 68 61 76 65 20 63 68 61  s could have cha
7e40: 6e 67 65 64 20 28 74 68 65 20 6e 65 69 67 68 62  nged (the neighb
7e50: 6f 72 73 0a 09 20 2a 20 64 6f 6e 27 74 20 68 61  ors.. * don't ha
7e60: 76 65 20 74 6f 20 62 65 20 72 65 6c 61 79 65 64  ve to be relayed
7e70: 20 6f 75 74 2c 20 6a 75 73 74 20 72 65 64 72 61   out, just redra
7e80: 77 6e 29 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28  wn)... */...if (
7e90: 28 64 6c 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20  (dlPtr == NULL) 
7ea0: 7c 7c 20 28 64 6c 50 74 72 2d 3e 69 6e 64 65 78  || (dlPtr->index
7eb0: 2e 6c 69 6e 65 50 74 72 20 21 3d 20 69 6e 64 65  .linePtr != inde
7ec0: 78 2e 6c 69 6e 65 50 74 72 29 29 20 7b 0a 09 20  x.linePtr)) {.. 
7ed0: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 43 61     /*..     * Ca
7ee0: 73 65 20 28 62 29 20 2d 2d 20 6d 75 73 74 20 6d  se (b) -- must m
7ef0: 61 6b 65 20 6e 65 77 20 44 4c 69 6e 65 2e 0a 09  ake new DLine...
7f00: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 6d 61       */...    ma
7f10: 6b 65 4e 65 77 44 4c 69 6e 65 3a 0a 09 20 20 20  keNewDLine:..   
7f20: 20 69 66 20 28 74 6b 54 65 78 74 44 65 62 75 67   if (tkTextDebug
7f30: 29 20 7b 0a 09 09 63 68 61 72 20 73 74 72 69 6e  ) {...char strin
7f40: 67 5b 54 4b 5f 50 4f 53 5f 43 48 41 52 53 5d 3b  g[TK_POS_CHARS];
7f50: 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 44 65 62 75  ..../*... * Debu
7f60: 67 67 69 6e 67 20 69 73 20 65 6e 61 62 6c 65 64  gging is enabled
7f70: 2c 20 73 6f 20 6b 65 65 70 20 61 20 6c 6f 67 20  , so keep a log 
7f80: 6f 66 20 61 6c 6c 20 74 68 65 20 6c 69 6e 65 73  of all the lines
7f90: 0a 09 09 20 2a 20 74 68 61 74 20 77 65 72 65 20  ... * that were 
7fa0: 72 65 2d 6c 61 79 65 64 20 6f 75 74 2e 20 20 54  re-layed out.  T
7fb0: 68 65 20 74 65 73 74 20 73 75 69 74 65 20 75 73  he test suite us
7fc0: 65 73 20 74 68 69 73 0a 09 09 20 2a 20 69 6e 66  es this... * inf
7fd0: 6f 72 6d 61 74 69 6f 6e 2e 0a 09 09 20 2a 2f 0a  ormation.... */.
7fe0: 0a 09 09 54 6b 54 65 78 74 50 72 69 6e 74 49 6e  ...TkTextPrintIn
7ff0: 64 65 78 28 26 69 6e 64 65 78 2c 20 73 74 72 69  dex(&index, stri
8000: 6e 67 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61  ng);...Tcl_SetVa
8010: 72 32 28 74 65 78 74 50 74 72 2d 3e 69 6e 74 65  r2(textPtr->inte
8020: 72 70 2c 20 22 74 6b 5f 74 65 78 74 52 65 6c 61  rp, "tk_textRela
8030: 79 6f 75 74 22 2c 20 28 63 68 61 72 20 2a 29 20  yout", (char *) 
8040: 4e 55 4c 4c 2c 0a 09 09 09 73 74 72 69 6e 67 2c  NULL,....string,
8050: 0a 09 09 09 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  ....TCL_GLOBAL_O
8060: 4e 4c 59 7c 54 43 4c 5f 41 50 50 45 4e 44 5f 56  NLY|TCL_APPEND_V
8070: 41 4c 55 45 7c 54 43 4c 5f 4c 49 53 54 5f 45 4c  ALUE|TCL_LIST_EL
8080: 45 4d 45 4e 54 29 3b 0a 09 20 20 20 20 7d 0a 09  EMENT);..    }..
8090: 20 20 20 20 6e 65 77 50 74 72 20 3d 20 4c 61 79      newPtr = Lay
80a0: 6f 75 74 44 4c 69 6e 65 28 74 65 78 74 50 74 72  outDLine(textPtr
80b0: 2c 20 26 69 6e 64 65 78 29 3b 0a 09 20 20 20 20  , &index);..    
80c0: 69 66 20 28 70 72 65 76 50 74 72 20 3d 3d 20 4e  if (prevPtr == N
80d0: 55 4c 4c 29 20 7b 0a 09 09 64 49 6e 66 6f 50 74  ULL) {...dInfoPt
80e0: 72 2d 3e 64 4c 69 6e 65 50 74 72 20 3d 20 6e 65  r->dLinePtr = ne
80f0: 77 50 74 72 3b 0a 09 20 20 20 20 7d 20 65 6c 73  wPtr;..    } els
8100: 65 20 7b 0a 09 09 70 72 65 76 50 74 72 2d 3e 6e  e {...prevPtr->n
8110: 65 78 74 50 74 72 20 3d 20 6e 65 77 50 74 72 3b  extPtr = newPtr;
8120: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6e 65 77  ..    }..    new
8130: 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20 64  Ptr->nextPtr = d
8140: 6c 50 74 72 3b 0a 09 20 20 20 20 64 6c 50 74 72  lPtr;..    dlPtr
8150: 20 3d 20 6e 65 77 50 74 72 3b 0a 09 7d 20 65 6c   = newPtr;..} el
8160: 73 65 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20  se {..    /*..  
8170: 20 20 20 2a 20 44 6c 50 74 72 20 72 65 66 65 72     * DlPtr refer
8180: 73 20 74 6f 20 74 68 65 20 6c 69 6e 65 20 77 65  s to the line we
8190: 20 77 61 6e 74 2e 20 20 4e 65 78 74 20 63 68 65   want.  Next che
81a0: 63 6b 20 74 68 65 0a 09 20 20 20 20 20 2a 20 69  ck the..     * i
81b0: 6e 64 65 78 20 77 69 74 68 69 6e 20 74 68 65 20  ndex within the 
81c0: 6c 69 6e 65 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a  line...     */..
81d0: 09 20 20 20 20 69 66 20 28 69 6e 64 65 78 2e 63  .    if (index.c
81e0: 68 61 72 49 6e 64 65 78 20 3d 3d 20 64 6c 50 74  harIndex == dlPt
81f0: 72 2d 3e 69 6e 64 65 78 2e 63 68 61 72 49 6e 64  r->index.charInd
8200: 65 78 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20  ex) {.../*... * 
8210: 43 61 73 65 20 28 61 29 20 2d 2d 20 63 61 6e 20  Case (a) -- can 
8220: 75 73 65 20 65 78 69 73 74 69 6e 67 20 64 69 73  use existing dis
8230: 70 6c 61 79 20 6c 69 6e 65 20 61 73 2d 69 73 2e  play line as-is.
8240: 0a 09 09 20 2a 2f 0a 0a 09 09 67 6f 74 6f 20 6c  ... */....goto l
8250: 69 6e 65 4f 4b 3b 0a 09 20 20 20 20 7d 0a 09 20  ineOK;..    }.. 
8260: 20 20 20 69 66 20 28 69 6e 64 65 78 2e 63 68 61     if (index.cha
8270: 72 49 6e 64 65 78 20 3c 20 64 6c 50 74 72 2d 3e  rIndex < dlPtr->
8280: 69 6e 64 65 78 2e 63 68 61 72 49 6e 64 65 78 29  index.charIndex)
8290: 20 7b 0a 09 09 67 6f 74 6f 20 6d 61 6b 65 4e 65   {...goto makeNe
82a0: 77 44 4c 69 6e 65 3b 0a 09 20 20 20 20 7d 0a 0a  wDLine;..    }..
82b0: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
82c0: 43 61 73 65 20 28 63 29 20 2d 2d 20 64 6c 50 74  Case (c) -- dlPt
82d0: 72 20 69 73 20 75 73 65 6c 65 73 73 2e 20 20 44  r is useless.  D
82e0: 69 73 63 61 72 64 20 69 74 20 61 6e 64 20 73 74  iscard it and st
82f0: 61 72 74 0a 09 20 20 20 20 20 2a 20 61 67 61 69  art..     * agai
8300: 6e 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  n with the next 
8310: 64 69 73 70 6c 61 79 20 6c 69 6e 65 2e 0a 09 20  display line... 
8320: 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 6e 65 77      */...    new
8330: 50 74 72 20 3d 20 64 6c 50 74 72 2d 3e 6e 65 78  Ptr = dlPtr->nex
8340: 74 50 74 72 3b 0a 09 20 20 20 20 46 72 65 65 44  tPtr;..    FreeD
8350: 4c 69 6e 65 73 28 74 65 78 74 50 74 72 2c 20 64  Lines(textPtr, d
8360: 6c 50 74 72 2c 20 6e 65 77 50 74 72 2c 20 30 29  lPtr, newPtr, 0)
8370: 3b 0a 09 20 20 20 20 64 6c 50 74 72 20 3d 20 6e  ;..    dlPtr = n
8380: 65 77 50 74 72 3b 0a 09 20 20 20 20 69 66 20 28  ewPtr;..    if (
8390: 70 72 65 76 50 74 72 20 21 3d 20 4e 55 4c 4c 29  prevPtr != NULL)
83a0: 20 7b 0a 09 09 70 72 65 76 50 74 72 2d 3e 6e 65   {...prevPtr->ne
83b0: 78 74 50 74 72 20 3d 20 6e 65 77 50 74 72 3b 0a  xtPtr = newPtr;.
83c0: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
83d0: 64 49 6e 66 6f 50 74 72 2d 3e 64 4c 69 6e 65 50  dInfoPtr->dLineP
83e0: 74 72 20 3d 20 6e 65 77 50 74 72 3b 0a 09 20 20  tr = newPtr;..  
83f0: 20 20 7d 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75    }..    continu
8400: 65 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 41  e;..}.../*.. * A
8410: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 73 74  dvance to the st
8420: 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
8430: 6c 69 6e 65 2e 0a 09 20 2a 2f 0a 0a 09 6c 69 6e  line... */...lin
8440: 65 4f 4b 3a 0a 09 64 6c 50 74 72 2d 3e 79 20 3d  eOK:..dlPtr->y =
8450: 20 79 3b 0a 09 79 20 2b 3d 20 64 6c 50 74 72 2d   y;..y += dlPtr-
8460: 3e 68 65 69 67 68 74 3b 0a 09 54 6b 54 65 78 74  >height;..TkText
8470: 49 6e 64 65 78 46 6f 72 77 43 68 61 72 73 28 26  IndexForwChars(&
8480: 69 6e 64 65 78 2c 20 64 6c 50 74 72 2d 3e 63 6f  index, dlPtr->co
8490: 75 6e 74 2c 20 26 69 6e 64 65 78 29 3b 0a 09 70  unt, &index);..p
84a0: 72 65 76 50 74 72 20 3d 20 64 6c 50 74 72 3b 0a  revPtr = dlPtr;.
84b0: 09 64 6c 50 74 72 20 3d 20 64 6c 50 74 72 2d 3e  .dlPtr = dlPtr->
84c0: 6e 65 78 74 50 74 72 3b 0a 0a 09 2f 2a 0a 09 20  nextPtr;.../*.. 
84d0: 2a 20 49 66 20 77 65 20 73 77 69 74 63 68 65 64  * If we switched
84e0: 20 74 65 78 74 20 6c 69 6e 65 73 2c 20 64 65 6c   text lines, del
84f0: 65 74 65 20 61 6e 79 20 44 4c 69 6e 65 73 20 6c  ete any DLines l
8500: 65 66 74 20 66 6f 72 20 74 68 65 0a 09 20 2a 20  eft for the.. * 
8510: 6f 6c 64 20 74 65 78 74 20 6c 69 6e 65 2e 0a 09  old text line...
8520: 20 2a 2f 0a 0a 09 69 66 20 28 69 6e 64 65 78 2e   */...if (index.
8530: 6c 69 6e 65 50 74 72 20 21 3d 20 70 72 65 76 50  linePtr != prevP
8540: 74 72 2d 3e 69 6e 64 65 78 2e 6c 69 6e 65 50 74  tr->index.linePt
8550: 72 29 20 7b 0a 09 20 20 20 20 72 65 67 69 73 74  r) {..    regist
8560: 65 72 20 44 4c 69 6e 65 20 2a 6e 65 78 74 50 74  er DLine *nextPt
8570: 72 3b 0a 0a 09 20 20 20 20 6e 65 78 74 50 74 72  r;...    nextPtr
8580: 20 3d 20 64 6c 50 74 72 3b 0a 09 20 20 20 20 77   = dlPtr;..    w
8590: 68 69 6c 65 20 28 28 6e 65 78 74 50 74 72 20 21  hile ((nextPtr !
85a0: 3d 20 4e 55 4c 4c 29 0a 09 09 20 20 20 20 26 26  = NULL)...    &&
85b0: 20 28 6e 65 78 74 50 74 72 2d 3e 69 6e 64 65 78   (nextPtr->index
85c0: 2e 6c 69 6e 65 50 74 72 20 3d 3d 20 70 72 65 76  .linePtr == prev
85d0: 50 74 72 2d 3e 69 6e 64 65 78 2e 6c 69 6e 65 50  Ptr->index.lineP
85e0: 74 72 29 29 20 7b 0a 09 09 6e 65 78 74 50 74 72  tr)) {...nextPtr
85f0: 20 3d 20 6e 65 78 74 50 74 72 2d 3e 6e 65 78 74   = nextPtr->next
8600: 50 74 72 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  Ptr;..    }..   
8610: 20 69 66 20 28 6e 65 78 74 50 74 72 20 21 3d 20   if (nextPtr != 
8620: 64 6c 50 74 72 29 20 7b 0a 09 09 46 72 65 65 44  dlPtr) {...FreeD
8630: 4c 69 6e 65 73 28 74 65 78 74 50 74 72 2c 20 64  Lines(textPtr, d
8640: 6c 50 74 72 2c 20 6e 65 78 74 50 74 72 2c 20 30  lPtr, nextPtr, 0
8650: 29 3b 0a 09 09 70 72 65 76 50 74 72 2d 3e 6e 65  );...prevPtr->ne
8660: 78 74 50 74 72 20 3d 20 6e 65 78 74 50 74 72 3b  xtPtr = nextPtr;
8670: 0a 09 09 64 6c 50 74 72 20 3d 20 6e 65 78 74 50  ...dlPtr = nextP
8680: 74 72 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09  tr;..    }..}...
8690: 2f 2a 0a 09 20 2a 20 49 74 27 73 20 69 6d 70 6f  /*.. * It's impo
86a0: 72 74 61 6e 74 20 74 6f 20 68 61 76 65 20 74 68  rtant to have th
86b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 65 63  e following chec
86c0: 6b 20 68 65 72 65 20 72 61 74 68 65 72 20 74 68  k here rather th
86d0: 61 6e 20 69 6e 0a 09 20 2a 20 74 68 65 20 77 68  an in.. * the wh
86e0: 69 6c 65 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  ile statement fo
86f0: 72 20 74 68 65 20 6c 6f 6f 70 2c 20 73 6f 20 74  r the loop, so t
8700: 68 61 74 20 74 68 65 72 65 27 73 20 61 6c 77 61  hat there's alwa
8710: 79 73 20 61 74 20 6c 65 61 73 74 0a 09 20 2a 20  ys at least.. * 
8720: 6f 6e 65 20 44 4c 69 6e 65 20 67 65 6e 65 72 61  one DLine genera
8730: 74 65 64 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ted, regardless 
8740: 6f 66 20 68 6f 77 20 73 6d 61 6c 6c 20 74 68 65  of how small the
8750: 20 77 69 6e 64 6f 77 20 69 73 2e 20 20 54 68 69   window is.  Thi
8760: 73 0a 09 20 2a 20 6b 65 65 70 73 20 61 20 6c 6f  s.. * keeps a lo
8770: 74 20 6f 66 20 6f 74 68 65 72 20 63 6f 64 65 20  t of other code 
8780: 66 72 6f 6d 20 62 72 65 61 6b 69 6e 67 2e 0a 09  from breaking...
8790: 20 2a 2f 0a 0a 09 69 66 20 28 79 20 3e 3d 20 6d   */...if (y >= m
87a0: 61 78 59 29 20 7b 0a 09 20 20 20 20 62 72 65 61  axY) {..    brea
87b0: 6b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  k;..}.    }..   
87c0: 20 2f 2a 0a 20 20 20 20 20 2a 20 44 65 6c 65 74   /*.     * Delet
87d0: 65 20 61 6e 79 20 44 4c 69 6e 65 20 73 74 72 75  e any DLine stru
87e0: 63 74 75 72 65 73 20 74 68 61 74 20 64 6f 6e 27  ctures that don'
87f0: 74 20 66 69 74 20 6f 6e 20 74 68 65 20 73 63 72  t fit on the scr
8800: 65 65 6e 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  een..     */..  
8810: 20 20 46 72 65 65 44 4c 69 6e 65 73 28 74 65 78    FreeDLines(tex
8820: 74 50 74 72 2c 20 64 6c 50 74 72 2c 20 28 44 4c  tPtr, dlPtr, (DL
8830: 69 6e 65 20 2a 29 20 4e 55 4c 4c 2c 20 31 29 3b  ine *) NULL, 1);
8840: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 2d  ..    /*.     *-
8850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20  -------------.  
8890: 20 20 20 2a 20 49 66 20 74 68 65 72 65 20 69 73     * If there is
88a0: 20 65 78 74 72 61 20 73 70 61 63 65 20 61 74 20   extra space at 
88b0: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  the bottom of th
88c0: 65 20 77 69 6e 64 6f 77 20 28 62 65 63 61 75 73  e window (becaus
88d0: 65 0a 20 20 20 20 20 2a 20 77 65 27 76 65 20 68  e.     * we've h
88e0: 69 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  it the end of th
88f0: 65 20 74 65 78 74 29 2c 20 74 68 65 6e 20 62 72  e text), then br
8900: 69 6e 67 20 69 6e 20 6d 6f 72 65 20 6c 69 6e 65  ing in more line
8910: 73 20 61 74 0a 20 20 20 20 20 2a 20 74 68 65 20  s at.     * the 
8920: 74 6f 70 20 6f 66 20 74 68 65 20 77 69 6e 64 6f  top of the windo
8930: 77 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  w, if there are 
8940: 61 6e 79 2c 20 74 6f 20 66 69 6c 6c 20 69 6e 20  any, to fill in 
8950: 74 68 65 20 76 69 65 77 2e 0a 20 20 20 20 20 2a  the view..     *
8960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
89a0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28      */..    if (
89b0: 79 20 3c 20 6d 61 78 59 29 20 7b 0a 09 69 6e 74  y < maxY) {..int
89c0: 20 6c 69 6e 65 4e 75 6d 2c 20 73 70 61 63 65 4c   lineNum, spaceL
89d0: 65 66 74 2c 20 63 68 61 72 73 54 6f 43 6f 75 6e  eft, charsToCoun
89e0: 74 3b 0a 09 44 4c 69 6e 65 20 2a 6c 6f 77 65 73  t;..DLine *lowes
89f0: 74 50 74 72 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 4c  tPtr;.../*.. * L
8a00: 61 79 6f 75 74 20 61 6e 20 65 6e 74 69 72 65 20  ayout an entire 
8a10: 74 65 78 74 20 6c 69 6e 65 20 28 70 6f 74 65 6e  text line (poten
8a20: 74 69 61 6c 6c 79 20 3e 20 31 20 64 69 73 70 6c  tially > 1 displ
8a30: 61 79 20 6c 69 6e 65 29 2c 0a 09 20 2a 20 74 68  ay line),.. * th
8a40: 65 6e 20 6c 69 6e 6b 20 69 6e 20 61 73 20 6d 61  en link in as ma
8a50: 6e 79 20 64 69 73 70 6c 61 79 20 6c 69 6e 65 73  ny display lines
8a60: 20 61 73 20 66 69 74 20 77 69 74 68 6f 75 74 20   as fit without 
8a70: 6d 6f 76 69 6e 67 0a 09 20 2a 20 74 68 65 20 62  moving.. * the b
8a80: 6f 74 74 6f 6d 20 6c 69 6e 65 20 6f 75 74 20 6f  ottom line out o
8a90: 66 20 74 68 65 20 77 69 6e 64 6f 77 2e 20 20 52  f the window.  R
8aa0: 65 70 65 61 74 20 74 68 69 73 20 75 6e 74 69 6c  epeat this until
8ab0: 0a 09 20 2a 20 61 6c 6c 20 74 68 65 20 65 78 74  .. * all the ext
8ac0: 72 61 20 73 70 61 63 65 20 68 61 73 20 62 65 65  ra space has bee
8ad0: 6e 20 75 73 65 64 20 75 70 20 6f 72 20 77 65 27  n used up or we'
8ae0: 76 65 20 72 65 61 63 68 65 64 20 74 68 65 0a 09  ve reached the..
8af0: 20 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20   * beginning of 
8b00: 74 68 65 20 74 65 78 74 2e 0a 09 20 2a 2f 0a 0a  the text... */..
8b10: 09 73 70 61 63 65 4c 65 66 74 20 3d 20 6d 61 78  .spaceLeft = max
8b20: 59 20 2d 20 79 3b 0a 09 6c 69 6e 65 4e 75 6d 20  Y - y;..lineNum 
8b30: 3d 20 54 6b 42 54 72 65 65 4c 69 6e 65 49 6e 64  = TkBTreeLineInd
8b40: 65 78 28 64 49 6e 66 6f 50 74 72 2d 3e 64 4c 69  ex(dInfoPtr->dLi
8b50: 6e 65 50 74 72 2d 3e 69 6e 64 65 78 2e 6c 69 6e  nePtr->index.lin
8b60: 65 50 74 72 29 3b 0a 09 63 68 61 72 73 54 6f 43  ePtr);..charsToC
8b70: 6f 75 6e 74 20 3d 20 64 49 6e 66 6f 50 74 72 2d  ount = dInfoPtr-
8b80: 3e 64 4c 69 6e 65 50 74 72 2d 3e 69 6e 64 65 78  >dLinePtr->index
8b90: 2e 63 68 61 72 49 6e 64 65 78 3b 0a 09 69 66 20  .charIndex;..if 
8ba0: 28 63 68 61 72 73 54 6f 43 6f 75 6e 74 20 3d 3d  (charsToCount ==
8bb0: 20 30 29 20 7b 0a 09 20 20 20 20 63 68 61 72 73   0) {..    chars
8bc0: 54 6f 43 6f 75 6e 74 20 3d 20 49 4e 54 5f 4d 41  ToCount = INT_MA
8bd0: 58 3b 0a 09 20 20 20 20 6c 69 6e 65 4e 75 6d 2d  X;..    lineNum-
8be0: 2d 3b 0a 09 7d 0a 09 66 6f 72 20 28 20 3b 20 28  -;..}..for ( ; (
8bf0: 6c 69 6e 65 4e 75 6d 20 3e 3d 20 30 29 20 26 26  lineNum >= 0) &&
8c00: 20 28 73 70 61 63 65 4c 65 66 74 20 3e 20 30 29   (spaceLeft > 0)
8c10: 3b 20 6c 69 6e 65 4e 75 6d 2d 2d 29 20 7b 0a 09  ; lineNum--) {..
8c20: 20 20 20 20 69 6e 64 65 78 2e 6c 69 6e 65 50 74      index.linePt
8c30: 72 20 3d 20 54 6b 42 54 72 65 65 46 69 6e 64 4c  r = TkBTreeFindL
8c40: 69 6e 65 28 74 65 78 74 50 74 72 2d 3e 74 72 65  ine(textPtr->tre
8c50: 65 2c 20 6c 69 6e 65 4e 75 6d 29 3b 0a 09 20 20  e, lineNum);..  
8c60: 20 20 69 6e 64 65 78 2e 63 68 61 72 49 6e 64 65    index.charInde
8c70: 78 20 3d 20 30 3b 0a 09 20 20 20 20 6c 6f 77 65  x = 0;..    lowe
8c80: 73 74 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 20  stPtr = NULL;.. 
8c90: 20 20 20 64 6f 20 7b 0a 09 09 64 6c 50 74 72 20     do {...dlPtr 
8ca0: 3d 20 4c 61 79 6f 75 74 44 4c 69 6e 65 28 74 65  = LayoutDLine(te
8cb0: 78 74 50 74 72 2c 20 26 69 6e 64 65 78 29 3b 0a  xtPtr, &index);.
8cc0: 09 09 64 6c 50 74 72 2d 3e 6e 65 78 74 50 74 72  ..dlPtr->nextPtr
8cd0: 20 3d 20 6c 6f 77 65 73 74 50 74 72 3b 0a 09 09   = lowestPtr;...
8ce0: 6c 6f 77 65 73 74 50 74 72 20 3d 20 64 6c 50 74  lowestPtr = dlPt
8cf0: 72 3b 0a 09 09 54 6b 54 65 78 74 49 6e 64 65 78  r;...TkTextIndex
8d00: 46 6f 72 77 43 68 61 72 73 28 26 69 6e 64 65 78  ForwChars(&index
8d10: 2c 20 64 6c 50 74 72 2d 3e 63 6f 75 6e 74 2c 20  , dlPtr->count, 
8d20: 26 69 6e 64 65 78 29 3b 0a 09 09 63 68 61 72 73  &index);...chars
8d30: 54 6f 43 6f 75 6e 74 20 2d 3d 20 64 6c 50 74 72  ToCount -= dlPtr
8d40: 2d 3e 63 6f 75 6e 74 3b 0a 09 20 20 20 20 7d 20  ->count;..    } 
8d50: 77 68 69 6c 65 20 28 28 63 68 61 72 73 54 6f 43  while ((charsToC
8d60: 6f 75 6e 74 20 3e 20 30 29 0a 09 09 20 20 20 20  ount > 0)...    
8d70: 26 26 20 28 69 6e 64 65 78 2e 6c 69 6e 65 50 74  && (index.linePt
8d80: 72 20 3d 3d 20 6c 6f 77 65 73 74 50 74 72 2d 3e  r == lowestPtr->
8d90: 69 6e 64 65 78 2e 6c 69 6e 65 50 74 72 29 29 3b  index.linePtr));
8da0: 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20  ...    /*..     
8db0: 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74  * Scan through t
8dc0: 68 65 20 64 69 73 70 6c 61 79 20 6c 69 6e 65 73  he display lines
8dd0: 20 66 72 6f 6d 20 74 68 65 20 62 6f 74 74 6f 6d   from the bottom
8de0: 20 6f 6e 65 20 75 70 20 74 6f 0a 09 20 20 20 20   one up to..    
8df0: 20 2a 20 74 68 65 20 74 6f 70 20 6f 6e 65 2e 0a   * the top one..
8e00: 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 77  .     */...    w
8e10: 68 69 6c 65 20 28 6c 6f 77 65 73 74 50 74 72 20  hile (lowestPtr 
8e20: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 64 6c 50  != NULL) {...dlP
8e30: 74 72 20 3d 20 6c 6f 77 65 73 74 50 74 72 3b 0a  tr = lowestPtr;.
8e40: 09 09 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 64  ..spaceLeft -= d
8e50: 6c 50 74 72 2d 3e 68 65 69 67 68 74 3b 0a 09 09  lPtr->height;...
8e60: 69 66 20 28 73 70 61 63 65 4c 65 66 74 20 3c 20  if (spaceLeft < 
8e70: 30 29 20 7b 0a 09 09 20 20 20 20 62 72 65 61 6b  0) {...    break
8e80: 3b 0a 09 09 7d 0a 09 09 6c 6f 77 65 73 74 50 74  ;...}...lowestPt
8e90: 72 20 3d 20 64 6c 50 74 72 2d 3e 6e 65 78 74 50  r = dlPtr->nextP
8ea0: 74 72 3b 0a 09 09 64 6c 50 74 72 2d 3e 6e 65 78  tr;...dlPtr->nex
8eb0: 74 50 74 72 20 3d 20 64 49 6e 66 6f 50 74 72 2d  tPtr = dInfoPtr-
8ec0: 3e 64 4c 69 6e 65 50 74 72 3b 0a 09 09 64 49 6e  >dLinePtr;...dIn
8ed0: 66 6f 50 74 72 2d 3e 64 4c 69 6e 65 50 74 72 20  foPtr->dLinePtr 
8ee0: 3d 20 64 6c 50 74 72 3b 0a 09 09 69 66 20 28 74  = dlPtr;...if (t
8ef0: 6b 54 65 78 74 44 65 62 75 67 29 20 7b 0a 09 09  kTextDebug) {...
8f00: 20 20 20 20 63 68 61 72 20 73 74 72 69 6e 67 5b      char string[
8f10: 54 4b 5f 50 4f 53 5f 43 48 41 52 53 5d 3b 0a 0a  TK_POS_CHARS];..
8f20: 09 09 20 20 20 20 54 6b 54 65 78 74 50 72 69 6e  ..    TkTextPrin
8f30: 74 49 6e 64 65 78 28 26 64 6c 50 74 72 2d 3e 69  tIndex(&dlPtr->i
8f40: 6e 64 65 78 2c 20 73 74 72 69 6e 67 29 3b 0a 09  ndex, string);..
8f50: 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 32  .    Tcl_SetVar2
8f60: 28 74 65 78 74 50 74 72 2d 3e 69 6e 74 65 72 70  (textPtr->interp
8f70: 2c 20 22 74 6b 5f 74 65 78 74 52 65 6c 61 79 6f  , "tk_textRelayo
8f80: 75 74 22 2c 0a 09 09 09 20 20 20 20 28 63 68 61  ut",....    (cha
8f90: 72 20 2a 29 20 4e 55 4c 4c 2c 20 73 74 72 69 6e  r *) NULL, strin
8fa0: 67 2c 0a 09 09 09 20 20 20 20 54 43 4c 5f 47 4c  g,....    TCL_GL
8fb0: 4f 42 41 4c 5f 4f 4e 4c 59 7c 54 43 4c 5f 41 50  OBAL_ONLY|TCL_AP
8fc0: 50 45 4e 44 5f 56 41 4c 55 45 7c 54 43 4c 5f 4c  PEND_VALUE|TCL_L
8fd0: 49 53 54 5f 45 4c 45 4d 45 4e 54 29 3b 0a 09 09  IST_ELEMENT);...
8fe0: 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 46 72  }..    }..    Fr
8ff0: 65 65 44 4c 69 6e 65 73 28 74 65 78 74 50 74 72  eeDLines(textPtr
9000: 2c 20 6c 6f 77 65 73 74 50 74 72 2c 20 28 44 4c  , lowestPtr, (DL
9010: 69 6e 65 20 2a 29 20 4e 55 4c 4c 2c 20 30 29 3b  ine *) NULL, 0);
9020: 0a 09 20 20 20 20 63 68 61 72 73 54 6f 43 6f 75  ..    charsToCou
9030: 6e 74 20 3d 20 49 4e 54 5f 4d 41 58 3b 0a 09 7d  nt = INT_MAX;..}
9040: 0a 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 77 20 77 65  .../*.. * Now we
9050: 27 72 65 20 61 6c 6c 20 64 6f 6e 65 20 65 78 63  're all done exc
9060: 65 70 74 20 74 68 61 74 20 74 68 65 20 79 2d 63  ept that the y-c
9070: 6f 6f 72 64 69 6e 61 74 65 73 20 69 6e 20 61 6c  oordinates in al
9080: 6c 20 74 68 65 0a 09 20 2a 20 44 4c 69 6e 65 73  l the.. * DLines
9090: 20 61 72 65 20 77 72 6f 6e 67 20 61 6e 64 20 74   are wrong and t
90a0: 68 65 20 74 6f 70 20 69 6e 64 65 78 20 66 6f 72  he top index for
90b0: 20 74 68 65 20 74 65 78 74 20 69 73 20 77 72 6f   the text is wro
90c0: 6e 67 2e 0a 09 20 2a 20 55 70 64 61 74 65 20 74  ng... * Update t
90d0: 68 65 6d 2e 0a 09 20 2a 2f 0a 0a 09 74 65 78 74  hem... */...text
90e0: 50 74 72 2d 3e 74 6f 70 49 6e 64 65 78 20 3d 20  Ptr->topIndex = 
90f0: 64 49 6e 66 6f 50 74 72 2d 3e 64 4c 69 6e 65 50  dInfoPtr->dLineP
9100: 74 72 2d 3e 69 6e 64 65 78 3b 0a 09 79 20 3d 20  tr->index;..y = 
9110: 64 49 6e 66 6f 50 74 72 2d 3e 79 3b 0a 09 66 6f  dInfoPtr->y;..fo
9120: 72 20 28 64 6c 50 74 72 20 3d 20 64 49 6e 66 6f  r (dlPtr = dInfo
9130: 50 74 72 2d 3e 64 4c 69 6e 65 50 74 72 3b 20 64  Ptr->dLinePtr; d
9140: 6c 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a 09 09  lPtr != NULL;...
9150: 64 6c 50 74 72 20 3d 20 64 6c 50 74 72 2d 3e 6e  dlPtr = dlPtr->n
9160: 65 78 74 50 74 72 29 20 7b 0a 09 20 20 20 20 69  extPtr) {..    i
9170: 66 20 28 79 20 3e 20 64 49 6e 66 6f 50 74 72 2d  f (y > dInfoPtr-
9180: 3e 6d 61 78 59 29 20 7b 0a 09 09 70 61 6e 69 63  >maxY) {...panic
9190: 28 22 41 64 64 65 64 20 74 6f 6f 20 6d 61 6e 79  ("Added too many
91a0: 20 6e 65 77 20 6c 69 6e 65 73 20 69 6e 20 55 70   new lines in Up
91b0: 64 61 74 65 44 69 73 70 6c 61 79 49 6e 66 6f 22  dateDisplayInfo"
91c0: 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 64  );..    }..    d
91d0: 6c 50 74 72 2d 3e 79 20 3d 20 79 3b 0a 09 20 20  lPtr->y = y;..  
91e0: 20 20 79 20 2b 3d 20 64 6c 50 74 72 2d 3e 68 65    y += dlPtr->he
91f0: 69 67 68 74 3b 20 0a 09 7d 0a 20 20 20 20 7d 0a  ight; ..}.    }.
9200: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 2d 2d  .    /*.     *--
9210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 20  ------------.   
9250: 20 20 2a 20 49 66 20 74 68 65 20 6f 6c 64 20 74    * If the old t
9260: 6f 70 20 6f 72 20 62 6f 74 74 6f 6d 20 6c 69 6e  op or bottom lin
9270: 65 20 68 61 73 20 73 63 72 6f 6c 6c 65 64 20 65  e has scrolled e
9280: 6c 73 65 77 68 65 72 65 20 6f 6e 20 74 68 65 0a  lsewhere on the.
9290: 20 20 20 20 20 2a 20 73 63 72 65 65 6e 2c 20 77       * screen, w
92a0: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 62 6c  e may not be abl
92b0: 65 20 74 6f 20 72 65 2d 75 73 65 20 69 74 73 20  e to re-use its 
92c0: 6f 6c 64 20 63 6f 6e 74 65 6e 74 73 20 62 79 0a  old contents by.
92d0: 20 20 20 20 20 2a 20 63 6f 70 79 69 6e 67 20 62       * copying b
92e0: 69 74 73 20 28 65 2e 67 2e 2c 20 61 20 62 65 76  its (e.g., a bev
92f0: 65 6c 65 64 20 65 64 67 65 20 74 68 61 74 20 77  eled edge that w
9300: 61 73 20 64 72 61 77 6e 20 77 68 65 6e 20 69 74  as drawn when it
9310: 20 77 61 73 0a 20 20 20 20 20 2a 20 61 74 20 74   was.     * at t
9320: 68 65 20 74 6f 70 20 6f 72 20 62 6f 74 74 6f 6d  he top or bottom
9330: 20 77 6f 6e 27 74 20 62 65 20 64 72 61 77 6e 20   won't be drawn 
9340: 77 68 65 6e 20 74 68 65 20 6c 69 6e 65 20 69 73  when the line is
9350: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a 20 6d   in the.     * m
9360: 69 64 64 6c 65 20 61 6e 64 20 69 74 73 20 6e 65  iddle and its ne
9370: 69 67 68 62 6f 72 20 68 61 73 20 61 20 6d 61 74  ighbor has a mat
9380: 63 68 69 6e 67 20 62 61 63 6b 67 72 6f 75 6e 64  ching background
9390: 29 2e 20 20 53 69 6d 69 6c 61 72 6c 79 2c 0a 20  ).  Similarly,. 
93a0: 20 20 20 20 2a 20 69 66 20 74 68 65 20 6e 65 77      * if the new
93b0: 20 74 6f 70 20 6f 72 20 62 6f 74 74 6f 6d 20 6c   top or bottom l
93c0: 69 6e 65 20 63 61 6d 65 20 66 72 6f 6d 20 73 6f  ine came from so
93d0: 6d 65 77 68 65 72 65 20 65 6c 73 65 20 6f 6e 20  mewhere else on 
93e0: 74 68 65 0a 20 20 20 20 20 2a 20 73 63 72 65 65  the.     * scree
93f0: 6e 2c 20 77 65 20 6d 61 79 20 6e 6f 74 20 62 65  n, we may not be
9400: 20 61 62 6c 65 20 74 6f 20 63 6f 70 79 20 74 68   able to copy th
9410: 65 20 6f 6c 64 20 62 69 74 73 2e 0a 20 20 20 20  e old bits..    
9420: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
9430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9460: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 64 6c  .     */..    dl
9470: 50 74 72 20 3d 20 64 49 6e 66 6f 50 74 72 2d 3e  Ptr = dInfoPtr->
9480: 64 4c 69 6e 65 50 74 72 3b 0a 20 20 20 20 77 68  dLinePtr;.    wh
9490: 69 6c 65 20 28 31 29 20 7b 0a 09 69 66 20 28 64  ile (1) {..if (d
94a0: 6c 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 3d  lPtr->nextPtr ==
94b0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 64 6c   NULL) {..    dl
94c0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 54  Ptr->flags &= ~T
94d0: 4f 50 5f 4c 49 4e 45 3b 0a 09 20 20 20 20 64 6c  OP_LINE;..    dl
94e0: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 42 4f  Ptr->flags |= BO
94f0: 54 54 4f 4d 5f 4c 49 4e 45 3b 0a 09 20 20 20 20  TTOM_LINE;..    
9500: 62 72 65 61 6b 3b 0a 09 7d 0a 09 64 6c 50 74 72  break;..}..dlPtr
9510: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4f 50  ->flags &= ~(TOP
9520: 5f 4c 49 4e 45 7c 42 4f 54 54 4f 4d 5f 4c 49 4e  _LINE|BOTTOM_LIN
9530: 45 29 3b 0a 09 64 6c 50 74 72 20 3d 20 64 6c 50  E);..dlPtr = dlP
9540: 74 72 2d 3e 6e 65 78 74 50 74 72 3b 0a 20 20 20  tr->nextPtr;.   
9550: 20 7d 0a 20 20 20 20 64 49 6e 66 6f 50 74 72 2d   }.    dInfoPtr-
9560: 3e 64 4c 69 6e 65 50 74 72 2d 3e 66 6c 61 67 73  >dLinePtr->flags
9570: 20 7c 3d 20 54 4f 50 5f 4c 49 4e 45 3b 0a 0a 20   |= TOP_LINE;.. 
9580: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 72 72     /*.     * Arr
9590: 61 6e 67 65 20 66 6f 72 20 73 63 72 6f 6c 6c 62  ange for scrollb
95a0: 61 72 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  ars to be update
95b0: 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  d..     */..    
95c0: 74 65 78 74 50 74 72 2d 3e 66 6c 61 67 73 20 7c  textPtr->flags |
95d0: 3d 20 55 50 44 41 54 45 5f 53 43 52 4f 4c 4c 42  = UPDATE_SCROLLB
95e0: 41 52 53 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ARS;..    /*.   
95f0: 20 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    *-------------
9600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9630: 2d 0a 20 20 20 20 20 2a 20 44 65 61 6c 20 77 69  -.     * Deal wi
9640: 74 68 20 68 6f 72 69 7a 6f 6e 74 61 6c 20 73 63  th horizontal sc
9650: 72 6f 6c 6c 69 6e 67 3a 0a 20 20 20 20 20 2a 20  rolling:.     * 
9660: 31 2e 20 49 66 20 74 68 65 72 65 27 73 20 65 6d  1. If there's em
9670: 70 74 79 20 73 70 61 63 65 20 74 6f 20 74 68 65  pty space to the
9680: 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 6c 6f   right of the lo
9690: 6e 67 65 73 74 20 6c 69 6e 65 2c 0a 20 20 20 20  ngest line,.    
96a0: 20 2a 20 20 20 20 73 68 69 66 74 20 74 68 65 20   *    shift the 
96b0: 73 63 72 65 65 6e 20 74 6f 20 74 68 65 20 72 69  screen to the ri
96c0: 67 68 74 20 74 6f 20 66 69 6c 6c 20 69 6e 20 74  ght to fill in t
96d0: 68 65 20 65 6d 70 74 79 20 73 70 61 63 65 2e 0a  he empty space..
96e0: 20 20 20 20 20 2a 20 32 2e 20 49 66 20 74 68 65       * 2. If the
96f0: 20 64 65 73 69 72 65 64 20 68 6f 72 69 7a 6f 6e   desired horizon
9700: 74 61 6c 20 73 63 72 6f 6c 6c 20 70 6f 73 69 74  tal scroll posit
9710: 69 6f 6e 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ion has changed,
9720: 0a 20 20 20 20 20 2a 20 20 20 20 66 6f 72 63 65  .     *    force
9730: 20 61 20 66 75 6c 6c 20 72 65 64 69 73 70 6c 61   a full redispla
9740: 79 20 6f 66 20 61 6c 6c 20 74 68 65 20 6c 69 6e  y of all the lin
9750: 65 73 20 69 6e 20 74 68 65 20 77 69 64 67 65 74  es in the widget
9760: 2e 0a 20 20 20 20 20 2a 20 33 2e 20 49 66 20 74  ..     * 3. If t
9770: 68 65 20 77 72 61 70 20 6d 6f 64 65 20 69 73 6e  he wrap mode isn
9780: 27 74 20 22 6e 6f 6e 65 22 20 74 68 65 6e 20 72  't "none" then r
9790: 65 2d 73 63 72 6f 6c 6c 20 74 6f 20 74 68 65 20  e-scroll to the 
97a0: 62 61 73 65 0a 20 20 20 20 20 2a 20 20 20 20 70  base.     *    p
97b0: 6f 73 69 74 69 6f 6e 2e 0a 20 20 20 20 20 2a 2d  osition..     *-
97c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20  -------------.  
9800: 20 20 20 2a 2f 0a 0a 20 20 20 20 64 49 6e 66 6f     */..    dInfo
9810: 50 74 72 2d 3e 6d 61 78 4c 65 6e 67 74 68 20 3d  Ptr->maxLength =
9820: 20 30 3b 0a 20 20 20 20 66 6f 72 20 28 64 6c 50   0;.    for (dlP
9830: 74 72 20 3d 20 64 49 6e 66 6f 50 74 72 2d 3e 64  tr = dInfoPtr->d
9840: 4c 69 6e 65 50 74 72 3b 20 64 6c 50 74 72 20 21  LinePtr; dlPtr !
9850: 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 64 6c 50  = NULL;..    dlP
9860: 74 72 20 3d 20 64 6c 50 74 72 2d 3e 6e 65 78 74  tr = dlPtr->next
9870: 50 74 72 29 20 7b 0a 09 69 66 20 28 64 6c 50 74  Ptr) {..if (dlPt
9880: 72 2d 3e 6c 65 6e 67 74 68 20 3e 20 64 49 6e 66  r->length > dInf
9890: 6f 50 74 72 2d 3e 6d 61 78 4c 65 6e 67 74 68 29  oPtr->maxLength)
98a0: 20 7b 0a 09 20 20 20 20 64 49 6e 66 6f 50 74 72   {..    dInfoPtr
98b0: 2d 3e 6d 61 78 4c 65 6e 67 74 68 20 3d 20 64 6c  ->maxLength = dl
98c0: 50 74 72 2d 3e 6c 65 6e 67 74 68 3b 0a 09 7d 0a  Ptr->length;..}.
98d0: 20 20 20 20 7d 0a 20 20 20 20 6d 61 78 4f 66 66      }.    maxOff
98e0: 73 65 74 20 3d 20 64 49 6e 66 6f 50 74 72 2d 3e  set = dInfoPtr->
98f0: 6d 61 78 4c 65 6e 67 74 68 20 2d 20 28 64 49 6e  maxLength - (dIn
9900: 66 6f 50 74 72 2d 3e 6d 61 78 58 20 2d 20 64 49  foPtr->maxX - dI
9910: 6e 66 6f 50 74 72 2d 3e 78 29 3b 0a 20 20 20 20  nfoPtr->x);.    
9920: 69 66 20 28 64 49 6e 66 6f 50 74 72 2d 3e 6e 65  if (dInfoPtr->ne
9930: 77 43 68 61 72 4f 66 66 73 65 74 20 3e 20 6d 61  wCharOffset > ma
9940: 78 4f 66 66 73 65 74 29 20 7b 0a 09 64 49 6e 66  xOffset) {..dInf
9950: 6f 50 74 72 2d 3e 6e 65 77 43 68 61 72 4f 66 66  oPtr->newCharOff
9960: 73 65 74 20 3d 20 6d 61 78 4f 66 66 73 65 74 3b  set = maxOffset;
9970: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 64  .    }.    if (d
9980: 49 6e 66 6f 50 74 72 2d 3e 6e 65 77 43 68 61 72  InfoPtr->newChar
9990: 4f 66 66 73 65 74 20 3c 20 30 29 20 7b 0a 09 64  Offset < 0) {..d
99a0: 49 6e 66 6f 50 74 72 2d 3e 6e 65 77 43 68 61 72  InfoPtr->newChar
99b0: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
99c0: 7d 0a 20 20 20 20 70 69 78 65 6c 4f 66 66 73 65  }.    pixelOffse
99d0: 74 20 3d 20 64 49 6e 66 6f 50 74 72 2d 3e 6e 65  t = dInfoPtr->ne
99e0: 77 43 68 61 72 4f 66 66 73 65 74 3b 0a 20 20 20  wCharOffset;.   
99f0: 20 69 66 20 28 70 69 78 65 6c 4f 66 66 73 65 74   if (pixelOffset
9a00: 20 21 3d 20 64 49 6e 66 6f 50 74 72 2d 3e 63 75   != dInfoPtr->cu
9a10: 72 50 69 78 65 6c 4f 66 66 73 65 74 29 20 7b 0a  rPixelOffset) {.
9a20: 09 64 49 6e 66 6f 50 74 72 2d 3e 63 75 72 50 69  .dInfoPtr->curPi
9a30: 78 65 6c 4f 66 66 73 65 74 20 3d 20 70 69 78 65  xelOffset = pixe
9a40: 6c 4f 66 66 73 65 74 3b 0a 09 66 6f 72 20 28 64  lOffset;..for (d
9a50: 6c 50 74 72 20 3d 20 64 49 6e 66 6f 50 74 72 2d  lPtr = dInfoPtr-
9a60: 3e 64 4c 69 6e 65 50 74 72 3b 20 64 6c 50 74 72  >dLinePtr; dlPtr
9a70: 20 21 3d 20 4e 55 4c 4c 3b 0a 09 09 64 6c 50 74   != NULL;...dlPt
9a80: 72 20 3d 20 64 6c 50 74 72 2d 3e 6e 65 78 74 50  r = dlPtr->nextP
9a90: 74 72 29 20 7b 0a 09 20 20 20 20 64 6c 50 74 72  tr) {..    dlPtr
9aa0: 2d 3e 6f 6c 64 59 20 3d 20 2d 31 3b 0a 09 7d 0a  ->oldY = -1;..}.
9ab0: 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d      }.}.../*. *-
9ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b00: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 46 72 65 65  -----. *. * Free
9b10: 44 4c 69 6e 65 73 20 2d 2d 0a 20 2a 0a 20 2a 09  DLines --. *. *.
9b20: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
9b30: 73 20 63 61 6c 6c 65 64 20 74 6f 20 66 72 65 65  s called to free
9b40: 20 75 70 20 61 6c 6c 20 6f 66 20 74 68 65 20 72   up all of the r
9b50: 65 73 6f 75 72 63 65 73 0a 20 2a 09 61 73 73 6f  esources. *.asso
9b60: 63 69 61 74 65 64 20 77 69 74 68 20 6f 6e 65 20  ciated with one 
9b70: 6f 72 20 6d 6f 72 65 20 44 4c 69 6e 65 20 73 74  or more DLine st
9b80: 72 75 63 74 75 72 65 73 2e 0a 20 2a 0a 20 2a 20  ructures.. *. * 
9b90: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
9ba0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
9bb0: 65 63 74 73 3a 0a 20 2a 09 4d 65 6d 6f 72 79 20  ects:. *.Memory 
9bc0: 67 65 74 73 20 66 72 65 65 64 20 61 6e 64 20 76  gets freed and v
9bd0: 61 72 69 6f 75 73 20 6f 74 68 65 72 20 72 65 73  arious other res
9be0: 6f 75 72 63 65 73 20 61 72 65 20 72 65 6c 65 61  ources are relea
9bf0: 73 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  sed.. *. *------
9c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c40: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  . */..static voi
9c50: 64 0a 46 72 65 65 44 4c 69 6e 65 73 28 74 65 78  d.FreeDLines(tex
9c60: 74 50 74 72 2c 20 66 69 72 73 74 50 74 72 2c 20  tPtr, firstPtr, 
9c70: 6c 61 73 74 50 74 72 2c 20 75 6e 6c 69 6e 6b 29  lastPtr, unlink)
9c80: 0a 20 20 20 20 54 6b 54 65 78 74 20 2a 74 65 78  .    TkText *tex
9c90: 74 50 74 72 3b 09 09 09 2f 2a 20 49 6e 66 6f 72  tPtr;.../* Infor
9ca0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 6f 76 65  mation about ove
9cb0: 72 61 6c 6c 20 74 65 78 74 0a 09 09 09 09 09 20  rall text...... 
9cc0: 2a 20 77 69 64 67 65 74 2e 20 2a 2f 0a 20 20 20  * widget. */.   
9cd0: 20 72 65 67 69 73 74 65 72 20 44 4c 69 6e 65 20   register DLine 
9ce0: 2a 66 69 72 73 74 50 74 72 3b 09 09 2f 2a 20 50  *firstPtr;../* P
9cf0: 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20  ointer to first 
9d00: 44 4c 69 6e 65 20 74 6f 20 66 72 65 65 20 75 70  DLine to free up
9d10: 2e 20 2a 2f 0a 20 20 20 20 44 4c 69 6e 65 20 2a  . */.    DLine *
9d20: 6c 61 73 74 50 74 72 3b 09 09 09 2f 2a 20 50 6f  lastPtr;.../* Po
9d30: 69 6e 74 65 72 20 74 6f 20 44 4c 69 6e 65 20 6a  inter to DLine j
9d40: 75 73 74 20 61 66 74 65 72 20 6c 61 73 74 0a 09  ust after last..
9d50: 09 09 09 09 20 2a 20 6f 6e 65 20 74 6f 20 66 72  .... * one to fr
9d60: 65 65 20 28 4e 55 4c 4c 20 6d 65 61 6e 73 20 65  ee (NULL means e
9d70: 76 65 72 79 74 68 69 6e 67 0a 09 09 09 09 09 20  verything...... 
9d80: 2a 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  * starting with 
9d90: 66 69 72 73 74 50 74 72 29 2e 20 2a 2f 0a 20 20  firstPtr). */.  
9da0: 20 20 69 6e 74 20 75 6e 6c 69 6e 6b 3b 09 09 09    int unlink;...
9db0: 09 2f 2a 20 31 20 6d 65 61 6e 73 20 44 4c 69 6e  ./* 1 means DLin
9dc0: 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  es are currently
9dd0: 20 6c 69 6e 6b 65 64 0a 09 09 09 09 09 20 2a 20   linked...... * 
9de0: 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 72 6f  into the list ro
9df0: 6f 74 65 64 20 61 74 0a 09 09 09 09 09 20 2a 20  oted at...... * 
9e00: 74 65 78 74 50 74 72 2d 3e 64 49 6e 66 6f 50 74  textPtr->dInfoPt
9e10: 72 2d 3e 64 4c 69 6e 65 50 74 72 20 61 6e 64 0a  r->dLinePtr and.
9e20: 09 09 09 09 09 20 2a 20 74 68 65 79 20 68 61 76  ..... * they hav
9e30: 65 20 74 6f 20 62 65 20 75 6e 6c 69 6e 6b 65 64  e to be unlinked
9e40: 2e 20 20 30 20 6d 65 61 6e 73 0a 09 09 09 09 09  .  0 means......
9e50: 20 2a 20 6a 75 73 74 20 66 72 65 65 20 77 69 74   * just free wit
9e60: 68 6f 75 74 20 75 6e 6c 69 6e 6b 69 6e 67 2e 20  hout unlinking. 
9e70: 2a 2f 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65  */.{.    registe
9e80: 72 20 54 6b 54 65 78 74 44 69 73 70 43 68 75 6e  r TkTextDispChun
9e90: 6b 20 2a 63 68 75 6e 6b 50 74 72 2c 20 2a 6e 65  k *chunkPtr, *ne
9ea0: 78 74 43 68 75 6e 6b 50 74 72 3b 0a 20 20 20 20  xtChunkPtr;.    
9eb0: 72 65 67 69 73 74 65 72 20 44 4c 69 6e 65 20 2a  register DLine *
9ec0: 6e 65 78 74 44 4c 69 6e 65 50 74 72 3b 0a 0a 20  nextDLinePtr;.. 
9ed0: 20 20 20 69 66 20 28 75 6e 6c 69 6e 6b 29 20 7b     if (unlink) {
9ee0: 0a 09 69 66 20 28 74 65 78 74 50 74 72 2d 3e 64  ..if (textPtr->d
9ef0: 49 6e 66 6f 50 74 72 2d 3e 64 4c 69 6e 65 50 74  InfoPtr->dLinePt
9f00: 72 20 3d 3d 20 66 69 72 73 74 50 74 72 29 20 7b  r == firstPtr) {
9f10: 0a 09 20 20 20 20 74 65 78 74 50 74 72 2d 3e 64  ..    textPtr->d
9f20: 49 6e 66 6f 50 74 72 2d 3e 64 4c 69 6e 65 50 74  InfoPtr->dLinePt
9f30: 72 20 3d 20 6c 61 73 74 50 74 72 3b 0a 09 7d 20  r = lastPtr;..} 
9f40: 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 67 69  else {..    regi
9f50: 73 74 65 72 20 44 4c 69 6e 65 20 2a 70 72 65 76  ster DLine *prev
9f60: 50 74 72 3b 0a 09 20 20 20 20 66 6f 72 20 28 70  Ptr;..    for (p
9f70: 72 65 76 50 74 72 20 3d 20 74 65 78 74 50 74 72  revPtr = textPtr
9f80: 2d 3e 64 49 6e 66 6f 50 74 72 2d 3e 64 4c 69 6e  ->dInfoPtr->dLin
9f90: 65 50 74 72 3b 0a 09 09 20 20 20 20 70 72 65 76  ePtr;...    prev
9fa0: 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 21 3d 20  Ptr->nextPtr != 
9fb0: 66 69 72 73 74 50 74 72 3b 20 70 72 65 76 50 74  firstPtr; prevPt
9fc0: 72 20 3d 20 70 72 65 76 50 74 72 2d 3e 6e 65 78  r = prevPtr->nex
9fd0: 74 50 74 72 29 20 7b 0a 09 09 2f 2a 20 45 6d 70  tPtr) {.../* Emp
9fe0: 74 79 20 6c 6f 6f 70 20 62 6f 64 79 2e 20 2a 2f  ty loop body. */
9ff0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 65  ..    }..    pre
a000: 76 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20  vPtr->nextPtr = 
a010: 6c 61 73 74 50 74 72 3b 0a 09 7d 0a 20 20 20 20  lastPtr;..}.    
a020: 7d 0a 20 20 20 20 77 68 69 6c 65 20 28 66 69 72  }.    while (fir
a030: 73 74 50 74 72 20 21 3d 20 6c 61 73 74 50 74 72  stPtr != lastPtr
a040: 29 20 7b 0a 09 6e 65 78 74 44 4c 69 6e 65 50 74  ) {..nextDLinePt
a050: 72 20 3d 20 66 69 72 73 74 50 74 72 2d 3e 6e 65  r = firstPtr->ne
a060: 78 74 50 74 72 3b 0a 09 66 6f 72 20 28 63 68 75  xtPtr;..for (chu
a070: 6e 6b 50 74 72 20 3d 20 66 69 72 73 74 50 74 72  nkPtr = firstPtr
a080: 2d 3e 63 68 75 6e 6b 50 74 72 3b 20 63 68 75 6e  ->chunkPtr; chun
a090: 6b 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a 09 09  kPtr != NULL;...
a0a0: 63 68 75 6e 6b 50 74 72 20 3d 20 6e 65 78 74 43  chunkPtr = nextC
a0b0: 68 75 6e 6b 50 74 72 29 20 7b 0a 09 20 20 20 20  hunkPtr) {..    
a0c0: 69 66 20 28 63 68 75 6e 6b 50 74 72 2d 3e 75 6e  if (chunkPtr->un
a0d0: 64 69 73 70 6c 61 79 50 72 6f 63 20 21 3d 20 4e  displayProc != N
a0e0: 55 4c 4c 29 20 7b 0a 09 09 28 2a 63 68 75 6e 6b  ULL) {...(*chunk
a0f0: 50 74 72 2d 3e 75 6e 64 69 73 70 6c 61 79 50 72  Ptr->undisplayPr
a100: 6f 63 29 28 74 65 78 74 50 74 72 2c 20 63 68 75  oc)(textPtr, chu
a110: 6e 6b 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 09  nkPtr);..    }..
a120: 20 20 20 20 46 72 65 65 53 74 79 6c 65 28 74 65      FreeStyle(te
a130: 78 74 50 74 72 2c 20 63 68 75 6e 6b 50 74 72 2d  xtPtr, chunkPtr-
a140: 3e 73 74 79 6c 65 50 74 72 29 3b 0a 09 20 20 20  >stylePtr);..   
a150: 20 6e 65 78 74 43 68 75 6e 6b 50 74 72 20 3d 20   nextChunkPtr = 
a160: 63 68 75 6e 6b 50 74 72 2d 3e 6e 65 78 74 50 74  chunkPtr->nextPt
a170: 72 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 28  r;..    ckfree((
a180: 63 68 61 72 20 2a 29 20 63 68 75 6e 6b 50 74 72  char *) chunkPtr
a190: 29 3b 0a 09 7d 0a 09 63 6b 66 72 65 65 28 28 63  );..}..ckfree((c
a1a0: 68 61 72 20 2a 29 20 66 69 72 73 74 50 74 72 29  har *) firstPtr)
a1b0: 3b 0a 09 66 69 72 73 74 50 74 72 20 3d 20 6e 65  ;..firstPtr = ne
a1c0: 78 74 44 4c 69 6e 65 50 74 72 3b 0a 20 20 20 20  xtDLinePtr;.    
a1d0: 7d 0a 20 20 20 20 74 65 78 74 50 74 72 2d 3e 64  }.    textPtr->d
a1e0: 49 6e 66 6f 50 74 72 2d 3e 64 4c 69 6e 65 73 49  InfoPtr->dLinesI
a1f0: 6e 76 61 6c 69 64 61 74 65 64 20 3d 20 31 3b 0a  nvalidated = 1;.
a200: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
a210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
a250: 20 2a 0a 20 2a 20 44 69 73 70 6c 61 79 44 4c 69   *. * DisplayDLi
a260: 6e 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  ne --. *. *.This
a270: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e   procedure is in
a280: 76 6f 6b 65 64 20 74 6f 20 64 72 61 77 20 61 20  voked to draw a 
a290: 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 6e 20 74  single line on t
a2a0: 68 65 0a 20 2a 09 73 63 72 65 65 6e 2e 0a 20 2a  he. *.screen.. *
a2b0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
a2c0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  None.. *. * Side
a2d0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65   effects:. *.The
a2e0: 20 6c 69 6e 65 20 67 69 76 65 6e 20 62 79 20 64   line given by d
a2f0: 6c 50 74 72 20 69 73 20 64 72 61 77 6e 20 61 74  lPtr is drawn at
a300: 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73   its correct pos
a310: 69 74 69 6f 6e 20 69 6e 0a 20 2a 09 74 65 78 74  ition in. *.text
a320: 50 74 72 27 73 20 77 69 6e 64 6f 77 2e 20 20 4e  Ptr's window.  N
a330: 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 69 73  ote that this is
a340: 20 6f 6e 65 20 2a 64 69 73 70 6c 61 79 2a 20 6c   one *display* l
a350: 69 6e 65 2c 20 6e 6f 74 0a 20 2a 09 6f 6e 65 20  ine, not. *.one 
a360: 2a 74 65 78 74 2a 20 6c 69 6e 65 2e 0a 20 2a 0a  *text* line.. *.
a370: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
a380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a3b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
a3c0: 61 74 69 63 20 76 6f 69 64 0a 44 69 73 70 6c 61  atic void.Displa
a3d0: 79 44 4c 69 6e 65 28 74 65 78 74 50 74 72 2c 20  yDLine(textPtr, 
a3e0: 64 6c 50 74 72 2c 20 70 72 65 76 50 74 72 29 0a  dlPtr, prevPtr).
a3f0: 20 20 20 20 54 6b 54 65 78 74 20 2a 74 65 78 74      TkText *text
a400: 50 74 72 3b 09 09 2f 2a 20 54 65 78 74 20 77 69  Ptr;../* Text wi
a410: 64 67 65 74 20 69 6e 20 77 68 69 63 68 20 74 6f  dget in which to
a420: 20 64 72 61 77 20 6c 69 6e 65 2e 20 2a 2f 0a 20   draw line. */. 
a430: 20 20 20 72 65 67 69 73 74 65 72 20 44 4c 69 6e     register DLin
a440: 65 20 2a 64 6c 50 74 72 3b 09 2f 2a 20 49 6e 66  e *dlPtr;./* Inf
a450: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 6c  ormation about l
a460: 69 6e 65 20 74 6f 20 64 72 61 77 2e 20 2a 2f 0a  ine to draw. */.
a470: 20 20 20 20 44 4c 69 6e 65 20 2a 70 72 65 76 50      DLine *prevP
a480: 74 72 3b 09 09 2f 2a 20 4c 69 6e 65 20 6a 75 73  tr;../* Line jus
a490: 74 20 62 65 66 6f 72 65 20 6f 6e 65 20 74 6f 20  t before one to 
a4a0: 64 72 61 77 2c 20 6f 72 20 4e 55 4c 4c 0a 09 09  draw, or NULL...
a4b0: 09 09 20 2a 20 69 66 20 64 6c 50 74 72 20 69 73  .. * if dlPtr is
a4c0: 20 74 68 65 20 74 6f 70 20 6c 69 6e 65 2e 20 2a   the top line. *
a4d0: 2f 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72  /.{.    register
a4e0: 20 54 6b 5f 57 69 6e 64 6f 77 20 77 69 6e 20 3d   Tk_Window win =
a4f0: 20 74 65 78 74 50 74 72 2d 3e 74 6b 77 69 6e 3b   textPtr->tkwin;
a500: 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 54 6b  .    register Tk
a510: 54 65 78 74 44 69 73 70 43 68 75 6e 6b 20 2a 63  TextDispChunk *c
a520: 68 75 6e 6b 50 74 72 3b 0a 20 20 20 20 44 49 6e  hunkPtr;.    DIn
a530: 66 6f 20 2a 64 49 6e 66 6f 50 74 72 20 3d 20 74  fo *dInfoPtr = t
a540: 65 78 74 50 74 72 2d 3e 64 49 6e 66 6f 50 74 72  extPtr->dInfoPtr
a550: 3b 0a 20 20 20 20 69 6e 74 20 68 65 69 67 68 74  ;.    int height
a560: 2c 20 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  , x;..    /*.   
a570: 20 20 2a 20 46 69 72 73 74 2c 20 63 6c 65 61 72    * First, clear
a580: 20 74 68 65 20 61 72 65 61 20 6f 66 20 74 68 65   the area of the
a590: 20 6c 69 6e 65 20 74 6f 20 74 68 65 20 62 61 63   line to the bac
a5a0: 6b 67 72 6f 75 6e 64 20 63 6f 6c 6f 72 20 66 6f  kground color fo
a5b0: 72 20 74 68 65 0a 20 20 20 20 20 2a 20 74 65 78  r the.     * tex
a5c0: 74 20 77 69 64 67 65 74 2e 0a 20 20 20 20 20 2a  t widget..     *
a5d0: 2f 0a 0a 20 20 20 20 68 65 69 67 68 74 20 3d 20  /..    height = 
a5e0: 64 6c 50 74 72 2d 3e 68 65 69 67 68 74 3b 0a 20  dlPtr->height;. 
a5f0: 20 20 20 69 66 20 28 28 68 65 69 67 68 74 20 2b     if ((height +
a600: 20 64 6c 50 74 72 2d 3e 79 29 20 3e 20 64 49 6e   dlPtr->y) > dIn
a610: 66 6f 50 74 72 2d 3e 6d 61 78 59 29 20 7b 0a 09  foPtr->maxY) {..
a620: 68 65 69 67 68 74 20 3d 20 64 49 6e 66 6f 50 74  height = dInfoPt
a630: 72 2d 3e 6d 61 78 59 20 2d 20 64 6c 50 74 72 2d  r->maxY - dlPtr-
a640: 3e 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 43 74  >y;.    }.    Ct
a650: 6b 5f 46 69 6c 6c 52 65 63 74 28 77 69 6e 2c 20  k_FillRect(win, 
a660: 64 49 6e 66 6f 50 74 72 2d 3e 78 2c 20 64 6c 50  dInfoPtr->x, dlP
a670: 74 72 2d 3e 79 2c 20 64 49 6e 66 6f 50 74 72 2d  tr->y, dInfoPtr-
a680: 3e 6d 61 78 58 2c 20 64 6c 50 74 72 2d 3e 79 2b  >maxX, dlPtr->y+
a690: 68 65 69 67 68 74 2c 0a 20 20 20 20 09 20 20 20  height,.    .   
a6a0: 20 43 54 4b 5f 50 4c 41 49 4e 5f 53 54 59 4c 45   CTK_PLAIN_STYLE
a6b0: 2c 20 27 20 27 29 3b 0a 0a 20 20 20 20 2f 2a 0a  , ' ');..    /*.
a6c0: 20 20 20 20 20 2a 20 4d 61 6b 65 20 79 65 74 20       * Make yet 
a6d0: 61 6e 6f 74 68 65 72 20 70 61 73 73 20 74 68 72  another pass thr
a6e0: 6f 75 67 68 20 61 6c 6c 20 6f 66 20 74 68 65 20  ough all of the 
a6f0: 63 68 75 6e 6b 73 20 74 6f 20 72 65 64 72 61 77  chunks to redraw
a700: 20 61 6c 6c 20 6f 66 0a 20 20 20 20 20 2a 20 66   all of.     * f
a710: 6f 72 65 67 72 6f 75 6e 64 20 69 6e 66 6f 72 6d  oreground inform
a720: 61 74 69 6f 6e 2e 20 20 4e 6f 74 65 3a 20 20 77  ation.  Note:  w
a730: 65 20 68 61 76 65 20 74 6f 20 63 61 6c 6c 20 74  e have to call t
a740: 68 65 20 64 69 73 70 6c 61 79 50 72 6f 63 0a 20  he displayProc. 
a750: 20 20 20 20 2a 20 65 76 65 6e 20 66 6f 72 20 63      * even for c
a760: 68 75 6e 6b 73 20 74 68 61 74 20 61 72 65 20 6f  hunks that are o
a770: 66 66 2d 73 63 72 65 65 6e 2e 20 20 54 68 69 73  ff-screen.  This
a780: 20 69 73 20 6e 65 65 64 65 64 2c 20 66 6f 72 0a   is needed, for.
a790: 20 20 20 20 20 2a 20 65 78 61 6d 70 6c 65 2c 20       * example, 
a7a0: 73 6f 20 74 68 61 74 20 65 6d 62 65 64 64 65 64  so that embedded
a7b0: 20 77 69 6e 64 6f 77 73 20 63 61 6e 20 62 65 20   windows can be 
a7c0: 75 6e 6d 61 70 70 65 64 20 69 6e 20 74 68 69 73  unmapped in this
a7d0: 20 63 61 73 65 2e 0a 20 20 20 20 20 2a 20 43 6f   case..     * Co
a7e0: 6e 76 65 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  nve.     */..   
a7f0: 20 66 6f 72 20 28 63 68 75 6e 6b 50 74 72 20 3d   for (chunkPtr =
a800: 20 64 6c 50 74 72 2d 3e 63 68 75 6e 6b 50 74 72   dlPtr->chunkPtr
a810: 3b 20 28 63 68 75 6e 6b 50 74 72 20 21 3d 20 4e  ; (chunkPtr != N
a820: 55 4c 4c 29 3b 0a 09 20 20 20 20 63 68 75 6e 6b  ULL);..    chunk
a830: 50 74 72 20 3d 20 63 68 75 6e 6b 50 74 72 2d 3e  Ptr = chunkPtr->
a840: 6e 65 78 74 50 74 72 29 20 7b 0a 09 78 20 3d 20  nextPtr) {..x = 
a850: 63 68 75 6e 6b 50 74 72 2d 3e 78 20 2b 20 64 49  chunkPtr->x + dI
a860: 6e 66 6f 50 74 72 2d 3e 78 20 2d 20 64 49 6e 66  nfoPtr->x - dInf
a870: 6f 50 74 72 2d 3e 63 75 72 50 69 78 65 6c 4f 66  oPtr->curPixelOf
a880: 66 73 65 74 3b 0a 09 69 66 20 28 28 78 20 2b 20  fset;..if ((x + 
a890: 63 68 75 6e 6b 50 74 72 2d 3e 77 69 64 74 68 20  chunkPtr->width 
a8a0: 3c 3d 20 30 29 20 7c 7c 20 28 78 20 3e 3d 20 64  <= 0) || (x >= d
a8b0: 49 6e 66 6f 50 74 72 2d 3e 6d 61 78 58 29 29 20  InfoPtr->maxX)) 
a8c0: 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20  {..    /*..     
a8d0: 2a 20 4e 6f 74 65 3a 20 20 77 65 20 68 61 76 65  * Note:  we have
a8e0: 20 74 6f 20 63 61 6c 6c 20 74 68 65 20 64 69 73   to call the dis
a8f0: 70 6c 61 79 50 72 6f 63 20 65 76 65 6e 20 66 6f  playProc even fo
a900: 72 20 63 68 75 6e 6b 73 0a 09 20 20 20 20 20 2a  r chunks..     *
a910: 20 74 68 61 74 20 61 72 65 20 6f 66 66 2d 73 63   that are off-sc
a920: 72 65 65 6e 2e 20 20 54 68 69 73 20 69 73 20 6e  reen.  This is n
a930: 65 65 64 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  eeded, for examp
a940: 6c 65 2c 20 73 6f 0a 09 20 20 20 20 20 2a 20 74  le, so..     * t
a950: 68 61 74 20 65 6d 62 65 64 64 65 64 20 77 69 6e  hat embedded win
a960: 64 6f 77 73 20 63 61 6e 20 62 65 20 75 6e 6d 61  dows can be unma
a970: 70 70 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  pped in this cas
a980: 65 2e 0a 09 20 20 20 20 20 2a 20 44 69 73 70 6c  e...     * Displ
a990: 61 79 20 74 68 65 20 63 68 75 6e 6b 20 61 74 20  ay the chunk at 
a9a0: 61 20 63 6f 6f 72 64 69 6e 61 74 65 20 74 68 61  a coordinate tha
a9b0: 74 20 63 61 6e 20 62 65 20 63 6c 65 61 72 6c 79  t can be clearly
a9c0: 0a 09 20 20 20 20 20 2a 20 69 64 65 6e 74 69 66  ..     * identif
a9d0: 69 65 64 20 62 79 20 74 68 65 20 64 69 73 70 6c  ied by the displ
a9e0: 61 79 50 72 6f 63 20 61 73 20 62 65 69 6e 67 20  ayProc as being 
a9f0: 6f 66 66 2d 73 63 72 65 65 6e 20 74 6f 0a 09 20  off-screen to.. 
aa00: 20 20 20 20 2a 20 74 68 65 20 6c 65 66 74 20 28      * the left (
aa10: 74 68 65 20 64 69 73 70 6c 61 79 50 72 6f 63 20  the displayProc 
aa20: 6d 61 79 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  may not be able 
aa30: 74 6f 20 74 65 6c 6c 20 69 66 0a 09 20 20 20 20  to tell if..    
aa40: 20 2a 20 73 6f 6d 65 74 68 69 6e 67 20 69 73 20   * something is 
aa50: 6f 66 66 20 74 6f 20 74 68 65 20 72 69 67 68 74  off to the right
aa60: 29 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20  )...     */...  
aa70: 20 20 28 2a 63 68 75 6e 6b 50 74 72 2d 3e 64 69    (*chunkPtr->di
aa80: 73 70 6c 61 79 50 72 6f 63 29 28 63 68 75 6e 6b  splayProc)(chunk
aa90: 50 74 72 2c 20 2d 63 68 75 6e 6b 50 74 72 2d 3e  Ptr, -chunkPtr->
aaa0: 77 69 64 74 68 2c 0a 09 09 20 20 20 20 64 6c 50  width,...    dlP
aab0: 74 72 2d 3e 79 20 2b 20 64 6c 50 74 72 2d 3e 73  tr->y + dlPtr->s
aac0: 70 61 63 65 41 62 6f 76 65 2c 20 77 69 6e 29 3b  paceAbove, win);
aad0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
aae0: 28 2a 63 68 75 6e 6b 50 74 72 2d 3e 64 69 73 70  (*chunkPtr->disp
aaf0: 6c 61 79 50 72 6f 63 29 28 63 68 75 6e 6b 50 74  layProc)(chunkPt
ab00: 72 2c 20 78 2c 20 64 6c 50 74 72 2d 3e 79 20 2b  r, x, dlPtr->y +
ab10: 20 64 6c 50 74 72 2d 3e 73 70 61 63 65 41 62 6f   dlPtr->spaceAbo
ab20: 76 65 2c 0a 09 20 20 20 20 09 20 20 20 20 77 69  ve,..    .    wi
ab30: 6e 29 3b 0a 09 7d 0a 09 69 66 20 28 64 49 6e 66  n);..}..if (dInf
ab40: 6f 50 74 72 2d 3e 64 4c 69 6e 65 73 49 6e 76 61  oPtr->dLinesInva
ab50: 6c 69 64 61 74 65 64 29 20 7b 0a 09 20 20 20 20  lidated) {..    
ab60: 72 65 74 75 72 6e 3b 0a 09 7d 0a 20 20 20 20 7d  return;..}.    }
ab70: 0a 0a 20 20 20 20 6c 69 6e 65 73 52 65 64 72 61  ..    linesRedra
ab80: 77 6e 2b 2b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  wn++;.}.../*. *-
ab90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
abb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
abc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
abd0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 73 70  -----. *. * Disp
abe0: 6c 61 79 54 65 78 74 20 2d 2d 0a 20 2a 0a 20 2a  layText --. *. *
abf0: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
ac00: 69 73 20 69 6e 76 6f 6b 65 64 20 61 73 20 61 20  is invoked as a 
ac10: 77 68 65 6e 2d 69 64 6c 65 20 68 61 6e 64 6c 65  when-idle handle
ac20: 72 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 0a  r to update the.
ac30: 20 2a 09 64 69 73 70 6c 61 79 2e 20 20 49 74 20   *.display.  It 
ac40: 6f 6e 6c 79 20 72 65 64 69 73 70 6c 61 79 73 20  only redisplays 
ac50: 74 68 65 20 70 61 72 74 73 20 6f 66 20 74 68 65  the parts of the
ac60: 20 74 65 78 74 20 77 69 64 67 65 74 20 74 68 61   text widget tha
ac70: 74 0a 20 2a 09 61 72 65 20 6f 75 74 20 6f 66 20  t. *.are out of 
ac80: 64 61 74 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  date.. *. * Resu
ac90: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  lts:. *.None.. *
aca0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
acb0: 3a 0a 20 2a 09 49 6e 66 6f 72 6d 61 74 69 6f 6e  :. *.Information
acc0: 20 69 73 20 72 65 64 72 61 77 6e 20 6f 6e 20 74   is redrawn on t
acd0: 68 65 20 73 63 72 65 65 6e 2e 0a 20 2a 0a 20 2a  he screen.. *. *
ace0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
acf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad20: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
ad30: 69 63 20 76 6f 69 64 0a 44 69 73 70 6c 61 79 54  ic void.DisplayT
ad40: 65 78 74 28 63 6c 69 65 6e 74 44 61 74 61 29 0a  ext(clientData).
ad50: 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63      ClientData c
ad60: 6c 69 65 6e 74 44 61 74 61 3b 09 2f 2a 20 49 6e  lientData;./* In
ad70: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
ad80: 77 69 64 67 65 74 2e 20 2a 2f 0a 7b 0a 20 20 20  widget. */.{.   
ad90: 20 72 65 67 69 73 74 65 72 20 54 6b 54 65 78 74   register TkText
ada0: 20 2a 74 65 78 74 50 74 72 20 3d 20 28 54 6b 54   *textPtr = (TkT
adb0: 65 78 74 20 2a 29 20 63 6c 69 65 6e 74 44 61 74  ext *) clientDat
adc0: 61 3b 0a 20 20 20 20 44 49 6e 66 6f 20 2a 64 49  a;.    DInfo *dI
add0: 6e 66 6f 50 74 72 20 3d 20 74 65 78 74 50 74 72  nfoPtr = textPtr
ade0: 2d 3e 64 49 6e 66 6f 50 74 72 3b 0a 20 20 20 20  ->dInfoPtr;.    
adf0: 72 65 67 69 73 74 65 72 20 44 4c 69 6e 65 20 2a  register DLine *
ae00: 64 6c 50 74 72 3b 0a 20 20 20 20 44 4c 69 6e 65  dlPtr;.    DLine
ae10: 20 2a 70 72 65 76 50 74 72 3b 0a 20 20 20 20 69   *prevPtr;.    i
ae20: 6e 74 20 62 6f 74 74 6f 6d 59 20 3d 20 30 3b 09  nt bottomY = 0;.
ae30: 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 61 74 69  ./* Initializati
ae40: 6f 6e 20 6e 65 65 64 65 64 20 6f 6e 6c 79 20 74  on needed only t
ae50: 6f 20 73 74 6f 70 0a 09 09 09 09 20 2a 20 63 6f  o stop..... * co
ae60: 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 2e  mpiler warnings.
ae70: 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 74 65 78   */..    if (tex
ae80: 74 50 74 72 2d 3e 74 6b 77 69 6e 20 3d 3d 20 4e  tPtr->tkwin == N
ae90: 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54  ULL) {../*.. * T
aea0: 68 65 20 77 69 64 67 65 74 20 68 61 73 20 62 65  he widget has be
aeb0: 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 44 6f 6e  en deleted.  Don
aec0: 27 74 20 64 6f 20 61 6e 79 74 68 69 6e 67 2e 0a  't do anything..
aed0: 09 20 2a 2f 0a 0a 09 72 65 74 75 72 6e 3b 0a 20  . */...return;. 
aee0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 74 6b     }..    if (tk
aef0: 54 65 78 74 44 65 62 75 67 29 20 7b 0a 09 54 63  TextDebug) {..Tc
af00: 6c 5f 53 65 74 56 61 72 32 28 74 65 78 74 50 74  l_SetVar2(textPt
af10: 72 2d 3e 69 6e 74 65 72 70 2c 20 22 74 6b 5f 74  r->interp, "tk_t
af20: 65 78 74 52 65 6c 61 79 6f 75 74 22 2c 20 28 63  extRelayout", (c
af30: 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 0a 09 09 22  har *) NULL,..."
af40: 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
af50: 4c 59 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  LY);.    }..    
af60: 69 66 20 28 21 54 6b 5f 49 73 4d 61 70 70 65 64  if (!Tk_IsMapped
af70: 28 74 65 78 74 50 74 72 2d 3e 74 6b 77 69 6e 29  (textPtr->tkwin)
af80: 20 7c 7c 20 28 64 49 6e 66 6f 50 74 72 2d 3e 6d   || (dInfoPtr->m
af90: 61 78 58 20 3c 3d 20 64 49 6e 66 6f 50 74 72 2d  axX <= dInfoPtr-
afa0: 3e 78 29 0a 09 20 20 20 20 7c 7c 20 28 64 49 6e  >x)..    || (dIn
afb0: 66 6f 50 74 72 2d 3e 6d 61 78 59 20 3c 3d 20 64  foPtr->maxY <= d
afc0: 49 6e 66 6f 50 74 72 2d 3e 79 29 29 20 7b 0a 09  InfoPtr->y)) {..
afd0: 55 70 64 61 74 65 44 69 73 70 6c 61 79 49 6e 66  UpdateDisplayInf
afe0: 6f 28 74 65 78 74 50 74 72 29 3b 0a 09 64 49 6e  o(textPtr);..dIn
aff0: 66 6f 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20  foPtr->flags &= 
b000: 7e 52 45 44 52 41 57 5f 50 45 4e 44 49 4e 47 3b  ~REDRAW_PENDING;
b010: 0a 09 67 6f 74 6f 20 64 6f 53 63 72 6f 6c 6c 62  ..goto doScrollb
b020: 61 72 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  ars;.    }.    n
b030: 75 6d 52 65 64 69 73 70 6c 61 79 73 2b 2b 3b 0a  umRedisplays++;.
b040: 20 20 20 20 69 66 20 28 74 6b 54 65 78 74 44 65      if (tkTextDe
b050: 62 75 67 29 20 7b 0a 09 54 63 6c 5f 53 65 74 56  bug) {..Tcl_SetV
b060: 61 72 32 28 74 65 78 74 50 74 72 2d 3e 69 6e 74  ar2(textPtr->int
b070: 65 72 70 2c 20 22 74 6b 5f 74 65 78 74 52 65 64  erp, "tk_textRed
b080: 72 61 77 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  raw", (char *) N
b090: 55 4c 4c 2c 0a 09 09 22 22 2c 20 54 43 4c 5f 47  ULL,..."", TCL_G
b0a0: 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
b0b0: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
b0c0: 2a 20 46 69 72 73 74 20 72 65 63 6f 6d 70 75 74  * First recomput
b0d0: 65 20 77 68 61 74 27 73 20 73 75 70 70 6f 73 65  e what's suppose
b0e0: 64 20 74 6f 20 62 65 20 64 69 73 70 6c 61 79 65  d to be displaye
b0f0: 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  d..     */..    
b100: 55 70 64 61 74 65 44 69 73 70 6c 61 79 49 6e 66  UpdateDisplayInf
b110: 6f 28 74 65 78 74 50 74 72 29 3b 0a 20 20 20 20  o(textPtr);.    
b120: 64 49 6e 66 6f 50 74 72 2d 3e 64 4c 69 6e 65 73  dInfoPtr->dLines
b130: 49 6e 76 61 6c 69 64 61 74 65 64 20 3d 20 30 3b  Invalidated = 0;
b140: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
b150: 43 6c 65 61 72 20 74 68 65 20 52 45 44 52 41 57  Clear the REDRAW
b160: 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 68 65  _PENDING flag he
b170: 72 65 2e 20 20 54 68 69 73 20 69 73 20 61 63 74  re.  This is act
b180: 75 61 6c 6c 79 20 70 72 65 74 74 79 0a 20 20 20  ually pretty.   
b190: 20 20 2a 20 74 72 69 63 6b 79 2e 20 20 57 65 20    * tricky.  We 
b1a0: 77 61 6e 74 20 74 6f 20 77 61 69 74 20 75 6e 74  want to wait unt
b1b0: 69 6c 20 2a 61 66 74 65 72 2a 20 64 6f 69 6e 67  il *after* doing
b1c0: 20 74 68 65 20 73 63 72 6f 6c 6c 69 6e 67 2c 0a   the scrolling,.
b1d0: 20 20 20 20 20 2a 20 73 69 6e 63 65 20 74 68 61       * since tha
b1e0: 74 20 63 6f 75 6c 64 20 67 65 6e 65 72 61 74 65  t could generate
b1f0: 20 6d 6f 72 65 20 61 72 65 61 73 20 74 6f 20 72   more areas to r
b200: 65 64 72 61 77 20 61 6e 64 20 64 6f 6e 27 74 0a  edraw and don't.
b210: 20 20 20 20 20 2a 20 77 61 6e 74 20 74 6f 20 72       * want to r
b220: 65 73 63 68 65 64 75 6c 65 20 61 20 72 65 64 69  eschedule a redi
b230: 73 70 6c 61 79 20 66 6f 72 20 74 68 65 6d 2e 20  splay for them. 
b240: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
b250: 6e 64 2c 0a 20 20 20 20 20 2a 20 77 65 20 63 61  nd,.     * we ca
b260: 6e 27 74 20 77 61 69 74 20 75 6e 74 69 6c 20 61  n't wait until a
b270: 66 74 65 72 20 61 6c 6c 20 74 68 65 20 72 65 64  fter all the red
b280: 69 73 70 6c 61 79 69 6e 67 2c 20 62 65 63 61 75  isplaying, becau
b290: 73 65 20 74 68 65 0a 20 20 20 20 20 2a 20 61 63  se the.     * ac
b2a0: 74 20 6f 66 20 72 65 64 69 73 70 6c 61 79 69 6e  t of redisplayin
b2b0: 67 20 63 6f 75 6c 64 20 61 63 74 75 61 6c 6c 79  g could actually
b2c0: 20 67 65 6e 65 72 61 74 65 20 6d 6f 72 65 20 72   generate more r
b2d0: 65 64 69 73 70 6c 61 79 73 0a 20 20 20 20 20 2a  edisplays.     *
b2e0: 20 28 65 2e 67 2e 20 69 6e 20 74 68 65 20 63 61   (e.g. in the ca
b2f0: 73 65 20 6f 66 20 61 20 6e 65 73 74 65 64 20 77  se of a nested w
b300: 69 6e 64 6f 77 20 77 69 74 68 20 65 76 65 6e 74  indow with event
b310: 20 62 69 6e 64 69 6e 67 73 20 74 72 69 67 67 65   bindings trigge
b320: 72 65 64 0a 20 20 20 20 20 2a 20 62 79 20 72 65  red.     * by re
b330: 64 69 73 70 6c 61 79 29 2e 0a 20 20 20 20 20 2a  display)..     *
b340: 2f 0a 0a 20 20 20 20 64 49 6e 66 6f 50 74 72 2d  /..    dInfoPtr-
b350: 3e 66 6c 61 67 73 20 26 3d 20 7e 52 45 44 52 41  >flags &= ~REDRA
b360: 57 5f 50 45 4e 44 49 4e 47 3b 0a 0a 20 20 20 20  W_PENDING;..    
b370: 2f 2a 0a 20 20 20 20 20 2a 20 52 65 64 72 61 77  /*.     * Redraw
b380: 20 74 68 65 20 62 6f 72 64 65 72 73 20 69 66 20   the borders if 
b390: 74 68 61 74 27 73 20 6e 65 65 64 65 64 2e 0a 20  that's needed.. 
b3a0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28      */..    if (
b3b0: 64 49 6e 66 6f 50 74 72 2d 3e 66 6c 61 67 73 20  dInfoPtr->flags 
b3c0: 26 20 52 45 44 52 41 57 5f 42 4f 52 44 45 52 53  & REDRAW_BORDERS
b3d0: 29 20 7b 0a 09 69 66 20 28 74 6b 54 65 78 74 44  ) {..if (tkTextD
b3e0: 65 62 75 67 29 20 7b 0a 09 20 20 20 20 54 63 6c  ebug) {..    Tcl
b3f0: 5f 53 65 74 56 61 72 32 28 74 65 78 74 50 74 72  _SetVar2(textPtr
b400: 2d 3e 69 6e 74 65 72 70 2c 20 22 74 6b 5f 74 65  ->interp, "tk_te
b410: 78 74 52 65 64 72 61 77 22 2c 0a 09 09 20 20 20  xtRedraw",...   
b420: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 20   (char *) NULL, 
b430: 22 62 6f 72 64 65 72 73 22 2c 0a 09 09 20 20 20  "borders",...   
b440: 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
b450: 7c 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55  |TCL_APPEND_VALU
b460: 45 7c 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45  E|TCL_LIST_ELEME
b470: 4e 54 29 3b 0a 09 7d 0a 09 43 74 6b 5f 44 72 61  NT);..}..Ctk_Dra
b480: 77 42 6f 72 64 65 72 28 74 65 78 74 50 74 72 2d  wBorder(textPtr-
b490: 3e 74 6b 77 69 6e 2c 20 43 54 4b 5f 50 4c 41 49  >tkwin, CTK_PLAI
b4a0: 4e 5f 53 54 59 4c 45 2c 20 28 63 68 61 72 20 2a  N_STYLE, (char *
b4b0: 29 20 4e 55 4c 4c 29 3b 0a 09 64 49 6e 66 6f 50  ) NULL);..dInfoP
b4c0: 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 52 45  tr->flags &= ~RE
b4d0: 44 52 41 57 5f 42 4f 52 44 45 52 53 3b 0a 20 20  DRAW_BORDERS;.  
b4e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
b4f0: 20 2a 20 4e 6f 77 20 72 65 64 72 61 77 20 74 68   * Now redraw th
b500: 65 20 6c 69 6e 65 73 2e 0a 20 20 20 20 20 2a 2f  e lines..     */
b510: 0a 0a 20 20 20 20 66 6f 72 20 28 70 72 65 76 50  ..    for (prevP
b520: 74 72 20 3d 20 4e 55 4c 4c 2c 20 64 6c 50 74 72  tr = NULL, dlPtr
b530: 20 3d 20 74 65 78 74 50 74 72 2d 3e 64 49 6e 66   = textPtr->dInf
b540: 6f 50 74 72 2d 3e 64 4c 69 6e 65 50 74 72 3b 0a  oPtr->dLinePtr;.
b550: 09 20 20 20 20 28 64 6c 50 74 72 20 21 3d 20 4e  .    (dlPtr != N
b560: 55 4c 4c 29 20 26 26 20 28 64 6c 50 74 72 2d 3e  ULL) && (dlPtr->
b570: 79 20 3c 20 64 49 6e 66 6f 50 74 72 2d 3e 6d 61  y < dInfoPtr->ma
b580: 78 59 29 3b 0a 09 20 20 20 20 70 72 65 76 50 74  xY);..    prevPt
b590: 72 20 3d 20 64 6c 50 74 72 2c 20 64 6c 50 74 72  r = dlPtr, dlPtr
b5a0: 20 3d 20 64 6c 50 74 72 2d 3e 6e 65 78 74 50 74   = dlPtr->nextPt
b5b0: 72 29 20 7b 0a 09 69 66 20 28 64 6c 50 74 72 2d  r) {..if (dlPtr-
b5c0: 3e 6f 6c 64 59 20 21 3d 20 64 6c 50 74 72 2d 3e  >oldY != dlPtr->
b5d0: 79 29 20 7b 0a 09 20 20 20 20 69 66 20 28 74 6b  y) {..    if (tk
b5e0: 54 65 78 74 44 65 62 75 67 29 20 7b 0a 09 09 63  TextDebug) {...c
b5f0: 68 61 72 20 73 74 72 69 6e 67 5b 54 4b 5f 50 4f  har string[TK_PO
b600: 53 5f 43 48 41 52 53 5d 3b 0a 09 09 54 6b 54 65  S_CHARS];...TkTe
b610: 78 74 50 72 69 6e 74 49 6e 64 65 78 28 26 64 6c  xtPrintIndex(&dl
b620: 50 74 72 2d 3e 69 6e 64 65 78 2c 20 73 74 72 69  Ptr->index, stri
b630: 6e 67 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61  ng);...Tcl_SetVa
b640: 72 32 28 74 65 78 74 50 74 72 2d 3e 69 6e 74 65  r2(textPtr->inte
b650: 72 70 2c 20 22 74 6b 5f 74 65 78 74 52 65 64 72  rp, "tk_textRedr
b660: 61 77 22 2c 0a 09 09 09 28 63 68 61 72 20 2a 29  aw",....(char *)
b670: 20 4e 55 4c 4c 2c 20 73 74 72 69 6e 67 2c 0a 09   NULL, string,..
b680: 09 09 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  ..TCL_GLOBAL_ONL
b690: 59 7c 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c  Y|TCL_APPEND_VAL
b6a0: 55 45 7c 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d  UE|TCL_LIST_ELEM
b6b0: 45 4e 54 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20  ENT);..    }..  
b6c0: 20 20 44 69 73 70 6c 61 79 44 4c 69 6e 65 28 74    DisplayDLine(t
b6d0: 65 78 74 50 74 72 2c 20 64 6c 50 74 72 2c 20 70  extPtr, dlPtr, p
b6e0: 72 65 76 50 74 72 29 3b 0a 09 20 20 20 20 69 66  revPtr);..    if
b6f0: 20 28 64 49 6e 66 6f 50 74 72 2d 3e 64 4c 69 6e   (dInfoPtr->dLin
b700: 65 73 49 6e 76 61 6c 69 64 61 74 65 64 29 20 7b  esInvalidated) {
b710: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20  ...return;..    
b720: 7d 0a 09 20 20 20 20 64 6c 50 74 72 2d 3e 6f 6c  }..    dlPtr->ol
b730: 64 59 20 3d 20 64 6c 50 74 72 2d 3e 79 3b 0a 09  dY = dlPtr->y;..
b740: 20 20 20 20 64 6c 50 74 72 2d 3e 66 6c 61 67 73      dlPtr->flags
b750: 20 26 3d 20 7e 4e 45 57 5f 4c 41 59 4f 55 54 3b   &= ~NEW_LAYOUT;
b760: 0a 09 7d 0a 09 62 6f 74 74 6f 6d 59 20 3d 20 64  ..}..bottomY = d
b770: 6c 50 74 72 2d 3e 79 20 2b 20 64 6c 50 74 72 2d  lPtr->y + dlPtr-
b780: 3e 68 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20  >height;.    }. 
b790: 20 20 20 66 6f 72 20 28 20 3b 20 64 6c 50 74 72     for ( ; dlPtr
b7a0: 20 21 3d 20 4e 55 4c 4c 3b 20 64 6c 50 74 72 20   != NULL; dlPtr 
b7b0: 3d 20 64 6c 50 74 72 2d 3e 6e 65 78 74 50 74 72  = dlPtr->nextPtr
b7c0: 29 20 7b 0a 09 62 6f 74 74 6f 6d 59 20 3d 20 64  ) {..bottomY = d
b7d0: 6c 50 74 72 2d 3e 79 20 2b 20 64 6c 50 74 72 2d  lPtr->y + dlPtr-
b7e0: 3e 68 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a 0a  >height;.    }..
b7f0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65      /*.     * Se
b800: 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
b810: 72 65 66 72 65 73 68 20 74 68 65 20 70 61 72 74  refresh the part
b820: 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20 62   of the window b
b830: 65 6c 6f 77 20 74 68 65 0a 20 20 20 20 20 2a 20  elow the.     * 
b840: 6c 61 73 74 20 6c 69 6e 65 20 6f 66 20 74 65 78  last line of tex
b850: 74 20 28 69 66 20 74 68 65 72 65 20 69 73 20 61  t (if there is a
b860: 6e 79 20 73 75 63 68 20 61 72 65 61 29 2e 0a 20  ny such area).. 
b870: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28      */..    if (
b880: 64 49 6e 66 6f 50 74 72 2d 3e 74 6f 70 4f 66 45  dInfoPtr->topOfE
b890: 6f 66 20 3e 20 64 49 6e 66 6f 50 74 72 2d 3e 6d  of > dInfoPtr->m
b8a0: 61 78 59 29 20 7b 0a 09 64 49 6e 66 6f 50 74 72  axY) {..dInfoPtr
b8b0: 2d 3e 74 6f 70 4f 66 45 6f 66 20 3d 20 64 49 6e  ->topOfEof = dIn
b8c0: 66 6f 50 74 72 2d 3e 6d 61 78 59 3b 0a 20 20 20  foPtr->maxY;.   
b8d0: 20 7d 0a 20 20 20 20 69 66 20 28 62 6f 74 74 6f   }.    if (botto
b8e0: 6d 59 20 3c 20 64 49 6e 66 6f 50 74 72 2d 3e 74  mY < dInfoPtr->t
b8f0: 6f 70 4f 66 45 6f 66 29 20 7b 0a 09 69 66 20 28  opOfEof) {..if (
b900: 74 6b 54 65 78 74 44 65 62 75 67 29 20 7b 0a 09  tkTextDebug) {..
b910: 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28      Tcl_SetVar2(
b920: 74 65 78 74 50 74 72 2d 3e 69 6e 74 65 72 70 2c  textPtr->interp,
b930: 20 22 74 6b 5f 74 65 78 74 52 65 64 72 61 77 22   "tk_textRedraw"
b940: 2c 0a 09 09 20 20 20 20 28 63 68 61 72 20 2a 29  ,...    (char *)
b950: 20 4e 55 4c 4c 2c 20 22 65 6f 66 22 2c 0a 09 09   NULL, "eof",...
b960: 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f      TCL_GLOBAL_O
b970: 4e 4c 59 7c 54 43 4c 5f 41 50 50 45 4e 44 5f 56  NLY|TCL_APPEND_V
b980: 41 4c 55 45 7c 54 43 4c 5f 4c 49 53 54 5f 45 4c  ALUE|TCL_LIST_EL
b990: 45 4d 45 4e 54 29 3b 0a 09 7d 0a 09 43 74 6b 5f  EMENT);..}..Ctk_
b9a0: 46 69 6c 6c 52 65 63 74 28 74 65 78 74 50 74 72  FillRect(textPtr
b9b0: 2d 3e 74 6b 77 69 6e 2c 0a 09 09 64 49 6e 66 6f  ->tkwin,...dInfo
b9c0: 50 74 72 2d 3e 78 2c 20 62 6f 74 74 6f 6d 59 2c  Ptr->x, bottomY,
b9d0: 20 64 49 6e 66 6f 50 74 72 2d 3e 6d 61 78 58 2c   dInfoPtr->maxX,
b9e0: 20 64 49 6e 66 6f 50 74 72 2d 3e 74 6f 70 4f 66   dInfoPtr->topOf
b9f0: 45 6f 66 2c 0a 09 09 43 54 4b 5f 50 4c 41 49 4e  Eof,...CTK_PLAIN
ba00: 5f 53 54 59 4c 45 2c 20 27 20 27 29 3b 0a 20 20  _STYLE, ' ');.  
ba10: 20 20 7d 0a 20 20 20 20 64 49 6e 66 6f 50 74 72    }.    dInfoPtr
ba20: 2d 3e 74 6f 70 4f 66 45 6f 66 20 3d 20 62 6f 74  ->topOfEof = bot
ba30: 74 6f 6d 59 3b 0a 0a 20 20 20 20 64 6f 53 63 72  tomY;..    doScr
ba40: 6f 6c 6c 62 61 72 73 3a 0a 0a 20 20 20 20 2f 2a  ollbars:..    /*
ba50: 0a 20 20 20 20 20 2a 20 55 70 64 61 74 65 20 74  .     * Update t
ba60: 68 65 20 76 65 72 74 69 63 61 6c 20 73 63 72 6f  he vertical scro
ba70: 6c 6c 62 61 72 2c 20 69 66 20 74 68 65 72 65 20  llbar, if there 
ba80: 69 73 20 6f 6e 65 2e 20 20 4e 6f 74 65 3a 20 20  is one.  Note:  
ba90: 69 74 27 73 0a 20 20 20 20 20 2a 20 69 6d 70 6f  it's.     * impo
baa0: 72 74 61 6e 74 20 74 6f 20 63 6c 65 61 72 20 52  rtant to clear R
bab0: 45 44 52 41 57 5f 50 45 4e 44 49 4e 47 20 68 65  EDRAW_PENDING he
bac0: 72 65 2c 20 6a 75 73 74 20 69 6e 20 63 61 73 65  re, just in case
bad0: 20 74 68 65 0a 20 20 20 20 20 2a 20 73 63 72 6f   the.     * scro
bae0: 6c 6c 20 70 72 6f 63 65 64 75 72 65 20 64 6f 65  ll procedure doe
baf0: 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  s something that
bb00: 20 72 65 71 75 69 72 65 73 20 72 65 64 69 73 70   requires redisp
bb10: 6c 61 79 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  lay..     */..  
bb20: 20 20 69 66 20 28 74 65 78 74 50 74 72 2d 3e 66    if (textPtr->f
bb30: 6c 61 67 73 20 26 20 55 50 44 41 54 45 5f 53 43  lags & UPDATE_SC
bb40: 52 4f 4c 4c 42 41 52 53 29 20 7b 0a 09 74 65 78  ROLLBARS) {..tex
bb50: 74 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  tPtr->flags &= ~
bb60: 55 50 44 41 54 45 5f 53 43 52 4f 4c 4c 42 41 52  UPDATE_SCROLLBAR
bb70: 53 3b 0a 09 69 66 20 28 74 65 78 74 50 74 72 2d  S;..if (textPtr-
bb80: 3e 79 53 63 72 6f 6c 6c 43 6d 64 20 21 3d 20 4e  >yScrollCmd != N
bb90: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 47 65 74 59  ULL) {..    GetY
bba0: 56 69 65 77 28 74 65 78 74 50 74 72 2d 3e 69 6e  View(textPtr->in
bbb0: 74 65 72 70 2c 20 74 65 78 74 50 74 72 2c 20 31  terp, textPtr, 1
bbc0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 55  );..}.../*.. * U
bbd0: 70 64 61 74 65 20 74 68 65 20 68 6f 72 69 7a 6f  pdate the horizo
bbe0: 6e 74 61 6c 20 73 63 72 6f 6c 6c 62 61 72 2c 20  ntal scrollbar, 
bbf0: 69 66 20 61 6e 79 2e 0a 09 20 2a 2f 0a 0a 09 69  if any... */...i
bc00: 66 20 28 74 65 78 74 50 74 72 2d 3e 78 53 63 72  f (textPtr->xScr
bc10: 6f 6c 6c 43 6d 64 20 21 3d 20 4e 55 4c 4c 29 20  ollCmd != NULL) 
bc20: 7b 0a 09 20 20 20 20 47 65 74 58 56 69 65 77 28  {..    GetXView(
bc30: 74 65 78 74 50 74 72 2d 3e 69 6e 74 65 72 70 2c  textPtr->interp,
bc40: 20 74 65 78 74 50 74 72 2c 20 31 29 3b 0a 09 7d   textPtr, 1);..}
bc50: 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  .    }.}.../*. *
bc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bca0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6b 54  ------. *. * TkT
bcb0: 65 78 74 52 65 64 72 61 77 52 65 67 69 6f 6e 20  extRedrawRegion 
bcc0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
bcd0: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
bce0: 65 64 20 74 6f 20 73 63 68 65 64 75 6c 65 20 61  ed to schedule a
bcf0: 20 72 65 64 69 73 70 6c 61 79 20 66 6f 72 20 61   redisplay for a
bd00: 20 67 69 76 65 6e 0a 20 2a 09 72 65 67 69 6f 6e   given. *.region
bd10: 20 6f 66 20 61 20 74 65 78 74 20 77 69 64 67 65   of a text widge
bd20: 74 2e 20 20 54 68 65 20 72 65 64 69 73 70 6c 61  t.  The redispla
bd30: 79 20 69 74 73 65 6c 66 20 6d 61 79 20 6e 6f 74  y itself may not
bd40: 20 6f 63 63 75 72 0a 20 2a 09 69 6d 6d 65 64 69   occur. *.immedi
bd50: 61 74 65 6c 79 3a 20 20 69 74 27 73 20 73 63 68  ately:  it's sch
bd60: 65 64 75 6c 65 64 20 61 73 20 61 20 77 68 65 6e  eduled as a when
bd70: 2d 69 64 6c 65 20 68 61 6e 64 6c 65 72 2e 0a 20  -idle handler.. 
bd80: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
bd90: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64  .None.. *. * Sid
bda0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 49 6e  e effects:. *.In
bdb0: 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 65  formation will e
bdc0: 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 72 65 64  ventually be red
bdd0: 72 61 77 6e 20 6f 6e 20 74 68 65 20 73 63 72 65  rawn on the scre
bde0: 65 6e 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  en.. *. *-------
bdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
be30: 20 2a 2f 0a 0a 09 2f 2a 20 41 52 47 53 55 53 45   */.../* ARGSUSE
be40: 44 20 2a 2f 0a 76 6f 69 64 0a 54 6b 54 65 78 74  D */.void.TkText
be50: 52 65 64 72 61 77 52 65 67 69 6f 6e 28 74 65 78  RedrawRegion(tex
be60: 74 50 74 72 2c 20 78 2c 20 79 2c 20 77 69 64 74  tPtr, x, y, widt
be70: 68 2c 20 68 65 69 67 68 74 29 0a 20 20 20 20 54  h, height).    T
be80: 6b 54 65 78 74 20 2a 74 65 78 74 50 74 72 3b 09  kText *textPtr;.
be90: 09 2f 2a 20 57 69 64 67 65 74 20 72 65 63 6f 72  ./* Widget recor
bea0: 64 20 66 6f 72 20 74 65 78 74 20 77 69 64 67 65  d for text widge
beb0: 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 78 2c  t. */.    int x,
bec0: 20 79 3b 09 09 09 2f 2a 20 43 6f 6f 72 64 69 6e   y;.../* Coordin
bed0: 61 74 65 73 20 6f 66 20 75 70 70 65 72 2d 6c 65  ates of upper-le
bee0: 66 74 20 63 6f 72 6e 65 72 20 6f 66 20 61 72 65  ft corner of are
bef0: 61 0a 09 09 09 09 20 2a 20 74 6f 20 62 65 20 72  a..... * to be r
bf00: 65 64 72 61 77 6e 2c 20 69 6e 20 70 69 78 65 6c  edrawn, in pixel
bf10: 73 20 72 65 6c 61 74 69 76 65 20 74 6f 0a 09 09  s relative to...
bf20: 09 09 20 2a 20 74 65 78 74 50 74 72 27 73 20 77  .. * textPtr's w
bf30: 69 6e 64 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 6e  indow. */.    in
bf40: 74 20 77 69 64 74 68 2c 20 68 65 69 67 68 74 3b  t width, height;
bf50: 09 09 2f 2a 20 57 69 64 74 68 20 61 6e 64 20 68  ../* Width and h
bf60: 65 69 67 68 74 20 6f 66 20 61 72 65 61 20 74 6f  eight of area to
bf70: 20 62 65 20 72 65 64 72 61 77 6e 2e 20 2a 2f 0a   be redrawn. */.
bf80: 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 44  {.    register D
bf90: 4c 69 6e 65 20 2a 64 6c 50 74 72 3b 0a 20 20 20  Line *dlPtr;.   
bfa0: 20 44 49 6e 66 6f 20 2a 64 49 6e 66 6f 50 74 72   DInfo *dInfoPtr
bfb0: 20 3d 20 74 65 78 74 50 74 72 2d 3e 64 49 6e 66   = textPtr->dInf
bfc0: 6f 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 6d 61  oPtr;.    int ma
bfd0: 78 59 2c 20 69 6e 73 65 74 3b 0a 0a 20 20 20 20  xY, inset;..    
bfe0: 2f 2a 0a 20 20 20 20 20 2a 20 46 69 6e 64 20 61  /*.     * Find a
bff0: 6c 6c 20 6c 69 6e 65 73 20 74 68 61 74 20 6f 76  ll lines that ov
c000: 65 72 6c 61 70 20 74 68 65 20 67 69 76 65 6e 20  erlap the given 
c010: 72 65 67 69 6f 6e 20 61 6e 64 20 6d 61 72 6b 20  region and mark 
c020: 74 68 65 6d 20 66 6f 72 0a 20 20 20 20 20 2a 20  them for.     * 
c030: 72 65 64 69 73 70 6c 61 79 2e 0a 20 20 20 20 20  redisplay..     
c040: 2a 2f 0a 0a 20 20 20 20 6d 61 78 59 20 3d 20 79  */..    maxY = y
c050: 20 2b 20 68 65 69 67 68 74 3b 0a 20 20 20 20 66   + height;.    f
c060: 6f 72 20 28 64 6c 50 74 72 20 3d 20 64 49 6e 66  or (dlPtr = dInf
c070: 6f 50 74 72 2d 3e 64 4c 69 6e 65 50 74 72 3b 20  oPtr->dLinePtr; 
c080: 64 6c 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a 09  dlPtr != NULL;..
c090: 20 20 20 20 64 6c 50 74 72 20 3d 20 64 6c 50 74      dlPtr = dlPt
c0a0: 72 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09 69  r->nextPtr) {..i
c0b0: 66 20 28 28 28 64 6c 50 74 72 2d 3e 79 20 2b 20  f (((dlPtr->y + 
c0c0: 64 6c 50 74 72 2d 3e 68 65 69 67 68 74 29 20 3e  dlPtr->height) >
c0d0: 20 79 29 20 26 26 20 28 64 6c 50 74 72 2d 3e 79   y) && (dlPtr->y
c0e0: 20 3c 20 6d 61 78 59 29 29 20 7b 0a 09 20 20 20   < maxY)) {..   
c0f0: 20 64 6c 50 74 72 2d 3e 6f 6c 64 59 20 3d 20 2d   dlPtr->oldY = -
c100: 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20  1;..}.    }.    
c110: 69 66 20 28 64 49 6e 66 6f 50 74 72 2d 3e 74 6f  if (dInfoPtr->to
c120: 70 4f 66 45 6f 66 20 3c 20 6d 61 78 59 29 20 7b  pOfEof < maxY) {
c130: 0a 09 64 49 6e 66 6f 50 74 72 2d 3e 74 6f 70 4f  ..dInfoPtr->topO
c140: 66 45 6f 66 20 3d 20 6d 61 78 59 3b 0a 20 20 20  fEof = maxY;.   
c150: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
c160: 2a 20 53 63 68 65 64 75 6c 65 20 74 68 65 20 72  * Schedule the r
c170: 65 64 69 73 70 6c 61 79 20 6f 70 65 72 61 74 69  edisplay operati
c180: 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 6e 27  on if there isn'
c190: 74 20 6f 6e 65 20 61 6c 72 65 61 64 79 0a 20 20  t one already.  
c1a0: 20 20 20 2a 20 73 63 68 65 64 75 6c 65 64 2e 0a     * scheduled..
c1b0: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20       */..    if 
c1c0: 28 21 28 64 49 6e 66 6f 50 74 72 2d 3e 66 6c 61  (!(dInfoPtr->fla
c1d0: 67 73 20 26 20 52 45 44 52 41 57 5f 50 45 4e 44  gs & REDRAW_PEND
c1e0: 49 4e 47 29 29 20 7b 0a 09 64 49 6e 66 6f 50 74  ING)) {..dInfoPt
c1f0: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 52 45 44 52  r->flags |= REDR
c200: 41 57 5f 50 45 4e 44 49 4e 47 3b 0a 09 54 63 6c  AW_PENDING;..Tcl
c210: 5f 44 6f 57 68 65 6e 49 64 6c 65 28 44 69 73 70  _DoWhenIdle(Disp
c220: 6c 61 79 54 65 78 74 2c 20 28 43 6c 69 65 6e 74  layText, (Client
c230: 44 61 74 61 29 20 74 65 78 74 50 74 72 29 3b 0a  Data) textPtr);.
c240: 20 20 20 20 7d 0a 20 20 20 20 69 6e 73 65 74 20      }.    inset 
c250: 3d 20 74 65 78 74 50 74 72 2d 3e 62 6f 72 64 65  = textPtr->borde
c260: 72 57 69 64 74 68 3b 0a 20 20 20 20 69 66 20 28  rWidth;.    if (
c270: 28 78 20 3c 20 69 6e 73 65 74 29 20 7c 7c 20 28  (x < inset) || (
c280: 79 20 3c 20 69 6e 73 65 74 29 0a 09 20 20 20 20  y < inset)..    
c290: 7c 7c 20 28 28 78 20 2b 20 77 69 64 74 68 29 20  || ((x + width) 
c2a0: 3e 20 28 54 6b 5f 57 69 64 74 68 28 74 65 78 74  > (Tk_Width(text
c2b0: 50 74 72 2d 3e 74 6b 77 69 6e 29 20 2d 20 69 6e  Ptr->tkwin) - in
c2c0: 73 65 74 29 29 0a 09 20 20 20 20 7c 7c 20 28 6d  set))..    || (m
c2d0: 61 78 59 20 3e 20 28 54 6b 5f 48 65 69 67 68 74  axY > (Tk_Height
c2e0: 28 74 65 78 74 50 74 72 2d 3e 74 6b 77 69 6e 29  (textPtr->tkwin)
c2f0: 20 2d 20 69 6e 73 65 74 29 29 29 20 7b 0a 09 64   - inset))) {..d
c300: 49 6e 66 6f 50 74 72 2d 3e 66 6c 61 67 73 20 7c  InfoPtr->flags |
c310: 3d 20 52 45 44 52 41 57 5f 42 4f 52 44 45 52 53  = REDRAW_BORDERS
c320: 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20  ;.    }.}.../*. 
c330: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
c340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c370: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6b  -------. *. * Tk
c380: 54 65 78 74 43 68 61 6e 67 65 64 20 2d 2d 0a 20  TextChanged --. 
c390: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
c3a0: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 77  ure is invoked w
c3b0: 68 65 6e 20 69 6e 66 6f 20 69 6e 20 61 20 74 65  hen info in a te
c3c0: 78 74 20 77 69 64 67 65 74 20 69 73 20 61 62 6f  xt widget is abo
c3d0: 75 74 0a 20 2a 09 74 6f 20 62 65 20 6d 6f 64 69  ut. *.to be modi
c3e0: 66 69 65 64 20 69 6e 20 61 20 77 61 79 20 74 68  fied in a way th
c3f0: 61 74 20 63 68 61 6e 67 65 73 20 68 6f 77 20 69  at changes how i
c400: 74 20 69 73 20 64 69 73 70 6c 61 79 65 64 20 28  t is displayed (
c410: 65 2e 67 2e 0a 20 2a 09 63 68 61 72 61 63 74 65  e.g.. *.characte
c420: 72 73 20 77 65 72 65 20 69 6e 73 65 72 74 65 64  rs were inserted
c430: 20 6f 72 20 64 65 6c 65 74 65 64 2c 20 6f 72 20   or deleted, or 
c440: 74 61 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tag information 
c450: 77 61 73 0a 20 2a 09 63 68 61 6e 67 65 64 29 2e  was. *.changed).
c460: 20 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65    This procedure
c470: 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
c480: 2a 62 65 66 6f 72 65 2a 20 61 20 63 68 61 6e 67  *before* a chang
c490: 65 20 69 73 0a 20 2a 09 6d 61 64 65 2c 20 73 6f  e is. *.made, so
c4a0: 20 74 68 61 74 20 69 6e 64 65 78 65 73 20 69 6e   that indexes in
c4b0: 20 74 68 65 20 64 69 73 70 6c 61 79 20 69 6e 66   the display inf
c4c0: 6f 72 6d 61 74 69 6f 6e 20 61 72 65 20 73 74 69  ormation are sti
c4d0: 6c 6c 0a 20 2a 09 76 61 6c 69 64 2e 0a 20 2a 0a  ll. *.valid.. *.
c4e0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
c4f0: 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  one.. *. * Side 
c500: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20  effects:. *.The 
c510: 72 61 6e 67 65 20 6f 66 20 63 68 61 72 61 63 74  range of charact
c520: 65 72 20 62 65 74 77 65 65 6e 20 69 6e 64 65 78  er between index
c530: 31 50 74 72 20 28 69 6e 63 6c 75 73 69 76 65 29  1Ptr (inclusive)
c540: 20 61 6e 64 0a 20 2a 09 69 6e 64 65 78 32 50 74   and. *.index2Pt
c550: 72 20 28 65 78 63 6c 75 73 69 76 65 29 20 77 69  r (exclusive) wi
c560: 6c 6c 20 62 65 20 72 65 64 69 73 70 6c 61 79 65  ll be redisplaye
c570: 64 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20  d at some point 
c580: 69 6e 20 74 68 65 0a 20 2a 09 66 75 74 75 72 65  in the. *.future
c590: 20 28 74 68 65 20 61 63 74 75 61 6c 20 72 65 64   (the actual red
c5a0: 69 73 70 6c 61 79 20 69 73 20 73 63 68 65 64 75  isplay is schedu
c5b0: 6c 65 64 20 61 73 20 61 20 77 68 65 6e 2d 69 64  led as a when-id
c5c0: 6c 65 20 68 61 6e 64 6c 65 72 29 2e 0a 20 2a 0a  le handler).. *.
c5d0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
c5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c610: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 76 6f  --------. */..vo
c620: 69 64 0a 54 6b 54 65 78 74 43 68 61 6e 67 65 64  id.TkTextChanged
c630: 28 74 65 78 74 50 74 72 2c 20 69 6e 64 65 78 31  (textPtr, index1
c640: 50 74 72 2c 20 69 6e 64 65 78 32 50 74 72 29 0a  Ptr, index2Ptr).
c650: 20 20 20 20 54 6b 54 65 78 74 20 2a 74 65 78 74      TkText *text
c660: 50 74 72 3b 09 09 2f 2a 20 57 69 64 67 65 74 20  Ptr;../* Widget 
c670: 72 65 63 6f 72 64 20 66 6f 72 20 74 65 78 74 20  record for text 
c680: 77 69 64 67 65 74 2e 20 2a 2f 0a 20 20 20 20 54  widget. */.    T
c690: 6b 54 65 78 74 49 6e 64 65 78 20 2a 69 6e 64 65  kTextIndex *inde
c6a0: 78 31 50 74 72 3b 09 2f 2a 20 49 6e 64 65 78 20  x1Ptr;./* Index 
c6b0: 6f 66 20 66 69 72 73 74 20 63 68 61 72 61 63 74  of first charact
c6c0: 65 72 20 74 6f 20 72 65 64 69 73 70 6c 61 79 2e  er to redisplay.
c6d0: 20 2a 2f 0a 20 20 20 20 54 6b 54 65 78 74 49 6e   */.    TkTextIn
c6e0: 64 65 78 20 2a 69 6e 64 65 78 32 50 74 72 3b 09  dex *index2Ptr;.
c6f0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 68 61 72  /* Index of char
c700: 61 63 74 65 72 20 6a 75 73 74 20 61 66 74 65 72  acter just after
c710: 20 6c 61 73 74 20 6f 6e 65 0a 09 09 09 09 20 2a   last one..... *
c720: 20 74 6f 20 72 65 64 69 73 70 6c 61 79 2e 20 2a   to redisplay. *
c730: 2f 0a 7b 0a 20 20 20 20 44 49 6e 66 6f 20 2a 64  /.{.    DInfo *d
c740: 49 6e 66 6f 50 74 72 20 3d 20 74 65 78 74 50 74  InfoPtr = textPt
c750: 72 2d 3e 64 49 6e 66 6f 50 74 72 3b 0a 20 20 20  r->dInfoPtr;.   
c760: 20 44 4c 69 6e 65 20 2a 66 69 72 73 74 50 74 72   DLine *firstPtr
c770: 2c 20 2a 6c 61 73 74 50 74 72 3b 0a 20 20 20 20  , *lastPtr;.    
c780: 54 6b 54 65 78 74 49 6e 64 65 78 20 72 6f 75 6e  TkTextIndex roun
c790: 64 65 64 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ded;..    /*.   
c7a0: 20 20 2a 20 53 63 68 65 64 75 6c 65 20 62 6f 74    * Schedule bot
c7b0: 68 20 61 20 72 65 64 69 73 70 6c 61 79 20 61 6e  h a redisplay an
c7c0: 64 20 61 20 72 65 63 6f 6d 70 75 74 61 74 69 6f  d a recomputatio
c7d0: 6e 20 6f 66 20 64 69 73 70 6c 61 79 20 69 6e 66  n of display inf
c7e0: 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 20 2a  ormation..     *
c7f0: 20 49 74 27 73 20 64 6f 6e 65 20 68 65 72 65 20   It's done here 
c800: 72 61 74 68 65 72 20 74 68 61 6e 20 74 68 65 20  rather than the 
c810: 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 63 65  end of the proce
c820: 64 75 72 65 20 66 6f 72 20 74 77 6f 20 72 65 61  dure for two rea
c830: 73 6f 6e 73 3a 0a 20 20 20 20 20 2a 0a 20 20 20  sons:.     *.   
c840: 20 20 2a 20 31 2e 20 49 66 20 74 68 65 72 65 20    * 1. If there 
c850: 61 72 65 20 6e 6f 20 64 69 73 70 6c 61 79 20 6c  are no display l
c860: 69 6e 65 73 20 74 6f 20 75 70 64 61 74 65 20 77  ines to update w
c870: 65 27 6c 6c 20 77 61 6e 74 20 74 6f 20 72 65 74  e'll want to ret
c880: 75 72 6e 0a 20 20 20 20 20 2a 20 20 20 20 69 6d  urn.     *    im
c890: 6d 65 64 69 61 74 65 6c 79 2c 20 77 65 6c 6c 20  mediately, well 
c8a0: 62 65 66 6f 72 65 20 74 68 65 20 65 6e 64 20 6f  before the end o
c8b0: 66 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 2e  f the procedure.
c8c0: 0a 20 20 20 20 20 2a 20 32 2e 20 49 74 27 73 20  .     * 2. It's 
c8d0: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 61 72 72  important to arr
c8e0: 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65 64  ange for the red
c8f0: 69 73 70 6c 61 79 20 42 45 46 4f 52 45 20 63 61  isplay BEFORE ca
c900: 6c 6c 69 6e 67 0a 20 20 20 20 20 2a 20 20 20 20  lling.     *    
c910: 46 72 65 65 44 4c 69 6e 65 73 2e 20 20 54 68 65  FreeDLines.  The
c920: 20 72 65 61 73 6f 6e 20 66 6f 72 20 74 68 69 73   reason for this
c930: 20 69 73 20 73 75 62 74 6c 65 20 61 6e 64 20 68   is subtle and h
c940: 61 73 20 74 6f 20 64 6f 20 77 69 74 68 0a 20 20  as to do with.  
c950: 20 20 20 2a 20 20 20 20 65 6d 62 65 64 64 65 64     *    embedded
c960: 20 77 69 6e 64 6f 77 73 2e 20 20 54 68 65 20 63   windows.  The c
c970: 68 75 6e 6b 20 64 65 6c 65 74 65 20 70 72 6f 63  hunk delete proc
c980: 65 64 75 72 65 20 66 6f 72 20 61 6e 20 65 6d 62  edure for an emb
c990: 65 64 64 65 64 0a 20 20 20 20 20 2a 20 20 20 20  edded.     *    
c9a0: 77 69 6e 64 6f 77 20 77 69 6c 6c 20 73 63 68 65  window will sche
c9b0: 64 75 6c 65 20 61 6e 20 69 64 6c 65 20 68 61 6e  dule an idle han
c9c0: 64 6c 65 72 20 74 6f 20 75 6e 6d 61 70 20 74 68  dler to unmap th
c9d0: 65 20 77 69 6e 64 6f 77 2e 0a 20 20 20 20 20 2a  e window..     *
c9e0: 20 20 20 20 48 6f 77 65 76 65 72 2c 20 77 65 20      However, we 
c9f0: 77 61 6e 74 20 74 68 65 20 69 64 6c 65 20 68 61  want the idle ha
ca00: 6e 64 6c 65 72 20 66 6f 72 20 72 65 64 69 73 70  ndler for redisp
ca10: 6c 61 79 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  lay to be called
ca20: 0a 20 20 20 20 20 2a 20 20 20 20 66 69 72 73 74  .     *    first
ca30: 2c 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e  , so that it can
ca40: 20 70 75 74 20 74 68 65 20 65 6d 62 65 64 64 65   put the embedde
ca50: 64 20 77 69 6e 64 6f 77 20 62 61 63 6b 20 6f 6e  d window back on
ca60: 20 74 68 65 20 73 63 72 65 65 6e 0a 20 20 20 20   the screen.    
ca70: 20 2a 20 20 20 20 61 67 61 69 6e 20 28 69 66 20   *    again (if 
ca80: 61 70 70 72 6f 70 72 69 61 74 65 29 2e 20 20 54  appropriate).  T
ca90: 68 69 73 20 77 69 6c 6c 20 70 72 65 76 65 6e 74  his will prevent
caa0: 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 6f 6d   the window from
cab0: 20 65 76 65 72 0a 20 20 20 20 20 2a 20 20 20 20   ever.     *    
cac0: 62 65 69 6e 67 20 75 6e 6d 61 70 70 65 64 2c 20  being unmapped, 
cad0: 61 6e 64 20 74 68 65 72 65 62 79 20 61 76 6f 69  and thereby avoi
cae0: 64 20 66 6c 61 73 68 69 6e 67 2e 0a 20 20 20 20  d flashing..    
caf0: 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 21 28 64   */..    if (!(d
cb00: 49 6e 66 6f 50 74 72 2d 3e 66 6c 61 67 73 20 26  InfoPtr->flags &
cb10: 20 52 45 44 52 41 57 5f 50 45 4e 44 49 4e 47 29   REDRAW_PENDING)
cb20: 29 20 7b 0a 09 54 63 6c 5f 44 6f 57 68 65 6e 49  ) {..Tcl_DoWhenI
cb30: 64 6c 65 28 44 69 73 70 6c 61 79 54 65 78 74 2c  dle(DisplayText,
cb40: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 74 65   (ClientData) te
cb50: 78 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20  xtPtr);.    }.  
cb60: 20 20 64 49 6e 66 6f 50 74 72 2d 3e 66 6c 61 67    dInfoPtr->flag
cb70: 73 20 7c 3d 20 52 45 44 52 41 57 5f 50 45 4e 44  s |= REDRAW_PEND
cb80: 49 4e 47 7c 44 49 4e 46 4f 5f 4f 55 54 5f 4f 46  ING|DINFO_OUT_OF
cb90: 5f 44 41 54 45 3b 0a 0a 20 20 20 20 2f 2a 0a 20  _DATE;..    /*. 
cba0: 20 20 20 20 2a 20 46 69 6e 64 20 74 68 65 20 44      * Find the D
cbb0: 4c 69 6e 65 73 20 63 6f 72 72 65 73 70 6f 6e 64  Lines correspond
cbc0: 69 6e 67 20 74 6f 20 69 6e 64 65 78 31 50 74 72  ing to index1Ptr
cbd0: 20 61 6e 64 20 69 6e 64 65 78 32 50 74 72 2e 20   and index2Ptr. 
cbe0: 20 54 68 65 72 65 0a 20 20 20 20 20 2a 20 69 73   There.     * is
cbf0: 20 6f 6e 65 20 74 72 69 63 6b 79 20 74 68 69 6e   one tricky thin
cc00: 67 20 68 65 72 65 2c 20 77 68 69 63 68 20 69 73  g here, which is
cc10: 20 74 68 61 74 20 77 65 20 68 61 76 65 20 74 6f   that we have to
cc20: 20 72 65 6c 61 79 6f 75 74 20 69 6e 0a 20 20 20   relayout in.   
cc30: 20 20 2a 20 75 6e 69 74 73 20 6f 66 20 77 68 6f    * units of who
cc40: 6c 65 20 74 65 78 74 20 6c 69 6e 65 73 3a 20 20  le text lines:  
cc50: 72 6f 75 6e 64 20 69 6e 64 65 78 31 50 74 72 20  round index1Ptr 
cc60: 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69  back to the begi
cc70: 6e 6e 69 6e 67 0a 20 20 20 20 20 2a 20 6f 66 20  nning.     * of 
cc80: 69 74 73 20 74 65 78 74 20 6c 69 6e 65 2c 20 61  its text line, a
cc90: 6e 64 20 69 6e 63 6c 75 64 65 20 61 6c 6c 20 74  nd include all t
cca0: 68 65 20 64 69 73 70 6c 61 79 20 6c 69 6e 65 73  he display lines
ccb0: 20 61 66 74 65 72 20 69 6e 64 65 78 32 2c 0a 20   after index2,. 
ccc0: 20 20 20 20 2a 20 75 70 20 74 6f 20 74 68 65 20      * up to the 
ccd0: 65 6e 64 20 6f 66 20 69 74 73 20 74 65 78 74 20  end of its text 
cce0: 6c 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e  line.  This is n
ccf0: 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65  ecessary because
cd00: 20 74 68 65 0a 20 20 20 20 20 2a 20 69 6e 64 69   the.     * indi
cd10: 63 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ces stored in th
cd20: 65 20 64 69 73 70 6c 61 79 20 6c 69 6e 65 73 20  e display lines 
cd30: 77 69 6c 6c 20 6e 6f 20 6c 6f 6e 67 65 72 20 62  will no longer b
cd40: 65 20 76 61 6c 69 64 2e 20 20 49 74 27 73 0a 20  e valid.  It's. 
cd50: 20 20 20 20 2a 20 61 6c 73 6f 20 6e 65 65 64 65      * also neede
cd60: 64 20 62 65 63 61 75 73 65 20 61 6e 79 20 65 64  d because any ed
cd70: 69 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 20  it could change 
cd80: 74 68 65 20 77 61 79 20 6c 69 6e 65 73 20 77 72  the way lines wr
cd90: 61 70 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  ap..     */..   
cda0: 20 72 6f 75 6e 64 65 64 20 3d 20 2a 69 6e 64 65   rounded = *inde
cdb0: 78 31 50 74 72 3b 0a 20 20 20 20 72 6f 75 6e 64  x1Ptr;.    round
cdc0: 65 64 2e 63 68 61 72 49 6e 64 65 78 20 3d 20 30  ed.charIndex = 0
cdd0: 3b 0a 20 20 20 20 66 69 72 73 74 50 74 72 20 3d  ;.    firstPtr =
cde0: 20 46 69 6e 64 44 4c 69 6e 65 28 64 49 6e 66 6f   FindDLine(dInfo
cdf0: 50 74 72 2d 3e 64 4c 69 6e 65 50 74 72 2c 20 26  Ptr->dLinePtr, &
ce00: 72 6f 75 6e 64 65 64 29 3b 0a 20 20 20 20 69 66  rounded);.    if
ce10: 20 28 66 69 72 73 74 50 74 72 20 3d 3d 20 4e 55   (firstPtr == NU
ce20: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20  LL) {..return;. 
ce30: 20 20 20 7d 0a 20 20 20 20 6c 61 73 74 50 74 72     }.    lastPtr
ce40: 20 3d 20 46 69 6e 64 44 4c 69 6e 65 28 64 49 6e   = FindDLine(dIn
ce50: 66 6f 50 74 72 2d 3e 64 4c 69 6e 65 50 74 72 2c  foPtr->dLinePtr,
ce60: 20 69 6e 64 65 78 32 50 74 72 29 3b 0a 20 20 20   index2Ptr);.   
ce70: 20 77 68 69 6c 65 20 28 28 6c 61 73 74 50 74 72   while ((lastPtr
ce80: 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 26   != NULL)..    &
ce90: 26 20 28 6c 61 73 74 50 74 72 2d 3e 69 6e 64 65  & (lastPtr->inde
cea0: 78 2e 6c 69 6e 65 50 74 72 20 3d 3d 20 69 6e 64  x.linePtr == ind
ceb0: 65 78 32 50 74 72 2d 3e 6c 69 6e 65 50 74 72 29  ex2Ptr->linePtr)
cec0: 29 20 7b 0a 09 6c 61 73 74 50 74 72 20 3d 20 6c  ) {..lastPtr = l
ced0: 61 73 74 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b  astPtr->nextPtr;
cee0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
cef0: 20 20 20 20 2a 20 44 65 6c 65 74 65 20 61 6c 6c      * Delete all
cf00: 20 74 68 65 20 44 4c 69 6e 65 73 20 66 72 6f 6d   the DLines from
cf10: 20 66 69 72 73 74 50 74 72 20 75 70 20 74 6f 20   firstPtr up to 
cf20: 62 75 74 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e  but not includin
cf30: 67 20 6c 61 73 74 50 74 72 2e 0a 20 20 20 20 20  g lastPtr..     
cf40: 2a 2f 0a 0a 20 20 20 20 46 72 65 65 44 4c 69 6e  */..    FreeDLin
cf50: 65 73 28 74 65 78 74 50 74 72 2c 20 66 69 72 73  es(textPtr, firs
cf60: 74 50 74 72 2c 20 6c 61 73 74 50 74 72 2c 20 31  tPtr, lastPtr, 1
cf70: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
cf80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cfa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cfb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cfc0: 2d 2d 0a 20 2a 0a 20 2a 20 54 6b 54 65 78 74 52  --. *. * TkTextR
cfd0: 65 64 72 61 77 54 61 67 20 2d 2d 0a 20 2a 0a 20  edrawTag --. *. 
cfe0: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
cff0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72   is invoked to r
d000: 65 71 75 65 73 74 20 61 20 72 65 64 72 61 77 20  equest a redraw 
d010: 6f 66 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72  of all character
d020: 73 0a 20 2a 09 69 6e 20 61 20 67 69 76 65 6e 20  s. *.in a given 
d030: 72 61 6e 67 65 20 74 68 61 74 20 68 61 76 65 20  range that have 
d040: 61 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 67  a particular tag
d050: 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 49 74 27   on or off.  It'
d060: 73 0a 20 2a 09 63 61 6c 6c 65 64 2c 20 66 6f 72  s. *.called, for
d070: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 74   example, when t
d080: 61 67 20 6f 70 74 69 6f 6e 73 20 63 68 61 6e 67  ag options chang
d090: 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  e.. *. * Results
d0a0: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
d0b0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
d0c0: 2a 09 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  *.Information on
d0d0: 20 74 68 65 20 73 63 72 65 65 6e 20 6d 61 79 20   the screen may 
d0e0: 62 65 20 72 65 64 72 61 77 6e 2c 20 61 6e 64 20  be redrawn, and 
d0f0: 74 68 65 20 6c 61 79 6f 75 74 20 6f 66 0a 20 2a  the layout of. *
d100: 09 74 68 65 20 73 63 72 65 65 6e 20 6d 61 79 20  .the screen may 
d110: 63 68 61 6e 67 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  change.. *. *---
d120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d160: 2d 2d 2d 0a 20 2a 2f 0a 0a 76 6f 69 64 0a 54 6b  ---. */..void.Tk
d170: 54 65 78 74 52 65 64 72 61 77 54 61 67 28 74 65  TextRedrawTag(te
d180: 78 74 50 74 72 2c 20 69 6e 64 65 78 31 50 74 72  xtPtr, index1Ptr
d190: 2c 20 69 6e 64 65 78 32 50 74 72 2c 20 74 61 67  , index2Ptr, tag
d1a0: 50 74 72 2c 20 77 69 74 68 54 61 67 29 0a 20 20  Ptr, withTag).  
d1b0: 20 20 54 6b 54 65 78 74 20 2a 74 65 78 74 50 74    TkText *textPt
d1c0: 72 3b 09 09 2f 2a 20 57 69 64 67 65 74 20 72 65  r;../* Widget re
d1d0: 63 6f 72 64 20 66 6f 72 20 74 65 78 74 20 77 69  cord for text wi
d1e0: 64 67 65 74 2e 20 2a 2f 0a 20 20 20 20 54 6b 54  dget. */.    TkT
d1f0: 65 78 74 49 6e 64 65 78 20 2a 69 6e 64 65 78 31  extIndex *index1
d200: 50 74 72 3b 09 2f 2a 20 46 69 72 73 74 20 63 68  Ptr;./* First ch
d210: 61 72 61 63 74 65 72 20 69 6e 20 72 61 6e 67 65  aracter in range
d220: 20 74 6f 20 63 6f 6e 73 69 64 65 72 0a 09 09 09   to consider....
d230: 09 20 2a 20 66 6f 72 20 72 65 64 69 73 70 6c 61  . * for redispla
d240: 79 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 73  y.  NULL means s
d250: 74 61 72 74 20 61 74 0a 09 09 09 09 20 2a 20 62  tart at..... * b
d260: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 65 78 74  eginning of text
d270: 2e 20 2a 2f 0a 20 20 20 20 54 6b 54 65 78 74 49  . */.    TkTextI
d280: 6e 64 65 78 20 2a 69 6e 64 65 78 32 50 74 72 3b  ndex *index2Ptr;
d290: 09 2f 2a 20 43 68 61 72 61 63 74 65 72 20 6a 75  ./* Character ju
d2a0: 73 74 20 61 66 74 65 72 20 6c 61 73 74 20 6f 6e  st after last on
d2b0: 65 20 74 6f 20 63 6f 6e 73 69 64 65 72 0a 09 09  e to consider...
d2c0: 09 09 20 2a 20 66 6f 72 20 72 65 64 69 73 70 6c  .. * for redispl
d2d0: 61 79 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20  ay.  NULL means 
d2e0: 70 72 6f 63 65 73 73 20 61 6c 6c 0a 09 09 09 09  process all.....
d2f0: 20 2a 20 74 68 65 20 63 68 61 72 61 63 74 65 72   * the character
d300: 73 20 69 6e 20 74 68 65 20 74 65 78 74 2e 20 2a  s in the text. *
d310: 2f 0a 20 20 20 20 54 6b 54 65 78 74 54 61 67 20  /.    TkTextTag 
d320: 2a 74 61 67 50 74 72 3b 09 09 2f 2a 20 49 6e 66  *tagPtr;../* Inf
d330: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
d340: 61 67 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 77  ag. */.    int w
d350: 69 74 68 54 61 67 3b 09 09 2f 2a 20 31 20 6d 65  ithTag;../* 1 me
d360: 61 6e 73 20 72 65 64 72 61 77 20 63 68 61 72 61  ans redraw chara
d370: 63 74 65 72 73 20 74 68 61 74 20 68 61 76 65 20  cters that have 
d380: 74 68 65 0a 09 09 09 09 20 2a 20 74 61 67 2c 20  the..... * tag, 
d390: 30 20 6d 65 61 6e 73 20 72 65 64 72 61 77 20 74  0 means redraw t
d3a0: 68 6f 73 65 20 77 69 74 68 6f 75 74 2e 20 2a 2f  hose without. */
d3b0: 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20  .{.    register 
d3c0: 44 4c 69 6e 65 20 2a 64 6c 50 74 72 3b 0a 20 20  DLine *dlPtr;.  
d3d0: 20 20 44 4c 69 6e 65 20 2a 65 6e 64 50 74 72 3b    DLine *endPtr;
d3e0: 0a 20 20 20 20 69 6e 74 20 74 61 67 4f 6e 3b 0a  .    int tagOn;.
d3f0: 20 20 20 20 54 6b 54 65 78 74 53 65 61 72 63 68      TkTextSearch
d400: 20 73 65 61 72 63 68 3b 0a 20 20 20 20 44 49 6e   search;.    DIn
d410: 66 6f 20 2a 64 49 6e 66 6f 50 74 72 20 3d 20 74  fo *dInfoPtr = t
d420: 65 78 74 50 74 72 2d 3e 64 49 6e 66 6f 50 74 72  extPtr->dInfoPtr
d430: 3b 0a 20 20 20 20 54 6b 54 65 78 74 49 6e 64 65  ;.    TkTextInde
d440: 78 20 65 6e 64 4f 66 54 65 78 74 2c 20 2a 65 6e  x endOfText, *en
d450: 64 49 6e 64 65 78 50 74 72 3b 0a 0a 20 20 20 20  dIndexPtr;..    
d460: 2f 2a 0a 20 20 20 20 20 2a 20 52 6f 75 6e 64 20  /*.     * Round 
d470: 75 70 20 74 68 65 20 73 74 61 72 74 69 6e 67 20  up the starting 
d480: 70 6f 73 69 74 69 6f 6e 20 69 66 20 69 74 27 73  position if it's
d490: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
d4a0: 74 20 6c 69 6e 65 0a 20 20 20 20 20 2a 20 76 69  t line.     * vi
d4b0: 73 69 62 6c 65 20 6f 6e 20 74 68 65 20 73 63 72  sible on the scr
d4c0: 65 65 6e 20 28 77 65 20 6f 6e 6c 79 20 63 61 72  een (we only car
d4d0: 65 20 61 62 6f 75 74 20 77 68 61 74 27 73 20 6f  e about what's o
d4e0: 6e 20 74 68 65 20 73 63 72 65 65 6e 29 2e 0a 20  n the screen).. 
d4f0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 64 6c 50 74      */..    dlPt
d500: 72 20 3d 20 64 49 6e 66 6f 50 74 72 2d 3e 64 4c  r = dInfoPtr->dL
d510: 69 6e 65 50 74 72 3b 0a 20 20 20 20 69 66 20 28  inePtr;.    if (
d520: 64 6c 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b  dlPtr == NULL) {
d530: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  ..return;.    }.
d540: 20 20 20 20 69 66 20 28 28 69 6e 64 65 78 31 50      if ((index1P
d550: 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7c 7c 20 28  tr == NULL) || (
d560: 54 6b 54 65 78 74 49 6e 64 65 78 43 6d 70 28 26  TkTextIndexCmp(&
d570: 64 6c 50 74 72 2d 3e 69 6e 64 65 78 2c 20 69 6e  dlPtr->index, in
d580: 64 65 78 31 50 74 72 29 20 3e 20 30 29 29 20 7b  dex1Ptr) > 0)) {
d590: 0a 09 69 6e 64 65 78 31 50 74 72 20 3d 20 26 64  ..index1Ptr = &d
d5a0: 6c 50 74 72 2d 3e 69 6e 64 65 78 3b 0a 20 20 20  lPtr->index;.   
d5b0: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
d5c0: 2a 20 53 65 74 20 74 68 65 20 73 74 6f 70 70 69  * Set the stoppi
d5d0: 6e 67 20 70 6f 73 69 74 69 6f 6e 20 69 66 20 69  ng position if i
d5e0: 74 20 77 61 73 6e 27 74 20 73 70 65 63 69 66 69  t wasn't specifi
d5f0: 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  ed..     */..   
d600: 20 69 66 20 28 69 6e 64 65 78 32 50 74 72 20 3d   if (index2Ptr =
d610: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 64 65 78  = NULL) {..index
d620: 32 50 74 72 20 3d 20 54 6b 54 65 78 74 4d 61 6b  2Ptr = TkTextMak
d630: 65 49 6e 64 65 78 28 74 65 78 74 50 74 72 2d 3e  eIndex(textPtr->
d640: 74 72 65 65 2c 0a 09 09 54 6b 42 54 72 65 65 4e  tree,...TkBTreeN
d650: 75 6d 4c 69 6e 65 73 28 74 65 78 74 50 74 72 2d  umLines(textPtr-
d660: 3e 74 72 65 65 29 2c 20 30 2c 20 26 65 6e 64 4f  >tree), 0, &endO
d670: 66 54 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  fText);.    }.. 
d680: 20 20 20 2f 2a 20 0a 20 20 20 20 20 2a 20 49 6e     /* .     * In
d690: 69 74 69 61 6c 69 7a 65 20 61 20 73 65 61 72 63  itialize a searc
d6a0: 68 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 72  h through all tr
d6b0: 61 6e 73 69 74 69 6f 6e 73 20 6f 6e 20 74 68 65  ansitions on the
d6c0: 20 74 61 67 2c 20 73 74 61 72 74 69 6e 67 0a 20   tag, starting. 
d6d0: 20 20 20 20 2a 20 77 69 74 68 20 74 68 65 20 66      * with the f
d6e0: 69 72 73 74 20 74 72 61 6e 73 69 74 69 6f 6e 20  irst transition 
d6f0: 77 68 65 72 65 20 74 68 65 20 74 61 67 27 73 20  where the tag's 
d700: 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 69 73  current state is
d710: 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20   different.     
d720: 2a 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 77  * from what it w
d730: 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 62  ill eventually b
d740: 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  e..     */..    
d750: 54 6b 42 54 72 65 65 53 74 61 72 74 53 65 61 72  TkBTreeStartSear
d760: 63 68 28 69 6e 64 65 78 31 50 74 72 2c 20 69 6e  ch(index1Ptr, in
d770: 64 65 78 32 50 74 72 2c 20 74 61 67 50 74 72 2c  dex2Ptr, tagPtr,
d780: 20 26 73 65 61 72 63 68 29 3b 0a 20 20 20 20 74   &search);.    t
d790: 61 67 4f 6e 20 3d 20 54 6b 42 54 72 65 65 43 68  agOn = TkBTreeCh
d7a0: 61 72 54 61 67 67 65 64 28 69 6e 64 65 78 31 50  arTagged(index1P
d7b0: 74 72 2c 20 74 61 67 50 74 72 29 3b 0a 20 20 20  tr, tagPtr);.   
d7c0: 20 69 66 20 28 74 61 67 4f 6e 20 21 3d 20 77 69   if (tagOn != wi
d7d0: 74 68 54 61 67 29 20 7b 0a 09 69 66 20 28 21 54  thTag) {..if (!T
d7e0: 6b 42 54 72 65 65 4e 65 78 74 54 61 67 28 26 73  kBTreeNextTag(&s
d7f0: 65 61 72 63 68 29 29 20 7b 0a 09 20 20 20 20 72  earch)) {..    r
d800: 65 74 75 72 6e 3b 0a 09 7d 0a 20 20 20 20 7d 0a  eturn;..}.    }.
d810: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53  .    /*.     * S
d820: 63 68 65 64 75 6c 65 20 61 20 72 65 64 69 73 70  chedule a redisp
d830: 6c 61 79 20 61 6e 64 20 6c 61 79 6f 75 74 20 72  lay and layout r
d840: 65 63 61 6c 63 75 6c 61 74 69 6f 6e 20 69 66 20  ecalculation if 
d850: 74 68 65 79 20 61 72 65 6e 27 74 0a 20 20 20 20  they aren't.    
d860: 20 2a 20 61 6c 72 65 61 64 79 20 70 65 6e 64 69   * already pendi
d870: 6e 67 2e 20 20 54 68 69 73 20 68 61 73 20 74 6f  ng.  This has to
d880: 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   be done before 
d890: 63 61 6c 6c 69 6e 67 20 46 72 65 65 44 4c 69 6e  calling FreeDLin
d8a0: 65 73 2c 0a 20 20 20 20 20 2a 20 66 6f 72 20 74  es,.     * for t
d8b0: 68 65 20 72 65 61 73 6f 6e 20 67 69 76 65 6e 20  he reason given 
d8c0: 69 6e 20 54 6b 54 65 78 74 43 68 61 6e 67 65 64  in TkTextChanged
d8d0: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69  ..     */..    i
d8e0: 66 20 28 21 28 64 49 6e 66 6f 50 74 72 2d 3e 66  f (!(dInfoPtr->f
d8f0: 6c 61 67 73 20 26 20 52 45 44 52 41 57 5f 50 45  lags & REDRAW_PE
d900: 4e 44 49 4e 47 29 29 20 7b 0a 09 54 63 6c 5f 44  NDING)) {..Tcl_D
d910: 6f 57 68 65 6e 49 64 6c 65 28 44 69 73 70 6c 61  oWhenIdle(Displa
d920: 79 54 65 78 74 2c 20 28 43 6c 69 65 6e 74 44 61  yText, (ClientDa
d930: 74 61 29 20 74 65 78 74 50 74 72 29 3b 0a 20 20  ta) textPtr);.  
d940: 20 20 7d 0a 20 20 20 20 64 49 6e 66 6f 50 74 72    }.    dInfoPtr
d950: 2d 3e 66 6c 61 67 73 20 7c 3d 20 52 45 44 52 41  ->flags |= REDRA
d960: 57 5f 50 45 4e 44 49 4e 47 7c 44 49 4e 46 4f 5f  W_PENDING|DINFO_
d970: 4f 55 54 5f 4f 46 5f 44 41 54 45 3b 0a 0a 20 20  OUT_OF_DATE;..  
d980: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 61 63 68    /*.     * Each
d990: 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   loop through th
d9a0: 65 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 69 73 20  e loop below is 
d9b0: 66 6f 72 20 6f 6e 65 20 72 61 6e 67 65 20 6f 66  for one range of
d9c0: 20 63 68 61 72 61 63 74 65 72 73 0a 20 20 20 20   characters.    
d9d0: 20 2a 20 77 68 65 72 65 20 74 68 65 20 74 61 67   * where the tag
d9e0: 27 73 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  's current state
d9f0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 74 68   is different th
da00: 61 6e 20 69 74 73 20 65 76 65 6e 74 75 61 6c 0a  an its eventual.
da10: 20 20 20 20 20 2a 20 73 74 61 74 65 2e 20 20 41       * state.  A
da20: 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  t the top of the
da30: 20 6c 6f 6f 70 2c 20 73 65 61 72 63 68 20 63 6f   loop, search co
da40: 6e 74 61 69 6e 73 20 69 6e 66 6f 72 6d 61 74 69  ntains informati
da50: 6f 6e 20 61 62 6f 75 74 0a 20 20 20 20 20 2a 20  on about.     * 
da60: 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63  the first charac
da70: 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65  ter in the range
da80: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 77  ..     */..    w
da90: 68 69 6c 65 20 28 31 29 20 7b 0a 09 2f 2a 0a 09  hile (1) {../*..
daa0: 20 2a 20 46 69 6e 64 20 74 68 65 20 66 69 72 73   * Find the firs
dab0: 74 20 44 4c 69 6e 65 20 73 74 72 75 63 74 75 72  t DLine structur
dac0: 65 20 69 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  e in the range. 
dad0: 20 4e 6f 74 65 3a 20 69 66 20 74 68 65 0a 09 20   Note: if the.. 
dae0: 2a 20 64 65 73 69 72 65 64 20 63 68 61 72 61 63  * desired charac
daf0: 74 65 72 20 69 73 6e 27 74 20 74 68 65 20 66 69  ter isn't the fi
db00: 72 73 74 20 69 6e 20 69 74 73 20 74 65 78 74 20  rst in its text 
db10: 6c 69 6e 65 2c 20 74 68 65 6e 20 6c 6f 6f 6b 0a  line, then look.
db20: 09 20 2a 20 66 6f 72 20 74 68 65 20 63 68 61 72  . * for the char
db30: 61 63 74 65 72 20 6a 75 73 74 20 62 65 66 6f 72  acter just befor
db40: 65 20 69 74 20 69 6e 73 74 65 61 64 2e 20 20 54  e it instead.  T
db50: 68 69 73 20 69 73 20 6e 65 65 64 65 64 20 74 6f  his is needed to
db60: 0a 09 20 2a 20 68 61 6e 64 6c 65 20 74 68 65 20  .. * handle the 
db70: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 66  case where the f
db80: 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20 6f  irst character o
db90: 66 20 61 20 77 72 61 70 70 65 64 0a 09 20 2a 20  f a wrapped.. * 
dba0: 64 69 73 70 6c 61 79 20 6c 69 6e 65 20 6a 75 73  display line jus
dbb0: 74 20 67 6f 74 20 73 6d 61 6c 6c 65 72 2c 20 73  t got smaller, s
dbc0: 6f 20 74 68 61 74 20 69 74 20 6e 6f 77 20 66 69  o that it now fi
dbd0: 74 73 20 6f 6e 20 74 68 65 0a 09 20 2a 20 6c 69  ts on the.. * li
dbe0: 6e 65 20 62 65 66 6f 72 65 3a 20 20 6e 65 65 64  ne before:  need
dbf0: 20 74 6f 20 72 65 6c 61 79 6f 75 74 20 74 68 65   to relayout the
dc00: 20 6c 69 6e 65 20 63 6f 6e 74 61 69 6e 69 6e 67   line containing
dc10: 20 74 68 65 0a 09 20 2a 20 70 72 65 76 69 6f 75   the.. * previou
dc20: 73 20 63 68 61 72 61 63 74 65 72 2e 0a 09 20 2a  s character... *
dc30: 2f 0a 0a 09 69 66 20 28 73 65 61 72 63 68 2e 63  /...if (search.c
dc40: 75 72 49 6e 64 65 78 2e 63 68 61 72 49 6e 64 65  urIndex.charInde
dc50: 78 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 64  x == 0) {..    d
dc60: 6c 50 74 72 20 3d 20 46 69 6e 64 44 4c 69 6e 65  lPtr = FindDLine
dc70: 28 64 6c 50 74 72 2c 20 26 73 65 61 72 63 68 2e  (dlPtr, &search.
dc80: 63 75 72 49 6e 64 65 78 29 3b 0a 09 7d 20 65 6c  curIndex);..} el
dc90: 73 65 20 7b 0a 09 20 20 20 20 54 6b 54 65 78 74  se {..    TkText
dca0: 49 6e 64 65 78 20 74 6d 70 3b 0a 0a 09 20 20 20  Index tmp;...   
dcb0: 20 74 6d 70 20 3d 20 73 65 61 72 63 68 2e 63 75   tmp = search.cu
dcc0: 72 49 6e 64 65 78 3b 0a 09 20 20 20 20 74 6d 70  rIndex;..    tmp
dcd0: 2e 63 68 61 72 49 6e 64 65 78 20 2d 3d 20 31 3b  .charIndex -= 1;
dce0: 0a 09 20 20 20 20 64 6c 50 74 72 20 3d 20 46 69  ..    dlPtr = Fi
dcf0: 6e 64 44 4c 69 6e 65 28 64 6c 50 74 72 2c 20 26  ndDLine(dlPtr, &
dd00: 74 6d 70 29 3b 0a 09 7d 0a 09 69 66 20 28 64 6c  tmp);..}..if (dl
dd10: 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Ptr == NULL) {..
dd20: 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09      break;..}...
dd30: 2f 2a 0a 09 20 2a 20 46 69 6e 64 20 74 68 65 20  /*.. * Find the 
dd40: 66 69 72 73 74 20 44 4c 69 6e 65 20 73 74 72 75  first DLine stru
dd50: 63 74 75 72 65 20 74 68 61 74 27 73 20 70 61 73  cture that's pas
dd60: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
dd70: 20 72 61 6e 67 65 2e 0a 09 20 2a 2f 0a 0a 09 69   range... */...i
dd80: 66 20 28 21 54 6b 42 54 72 65 65 4e 65 78 74 54  f (!TkBTreeNextT
dd90: 61 67 28 26 73 65 61 72 63 68 29 29 20 7b 0a 09  ag(&search)) {..
dda0: 20 20 20 20 65 6e 64 49 6e 64 65 78 50 74 72 20      endIndexPtr 
ddb0: 3d 20 69 6e 64 65 78 32 50 74 72 3b 0a 09 7d 20  = index2Ptr;..} 
ddc0: 65 6c 73 65 20 7b 0a 09 20 20 20 20 65 6e 64 49  else {..    endI
ddd0: 6e 64 65 78 50 74 72 20 3d 20 26 73 65 61 72 63  ndexPtr = &searc
dde0: 68 2e 63 75 72 49 6e 64 65 78 3b 0a 09 7d 0a 09  h.curIndex;..}..
ddf0: 65 6e 64 50 74 72 20 3d 20 46 69 6e 64 44 4c 69  endPtr = FindDLi
de00: 6e 65 28 64 6c 50 74 72 2c 20 65 6e 64 49 6e 64  ne(dlPtr, endInd
de10: 65 78 50 74 72 29 3b 0a 09 69 66 20 28 28 65 6e  exPtr);..if ((en
de20: 64 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 26 26  dPtr != NULL) &&
de30: 20 28 65 6e 64 50 74 72 2d 3e 69 6e 64 65 78 2e   (endPtr->index.
de40: 6c 69 6e 65 50 74 72 20 3d 3d 20 65 6e 64 49 6e  linePtr == endIn
de50: 64 65 78 50 74 72 2d 3e 6c 69 6e 65 50 74 72 29  dexPtr->linePtr)
de60: 0a 09 09 26 26 20 28 65 6e 64 50 74 72 2d 3e 69  ...&& (endPtr->i
de70: 6e 64 65 78 2e 63 68 61 72 49 6e 64 65 78 20 3c  ndex.charIndex <
de80: 20 65 6e 64 49 6e 64 65 78 50 74 72 2d 3e 63 68   endIndexPtr->ch
de90: 61 72 49 6e 64 65 78 29 29 20 7b 0a 09 20 20 20  arIndex)) {..   
dea0: 20 65 6e 64 50 74 72 20 3d 20 65 6e 64 50 74 72   endPtr = endPtr
deb0: 2d 3e 6e 65 78 74 50 74 72 3b 0a 09 7d 0a 0a 09  ->nextPtr;..}...
dec0: 2f 2a 0a 09 20 2a 20 44 65 6c 65 74 65 20 61 6c  /*.. * Delete al
ded0: 6c 20 6f 66 20 74 68 65 20 64 69 73 70 6c 61 79  l of the display
dee0: 20 6c 69 6e 65 73 20 69 6e 20 74 68 65 20 72 61   lines in the ra
def0: 6e 67 65 2c 20 73 6f 20 74 68 61 74 20 74 68 65  nge, so that the
df00: 79 27 6c 6c 0a 09 20 2a 20 62 65 20 72 65 2d 6c  y'll.. * be re-l
df10: 61 79 65 64 20 6f 75 74 20 61 6e 64 20 72 65 64  ayed out and red
df20: 72 61 77 6e 2e 0a 09 20 2a 2f 0a 0a 09 46 72 65  rawn... */...Fre
df30: 65 44 4c 69 6e 65 73 28 74 65 78 74 50 74 72 2c  eDLines(textPtr,
df40: 20 64 6c 50 74 72 2c 20 65 6e 64 50 74 72 2c 20   dlPtr, endPtr, 
df50: 31 29 3b 0a 09 64 6c 50 74 72 20 3d 20 65 6e 64  1);..dlPtr = end
df60: 50 74 72 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 46 69  Ptr;.../*.. * Fi
df70: 6e 64 20 74 68 65 20 66 69 72 73 74 20 74 65 78  nd the first tex
df80: 74 20 6c 69 6e 65 20 69 6e 20 74 68 65 20 6e 65  t line in the ne
df90: 78 74 20 72 61 6e 67 65 2e 0a 09 20 2a 2f 0a 0a  xt range... */..
dfa0: 09 69 66 20 28 21 54 6b 42 54 72 65 65 4e 65 78  .if (!TkBTreeNex
dfb0: 74 54 61 67 28 26 73 65 61 72 63 68 29 29 20 7b  tTag(&search)) {
dfc0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a  ..    break;..}.
dfd0: 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d      }.}.../*. *-
dfe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e020: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6b 54 65  -----. *. * TkTe
e030: 78 74 52 65 6c 61 79 6f 75 74 57 69 6e 64 6f 77  xtRelayoutWindow
e040: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
e050: 72 6f 63 65 64 75 72 65 20 69 73 20 63 61 6c 6c  rocedure is call
e060: 65 64 20 77 68 65 6e 20 73 6f 6d 65 74 68 69 6e  ed when somethin
e070: 67 20 68 61 73 20 68 61 70 70 65 6e 65 64 20 74  g has happened t
e080: 68 61 74 0a 20 2a 09 69 6e 76 61 6c 69 64 61 74  hat. *.invalidat
e090: 65 73 20 74 68 65 20 77 68 6f 6c 65 20 6c 61 79  es the whole lay
e0a0: 6f 75 74 20 6f 66 20 63 68 61 72 61 63 74 65 72  out of character
e0b0: 73 20 6f 6e 20 74 68 65 20 73 63 72 65 65 6e 2c  s on the screen,
e0c0: 20 73 75 63 68 0a 20 2a 09 61 73 20 61 20 63 68   such. *.as a ch
e0d0: 61 6e 67 65 20 69 6e 20 61 20 63 6f 6e 66 69 67  ange in a config
e0e0: 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 20 66  uration option f
e0f0: 6f 72 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 74  or the overall t
e100: 65 78 74 0a 20 2a 09 77 69 64 67 65 74 20 6f 72  ext. *.widget or
e110: 20 61 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65   a change in the
e120: 20 77 69 6e 64 6f 77 20 73 69 7a 65 2e 20 20 49   window size.  I
e130: 74 20 63 61 75 73 65 73 20 61 6c 6c 20 64 69 73  t causes all dis
e140: 70 6c 61 79 0a 20 2a 09 69 6e 66 6f 72 6d 61 74  play. *.informat
e150: 69 6f 6e 20 74 6f 20 62 65 20 72 65 63 6f 6d 70  ion to be recomp
e160: 75 74 65 64 20 61 6e 64 20 74 68 65 20 77 69 6e  uted and the win
e170: 64 6f 77 20 74 6f 20 62 65 20 72 65 64 72 61 77  dow to be redraw
e180: 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  n.. *. * Results
e190: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
e1a0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
e1b0: 2a 09 41 6c 6c 20 74 68 65 20 64 69 73 70 6c 61  *.All the displa
e1c0: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  y information wi
e1d0: 6c 6c 20 62 65 20 72 65 63 6f 6d 70 75 74 65 64  ll be recomputed
e1e0: 20 66 6f 72 20 74 68 65 20 77 69 6e 64 6f 77 0a   for the window.
e1f0: 20 2a 09 61 6e 64 20 74 68 65 20 77 69 6e 64 6f   *.and the windo
e200: 77 20 77 69 6c 6c 20 62 65 20 72 65 64 72 61 77  w will be redraw
e210: 6e 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  n.. *. *--------
e220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
e260: 2a 2f 0a 0a 76 6f 69 64 0a 54 6b 54 65 78 74 52  */..void.TkTextR
e270: 65 6c 61 79 6f 75 74 57 69 6e 64 6f 77 28 74 65  elayoutWindow(te
e280: 78 74 50 74 72 29 0a 20 20 20 20 54 6b 54 65 78  xtPtr).    TkTex
e290: 74 20 2a 74 65 78 74 50 74 72 3b 09 09 2f 2a 20  t *textPtr;../* 
e2a0: 57 69 64 67 65 74 20 72 65 63 6f 72 64 20 66 6f  Widget record fo
e2b0: 72 20 74 65 78 74 20 77 69 64 67 65 74 2e 20 2a  r text widget. *
e2c0: 2f 0a 7b 0a 20 20 20 20 44 49 6e 66 6f 20 2a 64  /.{.    DInfo *d
e2d0: 49 6e 66 6f 50 74 72 20 3d 20 74 65 78 74 50 74  InfoPtr = textPt
e2e0: 72 2d 3e 64 49 6e 66 6f 50 74 72 3b 0a 0a 20 20  r->dInfoPtr;..  
e2f0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 63 68 65    /*.     * Sche
e300: 64 75 6c 65 20 74 68 65 20 77 69 6e 64 6f 77 20  dule the window 
e310: 72 65 64 69 73 70 6c 61 79 2e 20 20 53 65 65 20  redisplay.  See 
e320: 54 6b 54 65 78 74 43 68 61 6e 67 65 64 20 66 6f  TkTextChanged fo
e330: 72 20 74 68 65 0a 20 20 20 20 20 2a 20 72 65 61  r the.     * rea
e340: 73 6f 6e 20 77 68 79 20 74 68 69 73 20 68 61 73  son why this has
e350: 20 74 6f 20 62 65 20 64 6f 6e 65 20 62 65 66 6f   to be done befo
e360: 72 65 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f 20  re any calls to 
e370: 46 72 65 65 44 4c 69 6e 65 73 2e 0a 20 20 20 20  FreeDLines..    
e380: 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 21 28 64   */..    if (!(d
e390: 49 6e 66 6f 50 74 72 2d 3e 66 6c 61 67 73 20 26  InfoPtr->flags &
e3a0: 20 52 45 44 52 41 57 5f 50 45 4e 44 49 4e 47 29   REDRAW_PENDING)
e3b0: 29 20 7b 0a 09 54 63 6c 5f 44 6f 57 68 65 6e 49  ) {..Tcl_DoWhenI
e3c0: 64 6c 65 28 44 69 73 70 6c 61 79 54 65 78 74 2c  dle(DisplayText,
e3d0: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 74 65   (ClientData) te
e3e0: 78 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20  xtPtr);.    }.  
e3f0: 20 20 64 49 6e 66 6f 50 74 72 2d 3e 66 6c 61 67    dInfoPtr->flag
e400: 73 20 7c 3d 20 52 45 44 52 41 57 5f 50 45 4e 44  s |= REDRAW_PEND
e410: 49 4e 47 7c 52 45 44 52 41 57 5f 42 4f 52 44 45  ING|REDRAW_BORDE
e420: 52 53 7c 44 49 4e 46 4f 5f 4f 55 54 5f 4f 46 5f  RS|DINFO_OUT_OF_
e430: 44 41 54 45 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  DATE;..    /*.  
e440: 20 20 20 2a 20 54 68 72 6f 77 20 61 77 61 79 20     * Throw away 
e450: 61 6c 6c 20 74 68 65 20 63 75 72 72 65 6e 74 20  all the current 
e460: 6c 61 79 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69  layout informati
e470: 6f 6e 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  on..     */..   
e480: 20 46 72 65 65 44 4c 69 6e 65 73 28 74 65 78 74   FreeDLines(text
e490: 50 74 72 2c 20 64 49 6e 66 6f 50 74 72 2d 3e 64  Ptr, dInfoPtr->d
e4a0: 4c 69 6e 65 50 74 72 2c 20 28 44 4c 69 6e 65 20  LinePtr, (DLine 
e4b0: 2a 29 20 4e 55 4c 4c 2c 20 31 29 3b 0a 20 20 20  *) NULL, 1);.   
e4c0: 20 64 49 6e 66 6f 50 74 72 2d 3e 64 4c 69 6e 65   dInfoPtr->dLine
e4d0: 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20  Ptr = NULL;..   
e4e0: 20 2f 2a 0a 20 20 20 20 20 2a 20 52 65 63 6f 6d   /*.     * Recom
e4f0: 70 75 74 65 20 73 6f 6d 65 20 6f 76 65 72 61 6c  pute some overal
e500: 6c 20 74 68 69 6e 67 73 20 66 6f 72 20 74 68 65  l things for the
e510: 20 6c 61 79 6f 75 74 2e 20 20 45 76 65 6e 20 69   layout.  Even i
e520: 66 20 74 68 65 0a 20 20 20 20 20 2a 20 77 69 6e  f the.     * win
e530: 64 6f 77 20 67 65 74 73 20 76 65 72 79 20 73 6d  dow gets very sm
e540: 61 6c 6c 2c 20 70 72 65 74 65 6e 64 20 74 68 61  all, pretend tha
e550: 74 20 74 68 65 72 65 27 73 20 61 74 20 6c 65 61  t there's at lea
e560: 73 74 20 6f 6e 65 0a 20 20 20 20 20 2a 20 70 69  st one.     * pi
e570: 78 65 6c 20 6f 66 20 64 72 61 77 69 6e 67 20 73  xel of drawing s
e580: 70 61 63 65 20 69 6e 20 69 74 2e 0a 20 20 20 20  pace in it..    
e590: 20 2a 2f 0a 0a 20 20 20 20 64 49 6e 66 6f 50 74   */..    dInfoPt
e5a0: 72 2d 3e 78 20 3d 20 74 65 78 74 50 74 72 2d 3e  r->x = textPtr->
e5b0: 62 6f 72 64 65 72 57 69 64 74 68 20 2b 20 74 65  borderWidth + te
e5c0: 78 74 50 74 72 2d 3e 70 61 64 58 3b 0a 20 20 20  xtPtr->padX;.   
e5d0: 20 64 49 6e 66 6f 50 74 72 2d 3e 79 20 3d 20 74   dInfoPtr->y = t
e5e0: 65 78 74 50 74 72 2d 3e 62 6f 72 64 65 72 57 69  extPtr->borderWi
e5f0: 64 74 68 20 2b 20 74 65 78 74 50 74 72 2d 3e 70  dth + textPtr->p
e600: 61 64 59 3b 0a 20 20 20 20 64 49 6e 66 6f 50 74  adY;.    dInfoPt
e610: 72 2d 3e 6d 61 78 58 20 3d 20 54 6b 5f 57 69 64  r->maxX = Tk_Wid
e620: 74 68 28 74 65 78 74 50 74 72 2d 3e 74 6b 77 69  th(textPtr->tkwi
e630: 6e 29 0a 20 20 20 20 09 20 20 20 20 2d 20 74 65  n).    .    - te
e640: 78 74 50 74 72 2d 3e 62 6f 72 64 65 72 57 69 64  xtPtr->borderWid
e650: 74 68 20 2d 20 74 65 78 74 50 74 72 2d 3e 70 61  th - textPtr->pa
e660: 64 58 3b 0a 20 20 20 20 69 66 20 28 64 49 6e 66  dX;.    if (dInf
e670: 6f 50 74 72 2d 3e 6d 61 78 58 20 3c 3d 20 64 49  oPtr->maxX <= dI
e680: 6e 66 6f 50 74 72 2d 3e 78 29 20 7b 0a 09 64 49  nfoPtr->x) {..dI
e690: 6e 66 6f 50 74 72 2d 3e 6d 61 78 58 20 3d 20 64  nfoPtr->maxX = d
e6a0: 49 6e 66 6f 50 74 72 2d 3e 78 20 2b 20 31 3b 0a  InfoPtr->x + 1;.
e6b0: 20 20 20 20 7d 0a 20 20 20 20 64 49 6e 66 6f 50      }.    dInfoP
e6c0: 74 72 2d 3e 6d 61 78 59 20 3d 20 54 6b 5f 48 65  tr->maxY = Tk_He
e6d0: 69 67 68 74 28 74 65 78 74 50 74 72 2d 3e 74 6b  ight(textPtr->tk
e6e0: 77 69 6e 29 0a 09 20 20 20 20 2d 20 74 65 78 74  win)..    - text
e6f0: 50 74 72 2d 3e 62 6f 72 64 65 72 57 69 64 74 68  Ptr->borderWidth
e700: 20 2d 20 74 65 78 74 50 74 72 2d 3e 70 61 64 59   - textPtr->padY
e710: 3b 0a 20 20 20 20 69 66 20 28 64 49 6e 66 6f 50  ;.    if (dInfoP
e720: 74 72 2d 3e 6d 61 78 59 20 3c 3d 20 64 49 6e 66  tr->maxY <= dInf
e730: 6f 50 74 72 2d 3e 79 29 20 7b 0a 09 64 49 6e 66  oPtr->y) {..dInf
e740: 6f 50 74 72 2d 3e 6d 61 78 59 20 3d 20 64 49 6e  oPtr->maxY = dIn
e750: 66 6f 50 74 72 2d 3e 79 20 2b 20 31 3b 0a 20 20  foPtr->y + 1;.  
e760: 20 20 7d 0a 20 20 20 20 64 49 6e 66 6f 50 74 72    }.    dInfoPtr
e770: 2d 3e 74 6f 70 4f 66 45 6f 66 20 3d 20 64 49 6e  ->topOfEof = dIn
e780: 66 6f 50 74 72 2d 3e 6d 61 78 59 3b 0a 0a 20 20  foPtr->maxY;..  
e790: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 66 20 74    /*.     * If t
e7a0: 68 65 20 75 70 70 65 72 2d 6c 65 66 74 20 63 68  he upper-left ch
e7b0: 61 72 61 63 74 65 72 20 69 73 6e 27 74 20 74 68  aracter isn't th
e7c0: 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e  e first in a lin
e7d0: 65 2c 20 72 65 63 6f 6d 70 75 74 65 0a 20 20 20  e, recompute.   
e7e0: 20 20 2a 20 69 74 2e 20 20 54 68 69 73 20 69 73    * it.  This is
e7f0: 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
e800: 73 65 20 61 20 63 68 61 6e 67 65 20 69 6e 20 74  se a change in t
e810: 68 65 20 77 69 6e 64 6f 77 27 73 20 73 69 7a 65  he window's size
e820: 0a 20 20 20 20 20 2a 20 6f 72 20 6f 70 74 69 6f  .     * or optio
e830: 6e 73 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 20  ns could change 
e840: 74 68 65 20 77 61 79 20 6c 69 6e 65 73 20 77 72  the way lines wr
e850: 61 70 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  ap..     */..   
e860: 20 69 66 20 28 74 65 78 74 50 74 72 2d 3e 74 6f   if (textPtr->to
e870: 70 49 6e 64 65 78 2e 63 68 61 72 49 6e 64 65 78  pIndex.charIndex
e880: 20 21 3d 20 30 29 20 7b 0a 09 4d 65 61 73 75 72   != 0) {..Measur
e890: 65 55 70 28 74 65 78 74 50 74 72 2c 20 26 74 65  eUp(textPtr, &te
e8a0: 78 74 50 74 72 2d 3e 74 6f 70 49 6e 64 65 78 2c  xtPtr->topIndex,
e8b0: 20 30 2c 20 26 74 65 78 74 50 74 72 2d 3e 74 6f   0, &textPtr->to
e8c0: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 7d  pIndex);.    }.}
e8d0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
e8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
e920: 2a 0a 20 2a 20 54 6b 54 65 78 74 53 65 74 59 56  *. * TkTextSetYV
e930: 69 65 77 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  iew --. *. *.Thi
e940: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 63  s procedure is c
e950: 61 6c 6c 65 64 20 74 6f 20 73 70 65 63 69 66 79  alled to specify
e960: 20 77 68 61 74 20 6c 69 6e 65 73 20 61 72 65 20   what lines are 
e970: 74 6f 20 62 65 0a 20 2a 09 64 69 73 70 6c 61 79  to be. *.display
e980: 65 64 20 69 6e 20 61 20 74 65 78 74 20 77 69 64  ed in a text wid
e990: 67 65 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  get.. *. * Resul
e9a0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
e9b0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
e9c0: 0a 20 2a 09 54 68 65 20 64 69 73 70 6c 61 79 20  . *.The display 
e9d0: 77 69 6c 6c 20 28 65 76 65 6e 74 75 61 6c 6c 79  will (eventually
e9e0: 29 20 62 65 20 75 70 64 61 74 65 64 20 73 6f 20  ) be updated so 
e9f0: 74 68 61 74 20 74 68 65 20 70 6f 73 69 74 69 6f  that the positio
ea00: 6e 0a 20 2a 09 67 69 76 65 6e 20 62 79 20 22 69  n. *.given by "i
ea10: 6e 64 65 78 50 74 72 22 20 69 73 20 76 69 73 69  ndexPtr" is visi
ea20: 62 6c 65 20 6f 6e 20 74 68 65 20 73 63 72 65 65  ble on the scree
ea30: 6e 20 61 74 20 74 68 65 20 70 6f 73 69 74 69 6f  n at the positio
ea40: 6e 0a 20 2a 09 64 65 74 65 72 6d 69 6e 65 64 20  n. *.determined 
ea50: 62 79 20 22 70 69 63 6b 50 6c 61 63 65 22 2e 0a  by "pickPlace"..
ea60: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
ea70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eaa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
eab0: 0a 76 6f 69 64 0a 54 6b 54 65 78 74 53 65 74 59  .void.TkTextSetY
eac0: 56 69 65 77 28 74 65 78 74 50 74 72 2c 20 69 6e  View(textPtr, in
ead0: 64 65 78 50 74 72 2c 20 70 69 63 6b 50 6c 61 63  dexPtr, pickPlac
eae0: 65 29 0a 20 20 20 20 54 6b 54 65 78 74 20 2a 74  e).    TkText *t
eaf0: 65 78 74 50 74 72 3b 09 09 2f 2a 20 57 69 64 67  extPtr;../* Widg
eb00: 65 74 20 72 65 63 6f 72 64 20 66 6f 72 20 74 65  et record for te
eb10: 78 74 20 77 69 64 67 65 74 2e 20 2a 2f 0a 20 20  xt widget. */.  
eb20: 20 20 54 6b 54 65 78 74 49 6e 64 65 78 20 2a 69    TkTextIndex *i
eb30: 6e 64 65 78 50 74 72 3b 09 2f 2a 20 50 6f 73 69  ndexPtr;./* Posi
eb40: 74 69 6f 6e 20 74 68 61 74 20 69 73 20 74 6f 20  tion that is to 
eb50: 61 70 70 65 61 72 20 73 6f 6d 65 77 68 65 72 65  appear somewhere
eb60: 0a 09 09 09 09 20 2a 20 69 6e 20 74 68 65 20 76  ..... * in the v
eb70: 69 65 77 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  iew. */.    int 
eb80: 70 69 63 6b 50 6c 61 63 65 3b 09 09 2f 2a 20 30  pickPlace;../* 0
eb90: 20 6d 65 61 6e 73 20 74 6f 70 4c 69 6e 65 20 6d   means topLine m
eba0: 75 73 74 20 61 70 70 65 61 72 20 61 74 20 74 6f  ust appear at to
ebb0: 70 20 6f 66 0a 09 09 09 09 20 2a 20 73 63 72 65  p of..... * scre
ebc0: 65 6e 2e 20 20 31 20 6d 65 61 6e 73 20 77 65 20  en.  1 means we 
ebd0: 67 65 74 20 74 6f 20 70 69 63 6b 20 77 68 65 72  get to pick wher
ebe0: 65 20 69 74 0a 09 09 09 09 20 2a 20 61 70 70 65  e it..... * appe
ebf0: 61 72 73 3a 20 20 6d 69 6e 69 6d 69 7a 65 20 73  ars:  minimize s
ec00: 63 72 65 65 6e 20 6d 6f 74 69 6f 6e 20 6f 72 20  creen motion or 
ec10: 65 6c 73 65 0a 09 09 09 09 20 2a 20 64 69 73 70  else..... * disp
ec20: 6c 61 79 20 6c 69 6e 65 20 61 74 20 63 65 6e 74  lay line at cent
ec30: 65 72 20 6f 66 20 73 63 72 65 65 6e 2e 20 2a 2f  er of screen. */
ec40: 0a 7b 0a 20 20 20 20 44 49 6e 66 6f 20 2a 64 49  .{.    DInfo *dI
ec50: 6e 66 6f 50 74 72 20 3d 20 74 65 78 74 50 74 72  nfoPtr = textPtr
ec60: 2d 3e 64 49 6e 66 6f 50 74 72 3b 0a 20 20 20 20  ->dInfoPtr;.    
ec70: 72 65 67 69 73 74 65 72 20 44 4c 69 6e 65 20 2a  register DLine *
ec80: 64 6c 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 62  dlPtr;.    int b
ec90: 6f 74 74 6f 6d 59 2c 20 63 6c 6f 73 65 2c 20 6c  ottomY, close, l
eca0: 69 6e 65 49 6e 64 65 78 3b 0a 20 20 20 20 54 6b  ineIndex;.    Tk
ecb0: 54 65 78 74 49 6e 64 65 78 20 74 6d 70 49 6e 64  TextIndex tmpInd
ecc0: 65 78 2c 20 72 6f 75 6e 64 65 64 3b 0a 0a 20 20  ex, rounded;..  
ecd0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 66 20 74    /*.     * If t
ece0: 68 65 20 73 70 65 63 69 66 69 65 64 20 70 6f 73  he specified pos
ecf0: 69 74 69 6f 6e 20 69 73 20 74 68 65 20 65 78 74  ition is the ext
ed00: 72 61 20 6c 69 6e 65 20 61 74 20 74 68 65 20 65  ra line at the e
ed10: 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 20 2a  nd of the.     *
ed20: 20 74 65 78 74 2c 20 72 6f 75 6e 64 20 69 74 20   text, round it 
ed30: 62 61 63 6b 20 74 6f 20 74 68 65 20 6c 61 73 74  back to the last
ed40: 20 72 65 61 6c 20 6c 69 6e 65 2e 0a 20 20 20 20   real line..    
ed50: 20 2a 2f 0a 0a 20 20 20 20 6c 69 6e 65 49 6e 64   */..    lineInd
ed60: 65 78 20 3d 20 54 6b 42 54 72 65 65 4c 69 6e 65  ex = TkBTreeLine
ed70: 49 6e 64 65 78 28 69 6e 64 65 78 50 74 72 2d 3e  Index(indexPtr->
ed80: 6c 69 6e 65 50 74 72 29 3b 0a 20 20 20 20 69 66  linePtr);.    if
ed90: 20 28 6c 69 6e 65 49 6e 64 65 78 20 3d 3d 20 54   (lineIndex == T
eda0: 6b 42 54 72 65 65 4e 75 6d 4c 69 6e 65 73 28 69  kBTreeNumLines(i
edb0: 6e 64 65 78 50 74 72 2d 3e 74 72 65 65 29 29 20  ndexPtr->tree)) 
edc0: 7b 0a 09 54 6b 54 65 78 74 49 6e 64 65 78 42 61  {..TkTextIndexBa
edd0: 63 6b 43 68 61 72 73 28 69 6e 64 65 78 50 74 72  ckChars(indexPtr
ede0: 2c 20 31 2c 20 26 72 6f 75 6e 64 65 64 29 3b 0a  , 1, &rounded);.
edf0: 09 69 6e 64 65 78 50 74 72 20 3d 20 26 72 6f 75  .indexPtr = &rou
ee00: 6e 64 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  nded;.    }..   
ee10: 20 69 66 20 28 21 70 69 63 6b 50 6c 61 63 65 29   if (!pickPlace)
ee20: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 20 73   {../*.. * The s
ee30: 70 65 63 69 66 69 65 64 20 70 6f 73 69 74 69 6f  pecified positio
ee40: 6e 20 6d 75 73 74 20 67 6f 20 61 74 20 74 68 65  n must go at the
ee50: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 63 72 65   top of the scre
ee60: 65 6e 2e 0a 09 20 2a 20 4a 75 73 74 20 6c 65 61  en... * Just lea
ee70: 76 65 20 61 6c 6c 20 74 68 65 20 44 4c 69 6e 65  ve all the DLine
ee80: 27 73 20 61 6c 6f 6e 65 3a 20 77 65 20 6d 61 79  's alone: we may
ee90: 20 62 65 20 61 62 6c 65 20 74 6f 20 72 65 75 73   be able to reus
eea0: 65 0a 09 20 2a 20 73 6f 6d 65 20 6f 66 20 74 68  e.. * some of th
eeb0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68  e information th
eec0: 61 74 27 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  at's currently o
eed0: 6e 20 74 68 65 20 73 63 72 65 65 6e 0a 09 20 2a  n the screen.. *
eee0: 20 77 69 74 68 6f 75 74 20 72 65 64 69 73 70 6c   without redispl
eef0: 61 79 69 6e 67 20 69 74 20 61 6c 6c 2e 0a 09 20  aying it all... 
ef00: 2a 2f 0a 0a 09 69 66 20 28 69 6e 64 65 78 50 74  */...if (indexPt
ef10: 72 2d 3e 63 68 61 72 49 6e 64 65 78 20 3d 3d 20  r->charIndex == 
ef20: 30 29 20 7b 0a 09 20 20 20 20 74 65 78 74 50 74  0) {..    textPt
ef30: 72 2d 3e 74 6f 70 49 6e 64 65 78 20 3d 20 2a 69  r->topIndex = *i
ef40: 6e 64 65 78 50 74 72 3b 0a 09 7d 20 65 6c 73 65  ndexPtr;..} else
ef50: 20 7b 0a 09 20 20 20 20 4d 65 61 73 75 72 65 55   {..    MeasureU
ef60: 70 28 74 65 78 74 50 74 72 2c 20 69 6e 64 65 78  p(textPtr, index
ef70: 50 74 72 2c 20 30 2c 20 26 74 65 78 74 50 74 72  Ptr, 0, &textPtr
ef80: 2d 3e 74 6f 70 49 6e 64 65 78 29 3b 0a 09 7d 0a  ->topIndex);..}.
ef90: 09 67 6f 74 6f 20 73 63 68 65 64 75 6c 65 55 70  .goto scheduleUp
efa0: 64 61 74 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  date;.    }..   
efb0: 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 68 61   /*.     * We ha
efc0: 76 65 20 74 6f 20 70 69 63 6b 20 77 68 65 72 65  ve to pick where
efd0: 20 74 6f 20 64 69 73 70 6c 61 79 20 74 68 65 20   to display the 
efe0: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 2c 20 62  index.  First, b
eff0: 72 69 6e 67 0a 20 20 20 20 20 2a 20 74 68 65 20  ring.     * the 
f000: 64 69 73 70 6c 61 79 20 69 6e 66 6f 72 6d 61 74  display informat
f010: 69 6f 6e 20 75 70 20 74 6f 20 64 61 74 65 20 61  ion up to date a
f020: 6e 64 20 73 65 65 20 69 66 20 74 68 65 20 69 6e  nd see if the in
f030: 64 65 78 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  dex will be.    
f040: 20 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 76 69   * completely vi
f050: 73 69 62 6c 65 20 69 6e 20 74 68 65 20 63 75 72  sible in the cur
f060: 72 65 6e 74 20 73 63 72 65 65 6e 20 63 6f 6e 66  rent screen conf
f070: 69 67 75 72 61 74 69 6f 6e 2e 20 20 49 66 20 73  iguration.  If s
f080: 6f 0a 20 20 20 20 20 2a 20 74 68 65 6e 20 74 68  o.     * then th
f090: 65 72 65 27 73 20 6e 6f 74 68 69 6e 67 20 74 6f  ere's nothing to
f0a0: 20 64 6f 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20   do..     */..  
f0b0: 20 20 69 66 20 28 64 49 6e 66 6f 50 74 72 2d 3e    if (dInfoPtr->
f0c0: 66 6c 61 67 73 20 26 20 44 49 4e 46 4f 5f 4f 55  flags & DINFO_OU
f0d0: 54 5f 4f 46 5f 44 41 54 45 29 20 7b 0a 09 55 70  T_OF_DATE) {..Up
f0e0: 64 61 74 65 44 69 73 70 6c 61 79 49 6e 66 6f 28  dateDisplayInfo(
f0f0: 74 65 78 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a  textPtr);.    }.
f100: 20 20 20 20 64 6c 50 74 72 20 3d 20 46 69 6e 64      dlPtr = Find
f110: 44 4c 69 6e 65 28 64 49 6e 66 6f 50 74 72 2d 3e  DLine(dInfoPtr->
f120: 64 4c 69 6e 65 50 74 72 2c 20 69 6e 64 65 78 50  dLinePtr, indexP
f130: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 64 6c 50  tr);.    if (dlP
f140: 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69  tr != NULL) {..i
f150: 66 20 28 28 64 6c 50 74 72 2d 3e 79 20 2b 20 64  f ((dlPtr->y + d
f160: 6c 50 74 72 2d 3e 68 65 69 67 68 74 29 20 3e 20  lPtr->height) > 
f170: 64 49 6e 66 6f 50 74 72 2d 3e 6d 61 78 59 29 20  dInfoPtr->maxY) 
f180: 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20  {..    /*..     
f190: 2a 20 50 61 72 74 20 6f 66 20 74 68 65 20 6c 69  * Part of the li
f1a0: 6e 65 20 68 61 6e 67 73 20 6f 66 66 20 74 68 65  ne hangs off the
f1b0: 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 73   bottom of the s
f1c0: 63 72 65 65 6e 3b 0a 09 20 20 20 20 20 2a 20 70  creen;..     * p
f1d0: 72 65 74 65 6e 64 20 74 68 65 20 77 68 6f 6c 65  retend the whole
f1e0: 20 6c 69 6e 65 20 69 73 20 6f 66 66 2d 73 63 72   line is off-scr
f1f0: 65 65 6e 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09  een...     */...
f200: 20 20 20 20 64 6c 50 74 72 20 3d 20 4e 55 4c 4c      dlPtr = NULL
f210: 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 28 64  ;..} else if ((d
f220: 6c 50 74 72 2d 3e 69 6e 64 65 78 2e 6c 69 6e 65  lPtr->index.line
f230: 50 74 72 20 3d 3d 20 69 6e 64 65 78 50 74 72 2d  Ptr == indexPtr-
f240: 3e 6c 69 6e 65 50 74 72 29 0a 09 09 26 26 20 28  >linePtr)...&& (
f250: 64 6c 50 74 72 2d 3e 69 6e 64 65 78 2e 63 68 61  dlPtr->index.cha
f260: 72 49 6e 64 65 78 20 3c 3d 20 69 6e 64 65 78 50  rIndex <= indexP
f270: 74 72 2d 3e 63 68 61 72 49 6e 64 65 78 29 29 20  tr->charIndex)) 
f280: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 3b 0a 09  {..    return;..
f290: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  }.    }..    /*.
f2a0: 20 20 20 20 20 2a 20 54 68 65 20 64 65 73 69 72       * The desir
f2b0: 65 64 20 6c 69 6e 65 20 69 73 6e 27 74 20 61 6c  ed line isn't al
f2c0: 72 65 61 64 79 20 6f 6e 2d 73 63 72 65 65 6e 2e  ready on-screen.
f2d0: 0a 20 20 20 20 20 2a 20 54 68 65 20 64 65 73 69  .     * The desi
f2e0: 72 65 64 20 6c 69 6e 65 20 69 73 6e 27 74 20 61  red line isn't a
f2f0: 6c 72 65 61 64 79 20 6f 6e 2d 73 63 72 65 65 6e  lready on-screen
f300: 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  .  Figure out wh
f310: 61 74 0a 20 20 20 20 20 2a 20 69 74 20 6d 65 61  at.     * it mea
f320: 6e 73 20 74 6f 20 62 65 20 22 63 6c 6f 73 65 22  ns to be "close"
f330: 20 74 6f 20 74 68 65 20 74 6f 70 20 6f 72 20 62   to the top or b
f340: 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 73 63 72  ottom of the scr
f350: 65 65 6e 2e 0a 20 20 20 20 20 2a 20 43 6c 6f 73  een..     * Clos
f360: 65 20 6d 65 61 6e 73 20 77 69 74 68 69 6e 20 31  e means within 1
f370: 2f 33 20 6f 66 20 74 68 65 20 73 63 72 65 65 6e  /3 of the screen
f380: 20 68 65 69 67 68 74 20 6f 72 20 77 69 74 68 69   height or withi
f390: 6e 20 74 68 72 65 65 0a 20 20 20 20 20 2a 20 6c  n three.     * l
f3a0: 69 6e 65 73 2c 20 77 68 69 63 68 65 76 65 72 20  ines, whichever 
f3b0: 69 73 20 67 72 65 61 74 65 72 2e 20 20 41 64 64  is greater.  Add
f3c0: 20 6f 6e 65 20 65 78 74 72 61 20 6c 69 6e 65 20   one extra line 
f3d0: 61 6c 73 6f 2c 20 74 6f 0a 20 20 20 20 20 2a 20  also, to.     * 
f3e0: 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
f3f0: 77 61 79 20 4d 65 61 73 75 72 65 55 70 20 72 6f  way MeasureUp ro
f400: 75 6e 64 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  unds..     */.. 
f410: 20 20 20 62 6f 74 74 6f 6d 59 20 3d 20 28 64 49     bottomY = (dI
f420: 6e 66 6f 50 74 72 2d 3e 79 20 2b 20 64 49 6e 66  nfoPtr->y + dInf
f430: 6f 50 74 72 2d 3e 6d 61 78 59 20 2b 20 31 29 2f  oPtr->maxY + 1)/
f440: 32 3b 0a 20 20 20 20 63 6c 6f 73 65 20 3d 20 28  2;.    close = (
f450: 64 49 6e 66 6f 50 74 72 2d 3e 6d 61 78 59 20 2d  dInfoPtr->maxY -
f460: 20 64 49 6e 66 6f 50 74 72 2d 3e 79 29 2f 33 3b   dInfoPtr->y)/3;
f470: 0a 20 20 20 20 69 66 20 28 63 6c 6f 73 65 20 3c  .    if (close <
f480: 20 33 29 20 7b 0a 09 63 6c 6f 73 65 20 3d 20 33   3) {..close = 3
f490: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73  ;.    }.    clos
f4a0: 65 20 2b 3d 20 31 3b 0a 20 20 20 20 69 66 20 28  e += 1;.    if (
f4b0: 64 6c 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b  dlPtr != NULL) {
f4c0: 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 20 64 65 73  ../*.. * The des
f4d0: 69 72 65 64 20 6c 69 6e 65 20 69 73 20 61 62 6f  ired line is abo
f4e0: 76 65 20 74 68 65 20 74 6f 70 20 6f 66 20 73 63  ve the top of sc
f4f0: 72 65 65 6e 2e 20 20 49 66 20 69 74 20 69 73 0a  reen.  If it is.
f500: 09 20 2a 20 22 63 6c 6f 73 65 22 20 74 6f 20 74  . * "close" to t
f510: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 77 69  he top of the wi
f520: 6e 64 6f 77 20 74 68 65 6e 20 6d 61 6b 65 20 69  ndow then make i
f530: 74 20 74 68 65 20 74 6f 70 0a 09 20 2a 20 6c 69  t the top.. * li
f540: 6e 65 20 6f 6e 20 74 68 65 20 73 63 72 65 65 6e  ne on the screen
f550: 2e 0a 09 20 2a 2f 0a 0a 09 4d 65 61 73 75 72 65  ... */...Measure
f560: 55 70 28 74 65 78 74 50 74 72 2c 20 26 74 65 78  Up(textPtr, &tex
f570: 74 50 74 72 2d 3e 74 6f 70 49 6e 64 65 78 2c 20  tPtr->topIndex, 
f580: 63 6c 6f 73 65 2c 20 26 74 6d 70 49 6e 64 65 78  close, &tmpIndex
f590: 29 3b 0a 09 69 66 20 28 54 6b 54 65 78 74 49 6e  );..if (TkTextIn
f5a0: 64 65 78 43 6d 70 28 26 74 6d 70 49 6e 64 65 78  dexCmp(&tmpIndex
f5b0: 2c 20 69 6e 64 65 78 50 74 72 29 20 3c 3d 20 30  , indexPtr) <= 0
f5c0: 29 20 7b 0a 09 20 20 20 20 4d 65 61 73 75 72 65  ) {..    Measure
f5d0: 55 70 28 74 65 78 74 50 74 72 2c 20 69 6e 64 65  Up(textPtr, inde
f5e0: 78 50 74 72 2c 20 30 2c 20 26 74 65 78 74 50 74  xPtr, 0, &textPt
f5f0: 72 2d 3e 74 6f 70 49 6e 64 65 78 29 3b 0a 09 20  r->topIndex);.. 
f600: 20 20 20 67 6f 74 6f 20 73 63 68 65 64 75 6c 65     goto schedule
f610: 55 70 64 61 74 65 3b 0a 09 7d 0a 20 20 20 20 7d  Update;..}.    }
f620: 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20 2a 20   else {../*.. * 
f630: 54 68 65 20 64 65 73 69 72 65 64 20 6c 69 6e 65  The desired line
f640: 20 69 73 20 62 65 6c 6f 77 20 74 68 65 20 62 6f   is below the bo
f650: 74 74 6f 6d 20 6f 66 20 74 68 65 20 73 63 72 65  ttom of the scre
f660: 65 6e 2e 20 20 49 66 20 69 74 20 69 73 0a 09 20  en.  If it is.. 
f670: 2a 20 22 63 6c 6f 73 65 22 20 74 6f 20 74 68 65  * "close" to the
f680: 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 73   bottom of the s
f690: 63 72 65 65 6e 20 74 68 65 6e 20 70 6f 73 69 74  creen then posit
f6a0: 69 6f 6e 20 69 74 20 61 74 20 74 68 65 0a 09 20  ion it at the.. 
f6b0: 2a 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  * bottom of the 
f6c0: 73 63 72 65 65 6e 2e 0a 09 20 2a 2f 0a 0a 09 4d  screen... */...M
f6d0: 65 61 73 75 72 65 55 70 28 74 65 78 74 50 74 72  easureUp(textPtr
f6e0: 2c 20 69 6e 64 65 78 50 74 72 2c 20 63 6c 6f 73  , indexPtr, clos
f6f0: 65 2c 20 26 74 6d 70 49 6e 64 65 78 29 3b 0a 09  e, &tmpIndex);..
f700: 69 66 20 28 46 69 6e 64 44 4c 69 6e 65 28 64 49  if (FindDLine(dI
f710: 6e 66 6f 50 74 72 2d 3e 64 4c 69 6e 65 50 74 72  nfoPtr->dLinePtr
f720: 2c 20 26 74 6d 70 49 6e 64 65 78 29 20 21 3d 20  , &tmpIndex) != 
f730: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 62 6f 74  NULL) {..    bot
f740: 74 6f 6d 59 20 3d 20 64 49 6e 66 6f 50 74 72 2d  tomY = dInfoPtr-
f750: 3e 6d 61 78 59 20 2d 20 64 49 6e 66 6f 50 74 72  >maxY - dInfoPtr
f760: 2d 3e 79 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ->y;..}.    }.. 
f770: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4f 75 72     /*.     * Our
f780: 20 6a 6f 62 20 6e 6f 77 20 69 73 20 74 6f 20 61   job now is to a
f790: 72 72 61 6e 67 65 20 74 68 65 20 64 69 73 70 6c  rrange the displ
f7a0: 61 79 20 73 6f 20 74 68 61 74 20 69 6e 64 65 78  ay so that index
f7b0: 50 74 72 20 61 70 70 65 61 72 73 0a 20 20 20 20  Ptr appears.    
f7c0: 20 2a 20 61 73 20 6c 6f 77 20 6f 6e 20 74 68 65   * as low on the
f7d0: 20 73 63 72 65 65 6e 20 61 73 20 70 6f 73 73 69   screen as possi
f7e0: 62 6c 65 20 62 75 74 20 77 69 74 68 20 69 74 73  ble but with its
f7f0: 20 62 6f 74 74 6f 6d 20 6e 6f 20 6c 6f 77 65 72   bottom no lower
f800: 0a 20 20 20 20 20 2a 20 74 68 61 6e 20 62 6f 74  .     * than bot
f810: 74 6f 6d 59 2e 20 20 42 6f 74 74 6f 6d 59 20 69  tomY.  BottomY i
f820: 73 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  s the bottom of 
f830: 74 68 65 20 77 69 6e 64 6f 77 20 69 66 20 74 68  the window if th
f840: 65 0a 20 20 20 20 20 2a 20 64 65 73 69 72 65 64  e.     * desired
f850: 20 6c 69 6e 65 20 69 73 20 6a 75 73 74 20 62 65   line is just be
f860: 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  low the current 
f870: 73 63 72 65 65 6e 2c 20 6f 74 68 65 72 77 69 73  screen, otherwis
f880: 65 20 69 74 0a 20 20 20 20 20 2a 20 69 73 20 61  e it.     * is a
f890: 20 68 61 6c 66 2d 6c 69 6e 65 20 6c 6f 77 65 72   half-line lower
f8a0: 20 74 68 61 6e 20 74 68 65 20 63 65 6e 74 65 72   than the center
f8b0: 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 2e 0a   of the window..
f8c0: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 4d 65 61       */..    Mea
f8d0: 73 75 72 65 55 70 28 74 65 78 74 50 74 72 2c 20  sureUp(textPtr, 
f8e0: 69 6e 64 65 78 50 74 72 2c 20 62 6f 74 74 6f 6d  indexPtr, bottom
f8f0: 59 2c 20 26 74 65 78 74 50 74 72 2d 3e 74 6f 70  Y, &textPtr->top
f900: 49 6e 64 65 78 29 3b 0a 0a 20 20 20 20 73 63 68  Index);..    sch
f910: 65 64 75 6c 65 55 70 64 61 74 65 3a 0a 20 20 20  eduleUpdate:.   
f920: 20 69 66 20 28 21 28 64 49 6e 66 6f 50 74 72 2d   if (!(dInfoPtr-
f930: 3e 66 6c 61 67 73 20 26 20 52 45 44 52 41 57 5f  >flags & REDRAW_
f940: 50 45 4e 44 49 4e 47 29 29 20 7b 0a 09 54 63 6c  PENDING)) {..Tcl
f950: 5f 44 6f 57 68 65 6e 49 64 6c 65 28 44 69 73 70  _DoWhenIdle(Disp
f960: 6c 61 79 54 65 78 74 2c 20 28 43 6c 69 65 6e 74  layText, (Client
f970: 44 61 74 61 29 20 74 65 78 74 50 74 72 29 3b 0a  Data) textPtr);.
f980: 20 20 20 20 7d 0a 20 20 20 20 64 49 6e 66 6f 50      }.    dInfoP
f990: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 52 45 44  tr->flags |= RED
f9a0: 52 41 57 5f 50 45 4e 44 49 4e 47 7c 44 49 4e 46  RAW_PENDING|DINF
f9b0: 4f 5f 4f 55 54 5f 4f 46 5f 44 41 54 45 3b 0a 7d  O_OUT_OF_DATE;.}
f9c0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
f9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa00: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 61  ------. *. * Mea
fa10: 73 75 72 65 55 70 20 2d 2d 0a 20 2a 0a 20 2a 09  sureUp --. *. *.
fa20: 47 69 76 65 6e 20 6f 6e 65 20 69 6e 64 65 78 2c  Given one index,
fa30: 20 66 69 6e 64 20 74 68 65 20 69 6e 64 65 78 20   find the index 
fa40: 6f 66 20 74 68 65 20 66 69 72 73 74 20 63 68 61  of the first cha
fa50: 72 61 63 74 65 72 0a 20 2a 09 6f 6e 20 74 68 65  racter. *.on the
fa60: 20 68 69 67 68 65 73 74 20 64 69 73 70 6c 61 79   highest display
fa70: 20 6c 69 6e 65 20 74 68 61 74 20 77 6f 75 6c 64   line that would
fa80: 20 62 65 20 64 69 73 70 6c 61 79 65 64 20 6e 6f   be displayed no
fa90: 20 6d 6f 72 65 0a 20 2a 09 74 68 61 6e 20 22 64   more. *.than "d
faa0: 69 73 74 61 6e 63 65 22 20 70 69 78 65 6c 73 20  istance" pixels 
fab0: 61 62 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20  above the given 
fac0: 69 6e 64 65 78 2e 0a 20 2a 0a 20 2a 20 52 65 73  index.. *. * Res
fad0: 75 6c 74 73 3a 0a 20 2a 09 2a 64 73 74 50 74 72  ults:. *.*dstPtr
fae0: 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69   is filled in wi
faf0: 74 68 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  th the index of 
fb00: 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63  the first charac
fb10: 74 65 72 0a 20 2a 09 6f 6e 20 61 20 64 69 73 70  ter. *.on a disp
fb20: 6c 61 79 20 6c 69 6e 65 2e 20 20 54 68 65 20 64  lay line.  The d
fb30: 69 73 70 6c 61 79 20 6c 69 6e 65 20 69 73 20 66  isplay line is f
fb40: 6f 75 6e 64 20 62 79 20 6d 65 61 73 75 72 69 6e  ound by measurin
fb50: 67 0a 20 2a 09 75 70 20 22 64 69 73 74 61 6e 63  g. *.up "distanc
fb60: 65 22 20 70 69 78 65 6c 73 20 61 62 6f 76 65 20  e" pixels above 
fb70: 74 68 65 20 70 69 78 65 6c 20 6a 75 73 74 20 62  the pixel just b
fb80: 65 6c 6f 77 20 61 6e 20 69 6d 61 67 69 6e 61 72  elow an imaginar
fb90: 79 0a 20 2a 09 64 69 73 70 6c 61 79 20 6c 69 6e  y. *.display lin
fba0: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
fbb0: 73 72 63 50 74 72 2e 20 20 49 66 20 74 68 65 20  srcPtr.  If the 
fbc0: 64 69 73 70 6c 61 79 20 6c 69 6e 65 0a 20 2a 09  display line. *.
fbd0: 74 68 61 74 20 63 6f 76 65 72 73 20 74 68 69 73  that covers this
fbe0: 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 74 75   coordinate actu
fbf0: 61 6c 6c 79 20 65 78 74 65 6e 64 73 20 61 62 6f  ally extends abo
fc00: 76 65 20 74 68 65 20 0a 20 2a 09 63 6f 6f 72 64  ve the . *.coord
fc10: 69 6e 61 74 65 2c 20 74 68 65 6e 20 72 65 74 75  inate, then retu
fc20: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
fc30: 74 68 65 20 6e 65 78 74 20 6c 6f 77 65 72 20 6c  the next lower l
fc40: 69 6e 65 0a 20 2a 09 69 6e 73 74 65 61 64 20 28  ine. *.instead (
fc50: 69 2e 65 2e 20 74 68 65 20 72 65 74 75 72 6e 65  i.e. the returne
fc60: 64 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20  d index will be 
fc70: 63 6f 6d 70 6c 65 74 65 6c 79 20 76 69 73 69 62  completely visib
fc80: 6c 65 0a 20 2a 09 61 74 20 6f 72 20 62 65 6c 6f  le. *.at or belo
fc90: 77 20 74 68 65 20 67 69 76 65 6e 20 79 2d 63 6f  w the given y-co
fca0: 6f 72 64 69 6e 61 74 65 29 2e 0a 20 2a 0a 20 2a  ordinate).. *. *
fcb0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
fcc0: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
fcd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fcf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
fd10: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 4d 65 61  .static void.Mea
fd20: 73 75 72 65 55 70 28 74 65 78 74 50 74 72 2c 20  sureUp(textPtr, 
fd30: 73 72 63 50 74 72 2c 20 64 69 73 74 61 6e 63 65  srcPtr, distance
fd40: 2c 20 64 73 74 50 74 72 29 0a 20 20 20 20 54 6b  , dstPtr).    Tk
fd50: 54 65 78 74 20 2a 74 65 78 74 50 74 72 3b 09 09  Text *textPtr;..
fd60: 2f 2a 20 54 65 78 74 20 77 69 64 67 65 74 20 69  /* Text widget i
fd70: 6e 20 77 68 69 63 68 20 74 6f 20 6d 65 61 73 75  n which to measu
fd80: 72 65 2e 20 2a 2f 0a 20 20 20 20 54 6b 54 65 78  re. */.    TkTex
fd90: 74 49 6e 64 65 78 20 2a 73 72 63 50 74 72 3b 09  tIndex *srcPtr;.
fda0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 68 61 72  /* Index of char
fdb0: 61 63 74 65 72 20 66 72 6f 6d 20 77 68 69 63 68  acter from which
fdc0: 20 74 6f 20 73 74 61 72 74 0a 09 09 09 09 20 2a   to start..... *
fdd0: 20 6d 65 61 73 75 72 69 6e 67 2e 20 2a 2f 0a 20   measuring. */. 
fde0: 20 20 20 69 6e 74 20 64 69 73 74 61 6e 63 65 3b     int distance;
fdf0: 09 09 2f 2a 20 56 65 72 74 69 63 61 6c 20 64 69  ../* Vertical di
fe00: 73 74 61 6e 63 65 20 69 6e 20 70 69 78 65 6c 73  stance in pixels
fe10: 20 6d 65 61 73 75 72 65 64 0a 09 09 09 09 20 2a   measured..... *
fe20: 20 66 72 6f 6d 20 74 68 65 20 70 69 78 65 6c 20   from the pixel 
fe30: 6a 75 73 74 20 62 65 6c 6f 77 20 74 68 65 20 6c  just below the l
fe40: 6f 77 65 73 74 0a 09 09 09 09 20 2a 20 6f 6e 65  owest..... * one
fe50: 20 69 6e 20 73 72 63 50 74 72 27 73 20 6c 69 6e   in srcPtr's lin
fe60: 65 2e 20 2a 2f 0a 20 20 20 20 54 6b 54 65 78 74  e. */.    TkText
fe70: 49 6e 64 65 78 20 2a 64 73 74 50 74 72 3b 09 2f  Index *dstPtr;./
fe80: 2a 20 49 6e 64 65 78 20 74 6f 20 66 69 6c 6c 20  * Index to fill 
fe90: 69 6e 20 77 69 74 68 20 72 65 73 75 6c 74 2e 20  in with result. 
fea0: 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6e  */.{.    int lin
feb0: 65 4e 75 6d 3b 09 09 2f 2a 20 4e 75 6d 62 65 72  eNum;../* Number
fec0: 20 6f 66 20 63 75 72 72 65 6e 74 20 6c 69 6e 65   of current line
fed0: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 63 68 61  . */.    int cha
fee0: 72 73 54 6f 43 6f 75 6e 74 3b 09 09 2f 2a 20 4d  rsToCount;../* M
fef0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
ff00: 20 63 68 61 72 61 63 74 65 72 73 20 74 6f 20 6d   characters to m
ff10: 65 61 73 75 72 65 0a 09 09 09 09 20 2a 20 69 6e  easure..... * in
ff20: 20 63 75 72 72 65 6e 74 20 6c 69 6e 65 2e 20 2a   current line. *
ff30: 2f 0a 20 20 20 20 54 6b 54 65 78 74 49 6e 64 65  /.    TkTextInde
ff40: 78 20 62 65 73 74 49 6e 64 65 78 3b 09 2f 2a 20  x bestIndex;./* 
ff50: 42 65 73 74 20 63 61 6e 64 69 64 61 74 65 20 73  Best candidate s
ff60: 65 65 6e 20 73 6f 20 66 61 72 20 66 6f 72 20 72  een so far for r
ff70: 65 73 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 54 6b  esult. */.    Tk
ff80: 54 65 78 74 49 6e 64 65 78 20 69 6e 64 65 78 3b  TextIndex index;
ff90: 0a 20 20 20 20 44 4c 69 6e 65 20 2a 64 6c 50 74  .    DLine *dlPt
ffa0: 72 2c 20 2a 6c 6f 77 65 73 74 50 74 72 3b 0a 20  r, *lowestPtr;. 
ffb0: 20 20 20 69 6e 74 20 6e 6f 42 65 73 74 59 65 74     int noBestYet
ffc0: 3b 09 09 2f 2a 20 31 20 6d 65 61 6e 73 20 62 65  ;../* 1 means be
ffd0: 73 74 49 6e 64 65 78 20 68 61 73 6e 27 74 20 62  stIndex hasn't b
ffe0: 65 65 6e 20 73 65 74 2e 20 2a 2f 0a 0a 20 20 20  een set. */..   
fff0: 20 6e 6f 42 65 73 74 59 65 74 20 3d 20 31 3b 0a   noBestYet = 1;.
10000 20 20 20 20 63 68 61 72 73 54 6f 43 6f 75 6e 74      charsToCount
10010 20 3d 20 73 72 63 50 74 72 2d 3e 63 68 61 72 49   = srcPtr->charI
10020 6e 64 65 78 20 2b 20 31 3b 0a 20 20 20 20 69 6e  ndex + 1;.    in
10030 64 65 78 2e 74 72 65 65 20 3d 20 73 72 63 50 74  dex.tree = srcPt
10040 72 2d 3e 74 72 65 65 3b 0a 20 20 20 20 66 6f 72  r->tree;.    for
10050 20 28 6c 69 6e 65 4e 75 6d 20 3d 20 54 6b 42 54   (lineNum = TkBT
10060 72 65 65 4c 69 6e 65 49 6e 64 65 78 28 73 72 63  reeLineIndex(src
10070 50 74 72 2d 3e 6c 69 6e 65 50 74 72 29 3b 20 6c  Ptr->linePtr); l
10080 69 6e 65 4e 75 6d 20 3e 3d 20 30 3b 0a 09 20 20  ineNum >= 0;..  
10090 20 20 6c 69 6e 65 4e 75 6d 2d 2d 29 20 7b 0a 09    lineNum--) {..
100a0 2f 2a 0a 09 20 2a 20 4c 61 79 6f 75 74 20 61 6e  /*.. * Layout an
100b0 20 65 6e 74 69 72 65 20 74 65 78 74 20 6c 69 6e   entire text lin
100c0 65 20 28 70 6f 74 65 6e 74 69 61 6c 6c 79 20 3e  e (potentially >
100d0 20 31 20 64 69 73 70 6c 61 79 20 6c 69 6e 65 29   1 display line)
100e0 2e 0a 09 20 2a 20 46 6f 72 20 74 68 65 20 66 69  ... * For the fi
100f0 72 73 74 20 6c 69 6e 65 2c 20 77 68 69 63 68 20  rst line, which 
10100 63 6f 6e 74 61 69 6e 73 20 73 72 63 50 74 72 2c  contains srcPtr,
10110 20 6f 6e 6c 79 20 6c 61 79 6f 75 74 20 74 68 65   only layout the
10120 0a 09 20 2a 20 70 61 72 74 20 75 70 20 74 68 72  .. * part up thr
10130 6f 75 67 68 20 73 72 63 50 74 72 20 28 63 68 61  ough srcPtr (cha
10140 72 73 54 6f 43 6f 75 6e 74 20 69 73 20 6e 6f 6e  rsToCount is non
10150 2d 69 6e 66 69 6e 69 74 65 20 74 6f 0a 09 20 2a  -infinite to.. *
10160 20 61 63 63 6f 6d 70 6c 69 73 68 20 74 68 69 73   accomplish this
10170 29 2e 20 20 4d 61 6b 65 20 61 20 6c 69 73 74 20  ).  Make a list 
10180 6f 66 20 61 6c 6c 20 74 68 65 20 64 69 73 70 6c  of all the displ
10190 61 79 20 6c 69 6e 65 73 0a 09 20 2a 20 69 6e 20  ay lines.. * in 
101a0 62 61 63 6b 77 61 72 64 73 20 6f 72 64 65 72 20  backwards order 
101b0 28 74 68 65 20 6c 6f 77 65 73 74 20 44 4c 69 6e  (the lowest DLin
101c0 65 20 6f 6e 20 74 68 65 20 73 63 72 65 65 6e 20  e on the screen 
101d0 69 73 20 66 69 72 73 74 0a 09 20 2a 20 69 6e 20  is first.. * in 
101e0 74 68 65 20 6c 69 73 74 29 2e 0a 09 20 2a 2f 0a  the list)... */.
101f0 0a 09 69 6e 64 65 78 2e 6c 69 6e 65 50 74 72 20  ..index.linePtr 
10200 3d 20 54 6b 42 54 72 65 65 46 69 6e 64 4c 69 6e  = TkBTreeFindLin
10210 65 28 73 72 63 50 74 72 2d 3e 74 72 65 65 2c 20  e(srcPtr->tree, 
10220 6c 69 6e 65 4e 75 6d 29 3b 0a 09 69 6e 64 65 78  lineNum);..index
10230 2e 63 68 61 72 49 6e 64 65 78 20 3d 20 30 3b 0a  .charIndex = 0;.
10240 09 6c 6f 77 65 73 74 50 74 72 20 3d 20 4e 55 4c  .lowestPtr = NUL
10250 4c 3b 0a 09 64 6f 20 7b 0a 09 20 20 20 20 64 6c  L;..do {..    dl
10260 50 74 72 20 3d 20 4c 61 79 6f 75 74 44 4c 69 6e  Ptr = LayoutDLin
10270 65 28 74 65 78 74 50 74 72 2c 20 26 69 6e 64 65  e(textPtr, &inde
10280 78 29 3b 0a 09 20 20 20 20 64 6c 50 74 72 2d 3e  x);..    dlPtr->
10290 6e 65 78 74 50 74 72 20 3d 20 6c 6f 77 65 73 74  nextPtr = lowest
102a0 50 74 72 3b 0a 09 20 20 20 20 6c 6f 77 65 73 74  Ptr;..    lowest
102b0 50 74 72 20 3d 20 64 6c 50 74 72 3b 0a 09 20 20  Ptr = dlPtr;..  
102c0 20 20 54 6b 54 65 78 74 49 6e 64 65 78 46 6f 72    TkTextIndexFor
102d0 77 43 68 61 72 73 28 26 69 6e 64 65 78 2c 20 64  wChars(&index, d
102e0 6c 50 74 72 2d 3e 63 6f 75 6e 74 2c 20 26 69 6e  lPtr->count, &in
102f0 64 65 78 29 3b 0a 09 20 20 20 20 63 68 61 72 73  dex);..    chars
10300 54 6f 43 6f 75 6e 74 20 2d 3d 20 64 6c 50 74 72  ToCount -= dlPtr
10310 2d 3e 63 6f 75 6e 74 3b 0a 09 7d 20 77 68 69 6c  ->count;..} whil
10320 65 20 28 28 63 68 61 72 73 54 6f 43 6f 75 6e 74  e ((charsToCount
10330 20 3e 20 30 29 20 26 26 20 28 69 6e 64 65 78 2e   > 0) && (index.
10340 6c 69 6e 65 50 74 72 20 3d 3d 20 64 6c 50 74 72  linePtr == dlPtr
10350 2d 3e 69 6e 64 65 78 2e 6c 69 6e 65 50 74 72 29  ->index.linePtr)
10360 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 53 63 61 6e  );.../*.. * Scan
10370 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 69 73   through the dis
10380 70 6c 61 79 20 6c 69 6e 65 73 20 74 6f 20 73 65  play lines to se
10390 65 20 69 66 20 77 65 27 76 65 20 63 6f 76 65 72  e if we've cover
103a0 65 64 20 65 6e 6f 75 67 68 0a 09 20 2a 20 76 65  ed enough.. * ve
103b0 72 74 69 63 61 6c 20 64 69 73 74 61 6e 63 65 2e  rtical distance.
103c0 20 20 49 66 20 73 6f 2c 20 73 61 76 65 20 74 68    If so, save th
103d0 65 20 73 74 61 72 74 69 6e 67 20 69 6e 64 65 78  e starting index
103e0 20 66 6f 72 20 74 68 65 0a 09 20 2a 20 6c 69 6e   for the.. * lin
103f0 65 20 61 74 20 74 68 65 20 64 65 73 69 72 65 64  e at the desired
10400 20 6c 6f 63 61 74 69 6f 6e 2e 0a 09 20 2a 2f 0a   location... */.
10410 0a 09 66 6f 72 20 28 64 6c 50 74 72 20 3d 20 6c  ..for (dlPtr = l
10420 6f 77 65 73 74 50 74 72 3b 20 64 6c 50 74 72 20  owestPtr; dlPtr 
10430 21 3d 20 4e 55 4c 4c 3b 20 64 6c 50 74 72 20 3d  != NULL; dlPtr =
10440 20 64 6c 50 74 72 2d 3e 6e 65 78 74 50 74 72 29   dlPtr->nextPtr)
10450 20 7b 0a 09 20 20 20 20 64 69 73 74 61 6e 63 65   {..    distance
10460 20 2d 3d 20 64 6c 50 74 72 2d 3e 68 65 69 67 68   -= dlPtr->heigh
10470 74 3b 0a 09 20 20 20 20 69 66 20 28 64 69 73 74  t;..    if (dist
10480 61 6e 63 65 20 3c 20 30 29 20 7b 0a 09 09 2a 64  ance < 0) {...*d
10490 73 74 50 74 72 20 3d 20 28 6e 6f 42 65 73 74 59  stPtr = (noBestY
104a0 65 74 29 20 3f 20 64 6c 50 74 72 2d 3e 69 6e 64  et) ? dlPtr->ind
104b0 65 78 20 3a 20 62 65 73 74 49 6e 64 65 78 3b 0a  ex : bestIndex;.
104c0 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a  ..break;..    }.
104d0 09 20 20 20 20 62 65 73 74 49 6e 64 65 78 20 3d  .    bestIndex =
104e0 20 64 6c 50 74 72 2d 3e 69 6e 64 65 78 3b 0a 09   dlPtr->index;..
104f0 20 20 20 20 6e 6f 42 65 73 74 59 65 74 20 3d 20      noBestYet = 
10500 30 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 44  0;..}.../*.. * D
10510 69 73 63 61 72 64 20 74 68 65 20 64 69 73 70 6c  iscard the displ
10520 61 79 20 6c 69 6e 65 73 2c 20 74 68 65 6e 20 65  ay lines, then e
10530 69 74 68 65 72 20 72 65 74 75 72 6e 20 6f 72 20  ither return or 
10540 70 72 65 70 61 72 65 0a 09 20 2a 20 66 6f 72 20  prepare.. * for 
10550 74 68 65 20 6e 65 78 74 20 64 69 73 70 6c 61 79  the next display
10560 20 6c 69 6e 65 20 74 6f 20 6c 61 79 20 6f 75 74   line to lay out
10570 2e 0a 09 20 2a 2f 0a 0a 09 46 72 65 65 44 4c 69  ... */...FreeDLi
10580 6e 65 73 28 74 65 78 74 50 74 72 2c 20 6c 6f 77  nes(textPtr, low
10590 65 73 74 50 74 72 2c 20 28 44 4c 69 6e 65 20 2a  estPtr, (DLine *
105a0 29 20 4e 55 4c 4c 2c 20 30 29 3b 0a 09 69 66 20  ) NULL, 0);..if 
105b0 28 64 69 73 74 61 6e 63 65 20 3c 20 30 29 20 7b  (distance < 0) {
105c0 0a 09 20 20 20 20 72 65 74 75 72 6e 3b 0a 09 7d  ..    return;..}
105d0 0a 09 63 68 61 72 73 54 6f 43 6f 75 6e 74 20 3d  ..charsToCount =
105e0 20 49 4e 54 5f 4d 41 58 3b 09 09 2f 2a 20 43 6f   INT_MAX;../* Co
105f0 6e 73 69 64 65 72 20 61 6c 6c 20 63 68 61 72 73  nsider all chars
10600 2e 20 69 6e 20 6e 65 78 74 20 6c 69 6e 65 2e 20  . in next line. 
10610 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  */.    }..    /*
10620 0a 20 20 20 20 20 2a 20 52 61 6e 20 6f 66 66 20  .     * Ran off 
10630 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
10640 20 74 68 65 20 74 65 78 74 2e 20 20 52 65 74 75   the text.  Retu
10650 72 6e 20 74 68 65 20 66 69 72 73 74 20 63 68 61  rn the first cha
10660 72 61 63 74 65 72 0a 20 20 20 20 20 2a 20 69 6e  racter.     * in
10670 20 74 68 65 20 74 65 78 74 2e 0a 20 20 20 20 20   the text..     
10680 2a 2f 0a 0a 20 20 20 20 54 6b 54 65 78 74 4d 61  */..    TkTextMa
10690 6b 65 49 6e 64 65 78 28 74 65 78 74 50 74 72 2d  keIndex(textPtr-
106a0 3e 74 72 65 65 2c 20 30 2c 20 30 2c 20 64 73 74  >tree, 0, 0, dst
106b0 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Ptr);.}.../*. *-
106c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
10700 0a 20 2a 20 54 6b 54 65 78 74 53 65 65 43 6d 64  . * TkTextSeeCmd
10710 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
10720 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
10730 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  ked to process t
10740 68 65 20 22 73 65 65 22 20 6f 70 74 69 6f 6e 20  he "see" option 
10750 66 6f 72 0a 20 2a 09 74 68 65 20 77 69 64 67 65  for. *.the widge
10760 74 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 74 65  t command for te
10770 78 74 20 77 69 64 67 65 74 73 2e 20 53 65 65 20  xt widgets. See 
10780 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e  the user documen
10790 74 61 74 69 6f 6e 0a 20 2a 09 66 6f 72 20 64 65  tation. *.for de
107a0 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 74  tails on what it
107b0 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73   does.. *. * Res
107c0 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
107d0 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
107e0 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
107f0 74 73 3a 0a 20 2a 09 53 65 65 20 74 68 65 20 75  ts:. *.See the u
10800 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  ser documentatio
10810 6e 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  n.. *. *--------
10820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10850 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a  ------. */..int.
10860 54 6b 54 65 78 74 53 65 65 43 6d 64 28 74 65 78  TkTextSeeCmd(tex
10870 74 50 74 72 2c 20 69 6e 74 65 72 70 2c 20 61 72  tPtr, interp, ar
10880 67 63 2c 20 61 72 67 76 29 0a 20 20 20 20 54 6b  gc, argv).    Tk
10890 54 65 78 74 20 2a 74 65 78 74 50 74 72 3b 09 09  Text *textPtr;..
108a0 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
108b0 62 6f 75 74 20 74 65 78 74 20 77 69 64 67 65 74  bout text widget
108c0 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74  . */.    Tcl_Int
108d0 65 72 70 20 2a 69 6e 74 65 72 70 3b 09 09 2f 2a  erp *interp;../*
108e0 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72   Current interpr
108f0 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  eter. */.    int
10900 20 61 72 67 63 3b 09 09 09 2f 2a 20 4e 75 6d 62   argc;.../* Numb
10910 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  er of arguments.
10920 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a 61   */.    char **a
10930 72 67 76 3b 09 09 2f 2a 20 41 72 67 75 6d 65 6e  rgv;../* Argumen
10940 74 20 73 74 72 69 6e 67 73 2e 20 20 53 6f 6d 65  t strings.  Some
10950 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 61 6c 72  one else has alr
10960 65 61 64 79 0a 09 09 09 09 20 2a 20 70 61 72 73  eady..... * pars
10970 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
10980 65 6e 6f 75 67 68 20 74 6f 20 6b 6e 6f 77 20 74  enough to know t
10990 68 61 74 0a 09 09 09 09 20 2a 20 61 72 67 76 5b  hat..... * argv[
109a0 31 5d 20 69 73 20 22 73 65 65 22 2e 20 2a 2f 0a  1] is "see". */.
109b0 7b 0a 20 20 20 20 44 49 6e 66 6f 20 2a 64 49 6e  {.    DInfo *dIn
109c0 66 6f 50 74 72 20 3d 20 74 65 78 74 50 74 72 2d  foPtr = textPtr-
109d0 3e 64 49 6e 66 6f 50 74 72 3b 0a 20 20 20 20 54  >dInfoPtr;.    T
109e0 6b 54 65 78 74 49 6e 64 65 78 20 69 6e 64 65 78  kTextIndex index
109f0 3b 0a 20 20 20 20 69 6e 74 20 78 2c 20 79 2c 20  ;.    int x, y, 
10a00 77 69 64 74 68 2c 20 68 65 69 67 68 74 2c 20 6c  width, height, l
10a10 69 6e 65 57 69 64 74 68 2c 20 63 68 61 72 43 6f  ineWidth, charCo
10a20 75 6e 74 2c 20 6f 6e 65 54 68 69 72 64 2c 20 64  unt, oneThird, d
10a30 65 6c 74 61 3b 0a 20 20 20 20 44 4c 69 6e 65 20  elta;.    DLine 
10a40 2a 64 6c 50 74 72 3b 0a 20 20 20 20 54 6b 54 65  *dlPtr;.    TkTe
10a50 78 74 44 69 73 70 43 68 75 6e 6b 20 2a 63 68 75  xtDispChunk *chu
10a60 6e 6b 50 74 72 3b 0a 0a 20 20 20 20 69 66 20 28  nkPtr;..    if (
10a70 61 72 67 63 20 21 3d 20 33 29 20 7b 0a 09 54 63  argc != 3) {..Tc
10a80 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10a90 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
10aa0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
10ab0 5c 22 22 2c 0a 09 09 61 72 67 76 5b 30 5d 2c 20  \"",...argv[0], 
10ac0 22 20 73 65 65 20 69 6e 64 65 78 5c 22 22 2c 20  " see index\"", 
10ad0 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
10ae0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
10af0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  R;.    }.    if 
10b00 28 54 6b 54 65 78 74 47 65 74 49 6e 64 65 78 28  (TkTextGetIndex(
10b10 69 6e 74 65 72 70 2c 20 74 65 78 74 50 74 72 2c  interp, textPtr,
10b20 20 61 72 67 76 5b 32 5d 2c 20 26 69 6e 64 65 78   argv[2], &index
10b30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
10b40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10b50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
10b60 20 20 20 20 20 2a 20 49 66 20 74 68 65 20 73 70       * If the sp
10b70 65 63 69 66 69 65 64 20 70 6f 73 69 74 69 6f 6e  ecified position
10b80 20 69 73 20 74 68 65 20 65 78 74 72 61 20 6c 69   is the extra li
10b90 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ne at the end of
10ba0 20 74 68 65 0a 20 20 20 20 20 2a 20 74 65 78 74   the.     * text
10bb0 2c 20 72 6f 75 6e 64 20 69 74 20 62 61 63 6b 20  , round it back 
10bc0 74 6f 20 74 68 65 20 6c 61 73 74 20 72 65 61 6c  to the last real
10bd0 20 6c 69 6e 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a   line..     */..
10be0 20 20 20 20 69 66 20 28 54 6b 42 54 72 65 65 4c      if (TkBTreeL
10bf0 69 6e 65 49 6e 64 65 78 28 69 6e 64 65 78 2e 6c  ineIndex(index.l
10c00 69 6e 65 50 74 72 29 20 3d 3d 20 54 6b 42 54 72  inePtr) == TkBTr
10c10 65 65 4e 75 6d 4c 69 6e 65 73 28 69 6e 64 65 78  eeNumLines(index
10c20 2e 74 72 65 65 29 29 20 7b 0a 09 54 6b 54 65 78  .tree)) {..TkTex
10c30 74 49 6e 64 65 78 42 61 63 6b 43 68 61 72 73 28  tIndexBackChars(
10c40 26 69 6e 64 65 78 2c 20 31 2c 20 26 69 6e 64 65  &index, 1, &inde
10c50 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  x);.    }..    /
10c60 2a 0a 20 20 20 20 20 2a 20 46 69 72 73 74 20 67  *.     * First g
10c70 65 74 20 74 68 65 20 64 65 73 69 72 65 64 20 70  et the desired p
10c80 6f 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  osition into the
10c90 20 76 65 72 74 69 63 61 6c 20 72 61 6e 67 65 20   vertical range 
10ca0 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 2e 0a 20  of the window.. 
10cb0 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54 6b 54 65      */..    TkTe
10cc0 78 74 53 65 74 59 56 69 65 77 28 74 65 78 74 50  xtSetYView(textP
10cd0 74 72 2c 20 26 69 6e 64 65 78 2c 20 31 29 3b 0a  tr, &index, 1);.
10ce0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4e  .    /*.     * N
10cf0 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  ow make sure tha
10d00 74 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20  t the character 
10d10 69 73 20 69 6e 20 76 69 65 77 20 68 6f 72 69 7a  is in view horiz
10d20 6f 6e 74 61 6c 6c 79 2e 0a 20 20 20 20 20 2a 2f  ontally..     */
10d30 0a 0a 20 20 20 20 69 66 20 28 64 49 6e 66 6f 50  ..    if (dInfoP
10d40 74 72 2d 3e 66 6c 61 67 73 20 26 20 44 49 4e 46  tr->flags & DINF
10d50 4f 5f 4f 55 54 5f 4f 46 5f 44 41 54 45 29 20 7b  O_OUT_OF_DATE) {
10d60 0a 09 55 70 64 61 74 65 44 69 73 70 6c 61 79 49  ..UpdateDisplayI
10d70 6e 66 6f 28 74 65 78 74 50 74 72 29 3b 0a 20 20  nfo(textPtr);.  
10d80 20 20 7d 0a 20 20 20 20 6c 69 6e 65 57 69 64 74    }.    lineWidt
10d90 68 20 3d 20 64 49 6e 66 6f 50 74 72 2d 3e 6d 61  h = dInfoPtr->ma
10da0 78 58 20 2d 20 64 49 6e 66 6f 50 74 72 2d 3e 78  xX - dInfoPtr->x
10db0 3b 0a 20 20 20 20 69 66 20 28 64 49 6e 66 6f 50  ;.    if (dInfoP
10dc0 74 72 2d 3e 6d 61 78 4c 65 6e 67 74 68 20 3c 20  tr->maxLength < 
10dd0 6c 69 6e 65 57 69 64 74 68 29 20 7b 0a 09 72 65  lineWidth) {..re
10de0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
10df0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
10e00 2a 20 46 69 6e 64 20 74 68 65 20 63 68 75 6e 6b  * Find the chunk
10e10 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
10e20 68 65 20 64 65 73 69 72 65 64 20 69 6e 64 65 78  he desired index
10e30 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 64  ..     */..    d
10e40 6c 50 74 72 20 3d 20 46 69 6e 64 44 4c 69 6e 65  lPtr = FindDLine
10e50 28 64 49 6e 66 6f 50 74 72 2d 3e 64 4c 69 6e 65  (dInfoPtr->dLine
10e60 50 74 72 2c 20 26 69 6e 64 65 78 29 3b 0a 20 20  Ptr, &index);.  
10e70 20 20 63 68 61 72 43 6f 75 6e 74 20 3d 20 69 6e    charCount = in
10e80 64 65 78 2e 63 68 61 72 49 6e 64 65 78 20 2d 20  dex.charIndex - 
10e90 64 6c 50 74 72 2d 3e 69 6e 64 65 78 2e 63 68 61  dlPtr->index.cha
10ea0 72 49 6e 64 65 78 3b 0a 20 20 20 20 66 6f 72 20  rIndex;.    for 
10eb0 28 63 68 75 6e 6b 50 74 72 20 3d 20 64 6c 50 74  (chunkPtr = dlPt
10ec0 72 2d 3e 63 68 75 6e 6b 50 74 72 3b 20 3b 20 63  r->chunkPtr; ; c
10ed0 68 75 6e 6b 50 74 72 20 3d 20 63 68 75 6e 6b 50  hunkPtr = chunkP
10ee0 74 72 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09  tr->nextPtr) {..
10ef0 69 66 20 28 63 68 61 72 43 6f 75 6e 74 20 3c 20  if (charCount < 
10f00 63 68 75 6e 6b 50 74 72 2d 3e 6e 75 6d 43 68 61  chunkPtr->numCha
10f10 72 73 29 20 7b 0a 09 20 20 20 20 62 72 65 61 6b  rs) {..    break
10f20 3b 0a 09 7d 0a 09 63 68 61 72 43 6f 75 6e 74 20  ;..}..charCount 
10f30 2d 3d 20 63 68 75 6e 6b 50 74 72 2d 3e 6e 75 6d  -= chunkPtr->num
10f40 43 68 61 72 73 3b 0a 20 20 20 20 7d 0a 0a 20 20  Chars;.    }..  
10f50 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 61 6c 6c    /*.     * Call
10f60 20 61 20 63 68 75 6e 6b 2d 73 70 65 63 69 66 69   a chunk-specifi
10f70 63 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 66  c procedure to f
10f80 69 6e 64 20 74 68 65 20 68 6f 72 69 7a 6f 6e 74  ind the horizont
10f90 61 6c 20 72 61 6e 67 65 20 6f 66 0a 20 20 20 20  al range of.    
10fa0 20 2a 20 74 68 65 20 63 68 61 72 61 63 74 65 72   * the character
10fb0 20 77 69 74 68 69 6e 20 74 68 65 20 63 68 75 6e   within the chun
10fc0 6b 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  k..     */..    
10fd0 28 2a 63 68 75 6e 6b 50 74 72 2d 3e 62 62 6f 78  (*chunkPtr->bbox
10fe0 50 72 6f 63 29 28 63 68 75 6e 6b 50 74 72 2c 20  Proc)(chunkPtr, 
10ff0 63 68 61 72 43 6f 75 6e 74 2c 20 64 6c 50 74 72  charCount, dlPtr
11000 2d 3e 79 20 2b 20 64 6c 50 74 72 2d 3e 73 70 61  ->y + dlPtr->spa
11010 63 65 41 62 6f 76 65 2c 0a 09 20 20 20 20 26 78  ceAbove,..    &x
11020 2c 20 26 79 2c 20 26 77 69 64 74 68 2c 20 26 68  , &y, &width, &h
11030 65 69 67 68 74 29 3b 0a 20 20 20 20 64 65 6c 74  eight);.    delt
11040 61 20 3d 20 78 20 2d 20 64 49 6e 66 6f 50 74 72  a = x - dInfoPtr
11050 2d 3e 63 75 72 50 69 78 65 6c 4f 66 66 73 65 74  ->curPixelOffset
11060 3b 0a 20 20 20 20 6f 6e 65 54 68 69 72 64 20 3d  ;.    oneThird =
11070 20 6c 69 6e 65 57 69 64 74 68 2f 33 3b 0a 20 20   lineWidth/3;.  
11080 20 20 69 66 20 28 64 65 6c 74 61 20 3c 20 30 29    if (delta < 0)
11090 20 7b 0a 09 69 66 20 28 64 65 6c 74 61 20 3c 20   {..if (delta < 
110a0 2d 6f 6e 65 54 68 69 72 64 29 20 7b 0a 09 20 20  -oneThird) {..  
110b0 20 20 64 49 6e 66 6f 50 74 72 2d 3e 6e 65 77 43    dInfoPtr->newC
110c0 68 61 72 4f 66 66 73 65 74 20 3d 20 78 20 2d 20  harOffset = x - 
110d0 6c 69 6e 65 57 69 64 74 68 2f 32 3b 0a 09 7d 20  lineWidth/2;..} 
110e0 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 49 6e 66  else {..    dInf
110f0 6f 50 74 72 2d 3e 6e 65 77 43 68 61 72 4f 66 66  oPtr->newCharOff
11100 73 65 74 20 2d 3d 20 2d 64 65 6c 74 61 3b 0a 09  set -= -delta;..
11110 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  }.    } else {..
11120 64 65 6c 74 61 20 2d 3d 20 28 6c 69 6e 65 57 69  delta -= (lineWi
11130 64 74 68 20 2d 20 77 69 64 74 68 29 3b 0a 09 69  dth - width);..i
11140 66 20 28 64 65 6c 74 61 20 3e 20 30 29 20 7b 0a  f (delta > 0) {.
11150 09 20 20 20 20 69 66 20 28 64 65 6c 74 61 20 3e  .    if (delta >
11160 20 6f 6e 65 54 68 69 72 64 29 20 7b 0a 09 09 64   oneThird) {...d
11170 49 6e 66 6f 50 74 72 2d 3e 6e 65 77 43 68 61 72  InfoPtr->newChar
11180 4f 66 66 73 65 74 20 3d 20 78 20 2d 20 6c 69 6e  Offset = x - lin
11190 65 57 69 64 74 68 2f 32 3b 0a 09 20 20 20 20 7d  eWidth/2;..    }
111a0 20 65 6c 73 65 20 7b 0a 09 09 64 49 6e 66 6f 50   else {...dInfoP
111b0 74 72 2d 3e 6e 65 77 43 68 61 72 4f 66 66 73 65  tr->newCharOffse
111c0 74 20 2b 3d 20 64 65 6c 74 61 20 3b 0a 09 20 20  t += delta ;..  
111d0 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20    }..} else {.. 
111e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
111f0 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64  ;..}.    }.    d
11200 49 6e 66 6f 50 74 72 2d 3e 66 6c 61 67 73 20 7c  InfoPtr->flags |
11210 3d 20 44 49 4e 46 4f 5f 4f 55 54 5f 4f 46 5f 44  = DINFO_OUT_OF_D
11220 41 54 45 3b 0a 20 20 20 20 69 66 20 28 21 28 64  ATE;.    if (!(d
11230 49 6e 66 6f 50 74 72 2d 3e 66 6c 61 67 73 20 26  InfoPtr->flags &
11240 20 52 45 44 52 41 57 5f 50 45 4e 44 49 4e 47 29   REDRAW_PENDING)
11250 29 20 7b 0a 09 64 49 6e 66 6f 50 74 72 2d 3e 66  ) {..dInfoPtr->f
11260 6c 61 67 73 20 7c 3d 20 52 45 44 52 41 57 5f 50  lags |= REDRAW_P
11270 45 4e 44 49 4e 47 3b 0a 09 54 63 6c 5f 44 6f 57  ENDING;..Tcl_DoW
11280 68 65 6e 49 64 6c 65 28 44 69 73 70 6c 61 79 54  henIdle(DisplayT
11290 65 78 74 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  ext, (ClientData
112a0 29 20 74 65 78 74 50 74 72 29 3b 0a 20 20 20 20  ) textPtr);.    
112b0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  }.    return TCL
112c0 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
112d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
112e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
112f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
11310 20 2a 20 54 6b 54 65 78 74 58 76 69 65 77 43 6d   * TkTextXviewCm
11320 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  d --. *. *.This 
11330 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
11340 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  oked to process 
11350 74 68 65 20 22 78 76 69 65 77 22 20 6f 70 74 69  the "xview" opti
11360 6f 6e 20 66 6f 72 0a 20 2a 09 74 68 65 20 77 69  on for. *.the wi
11370 64 67 65 74 20 63 6f 6d 6d 61 6e 64 20 66 6f 72  dget command for
11380 20 74 65 78 74 20 77 69 64 67 65 74 73 2e 20 53   text widgets. S
11390 65 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 75  ee the user docu
113a0 6d 65 6e 74 61 74 69 6f 6e 0a 20 2a 09 66 6f 72  mentation. *.for
113b0 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74   details on what
113c0 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20   it does.. *. * 
113d0 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
113e0 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
113f0 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
11400 66 65 63 74 73 3a 0a 20 2a 09 53 65 65 20 74 68  fects:. *.See th
11410 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61  e user documenta
11420 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  tion.. *. *-----
11430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11460 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69  ---------. */..i
11470 6e 74 0a 54 6b 54 65 78 74 58 76 69 65 77 43 6d  nt.TkTextXviewCm
11480 64 28 74 65 78 74 50 74 72 2c 20 69 6e 74 65 72  d(textPtr, inter
11490 70 2c 20 61 72 67 63 2c 20 61 72 67 76 29 0a 20  p, argc, argv). 
114a0 20 20 20 54 6b 54 65 78 74 20 2a 74 65 78 74 50     TkText *textP
114b0 74 72 3b 09 09 2f 2a 20 49 6e 66 6f 72 6d 61 74  tr;../* Informat
114c0 69 6f 6e 20 61 62 6f 75 74 20 74 65 78 74 20 77  ion about text w
114d0 69 64 67 65 74 2e 20 2a 2f 0a 20 20 20 20 54 63  idget. */.    Tc
114e0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
114f0 3b 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e  ;../* Current in
11500 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20  terpreter. */.  
11510 20 20 69 6e 74 20 61 72 67 63 3b 09 09 09 2f 2a    int argc;.../*
11520 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
11530 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 63 68 61  ents. */.    cha
11540 72 20 2a 2a 61 72 67 76 3b 09 09 2f 2a 20 41 72  r **argv;../* Ar
11550 67 75 6d 65 6e 74 20 73 74 72 69 6e 67 73 2e 20  gument strings. 
11560 20 53 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61   Someone else ha
11570 73 20 61 6c 72 65 61 64 79 0a 09 09 09 09 20 2a  s already..... *
11580 20 70 61 72 73 65 64 20 74 68 69 73 20 63 6f 6d   parsed this com
11590 6d 61 6e 64 20 65 6e 6f 75 67 68 20 74 6f 20 6b  mand enough to k
115a0 6e 6f 77 20 74 68 61 74 0a 09 09 09 09 20 2a 20  now that..... * 
115b0 61 72 67 76 5b 31 5d 20 69 73 20 22 78 76 69 65  argv[1] is "xvie
115c0 77 22 2e 20 2a 2f 0a 7b 0a 20 20 20 20 44 49 6e  w". */.{.    DIn
115d0 66 6f 20 2a 64 49 6e 66 6f 50 74 72 20 3d 20 74  fo *dInfoPtr = t
115e0 65 78 74 50 74 72 2d 3e 64 49 6e 66 6f 50 74 72  extPtr->dInfoPtr
115f0 3b 0a 20 20 20 20 69 6e 74 20 74 79 70 65 2c 20  ;.    int type, 
11600 63 68 61 72 73 50 65 72 50 61 67 65 2c 20 63 6f  charsPerPage, co
11610 75 6e 74 2c 20 6e 65 77 4f 66 66 73 65 74 3b 0a  unt, newOffset;.
11620 20 20 20 20 64 6f 75 62 6c 65 20 66 72 61 63 74      double fract
11630 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 20 28 64 49  ion;..    if (dI
11640 6e 66 6f 50 74 72 2d 3e 66 6c 61 67 73 20 26 20  nfoPtr->flags & 
11650 44 49 4e 46 4f 5f 4f 55 54 5f 4f 46 5f 44 41 54  DINFO_OUT_OF_DAT
11660 45 29 20 7b 0a 09 55 70 64 61 74 65 44 69 73 70  E) {..UpdateDisp
11670 6c 61 79 49 6e 66 6f 28 74 65 78 74 50 74 72 29  layInfo(textPtr)
11680 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
11690 28 61 72 67 63 20 3d 3d 20 32 29 20 7b 0a 09 47  (argc == 2) {..G
116a0 65 74 58 56 69 65 77 28 69 6e 74 65 72 70 2c 20  etXView(interp, 
116b0 74 65 78 74 50 74 72 2c 20 30 29 3b 0a 09 72 65  textPtr, 0);..re
116c0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
116d0 20 7d 0a 0a 20 20 20 20 6e 65 77 4f 66 66 73 65   }..    newOffse
116e0 74 20 3d 20 64 49 6e 66 6f 50 74 72 2d 3e 6e 65  t = dInfoPtr->ne
116f0 77 43 68 61 72 4f 66 66 73 65 74 3b 0a 20 20 20  wCharOffset;.   
11700 20 74 79 70 65 20 3d 20 54 6b 5f 47 65 74 53 63   type = Tk_GetSc
11710 72 6f 6c 6c 49 6e 66 6f 28 69 6e 74 65 72 70 2c  rollInfo(interp,
11720 20 61 72 67 63 2c 20 61 72 67 76 2c 20 26 66 72   argc, argv, &fr
11730 61 63 74 69 6f 6e 2c 20 26 63 6f 75 6e 74 29 3b  action, &count);
11740 0a 20 20 20 20 73 77 69 74 63 68 20 28 74 79 70  .    switch (typ
11750 65 29 20 7b 0a 09 63 61 73 65 20 54 4b 5f 53 43  e) {..case TK_SC
11760 52 4f 4c 4c 5f 45 52 52 4f 52 3a 0a 09 20 20 20  ROLL_ERROR:..   
11770 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11780 52 3b 0a 09 63 61 73 65 20 54 4b 5f 53 43 52 4f  R;..case TK_SCRO
11790 4c 4c 5f 4d 4f 56 45 54 4f 3a 0a 09 20 20 20 20  LL_MOVETO:..    
117a0 69 66 20 28 66 72 61 63 74 69 6f 6e 20 3e 20 31  if (fraction > 1
117b0 2e 30 29 20 7b 0a 09 09 66 72 61 63 74 69 6f 6e  .0) {...fraction
117c0 20 3d 20 31 2e 30 3b 0a 09 20 20 20 20 7d 0a 09   = 1.0;..    }..
117d0 20 20 20 20 69 66 20 28 66 72 61 63 74 69 6f 6e      if (fraction
117e0 20 3c 20 30 29 20 7b 0a 09 09 66 72 61 63 74 69   < 0) {...fracti
117f0 6f 6e 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a 09  on = 0;..    }..
11800 20 20 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20      newOffset = 
11810 28 66 72 61 63 74 69 6f 6e 20 2a 20 64 49 6e 66  (fraction * dInf
11820 6f 50 74 72 2d 3e 6d 61 78 4c 65 6e 67 74 68 29  oPtr->maxLength)
11830 20 2b 20 30 2e 35 3b 0a 09 20 20 20 20 6e 65 77   + 0.5;..    new
11840 4f 66 66 73 65 74 20 3d 20 66 72 61 63 74 69 6f  Offset = fractio
11850 6e 20 2a 20 64 49 6e 66 6f 50 74 72 2d 3e 6d 61  n * dInfoPtr->ma
11860 78 4c 65 6e 67 74 68 3b 0a 09 20 20 20 20 62 72  xLength;..    br
11870 65 61 6b 3b 0a 09 63 61 73 65 20 54 4b 5f 53 43  eak;..case TK_SC
11880 52 4f 4c 4c 5f 50 41 47 45 53 3a 0a 09 20 20 20  ROLL_PAGES:..   
11890 20 63 68 61 72 73 50 65 72 50 61 67 65 20 3d 20   charsPerPage = 
118a0 28 64 49 6e 66 6f 50 74 72 2d 3e 6d 61 78 58 20  (dInfoPtr->maxX 
118b0 2d 20 64 49 6e 66 6f 50 74 72 2d 3e 78 29 20 2d  - dInfoPtr->x) -
118c0 20 32 3b 0a 09 20 20 20 20 69 66 20 28 63 68 61   2;..    if (cha
118d0 72 73 50 65 72 50 61 67 65 20 3c 20 31 29 20 7b  rsPerPage < 1) {
118e0 0a 09 09 63 68 61 72 73 50 65 72 50 61 67 65 20  ...charsPerPage 
118f0 3d 20 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  = 1;..    }..   
11900 20 6e 65 77 4f 66 66 73 65 74 20 2b 3d 20 63 68   newOffset += ch
11910 61 72 73 50 65 72 50 61 67 65 2a 63 6f 75 6e 74  arsPerPage*count
11920 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
11930 61 73 65 20 54 4b 5f 53 43 52 4f 4c 4c 5f 55 4e  ase TK_SCROLL_UN
11940 49 54 53 3a 0a 09 20 20 20 20 6e 65 77 4f 66 66  ITS:..    newOff
11950 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a 09 20  set += count;.. 
11960 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11970 0a 20 20 20 20 64 49 6e 66 6f 50 74 72 2d 3e 6e  .    dInfoPtr->n
11980 65 77 43 68 61 72 4f 66 66 73 65 74 20 3d 20 6e  ewCharOffset = n
11990 65 77 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 49  ewOffset;.    dI
119a0 6e 66 6f 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d  nfoPtr->flags |=
119b0 20 44 49 4e 46 4f 5f 4f 55 54 5f 4f 46 5f 44 41   DINFO_OUT_OF_DA
119c0 54 45 3b 0a 20 20 20 20 69 66 20 28 21 28 64 49  TE;.    if (!(dI
119d0 6e 66 6f 50 74 72 2d 3e 66 6c 61 67 73 20 26 20  nfoPtr->flags & 
119e0 52 45 44 52 41 57 5f 50 45 4e 44 49 4e 47 29 29  REDRAW_PENDING))
119f0 20 7b 0a 09 64 49 6e 66 6f 50 74 72 2d 3e 66 6c   {..dInfoPtr->fl
11a00 61 67 73 20 7c 3d 20 52 45 44 52 41 57 5f 50 45  ags |= REDRAW_PE
11a10 4e 44 49 4e 47 3b 0a 09 54 63 6c 5f 44 6f 57 68  NDING;..Tcl_DoWh
11a20 65 6e 49 64 6c 65 28 44 69 73 70 6c 61 79 54 65  enIdle(DisplayTe
11a30 78 74 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  xt, (ClientData)
11a40 20 74 65 78 74 50 74 72 29 3b 0a 20 20 20 20 7d   textPtr);.    }
11a50 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
11a60 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  OK;.}.../*. *---
11a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ab0 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 63 72 6f 6c 6c  ---. *. * Scroll
11ac0 42 79 4c 69 6e 65 73 20 2d 2d 0a 20 2a 0a 20 2a  ByLines --. *. *
11ad0 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
11ae0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 73 63 72  is called to scr
11af0 6f 6c 6c 20 61 20 74 65 78 74 20 77 69 64 67 65  oll a text widge
11b00 74 20 75 70 20 6f 72 20 64 6f 77 6e 0a 20 2a 09  t up or down. *.
11b10 62 79 20 61 20 67 69 76 65 6e 20 6e 75 6d 62 65  by a given numbe
11b20 72 20 6f 66 20 6c 69 6e 65 73 2e 0a 20 2a 0a 20  r of lines.. *. 
11b30 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
11b40 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ne.. *. * Side e
11b50 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 76  ffects:. *.The v
11b60 69 65 77 20 69 6e 20 74 65 78 74 50 74 72 27 73  iew in textPtr's
11b70 20 77 69 6e 64 6f 77 20 63 68 61 6e 67 65 73 20   window changes 
11b80 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 76  to reflect the v
11b90 61 6c 75 65 0a 20 2a 09 6f 66 20 22 6f 66 66 73  alue. *.of "offs
11ba0 65 74 22 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  et".. *. *------
11bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11bf0 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  . */..static voi
11c00 64 0a 53 63 72 6f 6c 6c 42 79 4c 69 6e 65 73 28  d.ScrollByLines(
11c10 74 65 78 74 50 74 72 2c 20 6f 66 66 73 65 74 29  textPtr, offset)
11c20 0a 20 20 20 20 54 6b 54 65 78 74 20 2a 74 65 78  .    TkText *tex
11c30 74 50 74 72 3b 09 09 2f 2a 20 57 69 64 67 65 74  tPtr;../* Widget
11c40 20 74 6f 20 73 63 72 6f 6c 6c 2e 20 2a 2f 0a 20   to scroll. */. 
11c50 20 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 09 09     int offset;..
11c60 09 2f 2a 20 41 6d 6f 75 6e 74 20 62 79 20 77 68  ./* Amount by wh
11c70 69 63 68 20 74 6f 20 73 63 72 6f 6c 6c 2c 20 69  ich to scroll, i
11c80 6e 20 2a 73 63 72 65 65 6e 2a 0a 09 09 09 09 20  n *screen*..... 
11c90 2a 20 6c 69 6e 65 73 2e 20 20 50 6f 73 69 74 69  * lines.  Positi
11ca0 76 65 20 6d 65 61 6e 73 20 74 68 61 74 20 69 6e  ve means that in
11cb0 66 6f 72 6d 61 74 69 6f 6e 0a 09 09 09 09 20 2a  formation..... *
11cc0 20 6c 61 74 65 72 20 69 6e 20 74 65 78 74 20 62   later in text b
11cd0 65 63 6f 6d 65 73 20 76 69 73 69 62 6c 65 2c 20  ecomes visible, 
11ce0 6e 65 67 61 74 69 76 65 0a 09 09 09 09 20 2a 20  negative..... * 
11cf0 6d 65 61 6e 73 20 74 68 61 74 20 69 6e 66 6f 72  means that infor
11d00 6d 61 74 69 6f 6e 20 65 61 72 6c 69 65 72 20 69  mation earlier i
11d10 6e 20 74 68 65 0a 09 09 09 09 20 2a 20 74 65 78  n the..... * tex
11d20 74 20 62 65 63 6f 6d 65 73 20 76 69 73 69 62 6c  t becomes visibl
11d30 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20  e. */.{.    int 
11d40 69 2c 20 63 68 61 72 73 54 6f 43 6f 75 6e 74 2c  i, charsToCount,
11d50 20 6c 69 6e 65 4e 75 6d 3b 0a 20 20 20 20 54 6b   lineNum;.    Tk
11d60 54 65 78 74 49 6e 64 65 78 20 6e 65 77 2c 20 69  TextIndex new, i
11d70 6e 64 65 78 3b 0a 20 20 20 20 54 6b 54 65 78 74  ndex;.    TkText
11d80 4c 69 6e 65 20 2a 6c 61 73 74 4c 69 6e 65 50 74  Line *lastLinePt
11d90 72 3b 0a 20 20 20 20 44 49 6e 66 6f 20 2a 64 49  r;.    DInfo *dI
11da0 6e 66 6f 50 74 72 20 3d 20 74 65 78 74 50 74 72  nfoPtr = textPtr
11db0 2d 3e 64 49 6e 66 6f 50 74 72 3b 0a 20 20 20 20  ->dInfoPtr;.    
11dc0 44 4c 69 6e 65 20 2a 64 6c 50 74 72 2c 20 2a 6c  DLine *dlPtr, *l
11dd0 6f 77 65 73 74 50 74 72 3b 0a 0a 20 20 20 20 69  owestPtr;..    i
11de0 66 20 28 6f 66 66 73 65 74 20 3c 20 30 29 20 7b  f (offset < 0) {
11df0 0a 09 2f 2a 0a 09 20 2a 20 4d 75 73 74 20 73 63  ../*.. * Must sc
11e00 72 6f 6c 6c 20 75 70 20 28 74 6f 20 73 68 6f 77  roll up (to show
11e10 20 65 61 72 6c 69 65 72 20 69 6e 66 6f 72 6d 61   earlier informa
11e20 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 65 78 74  tion in the text
11e30 29 2e 0a 09 20 2a 20 54 68 65 20 63 6f 64 65 20  )... * The code 
11e40 62 65 6c 6f 77 20 69 73 20 73 69 6d 69 6c 61 72  below is similar
11e50 20 74 6f 20 74 68 61 74 20 69 6e 20 4d 65 61 73   to that in Meas
11e60 75 72 65 55 70 2c 20 65 78 63 65 70 74 20 74 68  ureUp, except th
11e70 61 74 0a 09 20 2a 20 69 74 20 63 6f 75 6e 74 73  at.. * it counts
11e80 20 6c 69 6e 65 73 20 69 6e 73 74 65 61 64 20 6f   lines instead o
11e90 66 20 70 69 78 65 6c 73 2e 0a 09 20 2a 2f 0a 0a  f pixels... */..
11ea0 09 63 68 61 72 73 54 6f 43 6f 75 6e 74 20 3d 20  .charsToCount = 
11eb0 74 65 78 74 50 74 72 2d 3e 74 6f 70 49 6e 64 65  textPtr->topInde
11ec0 78 2e 63 68 61 72 49 6e 64 65 78 20 2b 20 31 3b  x.charIndex + 1;
11ed0 0a 09 69 6e 64 65 78 2e 74 72 65 65 20 3d 20 74  ..index.tree = t
11ee0 65 78 74 50 74 72 2d 3e 74 72 65 65 3b 0a 09 6f  extPtr->tree;..o
11ef0 66 66 73 65 74 2d 2d 3b 09 09 09 2f 2a 20 53 6b  ffset--;.../* Sk
11f00 69 70 20 6c 69 6e 65 20 63 6f 6e 74 61 69 6e 69  ip line containi
11f10 6e 67 20 74 6f 70 49 6e 64 65 78 2e 20 2a 2f 0a  ng topIndex. */.
11f20 09 66 6f 72 20 28 6c 69 6e 65 4e 75 6d 20 3d 20  .for (lineNum = 
11f30 54 6b 42 54 72 65 65 4c 69 6e 65 49 6e 64 65 78  TkBTreeLineIndex
11f40 28 74 65 78 74 50 74 72 2d 3e 74 6f 70 49 6e 64  (textPtr->topInd
11f50 65 78 2e 6c 69 6e 65 50 74 72 29 3b 0a 09 09 6c  ex.linePtr);...l
11f60 69 6e 65 4e 75 6d 20 3e 3d 20 30 3b 20 6c 69 6e  ineNum >= 0; lin
11f70 65 4e 75 6d 2d 2d 29 20 7b 0a 09 20 20 20 20 69  eNum--) {..    i
11f80 6e 64 65 78 2e 6c 69 6e 65 50 74 72 20 3d 20 54  ndex.linePtr = T
11f90 6b 42 54 72 65 65 46 69 6e 64 4c 69 6e 65 28 74  kBTreeFindLine(t
11fa0 65 78 74 50 74 72 2d 3e 74 72 65 65 2c 20 6c 69  extPtr->tree, li
11fb0 6e 65 4e 75 6d 29 3b 0a 09 20 20 20 20 69 6e 64  neNum);..    ind
11fc0 65 78 2e 63 68 61 72 49 6e 64 65 78 20 3d 20 30  ex.charIndex = 0
11fd0 3b 0a 09 20 20 20 20 6c 6f 77 65 73 74 50 74 72  ;..    lowestPtr
11fe0 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 64 6f   = NULL;..    do
11ff0 20 7b 0a 09 09 64 6c 50 74 72 20 3d 20 4c 61 79   {...dlPtr = Lay
12000 6f 75 74 44 4c 69 6e 65 28 74 65 78 74 50 74 72  outDLine(textPtr
12010 2c 20 26 69 6e 64 65 78 29 3b 0a 09 09 64 6c 50  , &index);...dlP
12020 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20 6c 6f  tr->nextPtr = lo
12030 77 65 73 74 50 74 72 3b 0a 09 09 6c 6f 77 65 73  westPtr;...lowes
12040 74 50 74 72 20 3d 20 64 6c 50 74 72 3b 0a 09 09  tPtr = dlPtr;...
12050 54 6b 54 65 78 74 49 6e 64 65 78 46 6f 72 77 43  TkTextIndexForwC
12060 68 61 72 73 28 26 69 6e 64 65 78 2c 20 64 6c 50  hars(&index, dlP
12070 74 72 2d 3e 63 6f 75 6e 74 2c 20 26 69 6e 64 65  tr->count, &inde
12080 78 29 3b 0a 09 09 63 68 61 72 73 54 6f 43 6f 75  x);...charsToCou
12090 6e 74 20 2d 3d 20 64 6c 50 74 72 2d 3e 63 6f 75  nt -= dlPtr->cou
120a0 6e 74 3b 0a 09 20 20 20 20 7d 20 77 68 69 6c 65  nt;..    } while
120b0 20 28 28 63 68 61 72 73 54 6f 43 6f 75 6e 74 20   ((charsToCount 
120c0 3e 20 30 29 0a 09 09 20 20 20 20 26 26 20 28 69  > 0)...    && (i
120d0 6e 64 65 78 2e 6c 69 6e 65 50 74 72 20 3d 3d 20  ndex.linePtr == 
120e0 64 6c 50 74 72 2d 3e 69 6e 64 65 78 2e 6c 69 6e  dlPtr->index.lin
120f0 65 50 74 72 29 29 3b 0a 0a 09 20 20 20 20 66 6f  ePtr));...    fo
12100 72 20 28 64 6c 50 74 72 20 3d 20 6c 6f 77 65 73  r (dlPtr = lowes
12110 74 50 74 72 3b 20 64 6c 50 74 72 20 21 3d 20 4e  tPtr; dlPtr != N
12120 55 4c 4c 3b 20 64 6c 50 74 72 20 3d 20 64 6c 50  ULL; dlPtr = dlP
12130 74 72 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09  tr->nextPtr) {..
12140 09 6f 66 66 73 65 74 2b 2b 3b 0a 09 09 69 66 20  .offset++;...if 
12150 28 6f 66 66 73 65 74 20 3d 3d 20 30 29 20 7b 0a  (offset == 0) {.
12160 09 09 20 20 20 20 74 65 78 74 50 74 72 2d 3e 74  ..    textPtr->t
12170 6f 70 49 6e 64 65 78 20 3d 20 64 6c 50 74 72 2d  opIndex = dlPtr-
12180 3e 69 6e 64 65 78 3b 0a 09 09 20 20 20 20 62 72  >index;...    br
12190 65 61 6b 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a  eak;...}..    }.
121a0 20 20 20 20 0a 09 20 20 20 20 2f 2a 0a 09 20 20      ..    /*..  
121b0 20 20 20 2a 20 44 69 73 63 61 72 64 20 74 68 65     * Discard the
121c0 20 64 69 73 70 6c 61 79 20 6c 69 6e 65 73 2c 20   display lines, 
121d0 74 68 65 6e 20 65 69 74 68 65 72 20 72 65 74 75  then either retu
121e0 72 6e 20 6f 72 20 70 72 65 70 61 72 65 0a 09 20  rn or prepare.. 
121f0 20 20 20 20 2a 20 66 6f 72 20 74 68 65 20 6e 65      * for the ne
12200 78 74 20 64 69 73 70 6c 61 79 20 6c 69 6e 65 20  xt display line 
12210 74 6f 20 6c 61 79 20 6f 75 74 2e 0a 09 20 20 20  to lay out...   
12220 20 20 2a 2f 0a 20 20 20 20 0a 09 20 20 20 20 46    */.    ..    F
12230 72 65 65 44 4c 69 6e 65 73 28 74 65 78 74 50 74  reeDLines(textPt
12240 72 2c 20 6c 6f 77 65 73 74 50 74 72 2c 20 28 44  r, lowestPtr, (D
12250 4c 69 6e 65 20 2a 29 20 4e 55 4c 4c 2c 20 30 29  Line *) NULL, 0)
12260 3b 0a 09 20 20 20 20 69 66 20 28 6f 66 66 73 65  ;..    if (offse
12270 74 20 3e 3d 20 30 29 20 7b 0a 09 09 67 6f 74 6f  t >= 0) {...goto
12280 20 73 63 68 65 64 75 6c 65 55 70 64 61 74 65 3b   scheduleUpdate;
12290 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 63 68 61  ..    }..    cha
122a0 72 73 54 6f 43 6f 75 6e 74 20 3d 20 49 4e 54 5f  rsToCount = INT_
122b0 4d 41 58 3b 0a 09 7d 0a 20 20 20 20 0a 09 2f 2a  MAX;..}.    ../*
122c0 0a 09 20 2a 20 52 61 6e 20 6f 66 66 20 74 68 65  .. * Ran off the
122d0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
122e0 65 20 74 65 78 74 2e 20 20 52 65 74 75 72 6e 20  e text.  Return 
122f0 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63  the first charac
12300 74 65 72 0a 09 20 2a 20 69 6e 20 74 68 65 20 74  ter.. * in the t
12310 65 78 74 2e 0a 09 20 2a 2f 0a 0a 09 54 6b 54 65  ext... */...TkTe
12320 78 74 4d 61 6b 65 49 6e 64 65 78 28 74 65 78 74  xtMakeIndex(text
12330 50 74 72 2d 3e 74 72 65 65 2c 20 30 2c 20 30 2c  Ptr->tree, 0, 0,
12340 20 26 74 65 78 74 50 74 72 2d 3e 74 6f 70 49 6e   &textPtr->topIn
12350 64 65 78 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  dex);.    } else
12360 20 7b 0a 09 2f 2a 0a 09 20 2a 20 53 63 72 6f 6c   {../*.. * Scrol
12370 6c 69 6e 67 20 64 6f 77 6e 2c 20 74 6f 20 73 68  ling down, to sh
12380 6f 77 20 6c 61 74 65 72 20 69 6e 66 6f 72 6d 61  ow later informa
12390 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 65 78 74  tion in the text
123a0 2e 0a 09 20 2a 20 4a 75 73 74 20 63 6f 75 6e 74  ... * Just count
123b0 20 6c 69 6e 65 73 20 66 72 6f 6d 20 74 68 65 20   lines from the 
123c0 63 75 72 72 65 6e 74 20 74 6f 70 20 6f 66 20 74  current top of t
123d0 68 65 20 77 69 6e 64 6f 77 2e 0a 09 20 2a 2f 0a  he window... */.
123e0 0a 09 6c 61 73 74 4c 69 6e 65 50 74 72 20 3d 20  ..lastLinePtr = 
123f0 54 6b 42 54 72 65 65 46 69 6e 64 4c 69 6e 65 28  TkBTreeFindLine(
12400 74 65 78 74 50 74 72 2d 3e 74 72 65 65 2c 0a 09  textPtr->tree,..
12410 09 54 6b 42 54 72 65 65 4e 75 6d 4c 69 6e 65 73  .TkBTreeNumLines
12420 28 74 65 78 74 50 74 72 2d 3e 74 72 65 65 29 29  (textPtr->tree))
12430 3b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69  ;..for (i = 0; i
12440 20 3c 20 6f 66 66 73 65 74 3b 20 69 2b 2b 29 20   < offset; i++) 
12450 7b 0a 09 20 20 20 20 64 6c 50 74 72 20 3d 20 4c  {..    dlPtr = L
12460 61 79 6f 75 74 44 4c 69 6e 65 28 74 65 78 74 50  ayoutDLine(textP
12470 74 72 2c 20 26 74 65 78 74 50 74 72 2d 3e 74 6f  tr, &textPtr->to
12480 70 49 6e 64 65 78 29 3b 0a 09 20 20 20 20 64 6c  pIndex);..    dl
12490 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20 4e  Ptr->nextPtr = N
124a0 55 4c 4c 3b 0a 09 20 20 20 20 54 6b 54 65 78 74  ULL;..    TkText
124b0 49 6e 64 65 78 46 6f 72 77 43 68 61 72 73 28 26  IndexForwChars(&
124c0 74 65 78 74 50 74 72 2d 3e 74 6f 70 49 6e 64 65  textPtr->topInde
124d0 78 2c 20 64 6c 50 74 72 2d 3e 63 6f 75 6e 74 2c  x, dlPtr->count,
124e0 20 26 6e 65 77 29 3b 0a 09 20 20 20 20 46 72 65   &new);..    Fre
124f0 65 44 4c 69 6e 65 73 28 74 65 78 74 50 74 72 2c  eDLines(textPtr,
12500 20 64 6c 50 74 72 2c 20 28 44 4c 69 6e 65 20 2a   dlPtr, (DLine *
12510 29 20 4e 55 4c 4c 2c 20 30 29 3b 0a 09 20 20 20  ) NULL, 0);..   
12520 20 69 66 20 28 6e 65 77 2e 6c 69 6e 65 50 74 72   if (new.linePtr
12530 20 3d 3d 20 6c 61 73 74 4c 69 6e 65 50 74 72 29   == lastLinePtr)
12540 20 7b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20   {...break;..   
12550 20 7d 0a 09 20 20 20 20 74 65 78 74 50 74 72 2d   }..    textPtr-
12560 3e 74 6f 70 49 6e 64 65 78 20 3d 20 6e 65 77 3b  >topIndex = new;
12570 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  ..}.    }..    s
12580 63 68 65 64 75 6c 65 55 70 64 61 74 65 3a 0a 20  cheduleUpdate:. 
12590 20 20 20 69 66 20 28 21 28 64 49 6e 66 6f 50 74     if (!(dInfoPt
125a0 72 2d 3e 66 6c 61 67 73 20 26 20 52 45 44 52 41  r->flags & REDRA
125b0 57 5f 50 45 4e 44 49 4e 47 29 29 20 7b 0a 09 54  W_PENDING)) {..T
125c0 63 6c 5f 44 6f 57 68 65 6e 49 64 6c 65 28 44 69  cl_DoWhenIdle(Di
125d0 73 70 6c 61 79 54 65 78 74 2c 20 28 43 6c 69 65  splayText, (Clie
125e0 6e 74 44 61 74 61 29 20 74 65 78 74 50 74 72 29  ntData) textPtr)
125f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 49 6e 66  ;.    }.    dInf
12600 6f 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 52  oPtr->flags |= R
12610 45 44 52 41 57 5f 50 45 4e 44 49 4e 47 7c 44 49  EDRAW_PENDING|DI
12620 4e 46 4f 5f 4f 55 54 5f 4f 46 5f 44 41 54 45 3b  NFO_OUT_OF_DATE;
12630 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
12640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12670 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
12680 6b 54 65 78 74 59 76 69 65 77 43 6d 64 20 2d 2d  kTextYviewCmd --
12690 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
126a0 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
126b0 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
126c0 22 79 76 69 65 77 22 20 6f 70 74 69 6f 6e 20 66  "yview" option f
126d0 6f 72 0a 20 2a 09 74 68 65 20 77 69 64 67 65 74  or. *.the widget
126e0 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 74 65 78   command for tex
126f0 74 20 77 69 64 67 65 74 73 2e 20 53 65 65 20 74  t widgets. See t
12700 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74  he user document
12710 61 74 69 6f 6e 0a 20 2a 09 66 6f 72 20 64 65 74  ation. *.for det
12720 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20  ails on what it 
12730 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  does.. *. * Resu
12740 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
12750 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
12760 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
12770 73 3a 0a 20 2a 09 53 65 65 20 74 68 65 20 75 73  s:. *.See the us
12780 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  er documentation
12790 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
127a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
127b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
127c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
127d0 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54  -----. */..int.T
127e0 6b 54 65 78 74 59 76 69 65 77 43 6d 64 28 74 65  kTextYviewCmd(te
127f0 78 74 50 74 72 2c 20 69 6e 74 65 72 70 2c 20 61  xtPtr, interp, a
12800 72 67 63 2c 20 61 72 67 76 29 0a 20 20 20 20 54  rgc, argv).    T
12810 6b 54 65 78 74 20 2a 74 65 78 74 50 74 72 3b 09  kText *textPtr;.
12820 09 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20  ./* Information 
12830 61 62 6f 75 74 20 74 65 78 74 20 77 69 64 67 65  about text widge
12840 74 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  t. */.    Tcl_In
12850 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 09 09 2f  terp *interp;../
12860 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70  * Current interp
12870 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e  reter. */.    in
12880 74 20 61 72 67 63 3b 09 09 09 2f 2a 20 4e 75 6d  t argc;.../* Num
12890 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
128a0 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a  . */.    char **
128b0 61 72 67 76 3b 09 09 2f 2a 20 41 72 67 75 6d 65  argv;../* Argume
128c0 6e 74 20 73 74 72 69 6e 67 73 2e 20 20 53 6f 6d  nt strings.  Som
128d0 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 61 6c  eone else has al
128e0 72 65 61 64 79 0a 09 09 09 09 20 2a 20 70 61 72  ready..... * par
128f0 73 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  sed this command
12900 20 65 6e 6f 75 67 68 20 74 6f 20 6b 6e 6f 77 20   enough to know 
12910 74 68 61 74 0a 09 09 09 09 20 2a 20 61 72 67 76  that..... * argv
12920 5b 31 5d 20 69 73 20 22 79 76 69 65 77 22 2e 20  [1] is "yview". 
12930 2a 2f 0a 7b 0a 20 20 20 20 44 49 6e 66 6f 20 2a  */.{.    DInfo *
12940 64 49 6e 66 6f 50 74 72 20 3d 20 74 65 78 74 50  dInfoPtr = textP
12950 74 72 2d 3e 64 49 6e 66 6f 50 74 72 3b 0a 20 20  tr->dInfoPtr;.  
12960 20 20 69 6e 74 20 70 69 63 6b 50 6c 61 63 65 2c    int pickPlace,
12970 20 6c 69 6e 65 4e 75 6d 2c 20 74 79 70 65 2c 20   lineNum, type, 
12980 6c 69 6e 65 48 65 69 67 68 74 3b 0a 20 20 20 20  lineHeight;.    
12990 69 6e 74 20 70 69 78 65 6c 73 2c 20 63 6f 75 6e  int pixels, coun
129a0 74 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 73 77  t;.    size_t sw
129b0 69 74 63 68 4c 65 6e 67 74 68 3b 0a 20 20 20 20  itchLength;.    
129c0 64 6f 75 62 6c 65 20 66 72 61 63 74 69 6f 6e 3b  double fraction;
129d0 0a 20 20 20 20 54 6b 54 65 78 74 49 6e 64 65 78  .    TkTextIndex
129e0 20 69 6e 64 65 78 2c 20 6e 65 77 3b 0a 20 20 20   index, new;.   
129f0 20 54 6b 54 65 78 74 4c 69 6e 65 20 2a 6c 61 73   TkTextLine *las
12a00 74 4c 69 6e 65 50 74 72 3b 0a 20 20 20 20 44 4c  tLinePtr;.    DL
12a10 69 6e 65 20 2a 64 6c 50 74 72 3b 0a 0a 20 20 20  ine *dlPtr;..   
12a20 20 69 66 20 28 64 49 6e 66 6f 50 74 72 2d 3e 66   if (dInfoPtr->f
12a30 6c 61 67 73 20 26 20 44 49 4e 46 4f 5f 4f 55 54  lags & DINFO_OUT
12a40 5f 4f 46 5f 44 41 54 45 29 20 7b 0a 09 55 70 64  _OF_DATE) {..Upd
12a50 61 74 65 44 69 73 70 6c 61 79 49 6e 66 6f 28 74  ateDisplayInfo(t
12a60 65 78 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a  extPtr);.    }..
12a70 20 20 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20      if (argc == 
12a80 32 29 20 7b 0a 09 47 65 74 59 56 69 65 77 28 69  2) {..GetYView(i
12a90 6e 74 65 72 70 2c 20 74 65 78 74 50 74 72 2c 20  nterp, textPtr, 
12aa0 30 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  0);..return TCL_
12ab0 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OK;.    }..    /
12ac0 2a 0a 20 20 20 20 20 2a 20 4e 65 78 74 2c 20 68  *.     * Next, h
12ad0 61 6e 64 6c 65 20 74 68 65 20 6f 6c 64 20 73 79  andle the old sy
12ae0 6e 74 61 78 3a 20 22 70 61 74 68 4e 61 6d 65 20  ntax: "pathName 
12af0 79 76 69 65 77 20 3f 2d 70 69 63 6b 70 6c 61 63  yview ?-pickplac
12b00 65 3f 20 77 68 65 72 65 22 0a 20 20 20 20 20 2a  e? where".     *
12b10 2f 0a 0a 20 20 20 20 70 69 63 6b 50 6c 61 63 65  /..    pickPlace
12b20 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 61 72   = 0;.    if (ar
12b30 67 76 5b 32 5d 5b 30 5d 20 3d 3d 20 27 2d 27 29  gv[2][0] == '-')
12b40 20 7b 0a 09 73 77 69 74 63 68 4c 65 6e 67 74 68   {..switchLength
12b50 20 3d 20 73 74 72 6c 65 6e 28 61 72 67 76 5b 32   = strlen(argv[2
12b60 5d 29 3b 0a 09 69 66 20 28 28 73 77 69 74 63 68  ]);..if ((switch
12b70 4c 65 6e 67 74 68 20 3e 3d 20 32 29 0a 09 09 26  Length >= 2)...&
12b80 26 20 28 73 74 72 6e 63 6d 70 28 61 72 67 76 5b  & (strncmp(argv[
12b90 32 5d 2c 20 22 2d 70 69 63 6b 70 6c 61 63 65 22  2], "-pickplace"
12ba0 2c 20 73 77 69 74 63 68 4c 65 6e 67 74 68 29 20  , switchLength) 
12bb0 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 70 69  == 0)) {..    pi
12bc0 63 6b 50 6c 61 63 65 20 3d 20 31 3b 0a 09 20 20  ckPlace = 1;..  
12bd0 20 20 69 66 20 28 61 72 67 63 20 21 3d 20 34 29    if (argc != 4)
12be0 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52   {...Tcl_AppendR
12bf0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
12c00 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
12c10 75 6c 64 20 62 65 20 5c 22 22 2c 0a 09 09 09 61  uld be \"",....a
12c20 72 67 76 5b 30 5d 2c 20 22 20 79 76 69 65 77 20  rgv[0], " yview 
12c30 2d 70 69 63 6b 70 6c 61 63 65 20 6c 69 6e 65 4e  -pickplace lineN
12c40 75 6d 7c 69 6e 64 65 78 5c 22 22 2c 0a 09 09 09  um|index\"",....
12c50 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
12c60 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
12c70 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20  OR;..    }..}.  
12c80 20 20 7d 0a 20 20 20 20 69 66 20 28 28 61 72 67    }.    if ((arg
12c90 63 20 3d 3d 20 33 29 20 7c 7c 20 70 69 63 6b 50  c == 3) || pickP
12ca0 6c 61 63 65 29 20 7b 0a 09 69 66 20 28 54 63 6c  lace) {..if (Tcl
12cb0 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
12cc0 61 72 67 76 5b 32 2b 70 69 63 6b 50 6c 61 63 65  argv[2+pickPlace
12cd0 5d 2c 20 26 6c 69 6e 65 4e 75 6d 29 20 3d 3d 20  ], &lineNum) == 
12ce0 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54  TCL_OK) {..    T
12cf0 6b 54 65 78 74 4d 61 6b 65 49 6e 64 65 78 28 74  kTextMakeIndex(t
12d00 65 78 74 50 74 72 2d 3e 74 72 65 65 2c 20 6c 69  extPtr->tree, li
12d10 6e 65 4e 75 6d 2c 20 30 2c 20 26 69 6e 64 65 78  neNum, 0, &index
12d20 29 3b 0a 09 20 20 20 20 54 6b 54 65 78 74 53 65  );..    TkTextSe
12d30 74 59 56 69 65 77 28 74 65 78 74 50 74 72 2c 20  tYView(textPtr, 
12d40 26 69 6e 64 65 78 2c 20 30 29 3b 0a 09 20 20 20  &index, 0);..   
12d50 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
12d60 09 7d 0a 20 20 20 20 0a 09 2f 2a 0a 09 20 2a 20  .}.    ../*.. * 
12d70 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73  The argument mus
12d80 74 20 62 65 20 61 20 72 65 67 75 6c 61 72 20 74  t be a regular t
12d90 65 78 74 20 69 6e 64 65 78 2e 0a 09 20 2a 2f 0a  ext index... */.
12da0 20 20 20 20 0a 09 54 63 6c 5f 52 65 73 65 74 52      ..Tcl_ResetR
12db0 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09  esult(interp);..
12dc0 69 66 20 28 54 6b 54 65 78 74 47 65 74 49 6e 64  if (TkTextGetInd
12dd0 65 78 28 69 6e 74 65 72 70 2c 20 74 65 78 74 50  ex(interp, textP
12de0 74 72 2c 20 61 72 67 76 5b 32 2b 70 69 63 6b 50  tr, argv[2+pickP
12df0 6c 61 63 65 5d 2c 0a 09 09 26 69 6e 64 65 78 29  lace],...&index)
12e00 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   != TCL_OK) {.. 
12e10 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12e20 52 4f 52 3b 0a 09 7d 0a 09 54 6b 54 65 78 74 53  ROR;..}..TkTextS
12e30 65 74 59 56 69 65 77 28 74 65 78 74 50 74 72 2c  etYView(textPtr,
12e40 20 26 69 6e 64 65 78 2c 20 70 69 63 6b 50 6c 61   &index, pickPla
12e50 63 65 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ce);..return TCL
12e60 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  _OK;.    }..    
12e70 2f 2a 0a 20 20 20 20 20 2a 20 4e 65 77 20 73 79  /*.     * New sy
12e80 6e 74 61 78 3a 20 64 69 73 70 61 74 63 68 20 62  ntax: dispatch b
12e90 61 73 65 64 20 6f 6e 20 61 72 67 76 5b 32 5d 2e  ased on argv[2].
12ea0 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 74 79  .     */..    ty
12eb0 70 65 20 3d 20 54 6b 5f 47 65 74 53 63 72 6f 6c  pe = Tk_GetScrol
12ec0 6c 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 61 72  lInfo(interp, ar
12ed0 67 63 2c 20 61 72 67 76 2c 20 26 66 72 61 63 74  gc, argv, &fract
12ee0 69 6f 6e 2c 20 26 63 6f 75 6e 74 29 3b 0a 20 20  ion, &count);.  
12ef0 20 20 73 77 69 74 63 68 20 28 74 79 70 65 29 20    switch (type) 
12f00 7b 0a 09 63 61 73 65 20 54 4b 5f 53 43 52 4f 4c  {..case TK_SCROL
12f10 4c 5f 45 52 52 4f 52 3a 0a 09 20 20 20 20 72 65  L_ERROR:..    re
12f20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12f30 09 63 61 73 65 20 54 4b 5f 53 43 52 4f 4c 4c 5f  .case TK_SCROLL_
12f40 4d 4f 56 45 54 4f 3a 0a 09 20 20 20 20 69 66 20  MOVETO:..    if 
12f50 28 66 72 61 63 74 69 6f 6e 20 3e 20 31 2e 30 29  (fraction > 1.0)
12f60 20 7b 0a 09 09 66 72 61 63 74 69 6f 6e 20 3d 20   {...fraction = 
12f70 31 2e 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  1.0;..    }..   
12f80 20 69 66 20 28 66 72 61 63 74 69 6f 6e 20 3c 20   if (fraction < 
12f90 30 29 20 7b 0a 09 09 66 72 61 63 74 69 6f 6e 20  0) {...fraction 
12fa0 3d 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  = 0;..    }..   
12fb0 20 66 72 61 63 74 69 6f 6e 20 2a 3d 20 54 6b 42   fraction *= TkB
12fc0 54 72 65 65 4e 75 6d 4c 69 6e 65 73 28 74 65 78  TreeNumLines(tex
12fd0 74 50 74 72 2d 3e 74 72 65 65 29 3b 0a 09 20 20  tPtr->tree);..  
12fe0 20 20 6c 69 6e 65 4e 75 6d 20 3d 20 66 72 61 63    lineNum = frac
12ff0 74 69 6f 6e 3b 0a 09 20 20 20 20 54 6b 54 65 78  tion;..    TkTex
13000 74 4d 61 6b 65 49 6e 64 65 78 28 74 65 78 74 50  tMakeIndex(textP
13010 74 72 2d 3e 74 72 65 65 2c 20 6c 69 6e 65 4e 75  tr->tree, lineNu
13020 6d 2c 20 30 2c 20 26 69 6e 64 65 78 29 3b 0a 09  m, 0, &index);..
13030 20 20 20 20 69 6e 64 65 78 2e 63 68 61 72 49 6e      index.charIn
13040 64 65 78 20 3d 20 54 6b 42 54 72 65 65 43 68 61  dex = TkBTreeCha
13050 72 73 49 6e 4c 69 6e 65 28 69 6e 64 65 78 2e 6c  rsInLine(index.l
13060 69 6e 65 50 74 72 29 0a 09 09 20 20 20 20 2a 20  inePtr)...    * 
13070 28 66 72 61 63 74 69 6f 6e 2d 6c 69 6e 65 4e 75  (fraction-lineNu
13080 6d 29 20 2b 20 30 2e 35 3b 0a 09 20 20 20 20 54  m) + 0.5;..    T
13090 6b 54 65 78 74 53 65 74 59 56 69 65 77 28 74 65  kTextSetYView(te
130a0 78 74 50 74 72 2c 20 26 69 6e 64 65 78 2c 20 30  xtPtr, &index, 0
130b0 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  );..    break;..
130c0 63 61 73 65 20 54 4b 5f 53 43 52 4f 4c 4c 5f 50  case TK_SCROLL_P
130d0 41 47 45 53 3a 0a 09 20 20 20 20 2f 2a 0a 09 20  AGES:..    /*.. 
130e0 20 20 20 20 2a 20 53 63 72 6f 6c 6c 20 75 70 20      * Scroll up 
130f0 6f 72 20 64 6f 77 6e 20 62 79 20 73 63 72 65 65  or down by scree
13100 6e 66 75 6c 73 2e 20 20 41 63 74 75 61 6c 6c 79  nfuls.  Actually
13110 2c 20 75 73 65 20 74 68 65 0a 09 20 20 20 20 20  , use the..     
13120 2a 20 77 69 6e 64 6f 77 20 68 65 69 67 68 74 20  * window height 
13130 6d 69 6e 75 73 20 74 77 6f 20 6c 69 6e 65 73 2c  minus two lines,
13140 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 27 73   so that there's
13150 20 73 6f 6d 65 0a 09 20 20 20 20 20 2a 20 6f 76   some..     * ov
13160 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 61 64  erlap between ad
13170 6a 61 63 65 6e 74 20 70 61 67 65 73 2e 0a 09 20  jacent pages... 
13180 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 6c 69 6e      */...    lin
13190 65 48 65 69 67 68 74 20 3d 20 31 3b 0a 09 20 20  eHeight = 1;..  
131a0 20 20 69 66 20 28 63 6f 75 6e 74 20 3c 20 30 29    if (count < 0)
131b0 20 7b 0a 09 09 70 69 78 65 6c 73 20 3d 20 28 64   {...pixels = (d
131c0 49 6e 66 6f 50 74 72 2d 3e 6d 61 78 59 20 2d 20  InfoPtr->maxY - 
131d0 32 2a 6c 69 6e 65 48 65 69 67 68 74 20 2d 20 64  2*lineHeight - d
131e0 49 6e 66 6f 50 74 72 2d 3e 79 29 2a 28 2d 63 6f  InfoPtr->y)*(-co
131f0 75 6e 74 29 0a 09 09 09 2b 20 6c 69 6e 65 48 65  unt)....+ lineHe
13200 69 67 68 74 3b 0a 09 09 4d 65 61 73 75 72 65 55  ight;...MeasureU
13210 70 28 74 65 78 74 50 74 72 2c 20 26 74 65 78 74  p(textPtr, &text
13220 50 74 72 2d 3e 74 6f 70 49 6e 64 65 78 2c 20 70  Ptr->topIndex, p
13230 69 78 65 6c 73 2c 20 26 6e 65 77 29 3b 0a 09 09  ixels, &new);...
13240 69 66 20 28 54 6b 54 65 78 74 49 6e 64 65 78 43  if (TkTextIndexC
13250 6d 70 28 26 74 65 78 74 50 74 72 2d 3e 74 6f 70  mp(&textPtr->top
13260 49 6e 64 65 78 2c 20 26 6e 65 77 29 20 3d 3d 20  Index, &new) == 
13270 30 29 20 7b 0a 09 09 20 20 20 20 2f 2a 0a 09 09  0) {...    /*...
13280 20 20 20 20 20 2a 20 41 20 70 61 67 65 20 6f 66       * A page of
13290 20 73 63 72 6f 6c 6c 69 6e 67 20 65 6e 64 65 64   scrolling ended
132a0 20 75 70 20 62 65 69 6e 67 20 6c 65 73 73 20 74   up being less t
132b0 68 61 6e 20 6f 6e 65 20 6c 69 6e 65 2e 0a 09 09  han one line....
132c0 20 20 20 20 20 2a 20 53 63 72 6f 6c 6c 20 6f 6e       * Scroll on
132d0 65 20 6c 69 6e 65 20 61 6e 79 77 61 79 2e 0a 09  e line anyway...
132e0 09 20 20 20 20 20 2a 2f 0a 0a 09 09 20 20 20 20  .     */....    
132f0 63 6f 75 6e 74 20 3d 20 2d 31 3b 0a 09 09 20 20  count = -1;...  
13300 20 20 67 6f 74 6f 20 73 63 72 6f 6c 6c 42 79 4c    goto scrollByL
13310 69 6e 65 73 3b 0a 09 09 7d 0a 09 09 74 65 78 74  ines;...}...text
13320 50 74 72 2d 3e 74 6f 70 49 6e 64 65 78 20 3d 20  Ptr->topIndex = 
13330 6e 65 77 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65  new;..    } else
13340 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 53 63 72   {.../*... * Scr
13350 6f 6c 6c 69 6e 67 20 64 6f 77 6e 20 62 79 20 70  olling down by p
13360 61 67 65 73 2e 20 20 4c 61 79 6f 75 74 20 6c 69  ages.  Layout li
13370 6e 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  nes starting at 
13380 74 68 65 0a 09 09 20 2a 20 74 6f 70 20 69 6e 64  the... * top ind
13390 65 78 20 61 6e 64 20 63 6f 75 6e 74 20 74 68 72  ex and count thr
133a0 6f 75 67 68 20 74 68 65 20 64 65 73 69 72 65 64  ough the desired
133b0 20 76 65 72 74 69 63 61 6c 20 64 69 73 74 61 6e   vertical distan
133c0 63 65 2e 0a 09 09 20 2a 2f 0a 0a 09 09 70 69 78  ce.... */....pix
133d0 65 6c 73 20 3d 20 28 64 49 6e 66 6f 50 74 72 2d  els = (dInfoPtr-
133e0 3e 6d 61 78 59 20 2d 20 32 2a 6c 69 6e 65 48 65  >maxY - 2*lineHe
133f0 69 67 68 74 20 2d 20 64 49 6e 66 6f 50 74 72 2d  ight - dInfoPtr-
13400 3e 79 29 2a 63 6f 75 6e 74 3b 0a 09 09 6c 61 73  >y)*count;...las
13410 74 4c 69 6e 65 50 74 72 20 3d 20 54 6b 42 54 72  tLinePtr = TkBTr
13420 65 65 46 69 6e 64 4c 69 6e 65 28 74 65 78 74 50  eeFindLine(textP
13430 74 72 2d 3e 74 72 65 65 2c 0a 09 09 09 54 6b 42  tr->tree,....TkB
13440 54 72 65 65 4e 75 6d 4c 69 6e 65 73 28 74 65 78  TreeNumLines(tex
13450 74 50 74 72 2d 3e 74 72 65 65 29 29 3b 0a 09 09  tPtr->tree));...
13460 64 6f 20 7b 0a 09 09 20 20 20 20 64 6c 50 74 72  do {...    dlPtr
13470 20 3d 20 4c 61 79 6f 75 74 44 4c 69 6e 65 28 74   = LayoutDLine(t
13480 65 78 74 50 74 72 2c 20 26 74 65 78 74 50 74 72  extPtr, &textPtr
13490 2d 3e 74 6f 70 49 6e 64 65 78 29 3b 0a 09 09 20  ->topIndex);... 
134a0 20 20 20 64 6c 50 74 72 2d 3e 6e 65 78 74 50 74     dlPtr->nextPt
134b0 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 20 20 20 20  r = NULL;...    
134c0 54 6b 54 65 78 74 49 6e 64 65 78 46 6f 72 77 43  TkTextIndexForwC
134d0 68 61 72 73 28 26 74 65 78 74 50 74 72 2d 3e 74  hars(&textPtr->t
134e0 6f 70 49 6e 64 65 78 2c 20 64 6c 50 74 72 2d 3e  opIndex, dlPtr->
134f0 63 6f 75 6e 74 2c 0a 09 09 09 20 20 20 20 26 6e  count,....    &n
13500 65 77 29 3b 0a 09 09 20 20 20 20 70 69 78 65 6c  ew);...    pixel
13510 73 20 2d 3d 20 64 6c 50 74 72 2d 3e 68 65 69 67  s -= dlPtr->heig
13520 68 74 3b 0a 09 09 20 20 20 20 46 72 65 65 44 4c  ht;...    FreeDL
13530 69 6e 65 73 28 74 65 78 74 50 74 72 2c 20 64 6c  ines(textPtr, dl
13540 50 74 72 2c 20 28 44 4c 69 6e 65 20 2a 29 20 4e  Ptr, (DLine *) N
13550 55 4c 4c 2c 20 30 29 3b 0a 09 09 20 20 20 20 69  ULL, 0);...    i
13560 66 20 28 6e 65 77 2e 6c 69 6e 65 50 74 72 20 3d  f (new.linePtr =
13570 3d 20 6c 61 73 74 4c 69 6e 65 50 74 72 29 20 7b  = lastLinePtr) {
13580 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 20 20 20  ....break;...   
13590 20 7d 0a 09 09 20 20 20 20 74 65 78 74 50 74 72   }...    textPtr
135a0 2d 3e 74 6f 70 49 6e 64 65 78 20 3d 20 6e 65 77  ->topIndex = new
135b0 3b 0a 09 09 7d 20 77 68 69 6c 65 20 28 70 69 78  ;...} while (pix
135c0 65 6c 73 20 3e 20 30 29 3b 0a 09 20 20 20 20 7d  els > 0);..    }
135d0 0a 09 20 20 20 20 69 66 20 28 21 28 64 49 6e 66  ..    if (!(dInf
135e0 6f 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 52 45  oPtr->flags & RE
135f0 44 52 41 57 5f 50 45 4e 44 49 4e 47 29 29 20 7b  DRAW_PENDING)) {
13600 0a 09 09 54 63 6c 5f 44 6f 57 68 65 6e 49 64 6c  ...Tcl_DoWhenIdl
13610 65 28 44 69 73 70 6c 61 79 54 65 78 74 2c 20 28  e(DisplayText, (
13620 43 6c 69 65 6e 74 44 61 74 61 29 20 74 65 78 74  ClientData) text
13630 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20  Ptr);..    }..  
13640 20 20 64 49 6e 66 6f 50 74 72 2d 3e 66 6c 61 67    dInfoPtr->flag
13650 73 20 7c 3d 20 52 45 44 52 41 57 5f 50 45 4e 44  s |= REDRAW_PEND
13660 49 4e 47 7c 44 49 4e 46 4f 5f 4f 55 54 5f 4f 46  ING|DINFO_OUT_OF
13670 5f 44 41 54 45 3b 0a 09 20 20 20 20 62 72 65 61  _DATE;..    brea
13680 6b 3b 0a 09 63 61 73 65 20 54 4b 5f 53 43 52 4f  k;..case TK_SCRO
13690 4c 4c 5f 55 4e 49 54 53 3a 0a 09 20 20 20 20 73  LL_UNITS:..    s
136a0 63 72 6f 6c 6c 42 79 4c 69 6e 65 73 3a 0a 09 20  crollByLines:.. 
136b0 20 20 20 53 63 72 6f 6c 6c 42 79 4c 69 6e 65 73     ScrollByLines
136c0 28 74 65 78 74 50 74 72 2c 20 63 6f 75 6e 74 29  (textPtr, count)
136d0 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;..    break;.  
136e0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54    }.    return T
136f0 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
13700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13740 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 47 65 74  ------. *. * Get
13750 58 56 69 65 77 20 2d 2d 0a 20 2a 0a 20 2a 09 54  XView --. *. *.T
13760 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6f  his procedure co
13770 6d 70 75 74 65 73 20 74 68 65 20 66 72 61 63 74  mputes the fract
13780 69 6f 6e 73 20 74 68 61 74 20 69 6e 64 69 63 61  ions that indica
13790 74 65 20 77 68 61 74 27 73 0a 20 2a 09 76 69 73  te what's. *.vis
137a0 69 62 6c 65 20 69 6e 20 61 20 74 65 78 74 20 77  ible in a text w
137b0 69 6e 64 6f 77 20 61 6e 64 2c 20 6f 70 74 69 6f  indow and, optio
137c0 6e 61 6c 6c 79 2c 20 65 76 61 6c 75 61 74 65 73  nally, evaluates
137d0 20 61 0a 20 2a 09 54 63 6c 20 73 63 72 69 70 74   a. *.Tcl script
137e0 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 6d 20   to report them 
137f0 74 6f 20 74 68 65 20 74 65 78 74 27 73 20 61 73  to the text's as
13800 73 6f 63 69 61 74 65 64 20 73 63 72 6f 6c 6c 62  sociated scrollb
13810 61 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ar.. *. * Result
13820 73 3a 0a 20 2a 09 49 66 20 72 65 70 6f 72 74 20  s:. *.If report 
13830 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e  is zero, then in
13840 74 65 72 70 2d 3e 72 65 73 75 6c 74 20 69 73 20  terp->result is 
13850 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 0a 20  filled in with. 
13860 2a 09 74 77 6f 20 72 65 61 6c 20 6e 75 6d 62 65  *.two real numbe
13870 72 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  rs separated by 
13880 61 20 73 70 61 63 65 2c 20 67 69 76 69 6e 67 20  a space, giving 
13890 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6f 66 0a  the position of.
138a0 20 2a 09 74 68 65 20 6c 65 66 74 20 61 6e 64 20   *.the left and 
138b0 72 69 67 68 74 20 65 64 67 65 73 20 6f 66 20 74  right edges of t
138c0 68 65 20 77 69 6e 64 6f 77 20 61 73 20 66 72 61  he window as fra
138d0 63 74 69 6f 6e 73 20 66 72 6f 6d 20 30 20 74 6f  ctions from 0 to
138e0 0a 20 2a 09 31 2c 20 77 68 65 72 65 20 30 20 6d  . *.1, where 0 m
138f0 65 61 6e 73 20 74 68 65 20 6c 65 66 74 20 65 64  eans the left ed
13900 67 65 20 6f 66 20 74 68 65 20 74 65 78 74 20 61  ge of the text a
13910 6e 64 20 31 20 6d 65 61 6e 73 20 74 68 65 20 72  nd 1 means the r
13920 69 67 68 74 0a 20 2a 09 65 64 67 65 2e 20 20 49  ight. *.edge.  I
13930 66 20 72 65 70 6f 72 74 20 69 73 20 6e 6f 6e 2d  f report is non-
13940 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 74 65 72  zero, then inter
13950 70 2d 3e 72 65 73 75 6c 74 20 69 73 6e 27 74 20  p->result isn't 
13960 6d 6f 64 69 66 69 65 64 0a 20 2a 09 64 69 72 65  modified. *.dire
13970 63 74 6c 79 2c 20 62 75 74 20 69 6e 73 74 65 61  ctly, but instea
13980 64 20 61 20 73 63 72 69 70 74 20 69 73 20 65 76  d a script is ev
13990 61 6c 75 61 74 65 64 20 69 6e 20 69 6e 74 65 72  aluated in inter
139a0 70 20 74 6f 20 72 65 70 6f 72 74 0a 20 2a 09 74  p to report. *.t
139b0 68 65 20 6e 65 77 20 68 6f 72 69 7a 6f 6e 74 61  he new horizonta
139c0 6c 20 73 63 72 6f 6c 6c 20 70 6f 73 69 74 69 6f  l scroll positio
139d0 6e 20 74 6f 20 74 68 65 20 73 63 72 6f 6c 6c 62  n to the scrollb
139e0 61 72 20 28 69 66 20 74 68 65 20 73 63 72 6f 6c  ar (if the scrol
139f0 6c 0a 20 2a 09 70 6f 73 69 74 69 6f 6e 20 68 61  l. *.position ha
13a00 73 6e 27 74 20 63 68 61 6e 67 65 64 20 74 68 65  sn't changed the
13a10 6e 20 6e 6f 20 73 63 72 69 70 74 20 69 73 20 69  n no script is i
13a20 6e 76 6f 6b 65 64 29 2e 0a 20 2a 0a 20 2a 20 53  nvoked).. *. * S
13a30 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
13a40 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
13a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a90 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  -. */..static vo
13aa0 69 64 0a 47 65 74 58 56 69 65 77 28 69 6e 74 65  id.GetXView(inte
13ab0 72 70 2c 20 74 65 78 74 50 74 72 2c 20 72 65 70  rp, textPtr, rep
13ac0 6f 72 74 29 0a 20 20 20 20 54 63 6c 5f 49 6e 74  ort).    Tcl_Int
13ad0 65 72 70 20 2a 69 6e 74 65 72 70 3b 09 09 09 2f  erp *interp;.../
13ae0 2a 20 49 66 20 22 72 65 70 6f 72 74 22 20 69 73  * If "report" is
13af0 20 46 41 4c 53 45 2c 20 73 74 72 69 6e 67 0a 09   FALSE, string..
13b00 09 09 09 09 20 2a 20 64 65 73 63 72 69 62 69 6e  .... * describin
13b10 67 20 76 69 73 69 62 6c 65 20 72 61 6e 67 65 20  g visible range 
13b20 67 65 74 73 0a 09 09 09 09 09 20 2a 20 73 74 6f  gets...... * sto
13b30 72 65 64 20 69 6e 20 69 6e 74 65 72 70 2d 3e 72  red in interp->r
13b40 65 73 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 54 6b  esult. */.    Tk
13b50 54 65 78 74 20 2a 74 65 78 74 50 74 72 3b 09 09  Text *textPtr;..
13b60 09 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20  ./* Information 
13b70 61 62 6f 75 74 20 74 65 78 74 20 77 69 64 67 65  about text widge
13b80 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  t. */.    int re
13b90 70 6f 72 74 3b 09 09 09 09 2f 2a 20 4e 6f 6e 2d  port;..../* Non-
13ba0 7a 65 72 6f 20 6d 65 61 6e 73 20 72 65 70 6f 72  zero means repor
13bb0 74 20 69 6e 66 6f 20 74 6f 0a 09 09 09 09 09 20  t info to...... 
13bc0 2a 20 73 63 72 6f 6c 6c 62 61 72 20 69 66 20 69  * scrollbar if i
13bd0 74 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 2a  t has changed. *
13be0 2f 0a 7b 0a 20 20 20 20 44 49 6e 66 6f 20 2a 64  /.{.    DInfo *d
13bf0 49 6e 66 6f 50 74 72 20 3d 20 74 65 78 74 50 74  InfoPtr = textPt
13c00 72 2d 3e 64 49 6e 66 6f 50 74 72 3b 0a 20 20 20  r->dInfoPtr;.   
13c10 20 63 68 61 72 20 62 75 66 66 65 72 5b 32 30 30   char buffer[200
13c20 5d 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 66 69  ];.    double fi
13c30 72 73 74 2c 20 6c 61 73 74 3b 0a 20 20 20 20 69  rst, last;.    i
13c40 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 69 66  nt code;..    if
13c50 20 28 64 49 6e 66 6f 50 74 72 2d 3e 6d 61 78 4c   (dInfoPtr->maxL
13c60 65 6e 67 74 68 20 3e 20 30 29 20 7b 0a 09 66 69  ength > 0) {..fi
13c70 72 73 74 20 3d 20 28 28 64 6f 75 62 6c 65 29 20  rst = ((double) 
13c80 64 49 6e 66 6f 50 74 72 2d 3e 63 75 72 50 69 78  dInfoPtr->curPix
13c90 65 6c 4f 66 66 73 65 74 29 0a 09 09 2f 20 64 49  elOffset).../ dI
13ca0 6e 66 6f 50 74 72 2d 3e 6d 61 78 4c 65 6e 67 74  nfoPtr->maxLengt
13cb0 68 3b 0a 09 6c 61 73 74 20 3d 20 66 69 72 73 74  h;..last = first
13cc0 20 2b 20 28 28 64 6f 75 62 6c 65 29 20 28 64 49   + ((double) (dI
13cd0 6e 66 6f 50 74 72 2d 3e 6d 61 78 58 20 2d 20 64  nfoPtr->maxX - d
13ce0 49 6e 66 6f 50 74 72 2d 3e 78 29 29 0a 09 09 2f  InfoPtr->x)).../
13cf0 20 64 49 6e 66 6f 50 74 72 2d 3e 6d 61 78 4c 65   dInfoPtr->maxLe
13d00 6e 67 74 68 3b 0a 09 69 66 20 28 6c 61 73 74 20  ngth;..if (last 
13d10 3e 20 31 2e 30 29 20 7b 0a 09 20 20 20 20 6c 61  > 1.0) {..    la
13d20 73 74 20 3d 20 31 2e 30 3b 0a 09 7d 0a 20 20 20  st = 1.0;..}.   
13d30 20 7d 20 65 6c 73 65 20 7b 0a 09 66 69 72 73 74   } else {..first
13d40 20 3d 20 30 3b 0a 09 6c 61 73 74 20 3d 20 31 2e   = 0;..last = 1.
13d50 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  0;.    }.    if 
13d60 28 21 72 65 70 6f 72 74 29 20 7b 0a 09 63 68 61  (!report) {..cha
13d70 72 20 62 75 66 66 65 72 5b 36 30 5d 3b 0a 09 73  r buffer[60];..s
13d80 70 72 69 6e 74 66 28 62 75 66 66 65 72 2c 20 22  printf(buffer, "
13d90 25 67 20 25 67 22 2c 20 66 69 72 73 74 2c 20 6c  %g %g", first, l
13da0 61 73 74 29 3b 0a 09 54 63 6c 5f 53 65 74 52 65  ast);..Tcl_SetRe
13db0 73 75 6c 74 28 69 6e 74 65 72 70 2c 62 75 66 66  sult(interp,buff
13dc0 65 72 2c 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  er,TCL_VOLATILE)
13dd0 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d  ;..return;.    }
13de0 0a 20 20 20 20 69 66 20 28 28 66 69 72 73 74 20  .    if ((first 
13df0 3d 3d 20 64 49 6e 66 6f 50 74 72 2d 3e 78 53 63  == dInfoPtr->xSc
13e00 72 6f 6c 6c 46 69 72 73 74 29 20 26 26 20 28 6c  rollFirst) && (l
13e10 61 73 74 20 3d 3d 20 64 49 6e 66 6f 50 74 72 2d  ast == dInfoPtr-
13e20 3e 78 53 63 72 6f 6c 6c 4c 61 73 74 29 29 20 7b  >xScrollLast)) {
13e30 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  ..return;.    }.
13e40 20 20 20 20 64 49 6e 66 6f 50 74 72 2d 3e 78 53      dInfoPtr->xS
13e50 63 72 6f 6c 6c 46 69 72 73 74 20 3d 20 66 69 72  crollFirst = fir
13e60 73 74 3b 0a 20 20 20 20 64 49 6e 66 6f 50 74 72  st;.    dInfoPtr
13e70 2d 3e 78 53 63 72 6f 6c 6c 4c 61 73 74 20 3d 20  ->xScrollLast = 
13e80 6c 61 73 74 3b 0a 20 20 20 20 73 70 72 69 6e 74  last;.    sprint
13e90 66 28 62 75 66 66 65 72 2c 20 22 20 25 67 20 25  f(buffer, " %g %
13ea0 67 22 2c 20 66 69 72 73 74 2c 20 6c 61 73 74 29  g", first, last)
13eb0 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c  ;.    code = Tcl
13ec0 5f 56 61 72 45 76 61 6c 28 69 6e 74 65 72 70 2c  _VarEval(interp,
13ed0 20 74 65 78 74 50 74 72 2d 3e 78 53 63 72 6f 6c   textPtr->xScrol
13ee0 6c 43 6d 64 2c 0a 09 20 20 20 20 62 75 66 66 65  lCmd,..    buffe
13ef0 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  r, (char *) NULL
13f00 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20  );.    if (code 
13f10 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63  != TCL_OK) {..Tc
13f20 6c 5f 41 64 64 45 72 72 6f 72 49 6e 66 6f 28 69  l_AddErrorInfo(i
13f30 6e 74 65 72 70 2c 0a 09 09 22 5c 6e 20 20 20 20  nterp,..."\n    
13f40 28 68 6f 72 69 7a 6f 6e 74 61 6c 20 73 63 72 6f  (horizontal scro
13f50 6c 6c 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 65 78  lling command ex
13f60 65 63 75 74 65 64 20 62 79 20 74 65 78 74 29 22  ecuted by text)"
13f70 29 3b 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75  );..Tcl_Backgrou
13f80 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b  ndError(interp);
13f90 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  .    }.}.../*. *
13fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fe0 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 47 65 74  ------. *. * Get
13ff0 59 56 69 65 77 20 2d 2d 0a 20 2a 0a 20 2a 09 54  YView --. *. *.T
14000 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6f  his procedure co
14010 6d 70 75 74 65 73 20 74 68 65 20 66 72 61 63 74  mputes the fract
14020 69 6f 6e 73 20 74 68 61 74 20 69 6e 64 69 63 61  ions that indica
14030 74 65 20 77 68 61 74 27 73 0a 20 2a 09 76 69 73  te what's. *.vis
14040 69 62 6c 65 20 69 6e 20 61 20 74 65 78 74 20 77  ible in a text w
14050 69 6e 64 6f 77 20 61 6e 64 2c 20 6f 70 74 69 6f  indow and, optio
14060 6e 61 6c 6c 79 2c 20 65 76 61 6c 75 61 74 65 73  nally, evaluates
14070 20 61 0a 20 2a 09 54 63 6c 20 73 63 72 69 70 74   a. *.Tcl script
14080 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 6d 20   to report them 
14090 74 6f 20 74 68 65 20 74 65 78 74 27 73 20 61 73  to the text's as
140a0 73 6f 63 69 61 74 65 64 20 73 63 72 6f 6c 6c 62  sociated scrollb
140b0 61 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ar.. *. * Result
140c0 73 3a 0a 20 2a 09 49 66 20 72 65 70 6f 72 74 20  s:. *.If report 
140d0 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e  is zero, then in
140e0 74 65 72 70 2d 3e 72 65 73 75 6c 74 20 69 73 20  terp->result is 
140f0 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 0a 20  filled in with. 
14100 2a 09 74 77 6f 20 72 65 61 6c 20 6e 75 6d 62 65  *.two real numbe
14110 72 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  rs separated by 
14120 61 20 73 70 61 63 65 2c 20 67 69 76 69 6e 67 20  a space, giving 
14130 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6f 66 0a  the position of.
14140 20 2a 09 74 68 65 20 74 6f 70 20 61 6e 64 20 62   *.the top and b
14150 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 77 69 6e  ottom of the win
14160 64 6f 77 20 61 73 20 66 72 61 63 74 69 6f 6e 73  dow as fractions
14170 20 66 72 6f 6d 20 30 20 74 6f 20 31 2c 20 77 68   from 0 to 1, wh
14180 65 72 65 0a 20 2a 09 30 20 6d 65 61 6e 73 20 74  ere. *.0 means t
14190 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
141a0 74 68 65 20 74 65 78 74 20 61 6e 64 20 31 20 6d  the text and 1 m
141b0 65 61 6e 73 20 74 68 65 20 65 6e 64 2e 20 20 49  eans the end.  I
141c0 66 0a 20 2a 09 72 65 70 6f 72 74 20 69 73 20 6e  f. *.report is n
141d0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e  on-zero, then in
141e0 74 65 72 70 2d 3e 72 65 73 75 6c 74 20 69 73 6e  terp->result isn
141f0 27 74 20 6d 6f 64 69 66 69 65 64 20 64 69 72 65  't modified dire
14200 63 74 6c 79 2c 0a 20 2a 09 62 75 74 20 61 20 73  ctly,. *.but a s
14210 63 72 69 70 74 20 69 73 20 65 76 61 6c 75 61 74  cript is evaluat
14220 65 64 20 69 6e 20 69 6e 74 65 72 70 20 74 6f 20  ed in interp to 
14230 72 65 70 6f 72 74 20 74 68 65 20 6e 65 77 20 73  report the new s
14240 63 72 6f 6c 6c 0a 20 2a 09 70 6f 73 69 74 69 6f  croll. *.positio
14250 6e 20 74 6f 20 74 68 65 20 73 63 72 6f 6c 6c 62  n to the scrollb
14260 61 72 20 28 69 66 20 74 68 65 20 73 63 72 6f 6c  ar (if the scrol
14270 6c 20 70 6f 73 69 74 69 6f 6e 20 68 61 73 6e 27  l position hasn'
14280 74 20 63 68 61 6e 67 65 64 0a 20 2a 09 74 68 65  t changed. *.the
14290 6e 20 6e 6f 20 73 63 72 69 70 74 20 69 73 20 69  n no script is i
142a0 6e 76 6f 6b 65 64 29 2e 0a 20 2a 0a 20 2a 20 53  nvoked).. *. * S
142b0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
142c0 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
142d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
142e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
142f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14310 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  -. */..static vo
14320 69 64 0a 47 65 74 59 56 69 65 77 28 69 6e 74 65  id.GetYView(inte
14330 72 70 2c 20 74 65 78 74 50 74 72 2c 20 72 65 70  rp, textPtr, rep
14340 6f 72 74 29 0a 20 20 20 20 54 63 6c 5f 49 6e 74  ort).    Tcl_Int
14350 65 72 70 20 2a 69 6e 74 65 72 70 3b 09 09 09 2f  erp *interp;.../
14360 2a 20 49 66 20 22 72 65 70 6f 72 74 22 20 69 73  * If "report" is
14370 20 46 41 4c 53 45 2c 20 73 74 72 69 6e 67 0a 09   FALSE, string..
14380 09 09 09 09 20 2a 20 64 65 73 63 72 69 62 69 6e  .... * describin
14390 67 20 76 69 73 69 62 6c 65 20 72 61 6e 67 65 20  g visible range 
143a0 67 65 74 73 0a 09 09 09 09 09 20 2a 20 73 74 6f  gets...... * sto
143b0 72 65 64 20 69 6e 20 69 6e 74 65 72 70 2d 3e 72  red in interp->r
143c0 65 73 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 54 6b  esult. */.    Tk
143d0 54 65 78 74 20 2a 74 65 78 74 50 74 72 3b 09 09  Text *textPtr;..
143e0 09 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20  ./* Information 
143f0 61 62 6f 75 74 20 74 65 78 74 20 77 69 64 67 65  about text widge
14400 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  t. */.    int re
14410 70 6f 72 74 3b 09 09 09 09 2f 2a 20 4e 6f 6e 2d  port;..../* Non-
14420 7a 65 72 6f 20 6d 65 61 6e 73 20 72 65 70 6f 72  zero means repor
14430 74 20 69 6e 66 6f 20 74 6f 0a 09 09 09 09 09 20  t info to...... 
14440 2a 20 73 63 72 6f 6c 6c 62 61 72 20 69 66 20 69  * scrollbar if i
14450 74 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 2a  t has changed. *
14460 2f 0a 7b 0a 20 20 20 20 44 49 6e 66 6f 20 2a 64  /.{.    DInfo *d
14470 49 6e 66 6f 50 74 72 20 3d 20 74 65 78 74 50 74  InfoPtr = textPt
14480 72 2d 3e 64 49 6e 66 6f 50 74 72 3b 0a 20 20 20  r->dInfoPtr;.   
14490 20 63 68 61 72 20 62 75 66 66 65 72 5b 32 30 30   char buffer[200
144a0 5d 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 66 69  ];.    double fi
144b0 72 73 74 2c 20 6c 61 73 74 3b 0a 20 20 20 20 44  rst, last;.    D
144c0 4c 69 6e 65 20 2a 64 6c 50 74 72 3b 0a 20 20 20  Line *dlPtr;.   
144d0 20 69 6e 74 20 74 6f 74 61 6c 4c 69 6e 65 73 2c   int totalLines,
144e0 20 63 6f 64 65 2c 20 63 6f 75 6e 74 3b 0a 0a 20   code, count;.. 
144f0 20 20 20 64 6c 50 74 72 20 3d 20 64 49 6e 66 6f     dlPtr = dInfo
14500 50 74 72 2d 3e 64 4c 69 6e 65 50 74 72 3b 0a 20  Ptr->dLinePtr;. 
14510 20 20 20 74 6f 74 61 6c 4c 69 6e 65 73 20 3d 20     totalLines = 
14520 54 6b 42 54 72 65 65 4e 75 6d 4c 69 6e 65 73 28  TkBTreeNumLines(
14530 74 65 78 74 50 74 72 2d 3e 74 72 65 65 29 3b 0a  textPtr->tree);.
14540 20 20 20 20 66 69 72 73 74 20 3d 20 28 28 64 6f      first = ((do
14550 75 62 6c 65 29 20 54 6b 42 54 72 65 65 4c 69 6e  uble) TkBTreeLin
14560 65 49 6e 64 65 78 28 64 6c 50 74 72 2d 3e 69 6e  eIndex(dlPtr->in
14570 64 65 78 2e 6c 69 6e 65 50 74 72 29 29 0a 09 20  dex.linePtr)).. 
14580 20 20 20 2b 20 28 28 64 6f 75 62 6c 65 29 20 64     + ((double) d
14590 6c 50 74 72 2d 3e 69 6e 64 65 78 2e 63 68 61 72  lPtr->index.char
145a0 49 6e 64 65 78 29 0a 09 20 20 20 20 2f 20 28 54  Index)..    / (T
145b0 6b 42 54 72 65 65 43 68 61 72 73 49 6e 4c 69 6e  kBTreeCharsInLin
145c0 65 28 64 6c 50 74 72 2d 3e 69 6e 64 65 78 2e 6c  e(dlPtr->index.l
145d0 69 6e 65 50 74 72 29 29 3b 0a 20 20 20 20 66 69  inePtr));.    fi
145e0 72 73 74 20 2f 3d 20 74 6f 74 61 6c 4c 69 6e 65  rst /= totalLine
145f0 73 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 31 29  s;.    while (1)
14600 20 7b 0a 09 69 66 20 28 28 64 6c 50 74 72 2d 3e   {..if ((dlPtr->
14610 79 20 2b 20 64 6c 50 74 72 2d 3e 68 65 69 67 68  y + dlPtr->heigh
14620 74 29 20 3e 20 64 49 6e 66 6f 50 74 72 2d 3e 6d  t) > dInfoPtr->m
14630 61 78 59 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09  axY) {..    /*..
14640 20 20 20 20 20 2a 20 54 68 65 20 6c 61 73 74 20       * The last 
14650 6c 69 6e 65 20 69 73 20 6f 6e 6c 79 20 70 61 72  line is only par
14660 74 69 61 6c 6c 79 20 76 69 73 69 62 6c 65 2c 20  tially visible, 
14670 73 6f 20 64 6f 6e 27 74 0a 09 20 20 20 20 20 2a  so don't..     *
14680 20 63 6f 75 6e 74 20 69 74 73 20 63 68 61 72 61   count its chara
14690 63 74 65 72 73 20 69 6e 20 77 68 61 74 27 73 20  cters in what's 
146a0 76 69 73 69 62 6c 65 2e 0a 09 20 20 20 20 20 2a  visible...     *
146b0 2f 0a 09 20 20 20 20 63 6f 75 6e 74 20 3d 20 30  /..    count = 0
146c0 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d  ;..    break;..}
146d0 0a 09 69 66 20 28 64 6c 50 74 72 2d 3e 6e 65 78  ..if (dlPtr->nex
146e0 74 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tPtr == NULL) {.
146f0 09 20 20 20 20 63 6f 75 6e 74 20 3d 20 64 6c 50  .    count = dlP
14700 74 72 2d 3e 63 6f 75 6e 74 3b 0a 09 20 20 20 20  tr->count;..    
14710 62 72 65 61 6b 3b 0a 09 7d 0a 09 64 6c 50 74 72  break;..}..dlPtr
14720 20 3d 20 64 6c 50 74 72 2d 3e 6e 65 78 74 50 74   = dlPtr->nextPt
14730 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 61 73  r;.    }.    las
14740 74 20 3d 20 28 28 64 6f 75 62 6c 65 29 20 54 6b  t = ((double) Tk
14750 42 54 72 65 65 4c 69 6e 65 49 6e 64 65 78 28 64  BTreeLineIndex(d
14760 6c 50 74 72 2d 3e 69 6e 64 65 78 2e 6c 69 6e 65  lPtr->index.line
14770 50 74 72 29 29 0a 09 20 20 20 20 2b 20 28 28 64  Ptr))..    + ((d
14780 6f 75 62 6c 65 29 20 28 64 6c 50 74 72 2d 3e 69  ouble) (dlPtr->i
14790 6e 64 65 78 2e 63 68 61 72 49 6e 64 65 78 20 2b  ndex.charIndex +
147a0 20 63 6f 75 6e 74 29 29 0a 09 20 20 20 20 2f 20   count))..    / 
147b0 28 54 6b 42 54 72 65 65 43 68 61 72 73 49 6e 4c  (TkBTreeCharsInL
147c0 69 6e 65 28 64 6c 50 74 72 2d 3e 69 6e 64 65 78  ine(dlPtr->index
147d0 2e 6c 69 6e 65 50 74 72 29 29 3b 0a 20 20 20 20  .linePtr));.    
147e0 6c 61 73 74 20 2f 3d 20 74 6f 74 61 6c 4c 69 6e  last /= totalLin
147f0 65 73 3b 0a 20 20 20 20 69 66 20 28 21 72 65 70  es;.    if (!rep
14800 6f 72 74 29 20 7b 0a 09 63 68 61 72 20 62 75 66  ort) {..char buf
14810 66 65 72 5b 36 30 5d 3b 0a 09 73 70 72 69 6e 74  fer[60];..sprint
14820 66 28 62 75 66 66 65 72 2c 20 22 25 67 20 25 67  f(buffer, "%g %g
14830 22 2c 20 66 69 72 73 74 2c 20 6c 61 73 74 29 3b  ", first, last);
14840 0a 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28  ..Tcl_SetResult(
14850 69 6e 74 65 72 70 2c 62 75 66 66 65 72 2c 54 43  interp,buffer,TC
14860 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 09 72 65  L_VOLATILE);..re
14870 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
14880 69 66 20 28 28 66 69 72 73 74 20 3d 3d 20 64 49  if ((first == dI
14890 6e 66 6f 50 74 72 2d 3e 79 53 63 72 6f 6c 6c 46  nfoPtr->yScrollF
148a0 69 72 73 74 29 20 26 26 20 28 6c 61 73 74 20 3d  irst) && (last =
148b0 3d 20 64 49 6e 66 6f 50 74 72 2d 3e 79 53 63 72  = dInfoPtr->yScr
148c0 6f 6c 6c 4c 61 73 74 29 29 20 7b 0a 09 72 65 74  ollLast)) {..ret
148d0 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  urn;.    }.    d
148e0 49 6e 66 6f 50 74 72 2d 3e 79 53 63 72 6f 6c 6c  InfoPtr->yScroll
148f0 46 69 72 73 74 20 3d 20 66 69 72 73 74 3b 0a 20  First = first;. 
14900 20 20 20 64 49 6e 66 6f 50 74 72 2d 3e 79 53 63     dInfoPtr->ySc
14910 72 6f 6c 6c 4c 61 73 74 20 3d 20 6c 61 73 74 3b  rollLast = last;
14920 0a 20 20 20 20 73 70 72 69 6e 74 66 28 62 75 66  .    sprintf(buf
14930 66 65 72 2c 20 22 20 25 67 20 25 67 22 2c 20 66  fer, " %g %g", f
14940 69 72 73 74 2c 20 6c 61 73 74 29 3b 0a 20 20 20  irst, last);.   
14950 20 63 6f 64 65 20 3d 20 54 63 6c 5f 56 61 72 45   code = Tcl_VarE
14960 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 65 78 74  val(interp, text
14970 50 74 72 2d 3e 79 53 63 72 6f 6c 6c 43 6d 64 2c  Ptr->yScrollCmd,
14980 0a 09 20 20 20 20 62 75 66 66 65 72 2c 20 28 63  ..    buffer, (c
14990 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  har *) NULL);.  
149a0 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43    if (code != TC
149b0 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 64 64  L_OK) {..Tcl_Add
149c0 45 72 72 6f 72 49 6e 66 6f 28 69 6e 74 65 72 70  ErrorInfo(interp
149d0 2c 0a 09 09 22 5c 6e 20 20 20 20 28 76 65 72 74  ,..."\n    (vert
149e0 69 63 61 6c 20 73 63 72 6f 6c 6c 69 6e 67 20 63  ical scrolling c
149f0 6f 6d 6d 61 6e 64 20 65 78 65 63 75 74 65 64 20  ommand executed 
14a00 62 79 20 74 65 78 74 29 22 29 3b 0a 09 54 63 6c  by text)");..Tcl
14a10 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
14a20 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a  (interp);.    }.
14a30 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
14a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
14a80 20 2a 0a 20 2a 20 46 69 6e 64 44 4c 69 6e 65 20   *. * FindDLine 
14a90 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
14aa0 6f 63 65 64 75 72 65 20 69 73 20 63 61 6c 6c 65  ocedure is calle
14ab0 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 44 4c  d to find the DL
14ac0 69 6e 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ine correspondin
14ad0 67 20 74 6f 20 61 0a 20 2a 09 67 69 76 65 6e 20  g to a. *.given 
14ae0 74 65 78 74 20 69 6e 64 65 78 2e 0a 20 2a 0a 20  text index.. *. 
14af0 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68  * Results:. *.Th
14b00 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
14b10 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
14b20 68 65 20 66 69 72 73 74 20 44 4c 69 6e 65 20 66  he first DLine f
14b30 6f 75 6e 64 20 69 6e 20 74 68 65 0a 20 2a 09 6c  ound in the. *.l
14b40 69 73 74 20 68 65 61 64 65 64 20 62 79 20 64 6c  ist headed by dl
14b50 50 74 72 20 74 68 61 74 20 64 69 73 70 6c 61 79  Ptr that display
14b60 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 74  s information at
14b70 20 6f 72 20 61 66 74 65 72 20 74 68 65 0a 20 2a   or after the. *
14b80 09 73 70 65 63 69 66 69 65 64 20 70 6f 73 69 74  .specified posit
14b90 69 6f 6e 2e 20 20 49 66 20 74 68 65 72 65 20 69  ion.  If there i
14ba0 73 20 6e 6f 20 73 75 63 68 20 6c 69 6e 65 20 69  s no such line i
14bb0 6e 20 74 68 65 20 6c 69 73 74 20 74 68 65 6e 0a  n the list then.
14bc0 20 2a 09 4e 55 4c 4c 20 69 73 20 72 65 74 75 72   *.NULL is retur
14bd0 6e 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ned.. *. * Side 
14be0 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
14bf0 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
14c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
14c40 2f 0a 0a 73 74 61 74 69 63 20 44 4c 69 6e 65 20  /..static DLine 
14c50 2a 0a 46 69 6e 64 44 4c 69 6e 65 28 64 6c 50 74  *.FindDLine(dlPt
14c60 72 2c 20 69 6e 64 65 78 50 74 72 29 0a 20 20 20  r, indexPtr).   
14c70 20 72 65 67 69 73 74 65 72 20 44 4c 69 6e 65 20   register DLine 
14c80 2a 64 6c 50 74 72 3b 09 2f 2a 20 50 6f 69 6e 74  *dlPtr;./* Point
14c90 65 72 20 74 6f 20 66 69 72 73 74 20 69 6e 20 6c  er to first in l
14ca0 69 73 74 20 6f 66 20 44 4c 69 6e 65 73 0a 09 09  ist of DLines...
14cb0 09 09 20 2a 20 74 6f 20 73 65 61 72 63 68 2e 20  .. * to search. 
14cc0 2a 2f 0a 20 20 20 20 54 6b 54 65 78 74 49 6e 64  */.    TkTextInd
14cd0 65 78 20 2a 69 6e 64 65 78 50 74 72 3b 09 2f 2a  ex *indexPtr;./*
14ce0 20 49 6e 64 65 78 20 6f 66 20 64 65 73 69 72 65   Index of desire
14cf0 64 20 63 68 61 72 61 63 74 65 72 2e 20 2a 2f 0a  d character. */.
14d00 7b 0a 20 20 20 20 54 6b 54 65 78 74 4c 69 6e 65  {.    TkTextLine
14d10 20 2a 6c 69 6e 65 50 74 72 3b 0a 0a 20 20 20 20   *linePtr;..    
14d20 69 66 20 28 64 6c 50 74 72 20 3d 3d 20 4e 55 4c  if (dlPtr == NUL
14d30 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  L) {..return NUL
14d40 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
14d50 28 54 6b 42 54 72 65 65 4c 69 6e 65 49 6e 64 65  (TkBTreeLineInde
14d60 78 28 69 6e 64 65 78 50 74 72 2d 3e 6c 69 6e 65  x(indexPtr->line
14d70 50 74 72 29 0a 09 20 20 20 20 3c 20 54 6b 42 54  Ptr)..    < TkBT
14d80 72 65 65 4c 69 6e 65 49 6e 64 65 78 28 64 6c 50  reeLineIndex(dlP
14d90 74 72 2d 3e 69 6e 64 65 78 2e 6c 69 6e 65 50 74  tr->index.linePt
14da0 72 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 68  r)) {../*.. * Th
14db0 65 20 66 69 72 73 74 20 64 69 73 70 6c 61 79 20  e first display 
14dc0 6c 69 6e 65 20 69 73 20 61 6c 72 65 61 64 79 20  line is already 
14dd0 70 61 73 74 20 74 68 65 20 64 65 73 69 72 65 64  past the desired
14de0 20 6c 69 6e 65 2e 0a 09 20 2a 2f 0a 09 72 65 74   line... */..ret
14df0 75 72 6e 20 64 6c 50 74 72 3b 0a 20 20 20 20 7d  urn dlPtr;.    }
14e00 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
14e10 46 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 64  Find the first d
14e20 69 73 70 6c 61 79 20 6c 69 6e 65 20 74 68 61 74  isplay line that
14e30 20 63 6f 76 65 72 73 20 74 68 65 20 64 65 73 69   covers the desi
14e40 72 65 64 20 74 65 78 74 20 6c 69 6e 65 2e 0a 20  red text line.. 
14e50 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6c 69 6e 65      */..    line
14e60 50 74 72 20 3d 20 64 6c 50 74 72 2d 3e 69 6e 64  Ptr = dlPtr->ind
14e70 65 78 2e 6c 69 6e 65 50 74 72 3b 0a 20 20 20 20  ex.linePtr;.    
14e80 77 68 69 6c 65 20 28 6c 69 6e 65 50 74 72 20 21  while (linePtr !
14e90 3d 20 69 6e 64 65 78 50 74 72 2d 3e 6c 69 6e 65  = indexPtr->line
14ea0 50 74 72 29 20 7b 0a 09 77 68 69 6c 65 20 28 64  Ptr) {..while (d
14eb0 6c 50 74 72 2d 3e 69 6e 64 65 78 2e 6c 69 6e 65  lPtr->index.line
14ec0 50 74 72 20 3d 3d 20 6c 69 6e 65 50 74 72 29 20  Ptr == linePtr) 
14ed0 7b 0a 09 20 20 20 20 64 6c 50 74 72 20 3d 20 64  {..    dlPtr = d
14ee0 6c 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b 0a 09  lPtr->nextPtr;..
14ef0 20 20 20 20 69 66 20 28 64 6c 50 74 72 20 3d 3d      if (dlPtr ==
14f00 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
14f10 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09  n NULL;..    }..
14f20 7d 0a 09 6c 69 6e 65 50 74 72 20 3d 20 54 6b 42  }..linePtr = TkB
14f30 54 72 65 65 4e 65 78 74 4c 69 6e 65 28 6c 69 6e  TreeNextLine(lin
14f40 65 50 74 72 29 3b 0a 09 69 66 20 28 6c 69 6e 65  ePtr);..if (line
14f50 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Ptr == NULL) {..
14f60 20 20 20 20 70 61 6e 69 63 28 22 46 69 6e 64 44      panic("FindD
14f70 4c 69 6e 65 20 72 65 61 63 68 65 64 20 65 6e 64  Line reached end
14f80 20 6f 66 20 74 65 78 74 22 29 3b 0a 09 7d 0a 20   of text");..}. 
14f90 20 20 20 7d 0a 20 20 20 20 69 66 20 28 69 6e 64     }.    if (ind
14fa0 65 78 50 74 72 2d 3e 6c 69 6e 65 50 74 72 20 21  exPtr->linePtr !
14fb0 3d 20 64 6c 50 74 72 2d 3e 69 6e 64 65 78 2e 6c  = dlPtr->index.l
14fc0 69 6e 65 50 74 72 29 20 7b 0a 09 72 65 74 75 72  inePtr) {..retur
14fd0 6e 20 64 6c 50 74 72 3b 0a 20 20 20 20 7d 0a 0a  n dlPtr;.    }..
14fe0 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4e 6f      /*.     * No
14ff0 77 20 67 65 74 20 74 6f 20 74 68 65 20 72 69 67  w get to the rig
15000 68 74 20 70 6f 73 69 74 69 6f 6e 20 77 69 74 68  ht position with
15010 69 6e 20 74 68 65 20 74 65 78 74 20 6c 69 6e 65  in the text line
15020 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 77  ..     */..    w
15030 68 69 6c 65 20 28 69 6e 64 65 78 50 74 72 2d 3e  hile (indexPtr->
15040 63 68 61 72 49 6e 64 65 78 20 3e 3d 20 28 64 6c  charIndex >= (dl
15050 50 74 72 2d 3e 69 6e 64 65 78 2e 63 68 61 72 49  Ptr->index.charI
15060 6e 64 65 78 20 2b 20 64 6c 50 74 72 2d 3e 63 6f  ndex + dlPtr->co
15070 75 6e 74 29 29 20 7b 0a 09 64 6c 50 74 72 20 3d  unt)) {..dlPtr =
15080 20 64 6c 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b   dlPtr->nextPtr;
15090 0a 09 69 66 20 28 28 64 6c 50 74 72 20 3d 3d 20  ..if ((dlPtr == 
150a0 4e 55 4c 4c 29 20 7c 7c 20 28 64 6c 50 74 72 2d  NULL) || (dlPtr-
150b0 3e 69 6e 64 65 78 2e 6c 69 6e 65 50 74 72 20 21  >index.linePtr !
150c0 3d 20 69 6e 64 65 78 50 74 72 2d 3e 6c 69 6e 65  = indexPtr->line
150d0 50 74 72 29 29 20 7b 0a 09 20 20 20 20 62 72 65  Ptr)) {..    bre
150e0 61 6b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20  ak;..}.    }.   
150f0 20 72 65 74 75 72 6e 20 64 6c 50 74 72 3b 0a 7d   return dlPtr;.}
15100 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
15110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
15150 2a 0a 20 2a 20 54 6b 54 65 78 74 50 69 78 65 6c  *. * TkTextPixel
15160 49 6e 64 65 78 20 2d 2d 0a 20 2a 0a 20 2a 09 47  Index --. *. *.G
15170 69 76 65 6e 20 61 6e 20 28 78 2c 79 29 20 63 6f  iven an (x,y) co
15180 6f 72 64 69 6e 61 74 65 20 6f 6e 20 74 68 65 20  ordinate on the 
15190 73 63 72 65 65 6e 2c 20 66 69 6e 64 20 74 68 65  screen, find the
151a0 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 0a 20 2a 09   location of. *.
151b0 74 68 65 20 63 68 61 72 61 63 74 65 72 20 63 6c  the character cl
151c0 6f 73 65 73 74 20 74 6f 20 74 68 61 74 20 6c 6f  osest to that lo
151d0 63 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65  cation.. *. * Re
151e0 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 69 6e  sults:. *.The in
151f0 64 65 78 20 61 74 20 2a 69 6e 64 65 78 50 74 72  dex at *indexPtr
15200 20 69 73 20 6d 6f 64 69 66 69 65 64 20 74 6f 20   is modified to 
15210 72 65 66 65 72 20 74 6f 20 74 68 65 20 63 68 61  refer to the cha
15220 72 61 63 74 65 72 0a 20 2a 09 6f 6e 20 74 68 65  racter. *.on the
15230 20 64 69 73 70 6c 61 79 20 74 68 61 74 20 69 73   display that is
15240 20 63 6c 6f 73 65 73 74 20 74 6f 20 28 78 2c 79   closest to (x,y
15250 29 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ).. *. * Side ef
15260 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  fects:. *.None..
15270 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
15280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
152c0 0a 76 6f 69 64 0a 54 6b 54 65 78 74 50 69 78 65  .void.TkTextPixe
152d0 6c 49 6e 64 65 78 28 74 65 78 74 50 74 72 2c 20  lIndex(textPtr, 
152e0 78 2c 20 79 2c 20 69 6e 64 65 78 50 74 72 29 0a  x, y, indexPtr).
152f0 20 20 20 20 54 6b 54 65 78 74 20 2a 74 65 78 74      TkText *text
15300 50 74 72 3b 09 09 2f 2a 20 57 69 64 67 65 74 20  Ptr;../* Widget 
15310 72 65 63 6f 72 64 20 66 6f 72 20 74 65 78 74 20  record for text 
15320 77 69 64 67 65 74 2e 20 2a 2f 0a 20 20 20 20 69  widget. */.    i
15330 6e 74 20 78 2c 20 79 3b 09 09 09 2f 2a 20 50 69  nt x, y;.../* Pi
15340 78 65 6c 20 63 6f 6f 72 64 69 6e 61 74 65 73 20  xel coordinates 
15350 6f 66 20 70 6f 69 6e 74 20 69 6e 20 77 69 64 67  of point in widg
15360 65 74 27 73 0a 09 09 09 09 20 2a 20 77 69 6e 64  et's..... * wind
15370 6f 77 2e 20 2a 2f 0a 20 20 20 20 54 6b 54 65 78  ow. */.    TkTex
15380 74 49 6e 64 65 78 20 2a 69 6e 64 65 78 50 74 72  tIndex *indexPtr
15390 3b 09 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20  ;./* This index 
153a0 67 65 74 73 20 66 69 6c 6c 65 64 20 69 6e 20 77  gets filled in w
153b0 69 74 68 20 74 68 65 0a 09 09 09 09 20 2a 20 69  ith the..... * i
153c0 6e 64 65 78 20 6f 66 20 74 68 65 20 63 68 61 72  ndex of the char
153d0 61 63 74 65 72 20 6e 65 61 72 65 73 74 20 74 6f  acter nearest to
153e0 20 28 78 2c 79 29 2e 20 2a 2f 0a 7b 0a 20 20 20   (x,y). */.{.   
153f0 20 44 49 6e 66 6f 20 2a 64 49 6e 66 6f 50 74 72   DInfo *dInfoPtr
15400 20 3d 20 74 65 78 74 50 74 72 2d 3e 64 49 6e 66   = textPtr->dInf
15410 6f 50 74 72 3b 0a 20 20 20 20 72 65 67 69 73 74  oPtr;.    regist
15420 65 72 20 44 4c 69 6e 65 20 2a 64 6c 50 74 72 3b  er DLine *dlPtr;
15430 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 54 6b  .    register Tk
15440 54 65 78 74 44 69 73 70 43 68 75 6e 6b 20 2a 63  TextDispChunk *c
15450 68 75 6e 6b 50 74 72 3b 0a 0a 20 20 20 20 2f 2a  hunkPtr;..    /*
15460 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 72  .     * Make sur
15470 65 20 74 68 61 74 20 61 6c 6c 20 6f 66 20 74 68  e that all of th
15480 65 20 6c 61 79 6f 75 74 20 69 6e 66 6f 72 6d 61  e layout informa
15490 74 69 6f 6e 20 61 62 6f 75 74 20 77 68 61 74 27  tion about what'
154a0 73 0a 20 20 20 20 20 2a 20 64 69 73 70 6c 61 79  s.     * display
154b0 65 64 20 77 68 65 72 65 20 6f 6e 20 74 68 65 20  ed where on the 
154c0 73 63 72 65 65 6e 20 69 73 20 75 70 2d 74 6f 2d  screen is up-to-
154d0 64 61 74 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  date..     */.. 
154e0 20 20 20 69 66 20 28 64 49 6e 66 6f 50 74 72 2d     if (dInfoPtr-
154f0 3e 66 6c 61 67 73 20 26 20 44 49 4e 46 4f 5f 4f  >flags & DINFO_O
15500 55 54 5f 4f 46 5f 44 41 54 45 29 20 7b 0a 09 55  UT_OF_DATE) {..U
15510 70 64 61 74 65 44 69 73 70 6c 61 79 49 6e 66 6f  pdateDisplayInfo
15520 28 74 65 78 74 50 74 72 29 3b 0a 20 20 20 20 7d  (textPtr);.    }
15530 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
15540 49 66 20 74 68 65 20 63 6f 6f 72 64 69 6e 61 74  If the coordinat
15550 65 73 20 61 72 65 20 61 62 6f 76 65 20 74 68 65  es are above the
15560 20 74 6f 70 20 6f 66 20 74 68 65 20 77 69 6e 64   top of the wind
15570 6f 77 2c 20 74 68 65 6e 20 61 64 6a 75 73 74 0a  ow, then adjust.
15580 20 20 20 20 20 2a 20 74 68 65 6d 20 74 6f 20 72       * them to r
15590 65 66 65 72 20 74 6f 20 74 68 65 20 75 70 70 65  efer to the uppe
155a0 72 2d 72 69 67 68 74 20 63 6f 72 6e 65 72 20 6f  r-right corner o
155b0 66 20 74 68 65 20 77 69 6e 64 6f 77 2e 20 20 49  f the window.  I
155c0 66 20 74 68 65 79 27 72 65 0a 20 20 20 20 20 2a  f they're.     *
155d0 20 6f 66 66 20 74 6f 20 6f 6e 65 20 73 69 64 65   off to one side
155e0 20 6f 72 20 74 68 65 20 6f 74 68 65 72 2c 20 74   or the other, t
155f0 68 65 6e 20 61 64 6a 75 73 74 20 74 6f 20 74 68  hen adjust to th
15600 65 20 63 6c 6f 73 65 73 74 20 73 69 64 65 2e 0a  e closest side..
15610 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20       */..    if 
15620 28 79 20 3c 20 64 49 6e 66 6f 50 74 72 2d 3e 79  (y < dInfoPtr->y
15630 29 20 7b 0a 09 79 20 3d 20 64 49 6e 66 6f 50 74  ) {..y = dInfoPt
15640 72 2d 3e 79 3b 0a 09 78 20 3d 20 64 49 6e 66 6f  r->y;..x = dInfo
15650 50 74 72 2d 3e 78 3b 0a 20 20 20 20 7d 0a 20 20  Ptr->x;.    }.  
15660 20 20 69 66 20 28 78 20 3e 3d 20 64 49 6e 66 6f    if (x >= dInfo
15670 50 74 72 2d 3e 6d 61 78 58 29 20 7b 0a 09 78 20  Ptr->maxX) {..x 
15680 3d 20 64 49 6e 66 6f 50 74 72 2d 3e 6d 61 78 58  = dInfoPtr->maxX
15690 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 1;.    }.    
156a0 69 66 20 28 78 20 3c 20 64 49 6e 66 6f 50 74 72  if (x < dInfoPtr
156b0 2d 3e 78 29 20 7b 0a 09 78 20 3d 20 64 49 6e 66  ->x) {..x = dInf
156c0 6f 50 74 72 2d 3e 78 3b 0a 20 20 20 20 7d 0a 0a  oPtr->x;.    }..
156d0 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 46 69      /*.     * Fi
156e0 6e 64 20 74 68 65 20 64 69 73 70 6c 61 79 20 6c  nd the display l
156f0 69 6e 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ine containing t
15700 68 65 20 64 65 73 69 72 65 64 20 79 2d 63 6f 6f  he desired y-coo
15710 72 64 69 6e 61 74 65 2e 0a 20 20 20 20 20 2a 2f  rdinate..     */
15720 0a 0a 20 20 20 20 66 6f 72 20 28 64 6c 50 74 72  ..    for (dlPtr
15730 20 3d 20 64 49 6e 66 6f 50 74 72 2d 3e 64 4c 69   = dInfoPtr->dLi
15740 6e 65 50 74 72 3b 20 79 20 3e 3d 20 28 64 6c 50  nePtr; y >= (dlP
15750 74 72 2d 3e 79 20 2b 20 64 6c 50 74 72 2d 3e 68  tr->y + dlPtr->h
15760 65 69 67 68 74 29 3b 0a 09 20 20 20 20 64 6c 50  eight);..    dlP
15770 74 72 20 3d 20 64 6c 50 74 72 2d 3e 6e 65 78 74  tr = dlPtr->next
15780 50 74 72 29 20 7b 0a 09 69 66 20 28 64 6c 50 74  Ptr) {..if (dlPt
15790 72 2d 3e 6e 65 78 74 50 74 72 20 3d 3d 20 4e 55  r->nextPtr == NU
157a0 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20  LL) {..    /*.. 
157b0 20 20 20 20 2a 20 59 2d 63 6f 6f 72 64 69 6e 61      * Y-coordina
157c0 74 65 20 69 73 20 6f 66 66 20 74 68 65 20 62 6f  te is off the bo
157d0 74 74 6f 6d 20 6f 66 20 74 68 65 20 64 69 73 70  ttom of the disp
157e0 6c 61 79 65 64 20 74 65 78 74 2e 0a 09 20 20 20  layed text...   
157f0 20 20 2a 20 55 73 65 20 74 68 65 20 6c 61 73 74    * Use the last
15800 20 63 68 61 72 61 63 74 65 72 20 6f 6e 20 74 68   character on th
15810 65 20 6c 61 73 74 20 6c 69 6e 65 2e 0a 09 20 20  e last line...  
15820 20 20 20 2a 2f 0a 0a 09 20 20 20 20 78 20 3d 20     */...    x = 
15830 64 49 6e 66 6f 50 74 72 2d 3e 6d 61 78 58 20 2d  dInfoPtr->maxX -
15840 20 31 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a   1;..    break;.
15850 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
15860 0a 20 20 20 20 20 2a 20 53 63 61 6e 20 74 68 72  .     * Scan thr
15870 6f 75 67 68 20 74 68 65 20 6c 69 6e 65 27 73 20  ough the line's 
15880 63 68 75 6e 6b 73 20 74 6f 20 66 69 6e 64 20 74  chunks to find t
15890 68 65 20 6f 6e 65 20 74 68 61 74 20 63 6f 6e 74  he one that cont
158a0 61 69 6e 73 0a 20 20 20 20 20 2a 20 74 68 65 20  ains.     * the 
158b0 64 65 73 69 72 65 64 20 78 2d 63 6f 6f 72 64 69  desired x-coordi
158c0 6e 61 74 65 2e 20 20 42 65 66 6f 72 65 20 64 6f  nate.  Before do
158d0 69 6e 67 20 74 68 69 73 2c 20 74 72 61 6e 73 6c  ing this, transl
158e0 61 74 65 20 74 68 65 0a 20 20 20 20 20 2a 20 78  ate the.     * x
158f0 2d 63 6f 6f 72 64 69 6e 61 74 65 20 66 72 6f 6d  -coordinate from
15900 20 74 68 65 20 63 6f 6f 72 64 69 6e 61 74 65 20   the coordinate 
15910 73 79 73 74 65 6d 20 6f 66 20 74 68 65 20 77 69  system of the wi
15920 6e 64 6f 77 20 74 6f 20 74 68 65 0a 20 20 20 20  ndow to the.    
15930 20 2a 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 79   * coordinate sy
15940 73 74 65 6d 20 6f 66 20 74 68 65 20 6c 69 6e 65  stem of the line
15950 20 28 74 6f 20 74 61 6b 65 20 61 63 63 6f 75 6e   (to take accoun
15960 74 20 6f 66 20 78 2d 73 63 72 6f 6c 6c 69 6e 67  t of x-scrolling
15970 29 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  )..     */..    
15980 2a 69 6e 64 65 78 50 74 72 20 3d 20 64 6c 50 74  *indexPtr = dlPt
15990 72 2d 3e 69 6e 64 65 78 3b 0a 20 20 20 20 78 20  r->index;.    x 
159a0 3d 20 78 20 2d 20 64 49 6e 66 6f 50 74 72 2d 3e  = x - dInfoPtr->
159b0 78 20 2b 20 64 49 6e 66 6f 50 74 72 2d 3e 63 75  x + dInfoPtr->cu
159c0 72 50 69 78 65 6c 4f 66 66 73 65 74 3b 0a 20 20  rPixelOffset;.  
159d0 20 20 66 6f 72 20 28 63 68 75 6e 6b 50 74 72 20    for (chunkPtr 
159e0 3d 20 64 6c 50 74 72 2d 3e 63 68 75 6e 6b 50 74  = dlPtr->chunkPt
159f0 72 3b 20 78 20 3e 3d 20 28 63 68 75 6e 6b 50 74  r; x >= (chunkPt
15a00 72 2d 3e 78 20 2b 20 63 68 75 6e 6b 50 74 72 2d  r->x + chunkPtr-
15a10 3e 77 69 64 74 68 29 3b 0a 09 20 20 20 20 69 6e  >width);..    in
15a20 64 65 78 50 74 72 2d 3e 63 68 61 72 49 6e 64 65  dexPtr->charInde
15a30 78 20 2b 3d 20 63 68 75 6e 6b 50 74 72 2d 3e 6e  x += chunkPtr->n
15a40 75 6d 43 68 61 72 73 2c 0a 09 20 20 20 20 63 68  umChars,..    ch
15a50 75 6e 6b 50 74 72 20 3d 20 63 68 75 6e 6b 50 74  unkPtr = chunkPt
15a60 72 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09 69  r->nextPtr) {..i
15a70 66 20 28 63 68 75 6e 6b 50 74 72 2d 3e 6e 65 78  f (chunkPtr->nex
15a80 74 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tPtr == NULL) {.
15a90 09 20 20 20 20 69 6e 64 65 78 50 74 72 2d 3e 63  .    indexPtr->c
15aa0 68 61 72 49 6e 64 65 78 20 2b 3d 20 63 68 75 6e  harIndex += chun
15ab0 6b 50 74 72 2d 3e 6e 75 6d 43 68 61 72 73 20 2d  kPtr->numChars -
15ac0 20 31 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 3b   1;..    return;
15ad0 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
15ae0 2a 0a 20 20 20 20 20 2a 20 49 66 20 74 68 65 20  *.     * If the 
15af0 63 68 75 6e 6b 20 68 61 73 20 6d 6f 72 65 20 74  chunk has more t
15b00 68 61 6e 20 6f 6e 65 20 63 68 61 72 61 63 74 65  han one characte
15b10 72 20 69 6e 20 69 74 2c 20 61 73 6b 20 69 74 20  r in it, ask it 
15b20 77 68 69 63 68 0a 20 20 20 20 20 2a 20 63 68 61  which.     * cha
15b30 72 61 63 74 65 72 20 69 73 20 61 74 20 74 68 65  racter is at the
15b40 20 64 65 73 69 72 65 64 20 6c 6f 63 61 74 69 6f   desired locatio
15b50 6e 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  n..     */..    
15b60 69 66 20 28 63 68 75 6e 6b 50 74 72 2d 3e 6e 75  if (chunkPtr->nu
15b70 6d 43 68 61 72 73 20 3e 20 31 29 20 7b 0a 09 69  mChars > 1) {..i
15b80 6e 64 65 78 50 74 72 2d 3e 63 68 61 72 49 6e 64  ndexPtr->charInd
15b90 65 78 20 2b 3d 20 28 2a 63 68 75 6e 6b 50 74 72  ex += (*chunkPtr
15ba0 2d 3e 6d 65 61 73 75 72 65 50 72 6f 63 29 28 63  ->measureProc)(c
15bb0 68 75 6e 6b 50 74 72 2c 20 78 29 3b 0a 20 20 20  hunkPtr, x);.   
15bc0 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d   }.}.../*. *----
15bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c10 2d 2d 0a 20 2a 0a 20 2a 20 54 6b 54 65 78 74 43  --. *. * TkTextC
15c20 68 61 72 42 62 6f 78 20 2d 2d 0a 20 2a 0a 20 2a  harBbox --. *. *
15c30 09 47 69 76 65 6e 20 61 6e 20 69 6e 64 65 78 2c  .Given an index,
15c40 20 66 69 6e 64 20 74 68 65 20 62 6f 75 6e 64 69   find the boundi
15c50 6e 67 20 62 6f 78 20 6f 66 20 74 68 65 20 73 63  ng box of the sc
15c60 72 65 65 6e 20 61 72 65 61 0a 20 2a 09 6f 63 63  reen area. *.occ
15c70 75 70 69 65 64 20 62 79 20 74 68 61 74 20 63 68  upied by that ch
15c80 61 72 61 63 74 65 72 2e 0a 20 2a 0a 20 2a 20 52  aracter.. *. * R
15c90 65 73 75 6c 74 73 3a 0a 20 2a 09 5a 65 72 6f 20  esults:. *.Zero 
15ca0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
15cb0 68 65 20 63 68 61 72 61 63 74 65 72 20 69 73 20  he character is 
15cc0 6f 6e 20 74 68 65 20 73 63 72 65 65 6e 2e 20 20  on the screen.  
15cd0 2d 31 0a 20 2a 09 6d 65 61 6e 73 20 74 68 65 20  -1. *.means the 
15ce0 63 68 61 72 61 63 74 65 72 20 69 73 6e 27 74 20  character isn't 
15cf0 6f 6e 20 74 68 65 20 73 63 72 65 65 6e 2e 20 20  on the screen.  
15d00 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
15d10 6c 75 65 0a 20 2a 09 69 73 20 30 2c 20 74 68 65  lue. *.is 0, the
15d20 6e 20 74 68 65 20 62 6f 75 6e 64 69 6e 67 20 62  n the bounding b
15d30 6f 78 20 6f 66 20 74 68 65 20 70 61 72 74 20 6f  ox of the part o
15d40 66 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20  f the character 
15d50 74 68 61 74 27 73 0a 20 2a 09 76 69 73 69 62 6c  that's. *.visibl
15d60 65 20 6f 6e 20 74 68 65 20 73 63 72 65 65 6e 20  e on the screen 
15d70 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 2a  is returned to *
15d80 78 50 74 72 2c 20 2a 79 50 74 72 2c 20 2a 77 69  xPtr, *yPtr, *wi
15d90 64 74 68 50 74 72 2c 0a 20 2a 09 61 6e 64 20 2a  dthPtr,. *.and *
15da0 68 65 69 67 68 74 50 74 72 2e 0a 20 2a 0a 20 2a  heightPtr.. *. *
15db0 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
15dc0 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
15dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e10 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 6b 54  ---. */..int.TkT
15e20 65 78 74 43 68 61 72 42 62 6f 78 28 74 65 78 74  extCharBbox(text
15e30 50 74 72 2c 20 69 6e 64 65 78 50 74 72 2c 20 78  Ptr, indexPtr, x
15e40 50 74 72 2c 20 79 50 74 72 2c 20 77 69 64 74 68  Ptr, yPtr, width
15e50 50 74 72 2c 20 68 65 69 67 68 74 50 74 72 29 0a  Ptr, heightPtr).
15e60 20 20 20 20 54 6b 54 65 78 74 20 2a 74 65 78 74      TkText *text
15e70 50 74 72 3b 09 09 2f 2a 20 57 69 64 67 65 74 20  Ptr;../* Widget 
15e80 72 65 63 6f 72 64 20 66 6f 72 20 74 65 78 74 20  record for text 
15e90 77 69 64 67 65 74 2e 20 2a 2f 0a 20 20 20 20 54  widget. */.    T
15ea0 6b 54 65 78 74 49 6e 64 65 78 20 2a 69 6e 64 65  kTextIndex *inde
15eb0 78 50 74 72 3b 09 2f 2a 20 49 6e 64 65 78 20 6f  xPtr;./* Index o
15ec0 66 20 63 68 61 72 61 63 74 65 72 20 77 68 6f 73  f character whos
15ed0 65 20 62 6f 75 6e 64 69 6e 67 0a 09 09 09 09 20  e bounding..... 
15ee0 2a 20 62 6f 78 20 69 73 20 64 65 73 69 72 65 64  * box is desired
15ef0 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 78 50  . */.    int *xP
15f00 74 72 2c 20 2a 79 50 74 72 3b 09 09 2f 2a 20 46  tr, *yPtr;../* F
15f10 69 6c 6c 65 64 20 77 69 74 68 20 63 68 61 72 61  illed with chara
15f20 63 74 65 72 27 73 20 75 70 70 65 72 2d 6c 65 66  cter's upper-lef
15f30 74 0a 09 09 09 09 20 2a 20 63 6f 6f 72 64 69 6e  t..... * coordin
15f40 61 74 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ate. */.    int 
15f50 2a 77 69 64 74 68 50 74 72 2c 20 2a 68 65 69 67  *widthPtr, *heig
15f60 68 74 50 74 72 3b 09 2f 2a 20 46 69 6c 6c 65 64  htPtr;./* Filled
15f70 20 69 6e 20 77 69 74 68 20 63 68 61 72 61 63 74   in with charact
15f80 65 72 27 73 20 64 69 6d 65 6e 73 69 6f 6e 73 2e  er's dimensions.
15f90 20 2a 2f 0a 7b 0a 20 20 20 20 44 49 6e 66 6f 20   */.{.    DInfo 
15fa0 2a 64 49 6e 66 6f 50 74 72 20 3d 20 74 65 78 74  *dInfoPtr = text
15fb0 50 74 72 2d 3e 64 49 6e 66 6f 50 74 72 3b 0a 20  Ptr->dInfoPtr;. 
15fc0 20 20 20 44 4c 69 6e 65 20 2a 64 6c 50 74 72 3b     DLine *dlPtr;
15fd0 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 54 6b  .    register Tk
15fe0 54 65 78 74 44 69 73 70 43 68 75 6e 6b 20 2a 63  TextDispChunk *c
15ff0 68 75 6e 6b 50 74 72 3b 0a 20 20 20 20 69 6e 74  hunkPtr;.    int
16000 20 69 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 0a   index;..    /*.
16010 20 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 72 65       * Make sure
16020 20 74 68 61 74 20 61 6c 6c 20 6f 66 20 74 68 65   that all of the
16030 20 73 63 72 65 65 6e 20 6c 61 79 6f 75 74 20 69   screen layout i
16040 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 70  nformation is up
16050 20 74 6f 20 64 61 74 65 2e 0a 20 20 20 20 20 2a   to date..     *
16060 2f 0a 0a 20 20 20 20 69 66 20 28 64 49 6e 66 6f  /..    if (dInfo
16070 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 44 49 4e  Ptr->flags & DIN
16080 46 4f 5f 4f 55 54 5f 4f 46 5f 44 41 54 45 29 20  FO_OUT_OF_DATE) 
16090 7b 0a 09 55 70 64 61 74 65 44 69 73 70 6c 61 79  {..UpdateDisplay
160a0 49 6e 66 6f 28 74 65 78 74 50 74 72 29 3b 0a 20  Info(textPtr);. 
160b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
160c0 20 20 2a 20 46 69 6e 64 20 74 68 65 20 64 69 73    * Find the dis
160d0 70 6c 61 79 20 6c 69 6e 65 20 63 6f 6e 74 61 69  play line contai
160e0 6e 69 6e 67 20 74 68 65 20 64 65 73 69 72 65 64  ning the desired
160f0 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 2a 2f 0a   index..     */.
16100 0a 20 20 20 20 64 6c 50 74 72 20 3d 20 46 69 6e  .    dlPtr = Fin
16110 64 44 4c 69 6e 65 28 64 49 6e 66 6f 50 74 72 2d  dDLine(dInfoPtr-
16120 3e 64 4c 69 6e 65 50 74 72 2c 20 69 6e 64 65 78  >dLinePtr, index
16130 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 64  Ptr);.    if ((d
16140 6c 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7c 7c  lPtr == NULL) ||
16150 20 28 54 6b 54 65 78 74 49 6e 64 65 78 43 6d 70   (TkTextIndexCmp
16160 28 26 64 6c 50 74 72 2d 3e 69 6e 64 65 78 2c 20  (&dlPtr->index, 
16170 69 6e 64 65 78 50 74 72 29 20 3e 20 30 29 29 20  indexPtr) > 0)) 
16180 7b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20  {..return -1;.  
16190 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
161a0 20 2a 20 46 69 6e 64 20 74 68 65 20 63 68 75 6e   * Find the chun
161b0 6b 20 77 69 74 68 69 6e 20 74 68 65 20 6c 69 6e  k within the lin
161c0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
161d0 74 68 65 20 64 65 73 69 72 65 64 0a 20 20 20 20  the desired.    
161e0 20 2a 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 2a   * index..     *
161f0 2f 0a 0a 20 20 20 20 69 6e 64 65 78 20 3d 20 69  /..    index = i
16200 6e 64 65 78 50 74 72 2d 3e 63 68 61 72 49 6e 64  ndexPtr->charInd
16210 65 78 20 2d 20 64 6c 50 74 72 2d 3e 69 6e 64 65  ex - dlPtr->inde
16220 78 2e 63 68 61 72 49 6e 64 65 78 3b 0a 20 20 20  x.charIndex;.   
16230 20 66 6f 72 20 28 63 68 75 6e 6b 50 74 72 20 3d   for (chunkPtr =
16240 20 64 6c 50 74 72 2d 3e 63 68 75 6e 6b 50 74 72   dlPtr->chunkPtr
16250 3b 20 3b 20 63 68 75 6e 6b 50 74 72 20 3d 20 63  ; ; chunkPtr = c
16260 68 75 6e 6b 50 74 72 2d 3e 6e 65 78 74 50 74 72  hunkPtr->nextPtr
16270 29 20 7b 0a 09 69 66 20 28 63 68 75 6e 6b 50 74  ) {..if (chunkPt
16280 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  r == NULL) {..  
16290 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a    return -1;..}.
162a0 09 69 66 20 28 69 6e 64 65 78 20 3c 20 63 68 75  .if (index < chu
162b0 6e 6b 50 74 72 2d 3e 6e 75 6d 43 68 61 72 73 29  nkPtr->numChars)
162c0 20 7b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09   {..    break;..
162d0 7d 0a 09 69 6e 64 65 78 20 2d 3d 20 63 68 75 6e  }..index -= chun
162e0 6b 50 74 72 2d 3e 6e 75 6d 43 68 61 72 73 3b 0a  kPtr->numChars;.
162f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
16300 20 20 20 2a 20 43 61 6c 6c 20 61 20 63 68 75 6e     * Call a chun
16310 6b 2d 73 70 65 63 69 66 69 63 20 70 72 6f 63 65  k-specific proce
16320 64 75 72 65 20 74 6f 20 66 69 6e 64 20 74 68 65  dure to find the
16330 20 68 6f 72 69 7a 6f 6e 74 61 6c 20 72 61 6e 67   horizontal rang
16340 65 20 6f 66 0a 20 20 20 20 20 2a 20 74 68 65 20  e of.     * the 
16350 63 68 61 72 61 63 74 65 72 20 77 69 74 68 69 6e  character within
16360 20 74 68 65 20 63 68 75 6e 6b 2c 20 74 68 65 6e   the chunk, then
16370 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 76 65 72   fill in the ver
16380 74 69 63 61 6c 20 72 61 6e 67 65 2e 0a 20 20 20  tical range..   
16390 20 20 2a 20 54 68 65 20 78 2d 63 6f 6f 72 64 69    * The x-coordi
163a0 6e 61 74 65 20 72 65 74 75 72 6e 65 64 20 62 79  nate returned by
163b0 20 62 62 6f 78 50 72 6f 63 20 69 73 20 61 20 63   bboxProc is a c
163c0 6f 6f 72 64 69 6e 61 74 65 20 77 69 74 68 69 6e  oordinate within
163d0 20 61 0a 20 20 20 20 20 2a 20 6c 69 6e 65 2c 20   a.     * line, 
163e0 6e 6f 74 20 61 20 63 6f 6f 72 64 69 6e 61 74 65  not a coordinate
163f0 20 6f 6e 20 74 68 65 20 73 63 72 65 65 6e 2e 20   on the screen. 
16400 20 54 72 61 6e 73 6c 61 74 65 20 69 74 20 74 6f   Translate it to
16410 20 72 65 66 6c 65 63 74 0a 20 20 20 20 20 2a 20   reflect.     * 
16420 68 6f 72 69 7a 6f 6e 74 61 6c 20 73 63 72 6f 6c  horizontal scrol
16430 6c 69 6e 67 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  ling..     */.. 
16440 20 20 20 28 2a 63 68 75 6e 6b 50 74 72 2d 3e 62     (*chunkPtr->b
16450 62 6f 78 50 72 6f 63 29 28 63 68 75 6e 6b 50 74  boxProc)(chunkPt
16460 72 2c 20 69 6e 64 65 78 2c 20 64 6c 50 74 72 2d  r, index, dlPtr-
16470 3e 79 20 2b 20 64 6c 50 74 72 2d 3e 73 70 61 63  >y + dlPtr->spac
16480 65 41 62 6f 76 65 2c 0a 09 20 20 20 20 78 50 74  eAbove,..    xPt
16490 72 2c 20 79 50 74 72 2c 20 77 69 64 74 68 50 74  r, yPtr, widthPt
164a0 72 2c 20 68 65 69 67 68 74 50 74 72 29 3b 0a 20  r, heightPtr);. 
164b0 20 20 20 2a 78 50 74 72 20 3d 20 2a 78 50 74 72     *xPtr = *xPtr
164c0 20 2b 20 64 49 6e 66 6f 50 74 72 2d 3e 78 20 2d   + dInfoPtr->x -
164d0 20 64 49 6e 66 6f 50 74 72 2d 3e 63 75 72 50 69   dInfoPtr->curPi
164e0 78 65 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 69  xelOffset;.    i
164f0 66 20 28 28 69 6e 64 65 78 20 3d 3d 20 28 63 68  f ((index == (ch
16500 75 6e 6b 50 74 72 2d 3e 6e 75 6d 43 68 61 72 73  unkPtr->numChars
16510 2d 31 29 29 20 26 26 20 28 63 68 75 6e 6b 50 74  -1)) && (chunkPt
16520 72 2d 3e 6e 65 78 74 50 74 72 20 3d 3d 20 4e 55  r->nextPtr == NU
16530 4c 4c 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4c  LL)) {../*.. * L
16540 61 73 74 20 63 68 61 72 61 63 74 65 72 20 69 6e  ast character in
16550 20 64 69 73 70 6c 61 79 20 6c 69 6e 65 2e 20 20   display line.  
16560 47 69 76 65 20 69 74 20 61 6c 6c 20 74 68 65 20  Give it all the 
16570 73 70 61 63 65 20 75 70 20 74 6f 0a 09 20 2a 20  space up to.. * 
16580 74 68 65 20 6c 69 6e 65 2e 0a 09 20 2a 2f 0a 0a  the line... */..
16590 09 69 66 20 28 2a 78 50 74 72 20 3e 20 64 49 6e  .if (*xPtr > dIn
165a0 66 6f 50 74 72 2d 3e 6d 61 78 58 29 20 7b 0a 09  foPtr->maxX) {..
165b0 20 20 20 20 2a 78 50 74 72 20 3d 20 64 49 6e 66      *xPtr = dInf
165c0 6f 50 74 72 2d 3e 6d 61 78 58 3b 0a 09 7d 0a 09  oPtr->maxX;..}..
165d0 2a 77 69 64 74 68 50 74 72 20 3d 20 64 49 6e 66  *widthPtr = dInf
165e0 6f 50 74 72 2d 3e 6d 61 78 58 20 2d 20 2a 78 50  oPtr->maxX - *xP
165f0 74 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  tr;.    }.    if
16600 20 28 28 2a 78 50 74 72 20 2b 20 2a 77 69 64 74   ((*xPtr + *widt
16610 68 50 74 72 29 20 3c 3d 20 64 49 6e 66 6f 50 74  hPtr) <= dInfoPt
16620 72 2d 3e 78 29 20 7b 0a 09 72 65 74 75 72 6e 20  r->x) {..return 
16630 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  -1;.    }.    if
16640 20 28 28 2a 78 50 74 72 20 2b 20 2a 77 69 64 74   ((*xPtr + *widt
16650 68 50 74 72 29 20 3e 20 64 49 6e 66 6f 50 74 72  hPtr) > dInfoPtr
16660 2d 3e 6d 61 78 58 29 20 7b 0a 09 2a 77 69 64 74  ->maxX) {..*widt
16670 68 50 74 72 20 3d 20 64 49 6e 66 6f 50 74 72 2d  hPtr = dInfoPtr-
16680 3e 6d 61 78 58 20 2d 20 2a 78 50 74 72 3b 0a 09  >maxX - *xPtr;..
16690 69 66 20 28 2a 77 69 64 74 68 50 74 72 20 3c 3d  if (*widthPtr <=
166a0 20 30 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72   0) {..    retur
166b0 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20  n -1;..}.    }. 
166c0 20 20 20 69 66 20 28 28 2a 79 50 74 72 20 2b 20     if ((*yPtr + 
166d0 2a 68 65 69 67 68 74 50 74 72 29 20 3e 20 64 49  *heightPtr) > dI
166e0 6e 66 6f 50 74 72 2d 3e 6d 61 78 59 29 20 7b 0a  nfoPtr->maxY) {.
166f0 09 2a 68 65 69 67 68 74 50 74 72 20 3d 20 64 49  .*heightPtr = dI
16700 6e 66 6f 50 74 72 2d 3e 6d 61 78 59 20 2d 20 2a  nfoPtr->maxY - *
16710 79 50 74 72 3b 0a 09 69 66 20 28 2a 68 65 69 67  yPtr;..if (*heig
16720 68 74 50 74 72 20 3c 3d 20 30 29 20 7b 0a 09 20  htPtr <= 0) {.. 
16730 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d     return -1;..}
16740 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
16750 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  n 0;.}.../*. *--
16760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
167a0 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6b 54 65 78  ----. *. * TkTex
167b0 74 44 4c 69 6e 65 49 6e 66 6f 20 2d 2d 0a 20 2a  tDLineInfo --. *
167c0 0a 20 2a 09 47 69 76 65 6e 20 61 6e 20 69 6e 64  . *.Given an ind
167d0 65 78 2c 20 72 65 74 75 72 6e 20 69 6e 66 6f 72  ex, return infor
167e0 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
167f0 20 64 69 73 70 6c 61 79 20 6c 69 6e 65 0a 20 2a   display line. *
16800 09 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 61 74  .containing that
16810 20 63 68 61 72 61 63 74 65 72 2e 0a 20 2a 0a 20   character.. *. 
16820 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 5a 65  * Results:. *.Ze
16830 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ro is returned i
16840 66 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20  f the character 
16850 69 73 20 6f 6e 20 74 68 65 20 73 63 72 65 65 6e  is on the screen
16860 2e 20 20 2d 31 0a 20 2a 09 6d 65 61 6e 73 20 74  .  -1. *.means t
16870 68 65 20 63 68 61 72 61 63 74 65 72 20 69 73 6e  he character isn
16880 27 74 20 6f 6e 20 74 68 65 20 73 63 72 65 65 6e  't on the screen
16890 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
168a0 20 76 61 6c 75 65 0a 20 2a 09 69 73 20 30 2c 20   value. *.is 0, 
168b0 74 68 65 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  then information
168c0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20   is returned in 
168d0 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 70 6f  the variables po
168e0 69 6e 74 65 64 0a 20 2a 09 74 6f 20 62 79 20 78  inted. *.to by x
168f0 50 74 72 2c 20 79 50 74 72 2c 20 77 69 64 74 68  Ptr, yPtr, width
16900 50 74 72 2c 20 68 65 69 67 68 74 50 74 72 2c 20  Ptr, heightPtr, 
16910 61 6e 64 20 62 61 73 65 50 74 72 2e 0a 20 2a 0a  and basePtr.. *.
16920 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
16930 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
16940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16980 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54  -----. */..int.T
16990 6b 54 65 78 74 44 4c 69 6e 65 49 6e 66 6f 28 74  kTextDLineInfo(t
169a0 65 78 74 50 74 72 2c 20 69 6e 64 65 78 50 74 72  extPtr, indexPtr
169b0 2c 20 78 50 74 72 2c 20 79 50 74 72 2c 20 77 69  , xPtr, yPtr, wi
169c0 64 74 68 50 74 72 2c 20 68 65 69 67 68 74 50 74  dthPtr, heightPt
169d0 72 2c 20 62 61 73 65 50 74 72 29 0a 20 20 20 20  r, basePtr).    
169e0 54 6b 54 65 78 74 20 2a 74 65 78 74 50 74 72 3b  TkText *textPtr;
169f0 09 09 2f 2a 20 57 69 64 67 65 74 20 72 65 63 6f  ../* Widget reco
16a00 72 64 20 66 6f 72 20 74 65 78 74 20 77 69 64 67  rd for text widg
16a10 65 74 2e 20 2a 2f 0a 20 20 20 20 54 6b 54 65 78  et. */.    TkTex
16a20 74 49 6e 64 65 78 20 2a 69 6e 64 65 78 50 74 72  tIndex *indexPtr
16a30 3b 09 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 68  ;./* Index of ch
16a40 61 72 61 63 74 65 72 20 77 68 6f 73 65 20 62 6f  aracter whose bo
16a50 75 6e 64 69 6e 67 0a 09 09 09 09 20 2a 20 62 6f  unding..... * bo
16a60 78 20 69 73 20 64 65 73 69 72 65 64 2e 20 2a 2f  x is desired. */
16a70 0a 20 20 20 20 69 6e 74 20 2a 78 50 74 72 2c 20  .    int *xPtr, 
16a80 2a 79 50 74 72 3b 09 09 2f 2a 20 46 69 6c 6c 65  *yPtr;../* Fille
16a90 64 20 77 69 74 68 20 6c 69 6e 65 27 73 20 75 70  d with line's up
16aa0 70 65 72 2d 6c 65 66 74 0a 09 09 09 09 20 2a 20  per-left..... * 
16ab0 63 6f 6f 72 64 69 6e 61 74 65 2e 20 2a 2f 0a 20  coordinate. */. 
16ac0 20 20 20 69 6e 74 20 2a 77 69 64 74 68 50 74 72     int *widthPtr
16ad0 2c 20 2a 68 65 69 67 68 74 50 74 72 3b 09 2f 2a  , *heightPtr;./*
16ae0 20 46 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20   Filled in with 
16af0 6c 69 6e 65 27 73 20 64 69 6d 65 6e 73 69 6f 6e  line's dimension
16b00 73 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 62  s. */.    int *b
16b10 61 73 65 50 74 72 3b 09 09 2f 2a 20 46 69 6c 6c  asePtr;../* Fill
16b20 65 64 20 69 6e 20 77 69 74 68 20 74 68 65 20 62  ed in with the b
16b30 61 73 65 6c 69 6e 65 20 70 6f 73 69 74 69 6f 6e  aseline position
16b40 2c 0a 09 09 09 09 20 2a 20 6d 65 61 73 75 72 65  ,..... * measure
16b50 64 20 61 73 20 61 6e 20 6f 66 66 73 65 74 20 64  d as an offset d
16b60 6f 77 6e 20 66 72 6f 6d 20 2a 79 50 74 72 2e 20  own from *yPtr. 
16b70 2a 2f 0a 7b 0a 20 20 20 20 44 49 6e 66 6f 20 2a  */.{.    DInfo *
16b80 64 49 6e 66 6f 50 74 72 20 3d 20 74 65 78 74 50  dInfoPtr = textP
16b90 74 72 2d 3e 64 49 6e 66 6f 50 74 72 3b 0a 20 20  tr->dInfoPtr;.  
16ba0 20 20 44 4c 69 6e 65 20 2a 64 6c 50 74 72 3b 0a    DLine *dlPtr;.
16bb0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d  .    /*.     * M
16bc0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 6c  ake sure that al
16bd0 6c 20 6f 66 20 74 68 65 20 73 63 72 65 65 6e 20  l of the screen 
16be0 6c 61 79 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69  layout informati
16bf0 6f 6e 20 69 73 20 75 70 20 74 6f 20 64 61 74 65  on is up to date
16c00 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69  ..     */..    i
16c10 66 20 28 64 49 6e 66 6f 50 74 72 2d 3e 66 6c 61  f (dInfoPtr->fla
16c20 67 73 20 26 20 44 49 4e 46 4f 5f 4f 55 54 5f 4f  gs & DINFO_OUT_O
16c30 46 5f 44 41 54 45 29 20 7b 0a 09 55 70 64 61 74  F_DATE) {..Updat
16c40 65 44 69 73 70 6c 61 79 49 6e 66 6f 28 74 65 78  eDisplayInfo(tex
16c50 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  tPtr);.    }..  
16c60 20 20 2f 2a 0a 20 20 20 20 20 2a 20 46 69 6e 64    /*.     * Find
16c70 20 74 68 65 20 64 69 73 70 6c 61 79 20 6c 69 6e   the display lin
16c80 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
16c90 20 64 65 73 69 72 65 64 20 69 6e 64 65 78 2e 0a   desired index..
16ca0 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 64 6c 50       */..    dlP
16cb0 74 72 20 3d 20 46 69 6e 64 44 4c 69 6e 65 28 64  tr = FindDLine(d
16cc0 49 6e 66 6f 50 74 72 2d 3e 64 4c 69 6e 65 50 74  InfoPtr->dLinePt
16cd0 72 2c 20 69 6e 64 65 78 50 74 72 29 3b 0a 20 20  r, indexPtr);.  
16ce0 20 20 69 66 20 28 28 64 6c 50 74 72 20 3d 3d 20    if ((dlPtr == 
16cf0 4e 55 4c 4c 29 20 7c 7c 20 28 54 6b 54 65 78 74  NULL) || (TkText
16d00 49 6e 64 65 78 43 6d 70 28 26 64 6c 50 74 72 2d  IndexCmp(&dlPtr-
16d10 3e 69 6e 64 65 78 2c 20 69 6e 64 65 78 50 74 72  >index, indexPtr
16d20 29 20 3e 20 30 29 29 20 7b 0a 09 72 65 74 75 72  ) > 0)) {..retur
16d30 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n -1;.    }..   
16d40 20 2a 78 50 74 72 20 3d 20 64 49 6e 66 6f 50 74   *xPtr = dInfoPt
16d50 72 2d 3e 78 20 2d 20 64 49 6e 66 6f 50 74 72 2d  r->x - dInfoPtr-
16d60 3e 63 75 72 50 69 78 65 6c 4f 66 66 73 65 74 20  >curPixelOffset 
16d70 2b 20 64 6c 50 74 72 2d 3e 63 68 75 6e 6b 50 74  + dlPtr->chunkPt
16d80 72 2d 3e 78 3b 0a 20 20 20 20 2a 77 69 64 74 68  r->x;.    *width
16d90 50 74 72 20 3d 20 64 6c 50 74 72 2d 3e 6c 65 6e  Ptr = dlPtr->len
16da0 67 74 68 20 2d 20 64 6c 50 74 72 2d 3e 63 68 75  gth - dlPtr->chu
16db0 6e 6b 50 74 72 2d 3e 78 3b 0a 20 20 20 20 2a 79  nkPtr->x;.    *y
16dc0 50 74 72 20 3d 20 64 6c 50 74 72 2d 3e 79 3b 0a  Ptr = dlPtr->y;.
16dd0 20 20 20 20 69 66 20 28 28 64 6c 50 74 72 2d 3e      if ((dlPtr->
16de0 79 20 2b 20 64 6c 50 74 72 2d 3e 68 65 69 67 68  y + dlPtr->heigh
16df0 74 29 20 3e 20 64 49 6e 66 6f 50 74 72 2d 3e 6d  t) > dInfoPtr->m
16e00 61 78 59 29 20 7b 0a 09 2a 68 65 69 67 68 74 50  axY) {..*heightP
16e10 74 72 20 3d 20 64 49 6e 66 6f 50 74 72 2d 3e 6d  tr = dInfoPtr->m
16e20 61 78 59 20 2d 20 64 6c 50 74 72 2d 3e 79 3b 0a  axY - dlPtr->y;.
16e30 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 68      } else {..*h
16e40 65 69 67 68 74 50 74 72 20 3d 20 64 6c 50 74 72  eightPtr = dlPtr
16e50 2d 3e 68 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a  ->height;.    }.
16e60 20 20 20 20 2a 62 61 73 65 50 74 72 20 3d 20 64      *basePtr = d
16e70 6c 50 74 72 2d 3e 73 70 61 63 65 41 62 6f 76 65  lPtr->spaceAbove
16e80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
16e90 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
16ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ed0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6b  -------. *. * Tk
16ee0 54 65 78 74 43 68 61 72 4c 61 79 6f 75 74 50 72  TextCharLayoutPr
16ef0 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  oc --. *. *.This
16f00 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 74 68   procedure is th
16f10 65 20 22 6c 61 79 6f 75 74 50 72 6f 63 22 20 66  e "layoutProc" f
16f20 6f 72 20 63 68 61 72 61 63 74 65 72 20 73 65 67  or character seg
16f30 6d 65 6e 74 73 2e 0a 20 2a 0a 20 2a 20 52 65 73  ments.. *. * Res
16f40 75 6c 74 73 3a 0a 20 2a 09 49 66 20 74 68 65 72  ults:. *.If ther
16f50 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74  e is something t
16f60 6f 20 64 69 73 70 6c 61 79 20 66 6f 72 20 74 68  o display for th
16f70 65 20 63 68 75 6e 6b 20 74 68 65 6e 20 61 0a 20  e chunk then a. 
16f80 2a 09 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  *.non-zero value
16f90 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
16fa0 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 63   the fields of c
16fb0 68 75 6e 6b 50 74 72 0a 20 2a 09 77 69 6c 6c 20  hunkPtr. *.will 
16fc0 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 28 73 65  be filled in (se
16fd0 65 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  e the declaratio
16fe0 6e 20 6f 66 20 54 6b 54 65 78 74 44 69 73 70 43  n of TkTextDispC
16ff0 68 75 6e 6b 0a 20 2a 09 69 6e 20 74 6b 54 65 78  hunk. *.in tkTex
17000 74 2e 68 20 66 6f 72 20 64 65 74 61 69 6c 73 29  t.h for details)
17010 2e 20 20 49 66 20 7a 65 72 6f 20 69 73 20 72 65  .  If zero is re
17020 74 75 72 6e 65 64 20 69 74 20 6d 65 61 6e 73 0a  turned it means.
17030 20 2a 09 74 68 61 74 20 6e 6f 20 63 68 61 72 61   *.that no chara
17040 63 74 65 72 73 20 66 72 6f 6d 20 74 68 69 73 20  cters from this 
17050 63 68 75 6e 6b 20 66 69 74 20 69 6e 20 74 68 65  chunk fit in the
17060 20 77 69 6e 64 6f 77 2e 0a 20 2a 09 49 66 20 2d   window.. *.If -
17070 31 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 74  1 is returned it
17080 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
17090 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 64 6f   segment just do
170a0 65 73 6e 27 74 0a 20 2a 09 6e 65 65 64 20 74 6f  esn't. *.need to
170b0 20 62 65 20 64 69 73 70 6c 61 79 65 64 20 28 6e   be displayed (n
170c0 65 76 65 72 20 68 61 70 70 65 6e 73 20 66 6f 72  ever happens for
170d0 20 74 65 78 74 29 2e 0a 20 2a 0a 20 2a 20 53 69   text).. *. * Si
170e0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d  de effects:. *.M
170f0 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74  emory is allocat
17100 65 64 20 74 6f 20 68 6f 6c 64 20 61 64 64 69 74  ed to hold addit
17110 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
17120 6e 20 61 62 6f 75 74 0a 20 2a 09 74 68 65 20 63  n about. *.the c
17130 68 75 6e 6b 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  hunk.. *. *-----
17140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17170 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69  ---------. */..i
17180 6e 74 0a 54 6b 54 65 78 74 43 68 61 72 4c 61 79  nt.TkTextCharLay
17190 6f 75 74 50 72 6f 63 28 74 65 78 74 50 74 72 2c  outProc(textPtr,
171a0 20 69 6e 64 65 78 50 74 72 2c 20 73 65 67 50 74   indexPtr, segPt
171b0 72 2c 20 6f 66 66 73 65 74 2c 20 6d 61 78 58 2c  r, offset, maxX,
171c0 20 6d 61 78 43 68 61 72 73 2c 0a 09 6e 6f 43 68   maxChars,..noCh
171d0 61 72 73 59 65 74 2c 20 77 72 61 70 4d 6f 64 65  arsYet, wrapMode
171e0 2c 20 63 68 75 6e 6b 50 74 72 29 0a 20 20 20 20  , chunkPtr).    
171f0 54 6b 54 65 78 74 20 2a 74 65 78 74 50 74 72 3b  TkText *textPtr;
17200 09 09 2f 2a 20 54 65 78 74 20 77 69 64 67 65 74  ../* Text widget
17210 20 62 65 69 6e 67 20 6c 61 79 65 64 20 6f 75 74   being layed out
17220 2e 20 2a 2f 0a 20 20 20 20 54 6b 54 65 78 74 49  . */.    TkTextI
17230 6e 64 65 78 20 2a 69 6e 64 65 78 50 74 72 3b 09  ndex *indexPtr;.
17240 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
17250 74 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 6c  t character to l
17260 61 79 20 6f 75 74 0a 09 09 09 09 20 2a 20 28 63  ay out..... * (c
17270 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 73 65  orresponds to se
17280 67 50 74 72 20 61 6e 64 20 6f 66 66 73 65 74 29  gPtr and offset)
17290 2e 20 2a 2f 0a 20 20 20 20 54 6b 54 65 78 74 53  . */.    TkTextS
172a0 65 67 6d 65 6e 74 20 2a 73 65 67 50 74 72 3b 09  egment *segPtr;.
172b0 2f 2a 20 53 65 67 6d 65 6e 74 20 62 65 69 6e 67  /* Segment being
172c0 20 6c 61 79 65 64 20 6f 75 74 2e 20 2a 2f 0a 20   layed out. */. 
172d0 20 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 09 09     int offset;..
172e0 09 2f 2a 20 4f 66 66 73 65 74 20 77 69 74 68 69  ./* Offset withi
172f0 6e 20 73 65 67 6d 65 6e 74 20 6f 66 20 66 69 72  n segment of fir
17300 73 74 20 63 68 61 72 61 63 74 65 72 0a 09 09 09  st character....
17310 09 20 2a 20 74 6f 20 63 6f 6e 73 69 64 65 72 2e  . * to consider.
17320 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 58   */.    int maxX
17330 3b 09 09 09 2f 2a 20 43 68 75 6e 6b 20 6d 75 73  ;.../* Chunk mus
17340 74 20 6e 6f 74 20 6f 63 63 75 70 79 20 70 69 78  t not occupy pix
17350 65 6c 73 20 61 74 20 74 68 69 73 0a 09 09 09 09  els at this.....
17360 20 2a 20 70 6f 73 69 74 69 6f 6e 20 6f 72 20 68   * position or h
17370 69 67 68 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e  igher. */.    in
17380 74 20 6d 61 78 43 68 61 72 73 3b 09 09 2f 2a 20  t maxChars;../* 
17390 43 68 75 6e 6b 20 6d 75 73 74 20 6e 6f 74 20 69  Chunk must not i
173a0 6e 63 6c 75 64 65 20 6d 6f 72 65 20 74 68 61 6e  nclude more than
173b0 20 74 68 69 73 0a 09 09 09 09 20 2a 20 6d 61 6e   this..... * man
173c0 79 20 63 68 61 72 61 63 74 65 72 73 2e 20 2a 2f  y characters. */
173d0 0a 20 20 20 20 69 6e 74 20 6e 6f 43 68 61 72 73  .    int noChars
173e0 59 65 74 3b 09 09 2f 2a 20 4e 6f 6e 2d 7a 65 72  Yet;../* Non-zer
173f0 6f 20 6d 65 61 6e 73 20 6e 6f 20 63 68 61 72 61  o means no chara
17400 63 74 65 72 73 20 68 61 76 65 20 62 65 65 6e 0a  cters have been.
17410 09 09 09 09 20 2a 20 61 73 73 69 67 6e 65 64 20  .... * assigned 
17420 74 6f 20 74 68 69 73 20 64 69 73 70 6c 61 79 20  to this display 
17430 6c 69 6e 65 20 79 65 74 2e 20 2a 2f 0a 20 20 20  line yet. */.   
17440 20 54 6b 5f 55 69 64 20 77 72 61 70 4d 6f 64 65   Tk_Uid wrapMode
17450 3b 09 09 2f 2a 20 48 6f 77 20 74 6f 20 68 61 6e  ;../* How to han
17460 64 6c 65 20 6c 69 6e 65 20 77 72 61 70 70 69 6e  dle line wrappin
17470 67 3a 20 74 6b 54 65 78 74 43 68 61 72 55 69 64  g: tkTextCharUid
17480 2c 0a 09 09 09 09 20 2a 20 74 6b 54 65 78 74 4e  ,..... * tkTextN
17490 6f 6e 65 55 69 64 2c 20 6f 72 20 74 6b 54 65 78  oneUid, or tkTex
174a0 74 57 6f 72 64 55 69 64 2e 20 2a 2f 0a 20 20 20  tWordUid. */.   
174b0 20 72 65 67 69 73 74 65 72 20 54 6b 54 65 78 74   register TkText
174c0 44 69 73 70 43 68 75 6e 6b 20 2a 63 68 75 6e 6b  DispChunk *chunk
174d0 50 74 72 3b 0a 09 09 09 09 2f 2a 20 53 74 72 75  Ptr;...../* Stru
174e0 63 74 75 72 65 20 74 6f 20 66 69 6c 6c 20 69 6e  cture to fill in
174f0 20 77 69 74 68 20 69 6e 66 6f 72 6d 61 74 69 6f   with informatio
17500 6e 0a 09 09 09 09 20 2a 20 61 62 6f 75 74 20 74  n..... * about t
17510 68 69 73 20 63 68 75 6e 6b 2e 20 20 54 68 65 20  his chunk.  The 
17520 78 20 66 69 65 6c 64 20 68 61 73 20 61 6c 72 65  x field has alre
17530 61 64 79 0a 09 09 09 09 20 2a 20 62 65 65 6e 20  ady..... * been 
17540 73 65 74 20 62 79 20 74 68 65 20 63 61 6c 6c 65  set by the calle
17550 72 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20  r. */.{.    int 
17560 6e 65 78 74 58 2c 20 63 68 61 72 73 54 68 61 74  nextX, charsThat
17570 46 69 74 2c 20 63 6f 75 6e 74 3b 0a 20 20 20 20  Fit, count;.    
17580 43 68 61 72 49 6e 66 6f 20 2a 63 69 50 74 72 3b  CharInfo *ciPtr;
17590 0a 20 20 20 20 63 68 61 72 20 2a 70 3b 0a 20 20  .    char *p;.  
175a0 20 20 54 6b 54 65 78 74 53 65 67 6d 65 6e 74 20    TkTextSegment 
175b0 2a 6e 65 78 74 50 74 72 3b 0a 0a 20 20 20 20 2f  *nextPtr;..    /
175c0 2a 0a 20 20 20 20 20 2a 20 46 69 67 75 72 65 20  *.     * Figure 
175d0 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 63 68 61  out how many cha
175e0 72 61 63 74 65 72 73 20 77 69 6c 6c 20 66 69 74  racters will fit
175f0 20 69 6e 20 74 68 65 20 73 70 61 63 65 20 77 65   in the space we
17600 27 76 65 20 67 6f 74 2e 0a 20 20 20 20 20 2a 20  've got..     * 
17610 49 6e 63 6c 75 64 65 20 74 68 65 20 6e 65 78 74  Include the next
17620 20 63 68 61 72 61 63 74 65 72 2c 20 65 76 65 6e   character, even
17630 20 74 68 6f 75 67 68 20 69 74 20 77 6f 6e 27 74   though it won't
17640 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 2c   fit completely,
17650 0a 20 20 20 20 20 2a 20 69 66 20 61 6e 79 20 6f  .     * if any o
17660 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
17670 69 73 20 74 72 75 65 3a 0a 20 20 20 20 20 2a 20  is true:.     * 
17680 20 20 28 61 29 20 74 68 65 20 63 68 75 6e 6b 20    (a) the chunk 
17690 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 68 61 72  contains no char
176a0 61 63 74 65 72 73 20 61 6e 64 20 74 68 65 20 64  acters and the d
176b0 69 73 70 6c 61 79 20 6c 69 6e 65 20 63 6f 6e 74  isplay line cont
176c0 61 69 6e 73 0a 20 20 20 20 20 2a 09 20 20 20 20  ains.     *.    
176d0 20 6e 6f 20 63 68 61 72 61 63 74 65 72 73 20 79   no characters y
176e0 65 74 20 28 69 2e 65 2e 20 74 68 65 20 6c 69 6e  et (i.e. the lin
176f0 65 20 69 73 6e 27 74 20 77 69 64 65 20 65 6e 6f  e isn't wide eno
17700 75 67 68 20 74 6f 20 68 6f 6c 64 0a 20 20 20 20  ugh to hold.    
17710 20 2a 09 20 20 20 20 20 65 76 65 6e 20 61 20 73   *.     even a s
17720 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 29  ingle character)
17730 2e 0a 20 20 20 20 20 2a 20 20 20 28 62 29 20 61  ..     *   (b) a
17740 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 69 78 65  t least one pixe
17750 6c 20 6f 66 20 74 68 65 20 63 68 61 72 61 63 74  l of the charact
17760 65 72 20 69 73 20 76 69 73 69 62 6c 65 2c 20 77  er is visible, w
17770 65 20 68 61 76 65 6e 27 74 0a 20 20 20 20 20 2a  e haven't.     *
17780 09 20 20 20 20 20 61 6c 72 65 61 64 79 20 65 78  .     already ex
17790 63 65 65 64 65 64 20 74 68 65 20 63 68 61 72 61  ceeded the chara
177a0 63 74 65 72 20 6c 69 6d 69 74 2c 20 61 6e 64 20  cter limit, and 
177b0 74 68 65 20 6e 65 78 74 20 63 68 61 72 61 63 74  the next charact
177c0 65 72 0a 20 20 20 20 20 2a 09 20 20 20 20 20 69  er.     *.     i
177d0 73 20 61 20 77 68 69 74 65 20 73 70 61 63 65 20  s a white space 
177e0 63 68 61 72 61 63 74 65 72 2e 0a 20 20 20 20 20  character..     
177f0 2a 2f 0a 0a 20 20 20 20 70 20 3d 20 73 65 67 50  */..    p = segP
17800 74 72 2d 3e 62 6f 64 79 2e 63 68 61 72 73 20 2b  tr->body.chars +
17810 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 63 68 61   offset;.    cha
17820 72 73 54 68 61 74 46 69 74 20 3d 20 54 6b 4d 65  rsThatFit = TkMe
17830 61 73 75 72 65 43 68 61 72 73 28 70 2c 20 6d 61  asureChars(p, ma
17840 78 43 68 61 72 73 2c 20 63 68 75 6e 6b 50 74 72  xChars, chunkPtr
17850 2d 3e 78 2c 0a 09 20 20 20 20 6d 61 78 58 2c 20  ->x,..    maxX, 
17860 30 2c 20 54 4b 5f 49 47 4e 4f 52 45 5f 54 41 42  0, TK_IGNORE_TAB
17870 53 2c 20 26 6e 65 78 74 58 29 3b 0a 20 20 20 20  S, &nextX);.    
17880 69 66 20 28 63 68 61 72 73 54 68 61 74 46 69 74  if (charsThatFit
17890 20 3c 20 6d 61 78 43 68 61 72 73 29 20 7b 0a 09   < maxChars) {..
178a0 69 66 20 28 28 63 68 61 72 73 54 68 61 74 46 69  if ((charsThatFi
178b0 74 20 3d 3d 20 30 29 20 26 26 20 6e 6f 43 68 61  t == 0) && noCha
178c0 72 73 59 65 74 29 20 7b 0a 09 20 20 20 20 63 68  rsYet) {..    ch
178d0 61 72 73 54 68 61 74 46 69 74 20 3d 20 31 3b 0a  arsThatFit = 1;.
178e0 09 20 20 20 20 54 6b 4d 65 61 73 75 72 65 43 68  .    TkMeasureCh
178f0 61 72 73 28 70 2c 20 31 2c 20 63 68 75 6e 6b 50  ars(p, 1, chunkP
17900 74 72 2d 3e 78 2c 20 49 4e 54 5f 4d 41 58 2c 20  tr->x, INT_MAX, 
17910 30 2c 0a 09 20 20 20 20 09 20 20 20 20 54 4b 5f  0,..    .    TK_
17920 49 47 4e 4f 52 45 5f 54 41 42 53 2c 20 26 6e 65  IGNORE_TABS, &ne
17930 78 74 58 29 3b 0a 09 7d 0a 09 69 66 20 28 70 5b  xtX);..}..if (p[
17940 63 68 61 72 73 54 68 61 74 46 69 74 5d 20 3d 3d  charsThatFit] ==
17950 20 27 5c 6e 27 29 20 7b 0a 09 20 20 20 20 2f 2a   '\n') {..    /*
17960 0a 09 20 20 20 20 20 2a 20 41 20 6e 65 77 6c 69  ..     * A newli
17970 6e 65 20 63 68 61 72 61 63 74 65 72 20 74 61 6b  ne character tak
17980 65 73 20 75 70 20 6e 6f 20 73 70 61 63 65 2c 20  es up no space, 
17990 73 6f 20 69 66 20 74 68 65 20 70 72 65 76 69 6f  so if the previo
179a0 75 73 0a 09 20 20 20 20 20 2a 20 63 68 61 72 61  us..     * chara
179b0 63 74 65 72 20 66 69 74 73 20 74 68 65 6e 20 73  cter fits then s
179c0 6f 20 64 6f 65 73 20 74 68 65 20 6e 65 77 6c 69  o does the newli
179d0 6e 65 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20  ne...     */... 
179e0 20 20 20 63 68 61 72 73 54 68 61 74 46 69 74 2b     charsThatFit+
179f0 2b 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 28  +;..} else if ((
17a00 6e 65 78 74 58 20 3c 20 6d 61 78 58 29 20 26 26  nextX < maxX) &&
17a10 20 28 69 73 73 70 61 63 65 28 55 43 48 41 52 28   (isspace(UCHAR(
17a20 70 5b 63 68 61 72 73 54 68 61 74 46 69 74 5d 29  p[charsThatFit])
17a30 29 29 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20  ))) {..    /*.. 
17a40 20 20 20 20 2a 20 53 70 61 63 65 20 63 68 61 72      * Space char
17a50 61 63 74 65 72 73 20 61 72 65 20 66 75 6e 6e 79  acters are funny
17a60 2c 20 69 6e 20 74 68 61 74 20 74 68 65 79 20 61  , in that they a
17a70 72 65 20 63 6f 6e 73 69 64 65 72 65 64 0a 09 20  re considered.. 
17a80 20 20 20 20 2a 20 74 6f 20 66 69 74 20 69 66 20      * to fit if 
17a90 74 68 65 72 65 20 69 73 20 61 74 20 6c 65 61 73  there is at leas
17aa0 74 20 6f 6e 65 20 70 69 78 65 6c 20 6f 66 20 73  t one pixel of s
17ab0 70 61 63 65 20 6c 65 66 74 20 6f 6e 20 74 68 65  pace left on the
17ac0 0a 09 20 20 20 20 20 2a 20 6c 69 6e 65 2e 20 20  ..     * line.  
17ad0 4a 75 73 74 20 67 69 76 65 20 74 68 65 20 73 70  Just give the sp
17ae0 61 63 65 20 63 68 61 72 61 63 74 65 72 20 77 68  ace character wh
17af0 61 74 65 76 65 72 20 73 70 61 63 65 20 69 73 20  atever space is 
17b00 6c 65 66 74 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a  left...     */..
17b10 09 20 20 20 20 6e 65 78 74 58 20 3d 20 6d 61 78  .    nextX = max
17b20 58 3b 0a 09 20 20 20 20 63 68 61 72 73 54 68 61  X;..    charsTha
17b30 74 46 69 74 2b 2b 3b 0a 09 7d 0a 09 69 66 20 28  tFit++;..}..if (
17b40 63 68 61 72 73 54 68 61 74 46 69 74 20 3d 3d 20  charsThatFit == 
17b50 30 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  0) {..    return
17b60 20 30 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20   0;..}.    }..  
17b70 20 20 2f 2a 0a 20 20 20 20 20 2a 20 46 69 6c 6c    /*.     * Fill
17b80 20 69 6e 20 74 68 65 20 63 68 75 6e 6b 20 73 74   in the chunk st
17b90 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 6f  ructure and allo
17ba0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
17bb0 69 7a 65 20 61 0a 20 20 20 20 20 2a 20 43 68 61  ize a.     * Cha
17bc0 72 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  rInfo structure.
17bd0 20 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 68    If the last ch
17be0 61 72 61 63 74 65 72 20 69 73 20 61 20 6e 65 77  aracter is a new
17bf0 6c 69 6e 65 0a 20 20 20 20 20 2a 20 74 68 65 6e  line.     * then
17c00 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f   don't bother to
17c10 20 64 69 73 70 6c 61 79 20 69 74 2e 0a 20 20 20   display it..   
17c20 20 20 2a 2f 0a 0a 20 20 20 20 63 68 75 6e 6b 50    */..    chunkP
17c30 74 72 2d 3e 64 69 73 70 6c 61 79 50 72 6f 63 20  tr->displayProc 
17c40 3d 20 43 68 61 72 44 69 73 70 6c 61 79 50 72 6f  = CharDisplayPro
17c50 63 3b 0a 20 20 20 20 63 68 75 6e 6b 50 74 72 2d  c;.    chunkPtr-
17c60 3e 75 6e 64 69 73 70 6c 61 79 50 72 6f 63 20 3d  >undisplayProc =
17c70 20 43 68 61 72 55 6e 64 69 73 70 6c 61 79 50 72   CharUndisplayPr
17c80 6f 63 3b 0a 20 20 20 20 63 68 75 6e 6b 50 74 72  oc;.    chunkPtr
17c90 2d 3e 6d 65 61 73 75 72 65 50 72 6f 63 20 3d 20  ->measureProc = 
17ca0 43 68 61 72 4d 65 61 73 75 72 65 50 72 6f 63 3b  CharMeasureProc;
17cb0 0a 20 20 20 20 63 68 75 6e 6b 50 74 72 2d 3e 62  .    chunkPtr->b
17cc0 62 6f 78 50 72 6f 63 20 3d 20 43 68 61 72 42 62  boxProc = CharBb
17cd0 6f 78 50 72 6f 63 3b 0a 20 20 20 20 63 68 75 6e  oxProc;.    chun
17ce0 6b 50 74 72 2d 3e 6e 75 6d 43 68 61 72 73 20 3d  kPtr->numChars =
17cf0 20 63 68 61 72 73 54 68 61 74 46 69 74 3b 0a 20   charsThatFit;. 
17d00 20 20 20 63 68 75 6e 6b 50 74 72 2d 3e 6d 69 6e     chunkPtr->min
17d10 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20  Height = 0;.    
17d20 63 68 75 6e 6b 50 74 72 2d 3e 77 69 64 74 68 20  chunkPtr->width 
17d30 3d 20 6e 65 78 74 58 20 2d 20 63 68 75 6e 6b 50  = nextX - chunkP
17d40 74 72 2d 3e 78 3b 0a 20 20 20 20 63 68 75 6e 6b  tr->x;.    chunk
17d50 50 74 72 2d 3e 62 72 65 61 6b 49 6e 64 65 78 20  Ptr->breakIndex 
17d60 3d 20 2d 31 3b 0a 20 20 20 20 63 69 50 74 72 20  = -1;.    ciPtr 
17d70 3d 20 28 43 68 61 72 49 6e 66 6f 20 2a 29 20 63  = (CharInfo *) c
17d80 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64  kalloc((unsigned
17d90 29 0a 09 20 20 20 20 28 73 69 7a 65 6f 66 28 43  )..    (sizeof(C
17da0 68 61 72 49 6e 66 6f 29 20 2d 20 33 20 2b 20 63  harInfo) - 3 + c
17db0 68 61 72 73 54 68 61 74 46 69 74 29 29 3b 0a 20  harsThatFit));. 
17dc0 20 20 20 63 68 75 6e 6b 50 74 72 2d 3e 63 6c 69     chunkPtr->cli
17dd0 65 6e 74 44 61 74 61 20 3d 20 28 43 6c 69 65 6e  entData = (Clien
17de0 74 44 61 74 61 29 20 63 69 50 74 72 3b 0a 20 20  tData) ciPtr;.  
17df0 20 20 63 69 50 74 72 2d 3e 6e 75 6d 43 68 61 72    ciPtr->numChar
17e00 73 20 3d 20 63 68 61 72 73 54 68 61 74 46 69 74  s = charsThatFit
17e10 3b 0a 20 20 20 20 73 74 72 6e 63 70 79 28 63 69  ;.    strncpy(ci
17e20 50 74 72 2d 3e 63 68 61 72 73 2c 20 70 2c 20 28  Ptr->chars, p, (
17e30 73 69 7a 65 5f 74 29 20 63 68 61 72 73 54 68 61  size_t) charsTha
17e40 74 46 69 74 29 3b 0a 20 20 20 20 69 66 20 28 70  tFit);.    if (p
17e50 5b 63 68 61 72 73 54 68 61 74 46 69 74 2d 31 5d  [charsThatFit-1]
17e60 20 3d 3d 20 27 5c 6e 27 29 20 7b 0a 09 63 69 50   == '\n') {..ciP
17e70 74 72 2d 3e 6e 75 6d 43 68 61 72 73 2d 2d 3b 0a  tr->numChars--;.
17e80 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
17e90 20 20 20 2a 20 43 6f 6d 70 75 74 65 20 61 20 62     * Compute a b
17ea0 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 2e 20 20  reak location.  
17eb0 49 66 20 77 65 27 72 65 20 69 6e 20 77 6f 72 64  If we're in word
17ec0 20 77 72 61 70 20 6d 6f 64 65 2c 20 61 0a 20 20   wrap mode, a.  
17ed0 20 20 20 2a 20 62 72 65 61 6b 20 63 61 6e 20 6f     * break can o
17ee0 63 63 75 72 20 61 66 74 65 72 20 61 6e 79 20 73  ccur after any s
17ef0 70 61 63 65 20 63 68 61 72 61 63 74 65 72 2c 20  pace character, 
17f00 6f 72 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  or at the end of
17f10 0a 20 20 20 20 20 2a 20 74 68 65 20 63 68 75 6e  .     * the chun
17f20 6b 20 69 66 20 74 68 65 20 6e 65 78 74 20 73 65  k if the next se
17f30 67 6d 65 6e 74 20 28 69 67 6e 6f 72 69 6e 67 20  gment (ignoring 
17f40 74 68 6f 73 65 20 77 69 74 68 20 7a 65 72 6f 20  those with zero 
17f50 73 69 7a 65 29 0a 20 20 20 20 20 2a 20 69 73 20  size).     * is 
17f60 6e 6f 74 20 61 20 63 68 61 72 61 63 74 65 72 20  not a character 
17f70 73 65 67 6d 65 6e 74 2e 0a 20 20 20 20 20 2a 2f  segment..     */
17f80 0a 0a 20 20 20 20 69 66 20 28 77 72 61 70 4d 6f  ..    if (wrapMo
17f90 64 65 20 21 3d 20 74 6b 54 65 78 74 57 6f 72 64  de != tkTextWord
17fa0 55 69 64 29 20 7b 0a 09 63 68 75 6e 6b 50 74 72  Uid) {..chunkPtr
17fb0 2d 3e 62 72 65 61 6b 49 6e 64 65 78 20 3d 20 63  ->breakIndex = c
17fc0 68 75 6e 6b 50 74 72 2d 3e 6e 75 6d 43 68 61 72  hunkPtr->numChar
17fd0 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  s;.    } else {.
17fe0 09 66 6f 72 20 28 63 6f 75 6e 74 20 3d 20 63 68  .for (count = ch
17ff0 61 72 73 54 68 61 74 46 69 74 2c 20 70 20 2b 3d  arsThatFit, p +=
18000 20 63 68 61 72 73 54 68 61 74 46 69 74 2d 31 3b   charsThatFit-1;
18010 20 63 6f 75 6e 74 20 3e 20 30 3b 0a 09 09 63 6f   count > 0;...co
18020 75 6e 74 2d 2d 2c 20 70 2d 2d 29 20 7b 0a 09 20  unt--, p--) {.. 
18030 20 20 20 69 66 20 28 69 73 73 70 61 63 65 28 55     if (isspace(U
18040 43 48 41 52 28 2a 70 29 29 29 20 7b 0a 09 09 63  CHAR(*p))) {...c
18050 68 75 6e 6b 50 74 72 2d 3e 62 72 65 61 6b 49 6e  hunkPtr->breakIn
18060 64 65 78 20 3d 20 63 6f 75 6e 74 3b 0a 09 09 62  dex = count;...b
18070 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  reak;..    }..}.
18080 09 69 66 20 28 28 63 68 61 72 73 54 68 61 74 46  .if ((charsThatF
18090 69 74 2b 6f 66 66 73 65 74 29 20 3d 3d 20 73 65  it+offset) == se
180a0 67 50 74 72 2d 3e 73 69 7a 65 29 20 7b 0a 09 20  gPtr->size) {.. 
180b0 20 20 20 66 6f 72 20 28 6e 65 78 74 50 74 72 20     for (nextPtr 
180c0 3d 20 73 65 67 50 74 72 2d 3e 6e 65 78 74 50 74  = segPtr->nextPt
180d0 72 3b 20 6e 65 78 74 50 74 72 20 21 3d 20 4e 55  r; nextPtr != NU
180e0 4c 4c 3b 0a 09 09 20 20 20 20 6e 65 78 74 50 74  LL;...    nextPt
180f0 72 20 3d 20 6e 65 78 74 50 74 72 2d 3e 6e 65 78  r = nextPtr->nex
18100 74 50 74 72 29 20 7b 0a 09 09 69 66 20 28 6e 65  tPtr) {...if (ne
18110 78 74 50 74 72 2d 3e 73 69 7a 65 20 21 3d 20 30  xtPtr->size != 0
18120 29 20 7b 0a 09 09 20 20 20 20 69 66 20 28 6e 65  ) {...    if (ne
18130 78 74 50 74 72 2d 3e 74 79 70 65 50 74 72 20 21  xtPtr->typePtr !
18140 3d 20 26 74 6b 54 65 78 74 43 68 61 72 54 79 70  = &tkTextCharTyp
18150 65 29 20 7b 0a 09 09 09 63 68 75 6e 6b 50 74 72  e) {....chunkPtr
18160 2d 3e 62 72 65 61 6b 49 6e 64 65 78 20 3d 20 63  ->breakIndex = c
18170 68 75 6e 6b 50 74 72 2d 3e 6e 75 6d 43 68 61 72  hunkPtr->numChar
18180 73 3b 0a 09 09 20 20 20 20 7d 0a 09 09 20 20 20  s;...    }...   
18190 20 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 20 20 20   break;...}..   
181a0 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20   }..}.    }.    
181b0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0c 0a 2f 2a  return 1;.}.../*
181c0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
181d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
181e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
181f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18200 2d 0a 20 2a 0a 20 2a 20 43 68 61 72 44 69 73 70  -. *. * CharDisp
18210 6c 61 79 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a  layProc --. *. *
18220 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
18230 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 69 73  is called to dis
18240 70 6c 61 79 20 61 20 63 68 61 72 61 63 74 65 72  play a character
18250 20 63 68 75 6e 6b 20 6f 6e 0a 20 2a 09 74 68 65   chunk on. *.the
18260 20 73 63 72 65 65 6e 20 6f 72 20 69 6e 20 61 6e   screen or in an
18270 20 6f 66 66 2d 73 63 72 65 65 6e 20 70 69 78 6d   off-screen pixm
18280 61 70 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ap.. *. * Result
18290 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
182a0 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
182b0 20 2a 09 47 72 61 70 68 69 63 73 20 61 72 65 20   *.Graphics are 
182c0 64 72 61 77 6e 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  drawn.. *. *----
182d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
182e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
182f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
18310 73 74 61 74 69 63 20 76 6f 69 64 0a 43 68 61 72  static void.Char
18320 44 69 73 70 6c 61 79 50 72 6f 63 28 63 68 75 6e  DisplayProc(chun
18330 6b 50 74 72 2c 20 78 2c 20 79 2c 20 77 69 6e 29  kPtr, x, y, win)
18340 0a 20 20 20 20 54 6b 54 65 78 74 44 69 73 70 43  .    TkTextDispC
18350 68 75 6e 6b 20 2a 63 68 75 6e 6b 50 74 72 3b 09  hunk *chunkPtr;.
18360 09 2f 2a 20 43 68 75 6e 6b 20 74 68 61 74 20 69  ./* Chunk that i
18370 73 20 74 6f 20 62 65 20 64 72 61 77 6e 2e 20 2a  s to be drawn. *
18380 2f 0a 20 20 20 20 69 6e 74 20 78 3b 09 09 09 09  /.    int x;....
18390 2f 2a 20 58 2d 70 6f 73 69 74 69 6f 6e 20 69 6e  /* X-position in
183a0 20 77 69 6e 20 61 74 20 77 68 69 63 68 20 74 6f   win at which to
183b0 0a 09 09 09 09 09 20 2a 20 64 72 61 77 20 74 68  ...... * draw th
183c0 69 73 20 63 68 75 6e 6b 20 28 6d 61 79 20 64 69  is chunk (may di
183d0 66 66 65 72 20 66 72 6f 6d 0a 09 09 09 09 09 20  ffer from...... 
183e0 2a 20 74 68 65 20 78 2d 70 6f 73 69 74 69 6f 6e  * the x-position
183f0 20 69 6e 20 74 68 65 20 63 68 75 6e 6b 20 62 65   in the chunk be
18400 63 61 75 73 65 0a 09 09 09 09 09 20 2a 20 6f 66  cause...... * of
18410 20 73 63 72 6f 6c 6c 69 6e 67 29 2e 20 2a 2f 0a   scrolling). */.
18420 20 20 20 20 69 6e 74 20 79 3b 09 09 09 09 2f 2a      int y;..../*
18430 20 59 2d 70 6f 73 69 74 69 6f 6e 20 61 74 20 77   Y-position at w
18440 68 69 63 68 20 74 6f 20 64 72 61 77 20 74 68 69  hich to draw thi
18450 73 0a 09 09 09 09 09 20 2a 20 63 68 75 6e 6b 20  s...... * chunk 
18460 69 6e 20 77 69 6e 2e 20 2a 2f 0a 20 20 20 20 54  in win. */.    T
18470 6b 5f 57 69 6e 64 6f 77 20 77 69 6e 3b 09 09 09  k_Window win;...
18480 2f 2a 20 57 69 6e 64 6f 77 20 69 6e 20 77 68 69  /* Window in whi
18490 63 68 20 74 6f 20 64 72 61 77 0a 09 09 09 09 09  ch to draw......
184a0 20 2a 20 63 68 75 6e 6b 2e 20 2a 2f 0a 7b 0a 20   * chunk. */.{. 
184b0 20 20 20 43 68 61 72 49 6e 66 6f 20 2a 63 69 50     CharInfo *ciP
184c0 74 72 20 3d 20 28 43 68 61 72 49 6e 66 6f 20 2a  tr = (CharInfo *
184d0 29 20 63 68 75 6e 6b 50 74 72 2d 3e 63 6c 69 65  ) chunkPtr->clie
184e0 6e 74 44 61 74 61 3b 0a 20 20 20 20 53 74 79 6c  ntData;.    Styl
184f0 65 20 2a 73 74 79 6c 65 50 74 72 3b 0a 20 20 20  e *stylePtr;.   
18500 20 53 74 79 6c 65 56 61 6c 75 65 73 20 2a 73 56   StyleValues *sV
18510 61 6c 75 65 50 74 72 3b 0a 0a 20 20 20 20 69 66  aluePtr;..    if
18520 20 28 28 78 20 2b 20 63 68 75 6e 6b 50 74 72 2d   ((x + chunkPtr-
18530 3e 77 69 64 74 68 29 20 3c 3d 20 30 29 20 7b 0a  >width) <= 0) {.
18540 09 2f 2a 0a 09 20 2a 20 54 68 65 20 63 68 75 6e  ./*.. * The chun
18550 6b 20 69 73 20 6f 66 66 2d 73 63 72 65 65 6e 2e  k is off-screen.
18560 0a 09 20 2a 2f 0a 0a 09 72 65 74 75 72 6e 3b 0a  .. */...return;.
18570 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 79 6c 65      }..    style
18580 50 74 72 20 3d 20 63 68 75 6e 6b 50 74 72 2d 3e  Ptr = chunkPtr->
18590 73 74 79 6c 65 50 74 72 3b 0a 20 20 20 20 73 56  stylePtr;.    sV
185a0 61 6c 75 65 50 74 72 20 3d 20 73 74 79 6c 65 50  aluePtr = styleP
185b0 74 72 2d 3e 73 56 61 6c 75 65 50 74 72 3b 0a 0a  tr->sValuePtr;..
185c0 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 44 72      /*.     * Dr
185d0 61 77 20 74 68 65 20 74 65 78 74 20 61 6e 64 20  aw the text and 
185e0 75 6e 64 65 72 6c 69 6e 65 20 66 6f 72 20 74 68  underline for th
185f0 69 73 20 63 68 75 6e 6b 2e 0a 20 20 20 20 20 2a  is chunk..     *
18600 2f 0a 0a 20 20 20 20 69 66 20 28 63 69 50 74 72  /..    if (ciPtr
18610 2d 3e 6e 75 6d 43 68 61 72 73 20 3e 20 30 29 20  ->numChars > 0) 
18620 7b 0a 09 54 6b 44 69 73 70 6c 61 79 43 68 61 72  {..TkDisplayChar
18630 73 28 77 69 6e 2c 20 73 74 79 6c 65 50 74 72 2d  s(win, stylePtr-
18640 3e 63 74 6b 53 74 79 6c 65 2c 0a 09 09 63 69 50  >ctkStyle,...ciP
18650 74 72 2d 3e 63 68 61 72 73 2c 20 63 69 50 74 72  tr->chars, ciPtr
18660 2d 3e 6e 75 6d 43 68 61 72 73 2c 20 78 2c 0a 09  ->numChars, x,..
18670 09 79 20 2b 20 2d 20 73 56 61 6c 75 65 50 74 72  .y + - sValuePtr
18680 2d 3e 6f 66 66 73 65 74 2c 20 78 20 2d 20 63 68  ->offset, x - ch
18690 75 6e 6b 50 74 72 2d 3e 78 2c 0a 09 09 54 4b 5f  unkPtr->x,...TK_
186a0 49 47 4e 4f 52 45 5f 54 41 42 53 29 3b 0a 20 20  IGNORE_TABS);.  
186b0 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d    }.}.../*. *---
186c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
186d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
186e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
186f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
18700 2a 20 43 68 61 72 55 6e 64 69 73 70 6c 61 79 50  * CharUndisplayP
18710 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  roc --. *. *.Thi
18720 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 63  s procedure is c
18730 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 68 61  alled when a cha
18740 72 61 63 74 65 72 20 63 68 75 6e 6b 20 69 73 20  racter chunk is 
18750 6e 6f 0a 20 2a 09 6c 6f 6e 67 65 72 20 67 6f 69  no. *.longer goi
18760 6e 67 20 74 6f 20 62 65 20 64 69 73 70 6c 61 79  ng to be display
18770 65 64 2e 20 20 49 74 20 66 72 65 65 73 20 75 70  ed.  It frees up
18780 20 72 65 73 6f 75 72 63 65 73 0a 20 2a 09 74 68   resources. *.th
18790 61 74 20 77 65 72 65 20 61 6c 6c 6f 63 61 74 65  at were allocate
187a0 64 20 74 6f 20 64 69 73 70 6c 61 79 20 74 68 65  d to display the
187b0 20 63 68 75 6e 6b 2e 0a 20 2a 0a 20 2a 20 52 65   chunk.. *. * Re
187c0 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  sults:. *.None..
187d0 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
187e0 74 73 3a 0a 20 2a 09 4d 65 6d 6f 72 79 20 61 6e  ts:. *.Memory an
187f0 64 20 6f 74 68 65 72 20 72 65 73 6f 75 72 63 65  d other resource
18800 73 20 67 65 74 20 66 72 65 65 64 2e 0a 20 2a 0a  s get freed.. *.
18810 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
18820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18850 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  . */..static voi
18860 64 0a 43 68 61 72 55 6e 64 69 73 70 6c 61 79 50  d.CharUndisplayP
18870 72 6f 63 28 74 65 78 74 50 74 72 2c 20 63 68 75  roc(textPtr, chu
18880 6e 6b 50 74 72 29 0a 20 20 20 20 54 6b 54 65 78  nkPtr).    TkTex
18890 74 20 2a 74 65 78 74 50 74 72 3b 09 09 09 2f 2a  t *textPtr;.../*
188a0 20 4f 76 65 72 61 6c 6c 20 69 6e 66 6f 72 6d 61   Overall informa
188b0 74 69 6f 6e 20 61 62 6f 75 74 20 74 65 78 74 0a  tion about text.
188c0 09 09 09 09 09 20 2a 20 77 69 64 67 65 74 2e 20  ..... * widget. 
188d0 2a 2f 0a 20 20 20 20 54 6b 54 65 78 74 44 69 73  */.    TkTextDis
188e0 70 43 68 75 6e 6b 20 2a 63 68 75 6e 6b 50 74 72  pChunk *chunkPtr
188f0 3b 09 09 2f 2a 20 43 68 75 6e 6b 20 74 68 61 74  ;../* Chunk that
18900 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20   is about to be 
18910 66 72 65 65 64 2e 20 2a 2f 0a 7b 0a 20 20 20 20  freed. */.{.    
18920 43 68 61 72 49 6e 66 6f 20 2a 63 69 50 74 72 20  CharInfo *ciPtr 
18930 3d 20 28 43 68 61 72 49 6e 66 6f 20 2a 29 20 63  = (CharInfo *) c
18940 68 75 6e 6b 50 74 72 2d 3e 63 6c 69 65 6e 74 44  hunkPtr->clientD
18950 61 74 61 3b 0a 0a 20 20 20 20 63 6b 66 72 65 65  ata;..    ckfree
18960 28 28 63 68 61 72 20 2a 29 20 63 69 50 74 72 29  ((char *) ciPtr)
18970 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
18980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
189a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
189b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
189c0 43 68 61 72 4d 65 61 73 75 72 65 50 72 6f 63 20  CharMeasureProc 
189d0 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
189e0 6f 63 65 64 75 72 65 20 69 73 20 63 61 6c 6c 65  ocedure is calle
189f0 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  d to determine w
18a00 68 69 63 68 20 63 68 61 72 61 63 74 65 72 20 69  hich character i
18a10 6e 0a 20 2a 09 61 20 63 68 61 72 61 63 74 65 72  n. *.a character
18a20 20 63 68 75 6e 6b 20 6c 69 65 73 20 6f 76 65 72   chunk lies over
18a30 20 61 20 67 69 76 65 6e 20 78 2d 63 6f 6f 72 64   a given x-coord
18a40 69 6e 61 74 65 2e 0a 20 2a 0a 20 2a 20 52 65 73  inate.. *. * Res
18a50 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 72 65 74  ults:. *.The ret
18a60 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
18a70 20 69 6e 64 65 78 20 2a 77 69 74 68 69 6e 20 74   index *within t
18a80 68 65 20 63 68 75 6e 6b 2a 20 6f 66 20 74 68 65  he chunk* of the
18a90 0a 20 2a 09 63 68 61 72 61 63 74 65 72 20 74 68  . *.character th
18aa0 61 74 20 63 6f 76 65 72 73 20 74 68 65 20 70 6f  at covers the po
18ab0 73 69 74 69 6f 6e 20 67 69 76 65 6e 20 62 79 20  sition given by 
18ac0 22 78 22 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  "x".. *. * Side 
18ad0 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
18ae0 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
18af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18b20 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69  -----. */..stati
18b30 63 20 69 6e 74 0a 43 68 61 72 4d 65 61 73 75 72  c int.CharMeasur
18b40 65 50 72 6f 63 28 63 68 75 6e 6b 50 74 72 2c 20  eProc(chunkPtr, 
18b50 78 29 0a 20 20 20 20 54 6b 54 65 78 74 44 69 73  x).    TkTextDis
18b60 70 43 68 75 6e 6b 20 2a 63 68 75 6e 6b 50 74 72  pChunk *chunkPtr
18b70 3b 09 09 2f 2a 20 43 68 75 6e 6b 20 63 6f 6e 74  ;../* Chunk cont
18b80 61 69 6e 69 6e 67 20 64 65 73 69 72 65 64 20 63  aining desired c
18b90 6f 6f 72 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  oord. */.    int
18ba0 20 78 3b 09 09 09 09 2f 2a 20 58 2d 63 6f 6f 72   x;..../* X-coor
18bb0 64 69 6e 61 74 65 2c 20 69 6e 20 73 61 6d 65 20  dinate, in same 
18bc0 63 6f 6f 72 64 69 6e 61 74 65 0a 09 09 09 09 09  coordinate......
18bd0 20 2a 20 73 79 73 74 65 6d 20 61 73 20 63 68 75   * system as chu
18be0 6e 6b 50 74 72 2d 3e 78 2e 20 2a 2f 0a 7b 0a 20  nkPtr->x. */.{. 
18bf0 20 20 20 43 68 61 72 49 6e 66 6f 20 2a 63 69 50     CharInfo *ciP
18c00 74 72 20 3d 20 28 43 68 61 72 49 6e 66 6f 20 2a  tr = (CharInfo *
18c10 29 20 63 68 75 6e 6b 50 74 72 2d 3e 63 6c 69 65  ) chunkPtr->clie
18c20 6e 74 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20  ntData;.    int 
18c30 65 6e 64 58 3b 0a 0a 20 20 20 20 72 65 74 75 72  endX;..    retur
18c40 6e 20 54 6b 4d 65 61 73 75 72 65 43 68 61 72 73  n TkMeasureChars
18c50 28 63 69 50 74 72 2d 3e 63 68 61 72 73 2c 20 63  (ciPtr->chars, c
18c60 68 75 6e 6b 50 74 72 2d 3e 6e 75 6d 43 68 61 72  hunkPtr->numChar
18c70 73 2d 31 2c 0a 20 20 20 20 09 20 20 20 20 63 68  s-1,.    .    ch
18c80 75 6e 6b 50 74 72 2d 3e 78 2c 20 78 2c 20 30 2c  unkPtr->x, x, 0,
18c90 20 54 4b 5f 49 47 4e 4f 52 45 5f 54 41 42 53 2c   TK_IGNORE_TABS,
18ca0 20 26 65 6e 64 58 29 3b 0a 7d 0a 0c 0a 2f 2a 0a   &endX);.}.../*.
18cb0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
18cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18cf0 0a 20 2a 0a 20 2a 20 43 68 61 72 42 62 6f 78 50  . *. * CharBboxP
18d00 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  roc --. *. *.Thi
18d10 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 63  s procedure is c
18d20 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 75 74 65  alled to compute
18d30 20 74 68 65 20 62 6f 75 6e 64 69 6e 67 20 62 6f   the bounding bo
18d40 78 20 6f 66 0a 20 2a 09 74 68 65 20 61 72 65 61  x of. *.the area
18d50 20 6f 63 63 75 70 69 65 64 20 62 79 20 61 20 73   occupied by a s
18d60 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 2e  ingle character.
18d70 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
18d80 20 2a 09 54 68 65 72 65 20 69 73 20 6e 6f 20 72   *.There is no r
18d90 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 20 2a 78  eturn value.  *x
18da0 50 74 72 20 61 6e 64 20 2a 79 50 74 72 20 61 72  Ptr and *yPtr ar
18db0 65 20 66 69 6c 6c 65 64 20 69 6e 0a 20 2a 09 77  e filled in. *.w
18dc0 69 74 68 20 74 68 65 20 63 6f 6f 72 64 69 6e 61  ith the coordina
18dd0 74 65 73 20 6f 66 20 74 68 65 20 75 70 70 65 72  tes of the upper
18de0 20 6c 65 66 74 20 63 6f 72 6e 65 72 20 6f 66 20   left corner of 
18df0 74 68 65 0a 20 2a 09 63 68 61 72 61 63 74 65 72  the. *.character
18e00 2c 20 61 6e 64 20 2a 77 69 64 74 68 50 74 72 20  , and *widthPtr 
18e10 61 6e 64 20 2a 68 65 69 67 68 74 50 74 72 20 61  and *heightPtr a
18e20 72 65 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74  re filled in wit
18e30 68 0a 20 2a 09 74 68 65 20 64 69 6d 65 6e 73 69  h. *.the dimensi
18e40 6f 6e 73 20 6f 66 20 74 68 65 20 63 68 61 72 61  ons of the chara
18e50 63 74 65 72 20 69 6e 20 70 69 78 65 6c 73 2e 20  cter in pixels. 
18e60 20 4e 6f 74 65 3a 20 20 6e 6f 74 20 61 6c 6c 0a   Note:  not all.
18e70 20 2a 09 6f 66 20 74 68 65 20 72 65 74 75 72 6e   *.of the return
18e80 65 64 20 62 62 6f 78 20 69 73 20 6e 65 63 65 73  ed bbox is neces
18e90 73 61 72 69 6c 79 20 76 69 73 69 62 6c 65 20 6f  sarily visible o
18ea0 6e 20 74 68 65 20 73 63 72 65 65 6e 0a 20 2a 09  n the screen. *.
18eb0 28 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 70  (the rightmost p
18ec0 61 72 74 20 6d 69 67 68 74 20 62 65 20 6f 66 66  art might be off
18ed0 2d 73 63 72 65 65 6e 20 74 6f 20 74 68 65 20 72  -screen to the r
18ee0 69 67 68 74 2c 0a 20 2a 09 61 6e 64 20 74 68 65  ight,. *.and the
18ef0 20 62 6f 74 74 6f 6d 6d 6f 73 74 20 70 61 72 74   bottommost part
18f00 20 6d 69 67 68 74 20 62 65 20 6f 66 66 2d 73 63   might be off-sc
18f10 72 65 65 6e 20 74 6f 20 74 68 65 20 62 6f 74 74  reen to the bott
18f20 6f 6d 29 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  om).. *. * Side 
18f30 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
18f40 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
18f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18f80 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69  -----. */..stati
18f90 63 20 76 6f 69 64 0a 43 68 61 72 42 62 6f 78 50  c void.CharBboxP
18fa0 72 6f 63 28 63 68 75 6e 6b 50 74 72 2c 20 69 6e  roc(chunkPtr, in
18fb0 64 65 78 2c 20 79 2c 20 78 50 74 72 2c 20 79 50  dex, y, xPtr, yP
18fc0 74 72 2c 20 77 69 64 74 68 50 74 72 2c 20 68 65  tr, widthPtr, he
18fd0 69 67 68 74 50 74 72 29 0a 20 20 20 20 54 6b 54  ightPtr).    TkT
18fe0 65 78 74 44 69 73 70 43 68 75 6e 6b 20 2a 63 68  extDispChunk *ch
18ff0 75 6e 6b 50 74 72 3b 09 09 2f 2a 20 43 68 75 6e  unkPtr;../* Chun
19000 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 64 65 73  k containing des
19010 69 72 65 64 20 63 68 61 72 2e 20 2a 2f 0a 20 20  ired char. */.  
19020 20 20 69 6e 74 20 69 6e 64 65 78 3b 09 09 09 09    int index;....
19030 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 65 73 69  /* Index of desi
19040 72 65 64 20 63 68 61 72 61 63 74 65 72 20 77 69  red character wi
19050 74 68 69 6e 0a 09 09 09 09 09 20 2a 20 74 68 65  thin...... * the
19060 20 63 68 75 6e 6b 2e 20 2a 2f 0a 20 20 20 20 69   chunk. */.    i
19070 6e 74 20 79 3b 09 09 09 09 2f 2a 20 54 6f 70 6d  nt y;..../* Topm
19080 6f 73 74 20 70 69 78 65 6c 20 69 6e 20 61 72 65  ost pixel in are
19090 61 20 61 6c 6c 6f 63 61 74 65 64 0a 09 09 09 09  a allocated.....
190a0 09 20 2a 20 66 6f 72 20 74 68 69 73 20 6c 69 6e  . * for this lin
190b0 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 78  e. */.    int *x
190c0 50 74 72 2c 20 2a 79 50 74 72 3b 09 09 09 2f 2a  Ptr, *yPtr;.../*
190d0 20 47 65 74 73 20 66 69 6c 6c 65 64 20 69 6e 20   Gets filled in 
190e0 77 69 74 68 20 63 6f 6f 72 64 73 20 6f 66 0a 09  with coords of..
190f0 09 09 09 09 20 2a 20 63 68 61 72 61 63 74 65 72  .... * character
19100 27 73 20 75 70 70 65 72 2d 6c 65 66 74 20 70 69  's upper-left pi
19110 78 65 6c 2e 20 0a 09 09 09 09 09 20 2a 20 58 2d  xel. ...... * X-
19120 63 6f 6f 72 64 20 69 73 20 69 6e 20 73 61 6d 65  coord is in same
19130 20 63 6f 6f 72 64 69 6e 61 74 65 0a 09 09 09 09   coordinate.....
19140 09 20 2a 20 73 79 73 74 65 6d 20 61 73 20 63 68  . * system as ch
19150 75 6e 6b 50 74 72 2d 3e 78 2e 20 2a 2f 0a 20 20  unkPtr->x. */.  
19160 20 20 69 6e 74 20 2a 77 69 64 74 68 50 74 72 3b    int *widthPtr;
19170 09 09 09 2f 2a 20 47 65 74 73 20 66 69 6c 6c 65  .../* Gets fille
19180 64 20 69 6e 20 77 69 74 68 20 77 69 64 74 68 20  d in with width 
19190 6f 66 0a 09 09 09 09 09 20 2a 20 63 68 61 72 61  of...... * chara
191a0 63 74 65 72 2c 20 69 6e 20 70 69 78 65 6c 73 2e  cter, in pixels.
191b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 68 65 69   */.    int *hei
191c0 67 68 74 50 74 72 3b 09 09 09 2f 2a 20 47 65 74  ghtPtr;.../* Get
191d0 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68  s filled in with
191e0 20 68 65 69 67 68 74 20 6f 66 0a 09 09 09 09 09   height of......
191f0 20 2a 20 63 68 61 72 61 63 74 65 72 2c 20 69 6e   * character, in
19200 20 70 69 78 65 6c 73 2e 20 2a 2f 0a 7b 0a 20 20   pixels. */.{.  
19210 20 20 43 68 61 72 49 6e 66 6f 20 2a 63 69 50 74    CharInfo *ciPt
19220 72 20 3d 20 28 43 68 61 72 49 6e 66 6f 20 2a 29  r = (CharInfo *)
19230 20 63 68 75 6e 6b 50 74 72 2d 3e 63 6c 69 65 6e   chunkPtr->clien
19240 74 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 6d  tData;.    int m
19250 61 78 58 3b 0a 0a 20 20 20 20 6d 61 78 58 20 3d  axX;..    maxX =
19260 20 63 68 75 6e 6b 50 74 72 2d 3e 77 69 64 74 68   chunkPtr->width
19270 20 2b 20 63 68 75 6e 6b 50 74 72 2d 3e 78 3b 0a   + chunkPtr->x;.
19280 20 20 20 20 54 6b 4d 65 61 73 75 72 65 43 68 61      TkMeasureCha
19290 72 73 28 63 69 50 74 72 2d 3e 63 68 61 72 73 2c  rs(ciPtr->chars,
192a0 20 69 6e 64 65 78 2c 20 63 68 75 6e 6b 50 74 72   index, chunkPtr
192b0 2d 3e 78 2c 20 31 30 30 30 30 30 30 2c 20 30 2c  ->x, 1000000, 0,
192c0 0a 20 20 20 20 09 20 20 20 20 54 4b 5f 49 47 4e  .    .    TK_IGN
192d0 4f 52 45 5f 54 41 42 53 2c 20 78 50 74 72 29 3b  ORE_TABS, xPtr);
192e0 0a 20 20 20 20 69 66 20 28 69 6e 64 65 78 20 3d  .    if (index =
192f0 3d 20 63 69 50 74 72 2d 3e 6e 75 6d 43 68 61 72  = ciPtr->numChar
19300 73 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 68 69  s) {../*.. * Thi
19310 73 20 73 69 74 75 61 74 69 6f 6e 20 6f 6e 6c 79  s situation only
19320 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 20   happens if the 
19330 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 69  last character i
19340 6e 20 61 20 6c 69 6e 65 0a 09 20 2a 20 69 73 20  n a line.. * is 
19350 61 20 73 70 61 63 65 20 63 68 61 72 61 63 74 65  a space characte
19360 72 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  r, in which case
19370 20 69 74 20 61 62 73 6f 72 62 73 20 61 6c 6c 20   it absorbs all 
19380 6f 66 20 74 68 65 0a 09 20 2a 20 65 78 74 72 61  of the.. * extra
19390 20 73 70 61 63 65 20 69 6e 20 74 68 65 20 6c 69   space in the li
193a0 6e 65 20 28 73 65 65 20 54 6b 54 65 78 74 43 68  ne (see TkTextCh
193b0 61 72 4c 61 79 6f 75 74 50 72 6f 63 29 2e 0a 09  arLayoutProc)...
193c0 20 2a 2f 0a 0a 09 2a 77 69 64 74 68 50 74 72 20   */...*widthPtr 
193d0 3d 20 6d 61 78 58 20 2d 20 2a 78 50 74 72 3b 0a  = maxX - *xPtr;.
193e0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28      } else if ((
193f0 63 69 50 74 72 2d 3e 63 68 61 72 73 5b 69 6e 64  ciPtr->chars[ind
19400 65 78 5d 20 3d 3d 20 27 5c 74 27 29 0a 09 20 20  ex] == '\t')..  
19410 20 20 26 26 20 28 69 6e 64 65 78 20 3d 3d 20 28    && (index == (
19420 63 69 50 74 72 2d 3e 6e 75 6d 43 68 61 72 73 2d  ciPtr->numChars-
19430 31 29 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54  1))) {../*.. * T
19440 68 65 20 64 65 73 69 72 65 64 20 63 68 61 72 61  he desired chara
19450 63 74 65 72 20 69 73 20 61 20 74 61 62 20 63 68  cter is a tab ch
19460 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72  aracter that ter
19470 6d 69 6e 61 74 65 73 20 61 0a 09 20 2a 20 63 68  minates a.. * ch
19480 75 6e 6b 3b 20 20 67 69 76 65 20 69 74 20 61 6c  unk;  give it al
19490 6c 20 74 68 65 20 73 70 61 63 65 20 6c 65 66 74  l the space left
194a0 20 69 6e 20 74 68 65 20 63 68 75 6e 6b 2e 0a 09   in the chunk...
194b0 20 2a 2f 0a 0a 09 2a 77 69 64 74 68 50 74 72 20   */...*widthPtr 
194c0 3d 20 6d 61 78 58 20 2d 20 2a 78 50 74 72 3b 0a  = maxX - *xPtr;.
194d0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 6b      } else {..Tk
194e0 4d 65 61 73 75 72 65 43 68 61 72 73 28 63 69 50  MeasureChars(ciP
194f0 74 72 2d 3e 63 68 61 72 73 20 2b 20 69 6e 64 65  tr->chars + inde
19500 78 2c 20 31 2c 0a 09 09 2a 78 50 74 72 2c 20 31  x, 1,...*xPtr, 1
19510 30 30 30 30 30 30 2c 20 30 2c 20 54 4b 5f 49 47  000000, 0, TK_IG
19520 4e 4f 52 45 5f 54 41 42 53 2c 20 77 69 64 74 68  NORE_TABS, width
19530 50 74 72 29 3b 0a 09 69 66 20 28 2a 77 69 64 74  Ptr);..if (*widt
19540 68 50 74 72 20 3e 20 6d 61 78 58 29 20 7b 0a 09  hPtr > maxX) {..
19550 20 20 20 20 2a 77 69 64 74 68 50 74 72 20 3d 20      *widthPtr = 
19560 6d 61 78 58 20 2d 20 2a 78 50 74 72 3b 0a 09 7d  maxX - *xPtr;..}
19570 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2a 77 69   else {..    *wi
19580 64 74 68 50 74 72 20 2d 3d 20 2a 78 50 74 72 3b  dthPtr -= *xPtr;
19590 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 79  ..}.    }.    *y
195a0 50 74 72 20 3d 20 79 3b 0a 20 20 20 20 2a 68 65  Ptr = y;.    *he
195b0 69 67 68 74 50 74 72 20 3d 20 31 3b 0a 7d 0a 0c  ightPtr = 1;.}..
195c0 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
195d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
195e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
195f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
19610 20 2a 20 41 64 6a 75 73 74 46 6f 72 54 61 62 20   * AdjustForTab 
19620 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
19630 6f 63 65 64 75 72 65 20 69 73 20 63 61 6c 6c 65  ocedure is calle
19640 64 20 74 6f 20 6d 6f 76 65 20 61 20 73 65 72 69  d to move a seri
19650 65 73 20 6f 66 20 63 68 75 6e 6b 73 20 72 69 67  es of chunks rig
19660 68 74 0a 20 2a 09 69 6e 20 6f 72 64 65 72 20 74  ht. *.in order t
19670 6f 20 61 6c 69 67 6e 20 74 68 65 6d 20 77 69 74  o align them wit
19680 68 20 61 20 74 61 62 20 73 74 6f 70 2e 0a 20 2a  h a tab stop.. *
19690 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
196a0 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  None.. *. * Side
196b0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65   effects:. *.The
196c0 20 77 69 64 74 68 20 6f 66 20 63 68 75 6e 6b 50   width of chunkP
196d0 74 72 20 67 65 74 73 20 61 64 6a 75 73 74 65 64  tr gets adjusted
196e0 20 73 6f 20 74 68 61 74 20 69 74 20 61 62 73 6f   so that it abso
196f0 72 62 73 20 74 68 65 0a 20 2a 09 65 78 74 72 61  rbs the. *.extra
19700 20 73 70 61 63 65 20 64 75 65 20 74 6f 20 74 68   space due to th
19710 65 20 74 61 62 2e 20 20 54 68 65 20 78 20 6c 6f  e tab.  The x lo
19720 63 61 74 69 6f 6e 73 20 69 6e 20 61 6c 6c 20 74  cations in all t
19730 68 65 20 63 68 75 6e 6b 73 0a 20 2a 09 61 66 74  he chunks. *.aft
19740 65 72 20 63 68 75 6e 6b 50 74 72 20 61 72 65 20  er chunkPtr are 
19750 61 64 6a 75 73 74 65 64 20 72 69 67 68 74 77 61  adjusted rightwa
19760 72 64 20 74 6f 20 61 6c 69 67 6e 20 77 69 74 68  rd to align with
19770 20 74 68 65 20 74 61 62 0a 20 2a 09 73 74 6f 70   the tab. *.stop
19780 20 67 69 76 65 6e 20 62 79 20 74 61 62 41 72 72   given by tabArr
19790 61 79 50 74 72 20 61 6e 64 20 69 6e 64 65 78 2e  ayPtr and index.
197a0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
197b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
197c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
197d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
197e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
197f0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 41 64  ..static void.Ad
19800 6a 75 73 74 46 6f 72 54 61 62 28 74 65 78 74 50  justForTab(textP
19810 74 72 2c 20 74 61 62 41 72 72 61 79 50 74 72 2c  tr, tabArrayPtr,
19820 20 69 6e 64 65 78 2c 20 63 68 75 6e 6b 50 74 72   index, chunkPtr
19830 29 0a 20 20 20 20 54 6b 54 65 78 74 20 2a 74 65  ).    TkText *te
19840 78 74 50 74 72 3b 09 09 09 2f 2a 20 49 6e 66 6f  xtPtr;.../* Info
19850 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
19860 65 20 74 65 78 74 20 77 69 64 67 65 74 20 61 73  e text widget as
19870 0a 09 09 09 09 09 20 2a 20 61 20 77 68 6f 6c 65  ...... * a whole
19880 2e 20 2a 2f 0a 20 20 20 20 54 6b 54 65 78 74 54  . */.    TkTextT
19890 61 62 41 72 72 61 79 20 2a 74 61 62 41 72 72 61  abArray *tabArra
198a0 79 50 74 72 3b 09 2f 2a 20 49 6e 66 6f 72 6d 61  yPtr;./* Informa
198b0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 74  tion about the t
198c0 61 62 20 73 74 6f 70 73 0a 09 09 09 09 09 20 2a  ab stops...... *
198d0 20 74 68 61 74 20 61 70 70 6c 79 20 74 6f 20 74   that apply to t
198e0 68 69 73 20 6c 69 6e 65 2e 20 20 4d 61 79 20 62  his line.  May b
198f0 65 0a 09 09 09 09 09 20 2a 20 4e 55 4c 4c 20 74  e...... * NULL t
19900 6f 20 69 6e 64 69 63 61 74 65 20 64 65 66 61 75  o indicate defau
19910 6c 74 20 74 61 62 62 69 6e 67 0a 09 09 09 09 09  lt tabbing......
19920 20 2a 20 28 65 76 65 72 79 20 38 20 63 68 61 72   * (every 8 char
19930 73 29 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  s). */.    int i
19940 6e 64 65 78 3b 09 09 09 09 2f 2a 20 49 6e 64 65  ndex;..../* Inde
19950 78 20 6f 66 20 63 75 72 72 65 6e 74 20 74 61 62  x of current tab
19960 20 73 74 6f 70 2e 20 2a 2f 0a 20 20 20 20 54 6b   stop. */.    Tk
19970 54 65 78 74 44 69 73 70 43 68 75 6e 6b 20 2a 63  TextDispChunk *c
19980 68 75 6e 6b 50 74 72 3b 09 09 2f 2a 20 43 68 75  hunkPtr;../* Chu
19990 6e 6b 20 77 68 6f 73 65 20 6c 61 73 74 20 63 68  nk whose last ch
199a0 61 72 61 63 74 65 72 20 69 73 0a 09 09 09 09 09  aracter is......
199b0 20 2a 20 74 68 65 20 74 61 62 3b 20 20 74 68 65   * the tab;  the
199c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 75 6e 6b   following chunk
199d0 73 0a 09 09 09 09 09 20 2a 20 63 6f 6e 74 61 69  s...... * contai
199e0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  n information to
199f0 20 62 65 20 73 68 69 66 74 65 64 0a 09 09 09 09   be shifted.....
19a00 09 20 2a 20 72 69 67 68 74 2e 20 2a 2f 0a 0a 7b  . * right. */..{
19a10 0a 20 20 20 20 69 6e 74 20 78 2c 20 64 65 73 69  .    int x, desi
19a20 72 65 64 2c 20 64 65 6c 74 61 2c 20 77 69 64 74  red, delta, widt
19a30 68 2c 20 64 65 63 69 6d 61 6c 2c 20 69 2c 20 67  h, decimal, i, g
19a40 6f 74 44 69 67 69 74 3b 0a 20 20 20 20 54 6b 54  otDigit;.    TkT
19a50 65 78 74 44 69 73 70 43 68 75 6e 6b 20 2a 63 68  extDispChunk *ch
19a60 75 6e 6b 50 74 72 32 2c 20 2a 64 65 63 69 6d 61  unkPtr2, *decima
19a70 6c 43 68 75 6e 6b 50 74 72 3b 0a 20 20 20 20 54  lChunkPtr;.    T
19a80 6b 54 65 78 74 54 61 62 20 2a 74 61 62 50 74 72  kTextTab *tabPtr
19a90 3b 0a 20 20 20 20 43 68 61 72 49 6e 66 6f 20 2a  ;.    CharInfo *
19aa0 63 69 50 74 72 20 3d 20 4e 55 4c 4c 3b 09 09 2f  ciPtr = NULL;../
19ab0 2a 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  * Initialization
19ac0 20 6e 65 65 64 65 64 20 6f 6e 6c 79 20 74 6f 0a   needed only to.
19ad0 09 09 09 09 09 20 2a 20 70 72 65 76 65 6e 74 20  ..... * prevent 
19ae0 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
19af0 73 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 61  s. */.    int ta
19b00 62 58 2c 20 70 72 65 76 3b 0a 20 20 20 20 63 68  bX, prev;.    ch
19b10 61 72 20 2a 70 3b 0a 20 20 20 20 54 6b 54 65 78  ar *p;.    TkTex
19b20 74 54 61 62 41 6c 69 67 6e 20 61 6c 69 67 6e 6d  tTabAlign alignm
19b30 65 6e 74 3b 0a 0a 20 20 20 20 69 66 20 28 63 68  ent;..    if (ch
19b40 75 6e 6b 50 74 72 2d 3e 6e 65 78 74 50 74 72 20  unkPtr->nextPtr 
19b50 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09  == NULL) {../*..
19b60 20 2a 20 4e 6f 74 68 69 6e 67 20 61 66 74 65 72   * Nothing after
19b70 20 74 68 65 20 61 63 74 75 61 6c 20 74 61 62 3b   the actual tab;
19b80 20 20 6a 75 73 74 20 72 65 74 75 72 6e 2e 0a 09    just return...
19b90 20 2a 2f 0a 0a 09 72 65 74 75 72 6e 3b 0a 20 20   */...return;.  
19ba0 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
19bb0 20 2a 20 49 66 20 6e 6f 20 74 61 62 20 69 6e 66   * If no tab inf
19bc0 6f 72 6d 61 74 69 6f 6e 20 68 61 73 20 62 65 65  ormation has bee
19bd0 6e 20 67 69 76 65 6e 2c 20 64 6f 20 74 68 65 20  n given, do the 
19be0 75 73 75 61 6c 20 74 68 69 6e 67 3a 0a 20 20 20  usual thing:.   
19bf0 20 20 2a 20 72 6f 75 6e 64 20 75 70 20 74 6f 20    * round up to 
19c00 74 68 65 20 6e 65 78 74 20 62 6f 75 6e 64 61 72  the next boundar
19c10 79 20 6f 66 20 38 20 61 76 65 72 61 67 65 2d 73  y of 8 average-s
19c20 69 7a 65 64 20 63 68 61 72 61 63 74 65 72 73 2e  ized characters.
19c30 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 78 20  .     */..    x 
19c40 3d 20 63 68 75 6e 6b 50 74 72 2d 3e 6e 65 78 74  = chunkPtr->next
19c50 50 74 72 2d 3e 78 3b 0a 20 20 20 20 69 66 20 28  Ptr->x;.    if (
19c60 28 74 61 62 41 72 72 61 79 50 74 72 20 3d 3d 20  (tabArrayPtr == 
19c70 4e 55 4c 4c 29 20 7c 7c 20 28 74 61 62 41 72 72  NULL) || (tabArr
19c80 61 79 50 74 72 2d 3e 6e 75 6d 54 61 62 73 20 3d  ayPtr->numTabs =
19c90 3d 20 30 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20  = 0)) {../*.. * 
19ca0 4e 6f 20 74 61 62 20 69 6e 66 6f 72 6d 61 74 69  No tab informati
19cb0 6f 6e 20 68 61 73 20 62 65 65 6e 20 67 69 76 65  on has been give
19cc0 6e 2c 20 73 6f 20 75 73 65 20 74 68 65 20 64 65  n, so use the de
19cd0 66 61 75 6c 74 0a 09 20 2a 20 69 6e 74 65 72 70  fault.. * interp
19ce0 72 65 74 61 74 69 6f 6e 20 6f 66 20 74 61 62 73  retation of tabs
19cf0 2e 0a 09 20 2a 2f 0a 0a 09 54 6b 4d 65 61 73 75  ... */...TkMeasu
19d00 72 65 43 68 61 72 73 28 22 5c 74 22 2c 20 31 2c  reChars("\t", 1,
19d10 20 78 2c 20 49 4e 54 5f 4d 41 58 2c 20 30 2c 20   x, INT_MAX, 0, 
19d20 30 2c 20 26 64 65 73 69 72 65 64 29 3b 0a 09 67  0, &desired);..g
19d30 6f 74 6f 20 75 70 64 61 74 65 3b 0a 20 20 20 20  oto update;.    
19d40 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 64 65 78  }..    if (index
19d50 20 3c 20 74 61 62 41 72 72 61 79 50 74 72 2d 3e   < tabArrayPtr->
19d60 6e 75 6d 54 61 62 73 29 20 7b 0a 09 61 6c 69 67  numTabs) {..alig
19d70 6e 6d 65 6e 74 20 3d 20 74 61 62 41 72 72 61 79  nment = tabArray
19d80 50 74 72 2d 3e 74 61 62 73 5b 69 6e 64 65 78 5d  Ptr->tabs[index]
19d90 2e 61 6c 69 67 6e 6d 65 6e 74 3b 0a 09 74 61 62  .alignment;..tab
19da0 58 20 3d 20 74 61 62 41 72 72 61 79 50 74 72 2d  X = tabArrayPtr-
19db0 3e 74 61 62 73 5b 69 6e 64 65 78 5d 2e 6c 6f 63  >tabs[index].loc
19dc0 61 74 69 6f 6e 3b 0a 20 20 20 20 7d 20 65 6c 73  ation;.    } els
19dd0 65 20 7b 0a 09 2f 2a 0a 09 20 2a 20 52 61 6e 20  e {../*.. * Ran 
19de0 6f 75 74 20 6f 66 20 74 61 62 20 73 74 6f 70 73  out of tab stops
19df0 3b 20 20 63 6f 6d 70 75 74 65 20 61 20 74 61 62  ;  compute a tab
19e00 20 70 6f 73 69 74 69 6f 6e 20 62 79 20 65 78 74   position by ext
19e10 72 61 70 6f 6c 61 74 69 6e 67 0a 09 20 2a 20 66  rapolating.. * f
19e20 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 74 77 6f  rom the last two
19e30 20 74 61 62 20 70 6f 73 69 74 69 6f 6e 73 2e 0a   tab positions..
19e40 09 20 2a 2f 0a 0a 09 69 66 20 28 74 61 62 41 72  . */...if (tabAr
19e50 72 61 79 50 74 72 2d 3e 6e 75 6d 54 61 62 73 20  rayPtr->numTabs 
19e60 3e 20 31 29 20 7b 0a 09 20 20 20 20 70 72 65 76  > 1) {..    prev
19e70 20 3d 20 74 61 62 41 72 72 61 79 50 74 72 2d 3e   = tabArrayPtr->
19e80 74 61 62 73 5b 74 61 62 41 72 72 61 79 50 74 72  tabs[tabArrayPtr
19e90 2d 3e 6e 75 6d 54 61 62 73 2d 32 5d 2e 6c 6f 63  ->numTabs-2].loc
19ea0 61 74 69 6f 6e 3b 0a 09 7d 20 65 6c 73 65 20 7b  ation;..} else {
19eb0 0a 09 20 20 20 20 70 72 65 76 20 3d 20 30 3b 0a  ..    prev = 0;.
19ec0 09 7d 0a 09 61 6c 69 67 6e 6d 65 6e 74 20 3d 20  .}..alignment = 
19ed0 74 61 62 41 72 72 61 79 50 74 72 2d 3e 74 61 62  tabArrayPtr->tab
19ee0 73 5b 74 61 62 41 72 72 61 79 50 74 72 2d 3e 6e  s[tabArrayPtr->n
19ef0 75 6d 54 61 62 73 2d 31 5d 2e 61 6c 69 67 6e 6d  umTabs-1].alignm
19f00 65 6e 74 3b 0a 09 74 61 62 58 20 3d 20 74 61 62  ent;..tabX = tab
19f10 41 72 72 61 79 50 74 72 2d 3e 74 61 62 73 5b 74  ArrayPtr->tabs[t
19f20 61 62 41 72 72 61 79 50 74 72 2d 3e 6e 75 6d 54  abArrayPtr->numT
19f30 61 62 73 2d 31 5d 2e 6c 6f 63 61 74 69 6f 6e 0a  abs-1].location.
19f40 09 09 2b 20 28 69 6e 64 65 78 20 2b 20 31 20 2d  ..+ (index + 1 -
19f50 20 74 61 62 41 72 72 61 79 50 74 72 2d 3e 6e 75   tabArrayPtr->nu
19f60 6d 54 61 62 73 29 0a 09 09 2a 20 28 74 61 62 41  mTabs)...* (tabA
19f70 72 72 61 79 50 74 72 2d 3e 74 61 62 73 5b 74 61  rrayPtr->tabs[ta
19f80 62 41 72 72 61 79 50 74 72 2d 3e 6e 75 6d 54 61  bArrayPtr->numTa
19f90 62 73 2d 31 5d 2e 6c 6f 63 61 74 69 6f 6e 20 2d  bs-1].location -
19fa0 20 70 72 65 76 29 3b 0a 20 20 20 20 7d 0a 0a 20   prev);.    }.. 
19fb0 20 20 20 74 61 62 50 74 72 20 3d 20 26 74 61 62     tabPtr = &tab
19fc0 41 72 72 61 79 50 74 72 2d 3e 74 61 62 73 5b 69  ArrayPtr->tabs[i
19fd0 6e 64 65 78 5d 3b 0a 20 20 20 20 69 66 20 28 61  ndex];.    if (a
19fe0 6c 69 67 6e 6d 65 6e 74 20 3d 3d 20 4c 45 46 54  lignment == LEFT
19ff0 29 20 7b 0a 09 64 65 73 69 72 65 64 20 3d 20 74  ) {..desired = t
1a000 61 62 58 3b 0a 09 67 6f 74 6f 20 75 70 64 61 74  abX;..goto updat
1a010 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  e;.    }..    if
1a020 20 28 28 61 6c 69 67 6e 6d 65 6e 74 20 3d 3d 20   ((alignment == 
1a030 43 45 4e 54 45 52 29 20 7c 7c 20 28 61 6c 69 67  CENTER) || (alig
1a040 6e 6d 65 6e 74 20 3d 3d 20 52 49 47 48 54 29 29  nment == RIGHT))
1a050 20 7b 0a 09 2f 2a 0a 09 20 2a 20 43 6f 6d 70 75   {../*.. * Compu
1a060 74 65 20 74 68 65 20 77 69 64 74 68 20 6f 66 20  te the width of 
1a070 61 6c 6c 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  all the informat
1a080 69 6f 6e 20 69 6e 20 74 68 65 20 74 61 62 20 67  ion in the tab g
1a090 72 6f 75 70 2c 0a 09 20 2a 20 74 68 65 6e 20 75  roup,.. * then u
1a0a0 73 65 20 69 74 20 74 6f 20 70 69 63 6b 20 61 20  se it to pick a 
1a0b0 64 65 73 69 72 65 64 20 6c 6f 63 61 74 69 6f 6e  desired location
1a0c0 2e 0a 09 20 2a 2f 0a 0a 09 77 69 64 74 68 20 3d  ... */...width =
1a0d0 20 30 3b 0a 09 66 6f 72 20 28 63 68 75 6e 6b 50   0;..for (chunkP
1a0e0 74 72 32 20 3d 20 63 68 75 6e 6b 50 74 72 2d 3e  tr2 = chunkPtr->
1a0f0 6e 65 78 74 50 74 72 3b 20 63 68 75 6e 6b 50 74  nextPtr; chunkPt
1a100 72 32 20 21 3d 20 4e 55 4c 4c 3b 0a 09 09 63 68  r2 != NULL;...ch
1a110 75 6e 6b 50 74 72 32 20 3d 20 63 68 75 6e 6b 50  unkPtr2 = chunkP
1a120 74 72 32 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a  tr2->nextPtr) {.
1a130 09 20 20 20 20 77 69 64 74 68 20 2b 3d 20 63 68  .    width += ch
1a140 75 6e 6b 50 74 72 32 2d 3e 77 69 64 74 68 3b 0a  unkPtr2->width;.
1a150 09 7d 0a 09 69 66 20 28 61 6c 69 67 6e 6d 65 6e  .}..if (alignmen
1a160 74 20 3d 3d 20 43 45 4e 54 45 52 29 20 7b 0a 09  t == CENTER) {..
1a170 20 20 20 20 64 65 73 69 72 65 64 20 3d 20 74 61      desired = ta
1a180 62 58 20 2d 20 77 69 64 74 68 2f 32 3b 0a 09 7d  bX - width/2;..}
1a190 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 65 73   else {..    des
1a1a0 69 72 65 64 20 3d 20 74 61 62 58 20 2d 20 77 69  ired = tabX - wi
1a1b0 64 74 68 3b 0a 09 7d 0a 09 67 6f 74 6f 20 75 70  dth;..}..goto up
1a1c0 64 61 74 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  date;.    }..   
1a1d0 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 75 73 74 20   /*.     * Must 
1a1e0 62 65 20 6e 75 6d 65 72 69 63 20 61 6c 69 67 6e  be numeric align
1a1f0 6d 65 6e 74 2e 20 20 53 65 61 72 63 68 20 74 68  ment.  Search th
1a200 72 6f 75 67 68 20 74 68 65 20 74 65 78 74 20 74  rough the text t
1a210 6f 20 62 65 0a 20 20 20 20 20 2a 20 74 61 62 62  o be.     * tabb
1a220 65 64 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ed, looking for 
1a230 74 68 65 20 6c 61 73 74 20 2c 20 6f 72 20 2e 20  the last , or . 
1a240 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
1a250 20 63 68 61 72 61 63 74 65 72 0a 20 20 20 20 20   character.     
1a260 2a 20 74 68 61 74 20 69 73 6e 27 74 20 61 20 6e  * that isn't a n
1a270 75 6d 62 65 72 2c 20 63 6f 6d 6d 61 2c 20 70 65  umber, comma, pe
1a280 72 69 6f 64 2c 20 6f 72 20 73 69 67 6e 2e 0a 20  riod, or sign.. 
1a290 20 20 20 20 2a 2f 0a 0a 20 20 20 20 64 65 63 69      */..    deci
1a2a0 6d 61 6c 43 68 75 6e 6b 50 74 72 20 3d 20 4e 55  malChunkPtr = NU
1a2b0 4c 4c 3b 0a 20 20 20 20 64 65 63 69 6d 61 6c 20  LL;.    decimal 
1a2c0 3d 20 67 6f 74 44 69 67 69 74 20 3d 20 30 3b 0a  = gotDigit = 0;.
1a2d0 20 20 20 20 66 6f 72 20 28 63 68 75 6e 6b 50 74      for (chunkPt
1a2e0 72 32 20 3d 20 63 68 75 6e 6b 50 74 72 2d 3e 6e  r2 = chunkPtr->n
1a2f0 65 78 74 50 74 72 3b 20 63 68 75 6e 6b 50 74 72  extPtr; chunkPtr
1a300 32 20 21 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  2 != NULL;..    
1a310 63 68 75 6e 6b 50 74 72 32 20 3d 20 63 68 75 6e  chunkPtr2 = chun
1a320 6b 50 74 72 32 2d 3e 6e 65 78 74 50 74 72 29 20  kPtr2->nextPtr) 
1a330 7b 0a 09 69 66 20 28 63 68 75 6e 6b 50 74 72 32  {..if (chunkPtr2
1a340 2d 3e 64 69 73 70 6c 61 79 50 72 6f 63 20 21 3d  ->displayProc !=
1a350 20 43 68 61 72 44 69 73 70 6c 61 79 50 72 6f 63   CharDisplayProc
1a360 29 20 7b 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75  ) {..    continu
1a370 65 3b 0a 09 7d 0a 09 63 69 50 74 72 20 3d 20 28  e;..}..ciPtr = (
1a380 43 68 61 72 49 6e 66 6f 20 2a 29 20 63 68 75 6e  CharInfo *) chun
1a390 6b 50 74 72 32 2d 3e 63 6c 69 65 6e 74 44 61 74  kPtr2->clientDat
1a3a0 61 3b 0a 09 66 6f 72 20 28 70 20 3d 20 63 69 50  a;..for (p = ciP
1a3b0 74 72 2d 3e 63 68 61 72 73 2c 20 69 20 3d 20 30  tr->chars, i = 0
1a3c0 3b 20 69 20 3c 20 63 69 50 74 72 2d 3e 6e 75 6d  ; i < ciPtr->num
1a3d0 43 68 61 72 73 3b 20 70 2b 2b 2c 20 69 2b 2b 29  Chars; p++, i++)
1a3e0 20 7b 0a 09 20 20 20 20 69 66 20 28 69 73 64 69   {..    if (isdi
1a3f0 67 69 74 28 55 43 48 41 52 28 2a 70 29 29 29 20  git(UCHAR(*p))) 
1a400 7b 0a 09 09 67 6f 74 44 69 67 69 74 20 3d 20 31  {...gotDigit = 1
1a410 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ;..    } else if
1a420 20 28 28 2a 70 20 3d 3d 20 27 2e 27 29 20 7c 7c   ((*p == '.') ||
1a430 20 28 2a 70 20 3d 3d 20 27 2c 27 29 29 20 7b 0a   (*p == ',')) {.
1a440 09 09 64 65 63 69 6d 61 6c 20 3d 20 70 2d 63 69  ..decimal = p-ci
1a450 50 74 72 2d 3e 63 68 61 72 73 3b 0a 09 09 64 65  Ptr->chars;...de
1a460 63 69 6d 61 6c 43 68 75 6e 6b 50 74 72 20 3d 20  cimalChunkPtr = 
1a470 63 68 75 6e 6b 50 74 72 32 3b 0a 09 20 20 20 20  chunkPtr2;..    
1a480 7d 20 65 6c 73 65 20 69 66 20 28 67 6f 74 44 69  } else if (gotDi
1a490 67 69 74 29 20 7b 0a 09 09 69 66 20 28 64 65 63  git) {...if (dec
1a4a0 69 6d 61 6c 43 68 75 6e 6b 50 74 72 20 3d 3d 20  imalChunkPtr == 
1a4b0 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 64 65  NULL) {...    de
1a4c0 63 69 6d 61 6c 20 3d 20 70 2d 63 69 50 74 72 2d  cimal = p-ciPtr-
1a4d0 3e 63 68 61 72 73 3b 0a 09 09 20 20 20 20 64 65  >chars;...    de
1a4e0 63 69 6d 61 6c 43 68 75 6e 6b 50 74 72 20 3d 20  cimalChunkPtr = 
1a4f0 63 68 75 6e 6b 50 74 72 32 3b 0a 09 09 7d 0a 09  chunkPtr2;...}..
1a500 09 67 6f 74 6f 20 65 6e 64 4f 66 4e 75 6d 62 65  .goto endOfNumbe
1a510 72 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20  r;..    }..}.   
1a520 20 7d 0a 20 20 20 20 65 6e 64 4f 66 4e 75 6d 62   }.    endOfNumb
1a530 65 72 3a 0a 20 20 20 20 69 66 20 28 64 65 63 69  er:.    if (deci
1a540 6d 61 6c 43 68 75 6e 6b 50 74 72 20 21 3d 20 4e  malChunkPtr != N
1a550 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 63 75 72 58  ULL) {..int curX
1a560 3b 0a 0a 09 63 69 50 74 72 20 3d 20 28 43 68 61  ;...ciPtr = (Cha
1a570 72 49 6e 66 6f 20 2a 29 20 64 65 63 69 6d 61 6c  rInfo *) decimal
1a580 43 68 75 6e 6b 50 74 72 2d 3e 63 6c 69 65 6e 74  ChunkPtr->client
1a590 44 61 74 61 3b 0a 09 54 6b 4d 65 61 73 75 72 65  Data;..TkMeasure
1a5a0 43 68 61 72 73 28 63 69 50 74 72 2d 3e 63 68 61  Chars(ciPtr->cha
1a5b0 72 73 2c 20 64 65 63 69 6d 61 6c 2c 20 64 65 63  rs, decimal, dec
1a5c0 69 6d 61 6c 43 68 75 6e 6b 50 74 72 2d 3e 78 2c  imalChunkPtr->x,
1a5d0 20 31 30 30 30 30 30 30 2c 20 30 2c 0a 09 09 54   1000000, 0,...T
1a5e0 4b 5f 49 47 4e 4f 52 45 5f 54 41 42 53 2c 20 26  K_IGNORE_TABS, &
1a5f0 63 75 72 58 29 3b 0a 09 64 65 73 69 72 65 64 20  curX);..desired 
1a600 3d 20 74 61 62 58 20 2d 20 28 63 75 72 58 20 2d  = tabX - (curX -
1a610 20 78 29 3b 0a 09 67 6f 74 6f 20 75 70 64 61 74   x);..goto updat
1a620 65 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  e;.    } else {.
1a630 09 2f 2a 0a 09 20 2a 20 54 68 65 72 65 20 77 61  ./*.. * There wa
1a640 73 6e 27 74 20 61 20 64 65 63 69 6d 61 6c 20 70  sn't a decimal p
1a650 6f 69 6e 74 2e 20 20 52 69 67 68 74 20 6a 75 73  oint.  Right jus
1a660 74 69 66 79 20 74 68 65 20 74 65 78 74 2e 0a 09  tify the text...
1a670 20 2a 2f 0a 20 20 20 20 0a 09 77 69 64 74 68 20   */.    ..width 
1a680 3d 20 30 3b 0a 09 66 6f 72 20 28 63 68 75 6e 6b  = 0;..for (chunk
1a690 50 74 72 32 20 3d 20 63 68 75 6e 6b 50 74 72 2d  Ptr2 = chunkPtr-
1a6a0 3e 6e 65 78 74 50 74 72 3b 20 63 68 75 6e 6b 50  >nextPtr; chunkP
1a6b0 74 72 32 20 21 3d 20 4e 55 4c 4c 3b 0a 09 09 63  tr2 != NULL;...c
1a6c0 68 75 6e 6b 50 74 72 32 20 3d 20 63 68 75 6e 6b  hunkPtr2 = chunk
1a6d0 50 74 72 32 2d 3e 6e 65 78 74 50 74 72 29 20 7b  Ptr2->nextPtr) {
1a6e0 0a 09 20 20 20 20 77 69 64 74 68 20 2b 3d 20 63  ..    width += c
1a6f0 68 75 6e 6b 50 74 72 32 2d 3e 77 69 64 74 68 3b  hunkPtr2->width;
1a700 0a 09 7d 0a 09 64 65 73 69 72 65 64 20 3d 20 74  ..}..desired = t
1a710 61 62 58 20 2d 20 77 69 64 74 68 3b 0a 20 20 20  abX - width;.   
1a720 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
1a730 2a 20 53 68 69 66 74 20 61 6c 6c 20 6f 66 20 74  * Shift all of t
1a740 68 65 20 63 68 75 6e 6b 73 20 74 6f 20 74 68 65  he chunks to the
1a750 20 72 69 67 68 74 20 73 6f 20 74 68 61 74 20 74   right so that t
1a760 68 65 20 6c 65 66 74 20 65 64 67 65 20 69 73 0a  he left edge is.
1a770 20 20 20 20 20 2a 20 61 74 20 74 68 65 20 64 65       * at the de
1a780 73 69 72 65 64 20 6c 6f 63 61 74 69 6f 6e 2c 20  sired location, 
1a790 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20  then expand the 
1a7a0 63 68 75 6e 6b 20 63 6f 6e 74 61 69 6e 69 6e 20  chunk containin 
1a7b0 74 68 65 0a 20 20 20 20 20 2a 20 74 61 62 2e 20  the.     * tab. 
1a7c0 20 42 65 20 73 75 72 65 20 74 68 61 74 20 74 68   Be sure that th
1a7d0 65 20 74 61 62 20 6f 63 63 75 70 69 65 73 20 61  e tab occupies a
1a7e0 74 20 6c 65 61 73 74 20 74 68 65 20 77 69 64 74  t least the widt
1a7f0 68 20 6f 66 20 61 0a 20 20 20 20 20 2a 20 73 70  h of a.     * sp
1a800 61 63 65 20 63 68 61 72 61 63 74 65 72 2e 0a 20  ace character.. 
1a810 20 20 20 20 2a 2f 0a 0a 20 20 20 20 75 70 64 61      */..    upda
1a820 74 65 3a 0a 20 20 20 20 64 65 6c 74 61 20 3d 20  te:.    delta = 
1a830 64 65 73 69 72 65 64 20 2d 20 78 3b 0a 20 20 20  desired - x;.   
1a840 20 69 66 20 28 64 65 6c 74 61 20 3c 20 31 29 20   if (delta < 1) 
1a850 7b 0a 09 64 65 6c 74 61 20 3d 20 31 3b 0a 20 20  {..delta = 1;.  
1a860 20 20 7d 0a 20 20 20 20 66 6f 72 20 28 63 68 75    }.    for (chu
1a870 6e 6b 50 74 72 32 20 3d 20 63 68 75 6e 6b 50 74  nkPtr2 = chunkPt
1a880 72 2d 3e 6e 65 78 74 50 74 72 3b 20 63 68 75 6e  r->nextPtr; chun
1a890 6b 50 74 72 32 20 21 3d 20 4e 55 4c 4c 3b 0a 09  kPtr2 != NULL;..
1a8a0 20 20 20 20 63 68 75 6e 6b 50 74 72 32 20 3d 20      chunkPtr2 = 
1a8b0 63 68 75 6e 6b 50 74 72 32 2d 3e 6e 65 78 74 50  chunkPtr2->nextP
1a8c0 74 72 29 20 7b 0a 09 63 68 75 6e 6b 50 74 72 32  tr) {..chunkPtr2
1a8d0 2d 3e 78 20 2b 3d 20 64 65 6c 74 61 3b 0a 20 20  ->x += delta;.  
1a8e0 20 20 7d 0a 20 20 20 20 63 68 75 6e 6b 50 74 72    }.    chunkPtr
1a8f0 2d 3e 77 69 64 74 68 20 2b 3d 20 64 65 6c 74 61  ->width += delta
1a900 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
1a910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a950 2d 0a 20 2a 0a 20 2a 20 53 69 7a 65 4f 66 54 61  -. *. * SizeOfTa
1a960 62 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  b --. *. *.This 
1a970 72 65 74 75 72 6e 73 20 61 6e 20 65 73 74 69 6d  returns an estim
1a980 61 74 65 20 6f 66 20 74 68 65 20 61 6d 6f 75 6e  ate of the amoun
1a990 74 20 6f 66 20 77 68 69 74 65 20 73 70 61 63 65  t of white space
1a9a0 20 74 68 61 74 20 77 69 6c 6c 0a 20 2a 09 62 65   that will. *.be
1a9b0 20 63 6f 6e 73 75 6d 65 64 20 62 79 20 61 20 74   consumed by a t
1a9c0 61 62 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ab.. *. * Result
1a9d0 73 3a 0a 20 2a 09 54 68 65 20 72 65 74 75 72 6e  s:. *.The return
1a9e0 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6d 69   value is the mi
1a9f0 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  nimum number of 
1aa00 70 69 78 65 6c 73 20 74 68 61 74 20 77 69 6c 6c  pixels that will
1aa10 0a 20 2a 09 62 65 20 6f 63 63 75 70 69 65 64 20  . *.be occupied 
1aa20 62 79 20 74 68 65 20 69 6e 64 65 78 27 74 68 20  by the index'th 
1aa30 74 61 62 20 6f 66 20 74 61 62 41 72 72 61 79 50  tab of tabArrayP
1aa40 74 72 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  tr, assuming tha
1aa50 74 0a 20 2a 09 74 68 65 20 63 75 72 72 65 6e 74  t. *.the current
1aa60 20 70 6f 73 69 74 69 6f 6e 20 6f 6e 20 74 68 65   position on the
1aa70 20 6c 69 6e 65 20 69 73 20 78 20 61 6e 64 20 74   line is x and t
1aa80 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 2a  he end of the. *
1aa90 09 6c 69 6e 65 20 69 73 20 6d 61 78 58 2e 20 20  .line is maxX.  
1aaa0 46 6f 72 20 6e 75 6d 65 72 69 63 20 74 61 62 73  For numeric tabs
1aab0 2c 20 74 68 69 73 20 69 73 20 61 20 63 6f 6e 73  , this is a cons
1aac0 65 72 76 61 74 69 76 65 0a 20 2a 09 65 73 74 69  ervative. *.esti
1aad0 6d 61 74 65 2e 20 20 54 68 65 20 72 65 74 75 72  mate.  The retur
1aae0 6e 20 76 61 6c 75 65 20 69 73 20 61 6c 77 61 79  n value is alway
1aaf0 73 20 3e 3d 20 30 2e 0a 20 2a 0a 20 2a 20 53 69  s >= 0.. *. * Si
1ab00 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
1ab10 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
1ab20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ab30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ab40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ab50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ab60 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  . */..static int
1ab70 0a 53 69 7a 65 4f 66 54 61 62 28 74 65 78 74 50  .SizeOfTab(textP
1ab80 74 72 2c 20 74 61 62 41 72 72 61 79 50 74 72 2c  tr, tabArrayPtr,
1ab90 20 69 6e 64 65 78 2c 20 78 2c 20 6d 61 78 58 29   index, x, maxX)
1aba0 0a 20 20 20 20 54 6b 54 65 78 74 20 2a 74 65 78  .    TkText *tex
1abb0 74 50 74 72 3b 09 09 09 2f 2a 20 49 6e 66 6f 72  tPtr;.../* Infor
1abc0 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
1abd0 20 74 65 78 74 20 77 69 64 67 65 74 20 61 73 0a   text widget as.
1abe0 09 09 09 09 09 20 2a 20 61 20 77 68 6f 6c 65 2e  ..... * a whole.
1abf0 20 2a 2f 0a 20 20 20 20 54 6b 54 65 78 74 54 61   */.    TkTextTa
1ac00 62 41 72 72 61 79 20 2a 74 61 62 41 72 72 61 79  bArray *tabArray
1ac10 50 74 72 3b 09 2f 2a 20 49 6e 66 6f 72 6d 61 74  Ptr;./* Informat
1ac20 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 74 61  ion about the ta
1ac30 62 20 73 74 6f 70 73 0a 09 09 09 09 09 20 2a 20  b stops...... * 
1ac40 74 68 61 74 20 61 70 70 6c 79 20 74 6f 20 74 68  that apply to th
1ac50 69 73 20 6c 69 6e 65 2e 20 20 4e 55 4c 4c 0a 09  is line.  NULL..
1ac60 09 09 09 09 20 2a 20 6d 65 61 6e 73 20 75 73 65  .... * means use
1ac70 20 64 65 66 61 75 6c 74 20 74 61 62 62 69 6e 67   default tabbing
1ac80 20 28 65 76 65 72 79 0a 09 09 09 09 09 20 2a 20   (every...... * 
1ac90 38 20 63 68 61 72 73 2e 29 20 2a 2f 0a 20 20 20  8 chars.) */.   
1aca0 20 69 6e 74 20 69 6e 64 65 78 3b 09 09 09 09 2f   int index;..../
1acb0 2a 20 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65  * Index of curre
1acc0 6e 74 20 74 61 62 20 73 74 6f 70 2e 20 2a 2f 0a  nt tab stop. */.
1acd0 20 20 20 20 69 6e 74 20 78 3b 09 09 09 09 2f 2a      int x;..../*
1ace0 20 43 75 72 72 65 6e 74 20 78 2d 6c 6f 63 61 74   Current x-locat
1acf0 69 6f 6e 20 69 6e 20 6c 69 6e 65 2e 20 4f 6e 6c  ion in line. Onl
1ad00 79 0a 09 09 09 09 09 20 2a 20 75 73 65 64 20 69  y...... * used i
1ad10 66 20 74 61 62 41 72 72 61 79 50 74 72 20 3d 3d  f tabArrayPtr ==
1ad20 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 69 6e   NULL. */.    in
1ad30 74 20 6d 61 78 58 3b 09 09 09 09 2f 2a 20 58 2d  t maxX;..../* X-
1ad40 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 70 69 78 65  location of pixe
1ad50 6c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 0a  l just past the.
1ad60 09 09 09 09 09 20 2a 20 72 69 67 68 74 20 65 64  ..... * right ed
1ad70 67 65 20 6f 66 20 74 68 65 20 6c 69 6e 65 2e 20  ge of the line. 
1ad80 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 74 61 62  */.{.    int tab
1ad90 58 2c 20 70 72 65 76 2c 20 72 65 73 75 6c 74 3b  X, prev, result;
1ada0 0a 20 20 20 20 54 6b 54 65 78 74 54 61 62 41 6c  .    TkTextTabAl
1adb0 69 67 6e 20 61 6c 69 67 6e 6d 65 6e 74 3b 0a 0a  ign alignment;..
1adc0 20 20 20 20 69 66 20 28 28 74 61 62 41 72 72 61      if ((tabArra
1add0 79 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7c 7c  yPtr == NULL) ||
1ade0 20 28 74 61 62 41 72 72 61 79 50 74 72 2d 3e 6e   (tabArrayPtr->n
1adf0 75 6d 54 61 62 73 20 3d 3d 20 30 29 29 20 7b 0a  umTabs == 0)) {.
1ae00 09 54 6b 4d 65 61 73 75 72 65 43 68 61 72 73 28  .TkMeasureChars(
1ae10 22 5c 74 22 2c 20 31 2c 20 78 2c 20 49 4e 54 5f  "\t", 1, x, INT_
1ae20 4d 41 58 2c 20 30 2c 20 30 2c 20 26 74 61 62 58  MAX, 0, 0, &tabX
1ae30 29 3b 0a 09 72 65 74 75 72 6e 20 74 61 62 58 20  );..return tabX 
1ae40 2d 20 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  - x;.    }.    i
1ae50 66 20 28 69 6e 64 65 78 20 3c 20 74 61 62 41 72  f (index < tabAr
1ae60 72 61 79 50 74 72 2d 3e 6e 75 6d 54 61 62 73 29  rayPtr->numTabs)
1ae70 20 7b 0a 09 74 61 62 58 20 3d 20 74 61 62 41 72   {..tabX = tabAr
1ae80 72 61 79 50 74 72 2d 3e 74 61 62 73 5b 69 6e 64  rayPtr->tabs[ind
1ae90 65 78 5d 2e 6c 6f 63 61 74 69 6f 6e 3b 0a 09 61  ex].location;..a
1aea0 6c 69 67 6e 6d 65 6e 74 20 3d 20 74 61 62 41 72  lignment = tabAr
1aeb0 72 61 79 50 74 72 2d 3e 74 61 62 73 5b 69 6e 64  rayPtr->tabs[ind
1aec0 65 78 5d 2e 61 6c 69 67 6e 6d 65 6e 74 3b 0a 20  ex].alignment;. 
1aed0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a     } else {../*.
1aee0 09 20 2a 20 52 61 6e 20 6f 75 74 20 6f 66 20 74  . * Ran out of t
1aef0 61 62 20 73 74 6f 70 73 3b 20 20 63 6f 6d 70 75  ab stops;  compu
1af00 74 65 20 61 20 74 61 62 20 70 6f 73 69 74 69 6f  te a tab positio
1af10 6e 20 62 79 20 65 78 74 72 61 70 6f 6c 61 74 69  n by extrapolati
1af20 6e 67 0a 09 20 2a 20 66 72 6f 6d 20 74 68 65 20  ng.. * from the 
1af30 6c 61 73 74 20 74 77 6f 20 74 61 62 20 70 6f 73  last two tab pos
1af40 69 74 69 6f 6e 73 2e 0a 09 20 2a 2f 0a 0a 09 69  itions... */...i
1af50 66 20 28 74 61 62 41 72 72 61 79 50 74 72 2d 3e  f (tabArrayPtr->
1af60 6e 75 6d 54 61 62 73 20 3e 20 31 29 20 7b 0a 09  numTabs > 1) {..
1af70 20 20 20 20 70 72 65 76 20 3d 20 74 61 62 41 72      prev = tabAr
1af80 72 61 79 50 74 72 2d 3e 74 61 62 73 5b 74 61 62  rayPtr->tabs[tab
1af90 41 72 72 61 79 50 74 72 2d 3e 6e 75 6d 54 61 62  ArrayPtr->numTab
1afa0 73 2d 32 5d 2e 6c 6f 63 61 74 69 6f 6e 3b 0a 09  s-2].location;..
1afb0 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 70 72  } else {..    pr
1afc0 65 76 20 3d 20 30 3b 0a 09 7d 0a 09 74 61 62 58  ev = 0;..}..tabX
1afd0 20 3d 20 74 61 62 41 72 72 61 79 50 74 72 2d 3e   = tabArrayPtr->
1afe0 74 61 62 73 5b 74 61 62 41 72 72 61 79 50 74 72  tabs[tabArrayPtr
1aff0 2d 3e 6e 75 6d 54 61 62 73 2d 31 5d 2e 6c 6f 63  ->numTabs-1].loc
1b000 61 74 69 6f 6e 0a 09 09 2b 20 28 69 6e 64 65 78  ation...+ (index
1b010 20 2b 20 31 20 2d 20 74 61 62 41 72 72 61 79 50   + 1 - tabArrayP
1b020 74 72 2d 3e 6e 75 6d 54 61 62 73 29 0a 09 09 2a  tr->numTabs)...*
1b030 20 28 74 61 62 41 72 72 61 79 50 74 72 2d 3e 74   (tabArrayPtr->t
1b040 61 62 73 5b 74 61 62 41 72 72 61 79 50 74 72 2d  abs[tabArrayPtr-
1b050 3e 6e 75 6d 54 61 62 73 2d 31 5d 2e 6c 6f 63 61  >numTabs-1].loca
1b060 74 69 6f 6e 20 2d 20 70 72 65 76 29 3b 0a 09 61  tion - prev);..a
1b070 6c 69 67 6e 6d 65 6e 74 20 3d 20 74 61 62 41 72  lignment = tabAr
1b080 72 61 79 50 74 72 2d 3e 74 61 62 73 5b 74 61 62  rayPtr->tabs[tab
1b090 41 72 72 61 79 50 74 72 2d 3e 6e 75 6d 54 61 62  ArrayPtr->numTab
1b0a0 73 2d 31 5d 2e 61 6c 69 67 6e 6d 65 6e 74 3b 0a  s-1].alignment;.
1b0b0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 6c      }.    if (al
1b0c0 69 67 6e 6d 65 6e 74 20 3d 3d 20 43 45 4e 54 45  ignment == CENTE
1b0d0 52 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 42 65 20  R) {../*.. * Be 
1b0e0 76 65 72 79 20 63 61 72 65 66 75 6c 20 69 6e 20  very careful in 
1b0f0 74 68 65 20 61 72 69 74 68 6d 65 74 69 63 20 62  the arithmetic b
1b100 65 6c 6f 77 2c 20 62 65 63 61 75 73 65 20 6d 61  elow, because ma
1b110 78 58 20 6d 61 79 0a 09 20 2a 20 62 65 20 74 68  xX may.. * be th
1b120 65 20 6c 61 72 67 65 73 74 20 70 6f 73 69 74 69  e largest positi
1b130 76 65 20 6e 75 6d 62 65 72 3a 20 20 77 61 74 63  ve number:  watc
1b140 68 20 6f 75 74 20 66 6f 72 20 69 6e 74 65 67 65  h out for intege
1b150 72 0a 09 20 2a 20 6f 76 65 72 66 6c 6f 77 2e 0a  r.. * overflow..
1b160 09 20 2a 2f 0a 0a 09 69 66 20 28 28 6d 61 78 58  . */...if ((maxX
1b170 2d 74 61 62 58 29 20 3c 20 28 74 61 62 58 20 2d  -tabX) < (tabX -
1b180 20 78 29 29 20 7b 0a 09 20 20 20 20 72 65 73 75   x)) {..    resu
1b190 6c 74 20 3d 20 28 6d 61 78 58 20 2d 20 78 29 20  lt = (maxX - x) 
1b1a0 2d 20 32 2a 28 6d 61 78 58 20 2d 20 74 61 62 58  - 2*(maxX - tabX
1b1b0 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  );..} else {..  
1b1c0 20 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 09 7d    result = 0;..}
1b1d0 0a 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a 20 20 20  ..goto done;.   
1b1e0 20 7d 0a 20 20 20 20 69 66 20 28 61 6c 69 67 6e   }.    if (align
1b1f0 6d 65 6e 74 20 3d 3d 20 52 49 47 48 54 29 20 7b  ment == RIGHT) {
1b200 0a 09 72 65 73 75 6c 74 20 3d 20 30 3b 0a 09 67  ..result = 0;..g
1b210 6f 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a  oto done;.    }.
1b220 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4e  .    /*.     * N
1b230 6f 74 65 3a 20 74 68 69 73 20 74 72 65 61 74 73  ote: this treats
1b240 20 4e 55 4d 45 52 49 43 20 61 6c 69 67 6e 6d 65   NUMERIC alignme
1b250 6e 74 20 74 68 65 20 73 61 6d 65 20 61 73 20 4c  nt the same as L
1b260 45 46 54 0a 20 20 20 20 20 2a 20 61 6c 69 67 6e  EFT.     * align
1b270 6d 65 6e 74 2c 20 77 68 69 63 68 20 69 73 20 73  ment, which is s
1b280 6f 6d 65 77 68 61 74 20 63 6f 6e 73 65 72 76 61  omewhat conserva
1b290 74 69 76 65 2e 20 20 48 6f 77 65 76 65 72 2c 20  tive.  However, 
1b2a0 69 74 27 73 0a 20 20 20 20 20 2a 20 70 72 65 74  it's.     * pret
1b2b0 74 79 20 74 72 69 63 6b 79 20 61 74 20 74 68 69  ty tricky at thi
1b2c0 73 20 70 6f 69 6e 74 20 74 6f 20 66 69 67 75 72  s point to figur
1b2d0 65 20 6f 75 74 20 65 78 61 63 74 6c 79 20 77 68  e out exactly wh
1b2e0 65 72 65 0a 20 20 20 20 20 2a 20 74 68 65 20 64  ere.     * the d
1b2f0 61 6d 6e 20 64 65 63 69 6d 61 6c 20 70 6f 69 6e  amn decimal poin
1b300 74 20 77 69 6c 6c 20 62 65 2e 0a 20 20 20 20 20  t will be..     
1b310 2a 2f 0a 0a 20 20 20 20 69 66 20 28 74 61 62 58  */..    if (tabX
1b320 20 3e 20 78 29 20 7b 0a 09 72 65 73 75 6c 74 20   > x) {..result 
1b330 3d 20 74 61 62 58 20 2d 20 78 3b 0a 20 20 20 20  = tabX - x;.    
1b340 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 75 6c 74  } else {..result
1b350 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
1b360 20 64 6f 6e 65 3a 0a 20 20 20 20 69 66 20 28 72   done:.    if (r
1b370 65 73 75 6c 74 20 3c 20 31 29 20 7b 0a 09 72 65  esult < 1) {..re
1b380 73 75 6c 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  sult = 1;.    }.
1b390 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c      return resul
1b3a0 74 3b 0a 7d 0a                                   t;.}.