Hex Artifact Content

Artifact f39b6f05a0a133bb5aa1deaaa79288a15c61ea95:


0000: 2f 2a 20 0a 20 2a 20 74 6b 55 74 69 6c 2e 63 20  /* . * tkUtil.c 
0010: 28 43 54 6b 29 20 2d 2d 0a 20 2a 0a 20 2a 09 54  (CTk) --. *. *.T
0020: 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  his file contain
0030: 73 20 6d 69 73 63 65 6c 6c 61 6e 65 6f 75 73 20  s miscellaneous 
0040: 75 74 69 6c 69 74 79 20 70 72 6f 63 65 64 75 72  utility procedur
0050: 65 73 20 74 68 61 74 0a 20 2a 09 61 72 65 20 75  es that. *.are u
0060: 73 65 64 20 62 79 20 74 68 65 20 72 65 73 74 20  sed by the rest 
0070: 6f 66 20 54 6b 2c 20 73 75 63 68 20 61 73 20 61  of Tk, such as a
0080: 20 70 72 6f 63 65 64 75 72 65 20 66 6f 72 20 64   procedure for d
0090: 72 61 77 69 6e 67 0a 20 2a 09 61 20 66 6f 63 75  rawing. *.a focu
00a0: 73 20 68 69 67 68 6c 69 67 68 74 2e 0a 20 2a 0a  s highlight.. *.
00b0: 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28 63 29   * Copyright (c)
00c0: 20 31 39 39 34 20 54 68 65 20 52 65 67 65 6e 74   1994 The Regent
00d0: 73 20 6f 66 20 74 68 65 20 55 6e 69 76 65 72 73  s of the Univers
00e0: 69 74 79 20 6f 66 20 43 61 6c 69 66 6f 72 6e 69  ity of Californi
00f0: 61 2e 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  a.. * Copyright 
0100: 28 63 29 20 31 39 39 34 2d 31 39 39 35 20 53 75  (c) 1994-1995 Su
0110: 6e 20 4d 69 63 72 6f 73 79 73 74 65 6d 73 2c 20  n Microsystems, 
0120: 49 6e 63 2e 0a 20 2a 0a 20 2a 20 53 65 65 20 74  Inc.. *. * See t
0130: 68 65 20 66 69 6c 65 20 22 6c 69 63 65 6e 73 65  he file "license
0140: 2e 74 65 72 6d 73 22 20 66 6f 72 20 69 6e 66 6f  .terms" for info
0150: 72 6d 61 74 69 6f 6e 20 6f 6e 20 75 73 61 67 65  rmation on usage
0160: 20 61 6e 64 20 72 65 64 69 73 74 72 69 62 75 74   and redistribut
0170: 69 6f 6e 0a 20 2a 20 6f 66 20 74 68 69 73 20 66  ion. * of this f
0180: 69 6c 65 2c 20 61 6e 64 20 66 6f 72 20 61 20 44  ile, and for a D
0190: 49 53 43 4c 41 49 4d 45 52 20 4f 46 20 41 4c 4c  ISCLAIMER OF ALL
01a0: 20 57 41 52 52 41 4e 54 49 45 53 2e 0a 20 2a 0a   WARRANTIES.. *.
01b0: 20 2a 20 40 28 23 29 20 24 49 64 3a 20 63 74 6b   * @(#) $Id: ctk
01c0: 2e 73 68 61 72 2c 76 20 31 2e 35 30 20 31 39 39  .shar,v 1.50 199
01d0: 36 2f 30 31 2f 31 35 20 31 34 3a 34 37 3a 31 36  6/01/15 14:47:16
01e0: 20 61 6e 64 72 65 77 6d 20 45 78 70 20 61 6e 64   andrewm Exp and
01f0: 72 65 77 6d 20 24 0a 20 2a 2f 0a 0a 23 69 6e 63  rewm $. */..#inc
0200: 6c 75 64 65 20 22 74 6b 2e 68 22 0a 23 69 6e 63  lude "tk.h".#inc
0210: 6c 75 64 65 20 22 74 6b 50 6f 72 74 2e 68 22 0a  lude "tkPort.h".
0220: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
0230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
0270: 0a 20 2a 20 54 6b 5f 47 65 74 53 63 72 6f 6c 6c  . * Tk_GetScroll
0280: 49 6e 66 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Info --. *. *.Th
0290: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
02a0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 61 72 73 65  invoked to parse
02b0: 20 22 78 76 69 65 77 22 20 61 6e 64 20 22 79 76   "xview" and "yv
02c0: 69 65 77 22 0a 20 2a 09 73 63 72 6f 6c 6c 69 6e  iew". *.scrollin
02d0: 67 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 77  g commands for w
02e0: 69 64 67 65 74 73 20 75 73 69 6e 67 20 74 68 65  idgets using the
02f0: 20 6e 65 77 20 73 63 72 6f 6c 6c 69 6e 67 0a 20   new scrolling. 
0300: 2a 09 63 6f 6d 6d 61 6e 64 20 73 79 6e 74 61 78  *.command syntax
0310: 20 28 22 6d 6f 76 65 74 6f 22 20 6f 72 20 22 73   ("moveto" or "s
0320: 63 72 6f 6c 6c 22 20 6f 70 74 69 6f 6e 73 29 2e  croll" options).
0330: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
0340: 20 2a 09 54 68 65 20 72 65 74 75 72 6e 20 76 61   *.The return va
0350: 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 54 4b  lue is either TK
0360: 5f 53 43 52 4f 4c 4c 5f 4d 4f 56 45 54 4f 2c 20  _SCROLL_MOVETO, 
0370: 54 4b 5f 53 43 52 4f 4c 4c 5f 50 41 47 45 53 2c  TK_SCROLL_PAGES,
0380: 0a 20 2a 09 54 4b 5f 53 43 52 4f 4c 4c 5f 55 4e  . *.TK_SCROLL_UN
0390: 49 54 53 2c 20 6f 72 20 54 4b 5f 53 43 52 4f 4c  ITS, or TK_SCROL
03a0: 4c 5f 45 52 52 4f 52 2e 20 20 54 68 69 73 20 69  L_ERROR.  This i
03b0: 6e 64 69 63 61 74 65 73 20 77 68 65 74 68 65 72  ndicates whether
03c0: 0a 20 2a 09 74 68 65 20 63 6f 6d 6d 61 6e 64 20  . *.the command 
03d0: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
03e0: 20 70 61 72 73 65 64 20 61 6e 64 20 77 68 61 74   parsed and what
03f0: 20 66 6f 72 6d 20 74 68 65 20 63 6f 6d 6d 61 6e   form the comman
0400: 64 0a 20 2a 09 74 6f 6f 6b 2e 20 20 49 66 20 54  d. *.took.  If T
0410: 4b 5f 53 43 52 4f 4c 4c 5f 4d 4f 56 45 54 4f 2c  K_SCROLL_MOVETO,
0420: 20 2a 64 62 6c 50 74 72 20 69 73 20 66 69 6c 6c   *dblPtr is fill
0430: 65 64 20 69 6e 20 77 69 74 68 20 74 68 65 0a 20  ed in with the. 
0440: 2a 09 64 65 73 69 72 65 64 20 70 6f 73 69 74 69  *.desired positi
0450: 6f 6e 3b 20 20 69 66 20 54 4b 5f 53 43 52 4f 4c  on;  if TK_SCROL
0460: 4c 5f 50 41 47 45 53 20 6f 72 20 54 4b 5f 53 43  L_PAGES or TK_SC
0470: 52 4f 4c 4c 5f 55 4e 49 54 53 2c 0a 20 2a 09 2a  ROLL_UNITS,. *.*
0480: 69 6e 74 50 74 72 20 69 73 20 66 69 6c 6c 65 64  intPtr is filled
0490: 20 69 6e 20 77 69 74 68 20 74 68 65 20 6e 75 6d   in with the num
04a0: 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 74 6f 20  ber of lines to 
04b0: 6d 6f 76 65 20 28 6d 61 79 20 62 65 0a 20 2a 09  move (may be. *.
04c0: 6e 65 67 61 74 69 76 65 29 3b 20 20 69 66 20 54  negative);  if T
04d0: 4b 5f 53 43 52 4f 4c 4c 5f 45 52 52 4f 52 2c 20  K_SCROLL_ERROR, 
04e0: 69 6e 74 65 72 70 2d 3e 72 65 73 75 6c 74 20 63  interp->result c
04f0: 6f 6e 74 61 69 6e 73 20 61 6e 0a 20 2a 09 65 72  ontains an. *.er
0500: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a  ror message.. *.
0510: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
0520: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
0530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0570: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54  -----. */..int.T
0580: 6b 5f 47 65 74 53 63 72 6f 6c 6c 49 6e 66 6f 28  k_GetScrollInfo(
0590: 69 6e 74 65 72 70 2c 20 61 72 67 63 2c 20 61 72  interp, argc, ar
05a0: 67 76 2c 20 64 62 6c 50 74 72 2c 20 69 6e 74 50  gv, dblPtr, intP
05b0: 74 72 29 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  tr).    Tcl_Inte
05c0: 72 70 20 2a 69 6e 74 65 72 70 3b 09 09 09 2f 2a  rp *interp;.../*
05d0: 20 55 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20   Used for error 
05e0: 72 65 70 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20  reporting. */.  
05f0: 20 20 69 6e 74 20 61 72 67 63 3b 09 09 09 09 2f    int argc;..../
0600: 2a 20 23 20 61 72 67 75 6d 65 6e 74 73 20 66 6f  * # arguments fo
0610: 72 20 63 6f 6d 6d 61 6e 64 2e 20 2a 2f 0a 20 20  r command. */.  
0620: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 3b 09 09    char **argv;..
0630: 09 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 66 6f  ./* Arguments fo
0640: 72 20 63 6f 6d 6d 61 6e 64 2e 20 2a 2f 0a 20 20  r command. */.  
0650: 20 20 64 6f 75 62 6c 65 20 2a 64 62 6c 50 74 72    double *dblPtr
0660: 3b 09 09 09 2f 2a 20 46 69 6c 6c 65 64 20 69 6e  ;.../* Filled in
0670: 20 77 69 74 68 20 61 72 67 75 6d 65 6e 74 20 22   with argument "
0680: 6d 6f 76 65 74 6f 22 0a 09 09 09 09 09 20 2a 20  moveto"...... * 
0690: 6f 70 74 69 6f 6e 2c 20 69 66 20 61 6e 79 2e 20  option, if any. 
06a0: 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 69 6e 74 50  */.    int *intP
06b0: 74 72 3b 09 09 09 2f 2a 20 46 69 6c 6c 65 64 20  tr;.../* Filled 
06c0: 69 6e 20 77 69 74 68 20 6e 75 6d 62 65 72 20 6f  in with number o
06d0: 66 20 70 61 67 65 73 0a 09 09 09 09 09 20 2a 20  f pages...... * 
06e0: 6f 72 20 6c 69 6e 65 73 20 74 6f 20 73 63 72 6f  or lines to scro
06f0: 6c 6c 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 7b  ll, if any. */.{
0700: 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20  .    int c;.    
0710: 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 0a  size_t length;..
0720: 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 73 74 72      length = str
0730: 6c 65 6e 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  len(argv[2]);.  
0740: 20 20 63 20 3d 20 61 72 67 76 5b 32 5d 5b 30 5d    c = argv[2][0]
0750: 3b 0a 20 20 20 20 69 66 20 28 28 63 20 3d 3d 20  ;.    if ((c == 
0760: 27 6d 27 29 20 26 26 20 28 73 74 72 6e 63 6d 70  'm') && (strncmp
0770: 28 61 72 67 76 5b 32 5d 2c 20 22 6d 6f 76 65 74  (argv[2], "movet
0780: 6f 22 2c 20 6c 65 6e 67 74 68 29 20 3d 3d 20 30  o", length) == 0
0790: 29 29 20 7b 0a 09 69 66 20 28 61 72 67 63 20 21  )) {..if (argc !
07a0: 3d 20 34 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  = 4) {..    Tcl_
07b0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
07c0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
07d0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
07e0: 22 2c 0a 09 09 20 20 20 20 61 72 67 76 5b 30 5d  ",...    argv[0]
07f0: 2c 20 22 20 22 2c 20 61 72 67 76 5b 31 5d 2c 20  , " ", argv[1], 
0800: 22 20 6d 6f 76 65 74 6f 20 66 72 61 63 74 69 6f  " moveto fractio
0810: 6e 5c 22 22 2c 0a 09 09 20 20 20 20 28 63 68 61  n\"",...    (cha
0820: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
0830: 20 72 65 74 75 72 6e 20 54 4b 5f 53 43 52 4f 4c   return TK_SCROL
0840: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 69 66 20  L_ERROR;..}..if 
0850: 28 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69  (Tcl_GetDouble(i
0860: 6e 74 65 72 70 2c 20 61 72 67 76 5b 33 5d 2c 20  nterp, argv[3], 
0870: 64 62 6c 50 74 72 29 20 21 3d 20 54 43 4c 5f 4f  dblPtr) != TCL_O
0880: 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  K) {..    return
0890: 20 54 4b 5f 53 43 52 4f 4c 4c 5f 45 52 52 4f 52   TK_SCROLL_ERROR
08a0: 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 20 54 4b 5f  ;..}..return TK_
08b0: 53 43 52 4f 4c 4c 5f 4d 4f 56 45 54 4f 3b 0a 20  SCROLL_MOVETO;. 
08c0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28 63     } else if ((c
08d0: 20 3d 3d 20 27 73 27 29 0a 09 20 20 20 20 26 26   == 's')..    &&
08e0: 20 28 73 74 72 6e 63 6d 70 28 61 72 67 76 5b 32   (strncmp(argv[2
08f0: 5d 2c 20 22 73 63 72 6f 6c 6c 22 2c 20 6c 65 6e  ], "scroll", len
0900: 67 74 68 29 20 3d 3d 20 30 29 29 20 7b 0a 09 69  gth) == 0)) {..i
0910: 66 20 28 61 72 67 63 20 21 3d 20 35 29 20 7b 0a  f (argc != 5) {.
0920: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
0930: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
0940: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
0950: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 09 09 20 20  uld be \"",...  
0960: 20 20 61 72 67 76 5b 30 5d 2c 20 22 20 22 2c 20    argv[0], " ", 
0970: 61 72 67 76 5b 31 5d 2c 20 22 20 73 63 72 6f 6c  argv[1], " scrol
0980: 6c 20 6e 75 6d 62 65 72 20 75 6e 69 74 73 7c 70  l number units|p
0990: 61 67 65 73 5c 22 22 2c 0a 09 09 20 20 20 20 28  ages\"",...    (
09a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
09b0: 20 20 20 20 72 65 74 75 72 6e 20 54 4b 5f 53 43      return TK_SC
09c0: 52 4f 4c 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09  ROLL_ERROR;..}..
09d0: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 28 69  if (Tcl_GetInt(i
09e0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 33 5d 2c 20  nterp, argv[3], 
09f0: 69 6e 74 50 74 72 29 20 21 3d 20 54 43 4c 5f 4f  intPtr) != TCL_O
0a00: 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  K) {..    return
0a10: 20 54 4b 5f 53 43 52 4f 4c 4c 5f 45 52 52 4f 52   TK_SCROLL_ERROR
0a20: 3b 0a 09 7d 0a 09 6c 65 6e 67 74 68 20 3d 20 73  ;..}..length = s
0a30: 74 72 6c 65 6e 28 61 72 67 76 5b 34 5d 29 3b 0a  trlen(argv[4]);.
0a40: 09 63 20 3d 20 61 72 67 76 5b 34 5d 5b 30 5d 3b  .c = argv[4][0];
0a50: 0a 09 69 66 20 28 28 63 20 3d 3d 20 27 70 27 29  ..if ((c == 'p')
0a60: 20 26 26 20 28 73 74 72 6e 63 6d 70 28 61 72 67   && (strncmp(arg
0a70: 76 5b 34 5d 2c 20 22 70 61 67 65 73 22 2c 20 6c  v[4], "pages", l
0a80: 65 6e 67 74 68 29 20 3d 3d 20 30 29 29 20 7b 0a  ength) == 0)) {.
0a90: 09 20 20 20 20 72 65 74 75 72 6e 20 54 4b 5f 53  .    return TK_S
0aa0: 43 52 4f 4c 4c 5f 50 41 47 45 53 3b 0a 09 7d 20  CROLL_PAGES;..} 
0ab0: 65 6c 73 65 20 69 66 20 28 28 63 20 3d 3d 20 27  else if ((c == '
0ac0: 75 27 29 0a 09 09 26 26 20 28 73 74 72 6e 63 6d  u')...&& (strncm
0ad0: 70 28 61 72 67 76 5b 34 5d 2c 20 22 75 6e 69 74  p(argv[4], "unit
0ae0: 73 22 2c 20 6c 65 6e 67 74 68 29 20 3d 3d 20 30  s", length) == 0
0af0: 29 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  )) {..    return
0b00: 20 54 4b 5f 53 43 52 4f 4c 4c 5f 55 4e 49 54 53   TK_SCROLL_UNITS
0b10: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
0b20: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
0b30: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 61  t(interp, "bad a
0b40: 72 67 75 6d 65 6e 74 20 5c 22 22 2c 20 61 72 67  rgument \"", arg
0b50: 76 5b 34 5d 2c 0a 09 09 20 20 20 20 22 5c 22 3a  v[4],...    "\":
0b60: 20 6d 75 73 74 20 62 65 20 75 6e 69 74 73 20 6f   must be units o
0b70: 72 20 70 61 67 65 73 22 2c 20 28 63 68 61 72 20  r pages", (char 
0b80: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  *) NULL);..    r
0b90: 65 74 75 72 6e 20 54 4b 5f 53 43 52 4f 4c 4c 5f  eturn TK_SCROLL_
0ba0: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ERROR;..}.    }.
0bb0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
0bc0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
0bd0: 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 22  known option \""
0be0: 2c 20 61 72 67 76 5b 32 5d 2c 0a 09 20 20 20 20  , argv[2],..    
0bf0: 22 5c 22 3a 20 6d 75 73 74 20 62 65 20 6d 6f 76  "\": must be mov
0c00: 65 74 6f 20 6f 72 20 73 63 72 6f 6c 6c 22 2c 20  eto or scroll", 
0c10: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
0c20: 20 20 20 20 72 65 74 75 72 6e 20 54 4b 5f 53 43      return TK_SC
0c30: 52 4f 4c 4c 5f 45 52 52 4f 52 3b 0a 7d 0a        ROLL_ERROR;.}.