Hex Artifact Content

Artifact eaa9e679e2aeca58efe83e3a3ce1d24fe5164bdf:


0000: 2f 2a 20 0a 20 2a 20 63 74 6b 44 69 73 70 6c 61  /* . * ctkDispla
0010: 79 2e 63 20 28 43 54 6b 29 20 2d 2d 0a 20 2a 0a  y.c (CTk) --. *.
0020: 20 2a 09 43 54 4b 20 64 69 73 70 6c 61 79 20 66   *.CTK display f
0030: 75 6e 63 74 69 6f 6e 73 20 28 68 69 64 65 73 20  unctions (hides 
0040: 61 6c 6c 20 63 75 72 73 65 73 20 66 75 6e 63 74  all curses funct
0050: 69 6f 6e 73 29 2e 0a 20 2a 0a 20 2a 20 43 6f 70  ions).. *. * Cop
0060: 79 72 69 67 68 74 20 28 63 29 20 31 39 39 34 2d  yright (c) 1994-
0070: 31 39 39 35 20 43 6c 65 76 65 6c 61 6e 64 20 43  1995 Cleveland C
0080: 6c 69 6e 69 63 20 46 6f 75 6e 64 61 74 69 6f 6e  linic Foundation
0090: 0a 20 2a 0a 20 2a 20 53 65 65 20 74 68 65 20 66  . *. * See the f
00a0: 69 6c 65 20 22 6c 69 63 65 6e 73 65 2e 74 65 72  ile "license.ter
00b0: 6d 73 22 20 66 6f 72 20 69 6e 66 6f 72 6d 61 74  ms" for informat
00c0: 69 6f 6e 20 6f 6e 20 75 73 61 67 65 20 61 6e 64  ion on usage and
00d0: 20 72 65 64 69 73 74 72 69 62 75 74 69 6f 6e 0a   redistribution.
00e0: 20 2a 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c   * of this file,
00f0: 20 61 6e 64 20 66 6f 72 20 61 20 44 49 53 43 4c   and for a DISCL
0100: 41 49 4d 45 52 20 4f 46 20 41 4c 4c 20 57 41 52  AIMER OF ALL WAR
0110: 52 41 4e 54 49 45 53 2e 0a 20 2a 0a 20 2a 20 40  RANTIES.. *. * @
0120: 28 23 29 20 24 49 64 3a 20 63 74 6b 2e 73 68 61  (#) $Id: ctk.sha
0130: 72 2c 76 20 31 2e 35 30 20 31 39 39 36 2f 30 31  r,v 1.50 1996/01
0140: 2f 31 35 20 31 34 3a 34 37 3a 31 36 20 61 6e 64  /15 14:47:16 and
0150: 72 65 77 6d 20 45 78 70 20 61 6e 64 72 65 77 6d  rewm Exp andrewm
0160: 20 24 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65   $. */..#include
0170: 20 22 74 6b 50 6f 72 74 2e 68 22 0a 23 69 6e 63   "tkPort.h".#inc
0180: 6c 75 64 65 20 22 74 6b 49 6e 74 2e 68 22 0a 23  lude "tkInt.h".#
0190: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d  include <sys/tim
01a0: 65 73 2e 68 3e 0a 23 69 66 64 65 66 20 48 41 56  es.h>.#ifdef HAV
01b0: 45 5f 43 55 52 53 45 53 5f 48 0a 23 20 20 69 6e  E_CURSES_H.#  in
01c0: 63 6c 75 64 65 20 3c 63 75 72 73 65 73 2e 68 3e  clude <curses.h>
01d0: 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48  .#elif defined(H
01e0: 41 56 45 5f 43 55 52 53 45 53 5f 43 55 52 53 45  AVE_CURSES_CURSE
01f0: 53 5f 48 29 0a 23 20 20 69 6e 63 6c 75 64 65 20  S_H).#  include 
0200: 3c 63 75 72 73 65 73 2f 63 75 72 73 65 73 2e 68  <curses/curses.h
0210: 3e 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  >.#elif defined(
0220: 48 41 56 45 5f 43 55 52 53 45 53 5f 4e 43 55 52  HAVE_CURSES_NCUR
0230: 53 45 53 5f 48 29 0a 23 20 20 69 6e 63 6c 75 64  SES_H).#  includ
0240: 65 20 3c 63 75 72 73 65 73 2f 6e 63 75 72 73 65  e <curses/ncurse
0250: 73 2e 68 3e 0a 23 65 6c 69 66 20 64 65 66 69 6e  s.h>.#elif defin
0260: 65 64 28 48 41 56 45 5f 4e 43 55 52 53 45 53 5f  ed(HAVE_NCURSES_
0270: 4e 43 55 52 53 45 53 5f 48 29 0a 23 20 20 69 6e  NCURSES_H).#  in
0280: 63 6c 75 64 65 20 3c 6e 63 75 72 73 65 73 2f 6e  clude <ncurses/n
0290: 63 75 72 73 65 73 2e 68 3e 0a 23 65 6e 64 69 66  curses.h>.#endif
02a0: 0a 23 69 66 64 65 66 20 43 4c 4b 5f 54 43 4b 0a  .#ifdef CLK_TCK.
02b0: 23 20 20 20 64 65 66 69 6e 65 20 4d 53 5f 50 45  #   define MS_PE
02c0: 52 5f 43 4c 4f 43 4b 09 28 31 30 30 30 2e 30 2f  R_CLOCK.(1000.0/
02d0: 43 4c 4b 5f 54 43 4b 29 0a 23 65 6c 69 66 20 64  CLK_TCK).#elif d
02e0: 65 66 69 6e 65 64 20 48 5a 0a 23 20 20 20 64 65  efined HZ.#   de
02f0: 66 69 6e 65 20 4d 53 5f 50 45 52 5f 43 4c 4f 43  fine MS_PER_CLOC
0300: 4b 09 28 31 30 30 30 2e 30 2f 48 5a 29 0a 23 65  K.(1000.0/HZ).#e
0310: 6c 73 65 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  lse.    /*.     
0320: 2a 20 49 66 20 61 6c 6c 20 65 6c 73 65 20 66 61  * If all else fa
0330: 69 6c 73 2c 20 61 73 73 75 6d 65 20 36 30 20 63  ils, assume 60 c
0340: 6c 6f 63 6b 20 74 69 63 6b 73 20 70 65 72 20 73  lock ticks per s
0350: 65 63 6f 6e 64 20 2d 0a 20 20 20 20 20 2a 20 68  econd -.     * h
0360: 6f 70 65 20 74 68 61 74 20 69 73 20 6f 6b 61 79  ope that is okay
0370: 21 0a 20 20 20 20 20 2a 2f 0a 23 20 20 20 64 65  !.     */.#   de
0380: 66 69 6e 65 20 4d 53 5f 50 45 52 5f 43 4c 4f 43  fine MS_PER_CLOC
0390: 4b 09 28 31 30 30 30 2e 30 2f 36 30 29 0a 23 65  K.(1000.0/60).#e
03a0: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 44 65 66 69  ndif../*. * Defi
03b0: 6e 69 74 69 6f 6e 73 20 66 6f 72 20 77 65 61 6b  nitions for weak
03c0: 20 63 75 72 73 65 73 20 69 6d 70 6c 65 6d 65 6e   curses implemen
03d0: 74 61 74 69 6f 6e 73 2e 0a 20 2a 2f 0a 0a 23 69  tations.. */..#i
03e0: 66 6e 64 65 66 20 41 43 53 5f 55 4c 43 4f 52 4e  fndef ACS_ULCORN
03f0: 45 52 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 63 75  ER./*. * This cu
0400: 72 73 65 73 20 64 6f 65 73 20 6e 6f 74 20 64 65  rses does not de
0410: 66 69 6e 65 20 74 68 65 20 61 6c 74 65 72 6e 61  fine the alterna
0420: 74 65 20 63 68 61 72 61 63 74 65 72 20 73 65 74  te character set
0430: 20 63 6f 6e 73 74 61 6e 74 73 2e 0a 20 2a 20 44   constants.. * D
0440: 65 66 69 6e 65 20 74 68 65 6d 20 6c 6f 63 61 6c  efine them local
0450: 6c 79 2e 0a 20 2a 2f 0a 23 20 20 20 64 65 66 69  ly.. */.#   defi
0460: 6e 65 20 41 43 53 5f 55 4c 43 4f 52 4e 45 52 20  ne ACS_ULCORNER 
0470: 20 20 20 27 2b 27 0a 23 20 20 20 64 65 66 69 6e     '+'.#   defin
0480: 65 20 41 43 53 5f 4c 4c 43 4f 52 4e 45 52 20 20  e ACS_LLCORNER  
0490: 20 20 27 2b 27 0a 23 20 20 20 64 65 66 69 6e 65    '+'.#   define
04a0: 20 41 43 53 5f 55 52 43 4f 52 4e 45 52 20 20 20   ACS_URCORNER   
04b0: 20 27 2b 27 0a 23 20 20 20 64 65 66 69 6e 65 20   '+'.#   define 
04c0: 41 43 53 5f 4c 52 43 4f 52 4e 45 52 20 20 20 20  ACS_LRCORNER    
04d0: 27 2b 27 0a 23 20 20 20 64 65 66 69 6e 65 20 41  '+'.#   define A
04e0: 43 53 5f 48 4c 49 4e 45 20 20 20 20 20 20 20 27  CS_HLINE       '
04f0: 2d 27 0a 23 20 20 20 64 65 66 69 6e 65 20 41 43  -'.#   define AC
0500: 53 5f 56 4c 49 4e 45 20 20 20 20 20 20 20 27 7c  S_VLINE       '|
0510: 27 0a 23 20 20 20 64 65 66 69 6e 65 20 41 43 53  '.#   define ACS
0520: 5f 50 4c 55 53 20 20 20 20 20 20 20 20 27 2b 27  _PLUS        '+'
0530: 0a 23 65 6e 64 69 66 20 2f 2a 20 41 43 53 5f 55  .#endif /* ACS_U
0540: 4c 43 4f 52 4e 45 52 20 2a 2f 0a 0a 23 69 66 6e  LCORNER */..#ifn
0550: 64 65 66 20 48 41 56 45 5f 43 55 52 53 5f 53 45  def HAVE_CURS_SE
0560: 54 0a 2f 2a 0a 20 2a 20 44 6f 6e 27 74 20 68 61  T./*. * Don't ha
0570: 76 65 20 63 75 72 73 5f 73 65 74 28 29 20 66 75  ve curs_set() fu
0580: 6e 63 74 69 6f 6e 20 2d 20 69 67 6e 6f 72 65 20  nction - ignore 
0590: 69 74 2e 0a 20 2a 0a 20 2a 20 54 68 65 20 63 75  it.. *. * The cu
05a0: 72 73 6f 72 20 67 65 74 73 20 70 72 65 74 74 79  rsor gets pretty
05b0: 20 61 6e 6e 6f 79 69 6e 67 2c 20 62 75 74 20 68   annoying, but h
05c0: 61 76 65 6e 27 74 20 66 6f 75 6e 64 20 61 6e 79  aven't found any
05d0: 20 6f 74 68 65 72 0a 20 2a 20 77 61 79 20 74 6f   other. * way to
05e0: 20 74 75 72 6e 20 69 74 20 6f 66 66 2e 0a 20 2a   turn it off.. *
05f0: 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 63 75 72  /.#   define cur
0600: 73 5f 73 65 74 28 6d 6f 64 65 29 09 28 28 76 6f  s_set(mode).((vo
0610: 69 64 29 20 30 29 0a 23 65 6e 64 69 66 0a 0a 23  id) 0).#endif..#
0620: 69 66 6e 64 65 66 20 41 5f 53 54 41 4e 44 4f 55  ifndef A_STANDOU
0630: 54 0a 20 20 20 20 74 79 70 65 64 65 66 20 69 6e  T.    typedef in
0640: 74 20 63 68 74 79 70 65 3b 0a 23 20 20 20 64 65  t chtype;.#   de
0650: 66 69 6e 65 20 61 74 74 72 73 65 74 28 61 74 74  fine attrset(att
0660: 72 29 09 28 28 61 74 74 72 29 20 3f 20 73 74 61  r).((attr) ? sta
0670: 6e 64 6f 75 74 28 29 20 3a 20 73 74 61 6e 64 65  ndout() : stande
0680: 6e 64 28 29 29 0a 23 20 20 20 64 65 66 69 6e 65  nd()).#   define
0690: 20 41 5f 53 54 41 4e 44 4f 55 54 09 31 0a 23 20   A_STANDOUT.1.# 
06a0: 20 20 64 65 66 69 6e 65 20 41 5f 49 4e 56 49 53    define A_INVIS
06b0: 09 30 0a 23 20 20 20 64 65 66 69 6e 65 20 41 5f  .0.#   define A_
06c0: 4e 4f 52 4d 41 4c 09 30 0a 23 20 20 20 64 65 66  NORMAL.0.#   def
06d0: 69 6e 65 20 41 5f 55 4e 44 45 52 4c 49 4e 45 09  ine A_UNDERLINE.
06e0: 30 0a 23 20 20 20 64 65 66 69 6e 65 20 41 5f 52  0.#   define A_R
06f0: 45 56 45 52 53 45 09 30 0a 23 20 20 20 64 65 66  EVERSE.0.#   def
0700: 69 6e 65 20 41 5f 44 49 4d 09 30 0a 23 20 20 20  ine A_DIM.0.#   
0710: 64 65 66 69 6e 65 20 41 5f 42 4f 4c 44 09 30 0a  define A_BOLD.0.
0720: 23 20 20 20 64 65 66 69 6e 65 20 41 5f 44 49 4d  #   define A_DIM
0730: 09 30 0a 23 20 20 20 64 65 66 69 6e 65 20 41 5f  .0.#   define A_
0740: 42 4f 4c 44 09 30 0a 23 20 20 20 64 65 66 69 6e  BOLD.0.#   defin
0750: 65 20 41 5f 52 45 56 45 52 53 45 09 30 0a 23 65  e A_REVERSE.0.#e
0760: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 48 41 56  ndif..#ifdef HAV
0770: 45 5f 53 45 54 5f 54 45 52 4d 0a 23 20 20 20 64  E_SET_TERM.#   d
0780: 65 66 69 6e 65 20 53 65 74 44 69 73 70 6c 61 79  efine SetDisplay
0790: 28 64 69 73 70 50 74 72 29 20 5c 0a 09 69 66 20  (dispPtr) \..if 
07a0: 28 63 75 72 44 69 73 70 50 74 72 20 21 3d 20 28  (curDispPtr != (
07b0: 64 69 73 70 50 74 72 29 29 20 5c 0a 09 73 65 74  dispPtr)) \..set
07c0: 5f 74 65 72 6d 28 28 53 43 52 45 45 4e 20 2a 29  _term((SCREEN *)
07d0: 20 28 63 75 72 44 69 73 70 50 74 72 20 3d 20 28   (curDispPtr = (
07e0: 64 69 73 70 50 74 72 29 29 2d 3e 64 69 73 70 6c  dispPtr))->displ
07f0: 61 79 29 0a 23 65 6c 73 65 0a 23 20 20 20 64 65  ay).#else.#   de
0800: 66 69 6e 65 20 53 65 74 44 69 73 70 6c 61 79 28  fine SetDisplay(
0810: 64 69 73 70 50 74 72 29 09 09 28 28 76 6f 69 64  dispPtr)..((void
0820: 29 20 30 29 0a 23 20 20 20 64 65 66 69 6e 65 20  ) 0).#   define 
0830: 6e 65 77 74 65 72 6d 28 74 79 70 65 2c 20 6f 75  newterm(type, ou
0840: 74 50 74 72 2c 20 69 6e 50 74 72 29 09 69 6e 69  tPtr, inPtr).ini
0850: 74 73 63 72 28 29 0a 23 65 6e 64 69 66 0a 0a 23  tscr().#endif..#
0860: 69 66 6e 64 65 66 20 48 41 56 45 5f 4b 45 59 50  ifndef HAVE_KEYP
0870: 41 44 0a 23 20 20 20 64 65 66 69 6e 65 20 6b 65  AD.#   define ke
0880: 79 70 61 64 28 77 69 6e 2c 20 66 6c 61 67 29 09  ypad(win, flag).
0890: 09 28 28 76 6f 69 64 29 20 30 29 0a 23 65 6e 64  .((void) 0).#end
08a0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 48 41 56 45  if..#ifndef HAVE
08b0: 5f 42 45 45 50 0a 23 20 20 20 64 65 66 69 6e 65  _BEEP.#   define
08c0: 20 62 65 65 70 28 29 09 09 09 28 28 76 6f 69 64   beep()...((void
08d0: 29 20 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ) 0).#endif../*.
08e0: 20 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 68   * Macros for th
08f0: 65 20 6d 6f 73 74 20 6f 66 74 65 6e 20 75 73 65  e most often use
0900: 64 20 63 75 72 73 65 73 20 6f 70 65 72 61 74 69  d curses operati
0910: 6f 6e 73 2e 20 20 54 68 69 73 0a 20 2a 20 77 69  ons.  This. * wi
0920: 6c 6c 20 68 6f 70 65 66 75 6c 6c 79 20 68 65 6c  ll hopefully hel
0930: 70 20 69 66 20 73 6f 6d 65 6f 6e 65 20 77 61 6e  p if someone wan
0940: 74 73 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 6f  ts to convert to
0950: 20 61 20 64 69 66 66 65 72 65 6e 74 0a 20 2a 20   a different. * 
0960: 74 65 72 6d 69 6e 61 6c 20 49 2f 4f 20 6c 69 62  terminal I/O lib
0970: 72 61 72 79 20 28 6c 69 6b 65 20 44 4f 53 20 42  rary (like DOS B
0980: 49 4f 53 3f 29 2e 0a 20 2a 2f 0a 23 64 65 66 69  IOS?).. */.#defi
0990: 6e 65 20 4d 6f 76 65 28 78 2c 79 29 09 09 6d 6f  ne Move(x,y)..mo
09a0: 76 65 28 79 2c 78 29 0a 23 64 65 66 69 6e 65 20  ve(y,x).#define 
09b0: 50 75 74 43 68 61 72 28 63 68 29 09 09 61 64 64  PutChar(ch)..add
09c0: 63 68 28 63 68 29 0a 23 64 65 66 69 6e 65 20 53  ch(ch).#define S
09d0: 65 74 53 74 79 6c 65 28 73 74 79 6c 65 29 09 09  etStyle(style)..
09e0: 61 74 74 72 73 65 74 28 73 74 79 6c 65 41 74 74  attrset(styleAtt
09f0: 72 69 62 75 74 65 73 5b 73 74 79 6c 65 5d 29 0a  ributes[style]).
0a00: 0a 0a 2f 2a 0a 20 2a 20 54 65 78 74 49 6e 66 6f  ../*. * TextInfo
0a10: 20 2d 20 63 6c 69 65 6e 74 20 64 61 74 61 20 70   - client data p
0a20: 61 73 73 65 64 20 74 6f 20 44 72 61 77 54 65 78  assed to DrawTex
0a30: 74 53 70 61 6e 28 29 20 77 68 65 6e 20 64 72 61  tSpan() when dra
0a40: 77 69 6e 67 20 74 65 78 74 2e 0a 20 2a 2f 0a 74  wing text.. */.t
0a50: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 7b 0a  ypedef struct {.
0a60: 20 20 20 20 63 68 61 72 20 2a 73 74 72 3b 09 09      char *str;..
0a70: 2f 2a 20 53 74 72 69 6e 67 20 62 65 69 6e 67 20  /* String being 
0a80: 64 72 61 77 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e  drawn. */.    in
0a90: 74 20 6c 65 66 74 3b 09 09 2f 2a 20 41 62 73 6f  t left;../* Abso
0aa0: 6c 75 74 65 20 58 20 63 6f 6f 72 64 69 6e 61 74  lute X coordinat
0ab0: 65 20 74 6f 20 64 72 61 77 20 66 69 72 73 74 20  e to draw first 
0ac0: 63 68 61 72 61 63 74 65 72 0a 20 20 20 20 09 09  character.    ..
0ad0: 09 20 2a 20 6f 66 20 73 74 72 69 6e 67 20 61 74  . * of string at
0ae0: 2e 20 2a 2f 0a 7d 20 54 65 78 74 49 6e 66 6f 3b  . */.} TextInfo;
0af0: 0a 0a 2f 2a 0a 20 2a 20 43 75 72 73 65 73 20 61  ../*. * Curses a
0b00: 74 74 72 69 62 75 74 65 73 20 74 68 61 74 20 63  ttributes that c
0b10: 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 43 54 6b  orrespond to CTk
0b20: 20 73 74 79 6c 65 73 2e 0a 20 2a 20 54 68 69 73   styles.. * This
0b30: 20 64 65 66 69 6e 69 74 69 6f 6e 20 6d 75 73 74   definition must
0b40: 20 62 65 20 6d 6f 64 69 66 69 65 64 20 69 6e 20   be modified in 
0b50: 63 6f 6e 63 65 72 74 20 77 69 74 68 0a 20 2a 20  concert with. * 
0b60: 74 68 65 20 43 74 6b 5f 53 74 79 6c 65 20 64 65  the Ctk_Style de
0b70: 66 69 6e 69 74 69 6f 6e 20 69 6e 20 74 6b 2e 68  finition in tk.h
0b80: 0a 20 2a 2f 0a 63 68 74 79 70 65 20 73 74 79 6c  . */.chtype styl
0b90: 65 41 74 74 72 69 62 75 74 65 73 5b 5d 20 3d 20  eAttributes[] = 
0ba0: 7b 0a 20 20 20 20 41 5f 4e 4f 52 4d 41 4c 2c 20  {.    A_NORMAL, 
0bb0: 41 5f 4e 4f 52 4d 41 4c 2c 20 41 5f 55 4e 44 45  A_NORMAL, A_UNDE
0bc0: 52 4c 49 4e 45 2c 20 41 5f 52 45 56 45 52 53 45  RLINE, A_REVERSE
0bd0: 2c 20 41 5f 44 49 4d 2c 20 41 5f 42 4f 4c 44 2c  , A_DIM, A_BOLD,
0be0: 0a 20 20 20 20 41 5f 44 49 4d 2c 20 41 5f 42 4f  .    A_DIM, A_BO
0bf0: 4c 44 2c 20 41 5f 53 54 41 4e 44 4f 55 54 2c 20  LD, A_STANDOUT, 
0c00: 41 5f 52 45 56 45 52 53 45 0a 7d 3b 0a 0a 2f 2a  A_REVERSE.};../*
0c10: 0a 20 2a 20 43 75 72 72 65 6e 74 20 64 69 73 70  . * Current disp
0c20: 6c 61 79 20 66 6f 72 20 69 6e 70 75 74 2f 6f 75  lay for input/ou
0c30: 74 70 75 74 2e 20 20 43 68 61 6e 67 65 64 20 62  tput.  Changed b
0c40: 79 20 53 65 74 44 69 73 70 6c 61 79 28 29 2e 0a  y SetDisplay()..
0c50: 20 2a 2f 0a 0a 54 6b 44 69 73 70 6c 61 79 20 2a   */..TkDisplay *
0c60: 63 75 72 44 69 73 70 50 74 72 20 3d 20 4e 55 4c  curDispPtr = NUL
0c70: 4c 3b 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 64 61  L;../*. * The da
0c80: 74 61 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ta structure and
0c90: 20 68 61 73 68 20 74 61 62 6c 65 20 62 65 6c 6f   hash table belo
0ca0: 77 20 61 72 65 20 75 73 65 64 20 74 6f 20 6d 61  w are used to ma
0cb0: 70 20 66 72 6f 6d 0a 20 2a 20 72 61 77 20 6b 65  p from. * raw ke
0cc0: 79 63 6f 64 65 73 20 28 63 75 72 73 65 73 29 20  ycodes (curses) 
0cd0: 74 6f 20 6b 65 79 73 79 6d 73 20 61 6e 64 20 6d  to keysyms and m
0ce0: 6f 64 69 66 69 65 72 20 6d 61 73 6b 73 2e 0a 20  odifier masks.. 
0cf0: 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  */..typedef stru
0d00: 63 74 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  ct {.    int cod
0d10: 65 3b 09 09 09 2f 2a 20 43 75 72 73 65 73 20 6b  e;.../* Curses k
0d20: 65 79 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20  ey code. */.    
0d30: 4b 65 79 53 79 6d 20 73 79 6d 3b 09 09 09 2f 2a  KeySym sym;.../*
0d40: 20 4b 65 79 20 73 79 6d 2e 20 2a 2f 0a 20 20 20   Key sym. */.   
0d50: 20 69 6e 74 20 6d 6f 64 4d 61 73 6b 3b 09 09 2f   int modMask;../
0d60: 2a 20 4d 6f 64 69 66 69 65 72 73 2e 20 2a 2f 0a  * Modifiers. */.
0d70: 7d 20 4b 65 79 43 6f 64 65 49 6e 66 6f 3b 0a 0a  } KeyCodeInfo;..
0d80: 73 74 61 74 69 63 20 4b 65 79 43 6f 64 65 49 6e  static KeyCodeIn
0d90: 66 6f 20 6b 65 79 43 6f 64 65 41 72 72 61 79 5b  fo keyCodeArray[
0da0: 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22  ] = {.#include "
0db0: 6b 65 79 43 6f 64 65 73 2e 68 22 0a 20 20 20 20  keyCodes.h".    
0dc0: 7b 30 2c 20 30 2c 20 30 7d 0a 7d 3b 0a 73 74 61  {0, 0, 0}.};.sta
0dd0: 74 69 63 20 54 63 6c 5f 48 61 73 68 54 61 62 6c  tic Tcl_HashTabl
0de0: 65 20 6b 65 79 43 6f 64 65 54 61 62 6c 65 3b 09  e keyCodeTable;.
0df0: 2f 2a 20 48 61 73 68 65 64 20 66 6f 72 6d 20 6f  /* Hashed form o
0e00: 66 20 61 62 6f 76 65 20 73 74 72 75 63 74 75 72  f above structur
0e10: 65 2e 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72  e. */../*. * For
0e20: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
0e30: 73 20 6f 66 20 73 74 61 74 69 63 20 66 75 6e 63  s of static func
0e40: 74 69 6f 6e 73 2e 0a 20 2a 2f 0a 0a 73 74 61 74  tions.. */..stat
0e50: 69 63 20 76 6f 69 64 09 09 54 65 72 6d 46 69 6c  ic void..TermFil
0e60: 65 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53  eProc _ANSI_ARGS
0e70: 5f 28 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  _((ClientData cl
0e80: 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 20 20 20  ientData,....   
0e90: 20 69 6e 74 20 6d 61 73 6b 29 29 3b 0a 73 74 61   int mask));.sta
0ea0: 74 69 63 20 76 6f 69 64 09 09 52 65 66 72 65 73  tic void..Refres
0eb0: 68 44 69 73 70 6c 61 79 20 5f 41 4e 53 49 5f 41  hDisplay _ANSI_A
0ec0: 52 47 53 5f 28 28 54 6b 44 69 73 70 6c 61 79 20  RGS_((TkDisplay 
0ed0: 2a 64 69 73 70 50 74 72 29 29 3b 0a 73 74 61 74  *dispPtr));.stat
0ee0: 69 63 20 76 6f 69 64 09 09 44 72 61 77 54 65 78  ic void..DrawTex
0ef0: 74 53 70 61 6e 20 5f 41 4e 53 49 5f 41 52 47 53  tSpan _ANSI_ARGS
0f00: 5f 28 28 69 6e 74 20 6c 65 66 74 2c 20 69 6e 74  _((int left, int
0f10: 20 72 69 67 68 74 2c 20 69 6e 74 20 79 2c 0a 09   right, int y,..
0f20: 09 09 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61  ..    ClientData
0f30: 20 64 61 74 61 29 29 3b 0a 73 74 61 74 69 63 20   data));.static 
0f40: 76 6f 69 64 09 09 46 69 6c 6c 53 70 61 6e 20 5f  void..FillSpan _
0f50: 41 4e 53 49 5f 41 52 47 53 5f 28 28 69 6e 74 20  ANSI_ARGS_((int 
0f60: 6c 65 66 74 2c 20 69 6e 74 20 72 69 67 68 74 2c  left, int right,
0f70: 20 69 6e 74 20 79 2c 0a 09 09 09 20 20 20 20 43   int y,....    C
0f80: 6c 69 65 6e 74 44 61 74 61 20 64 61 74 61 29 29  lientData data))
0f90: 3b 0a 0a 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;...../*. *-----
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
0fe0: 43 74 6b 44 69 73 70 6c 61 79 49 6e 69 74 20 2d  CtkDisplayInit -
0ff0: 2d 0a 20 2a 0a 20 2a 09 4f 70 65 6e 73 20 61 20  -. *. *.Opens a 
1000: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 65  connection to te
1010: 72 6d 69 6e 61 6c 20 77 69 74 68 20 73 70 65 63  rminal with spec
1020: 69 66 69 65 64 20 6e 61 6d 65 2c 0a 20 2a 09 61  ified name,. *.a
1030: 6e 64 20 73 74 6f 72 65 73 20 74 65 72 6d 69 6e  nd stores termin
1040: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  al information i
1050: 6e 20 74 68 65 20 64 69 73 70 6c 61 79 0a 20 2a  n the display. *
1060: 09 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74  .structure point
1070: 65 64 20 74 6f 20 62 79 20 60 64 69 73 70 50 74  ed to by `dispPt
1080: 72 27 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  r'.. *. * Result
1090: 73 3a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 54  s:. *.Standard T
10a0: 43 4c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  CL result.. *. *
10b0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
10c0: 2a 09 54 68 65 20 73 63 72 65 65 6e 20 69 73 20  *.The screen is 
10d0: 63 6c 65 61 72 65 64 2c 20 61 6e 64 20 61 6c 6c  cleared, and all
10e0: 20 73 6f 72 74 73 20 6f 66 20 49 2f 4f 20 6f 70   sorts of I/O op
10f0: 74 69 6f 6e 73 0a 20 2a 09 61 72 65 20 73 65 74  tions. *.are set
1100: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 20 66   appropriately f
1110: 6f 72 20 61 20 66 75 6c 6c 2d 73 63 72 65 65 6e  or a full-screen
1120: 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 0a 20 2a   application.. *
1130: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
1140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1170: 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 43 74 6b 44 69  -. */..int.CtkDi
1180: 73 70 6c 61 79 49 6e 69 74 28 69 6e 74 65 72 70  splayInit(interp
1190: 2c 20 64 69 73 70 50 74 72 2c 20 74 65 72 6d 4e  , dispPtr, termN
11a0: 61 6d 65 29 0a 20 20 20 20 54 63 6c 5f 49 6e 74  ame).    Tcl_Int
11b0: 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 20  erp *interp;.   
11c0: 20 54 6b 44 69 73 70 6c 61 79 20 2a 64 69 73 70   TkDisplay *disp
11d0: 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 74  Ptr;.    char *t
11e0: 65 72 6d 4e 61 6d 65 3b 0a 7b 0a 20 20 20 20 63  ermName;.{.    c
11f0: 68 61 72 20 2a 74 79 70 65 3b 0a 20 20 20 20 69  har *type;.    i
1200: 6e 74 20 6c 65 6e 67 74 68 3b 0a 20 20 20 20 46  nt length;.    F
1210: 49 4c 45 20 2a 6f 75 74 50 74 72 3b 0a 0a 20 20  ILE *outPtr;..  
1220: 20 20 69 6e 74 20 66 64 3b 09 09 09 2f 2a 20 46    int fd;.../* F
1230: 6f 72 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  or the return va
1240: 6c 75 65 20 6f 66 20 54 63 6c 5f 47 65 74 43 68  lue of Tcl_GetCh
1250: 61 6e 6e 65 6c 48 61 6e 64 6c 65 20 2a 2f 0a 20  annelHandle */. 
1260: 20 20 20 2f 2a 20 54 68 65 20 54 63 6c 5f 46 69     /* The Tcl_Fi
1270: 6c 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  le is no longer 
1280: 6e 65 65 64 65 64 2c 20 73 69 6e 63 65 20 43 68  needed, since Ch
1290: 61 6e 6e 65 6c 73 20 6e 6f 77 20 73 75 62 73 75  annels now subsu
12a0: 6d 65 20 74 68 65 69 72 20 77 6f 72 6b 20 2a 2f  me their work */
12b0: 0a 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74  ..    static int
12c0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30   initialized = 0
12d0: 3b 0a 0a 20 20 20 20 69 66 20 28 21 69 6e 69 74  ;..    if (!init
12e0: 69 61 6c 69 7a 65 64 29 20 7b 0a 09 72 65 67 69  ialized) {..regi
12f0: 73 74 65 72 20 4b 65 79 43 6f 64 65 49 6e 66 6f  ster KeyCodeInfo
1300: 20 2a 63 6f 64 65 50 74 72 3b 0a 09 72 65 67 69   *codePtr;..regi
1310: 73 74 65 72 20 54 63 6c 5f 48 61 73 68 45 6e 74  ster Tcl_HashEnt
1320: 72 79 20 2a 68 50 74 72 3b 0a 09 69 6e 74 20 64  ry *hPtr;..int d
1330: 75 6d 6d 79 3b 0a 0a 09 69 6e 69 74 69 61 6c 69  ummy;...initiali
1340: 7a 65 64 20 3d 20 31 3b 0a 09 54 63 6c 5f 49 6e  zed = 1;..Tcl_In
1350: 69 74 48 61 73 68 54 61 62 6c 65 28 26 6b 65 79  itHashTable(&key
1360: 43 6f 64 65 54 61 62 6c 65 2c 20 54 43 4c 5f 4f  CodeTable, TCL_O
1370: 4e 45 5f 57 4f 52 44 5f 4b 45 59 53 29 3b 0a 09  NE_WORD_KEYS);..
1380: 66 6f 72 20 28 63 6f 64 65 50 74 72 20 3d 20 6b  for (codePtr = k
1390: 65 79 43 6f 64 65 41 72 72 61 79 3b 20 63 6f 64  eyCodeArray; cod
13a0: 65 50 74 72 2d 3e 63 6f 64 65 20 21 3d 20 30 3b  ePtr->code != 0;
13b0: 20 63 6f 64 65 50 74 72 2b 2b 29 20 7b 0a 09 20   codePtr++) {.. 
13c0: 20 20 20 68 50 74 72 20 3d 20 54 63 6c 5f 43 72     hPtr = Tcl_Cr
13d0: 65 61 74 65 48 61 73 68 45 6e 74 72 79 28 26 6b  eateHashEntry(&k
13e0: 65 79 43 6f 64 65 54 61 62 6c 65 2c 0a 09 20 20  eyCodeTable,..  
13f0: 20 20 09 20 20 20 20 28 63 68 61 72 20 2a 29 20    .    (char *) 
1400: 63 6f 64 65 50 74 72 2d 3e 63 6f 64 65 2c 20 26  codePtr->code, &
1410: 64 75 6d 6d 79 29 3b 0a 09 20 20 20 20 54 63 6c  dummy);..    Tcl
1420: 5f 53 65 74 48 61 73 68 56 61 6c 75 65 28 68 50  _SetHashValue(hP
1430: 74 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  tr, (ClientData)
1440: 20 63 6f 64 65 50 74 72 29 3b 0a 09 7d 0a 20 20   codePtr);..}.  
1450: 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 20 3d 20    }..    type = 
1460: 73 74 72 63 68 72 28 74 65 72 6d 4e 61 6d 65 2c  strchr(termName,
1470: 20 27 3a 27 29 3b 0a 20 20 20 20 69 66 20 28 74   ':');.    if (t
1480: 79 70 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 20  ype == NULL) {. 
1490: 20 20 20 09 6c 65 6e 67 74 68 20 3d 20 73 74 72     .length = str
14a0: 6c 65 6e 28 74 65 72 6d 4e 61 6d 65 29 3b 0a 20  len(termName);. 
14b0: 20 20 20 09 74 79 70 65 20 3d 20 67 65 74 65 6e     .type = geten
14c0: 76 28 22 43 54 4b 5f 54 45 52 4d 22 29 3b 0a 09  v("CTK_TERM");..
14d0: 69 66 20 28 21 74 79 70 65 29 20 74 79 70 65 20  if (!type) type 
14e0: 3d 20 67 65 74 65 6e 76 28 22 54 45 52 4d 22 29  = getenv("TERM")
14f0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
1500: 6c 65 6e 67 74 68 20 3d 20 74 79 70 65 20 2d 20  length = type - 
1510: 74 65 72 6d 4e 61 6d 65 3b 0a 09 74 79 70 65 2b  termName;..type+
1520: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 69 73  +;.    }.    dis
1530: 70 50 74 72 2d 3e 74 79 70 65 20 3d 20 28 63 68  pPtr->type = (ch
1540: 61 72 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75  ar *) ckalloc((u
1550: 6e 73 69 67 6e 65 64 29 20 73 74 72 6c 65 6e 28  nsigned) strlen(
1560: 74 79 70 65 29 20 2b 20 31 29 3b 0a 20 20 20 20  type) + 1);.    
1570: 73 74 72 63 70 79 28 64 69 73 70 50 74 72 2d 3e  strcpy(dispPtr->
1580: 74 79 70 65 2c 20 74 79 70 65 29 3b 0a 0a 20 20  type, type);..  
1590: 20 20 64 69 73 70 50 74 72 2d 3e 6e 61 6d 65 20    dispPtr->name 
15a0: 3d 20 28 63 68 61 72 20 2a 29 20 63 6b 61 6c 6c  = (char *) ckall
15b0: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 28 6c  oc((unsigned) (l
15c0: 65 6e 67 74 68 2b 31 29 29 3b 0a 20 20 20 20 73  ength+1));.    s
15d0: 74 72 6e 63 70 79 28 64 69 73 70 50 74 72 2d 3e  trncpy(dispPtr->
15e0: 6e 61 6d 65 2c 20 74 65 72 6d 4e 61 6d 65 2c 20  name, termName, 
15f0: 6c 65 6e 67 74 68 29 3b 0a 20 20 20 20 64 69 73  length);.    dis
1600: 70 50 74 72 2d 3e 6e 61 6d 65 5b 6c 65 6e 67 74  pPtr->name[lengt
1610: 68 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20  h] = '\0';..    
1620: 69 66 20 28 73 74 72 63 6d 70 28 64 69 73 70 50  if (strcmp(dispP
1630: 74 72 2d 3e 6e 61 6d 65 2c 20 22 74 74 79 22 29  tr->name, "tty")
1640: 20 3d 3d 20 30 29 20 7b 0a 09 64 69 73 70 50 74   == 0) {..dispPt
1650: 72 2d 3e 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65  r->chan = Tcl_Ge
1660: 74 53 74 64 43 68 61 6e 6e 65 6c 28 54 43 4c 5f  tStdChannel(TCL_
1670: 53 54 44 49 4e 29 3b 0a 20 20 20 20 7d 20 65 6c  STDIN);.    } el
1680: 73 65 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45  se {.#ifdef HAVE
1690: 5f 53 45 54 5f 54 45 52 4d 0a 09 64 69 73 70 50  _SET_TERM..dispP
16a0: 74 72 2d 3e 63 68 61 6e 20 3d 20 48 41 56 45 5f  tr->chan = HAVE_
16b0: 53 45 54 5f 54 45 52 4d 20 3f 20 54 63 6c 5f 4f  SET_TERM ? Tcl_O
16c0: 70 65 6e 46 69 6c 65 43 68 61 6e 6e 65 6c 28 69  penFileChannel(i
16d0: 6e 74 65 72 70 2c 20 64 69 73 70 50 74 72 2d 3e  nterp, dispPtr->
16e0: 6e 61 6d 65 2c 20 0a 09 09 09 09 09 09 09 20 20  name, ........  
16f0: 20 20 22 72 2b 22 2c 20 30 29 20 3a 20 4e 55 4c    "r+", 0) : NUL
1700: 4c 3b 0a 23 65 6c 73 65 0a 09 64 69 73 70 50 74  L;.#else..dispPt
1710: 72 2d 3e 63 68 61 6e 20 3d 20 4e 55 4c 4c 3b 0a  r->chan = NULL;.
1720: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69  #endif.        i
1730: 66 20 28 64 69 73 70 50 74 72 2d 3e 63 68 61 6e  f (dispPtr->chan
1740: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   == NULL) {..   
1750: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1760: 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64  t(interp, "could
1770: 6e 27 74 20 63 6f 6e 6e 65 63 74 20 74 6f 20 64  n't connect to d
1780: 65 76 69 63 65 20 5c 22 22 2c 0a 09 09 20 20 20  evice \"",...   
1790: 20 64 69 73 70 50 74 72 2d 3e 6e 61 6d 65 2c 20   dispPtr->name, 
17a0: 22 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  "\"", (char *) N
17b0: 55 4c 4c 29 3b 0a 09 20 20 20 20 67 6f 74 6f 20  ULL);..    goto 
17c0: 65 72 72 6f 72 3b 0a 09 7d 0a 20 20 20 20 7d 0a  error;..}.    }.
17d0: 20 20 20 20 69 66 20 28 20 54 63 6c 5f 47 65 74      if ( Tcl_Get
17e0: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 64 69  ChannelHandle(di
17f0: 73 70 50 74 72 2d 3e 63 68 61 6e 2c 20 54 43 4c  spPtr->chan, TCL
1800: 5f 52 45 41 44 41 42 4c 45 2c 20 26 28 64 69 73  _READABLE, &(dis
1810: 70 50 74 72 2d 3e 66 64 29 20 29 20 21 3d 20 54  pPtr->fd) ) != T
1820: 43 4c 5f 4f 4b 20 29 0a 20 20 20 20 7b 0a 20 20  CL_OK ).    {.  
1830: 20 20 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73    .Tcl_AppendRes
1840: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75  ult(interp, "cou
1850: 6c 64 6e 27 74 20 67 65 74 20 64 65 76 69 63 65  ldn't get device
1860: 20 68 61 6e 64 6c 65 20 66 6f 72 20 64 65 76 69   handle for devi
1870: 63 65 20 5c 22 22 2c 0a 20 20 20 20 09 09 64 69  ce \"",.    ..di
1880: 73 70 50 74 72 2d 3e 6e 61 6d 65 2c 20 22 5c 22  spPtr->name, "\"
1890: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
18a0: 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
18b0: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
18c0: 20 0a 20 20 20 20 69 66 20 28 21 69 73 61 74 74   .    if (!isatt
18d0: 79 28 64 69 73 70 50 74 72 2d 3e 66 64 29 29 20  y(dispPtr->fd)) 
18e0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
18f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 64 69 73  ult(interp, "dis
1900: 70 6c 61 79 20 64 65 76 69 63 65 20 5c 22 22 2c  play device \"",
1910: 20 64 69 73 70 50 74 72 2d 3e 6e 61 6d 65 2c 0a   dispPtr->name,.
1920: 09 09 22 5c 22 20 69 73 20 6e 6f 74 20 61 20 74  .."\" is not a t
1930: 74 79 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ty", (char *) NU
1940: 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72  LL);..goto error
1950: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
1960: 64 69 73 70 50 74 72 2d 3e 66 64 20 3d 3d 20 30  dispPtr->fd == 0
1970: 29 20 7b 0a 09 64 69 73 70 50 74 72 2d 3e 69 6e  ) {..dispPtr->in
1980: 50 74 72 20 3d 20 73 74 64 69 6e 3b 0a 09 6f 75  Ptr = stdin;..ou
1990: 74 50 74 72 20 3d 20 73 74 64 6f 75 74 3b 0a 20  tPtr = stdout;. 
19a0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 64 69 73     } else {..dis
19b0: 70 50 74 72 2d 3e 69 6e 50 74 72 20 3d 20 66 64  pPtr->inPtr = fd
19c0: 6f 70 65 6e 28 64 69 73 70 50 74 72 2d 3e 66 64  open(dispPtr->fd
19d0: 2c 20 22 72 2b 22 29 3b 0a 09 6f 75 74 50 74 72  , "r+");..outPtr
19e0: 20 3d 20 64 69 73 70 50 74 72 2d 3e 69 6e 50 74   = dispPtr->inPt
19f0: 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 69  r;.    }..    di
1a00: 73 70 50 74 72 2d 3e 64 69 73 70 6c 61 79 20 3d  spPtr->display =
1a10: 0a 09 20 20 20 20 28 43 6c 69 65 6e 74 44 61 74  ..    (ClientDat
1a20: 61 29 20 6e 65 77 74 65 72 6d 28 64 69 73 70 50  a) newterm(dispP
1a30: 74 72 2d 3e 74 79 70 65 2c 20 6f 75 74 50 74 72  tr->type, outPtr
1a40: 2c 20 64 69 73 70 50 74 72 2d 3e 69 6e 50 74 72  , dispPtr->inPtr
1a50: 29 3b 0a 20 20 20 20 53 65 74 44 69 73 70 6c 61  );.    SetDispla
1a60: 79 28 64 69 73 70 50 74 72 29 3b 0a 20 20 20 20  y(dispPtr);.    
1a70: 72 61 77 28 29 3b 0a 20 20 20 20 6e 6f 6e 6c 28  raw();.    nonl(
1a80: 29 3b 0a 20 20 20 20 6e 6f 65 63 68 6f 28 29 3b  );.    noecho();
1a90: 0a 20 20 20 20 6b 65 79 70 61 64 28 73 74 64 73  .    keypad(stds
1aa0: 63 72 2c 20 54 52 55 45 29 3b 0a 0a 20 20 20 20  cr, TRUE);..    
1ab0: 54 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e 65  Tcl_CreateChanne
1ac0: 6c 48 61 6e 64 6c 65 72 28 64 69 73 70 50 74 72  lHandler(dispPtr
1ad0: 2d 3e 63 68 61 6e 2c 20 54 43 4c 5f 52 45 41 44  ->chan, TCL_READ
1ae0: 41 42 4c 45 2c 0a 20 20 20 20 09 20 20 20 20 54  ABLE,.    .    T
1af0: 65 72 6d 46 69 6c 65 50 72 6f 63 2c 20 28 43 6c  ermFileProc, (Cl
1b00: 69 65 6e 74 44 61 74 61 29 20 64 69 73 70 50 74  ientData) dispPt
1b10: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
1b20: 43 4c 5f 4f 4b 3b 0a 0a 65 72 72 6f 72 3a 0a 20  CL_OK;..error:. 
1b30: 20 20 20 63 6b 66 72 65 65 28 64 69 73 70 50 74     ckfree(dispPt
1b40: 72 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 64 69  r->name);.    di
1b50: 73 70 50 74 72 2d 3e 6e 61 6d 65 20 3d 20 4e 55  spPtr->name = NU
1b60: 4c 4c 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 64  LL;.    ckfree(d
1b70: 69 73 70 50 74 72 2d 3e 74 79 70 65 29 3b 0a 20  ispPtr->type);. 
1b80: 20 20 20 64 69 73 70 50 74 72 2d 3e 74 79 70 65     dispPtr->type
1b90: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74   = NULL;.    ret
1ba0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d  urn TCL_ERROR;.}
1bb0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bf0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 74 6b  ------. *. * Ctk
1c00: 44 69 73 70 6c 61 79 45 6e 64 20 2d 2d 0a 20 2a  DisplayEnd --. *
1c10: 0a 20 2a 09 45 6e 64 73 20 43 54 6b 27 73 20 75  . *.Ends CTk's u
1c20: 73 65 20 6f 66 20 74 65 72 6d 69 6e 61 6c 2e 0a  se of terminal..
1c30: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
1c40: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69  *.None.. *. * Si
1c50: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54  de effects:. *.T
1c60: 68 65 20 74 65 72 6d 69 6e 61 6c 20 69 73 20 72  he terminal is r
1c70: 65 73 74 6f 72 65 64 20 74 6f 20 6c 69 6e 65 20  estored to line 
1c80: 6d 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  mode.. *. *-----
1c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 76  ---------. */..v
1cd0: 6f 69 64 0a 43 74 6b 44 69 73 70 6c 61 79 45 6e  oid.CtkDisplayEn
1ce0: 64 28 64 69 73 70 50 74 72 29 0a 20 20 20 20 54  d(dispPtr).    T
1cf0: 6b 44 69 73 70 6c 61 79 20 2a 64 69 73 70 50 74  kDisplay *dispPt
1d00: 72 3b 0a 7b 0a 20 20 20 20 53 65 74 44 69 73 70  r;.{.    SetDisp
1d10: 6c 61 79 28 64 69 73 70 50 74 72 29 3b 0a 20 20  lay(dispPtr);.  
1d20: 20 20 63 75 72 73 5f 73 65 74 28 31 29 3b 0a 20    curs_set(1);. 
1d30: 20 20 20 65 6e 64 77 69 6e 28 29 3b 0a 0a 20 20     endwin();..  
1d40: 20 20 54 63 6c 5f 44 65 6c 65 74 65 43 68 61 6e    Tcl_DeleteChan
1d50: 6e 65 6c 48 61 6e 64 6c 65 72 28 64 69 73 70 50  nelHandler(dispP
1d60: 74 72 2d 3e 63 68 61 6e 2c 0a 09 09 54 65 72 6d  tr->chan,...Term
1d70: 46 69 6c 65 50 72 6f 63 2c 20 28 43 6c 69 65 6e  FileProc, (Clien
1d80: 74 44 61 74 61 29 20 64 69 73 70 50 74 72 29 3b  tData) dispPtr);
1d90: 0a 20 20 20 20 69 66 20 28 64 69 73 70 50 74 72  .    if (dispPtr
1da0: 2d 3e 69 6e 50 74 72 20 21 3d 20 73 74 64 69 6e  ->inPtr != stdin
1db0: 29 20 7b 0a 20 20 20 20 09 66 63 6c 6f 73 65 28  ) {.    .fclose(
1dc0: 64 69 73 70 50 74 72 2d 3e 69 6e 50 74 72 29 3b  dispPtr->inPtr);
1dd0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 6b 66 72 65  .    }.    ckfre
1de0: 65 28 64 69 73 70 50 74 72 2d 3e 6e 61 6d 65 29  e(dispPtr->name)
1df0: 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 64 69 73  ;.    ckfree(dis
1e00: 70 50 74 72 2d 3e 74 79 70 65 29 3b 0a 7d 0a 0c  pPtr->type);.}..
1e10: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
1e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e50: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 74 6b 5f 44  ----. *. * Ctk_D
1e60: 69 73 70 6c 61 79 46 6c 75 73 68 20 2d 2d 0a 20  isplayFlush --. 
1e70: 2a 0a 20 2a 09 46 6c 75 73 68 65 73 20 61 6c 6c  *. *.Flushes all
1e80: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 73   output to the s
1e90: 70 65 63 69 66 69 65 64 20 64 69 73 70 6c 61 79  pecified display
1ea0: 2e 20 20 49 66 20 64 69 73 70 50 74 72 0a 20 2a  .  If dispPtr. *
1eb0: 09 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 6f 75  .is NULL then ou
1ec0: 74 70 75 74 20 74 6f 20 61 6c 6c 20 63 6f 6e 6e  tput to all conn
1ed0: 65 63 74 65 64 20 64 69 73 70 6c 61 79 73 20 69  ected displays i
1ee0: 73 20 66 6c 75 73 68 65 64 2e 0a 20 2a 0a 20 2a  s flushed.. *. *
1ef0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
1f00: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  e.. *. * Side ef
1f10: 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 74 65  fects:. *.The te
1f20: 72 6d 69 6e 61 6c 20 64 69 73 70 6c 61 79 20 69  rminal display i
1f30: 73 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a 20 2a  s updated.. *. *
1f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
1f80: 2a 2f 0a 0a 76 6f 69 64 0a 43 74 6b 5f 44 69 73  */..void.Ctk_Dis
1f90: 70 6c 61 79 46 6c 75 73 68 28 64 69 73 70 50 74  playFlush(dispPt
1fa0: 72 29 0a 20 20 20 20 54 6b 44 69 73 70 6c 61 79  r).    TkDisplay
1fb0: 20 2a 64 69 73 70 50 74 72 3b 0a 7b 0a 20 20 20   *dispPtr;.{.   
1fc0: 20 69 66 20 28 64 69 73 70 50 74 72 29 20 7b 0a   if (dispPtr) {.
1fd0: 09 52 65 66 72 65 73 68 44 69 73 70 6c 61 79 28  .RefreshDisplay(
1fe0: 64 69 73 70 50 74 72 29 3b 0a 20 20 20 20 7d 20  dispPtr);.    } 
1ff0: 65 6c 73 65 20 7b 0a 20 20 20 20 09 66 6f 72 20  else {.    .for 
2000: 28 64 69 73 70 50 74 72 20 3d 20 74 6b 44 69 73  (dispPtr = tkDis
2010: 70 6c 61 79 4c 69 73 74 3b 0a 20 20 20 20 09 09  playList;.    ..
2020: 64 69 73 70 50 74 72 20 21 3d 20 28 54 6b 44 69  dispPtr != (TkDi
2030: 73 70 6c 61 79 2a 29 20 4e 55 4c 4c 3b 0a 20 20  splay*) NULL;.  
2040: 20 20 09 09 64 69 73 70 50 74 72 20 3d 20 64 69    ..dispPtr = di
2050: 73 70 50 74 72 2d 3e 6e 65 78 74 50 74 72 29 20  spPtr->nextPtr) 
2060: 7b 0a 09 20 20 20 20 52 65 66 72 65 73 68 44 69  {..    RefreshDi
2070: 73 70 6c 61 79 28 64 69 73 70 50 74 72 29 3b 0a  splay(dispPtr);.
2080: 09 7d 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a  .}.    }.}.../*.
2090: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
20a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20d0: 0a 20 2a 0a 20 2a 20 43 74 6b 5f 44 69 73 70 6c  . *. * Ctk_Displ
20e0: 61 79 52 65 64 72 61 77 20 2d 2d 0a 20 2a 0a 20  ayRedraw --. *. 
20f0: 2a 09 46 6f 72 63 65 20 61 20 63 6f 6d 70 6c 65  *.Force a comple
2100: 74 65 20 72 65 64 72 61 77 20 6f 66 20 74 68 65  te redraw of the
2110: 20 73 70 65 63 69 66 69 65 64 20 64 69 73 70 6c   specified displ
2120: 61 79 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ay.. *. * Result
2130: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
2140: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
2150: 20 2a 09 54 68 65 20 65 6e 74 69 72 65 20 74 65   *.The entire te
2160: 72 6d 69 6e 61 6c 20 64 69 73 70 6c 61 79 20 69  rminal display i
2170: 73 20 72 65 64 72 61 77 6e 2e 0a 20 2a 0a 20 2a  s redrawn.. *. *
2180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
21c0: 2a 2f 0a 0a 76 6f 69 64 0a 43 74 6b 5f 44 69 73  */..void.Ctk_Dis
21d0: 70 6c 61 79 52 65 64 72 61 77 28 64 69 73 70 50  playRedraw(dispP
21e0: 74 72 29 0a 20 20 20 20 54 6b 44 69 73 70 6c 61  tr).    TkDispla
21f0: 79 20 2a 64 69 73 70 50 74 72 3b 0a 7b 0a 20 20  y *dispPtr;.{.  
2200: 20 20 53 65 74 44 69 73 70 6c 61 79 28 64 69 73    SetDisplay(dis
2210: 70 50 74 72 29 3b 0a 20 20 20 20 63 6c 65 61 72  pPtr);.    clear
2220: 6f 6b 28 73 74 64 73 63 72 2c 20 31 29 3b 0a 7d  ok(stdscr, 1);.}
2230: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
2240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2270: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 74 6b  ------. *. * Ctk
2280: 5f 53 65 74 43 75 72 73 6f 72 20 2d 2d 0a 20 2a  _SetCursor --. *
2290: 0a 20 2a 09 50 6f 73 74 69 6f 6e 73 20 64 69 73  . *.Postions dis
22a0: 70 6c 61 79 20 63 75 72 73 6f 72 20 69 6e 20 77  play cursor in w
22b0: 69 6e 64 6f 77 20 61 74 20 73 70 65 63 69 66 69  indow at specifi
22c0: 65 64 20 28 6c 6f 63 61 6c 29 0a 20 2a 09 63 6f  ed (local). *.co
22d0: 6f 72 64 69 6e 61 74 65 73 2e 0a 20 2a 0a 20 2a  ordinates.. *. *
22e0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
22f0: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  e.. *. * Side ef
2300: 66 65 63 74 73 3a 0a 20 2a 09 4d 6f 64 69 66 69  fects:. *.Modifi
2310: 65 73 20 77 69 6e 64 6f 77 27 73 20 64 69 73 70  es window's disp
2320: 6c 61 79 20 73 74 72 75 63 74 75 72 65 2e 0a 20  lay structure.. 
2330: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
2340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2370: 20 2a 2f 0a 0a 76 6f 69 64 0a 43 74 6b 5f 53 65   */..void.Ctk_Se
2380: 74 43 75 72 73 6f 72 28 77 69 6e 50 74 72 2c 20  tCursor(winPtr, 
2390: 78 2c 20 79 29 0a 20 20 20 20 54 6b 57 69 6e 64  x, y).    TkWind
23a0: 6f 77 20 2a 77 69 6e 50 74 72 3b 0a 20 20 20 20  ow *winPtr;.    
23b0: 69 6e 74 20 78 2c 20 79 3b 0a 7b 0a 20 20 20 20  int x, y;.{.    
23c0: 54 6b 44 69 73 70 6c 61 79 20 2a 64 69 73 70 50  TkDisplay *dispP
23d0: 74 72 20 3d 20 54 6b 5f 44 69 73 70 6c 61 79 28  tr = Tk_Display(
23e0: 77 69 6e 50 74 72 29 3b 0a 20 20 20 20 64 69 73  winPtr);.    dis
23f0: 70 50 74 72 2d 3e 63 75 72 73 6f 72 50 74 72 20  pPtr->cursorPtr 
2400: 3d 20 77 69 6e 50 74 72 3b 0a 20 20 20 20 64 69  = winPtr;.    di
2410: 73 70 50 74 72 2d 3e 63 75 72 73 6f 72 58 20 3d  spPtr->cursorX =
2420: 20 78 3b 0a 20 20 20 20 64 69 73 70 50 74 72 2d   x;.    dispPtr-
2430: 3e 63 75 72 73 6f 72 59 20 3d 20 79 3b 0a 7d 0a  >cursorY = y;.}.
2440: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 52 65 66  .static void.Ref
2450: 72 65 73 68 44 69 73 70 6c 61 79 28 64 69 73 70  reshDisplay(disp
2460: 50 74 72 29 0a 20 20 20 20 54 6b 44 69 73 70 6c  Ptr).    TkDispl
2470: 61 79 20 2a 64 69 73 70 50 74 72 3b 0a 7b 0a 20  ay *dispPtr;.{. 
2480: 20 20 20 54 6b 57 69 6e 64 6f 77 20 2a 77 69 6e     TkWindow *win
2490: 50 74 72 20 3d 20 64 69 73 70 50 74 72 2d 3e 63  Ptr = dispPtr->c
24a0: 75 72 73 6f 72 50 74 72 3b 0a 20 20 20 20 69 6e  ursorPtr;.    in
24b0: 74 20 78 2c 20 79 3b 0a 20 20 20 20 69 6e 74 20  t x, y;.    int 
24c0: 76 69 73 69 62 6c 65 20 3d 20 30 3b 0a 0a 20 20  visible = 0;..  
24d0: 20 20 53 65 74 44 69 73 70 6c 61 79 28 64 69 73    SetDisplay(dis
24e0: 70 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 43  pPtr);.    if (C
24f0: 74 6b 49 73 44 69 73 70 6c 61 79 65 64 28 77 69  tkIsDisplayed(wi
2500: 6e 50 74 72 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a  nPtr)) {../*.. *
2510: 20 43 6f 6e 76 65 72 74 20 74 6f 20 61 62 73 6f   Convert to abso
2520: 6c 75 74 65 20 73 63 72 65 65 6e 20 63 6f 6f 72  lute screen coor
2530: 64 69 6e 61 74 65 73 0a 09 20 2a 2f 0a 09 78 20  dinates.. */..x 
2540: 3d 20 64 69 73 70 50 74 72 2d 3e 63 75 72 73 6f  = dispPtr->curso
2550: 72 58 20 2b 20 77 69 6e 50 74 72 2d 3e 61 62 73  rX + winPtr->abs
2560: 4c 65 66 74 3b 0a 09 79 20 3d 20 64 69 73 70 50  Left;..y = dispP
2570: 74 72 2d 3e 63 75 72 73 6f 72 59 20 2b 20 77 69  tr->cursorY + wi
2580: 6e 50 74 72 2d 3e 61 62 73 54 6f 70 3b 0a 09 69  nPtr->absTop;..i
2590: 66 20 28 79 20 3e 3d 20 77 69 6e 50 74 72 2d 3e  f (y >= winPtr->
25a0: 6d 61 73 6b 52 65 63 74 2e 74 6f 70 0a 09 09 26  maskRect.top...&
25b0: 26 20 79 20 3c 20 77 69 6e 50 74 72 2d 3e 6d 61  & y < winPtr->ma
25c0: 73 6b 52 65 63 74 2e 62 6f 74 74 6f 6d 0a 09 09  skRect.bottom...
25d0: 26 26 20 78 20 3e 3d 20 77 69 6e 50 74 72 2d 3e  && x >= winPtr->
25e0: 6d 61 73 6b 52 65 63 74 2e 6c 65 66 74 0a 09 09  maskRect.left...
25f0: 26 26 20 78 20 3c 20 77 69 6e 50 74 72 2d 3e 6d  && x < winPtr->m
2600: 61 73 6b 52 65 63 74 2e 72 69 67 68 74 0a 09 09  askRect.right...
2610: 26 26 20 43 74 6b 50 6f 69 6e 74 49 6e 52 65 67  && CtkPointInReg
2620: 69 6f 6e 28 78 2c 20 79 2c 20 77 69 6e 50 74 72  ion(x, y, winPtr
2630: 2d 3e 63 6c 69 70 52 67 6e 29 20 29 20 7b 0a 09  ->clipRgn) ) {..
2640: 20 20 20 20 4d 6f 76 65 28 78 2c 20 79 29 3b 0a      Move(x, y);.
2650: 09 20 20 20 20 76 69 73 69 62 6c 65 20 3d 20 31  .    visible = 1
2660: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63  ;..}.    }.    c
2670: 75 72 73 5f 73 65 74 28 76 69 73 69 62 6c 65 29  urs_set(visible)
2680: 3b 0a 20 20 20 20 72 65 66 72 65 73 68 28 29 3b  ;.    refresh();
2690: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
26a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43  --------. *. * C
26e0: 74 6b 44 69 73 70 6c 61 79 42 65 6c 6c 20 2d 2d  tkDisplayBell --
26f0: 0a 20 2a 0a 20 2a 09 46 6c 75 73 68 65 73 20 61  . *. *.Flushes a
2700: 6c 6c 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65  ll output to the
2710: 20 74 65 72 6d 69 6e 61 6c 20 28 6f 74 68 65 72   terminal (other
2720: 77 69 73 65 20 64 72 61 77 69 6e 67 0a 20 2a 09  wise drawing. *.
2730: 6d 61 79 20 62 65 20 62 75 66 66 65 72 65 64 29  may be buffered)
2740: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
2750: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20  . *.None.. *. * 
2760: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
2770: 09 54 68 65 20 74 65 72 6d 69 6e 61 6c 20 64 69  .The terminal di
2780: 73 70 6c 61 79 20 69 73 20 75 70 64 61 74 65 64  splay is updated
2790: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
27a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27d0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 76 6f 69 64 0a  -----. */..void.
27e0: 43 74 6b 44 69 73 70 6c 61 79 42 65 6c 6c 28 64  CtkDisplayBell(d
27f0: 69 73 70 50 74 72 29 0a 20 20 20 20 54 6b 44 69  ispPtr).    TkDi
2800: 73 70 6c 61 79 20 2a 64 69 73 70 50 74 72 3b 0a  splay *dispPtr;.
2810: 7b 0a 20 20 20 20 53 65 74 44 69 73 70 6c 61 79  {.    SetDisplay
2820: 28 64 69 73 70 50 74 72 29 3b 0a 20 20 20 20 62  (dispPtr);.    b
2830: 65 65 70 28 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  eep();.}.../*. *
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2880: 2a 0a 20 2a 20 43 74 6b 5f 44 69 73 70 6c 61 79  *. * Ctk_Display
2890: 57 69 64 74 68 20 2d 2d 0a 20 2a 20 43 74 6b 5f  Width --. * Ctk_
28a0: 44 69 73 70 6c 61 79 48 65 69 67 68 74 20 2d 2d  DisplayHeight --
28b0: 0a 20 2a 0a 20 2a 09 47 65 74 20 67 65 6f 6d 65  . *. *.Get geome
28c0: 74 72 79 20 6f 66 20 74 65 72 6d 69 6e 61 6c 2e  try of terminal.
28d0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
28e0: 20 2a 09 53 69 7a 65 20 28 77 69 64 74 68 2f 68   *.Size (width/h
28f0: 65 69 67 68 74 20 72 65 73 70 65 63 74 69 76 65  eight respective
2900: 6c 79 29 20 6f 66 20 74 65 72 6d 69 6e 61 6c 2e  ly) of terminal.
2910: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
2920: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
2930: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 0a 69 6e 74 0a 43 74 6b 5f 44  -. */..int.Ctk_D
2980: 69 73 70 6c 61 79 57 69 64 74 68 28 64 69 73 70  isplayWidth(disp
2990: 50 74 72 29 0a 20 20 20 20 54 6b 44 69 73 70 6c  Ptr).    TkDispl
29a0: 61 79 20 2a 64 69 73 70 50 74 72 3b 0a 7b 0a 20  ay *dispPtr;.{. 
29b0: 20 20 20 53 65 74 44 69 73 70 6c 61 79 28 64 69     SetDisplay(di
29c0: 73 70 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  spPtr);.    retu
29d0: 72 6e 20 43 4f 4c 53 3b 0a 7d 0a 0a 69 6e 74 0a  rn COLS;.}..int.
29e0: 43 74 6b 5f 44 69 73 70 6c 61 79 48 65 69 67 68  Ctk_DisplayHeigh
29f0: 74 28 64 69 73 70 50 74 72 29 0a 20 20 20 20 54  t(dispPtr).    T
2a00: 6b 44 69 73 70 6c 61 79 20 2a 64 69 73 70 50 74  kDisplay *dispPt
2a10: 72 3b 0a 7b 0a 20 20 20 20 53 65 74 44 69 73 70  r;.{.    SetDisp
2a20: 6c 61 79 28 64 69 73 70 50 74 72 29 3b 0a 20 20  lay(dispPtr);.  
2a30: 20 20 72 65 74 75 72 6e 20 4c 49 4e 45 53 3b 0a    return LINES;.
2a40: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
2a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a80: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 65  -------. *. * Te
2a90: 72 6d 46 69 6c 65 50 72 6f 63 20 2d 2d 0a 20 2a  rmFileProc --. *
2aa0: 0a 20 2a 09 46 69 6c 65 20 68 61 6e 64 6c 65 72  . *.File handler
2ab0: 20 66 6f 72 20 61 20 74 65 72 6d 69 6e 61 6c 2e   for a terminal.
2ac0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
2ad0: 20 2a 09 52 65 74 75 72 6e 73 20 54 4b 5f 46 49   *.Returns TK_FI
2ae0: 4c 45 5f 48 41 4e 44 4c 45 44 20 69 66 20 61 6e  LE_HANDLED if an
2af0: 79 20 65 76 65 6e 74 73 20 77 65 72 65 20 70 72  y events were pr
2b00: 6f 63 65 73 73 65 64 2e 0a 20 2a 09 4f 74 68 65  ocessed.. *.Othe
2b10: 72 77 69 73 65 20 72 65 74 75 72 6e 73 20 54 43  rwise returns TC
2b20: 4c 5f 52 45 41 44 41 42 4c 45 2e 0a 20 2a 0a 20  L_READABLE.. *. 
2b30: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
2b40: 20 2a 09 44 69 73 70 61 74 63 68 65 73 20 65 76   *.Dispatches ev
2b50: 65 6e 74 73 20 28 69 6e 76 6f 6b 69 6e 67 20 65  ents (invoking e
2b60: 76 65 6e 74 20 68 61 6e 64 6c 65 72 73 29 2e 0a  vent handlers)..
2b70: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
2b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bb0: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
2bc0: 76 6f 69 64 0a 54 65 72 6d 46 69 6c 65 50 72 6f  void.TermFilePro
2bd0: 63 28 63 6c 69 65 6e 74 44 61 74 61 2c 20 6d 61  c(clientData, ma
2be0: 73 6b 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 61  sk).    ClientDa
2bf0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  ta clientData;. 
2c00: 20 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 7b 0a 20     int mask;.{. 
2c10: 20 20 20 54 6b 44 69 73 70 6c 61 79 20 2a 64 69     TkDisplay *di
2c20: 73 70 50 74 72 20 3d 20 28 54 6b 44 69 73 70 6c  spPtr = (TkDispl
2c30: 61 79 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61  ay *) clientData
2c40: 3b 0a 20 20 20 20 43 74 6b 5f 45 76 65 6e 74 20  ;.    Ctk_Event 
2c50: 65 76 65 6e 74 3b 0a 20 20 20 20 73 74 72 75 63  event;.    struc
2c60: 74 20 74 6d 73 20 74 69 6d 65 73 42 75 66 3b 0a  t tms timesBuf;.
2c70: 20 20 20 20 54 63 6c 5f 48 61 73 68 45 6e 74 72      Tcl_HashEntr
2c80: 79 20 2a 68 50 74 72 3b 0a 20 20 20 20 4b 65 79  y *hPtr;.    Key
2c90: 43 6f 64 65 49 6e 66 6f 20 2a 63 6f 64 65 50 74  CodeInfo *codePt
2ca0: 72 3b 0a 20 20 20 20 69 6e 74 20 6b 65 79 3b 0a  r;.    int key;.
2cb0: 0a 20 20 20 20 69 66 20 28 28 6d 61 73 6b 20 26  .    if ((mask &
2cc0: 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 3d   TCL_READABLE) =
2cd0: 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 20  = TCL_READABLE) 
2ce0: 7b 0a 09 53 65 74 44 69 73 70 6c 61 79 28 64 69  {..SetDisplay(di
2cf0: 73 70 50 74 72 29 3b 0a 0a 09 6b 65 79 20 3d 20  spPtr);...key = 
2d00: 67 65 74 63 68 28 29 3b 0a 09 68 50 74 72 20 3d  getch();..hPtr =
2d10: 20 54 63 6c 5f 46 69 6e 64 48 61 73 68 45 6e 74   Tcl_FindHashEnt
2d20: 72 79 28 26 6b 65 79 43 6f 64 65 54 61 62 6c 65  ry(&keyCodeTable
2d30: 2c 20 28 63 68 61 72 20 2a 29 20 6b 65 79 29 3b  , (char *) key);
2d40: 0a 09 69 66 20 28 68 50 74 72 29 20 7b 0a 09 20  ..if (hPtr) {.. 
2d50: 20 20 20 63 6f 64 65 50 74 72 20 3d 20 28 4b 65     codePtr = (Ke
2d60: 79 43 6f 64 65 49 6e 66 6f 20 2a 29 20 54 63 6c  yCodeInfo *) Tcl
2d70: 5f 47 65 74 48 61 73 68 56 61 6c 75 65 28 68 50  _GetHashValue(hP
2d80: 74 72 29 3b 0a 09 20 20 20 20 65 76 65 6e 74 2e  tr);..    event.
2d90: 75 2e 6b 65 79 2e 73 79 6d 20 3d 20 63 6f 64 65  u.key.sym = code
2da0: 50 74 72 2d 3e 73 79 6d 3b 0a 09 20 20 20 20 65  Ptr->sym;..    e
2db0: 76 65 6e 74 2e 75 2e 6b 65 79 2e 73 74 61 74 65  vent.u.key.state
2dc0: 20 3d 20 63 6f 64 65 50 74 72 2d 3e 6d 6f 64 4d   = codePtr->modM
2dd0: 61 73 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ask;..} else {..
2de0: 20 20 20 20 65 76 65 6e 74 2e 75 2e 6b 65 79 2e      event.u.key.
2df0: 73 79 6d 20 3d 20 6b 65 79 3b 0a 09 20 20 20 20  sym = key;..    
2e00: 65 76 65 6e 74 2e 75 2e 6b 65 79 2e 73 74 61 74  event.u.key.stat
2e10: 65 20 3d 20 30 3b 0a 09 7d 0a 09 65 76 65 6e 74  e = 0;..}..event
2e20: 2e 74 79 70 65 20 3d 20 43 54 4b 5f 4b 45 59 5f  .type = CTK_KEY_
2e30: 45 56 45 4e 54 3b 0a 09 65 76 65 6e 74 2e 77 69  EVENT;..event.wi
2e40: 6e 64 6f 77 20 3d 20 64 69 73 70 50 74 72 2d 3e  ndow = dispPtr->
2e50: 66 6f 63 75 73 50 74 72 3b 0a 09 65 76 65 6e 74  focusPtr;..event
2e60: 2e 75 2e 6b 65 79 2e 74 69 6d 65 20 3d 20 28 75  .u.key.time = (u
2e70: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 74  nsigned long) (t
2e80: 69 6d 65 73 28 26 74 69 6d 65 73 42 75 66 29 2a  imes(&timesBuf)*
2e90: 4d 53 5f 50 45 52 5f 43 4c 4f 43 4b 29 3b 0a 09  MS_PER_CLOCK);..
2ea0: 54 6b 5f 48 61 6e 64 6c 65 45 76 65 6e 74 28 26  Tk_HandleEvent(&
2eb0: 65 76 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 7d 0a  event);.    }.}.
2ec0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
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 0a 20 2a 0a 20 2a 20 43 74 6b 5f  -----. *. * Ctk_
2f10: 44 72 61 77 43 68 61 72 61 63 74 65 72 20 2d 2d  DrawCharacter --
2f20: 0a 20 2a 0a 20 2a 09 44 69 73 70 6c 61 79 20 61  . *. *.Display a
2f30: 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65   single characte
2f40: 72 20 69 6e 20 61 20 76 69 65 77 2e 0a 20 2a 0a  r in a view.. *.
2f50: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
2f60: 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  one.. *. * Side 
2f70: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 68 61 72  effects:. *.Char
2f80: 61 63 74 65 72 20 69 73 20 6f 75 74 70 75 74 20  acter is output 
2f90: 74 6f 20 74 68 65 20 74 65 72 6d 69 6e 61 6c 2e  to the terminal.
2fa0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
2fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fe0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 76 6f 69 64 0a 43  ----. */..void.C
2ff0: 74 6b 5f 44 72 61 77 43 68 61 72 61 63 74 65 72  tk_DrawCharacter
3000: 28 77 69 6e 50 74 72 2c 20 78 2c 20 79 2c 20 73  (winPtr, x, y, s
3010: 74 79 6c 65 2c 20 63 68 61 72 61 63 74 65 72 29  tyle, character)
3020: 0a 20 20 20 20 54 6b 57 69 6e 64 6f 77 20 2a 77  .    TkWindow *w
3030: 69 6e 50 74 72 3b 09 09 2f 2a 20 57 69 6e 64 6f  inPtr;../* Windo
3040: 77 20 74 6f 20 64 72 61 77 20 69 6e 74 6f 2e 20  w to draw into. 
3050: 2a 2f 0a 20 20 20 20 69 6e 74 20 78 2c 79 3b 09  */.    int x,y;.
3060: 09 09 2f 2a 20 50 6f 73 69 74 69 6f 6e 2c 20 72  ../* Position, r
3070: 65 6c 61 74 69 76 65 20 74 6f 20 76 69 65 77 2c  elative to view,
3080: 20 74 6f 0a 20 20 20 20 09 09 09 09 20 2a 20 73   to.    .... * s
3090: 74 61 72 74 20 64 72 61 77 20 61 74 2e 20 2a 2f  tart draw at. */
30a0: 0a 20 20 20 20 43 74 6b 5f 53 74 79 6c 65 20 73  .    Ctk_Style s
30b0: 74 79 6c 65 3b 09 09 2f 2a 20 53 74 79 6c 65 20  tyle;../* Style 
30c0: 74 6f 20 64 72 61 77 20 63 68 61 72 61 63 74 65  to draw characte
30d0: 72 20 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  r in. */.    int
30e0: 20 63 68 61 72 61 63 74 65 72 3b 09 09 2f 2a 20   character;../* 
30f0: 43 68 61 72 61 63 74 65 72 20 74 6f 20 64 72 61  Character to dra
3100: 77 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 66 20 28  w. */.{.    if (
3110: 21 43 74 6b 49 73 44 69 73 70 6c 61 79 65 64 28  !CtkIsDisplayed(
3120: 77 69 6e 50 74 72 29 29 20 7b 0a 09 72 65 74 75  winPtr)) {..retu
3130: 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rn;.    }..    /
3140: 2a 0a 20 20 20 20 20 2a 20 43 6f 6e 76 65 72 74  *.     * Convert
3150: 20 74 6f 20 61 62 73 6f 6c 75 74 65 20 73 63 72   to absolute scr
3160: 65 65 6e 20 63 6f 6f 72 64 69 6e 61 74 65 73 0a  een coordinates.
3170: 20 20 20 20 20 2a 2f 0a 20 20 20 20 79 20 2b 3d       */.    y +=
3180: 20 77 69 6e 50 74 72 2d 3e 61 62 73 54 6f 70 3b   winPtr->absTop;
3190: 0a 20 20 20 20 78 20 2b 3d 20 77 69 6e 50 74 72  .    x += winPtr
31a0: 2d 3e 61 62 73 4c 65 66 74 3b 0a 0a 20 20 20 20  ->absLeft;..    
31b0: 69 66 20 28 79 20 3e 3d 20 77 69 6e 50 74 72 2d  if (y >= winPtr-
31c0: 3e 63 6c 69 70 52 65 63 74 2e 74 6f 70 0a 20 20  >clipRect.top.  
31d0: 20 20 09 20 20 20 20 26 26 20 79 20 3c 20 77 69    .    && y < wi
31e0: 6e 50 74 72 2d 3e 63 6c 69 70 52 65 63 74 2e 62  nPtr->clipRect.b
31f0: 6f 74 74 6f 6d 0a 20 20 20 20 09 20 20 20 20 26  ottom.    .    &
3200: 26 20 78 20 3e 3d 20 77 69 6e 50 74 72 2d 3e 63  & x >= winPtr->c
3210: 6c 69 70 52 65 63 74 2e 6c 65 66 74 0a 20 20 20  lipRect.left.   
3220: 20 09 20 20 20 20 26 26 20 78 20 3c 20 77 69 6e   .    && x < win
3230: 50 74 72 2d 3e 63 6c 69 70 52 65 63 74 2e 72 69  Ptr->clipRect.ri
3240: 67 68 74 0a 09 20 20 20 20 26 26 20 43 74 6b 50  ght..    && CtkP
3250: 6f 69 6e 74 49 6e 52 65 67 69 6f 6e 28 78 2c 20  ointInRegion(x, 
3260: 79 2c 20 77 69 6e 50 74 72 2d 3e 63 6c 69 70 52  y, winPtr->clipR
3270: 67 6e 29 20 29 20 7b 0a 09 53 65 74 44 69 73 70  gn) ) {..SetDisp
3280: 6c 61 79 28 77 69 6e 50 74 72 2d 3e 64 69 73 70  lay(winPtr->disp
3290: 50 74 72 29 3b 0a 09 53 65 74 53 74 79 6c 65 28  Ptr);..SetStyle(
32a0: 73 74 79 6c 65 29 3b 0a 09 4d 6f 76 65 28 78 2c  style);..Move(x,
32b0: 20 79 29 3b 0a 09 50 75 74 43 68 61 72 28 63 68   y);..PutChar(ch
32c0: 61 72 61 63 74 65 72 29 3b 0a 20 20 20 20 7d 0a  aracter);.    }.
32d0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
32e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3310: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 74  -------. *. * Ct
3320: 6b 5f 44 72 61 77 53 74 72 69 6e 67 20 2d 2d 0a  k_DrawString --.
3330: 20 2a 0a 20 2a 09 44 69 73 70 6c 61 79 20 60 6c   *. *.Display `l
3340: 65 6e 67 74 68 27 20 63 68 61 72 61 63 74 65 72  ength' character
3350: 73 20 66 72 6f 6d 20 60 73 74 72 27 20 69 6e 74  s from `str' int
3360: 6f 20 60 77 69 6e 50 74 72 27 0a 20 2a 09 61 74  o `winPtr'. *.at
3370: 20 70 6f 73 69 74 69 6f 6e 20 28 60 78 27 2c 60   position (`x',`
3380: 79 27 29 20 69 6e 20 73 70 65 63 69 66 69 65 64  y') in specified
3390: 20 60 73 74 79 6c 65 27 2e 20 20 49 66 20 60 6c   `style'.  If `l
33a0: 65 6e 67 74 68 27 0a 20 2a 09 69 73 20 2d 31 20  ength'. *.is -1 
33b0: 74 68 65 6e 20 64 72 61 77 20 74 69 6c 6c 20 61  then draw till a
33c0: 20 6e 75 6c 6c 20 63 68 61 72 61 63 74 65 72 20   null character 
33d0: 69 73 20 72 65 61 63 68 65 64 2e 0a 20 2a 0a 20  is reached.. *. 
33e0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
33f0: 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ne.. *. * Side e
3400: 66 66 65 63 74 73 3a 0a 20 2a 09 43 68 61 72 61  ffects:. *.Chara
3410: 63 74 65 72 73 20 61 72 65 20 6f 75 74 70 75 74  cters are output
3420: 20 74 6f 20 74 68 65 20 74 65 72 6d 69 6e 61 6c   to the terminal
3430: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3470: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 76 6f 69 64 0a  -----. */..void.
3480: 43 74 6b 5f 44 72 61 77 53 74 72 69 6e 67 28 77  Ctk_DrawString(w
3490: 69 6e 50 74 72 2c 20 78 2c 20 79 2c 20 73 74 79  inPtr, x, y, sty
34a0: 6c 65 2c 20 73 74 72 2c 20 6c 65 6e 67 74 68 29  le, str, length)
34b0: 0a 20 20 20 20 54 6b 57 69 6e 64 6f 77 20 2a 77  .    TkWindow *w
34c0: 69 6e 50 74 72 3b 09 09 2f 2a 20 57 69 6e 64 6f  inPtr;../* Windo
34d0: 77 20 74 6f 20 64 72 61 77 20 69 6e 74 6f 2e 20  w to draw into. 
34e0: 2a 2f 0a 20 20 20 20 69 6e 74 20 78 2c 79 3b 09  */.    int x,y;.
34f0: 09 09 2f 2a 20 50 6f 73 69 74 69 6f 6e 2c 20 72  ../* Position, r
3500: 65 6c 61 74 69 76 65 20 74 6f 20 76 69 65 77 2c  elative to view,
3510: 20 74 6f 0a 20 20 20 20 09 09 09 09 20 2a 20 73   to.    .... * s
3520: 74 61 72 74 20 64 72 61 77 69 6e 67 2e 20 2a 2f  tart drawing. */
3530: 0a 20 20 20 20 43 74 6b 5f 53 74 79 6c 65 20 73  .    Ctk_Style s
3540: 74 79 6c 65 3b 09 09 2f 2a 20 53 74 79 6c 65 20  tyle;../* Style 
3550: 74 6f 20 64 72 61 77 20 63 68 61 72 61 63 74 65  to draw characte
3560: 72 73 20 69 6e 2e 20 2a 2f 0a 20 20 20 20 63 68  rs in. */.    ch
3570: 61 72 20 2a 73 74 72 3b 09 09 09 2f 2a 20 50 6f  ar *str;.../* Po
3580: 69 6e 74 73 20 74 6f 20 63 68 61 72 61 63 74 65  ints to characte
3590: 72 73 20 74 6f 20 62 65 20 64 72 61 77 6e 2e 20  rs to be drawn. 
35a0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 67 74  */.    int lengt
35b0: 68 3b 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f  h;.../* Number o
35c0: 66 20 63 68 61 72 61 63 74 65 72 73 20 66 72 6f  f characters fro
35d0: 6d 20 73 74 72 0a 20 20 20 20 09 09 09 09 20 2a  m str.    .... *
35e0: 20 74 6f 20 64 72 61 77 2c 20 6f 72 20 2d 31 20   to draw, or -1 
35f0: 74 6f 20 64 72 61 77 20 74 69 6c 6c 20 4e 55 4c  to draw till NUL
3600: 4c 0a 20 20 20 20 09 09 09 09 20 2a 20 74 65 72  L.    .... * ter
3610: 6d 69 6e 61 74 69 6f 6e 2e 20 2a 2f 0a 7b 0a 20  mination. */.{. 
3620: 20 20 20 69 6e 74 20 73 74 72 4c 65 66 74 2c 20     int strLeft, 
3630: 73 74 72 52 69 67 68 74 3b 0a 20 20 20 20 54 65  strRight;.    Te
3640: 78 74 49 6e 66 6f 20 74 65 78 74 5f 69 6e 66 6f  xtInfo text_info
3650: 3b 0a 0a 20 20 20 20 69 66 20 28 21 43 74 6b 49  ;..    if (!CtkI
3660: 73 44 69 73 70 6c 61 79 65 64 28 77 69 6e 50 74  sDisplayed(winPt
3670: 72 29 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20  r)) {..return;. 
3680: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
3690: 20 20 2a 20 43 6f 6e 76 65 72 74 20 74 6f 20 61    * Convert to a
36a0: 62 73 6f 6c 75 74 65 20 73 63 72 65 65 6e 20 63  bsolute screen c
36b0: 6f 6f 72 64 69 6e 61 74 65 73 0a 20 20 20 20 20  oordinates.     
36c0: 2a 2f 0a 20 20 20 20 79 20 2b 3d 20 77 69 6e 50  */.    y += winP
36d0: 74 72 2d 3e 61 62 73 54 6f 70 3b 0a 20 20 20 20  tr->absTop;.    
36e0: 69 66 20 28 79 20 3c 20 77 69 6e 50 74 72 2d 3e  if (y < winPtr->
36f0: 63 6c 69 70 52 65 63 74 2e 74 6f 70 20 7c 7c 20  clipRect.top || 
3700: 79 20 3e 20 77 69 6e 50 74 72 2d 3e 63 6c 69 70  y > winPtr->clip
3710: 52 65 63 74 2e 62 6f 74 74 6f 6d 29 20 7b 0a 09  Rect.bottom) {..
3720: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
3730: 20 20 78 20 2b 3d 20 77 69 6e 50 74 72 2d 3e 61    x += winPtr->a
3740: 62 73 4c 65 66 74 3b 0a 0a 20 20 20 20 69 66 20  bsLeft;..    if 
3750: 28 6c 65 6e 67 74 68 20 3d 3d 20 2d 31 29 20 7b  (length == -1) {
3760: 0a 09 6c 65 6e 67 74 68 20 3d 20 73 74 72 6c 65  ..length = strle
3770: 6e 28 73 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20  n(str);.    }.  
3780: 20 20 73 74 72 4c 65 66 74 20 3d 20 78 3b 0a 20    strLeft = x;. 
3790: 20 20 20 73 74 72 52 69 67 68 74 20 3d 20 78 2b     strRight = x+
37a0: 6c 65 6e 67 74 68 3b 0a 20 20 20 20 43 74 6b 49  length;.    CtkI
37b0: 6e 74 65 72 73 65 63 74 53 70 61 6e 73 28 26 73  ntersectSpans(&s
37c0: 74 72 4c 65 66 74 2c 20 26 73 74 72 52 69 67 68  trLeft, &strRigh
37d0: 74 2c 0a 09 20 20 20 20 77 69 6e 50 74 72 2d 3e  t,..    winPtr->
37e0: 63 6c 69 70 52 65 63 74 2e 6c 65 66 74 2c 20 77  clipRect.left, w
37f0: 69 6e 50 74 72 2d 3e 63 6c 69 70 52 65 63 74 2e  inPtr->clipRect.
3800: 72 69 67 68 74 29 3b 0a 20 20 20 20 69 66 20 28  right);.    if (
3810: 43 74 6b 53 70 61 6e 49 73 45 6d 70 74 79 28 73  CtkSpanIsEmpty(s
3820: 74 72 4c 65 66 74 2c 20 73 74 72 52 69 67 68 74  trLeft, strRight
3830: 29 29 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20  ))  return;..   
3840: 20 53 65 74 44 69 73 70 6c 61 79 28 77 69 6e 50   SetDisplay(winP
3850: 74 72 2d 3e 64 69 73 70 50 74 72 29 3b 0a 20 20  tr->dispPtr);.  
3860: 20 20 53 65 74 53 74 79 6c 65 28 73 74 79 6c 65    SetStyle(style
3870: 29 3b 0a 20 20 20 20 74 65 78 74 5f 69 6e 66 6f  );.    text_info
3880: 2e 73 74 72 20 3d 20 73 74 72 3b 0a 20 20 20 20  .str = str;.    
3890: 74 65 78 74 5f 69 6e 66 6f 2e 6c 65 66 74 20 3d  text_info.left =
38a0: 20 78 3b 0a 20 20 20 20 43 74 6b 46 6f 72 45 61   x;.    CtkForEa
38b0: 63 68 49 6e 74 65 72 73 65 63 74 69 6e 67 53 70  chIntersectingSp
38c0: 61 6e 28 44 72 61 77 54 65 78 74 53 70 61 6e 2c  an(DrawTextSpan,
38d0: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 26 74   (ClientData) &t
38e0: 65 78 74 5f 69 6e 66 6f 2c 0a 09 20 20 20 20 73  ext_info,..    s
38f0: 74 72 4c 65 66 74 2c 20 73 74 72 52 69 67 68 74  trLeft, strRight
3900: 2c 20 79 2c 20 77 69 6e 50 74 72 2d 3e 63 6c 69  , y, winPtr->cli
3910: 70 52 67 6e 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  pRgn);.}.../*. *
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3960: 2a 0a 20 2a 20 44 72 61 77 54 65 78 74 53 70 61  *. * DrawTextSpa
3970: 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65  n --. *. *.Calle
3980: 64 20 62 79 20 46 6f 72 45 61 63 68 53 70 61 6e  d by ForEachSpan
3990: 28 29 20 6f 72 20 46 6f 72 45 61 63 68 49 6e 74  () or ForEachInt
39a0: 65 72 73 65 63 74 69 6e 67 53 70 61 6e 28 29 0a  ersectingSpan().
39b0: 20 2a 09 74 6f 20 64 72 61 77 20 61 20 73 65 67   *.to draw a seg
39c0: 6d 65 6e 74 20 6f 66 20 61 20 73 74 72 69 6e 67  ment of a string
39d0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
39e0: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20  . *.None.. *. * 
39f0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
3a00: 09 43 68 61 72 61 63 74 65 72 73 20 61 72 65 20  .Characters are 
3a10: 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 74 65  output to the te
3a20: 72 6d 69 6e 61 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d  rminal.. *. *---
3a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
3a70: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 44 72 61  .static void.Dra
3a80: 77 54 65 78 74 53 70 61 6e 28 6c 65 66 74 2c 20  wTextSpan(left, 
3a90: 72 69 67 68 74 2c 20 79 2c 20 64 61 74 61 29 0a  right, y, data).
3aa0: 20 20 20 20 69 6e 74 20 6c 65 66 74 3b 09 09 09      int left;...
3ab0: 2f 2a 20 58 20 63 6f 6f 72 64 69 6e 61 74 65 20  /* X coordinate 
3ac0: 74 6f 20 73 74 61 72 74 20 64 72 61 77 69 6e 67  to start drawing
3ad0: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 69 67  . */.    int rig
3ae0: 68 74 3b 09 09 09 2f 2a 20 58 20 63 6f 6f 72 64  ht;.../* X coord
3af0: 69 6e 61 74 65 20 74 6f 20 73 74 6f 70 20 64 72  inate to stop dr
3b00: 61 77 69 6e 67 20 28 74 68 69 73 0a 20 20 20 20  awing (this.    
3b10: 09 09 09 09 20 2a 20 70 6f 73 69 74 69 6f 6e 20  .... * position 
3b20: 69 73 20 6e 6f 74 20 64 72 61 77 6e 20 69 6e 74  is not drawn int
3b30: 6f 29 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 79  o). */.    int y
3b40: 3b 09 09 09 2f 2a 20 59 20 63 6f 6f 72 64 69 6e  ;.../* Y coordin
3b50: 61 74 65 20 74 6f 20 64 72 61 77 20 61 74 2e 20  ate to draw at. 
3b60: 2a 2f 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74  */.    ClientDat
3b70: 61 20 64 61 74 61 3b 09 09 2f 2a 20 50 6f 69 6e  a data;../* Poin
3b80: 74 73 20 61 74 20 54 65 78 74 49 6e 66 6f 20 73  ts at TextInfo s
3b90: 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 7b 0a 20  tructure. */.{. 
3ba0: 20 20 20 63 68 61 72 20 2a 63 68 61 72 50 74 72     char *charPtr
3bb0: 20 3d 20 28 28 54 65 78 74 49 6e 66 6f 2a 29 20   = ((TextInfo*) 
3bc0: 64 61 74 61 29 2d 3e 73 74 72 20 2b 20 6c 65 66  data)->str + lef
3bd0: 74 20 2d 20 28 28 54 65 78 74 49 6e 66 6f 2a 29  t - ((TextInfo*)
3be0: 20 64 61 74 61 29 2d 3e 6c 65 66 74 3b 0a 20 20   data)->left;.  
3bf0: 20 20 69 6e 74 20 78 3b 0a 0a 20 20 20 20 4d 6f    int x;..    Mo
3c00: 76 65 28 6c 65 66 74 2c 20 79 29 3b 0a 20 20 20  ve(left, y);.   
3c10: 20 66 6f 72 20 28 78 3d 6c 65 66 74 3b 20 78 20   for (x=left; x 
3c20: 3c 20 72 69 67 68 74 3b 20 78 2b 2b 29 20 7b 0a  < right; x++) {.
3c30: 09 50 75 74 43 68 61 72 28 55 43 48 41 52 28 2a  .PutChar(UCHAR(*
3c40: 63 68 61 72 50 74 72 2b 2b 29 29 3b 0a 20 20 20  charPtr++));.   
3c50: 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d   }.}.../*. *----
3c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
3ca0: 20 43 74 6b 5f 43 6c 65 61 72 57 69 6e 64 6f 77   Ctk_ClearWindow
3cb0: 20 2d 2d 0a 20 2a 0a 20 2a 09 46 69 6c 6c 20 76   --. *. *.Fill v
3cc0: 69 65 77 20 77 69 74 68 20 69 74 73 20 62 61 63  iew with its bac
3cd0: 6b 67 72 6f 75 6e 64 20 28 61 73 20 64 65 66 69  kground (as defi
3ce0: 6e 65 64 20 62 79 0a 20 2a 09 77 69 6e 50 74 72  ned by. *.winPtr
3cf0: 2d 3e 66 69 6c 6c 53 74 79 6c 65 20 61 6e 64 20  ->fillStyle and 
3d00: 77 69 6e 50 74 72 2d 3e 66 69 6c 6c 43 68 61 72  winPtr->fillChar
3d10: 29 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  ).. *. * Results
3d20: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
3d30: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
3d40: 2a 09 43 68 61 72 61 63 74 65 72 73 20 61 72 65  *.Characters are
3d50: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 74   output to the t
3d60: 65 72 6d 69 6e 61 6c 2e 0a 20 2a 0a 20 2a 2d 2d  erminal.. *. *--
3d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3db0: 0a 0a 76 6f 69 64 0a 43 74 6b 5f 43 6c 65 61 72  ..void.Ctk_Clear
3dc0: 57 69 6e 64 6f 77 28 77 69 6e 50 74 72 29 0a 20  Window(winPtr). 
3dd0: 20 20 20 54 6b 57 69 6e 64 6f 77 20 2a 20 77 69     TkWindow * wi
3de0: 6e 50 74 72 3b 09 2f 2a 20 57 69 6e 64 6f 77 20  nPtr;./* Window 
3df0: 74 6f 20 63 6c 65 61 72 2e 20 2a 2f 0a 7b 0a 20  to clear. */.{. 
3e00: 20 20 20 69 6e 74 20 6c 65 66 74 20 3d 20 77 69     int left = wi
3e10: 6e 50 74 72 2d 3e 63 6c 69 70 52 65 63 74 2e 6c  nPtr->clipRect.l
3e20: 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 72 69 67  eft;.    int rig
3e30: 68 74 20 3d 20 77 69 6e 50 74 72 2d 3e 63 6c 69  ht = winPtr->cli
3e40: 70 52 65 63 74 2e 72 69 67 68 74 3b 0a 20 20 20  pRect.right;.   
3e50: 20 69 6e 74 20 79 3b 0a 0a 20 20 20 20 69 66 20   int y;..    if 
3e60: 28 77 69 6e 50 74 72 2d 3e 66 69 6c 6c 53 74 79  (winPtr->fillSty
3e70: 6c 65 20 3d 3d 20 43 54 4b 5f 49 4e 56 49 53 49  le == CTK_INVISI
3e80: 42 4c 45 5f 53 54 59 4c 45 20 7c 7c 20 28 21 43  BLE_STYLE || (!C
3e90: 74 6b 49 73 44 69 73 70 6c 61 79 65 64 28 77 69  tkIsDisplayed(wi
3ea0: 6e 50 74 72 29 29 0a 20 20 20 20 09 20 20 20 20  nPtr)).    .    
3eb0: 7c 7c 20 43 74 6b 53 70 61 6e 49 73 45 6d 70 74  || CtkSpanIsEmpt
3ec0: 79 28 6c 65 66 74 2c 20 72 69 67 68 74 29 29 20  y(left, right)) 
3ed0: 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d  {..return;.    }
3ee0: 0a 0a 20 20 20 20 53 65 74 44 69 73 70 6c 61 79  ..    SetDisplay
3ef0: 28 77 69 6e 50 74 72 2d 3e 64 69 73 70 50 74 72  (winPtr->dispPtr
3f00: 29 3b 0a 20 20 20 20 53 65 74 53 74 79 6c 65 28  );.    SetStyle(
3f10: 77 69 6e 50 74 72 2d 3e 66 69 6c 6c 53 74 79 6c  winPtr->fillStyl
3f20: 65 29 3b 0a 20 20 20 20 66 6f 72 20 28 79 3d 77  e);.    for (y=w
3f30: 69 6e 50 74 72 2d 3e 63 6c 69 70 52 65 63 74 2e  inPtr->clipRect.
3f40: 74 6f 70 3b 20 79 20 3c 20 77 69 6e 50 74 72 2d  top; y < winPtr-
3f50: 3e 63 6c 69 70 52 65 63 74 2e 62 6f 74 74 6f 6d  >clipRect.bottom
3f60: 3b 20 79 2b 2b 29 20 7b 0a 09 43 74 6b 46 6f 72  ; y++) {..CtkFor
3f70: 45 61 63 68 49 6e 74 65 72 73 65 63 74 69 6e 67  EachIntersecting
3f80: 53 70 61 6e 28 0a 09 20 20 20 20 46 69 6c 6c 53  Span(..    FillS
3f90: 70 61 6e 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  pan, (ClientData
3fa0: 29 20 77 69 6e 50 74 72 2d 3e 66 69 6c 6c 43 68  ) winPtr->fillCh
3fb0: 61 72 2c 0a 09 20 20 20 20 6c 65 66 74 2c 20 72  ar,..    left, r
3fc0: 69 67 68 74 2c 20 79 2c 0a 09 20 20 20 20 77 69  ight, y,..    wi
3fd0: 6e 50 74 72 2d 3e 63 6c 69 70 52 67 6e 29 3b 0a  nPtr->clipRgn);.
3fe0: 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d      }.}.../*. *-
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
4030: 0a 20 2a 20 43 74 6b 46 69 6c 6c 52 65 67 69 6f  . * CtkFillRegio
4040: 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 46 69 6c 6c 73  n --. *. *.Fills
4050: 20 69 6e 20 61 20 72 65 67 69 6f 6e 20 77 69 74   in a region wit
4060: 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
4070: 63 68 61 72 61 63 74 65 72 20 61 6e 64 20 73 74  character and st
4080: 79 6c 65 2e 0a 20 2a 09 52 65 67 69 6f 6e 20 69  yle.. *.Region i
4090: 73 20 69 6e 20 61 62 73 6f 6c 75 74 65 20 73 63  s in absolute sc
40a0: 72 65 65 6e 20 63 6f 6f 72 64 69 6e 61 74 65 73  reen coordinates
40b0: 2e 20 20 4e 6f 20 63 6c 69 70 70 69 6e 67 20 69  .  No clipping i
40c0: 73 0a 20 2a 09 70 65 72 66 6f 72 6d 65 64 2e 0a  s. *.performed..
40d0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
40e0: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69  *.None.. *. * Si
40f0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
4100: 68 61 72 61 63 74 65 72 73 20 61 72 65 20 6f 75  haracters are ou
4110: 74 70 75 74 20 74 6f 20 74 68 65 20 74 65 72 6d  tput to the term
4120: 69 6e 61 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  inal.. *. *-----
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 76  ---------. */..v
4170: 6f 69 64 0a 43 74 6b 46 69 6c 6c 52 65 67 69 6f  oid.CtkFillRegio
4180: 6e 28 64 69 73 70 50 74 72 2c 20 72 67 6e 50 74  n(dispPtr, rgnPt
4190: 72 2c 20 66 69 6c 6c 53 74 79 6c 65 2c 20 66 69  r, fillStyle, fi
41a0: 6c 6c 43 68 61 72 29 0a 20 20 20 20 54 6b 44 69  llChar).    TkDi
41b0: 73 70 6c 61 79 20 2a 64 69 73 70 50 74 72 3b 0a  splay *dispPtr;.
41c0: 20 20 20 20 43 74 6b 52 65 67 69 6f 6e 20 2a 72      CtkRegion *r
41d0: 67 6e 50 74 72 3b 0a 20 20 20 20 43 74 6b 5f 53  gnPtr;.    Ctk_S
41e0: 74 79 6c 65 20 66 69 6c 6c 53 74 79 6c 65 3b 0a  tyle fillStyle;.
41f0: 20 20 20 20 69 6e 74 20 66 69 6c 6c 43 68 61 72      int fillChar
4200: 3b 0a 7b 0a 20 20 20 20 53 65 74 44 69 73 70 6c  ;.{.    SetDispl
4210: 61 79 28 64 69 73 70 50 74 72 29 3b 0a 20 20 20  ay(dispPtr);.   
4220: 20 53 65 74 53 74 79 6c 65 28 66 69 6c 6c 53 74   SetStyle(fillSt
4230: 79 6c 65 29 3b 0a 20 20 20 20 43 74 6b 46 6f 72  yle);.    CtkFor
4240: 45 61 63 68 53 70 61 6e 28 46 69 6c 6c 53 70 61  EachSpan(FillSpa
4250: 6e 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  n, (ClientData) 
4260: 66 69 6c 6c 43 68 61 72 2c 20 72 67 6e 50 74 72  fillChar, rgnPtr
4270: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
4280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
42c0: 20 43 74 6b 5f 46 69 6c 6c 52 65 63 74 20 2d 2d   Ctk_FillRect --
42d0: 0a 20 2a 0a 20 2a 09 44 72 61 77 20 61 20 72 65  . *. *.Draw a re
42e0: 63 74 61 6e 67 6c 65 20 66 69 6c 6c 65 64 20 77  ctangle filled w
42f0: 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ith the specifie
4300: 64 20 63 68 61 72 61 63 74 65 72 0a 20 2a 09 61  d character. *.a
4310: 6e 64 20 73 74 79 6c 65 20 69 6e 20 60 77 69 6e  nd style in `win
4320: 50 74 72 27 20 61 74 20 72 65 6c 61 74 69 76 65  Ptr' at relative
4330: 20 63 6f 6f 72 64 69 6e 61 74 65 73 20 28 78 31   coordinates (x1
4340: 2c 79 31 29 0a 20 2a 09 74 6f 20 28 78 32 2d 31  ,y1). *.to (x2-1
4350: 2c 79 32 2d 31 29 2e 0a 20 2a 0a 20 2a 20 52 65  ,y2-1).. *. * Re
4360: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  sults:. *.None..
4370: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
4380: 74 73 3a 0a 20 2a 09 43 68 61 72 61 63 74 65 72  ts:. *.Character
4390: 73 20 61 72 65 20 6f 75 74 70 75 74 20 74 6f 20  s are output to 
43a0: 74 68 65 20 74 65 72 6d 69 6e 61 6c 2e 0a 20 2a  the terminal.. *
43b0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
43c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43f0: 2d 0a 20 2a 2f 0a 0a 76 6f 69 64 0a 43 74 6b 5f  -. */..void.Ctk_
4400: 46 69 6c 6c 52 65 63 74 28 77 69 6e 50 74 72 2c  FillRect(winPtr,
4410: 20 78 31 2c 20 79 31 2c 20 78 32 2c 20 79 32 2c   x1, y1, x2, y2,
4420: 20 66 69 6c 6c 53 74 79 6c 65 2c 20 66 69 6c 6c   fillStyle, fill
4430: 43 68 61 72 29 0a 20 20 20 20 54 6b 57 69 6e 64  Char).    TkWind
4440: 6f 77 20 2a 77 69 6e 50 74 72 3b 0a 20 20 20 20  ow *winPtr;.    
4450: 69 6e 74 20 78 31 3b 0a 20 20 20 20 69 6e 74 20  int x1;.    int 
4460: 79 31 3b 0a 20 20 20 20 69 6e 74 20 78 32 3b 0a  y1;.    int x2;.
4470: 20 20 20 20 69 6e 74 20 79 32 3b 0a 20 20 20 20      int y2;.    
4480: 43 74 6b 5f 53 74 79 6c 65 20 66 69 6c 6c 53 74  Ctk_Style fillSt
4490: 79 6c 65 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c  yle;.    int fil
44a0: 6c 43 68 61 72 3b 0a 7b 0a 20 20 20 20 43 74 6b  lChar;.{.    Ctk
44b0: 5f 52 65 63 74 20 72 65 63 74 3b 0a 20 20 20 20  _Rect rect;.    
44c0: 69 6e 74 20 79 3b 0a 0a 20 20 20 20 69 66 20 28  int y;..    if (
44d0: 21 43 74 6b 49 73 44 69 73 70 6c 61 79 65 64 28  !CtkIsDisplayed(
44e0: 77 69 6e 50 74 72 29 29 20 7b 0a 09 72 65 74 75  winPtr)) {..retu
44f0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 43 74  rn;.    }.    Ct
4500: 6b 53 65 74 52 65 63 74 28 26 72 65 63 74 2c 20  kSetRect(&rect, 
4510: 78 31 2c 20 79 31 2c 20 78 32 2c 20 79 32 29 3b  x1, y1, x2, y2);
4520: 0a 20 20 20 20 43 74 6b 4d 6f 76 65 52 65 63 74  .    CtkMoveRect
4530: 28 26 72 65 63 74 2c 20 77 69 6e 50 74 72 2d 3e  (&rect, winPtr->
4540: 61 62 73 4c 65 66 74 2c 20 77 69 6e 50 74 72 2d  absLeft, winPtr-
4550: 3e 61 62 73 54 6f 70 29 3b 0a 20 20 20 20 43 74  >absTop);.    Ct
4560: 6b 49 6e 74 65 72 73 65 63 74 52 65 63 74 73 28  kIntersectRects(
4570: 26 72 65 63 74 2c 20 26 77 69 6e 50 74 72 2d 3e  &rect, &winPtr->
4580: 63 6c 69 70 52 65 63 74 29 3b 0a 20 20 20 20 69  clipRect);.    i
4590: 66 20 28 20 43 74 6b 53 70 61 6e 49 73 45 6d 70  f ( CtkSpanIsEmp
45a0: 74 79 28 72 65 63 74 2e 6c 65 66 74 2c 20 72 65  ty(rect.left, re
45b0: 63 74 2e 72 69 67 68 74 29 20 29 20 7b 0a 09 72  ct.right) ) {..r
45c0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
45d0: 20 53 65 74 44 69 73 70 6c 61 79 28 77 69 6e 50   SetDisplay(winP
45e0: 74 72 2d 3e 64 69 73 70 50 74 72 29 3b 0a 20 20  tr->dispPtr);.  
45f0: 20 20 53 65 74 53 74 79 6c 65 28 66 69 6c 6c 53    SetStyle(fillS
4600: 74 79 6c 65 29 3b 0a 20 20 20 20 66 6f 72 20 28  tyle);.    for (
4610: 79 3d 72 65 63 74 2e 74 6f 70 3b 20 79 20 3c 20  y=rect.top; y < 
4620: 72 65 63 74 2e 62 6f 74 74 6f 6d 3b 20 79 2b 2b  rect.bottom; y++
4630: 29 0a 20 20 20 20 7b 0a 09 43 74 6b 46 6f 72 45  ).    {..CtkForE
4640: 61 63 68 49 6e 74 65 72 73 65 63 74 69 6e 67 53  achIntersectingS
4650: 70 61 6e 28 20 46 69 6c 6c 53 70 61 6e 2c 20 28  pan( FillSpan, (
4660: 43 6c 69 65 6e 74 44 61 74 61 29 20 66 69 6c 6c  ClientData) fill
4670: 43 68 61 72 2c 0a 09 09 72 65 63 74 2e 6c 65 66  Char,...rect.lef
4680: 74 2c 20 72 65 63 74 2e 72 69 67 68 74 2c 20 79  t, rect.right, y
4690: 2c 20 77 69 6e 50 74 72 2d 3e 63 6c 69 70 52 67  , winPtr->clipRg
46a0: 6e 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a  n);.    }.}.../*
46b0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
46c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46f0: 2d 0a 20 2a 0a 20 2a 20 46 69 6c 6c 53 70 61 6e  -. *. * FillSpan
4700: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64   --. *. *.Called
4710: 20 62 79 20 46 6f 72 45 61 63 68 53 70 61 6e 28   by ForEachSpan(
4720: 29 20 6f 72 20 46 6f 72 45 61 63 68 49 6e 74 65  ) or ForEachInte
4730: 72 73 65 63 74 69 6e 67 53 70 61 6e 28 29 0a 20  rsectingSpan(). 
4740: 2a 09 74 6f 20 66 69 6c 6c 20 61 20 73 70 61 6e  *.to fill a span
4750: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 63   with the same c
4760: 68 61 72 61 63 74 65 72 2e 0a 20 2a 0a 20 2a 20  haracter.. *. * 
4770: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
4780: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
4790: 65 63 74 73 3a 0a 20 2a 09 43 68 61 72 61 63 74  ects:. *.Charact
47a0: 65 72 73 20 61 72 65 20 6f 75 74 70 75 74 20 74  ers are output t
47b0: 6f 20 74 68 65 20 74 65 72 6d 69 6e 61 6c 2e 0a  o the terminal..
47c0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4800: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
4810: 76 6f 69 64 0a 46 69 6c 6c 53 70 61 6e 28 6c 65  void.FillSpan(le
4820: 66 74 2c 20 72 69 67 68 74 2c 20 79 2c 20 64 61  ft, right, y, da
4830: 74 61 29 0a 20 20 20 20 69 6e 74 20 6c 65 66 74  ta).    int left
4840: 3b 09 09 09 2f 2a 20 58 20 63 6f 6f 72 64 69 6e  ;.../* X coordin
4850: 61 74 65 20 74 6f 20 73 74 61 72 74 20 66 69 6c  ate to start fil
4860: 6c 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  ling. */.    int
4870: 20 72 69 67 68 74 3b 09 09 09 2f 2a 20 58 20 63   right;.../* X c
4880: 6f 6f 72 64 69 6e 61 74 65 20 74 6f 20 73 74 6f  oordinate to sto
4890: 70 20 66 69 6c 6c 69 6e 67 20 28 74 68 69 73 0a  p filling (this.
48a0: 20 20 20 20 09 09 09 09 20 2a 20 70 6f 73 69 74      .... * posit
48b0: 69 6f 6e 20 69 73 20 6e 6f 74 20 64 72 61 77 20  ion is not draw 
48c0: 69 6e 74 6f 29 2e 20 2a 2f 0a 20 20 20 20 69 6e  into). */.    in
48d0: 74 20 79 3b 09 09 09 2f 2a 20 59 20 63 6f 6f 72  t y;.../* Y coor
48e0: 64 69 6e 61 74 65 20 74 6f 20 64 72 61 77 20 61  dinate to draw a
48f0: 74 2e 20 2a 2f 0a 20 20 20 20 43 6c 69 65 6e 74  t. */.    Client
4900: 44 61 74 61 20 64 61 74 61 3b 09 09 2f 2a 20 43  Data data;../* C
4910: 68 61 72 61 63 74 65 72 20 74 6f 20 64 72 61 77  haracter to draw
4920: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 78  . */.{.    int x
4930: 3b 0a 0a 20 20 20 20 4d 6f 76 65 28 6c 65 66 74  ;..    Move(left
4940: 2c 20 79 29 3b 0a 20 20 20 20 66 6f 72 20 28 78  , y);.    for (x
4950: 3d 6c 65 66 74 3b 20 78 20 3c 20 72 69 67 68 74  =left; x < right
4960: 3b 20 78 2b 2b 29 20 7b 0a 09 50 75 74 43 68 61  ; x++) {..PutCha
4970: 72 28 28 69 6e 74 29 20 64 61 74 61 29 3b 0a 20  r((int) data);. 
4980: 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d     }.}.../*. *--
4990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
49d0: 20 2a 20 43 74 6b 5f 44 72 61 77 52 65 63 74 20   * Ctk_DrawRect 
49e0: 2d 2d 0a 20 2a 0a 20 2a 09 44 72 61 77 20 6f 75  --. *. *.Draw ou
49f0: 74 6c 69 6e 65 20 6f 66 20 72 65 63 74 61 6e 67  tline of rectang
4a00: 6c 65 20 77 69 74 68 20 6c 69 6e 65 20 64 72 61  le with line dra
4a10: 77 69 6e 67 20 63 68 61 72 61 63 74 65 72 73 0a  wing characters.
4a20: 20 2a 09 61 6e 64 20 74 68 65 20 73 70 65 63 69   *.and the speci
4a30: 66 69 65 64 20 73 74 79 6c 65 20 69 6e 20 60 77  fied style in `w
4a40: 69 6e 50 74 72 27 20 61 74 20 72 65 6c 61 74 69  inPtr' at relati
4a50: 76 65 0a 20 2a 09 63 6f 6f 72 64 69 6e 61 74 65  ve. *.coordinate
4a60: 73 20 28 78 31 2c 79 31 29 20 74 6f 20 28 78 32  s (x1,y1) to (x2
4a70: 2c 79 32 29 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  ,y2).. *. * Resu
4a80: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  lts:. *.None.. *
4a90: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
4aa0: 3a 0a 20 2a 09 43 68 61 72 61 63 74 65 72 73 20  :. *.Characters 
4ab0: 61 72 65 20 6f 75 74 70 75 74 20 74 6f 20 74 68  are output to th
4ac0: 65 20 74 65 72 6d 69 6e 61 6c 2e 0a 20 2a 0a 20  e terminal.. *. 
4ad0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
4ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4b10: 20 2a 2f 0a 0a 76 6f 69 64 0a 43 74 6b 5f 44 72   */..void.Ctk_Dr
4b20: 61 77 52 65 63 74 28 77 69 6e 50 74 72 2c 20 78  awRect(winPtr, x
4b30: 31 2c 20 79 31 2c 20 78 32 2c 20 79 32 2c 20 6c  1, y1, x2, y2, l
4b40: 69 6e 65 53 74 79 6c 65 29 0a 20 20 20 20 54 6b  ineStyle).    Tk
4b50: 57 69 6e 64 6f 77 20 2a 77 69 6e 50 74 72 3b 0a  Window *winPtr;.
4b60: 20 20 20 20 69 6e 74 20 78 31 3b 0a 20 20 20 20      int x1;.    
4b70: 69 6e 74 20 79 31 3b 0a 20 20 20 20 69 6e 74 20  int y1;.    int 
4b80: 78 32 3b 0a 20 20 20 20 69 6e 74 20 79 32 3b 0a  x2;.    int y2;.
4b90: 20 20 20 20 43 74 6b 5f 53 74 79 6c 65 20 6c 69      Ctk_Style li
4ba0: 6e 65 53 74 79 6c 65 3b 0a 7b 0a 20 20 20 20 43  neStyle;.{.    C
4bb0: 74 6b 5f 52 65 63 74 20 2a 63 6c 69 70 52 65 63  tk_Rect *clipRec
4bc0: 74 50 74 72 20 3d 20 26 77 69 6e 50 74 72 2d 3e  tPtr = &winPtr->
4bd0: 63 6c 69 70 52 65 63 74 3b 0a 20 20 20 20 69 6e  clipRect;.    in
4be0: 74 20 6c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20  t left;.    int 
4bf0: 72 69 67 68 74 3b 0a 20 20 20 20 69 6e 74 20 74  right;.    int t
4c00: 6f 70 3b 0a 20 20 20 20 69 6e 74 20 62 6f 74 74  op;.    int bott
4c10: 6f 6d 3b 0a 20 20 20 20 69 6e 74 20 79 3b 0a 0a  om;.    int y;..
4c20: 20 20 20 20 69 66 20 28 21 43 74 6b 49 73 44 69      if (!CtkIsDi
4c30: 73 70 6c 61 79 65 64 28 77 69 6e 50 74 72 29 20  splayed(winPtr) 
4c40: 7c 7c 20 78 31 20 3e 20 78 32 20 7c 7c 20 79 31  || x1 > x2 || y1
4c50: 20 3e 20 79 32 29 20 7b 0a 09 72 65 74 75 72 6e   > y2) {..return
4c60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 65 74 44  ;.    }.    SetD
4c70: 69 73 70 6c 61 79 28 77 69 6e 50 74 72 2d 3e 64  isplay(winPtr->d
4c80: 69 73 70 50 74 72 29 3b 0a 20 20 20 20 53 65 74  ispPtr);.    Set
4c90: 53 74 79 6c 65 28 6c 69 6e 65 53 74 79 6c 65 29  Style(lineStyle)
4ca0: 3b 0a 0a 20 20 20 20 43 74 6b 5f 44 72 61 77 43  ;..    Ctk_DrawC
4cb0: 68 61 72 61 63 74 65 72 28 77 69 6e 50 74 72 2c  haracter(winPtr,
4cc0: 20 78 31 2c 20 79 31 2c 20 6c 69 6e 65 53 74 79   x1, y1, lineSty
4cd0: 6c 65 2c 20 41 43 53 5f 55 4c 43 4f 52 4e 45 52  le, ACS_ULCORNER
4ce0: 29 3b 0a 20 20 20 20 43 74 6b 5f 44 72 61 77 43  );.    Ctk_DrawC
4cf0: 68 61 72 61 63 74 65 72 28 77 69 6e 50 74 72 2c  haracter(winPtr,
4d00: 20 78 32 2c 20 79 31 2c 20 6c 69 6e 65 53 74 79   x2, y1, lineSty
4d10: 6c 65 2c 20 41 43 53 5f 55 52 43 4f 52 4e 45 52  le, ACS_URCORNER
4d20: 29 3b 0a 20 20 20 20 43 74 6b 5f 44 72 61 77 43  );.    Ctk_DrawC
4d30: 68 61 72 61 63 74 65 72 28 77 69 6e 50 74 72 2c  haracter(winPtr,
4d40: 20 78 31 2c 20 79 32 2c 20 6c 69 6e 65 53 74 79   x1, y2, lineSty
4d50: 6c 65 2c 20 41 43 53 5f 4c 4c 43 4f 52 4e 45 52  le, ACS_LLCORNER
4d60: 29 3b 0a 20 20 20 20 43 74 6b 5f 44 72 61 77 43  );.    Ctk_DrawC
4d70: 68 61 72 61 63 74 65 72 28 77 69 6e 50 74 72 2c  haracter(winPtr,
4d80: 20 78 32 2c 20 79 32 2c 20 6c 69 6e 65 53 74 79   x2, y2, lineSty
4d90: 6c 65 2c 20 41 43 53 5f 4c 52 43 4f 52 4e 45 52  le, ACS_LRCORNER
4da0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65  );..    /* Conve
4db0: 72 74 20 74 6f 20 73 63 72 65 65 6e 20 63 6f 6f  rt to screen coo
4dc0: 72 64 69 6e 61 74 65 73 20 2a 2f 0a 20 20 20 20  rdinates */.    
4dd0: 78 31 20 2b 3d 20 77 69 6e 50 74 72 2d 3e 61 62  x1 += winPtr->ab
4de0: 73 4c 65 66 74 3b 0a 20 20 20 20 78 32 20 2b 3d  sLeft;.    x2 +=
4df0: 20 77 69 6e 50 74 72 2d 3e 61 62 73 4c 65 66 74   winPtr->absLeft
4e00: 3b 0a 20 20 20 20 79 31 20 2b 3d 20 77 69 6e 50  ;.    y1 += winP
4e10: 74 72 2d 3e 61 62 73 54 6f 70 3b 0a 20 20 20 20  tr->absTop;.    
4e20: 79 32 20 2b 3d 20 77 69 6e 50 74 72 2d 3e 61 62  y2 += winPtr->ab
4e30: 73 54 6f 70 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  sTop;..    /*.  
4e40: 20 20 20 2a 09 44 72 61 77 20 68 6f 72 69 7a 6f     *.Draw horizo
4e50: 6e 74 61 6c 20 6c 69 6e 65 73 2e 0a 20 20 20 20  ntal lines..    
4e60: 20 2a 2f 0a 20 20 20 20 6c 65 66 74 20 3d 20 78   */.    left = x
4e70: 31 2b 31 3b 0a 20 20 20 20 72 69 67 68 74 20 3d  1+1;.    right =
4e80: 20 78 32 3b 0a 20 20 20 20 43 74 6b 49 6e 74 65   x2;.    CtkInte
4e90: 72 73 65 63 74 53 70 61 6e 73 28 26 6c 65 66 74  rsectSpans(&left
4ea0: 2c 20 26 72 69 67 68 74 2c 20 63 6c 69 70 52 65  , &right, clipRe
4eb0: 63 74 50 74 72 2d 3e 6c 65 66 74 2c 20 63 6c 69  ctPtr->left, cli
4ec0: 70 52 65 63 74 50 74 72 2d 3e 72 69 67 68 74 29  pRectPtr->right)
4ed0: 3b 0a 20 20 20 20 69 66 20 28 21 43 74 6b 53 70  ;.    if (!CtkSp
4ee0: 61 6e 49 73 45 6d 70 74 79 28 6c 65 66 74 2c 20  anIsEmpty(left, 
4ef0: 72 69 67 68 74 29 29 20 7b 0a 09 69 66 20 28 28  right)) {..if ((
4f00: 63 6c 69 70 52 65 63 74 50 74 72 2d 3e 74 6f 70  clipRectPtr->top
4f10: 20 3c 3d 20 79 31 29 20 26 26 20 28 63 6c 69 70   <= y1) && (clip
4f20: 52 65 63 74 50 74 72 2d 3e 62 6f 74 74 6f 6d 20  RectPtr->bottom 
4f30: 3e 20 79 31 29 29 20 7b 0a 09 20 20 20 20 43 74  > y1)) {..    Ct
4f40: 6b 46 6f 72 45 61 63 68 49 6e 74 65 72 73 65 63  kForEachIntersec
4f50: 74 69 6e 67 53 70 61 6e 28 0a 09 09 46 69 6c 6c  tingSpan(...Fill
4f60: 53 70 61 6e 2c 20 28 43 6c 69 65 6e 74 44 61 74  Span, (ClientDat
4f70: 61 29 20 41 43 53 5f 48 4c 49 4e 45 2c 0a 09 09  a) ACS_HLINE,...
4f80: 6c 65 66 74 2c 20 72 69 67 68 74 2c 20 79 31 2c  left, right, y1,
4f90: 0a 09 09 77 69 6e 50 74 72 2d 3e 63 6c 69 70 52  ...winPtr->clipR
4fa0: 67 6e 29 3b 0a 09 7d 0a 09 69 66 20 28 28 63 6c  gn);..}..if ((cl
4fb0: 69 70 52 65 63 74 50 74 72 2d 3e 74 6f 70 20 3c  ipRectPtr->top <
4fc0: 3d 20 79 32 29 20 26 26 20 28 63 6c 69 70 52 65  = y2) && (clipRe
4fd0: 63 74 50 74 72 2d 3e 62 6f 74 74 6f 6d 20 3e 20  ctPtr->bottom > 
4fe0: 79 32 29 29 20 7b 0a 09 20 20 20 20 43 74 6b 46  y2)) {..    CtkF
4ff0: 6f 72 45 61 63 68 49 6e 74 65 72 73 65 63 74 69  orEachIntersecti
5000: 6e 67 53 70 61 6e 28 0a 09 09 46 69 6c 6c 53 70  ngSpan(...FillSp
5010: 61 6e 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  an, (ClientData)
5020: 20 41 43 53 5f 48 4c 49 4e 45 2c 0a 09 09 6c 65   ACS_HLINE,...le
5030: 66 74 2c 20 72 69 67 68 74 2c 20 79 32 2c 0a 09  ft, right, y2,..
5040: 09 77 69 6e 50 74 72 2d 3e 63 6c 69 70 52 67 6e  .winPtr->clipRgn
5050: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
5060: 20 2f 2a 0a 20 20 20 20 20 2a 09 44 72 61 77 20   /*.     *.Draw 
5070: 76 65 72 74 69 63 61 6c 20 6c 69 6e 65 73 2e 0a  vertical lines..
5080: 20 20 20 20 20 2a 2f 0a 20 20 20 20 74 6f 70 20       */.    top 
5090: 3d 20 79 31 20 2b 20 31 3b 0a 20 20 20 20 62 6f  = y1 + 1;.    bo
50a0: 74 74 6f 6d 20 3d 20 79 32 3b 0a 20 20 20 20 43  ttom = y2;.    C
50b0: 74 6b 49 6e 74 65 72 73 65 63 74 53 70 61 6e 73  tkIntersectSpans
50c0: 28 26 74 6f 70 2c 20 26 62 6f 74 74 6f 6d 2c 20  (&top, &bottom, 
50d0: 63 6c 69 70 52 65 63 74 50 74 72 2d 3e 74 6f 70  clipRectPtr->top
50e0: 2c 20 63 6c 69 70 52 65 63 74 50 74 72 2d 3e 62  , clipRectPtr->b
50f0: 6f 74 74 6f 6d 29 3b 0a 20 20 20 20 69 66 20 28  ottom);.    if (
5100: 28 63 6c 69 70 52 65 63 74 50 74 72 2d 3e 6c 65  (clipRectPtr->le
5110: 66 74 20 3c 3d 20 78 31 29 20 26 26 20 28 63 6c  ft <= x1) && (cl
5120: 69 70 52 65 63 74 50 74 72 2d 3e 72 69 67 68 74  ipRectPtr->right
5130: 20 3e 20 78 31 29 29 20 7b 0a 09 66 6f 72 20 28   > x1)) {..for (
5140: 79 3d 74 6f 70 3b 20 79 20 3c 20 62 6f 74 74 6f  y=top; y < botto
5150: 6d 3b 20 79 2b 2b 29 20 7b 0a 09 20 20 20 20 69  m; y++) {..    i
5160: 66 20 28 43 74 6b 50 6f 69 6e 74 49 6e 52 65 67  f (CtkPointInReg
5170: 69 6f 6e 28 78 31 2c 20 79 2c 20 77 69 6e 50 74  ion(x1, y, winPt
5180: 72 2d 3e 63 6c 69 70 52 67 6e 29 29 20 7b 0a 09  r->clipRgn)) {..
5190: 09 4d 6f 76 65 28 78 31 2c 20 79 29 3b 0a 09 09  .Move(x1, y);...
51a0: 50 75 74 43 68 61 72 28 41 43 53 5f 56 4c 49 4e  PutChar(ACS_VLIN
51b0: 45 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20  E);..    }..}.  
51c0: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 63 6c 69    }.    if ((cli
51d0: 70 52 65 63 74 50 74 72 2d 3e 6c 65 66 74 20 3c  pRectPtr->left <
51e0: 3d 20 78 32 29 20 26 26 20 28 63 6c 69 70 52 65  = x2) && (clipRe
51f0: 63 74 50 74 72 2d 3e 72 69 67 68 74 20 3e 20 78  ctPtr->right > x
5200: 32 29 29 20 7b 0a 09 66 6f 72 20 28 79 3d 74 6f  2)) {..for (y=to
5210: 70 3b 20 79 20 3c 20 62 6f 74 74 6f 6d 3b 20 79  p; y < bottom; y
5220: 2b 2b 29 20 7b 0a 09 20 20 20 20 69 66 20 28 43  ++) {..    if (C
5230: 74 6b 50 6f 69 6e 74 49 6e 52 65 67 69 6f 6e 28  tkPointInRegion(
5240: 78 32 2c 20 79 2c 20 77 69 6e 50 74 72 2d 3e 63  x2, y, winPtr->c
5250: 6c 69 70 52 67 6e 29 29 20 7b 0a 09 09 4d 6f 76  lipRgn)) {...Mov
5260: 65 28 78 32 2c 20 79 29 3b 0a 09 09 50 75 74 43  e(x2, y);...PutC
5270: 68 61 72 28 41 43 53 5f 56 4c 49 4e 45 29 3b 0a  har(ACS_VLINE);.
5280: 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a  .    }..}.    }.
5290: 7d 0a                                            }.