Hex Artifact Content

Artifact 6b4070099eccd2d46525a1cbaa72afb08af5b961:


0000: 2f 2a 20 0a 20 2a 20 74 6b 4d 65 6e 75 2e 63 20  /* . * tkMenu.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 6d 6f 64 75 6c 65 20 69 6d 70 6c 65  his module imple
0030: 6d 65 6e 74 73 20 6d 65 6e 75 73 20 66 6f 72 20  ments menus for 
0040: 74 68 65 20 54 6b 20 74 6f 6f 6c 6b 69 74 2e 20  the Tk toolkit. 
0050: 20 54 68 65 20 6d 65 6e 75 73 0a 20 2a 09 73 75   The menus. *.su
0060: 70 70 6f 72 74 20 6e 6f 72 6d 61 6c 20 62 75 74  pport normal but
0070: 74 6f 6e 20 65 6e 74 72 69 65 73 2c 20 70 6c 75  ton entries, plu
0080: 73 20 63 68 65 63 6b 20 62 75 74 74 6f 6e 73 2c  s check buttons,
0090: 20 72 61 64 69 6f 0a 20 2a 09 62 75 74 74 6f 6e   radio. *.button
00a0: 73 2c 20 69 63 6f 6e 69 63 20 66 6f 72 6d 73 20  s, iconic forms 
00b0: 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  of all of the ab
00c0: 6f 76 65 2c 20 61 6e 64 20 73 65 70 61 72 61 74  ove, and separat
00d0: 6f 72 0a 20 2a 09 65 6e 74 72 69 65 73 2e 0a 20  or. *.entries.. 
00e0: 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28  *. * Copyright (
00f0: 63 29 20 31 39 39 30 2d 31 39 39 34 20 54 68 65  c) 1990-1994 The
0100: 20 52 65 67 65 6e 74 73 20 6f 66 20 74 68 65 20   Regents of the 
0110: 55 6e 69 76 65 72 73 69 74 79 20 6f 66 20 43 61  University of Ca
0120: 6c 69 66 6f 72 6e 69 61 2e 0a 20 2a 20 43 6f 70  lifornia.. * Cop
0130: 79 72 69 67 68 74 20 28 63 29 20 31 39 39 34 2d  yright (c) 1994-
0140: 31 39 39 35 20 53 75 6e 20 4d 69 63 72 6f 73 79  1995 Sun Microsy
0150: 73 74 65 6d 73 2c 20 49 6e 63 2e 0a 20 2a 20 43  stems, Inc.. * C
0160: 6f 70 79 72 69 67 68 74 20 28 63 29 20 31 39 39  opyright (c) 199
0170: 34 2d 31 39 39 35 20 43 6c 65 76 65 6c 61 6e 64  4-1995 Cleveland
0180: 20 43 6c 69 6e 69 63 20 46 6f 75 6e 64 61 74 69   Clinic Foundati
0190: 6f 6e 0a 20 2a 0a 20 2a 20 53 65 65 20 74 68 65  on. *. * See the
01a0: 20 66 69 6c 65 20 22 6c 69 63 65 6e 73 65 2e 74   file "license.t
01b0: 65 72 6d 73 22 20 66 6f 72 20 69 6e 66 6f 72 6d  erms" for inform
01c0: 61 74 69 6f 6e 20 6f 6e 20 75 73 61 67 65 20 61  ation on usage a
01d0: 6e 64 20 72 65 64 69 73 74 72 69 62 75 74 69 6f  nd redistributio
01e0: 6e 0a 20 2a 20 6f 66 20 74 68 69 73 20 66 69 6c  n. * of this fil
01f0: 65 2c 20 61 6e 64 20 66 6f 72 20 61 20 44 49 53  e, and for a DIS
0200: 43 4c 41 49 4d 45 52 20 4f 46 20 41 4c 4c 20 57  CLAIMER OF ALL W
0210: 41 52 52 41 4e 54 49 45 53 2e 0a 20 2a 0a 20 2a  ARRANTIES.. *. *
0220: 20 40 28 23 29 20 24 49 64 3a 20 63 74 6b 2e 73   @(#) $Id: ctk.s
0230: 68 61 72 2c 76 20 31 2e 35 30 20 31 39 39 36 2f  har,v 1.50 1996/
0240: 30 31 2f 31 35 20 31 34 3a 34 37 3a 31 36 20 61  01/15 14:47:16 a
0250: 6e 64 72 65 77 6d 20 45 78 70 20 61 6e 64 72 65  ndrewm Exp andre
0260: 77 6d 20 24 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75  wm $. */..#inclu
0270: 64 65 20 22 74 6b 50 6f 72 74 2e 68 22 0a 23 69  de "tkPort.h".#i
0280: 6e 63 6c 75 64 65 20 22 64 65 66 61 75 6c 74 2e  nclude "default.
0290: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 6b 49  h".#include "tkI
02a0: 6e 74 2e 68 22 0a 0a 2f 2a 0a 20 2a 20 4f 6e 65  nt.h"../*. * One
02b0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
02c0: 67 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  g data structure
02d0: 73 20 69 73 20 6b 65 70 74 20 66 6f 72 20 65 61  s is kept for ea
02e0: 63 68 20 65 6e 74 72 79 20 6f 66 20 65 61 63 68  ch entry of each
02f0: 0a 20 2a 20 6d 65 6e 75 20 6d 61 6e 61 67 65 64  . * menu managed
0300: 20 62 79 20 74 68 69 73 20 66 69 6c 65 3a 0a 20   by this file:. 
0310: 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  */..typedef stru
0320: 63 74 20 4d 65 6e 75 45 6e 74 72 79 20 7b 0a 20  ct MenuEntry {. 
0330: 20 20 20 69 6e 74 20 74 79 70 65 3b 09 09 09 2f     int type;.../
0340: 2a 20 54 79 70 65 20 6f 66 20 6d 65 6e 75 20 65  * Type of menu e
0350: 6e 74 72 79 3b 20 20 73 65 65 20 62 65 6c 6f 77  ntry;  see below
0360: 20 66 6f 72 0a 09 09 09 09 20 2a 20 76 61 6c 69   for..... * vali
0370: 64 20 74 79 70 65 73 2e 20 2a 2f 0a 20 20 20 20  d types. */.    
0380: 73 74 72 75 63 74 20 4d 65 6e 75 20 2a 6d 65 6e  struct Menu *men
0390: 75 50 74 72 3b 09 2f 2a 20 4d 65 6e 75 20 77 69  uPtr;./* Menu wi
03a0: 74 68 20 77 68 69 63 68 20 74 68 69 73 20 65 6e  th which this en
03b0: 74 72 79 20 69 73 20 61 73 73 6f 63 69 61 74 65  try is associate
03c0: 64 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  d. */.    char *
03d0: 6c 61 62 65 6c 3b 09 09 2f 2a 20 4d 61 69 6e 20  label;../* Main 
03e0: 74 65 78 74 20 6c 61 62 65 6c 20 64 69 73 70 6c  text label displ
03f0: 61 79 65 64 20 69 6e 20 65 6e 74 72 79 20 28 4e  ayed in entry (N
0400: 55 4c 4c 0a 09 09 09 09 20 2a 20 69 66 20 6e 6f  ULL..... * if no
0410: 20 6c 61 62 65 6c 29 2e 20 20 4d 61 6c 6c 6f 63   label).  Malloc
0420: 27 65 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  'ed. */.    int 
0430: 6c 61 62 65 6c 4c 65 6e 67 74 68 3b 09 09 2f 2a  labelLength;../*
0440: 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 4e   Number of non-N
0450: 55 4c 4c 20 63 68 61 72 61 63 74 65 72 73 20 69  ULL characters i
0460: 6e 20 6c 61 62 65 6c 2e 20 2a 2f 0a 20 20 20 20  n label. */.    
0470: 69 6e 74 20 75 6e 64 65 72 6c 69 6e 65 3b 09 09  int underline;..
0480: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 68 61 72  /* Index of char
0490: 61 63 74 65 72 20 74 6f 20 75 6e 64 65 72 6c 69  acter to underli
04a0: 6e 65 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ne. */.    char 
04b0: 2a 61 63 63 65 6c 3b 09 09 2f 2a 20 41 63 63 65  *accel;../* Acce
04c0: 6c 65 72 61 74 6f 72 20 73 74 72 69 6e 67 20 64  lerator string d
04d0: 69 73 70 6c 61 79 65 64 20 61 74 20 72 69 67 68  isplayed at righ
04e0: 74 0a 09 09 09 09 20 2a 20 6f 66 20 6d 65 6e 75  t..... * of menu
04f0: 20 65 6e 74 72 79 2e 20 20 4e 55 4c 4c 20 6d 65   entry.  NULL me
0500: 61 6e 73 20 6e 6f 20 73 75 63 68 0a 09 09 09 09  ans no such.....
0510: 20 2a 20 61 63 63 65 6c 65 72 61 74 6f 72 2e 20   * accelerator. 
0520: 20 4d 61 6c 6c 6f 63 27 65 64 2e 20 2a 2f 0a 20   Malloc'ed. */. 
0530: 20 20 20 69 6e 74 20 61 63 63 65 6c 4c 65 6e 67     int accelLeng
0540: 74 68 3b 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f  th;../* Number o
0550: 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 63 68 61 72 61  f non-NULL chara
0560: 63 74 65 72 73 20 69 6e 0a 09 09 09 09 20 2a 20  cters in..... * 
0570: 61 63 63 65 6c 65 72 61 74 6f 72 2e 20 2a 2f 0a  accelerator. */.
0580: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49  .    /*.     * I
0590: 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65 6c 61 74  nformation relat
05a0: 65 64 20 74 6f 20 64 69 73 70 6c 61 79 69 6e 67  ed to displaying
05b0: 20 65 6e 74 72 79 3a 0a 20 20 20 20 20 2a 2f 0a   entry:.     */.
05c0: 0a 20 20 20 20 54 6b 5f 55 69 64 20 73 74 61 74  .    Tk_Uid stat
05d0: 65 3b 09 09 2f 2a 20 53 74 61 74 65 20 6f 66 20  e;../* State of 
05e0: 62 75 74 74 6f 6e 20 66 6f 72 20 64 69 73 70 6c  button for displ
05f0: 61 79 20 70 75 72 70 6f 73 65 73 3a 0a 09 09 09  ay purposes:....
0600: 09 20 2a 20 6e 6f 72 6d 61 6c 2c 20 61 63 74 69  . * normal, acti
0610: 76 65 2c 20 6f 72 20 64 69 73 61 62 6c 65 64 2e  ve, or disabled.
0620: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 6e 64 69   */.    int indi
0630: 63 61 74 6f 72 4f 6e 3b 09 09 2f 2a 20 54 72 75  catorOn;../* Tru
0640: 65 20 6d 65 61 6e 73 20 64 72 61 77 20 69 6e 64  e means draw ind
0650: 69 63 61 74 6f 72 2c 20 66 61 6c 73 65 20 6d 65  icator, false me
0660: 61 6e 73 0a 09 09 09 09 20 2a 20 64 6f 6e 27 74  ans..... * don't
0670: 20 64 72 61 77 20 69 74 2e 20 2a 2f 0a 0a 20 20   draw it. */..  
0680: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 6e 66 6f    /*.     * Info
0690: 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  rmation used to 
06a0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 69 73 20 65  implement this e
06b0: 6e 74 72 79 27 73 20 61 63 74 69 6f 6e 3a 0a 20  ntry's action:. 
06c0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 63 68 61 72      */..    char
06d0: 20 2a 63 6f 6d 6d 61 6e 64 3b 09 09 2f 2a 20 43   *command;../* C
06e0: 6f 6d 6d 61 6e 64 20 74 6f 20 69 6e 76 6f 6b 65  ommand to invoke
06f0: 20 77 68 65 6e 20 65 6e 74 72 79 20 69 73 20 69   when entry is i
0700: 6e 76 6f 6b 65 64 2e 0a 09 09 09 09 20 2a 20 4d  nvoked...... * M
0710: 61 6c 6c 6f 63 27 65 64 2e 20 2a 2f 0a 20 20 20  alloc'ed. */.   
0720: 20 63 68 61 72 20 2a 6e 61 6d 65 3b 09 09 09 2f   char *name;.../
0730: 2a 20 4e 61 6d 65 20 6f 66 20 76 61 72 69 61 62  * Name of variab
0740: 6c 65 20 28 66 6f 72 20 63 68 65 63 6b 20 62 75  le (for check bu
0750: 74 74 6f 6e 73 20 61 6e 64 0a 09 09 09 09 20 2a  ttons and..... *
0760: 20 72 61 64 69 6f 20 62 75 74 74 6f 6e 73 29 20   radio buttons) 
0770: 6f 72 20 6d 65 6e 75 20 28 66 6f 72 20 63 61 73  or menu (for cas
0780: 63 61 64 65 0a 09 09 09 09 20 2a 20 65 6e 74 72  cade..... * entr
0790: 69 65 73 29 2e 20 20 4d 61 6c 6c 6f 63 27 65 64  ies).  Malloc'ed
07a0: 2e 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6f 6e  .*/.    char *on
07b0: 56 61 6c 75 65 3b 09 09 2f 2a 20 56 61 6c 75 65  Value;../* Value
07c0: 20 74 6f 20 73 74 6f 72 65 20 69 6e 20 76 61 72   to store in var
07d0: 69 61 62 6c 65 20 77 68 65 6e 20 73 65 6c 65 63  iable when selec
07e0: 74 65 64 0a 09 09 09 09 20 2a 20 28 6f 6e 6c 79  ted..... * (only
07f0: 20 66 6f 72 20 72 61 64 69 6f 20 61 6e 64 20 63   for radio and c
0800: 68 65 63 6b 20 62 75 74 74 6f 6e 73 29 2e 0a 09  heck buttons)...
0810: 09 09 09 20 2a 20 4d 61 6c 6c 6f 63 27 65 64 2e  ... * Malloc'ed.
0820: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6f 66   */.    char *of
0830: 66 56 61 6c 75 65 3b 09 09 2f 2a 20 56 61 6c 75  fValue;../* Valu
0840: 65 20 74 6f 20 73 74 6f 72 65 20 69 6e 20 76 61  e to store in va
0850: 72 69 61 62 6c 65 20 77 68 65 6e 20 6e 6f 74 0a  riable when not.
0860: 09 09 09 09 20 2a 20 73 65 6c 65 63 74 65 64 20  .... * selected 
0870: 28 6f 6e 6c 79 20 66 6f 72 20 63 68 65 63 6b 20  (only for check 
0880: 62 75 74 74 6f 6e 73 29 2e 0a 09 09 09 09 20 2a  buttons)...... *
0890: 20 4d 61 6c 6c 6f 63 27 65 64 2e 20 2a 2f 0a 0a   Malloc'ed. */..
08a0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 69      /*.     * Mi
08b0: 73 63 65 6c 6c 61 6e 65 6f 75 73 20 69 6e 66 6f  scellaneous info
08c0: 72 6d 61 74 69 6f 6e 3a 0a 20 20 20 20 20 2a 2f  rmation:.     */
08d0: 0a 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b  ..    int flags;
08e0: 09 09 09 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c  .../* Various fl
08f0: 61 67 73 2e 20 20 53 65 65 20 62 65 6c 6f 77 20  ags.  See below 
0900: 66 6f 72 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e  for definitions.
0910: 20 2a 2f 0a 7d 20 4d 65 6e 75 45 6e 74 72 79 3b   */.} MenuEntry;
0920: 0a 0a 2f 2a 0a 20 2a 20 46 6c 61 67 20 76 61 6c  ../*. * Flag val
0930: 75 65 73 20 64 65 66 69 6e 65 64 20 66 6f 72 20  ues defined for 
0940: 6d 65 6e 75 20 65 6e 74 72 69 65 73 3a 0a 20 2a  menu entries:. *
0950: 0a 20 2a 20 45 4e 54 52 59 5f 53 45 4c 45 43 54  . * ENTRY_SELECT
0960: 45 44 3a 09 09 4e 6f 6e 2d 7a 65 72 6f 20 6d 65  ED:..Non-zero me
0970: 61 6e 73 20 74 68 69 73 20 69 73 20 61 20 72 61  ans this is a ra
0980: 64 69 6f 20 6f 72 20 63 68 65 63 6b 0a 20 2a 09  dio or check. *.
0990: 09 09 09 62 75 74 74 6f 6e 20 61 6e 64 20 74 68  ...button and th
09a0: 61 74 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  at it should be 
09b0: 64 72 61 77 6e 20 69 6e 0a 20 2a 09 09 09 09 74  drawn in. *....t
09c0: 68 65 20 22 73 65 6c 65 63 74 65 64 22 20 73 74  he "selected" st
09d0: 61 74 65 2e 0a 20 2a 20 45 4e 54 52 59 5f 4e 45  ate.. * ENTRY_NE
09e0: 45 44 53 5f 52 45 44 49 53 50 4c 41 59 3a 09 4e  EDS_REDISPLAY:.N
09f0: 6f 6e 2d 7a 65 72 6f 20 6d 65 61 6e 73 20 74 68  on-zero means th
0a00: 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 62  e entry should b
0a10: 65 20 72 65 64 69 73 70 6c 61 79 65 64 2e 0a 20  e redisplayed.. 
0a20: 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 45 4e 54 52  */..#define ENTR
0a30: 59 5f 53 45 4c 45 43 54 45 44 09 09 31 0a 23 64  Y_SELECTED..1.#d
0a40: 65 66 69 6e 65 20 45 4e 54 52 59 5f 4e 45 45 44  efine ENTRY_NEED
0a50: 53 5f 52 45 44 49 53 50 4c 41 59 09 34 0a 0a 2f  S_REDISPLAY.4../
0a60: 2a 0a 20 2a 20 54 79 70 65 73 20 64 65 66 69 6e  *. * Types defin
0a70: 65 64 20 66 6f 72 20 4d 65 6e 75 45 6e 74 72 69  ed for MenuEntri
0a80: 65 73 3a 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65  es:. */..#define
0a90: 20 43 4f 4d 4d 41 4e 44 5f 45 4e 54 52 59 09 09   COMMAND_ENTRY..
0aa0: 30 0a 23 64 65 66 69 6e 65 20 53 45 50 41 52 41  0.#define SEPARA
0ab0: 54 4f 52 5f 45 4e 54 52 59 09 09 31 0a 23 64 65  TOR_ENTRY..1.#de
0ac0: 66 69 6e 65 20 43 48 45 43 4b 5f 42 55 54 54 4f  fine CHECK_BUTTO
0ad0: 4e 5f 45 4e 54 52 59 09 32 0a 23 64 65 66 69 6e  N_ENTRY.2.#defin
0ae0: 65 20 52 41 44 49 4f 5f 42 55 54 54 4f 4e 5f 45  e RADIO_BUTTON_E
0af0: 4e 54 52 59 09 33 0a 23 64 65 66 69 6e 65 20 43  NTRY.3.#define C
0b00: 41 53 43 41 44 45 5f 45 4e 54 52 59 09 09 34 0a  ASCADE_ENTRY..4.
0b10: 23 64 65 66 69 6e 65 20 54 45 41 52 4f 46 46 5f  #define TEAROFF_
0b20: 45 4e 54 52 59 09 09 35 0a 0a 2f 2a 0a 20 2a 20  ENTRY..5../*. * 
0b30: 4d 61 73 6b 20 62 69 74 73 20 66 6f 72 20 61 62  Mask bits for ab
0b40: 6f 76 65 20 74 79 70 65 73 3a 0a 20 2a 2f 0a 0a  ove types:. */..
0b50: 23 64 65 66 69 6e 65 20 43 4f 4d 4d 41 4e 44 5f  #define COMMAND_
0b60: 4d 41 53 4b 09 09 54 4b 5f 43 4f 4e 46 49 47 5f  MASK..TK_CONFIG_
0b70: 55 53 45 52 5f 42 49 54 0a 23 64 65 66 69 6e 65  USER_BIT.#define
0b80: 20 53 45 50 41 52 41 54 4f 52 5f 4d 41 53 4b 09   SEPARATOR_MASK.
0b90: 09 28 54 4b 5f 43 4f 4e 46 49 47 5f 55 53 45 52  .(TK_CONFIG_USER
0ba0: 5f 42 49 54 20 3c 3c 20 31 29 0a 23 64 65 66 69  _BIT << 1).#defi
0bb0: 6e 65 20 43 48 45 43 4b 5f 42 55 54 54 4f 4e 5f  ne CHECK_BUTTON_
0bc0: 4d 41 53 4b 09 28 54 4b 5f 43 4f 4e 46 49 47 5f  MASK.(TK_CONFIG_
0bd0: 55 53 45 52 5f 42 49 54 20 3c 3c 20 32 29 0a 23  USER_BIT << 2).#
0be0: 64 65 66 69 6e 65 20 52 41 44 49 4f 5f 42 55 54  define RADIO_BUT
0bf0: 54 4f 4e 5f 4d 41 53 4b 09 28 54 4b 5f 43 4f 4e  TON_MASK.(TK_CON
0c00: 46 49 47 5f 55 53 45 52 5f 42 49 54 20 3c 3c 20  FIG_USER_BIT << 
0c10: 33 29 0a 23 64 65 66 69 6e 65 20 43 41 53 43 41  3).#define CASCA
0c20: 44 45 5f 4d 41 53 4b 09 09 28 54 4b 5f 43 4f 4e  DE_MASK..(TK_CON
0c30: 46 49 47 5f 55 53 45 52 5f 42 49 54 20 3c 3c 20  FIG_USER_BIT << 
0c40: 34 29 0a 23 64 65 66 69 6e 65 20 54 45 41 52 4f  4).#define TEARO
0c50: 46 46 5f 4d 41 53 4b 09 09 28 54 4b 5f 43 4f 4e  FF_MASK..(TK_CON
0c60: 46 49 47 5f 55 53 45 52 5f 42 49 54 20 3c 3c 20  FIG_USER_BIT << 
0c70: 35 29 0a 23 64 65 66 69 6e 65 20 41 4c 4c 5f 4d  5).#define ALL_M
0c80: 41 53 4b 09 09 28 43 4f 4d 4d 41 4e 44 5f 4d 41  ASK..(COMMAND_MA
0c90: 53 4b 20 7c 20 53 45 50 41 52 41 54 4f 52 5f 4d  SK | SEPARATOR_M
0ca0: 41 53 4b 20 5c 0a 09 7c 20 43 48 45 43 4b 5f 42  ASK \..| CHECK_B
0cb0: 55 54 54 4f 4e 5f 4d 41 53 4b 20 7c 20 52 41 44  UTTON_MASK | RAD
0cc0: 49 4f 5f 42 55 54 54 4f 4e 5f 4d 41 53 4b 20 7c  IO_BUTTON_MASK |
0cd0: 20 43 41 53 43 41 44 45 5f 4d 41 53 4b 20 7c 20   CASCADE_MASK | 
0ce0: 54 45 41 52 4f 46 46 5f 4d 41 53 4b 29 0a 0a 2f  TEAROFF_MASK)../
0cf0: 2a 0a 20 2a 20 43 6f 6e 66 69 67 75 72 61 74 69  *. * Configurati
0d00: 6f 6e 20 73 70 65 63 73 20 66 6f 72 20 69 6e 64  on specs for ind
0d10: 69 76 69 64 75 61 6c 20 6d 65 6e 75 20 65 6e 74  ividual menu ent
0d20: 72 69 65 73 3a 0a 20 2a 2f 0a 0a 73 74 61 74 69  ries:. */..stati
0d30: 63 20 54 6b 5f 43 6f 6e 66 69 67 53 70 65 63 20  c Tk_ConfigSpec 
0d40: 65 6e 74 72 79 43 6f 6e 66 69 67 53 70 65 63 73  entryConfigSpecs
0d50: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 54 4b 5f 43  [] = {.    {TK_C
0d60: 4f 4e 46 49 47 5f 53 54 52 49 4e 47 2c 20 22 2d  ONFIG_STRING, "-
0d70: 61 63 63 65 6c 65 72 61 74 6f 72 22 2c 20 28 63  accelerator", (c
0d80: 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 20 28 63 68  har *) NULL, (ch
0d90: 61 72 20 2a 29 20 4e 55 4c 4c 2c 0a 09 44 45 46  ar *) NULL,..DEF
0da0: 5f 4d 45 4e 55 5f 45 4e 54 52 59 5f 41 43 43 45  _MENU_ENTRY_ACCE
0db0: 4c 45 52 41 54 4f 52 2c 20 54 6b 5f 4f 66 66 73  LERATOR, Tk_Offs
0dc0: 65 74 28 4d 65 6e 75 45 6e 74 72 79 2c 20 61 63  et(MenuEntry, ac
0dd0: 63 65 6c 29 2c 0a 09 43 4f 4d 4d 41 4e 44 5f 4d  cel),..COMMAND_M
0de0: 41 53 4b 7c 43 48 45 43 4b 5f 42 55 54 54 4f 4e  ASK|CHECK_BUTTON
0df0: 5f 4d 41 53 4b 7c 52 41 44 49 4f 5f 42 55 54 54  _MASK|RADIO_BUTT
0e00: 4f 4e 5f 4d 41 53 4b 7c 43 41 53 43 41 44 45 5f  ON_MASK|CASCADE_
0e10: 4d 41 53 4b 0a 09 7c 54 4b 5f 43 4f 4e 46 49 47  MASK..|TK_CONFIG
0e20: 5f 4e 55 4c 4c 5f 4f 4b 7d 2c 0a 20 20 20 20 7b  _NULL_OK},.    {
0e30: 54 4b 5f 43 4f 4e 46 49 47 5f 53 54 52 49 4e 47  TK_CONFIG_STRING
0e40: 2c 20 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 28 63  , "-command", (c
0e50: 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 20 28 63 68  har *) NULL, (ch
0e60: 61 72 20 2a 29 20 4e 55 4c 4c 2c 0a 09 44 45 46  ar *) NULL,..DEF
0e70: 5f 4d 45 4e 55 5f 45 4e 54 52 59 5f 43 4f 4d 4d  _MENU_ENTRY_COMM
0e80: 41 4e 44 2c 20 54 6b 5f 4f 66 66 73 65 74 28 4d  AND, Tk_Offset(M
0e90: 65 6e 75 45 6e 74 72 79 2c 20 63 6f 6d 6d 61 6e  enuEntry, comman
0ea0: 64 29 2c 0a 09 43 4f 4d 4d 41 4e 44 5f 4d 41 53  d),..COMMAND_MAS
0eb0: 4b 7c 43 48 45 43 4b 5f 42 55 54 54 4f 4e 5f 4d  K|CHECK_BUTTON_M
0ec0: 41 53 4b 7c 52 41 44 49 4f 5f 42 55 54 54 4f 4e  ASK|RADIO_BUTTON
0ed0: 5f 4d 41 53 4b 7c 43 41 53 43 41 44 45 5f 4d 41  _MASK|CASCADE_MA
0ee0: 53 4b 0a 09 7c 54 4b 5f 43 4f 4e 46 49 47 5f 4e  SK..|TK_CONFIG_N
0ef0: 55 4c 4c 5f 4f 4b 7d 2c 0a 20 20 20 20 7b 54 4b  ULL_OK},.    {TK
0f00: 5f 43 4f 4e 46 49 47 5f 42 4f 4f 4c 45 41 4e 2c  _CONFIG_BOOLEAN,
0f10: 20 22 2d 69 6e 64 69 63 61 74 6f 72 6f 6e 22 2c   "-indicatoron",
0f20: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 20   (char *) NULL, 
0f30: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 0a 09  (char *) NULL,..
0f40: 44 45 46 5f 4d 45 4e 55 5f 45 4e 54 52 59 5f 49  DEF_MENU_ENTRY_I
0f50: 4e 44 49 43 41 54 4f 52 2c 20 54 6b 5f 4f 66 66  NDICATOR, Tk_Off
0f60: 73 65 74 28 4d 65 6e 75 45 6e 74 72 79 2c 20 69  set(MenuEntry, i
0f70: 6e 64 69 63 61 74 6f 72 4f 6e 29 2c 0a 09 43 48  ndicatorOn),..CH
0f80: 45 43 4b 5f 42 55 54 54 4f 4e 5f 4d 41 53 4b 7c  ECK_BUTTON_MASK|
0f90: 52 41 44 49 4f 5f 42 55 54 54 4f 4e 5f 4d 41 53  RADIO_BUTTON_MAS
0fa0: 4b 7c 54 4b 5f 43 4f 4e 46 49 47 5f 44 4f 4e 54  K|TK_CONFIG_DONT
0fb0: 5f 53 45 54 5f 44 45 46 41 55 4c 54 7d 2c 0a 20  _SET_DEFAULT},. 
0fc0: 20 20 20 7b 54 4b 5f 43 4f 4e 46 49 47 5f 53 54     {TK_CONFIG_ST
0fd0: 52 49 4e 47 2c 20 22 2d 6c 61 62 65 6c 22 2c 20  RING, "-label", 
0fe0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 20 28  (char *) NULL, (
0ff0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 0a 09 44  char *) NULL,..D
1000: 45 46 5f 4d 45 4e 55 5f 45 4e 54 52 59 5f 4c 41  EF_MENU_ENTRY_LA
1010: 42 45 4c 2c 20 54 6b 5f 4f 66 66 73 65 74 28 4d  BEL, Tk_Offset(M
1020: 65 6e 75 45 6e 74 72 79 2c 20 6c 61 62 65 6c 29  enuEntry, label)
1030: 2c 0a 09 43 4f 4d 4d 41 4e 44 5f 4d 41 53 4b 7c  ,..COMMAND_MASK|
1040: 43 48 45 43 4b 5f 42 55 54 54 4f 4e 5f 4d 41 53  CHECK_BUTTON_MAS
1050: 4b 7c 52 41 44 49 4f 5f 42 55 54 54 4f 4e 5f 4d  K|RADIO_BUTTON_M
1060: 41 53 4b 7c 43 41 53 43 41 44 45 5f 4d 41 53 4b  ASK|CASCADE_MASK
1070: 7d 2c 0a 20 20 20 20 7b 54 4b 5f 43 4f 4e 46 49  },.    {TK_CONFI
1080: 47 5f 53 54 52 49 4e 47 2c 20 22 2d 6d 65 6e 75  G_STRING, "-menu
1090: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
10a0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c  , (char *) NULL,
10b0: 0a 09 44 45 46 5f 4d 45 4e 55 5f 45 4e 54 52 59  ..DEF_MENU_ENTRY
10c0: 5f 4d 45 4e 55 2c 20 54 6b 5f 4f 66 66 73 65 74  _MENU, Tk_Offset
10d0: 28 4d 65 6e 75 45 6e 74 72 79 2c 20 6e 61 6d 65  (MenuEntry, name
10e0: 29 2c 0a 09 43 41 53 43 41 44 45 5f 4d 41 53 4b  ),..CASCADE_MASK
10f0: 7c 54 4b 5f 43 4f 4e 46 49 47 5f 4e 55 4c 4c 5f  |TK_CONFIG_NULL_
1100: 4f 4b 7d 2c 0a 20 20 20 20 7b 54 4b 5f 43 4f 4e  OK},.    {TK_CON
1110: 46 49 47 5f 53 54 52 49 4e 47 2c 20 22 2d 6f 66  FIG_STRING, "-of
1120: 66 76 61 6c 75 65 22 2c 20 28 63 68 61 72 20 2a  fvalue", (char *
1130: 29 20 4e 55 4c 4c 2c 20 28 63 68 61 72 20 2a 29  ) NULL, (char *)
1140: 20 4e 55 4c 4c 2c 0a 09 44 45 46 5f 4d 45 4e 55   NULL,..DEF_MENU
1150: 5f 45 4e 54 52 59 5f 4f 46 46 5f 56 41 4c 55 45  _ENTRY_OFF_VALUE
1160: 2c 20 54 6b 5f 4f 66 66 73 65 74 28 4d 65 6e 75  , Tk_Offset(Menu
1170: 45 6e 74 72 79 2c 20 6f 66 66 56 61 6c 75 65 29  Entry, offValue)
1180: 2c 0a 09 43 48 45 43 4b 5f 42 55 54 54 4f 4e 5f  ,..CHECK_BUTTON_
1190: 4d 41 53 4b 7d 2c 0a 20 20 20 20 7b 54 4b 5f 43  MASK},.    {TK_C
11a0: 4f 4e 46 49 47 5f 53 54 52 49 4e 47 2c 20 22 2d  ONFIG_STRING, "-
11b0: 6f 6e 76 61 6c 75 65 22 2c 20 28 63 68 61 72 20  onvalue", (char 
11c0: 2a 29 20 4e 55 4c 4c 2c 20 28 63 68 61 72 20 2a  *) NULL, (char *
11d0: 29 20 4e 55 4c 4c 2c 0a 09 44 45 46 5f 4d 45 4e  ) NULL,..DEF_MEN
11e0: 55 5f 45 4e 54 52 59 5f 4f 4e 5f 56 41 4c 55 45  U_ENTRY_ON_VALUE
11f0: 2c 20 54 6b 5f 4f 66 66 73 65 74 28 4d 65 6e 75  , Tk_Offset(Menu
1200: 45 6e 74 72 79 2c 20 6f 6e 56 61 6c 75 65 29 2c  Entry, onValue),
1210: 0a 09 43 48 45 43 4b 5f 42 55 54 54 4f 4e 5f 4d  ..CHECK_BUTTON_M
1220: 41 53 4b 7d 2c 0a 20 20 20 20 7b 54 4b 5f 43 4f  ASK},.    {TK_CO
1230: 4e 46 49 47 5f 55 49 44 2c 20 22 2d 73 74 61 74  NFIG_UID, "-stat
1240: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  e", (char *) NUL
1250: 4c 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  L, (char *) NULL
1260: 2c 0a 09 44 45 46 5f 4d 45 4e 55 5f 45 4e 54 52  ,..DEF_MENU_ENTR
1270: 59 5f 53 54 41 54 45 2c 20 54 6b 5f 4f 66 66 73  Y_STATE, Tk_Offs
1280: 65 74 28 4d 65 6e 75 45 6e 74 72 79 2c 20 73 74  et(MenuEntry, st
1290: 61 74 65 29 2c 0a 09 43 4f 4d 4d 41 4e 44 5f 4d  ate),..COMMAND_M
12a0: 41 53 4b 7c 43 48 45 43 4b 5f 42 55 54 54 4f 4e  ASK|CHECK_BUTTON
12b0: 5f 4d 41 53 4b 7c 52 41 44 49 4f 5f 42 55 54 54  _MASK|RADIO_BUTT
12c0: 4f 4e 5f 4d 41 53 4b 7c 43 41 53 43 41 44 45 5f  ON_MASK|CASCADE_
12d0: 4d 41 53 4b 0a 09 7c 54 45 41 52 4f 46 46 5f 4d  MASK..|TEAROFF_M
12e0: 41 53 4b 7c 54 4b 5f 43 4f 4e 46 49 47 5f 44 4f  ASK|TK_CONFIG_DO
12f0: 4e 54 5f 53 45 54 5f 44 45 46 41 55 4c 54 7d 2c  NT_SET_DEFAULT},
1300: 0a 20 20 20 20 7b 54 4b 5f 43 4f 4e 46 49 47 5f  .    {TK_CONFIG_
1310: 53 54 52 49 4e 47 2c 20 22 2d 76 61 6c 75 65 22  STRING, "-value"
1320: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c  , (char *) NULL,
1330: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 0a   (char *) NULL,.
1340: 09 44 45 46 5f 4d 45 4e 55 5f 45 4e 54 52 59 5f  .DEF_MENU_ENTRY_
1350: 56 41 4c 55 45 2c 20 54 6b 5f 4f 66 66 73 65 74  VALUE, Tk_Offset
1360: 28 4d 65 6e 75 45 6e 74 72 79 2c 20 6f 6e 56 61  (MenuEntry, onVa
1370: 6c 75 65 29 2c 0a 09 52 41 44 49 4f 5f 42 55 54  lue),..RADIO_BUT
1380: 54 4f 4e 5f 4d 41 53 4b 7c 54 4b 5f 43 4f 4e 46  TON_MASK|TK_CONF
1390: 49 47 5f 4e 55 4c 4c 5f 4f 4b 7d 2c 0a 20 20 20  IG_NULL_OK},.   
13a0: 20 7b 54 4b 5f 43 4f 4e 46 49 47 5f 53 54 52 49   {TK_CONFIG_STRI
13b0: 4e 47 2c 20 22 2d 76 61 72 69 61 62 6c 65 22 2c  NG, "-variable",
13c0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 20   (char *) NULL, 
13d0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 0a 09  (char *) NULL,..
13e0: 44 45 46 5f 4d 45 4e 55 5f 45 4e 54 52 59 5f 43  DEF_MENU_ENTRY_C
13f0: 48 45 43 4b 5f 56 41 52 49 41 42 4c 45 2c 20 54  HECK_VARIABLE, T
1400: 6b 5f 4f 66 66 73 65 74 28 4d 65 6e 75 45 6e 74  k_Offset(MenuEnt
1410: 72 79 2c 20 6e 61 6d 65 29 2c 0a 09 43 48 45 43  ry, name),..CHEC
1420: 4b 5f 42 55 54 54 4f 4e 5f 4d 41 53 4b 7c 54 4b  K_BUTTON_MASK|TK
1430: 5f 43 4f 4e 46 49 47 5f 4e 55 4c 4c 5f 4f 4b 7d  _CONFIG_NULL_OK}
1440: 2c 0a 20 20 20 20 7b 54 4b 5f 43 4f 4e 46 49 47  ,.    {TK_CONFIG
1450: 5f 53 54 52 49 4e 47 2c 20 22 2d 76 61 72 69 61  _STRING, "-varia
1460: 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ble", (char *) N
1470: 55 4c 4c 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ULL, (char *) NU
1480: 4c 4c 2c 0a 09 44 45 46 5f 4d 45 4e 55 5f 45 4e  LL,..DEF_MENU_EN
1490: 54 52 59 5f 52 41 44 49 4f 5f 56 41 52 49 41 42  TRY_RADIO_VARIAB
14a0: 4c 45 2c 20 54 6b 5f 4f 66 66 73 65 74 28 4d 65  LE, Tk_Offset(Me
14b0: 6e 75 45 6e 74 72 79 2c 20 6e 61 6d 65 29 2c 0a  nuEntry, name),.
14c0: 09 52 41 44 49 4f 5f 42 55 54 54 4f 4e 5f 4d 41  .RADIO_BUTTON_MA
14d0: 53 4b 7d 2c 0a 20 20 20 20 7b 54 4b 5f 43 4f 4e  SK},.    {TK_CON
14e0: 46 49 47 5f 49 4e 54 2c 20 22 2d 75 6e 64 65 72  FIG_INT, "-under
14f0: 6c 69 6e 65 22 2c 20 28 63 68 61 72 20 2a 29 20  line", (char *) 
1500: 4e 55 4c 4c 2c 20 28 63 68 61 72 20 2a 29 20 4e  NULL, (char *) N
1510: 55 4c 4c 2c 0a 09 44 45 46 5f 4d 45 4e 55 5f 45  ULL,..DEF_MENU_E
1520: 4e 54 52 59 5f 55 4e 44 45 52 4c 49 4e 45 2c 20  NTRY_UNDERLINE, 
1530: 54 6b 5f 4f 66 66 73 65 74 28 4d 65 6e 75 45 6e  Tk_Offset(MenuEn
1540: 74 72 79 2c 20 75 6e 64 65 72 6c 69 6e 65 29 2c  try, underline),
1550: 0a 09 43 4f 4d 4d 41 4e 44 5f 4d 41 53 4b 7c 43  ..COMMAND_MASK|C
1560: 48 45 43 4b 5f 42 55 54 54 4f 4e 5f 4d 41 53 4b  HECK_BUTTON_MASK
1570: 7c 52 41 44 49 4f 5f 42 55 54 54 4f 4e 5f 4d 41  |RADIO_BUTTON_MA
1580: 53 4b 7c 43 41 53 43 41 44 45 5f 4d 41 53 4b 0a  SK|CASCADE_MASK.
1590: 09 7c 54 4b 5f 43 4f 4e 46 49 47 5f 44 4f 4e 54  .|TK_CONFIG_DONT
15a0: 5f 53 45 54 5f 44 45 46 41 55 4c 54 7d 2c 0a 20  _SET_DEFAULT},. 
15b0: 20 20 20 7b 54 4b 5f 43 4f 4e 46 49 47 5f 45 4e     {TK_CONFIG_EN
15c0: 44 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  D, (char *) NULL
15d0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c  , (char *) NULL,
15e0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 0a   (char *) NULL,.
15f0: 09 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 20  .(char *) NULL, 
1600: 30 2c 20 30 7d 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 20  0, 0}.};../*. * 
1610: 41 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  A data structure
1620: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1630: 67 20 74 79 70 65 20 69 73 20 6b 65 70 74 20 66  g type is kept f
1640: 6f 72 20 65 61 63 68 0a 20 2a 20 6d 65 6e 75 20  or each. * menu 
1650: 6d 61 6e 61 67 65 64 20 62 79 20 74 68 69 73 20  managed by this 
1660: 66 69 6c 65 3a 0a 20 2a 2f 0a 0a 74 79 70 65 64  file:. */..typed
1670: 65 66 20 73 74 72 75 63 74 20 4d 65 6e 75 20 7b  ef struct Menu {
1680: 0a 20 20 20 20 54 6b 5f 57 69 6e 64 6f 77 20 74  .    Tk_Window t
1690: 6b 77 69 6e 3b 09 09 2f 2a 20 57 69 6e 64 6f 77  kwin;../* Window
16a0: 20 74 68 61 74 20 65 6d 62 6f 64 69 65 73 20 74   that embodies t
16b0: 68 65 20 70 61 6e 65 2e 20 20 4e 55 4c 4c 0a 09  he pane.  NULL..
16c0: 09 09 09 20 2a 20 6d 65 61 6e 73 20 74 68 61 74  ... * means that
16d0: 20 74 68 65 20 77 69 6e 64 6f 77 20 68 61 73 20   the window has 
16e0: 62 65 65 6e 20 64 65 73 74 72 6f 79 65 64 0a 09  been destroyed..
16f0: 09 09 09 20 2a 20 62 75 74 20 74 68 65 20 64 61  ... * but the da
1700: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 68 61  ta structures ha
1710: 76 65 6e 27 74 20 79 65 74 20 62 65 65 6e 0a 09  ven't yet been..
1720: 09 09 09 20 2a 20 63 6c 65 61 6e 65 64 20 75 70  ... * cleaned up
1730: 2e 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  .*/.    Tcl_Inte
1740: 72 70 20 2a 69 6e 74 65 72 70 3b 09 09 2f 2a 20  rp *interp;../* 
1750: 49 6e 74 65 72 70 72 65 74 65 72 20 61 73 73 6f  Interpreter asso
1760: 63 69 61 74 65 64 20 77 69 74 68 20 6d 65 6e 75  ciated with menu
1770: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 6f 6d  . */.    Tcl_Com
1780: 6d 61 6e 64 20 77 69 64 67 65 74 43 6d 64 3b 09  mand widgetCmd;.
1790: 2f 2a 20 54 6f 6b 65 6e 20 66 6f 72 20 6d 65 6e  /* Token for men
17a0: 75 27 73 20 77 69 64 67 65 74 20 63 6f 6d 6d 61  u's widget comma
17b0: 6e 64 2e 20 2a 2f 0a 20 20 20 20 4d 65 6e 75 45  nd. */.    MenuE
17c0: 6e 74 72 79 20 2a 2a 65 6e 74 72 69 65 73 3b 09  ntry **entries;.
17d0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 70 6f 69 6e  /* Array of poin
17e0: 74 65 72 73 20 74 6f 20 61 6c 6c 20 74 68 65 20  ters to all the 
17f0: 65 6e 74 72 69 65 73 0a 09 09 09 09 20 2a 20 69  entries..... * i
1800: 6e 20 74 68 65 20 6d 65 6e 75 2e 20 20 4e 55 4c  n the menu.  NUL
1810: 4c 20 6d 65 61 6e 73 20 6e 6f 20 65 6e 74 72 69  L means no entri
1820: 65 73 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  es. */.    int n
1830: 75 6d 45 6e 74 72 69 65 73 3b 09 09 2f 2a 20 4e  umEntries;../* N
1840: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
1850: 73 20 69 6e 20 65 6e 74 72 69 65 73 2e 20 2a 2f  s in entries. */
1860: 0a 20 20 20 20 69 6e 74 20 61 63 74 69 76 65 3b  .    int active;
1870: 09 09 09 2f 2a 20 49 6e 64 65 78 20 6f 66 20 61  .../* Index of a
1880: 63 74 69 76 65 20 65 6e 74 72 79 2e 20 20 2d 31  ctive entry.  -1
1890: 20 6d 65 61 6e 73 0a 09 09 09 09 20 2a 20 6e 6f   means..... * no
18a0: 74 68 69 6e 67 20 61 63 74 69 76 65 2e 20 2a 2f  thing active. */
18b0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
18c0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64  Information used
18d0: 20 77 68 65 6e 20 64 69 73 70 6c 61 79 69 6e 67   when displaying
18e0: 20 77 69 64 67 65 74 3a 0a 20 20 20 20 20 2a 2f   widget:.     */
18f0: 0a 0a 20 20 20 20 69 6e 74 20 62 6f 72 64 65 72  ..    int border
1900: 57 69 64 74 68 3b 09 09 2f 2a 20 57 69 64 74 68  Width;../* Width
1910: 20 6f 66 20 62 6f 72 64 65 72 20 61 72 6f 75 6e   of border aroun
1920: 64 20 77 68 6f 6c 65 20 6d 65 6e 75 2e 20 2a 2f  d whole menu. */
1930: 0a 20 20 20 20 69 6e 74 20 6c 61 62 65 6c 57 69  .    int labelWi
1940: 64 74 68 3b 09 09 2f 2a 20 4e 75 6d 62 65 72 20  dth;../* Number 
1950: 6f 66 20 70 69 78 65 6c 73 20 74 6f 20 61 6c 6c  of pixels to all
1960: 6f 77 20 66 6f 72 20 64 69 73 70 6c 61 79 69 6e  ow for displayin
1970: 67 0a 09 09 09 09 20 2a 20 6c 61 62 65 6c 73 20  g..... * labels 
1980: 69 6e 20 6d 65 6e 75 20 65 6e 74 72 69 65 73 2e  in menu entries.
1990: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 63 6f 6c 75   */.    int colu
19a0: 6d 6e 57 69 64 74 68 3b 09 09 2f 2a 20 4e 75 6d  mnWidth;../* Num
19b0: 62 65 72 20 6f 66 20 70 69 78 65 6c 73 20 74 6f  ber of pixels to
19c0: 20 61 6c 6c 6f 77 20 66 6f 72 20 61 20 63 6f 6c   allow for a col
19d0: 75 6d 6e 0a 09 09 09 09 20 2a 20 6f 66 20 65 6e  umn..... * of en
19e0: 74 72 69 65 73 20 28 69 6e 63 6c 75 64 65 73 20  tries (includes 
19f0: 73 70 61 63 65 20 66 6f 72 20 6c 61 62 65 6c 2c  space for label,
1a00: 0a 09 09 09 09 20 2a 20 61 63 63 65 6c 65 72 61  ..... * accelera
1a10: 74 6f 72 2c 20 61 6e 64 20 69 6e 64 69 63 61 74  tor, and indicat
1a20: 6f 72 73 29 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  ors). */.    int
1a30: 20 6e 75 6d 52 6f 77 73 3b 09 09 2f 2a 20 4e 75   numRows;../* Nu
1a40: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
1a50: 70 65 72 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 0a  per column. */..
1a60: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 69      /*.     * Mi
1a70: 73 63 65 6c 6c 61 6e 65 6f 75 73 20 69 6e 66 6f  scellaneous info
1a80: 72 6d 61 74 69 6f 6e 3a 0a 20 20 20 20 20 2a 2f  rmation:.     */
1a90: 0a 0a 20 20 20 20 69 6e 74 20 74 65 61 72 4f 66  ..    int tearOf
1aa0: 66 3b 09 09 2f 2a 20 31 20 6d 65 61 6e 73 20 74  f;../* 1 means t
1ab0: 68 69 73 20 69 73 20 61 20 74 65 61 72 2d 6f 66  his is a tear-of
1ac0: 66 20 6d 65 6e 75 2c 20 73 6f 20 74 68 65 0a 09  f menu, so the..
1ad0: 09 09 09 20 2a 20 66 69 72 73 74 20 65 6e 74 72  ... * first entr
1ae0: 79 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61  y always shows a
1af0: 20 64 61 73 68 65 64 20 73 74 72 69 70 65 0a 09   dashed stripe..
1b00: 09 09 09 20 2a 20 66 6f 72 20 74 65 61 72 69 6e  ... * for tearin
1b10: 67 20 6f 66 66 2e 20 2a 2f 0a 20 20 20 20 63 68  g off. */.    ch
1b20: 61 72 20 2a 74 61 6b 65 46 6f 63 75 73 3b 09 09  ar *takeFocus;..
1b30: 2f 2a 20 56 61 6c 75 65 20 6f 66 20 2d 74 61 6b  /* Value of -tak
1b40: 65 66 6f 63 75 73 20 6f 70 74 69 6f 6e 3b 20 20  efocus option;  
1b50: 6e 6f 74 20 75 73 65 64 20 69 6e 0a 09 09 09 09  not used in.....
1b60: 20 2a 20 74 68 65 20 43 20 63 6f 64 65 2c 20 62   * the C code, b
1b70: 75 74 20 75 73 65 64 20 62 79 20 6b 65 79 62 6f  ut used by keybo
1b80: 61 72 64 20 74 72 61 76 65 72 73 61 6c 0a 09 09  ard traversal...
1b90: 09 09 20 2a 20 73 63 72 69 70 74 73 2e 20 20 4d  .. * scripts.  M
1ba0: 61 6c 6c 6f 63 27 65 64 2c 20 62 75 74 20 6d 61  alloc'ed, but ma
1bb0: 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  y be NULL. */.  
1bc0: 20 20 63 68 61 72 20 2a 70 6f 73 74 43 6f 6d 6d    char *postComm
1bd0: 61 6e 64 3b 09 09 2f 2a 20 43 6f 6d 6d 61 6e 64  and;../* Command
1be0: 20 74 6f 20 65 78 65 63 75 74 65 20 6a 75 73 74   to execute just
1bf0: 20 62 65 66 6f 72 65 20 70 6f 73 74 69 6e 67 0a   before posting.
1c00: 09 09 09 09 20 2a 20 74 68 69 73 20 6d 65 6e 75  .... * this menu
1c10: 2c 20 6f 72 20 4e 55 4c 4c 2e 20 20 4d 61 6c 6c  , or NULL.  Mall
1c20: 6f 63 2d 65 64 2e 20 2a 2f 0a 20 20 20 20 4d 65  oc-ed. */.    Me
1c30: 6e 75 45 6e 74 72 79 20 2a 70 6f 73 74 65 64 43  nuEntry *postedC
1c40: 61 73 63 61 64 65 3b 09 2f 2a 20 50 6f 69 6e 74  ascade;./* Point
1c50: 73 20 74 6f 20 6d 65 6e 75 20 65 6e 74 72 79 20  s to menu entry 
1c60: 66 6f 72 20 63 61 73 63 61 64 65 64 0a 09 09 09  for cascaded....
1c70: 09 20 2a 20 73 75 62 6d 65 6e 75 20 74 68 61 74  . * submenu that
1c80: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
1c90: 73 74 65 64 2c 20 6f 72 0a 09 09 09 09 20 2a 20  sted, or..... * 
1ca0: 4e 55 4c 4c 20 69 66 20 6e 6f 20 73 75 62 6d 65  NULL if no subme
1cb0: 6e 75 20 70 6f 73 74 65 64 2e 20 2a 2f 0a 20 20  nu posted. */.  
1cc0: 20 20 69 6e 74 20 66 6c 61 67 73 3b 09 09 09 2f    int flags;.../
1cd0: 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67 73 3b  * Various flags;
1ce0: 20 20 73 65 65 20 62 65 6c 6f 77 20 66 6f 72 0a    see below for.
1cf0: 09 09 09 09 20 2a 20 64 65 66 69 6e 69 74 69 6f  .... * definitio
1d00: 6e 73 2e 20 2a 2f 0a 7d 20 4d 65 6e 75 3b 0a 0a  ns. */.} Menu;..
1d10: 2f 2a 0a 20 2a 20 46 6c 61 67 20 62 69 74 73 20  /*. * Flag bits 
1d20: 66 6f 72 20 6d 65 6e 75 73 3a 0a 20 2a 0a 20 2a  for menus:. *. *
1d30: 20 52 45 44 52 41 57 5f 50 45 4e 44 49 4e 47 3a   REDRAW_PENDING:
1d40: 09 09 4e 6f 6e 2d 7a 65 72 6f 20 6d 65 61 6e 73  ..Non-zero means
1d50: 20 61 20 44 6f 57 68 65 6e 49 64 6c 65 20 68 61   a DoWhenIdle ha
1d60: 6e 64 6c 65 72 0a 20 2a 09 09 09 09 68 61 73 20  ndler. *....has 
1d70: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 71 75 65  already been que
1d80: 75 65 64 20 74 6f 20 72 65 64 72 61 77 0a 20 2a  ued to redraw. *
1d90: 09 09 09 09 74 68 69 73 20 77 69 6e 64 6f 77 2e  ....this window.
1da0: 0a 20 2a 20 52 45 53 49 5a 45 5f 50 45 4e 44 49  . * RESIZE_PENDI
1db0: 4e 47 3a 09 09 4e 6f 6e 2d 7a 65 72 6f 20 6d 65  NG:..Non-zero me
1dc0: 61 6e 73 20 61 20 63 61 6c 6c 20 74 6f 20 43 6f  ans a call to Co
1dd0: 6d 70 75 74 65 4d 65 6e 75 47 65 6f 6d 65 74 72  mputeMenuGeometr
1de0: 79 0a 20 2a 09 09 09 09 68 61 73 20 61 6c 72 65  y. *....has alre
1df0: 61 64 79 20 62 65 65 6e 20 73 63 68 65 64 75 6c  ady been schedul
1e00: 65 64 2e 0a 20 2a 20 42 4f 52 44 45 52 5f 4e 45  ed.. * BORDER_NE
1e10: 45 44 45 44 3a 09 09 4e 6f 6e 2d 7a 65 72 6f 20  EDED:..Non-zero 
1e20: 6d 65 61 6e 73 20 33 2d 44 20 62 6f 72 64 65 72  means 3-D border
1e30: 20 6d 75 73 74 20 62 65 20 72 65 64 72 61 77 6e   must be redrawn
1e40: 0a 20 2a 09 09 09 09 61 72 6f 75 6e 64 20 77 69  . *....around wi
1e50: 6e 64 6f 77 20 64 75 72 69 6e 67 20 72 65 64 69  ndow during redi
1e60: 73 70 6c 61 79 2e 20 20 4e 6f 72 6d 61 6c 6c 79  splay.  Normally
1e70: 0a 20 2a 09 09 09 09 6f 6e 6c 79 20 74 65 78 74  . *....only text
1e80: 20 70 6f 72 74 69 6f 6e 20 6e 65 65 64 73 20 74   portion needs t
1e90: 6f 20 62 65 20 72 65 64 72 61 77 6e 2e 0a 20 2a  o be redrawn.. *
1ea0: 20 47 4f 54 5f 46 4f 43 55 53 3a 09 09 09 4e 6f   GOT_FOCUS:...No
1eb0: 6e 2d 7a 65 72 6f 20 6d 65 61 6e 73 20 74 68 69  n-zero means thi
1ec0: 73 20 6d 65 6e 75 20 63 75 72 72 65 6e 74 6c 79  s menu currently
1ed0: 0a 20 2a 09 09 09 09 68 61 73 20 74 68 65 20 69  . *....has the i
1ee0: 6e 70 75 74 20 66 6f 63 75 73 2e 0a 20 2a 2f 0a  nput focus.. */.
1ef0: 0a 23 64 65 66 69 6e 65 20 52 45 44 52 41 57 5f  .#define REDRAW_
1f00: 50 45 4e 44 49 4e 47 09 09 31 0a 23 64 65 66 69  PENDING..1.#defi
1f10: 6e 65 20 52 45 53 49 5a 45 5f 50 45 4e 44 49 4e  ne RESIZE_PENDIN
1f20: 47 09 09 32 0a 23 64 65 66 69 6e 65 20 42 4f 52  G..2.#define BOR
1f30: 44 45 52 5f 4e 45 45 44 45 44 09 09 34 0a 23 64  DER_NEEDED..4.#d
1f40: 65 66 69 6e 65 20 47 4f 54 5f 46 4f 43 55 53 09  efine GOT_FOCUS.
1f50: 09 38 0a 0a 2f 2a 0a 20 2a 20 43 6f 6e 66 69 67  .8../*. * Config
1f60: 75 72 61 74 69 6f 6e 20 73 70 65 63 73 20 76 61  uration specs va
1f70: 6c 69 64 20 66 6f 72 20 74 68 65 20 6d 65 6e 75  lid for the menu
1f80: 20 61 73 20 61 20 77 68 6f 6c 65 3a 0a 20 2a 2f   as a whole:. */
1f90: 0a 0a 73 74 61 74 69 63 20 54 6b 5f 43 6f 6e 66  ..static Tk_Conf
1fa0: 69 67 53 70 65 63 20 63 6f 6e 66 69 67 53 70 65  igSpec configSpe
1fb0: 63 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 54 4b  cs[] = {.    {TK
1fc0: 5f 43 4f 4e 46 49 47 5f 53 59 4e 4f 4e 59 4d 2c  _CONFIG_SYNONYM,
1fd0: 20 22 2d 62 64 22 2c 20 22 62 6f 72 64 65 72 57   "-bd", "borderW
1fe0: 69 64 74 68 22 2c 20 28 63 68 61 72 20 2a 29 20  idth", (char *) 
1ff0: 4e 55 4c 4c 2c 0a 09 28 63 68 61 72 20 2a 29 20  NULL,..(char *) 
2000: 4e 55 4c 4c 2c 20 30 2c 20 30 7d 2c 0a 20 20 20  NULL, 0, 0},.   
2010: 20 7b 54 4b 5f 43 4f 4e 46 49 47 5f 50 49 58 45   {TK_CONFIG_PIXE
2020: 4c 53 2c 20 22 2d 62 6f 72 64 65 72 77 69 64 74  LS, "-borderwidt
2030: 68 22 2c 20 22 62 6f 72 64 65 72 57 69 64 74 68  h", "borderWidth
2040: 22 2c 20 22 42 6f 72 64 65 72 57 69 64 74 68 22  ", "BorderWidth"
2050: 2c 0a 09 44 45 46 5f 4d 45 4e 55 5f 42 4f 52 44  ,..DEF_MENU_BORD
2060: 45 52 5f 57 49 44 54 48 2c 20 54 6b 5f 4f 66 66  ER_WIDTH, Tk_Off
2070: 73 65 74 28 4d 65 6e 75 2c 20 62 6f 72 64 65 72  set(Menu, border
2080: 57 69 64 74 68 29 2c 20 30 7d 2c 0a 20 20 20 20  Width), 0},.    
2090: 7b 54 4b 5f 43 4f 4e 46 49 47 5f 53 54 52 49 4e  {TK_CONFIG_STRIN
20a0: 47 2c 20 22 2d 70 6f 73 74 63 6f 6d 6d 61 6e 64  G, "-postcommand
20b0: 22 2c 20 22 70 6f 73 74 43 6f 6d 6d 61 6e 64 22  ", "postCommand"
20c0: 2c 20 22 43 6f 6d 6d 61 6e 64 22 2c 0a 09 44 45  , "Command",..DE
20d0: 46 5f 4d 45 4e 55 5f 50 4f 53 54 5f 43 4f 4d 4d  F_MENU_POST_COMM
20e0: 41 4e 44 2c 20 54 6b 5f 4f 66 66 73 65 74 28 4d  AND, Tk_Offset(M
20f0: 65 6e 75 2c 20 70 6f 73 74 43 6f 6d 6d 61 6e 64  enu, postCommand
2100: 29 2c 20 54 4b 5f 43 4f 4e 46 49 47 5f 4e 55 4c  ), TK_CONFIG_NUL
2110: 4c 5f 4f 4b 7d 2c 0a 20 20 20 20 7b 54 4b 5f 43  L_OK},.    {TK_C
2120: 4f 4e 46 49 47 5f 53 54 52 49 4e 47 2c 20 22 2d  ONFIG_STRING, "-
2130: 74 61 6b 65 66 6f 63 75 73 22 2c 20 22 74 61 6b  takefocus", "tak
2140: 65 46 6f 63 75 73 22 2c 20 22 54 61 6b 65 46 6f  eFocus", "TakeFo
2150: 63 75 73 22 2c 0a 09 44 45 46 5f 4d 45 4e 55 5f  cus",..DEF_MENU_
2160: 54 41 4b 45 5f 46 4f 43 55 53 2c 20 54 6b 5f 4f  TAKE_FOCUS, Tk_O
2170: 66 66 73 65 74 28 4d 65 6e 75 2c 20 74 61 6b 65  ffset(Menu, take
2180: 46 6f 63 75 73 29 2c 20 54 4b 5f 43 4f 4e 46 49  Focus), TK_CONFI
2190: 47 5f 4e 55 4c 4c 5f 4f 4b 7d 2c 0a 20 20 20 20  G_NULL_OK},.    
21a0: 7b 54 4b 5f 43 4f 4e 46 49 47 5f 42 4f 4f 4c 45  {TK_CONFIG_BOOLE
21b0: 41 4e 2c 20 22 2d 74 65 61 72 6f 66 66 22 2c 20  AN, "-tearoff", 
21c0: 22 74 65 61 72 4f 66 66 22 2c 20 22 54 65 61 72  "tearOff", "Tear
21d0: 4f 66 66 22 2c 0a 09 44 45 46 5f 4d 45 4e 55 5f  Off",..DEF_MENU_
21e0: 54 45 41 52 4f 46 46 2c 20 54 6b 5f 4f 66 66 73  TEAROFF, Tk_Offs
21f0: 65 74 28 4d 65 6e 75 2c 20 74 65 61 72 4f 66 66  et(Menu, tearOff
2200: 29 2c 20 30 7d 2c 0a 20 20 20 20 7b 54 4b 5f 43  ), 0},.    {TK_C
2210: 4f 4e 46 49 47 5f 45 4e 44 2c 20 28 63 68 61 72  ONFIG_END, (char
2220: 20 2a 29 20 4e 55 4c 4c 2c 20 28 63 68 61 72 20   *) NULL, (char 
2230: 2a 29 20 4e 55 4c 4c 2c 20 28 63 68 61 72 20 2a  *) NULL, (char *
2240: 29 20 4e 55 4c 4c 2c 0a 09 28 63 68 61 72 20 2a  ) NULL,..(char *
2250: 29 20 4e 55 4c 4c 2c 20 30 2c 20 30 7d 0a 7d 3b  ) NULL, 0, 0}.};
2260: 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 20  ../*. * Forward 
2270: 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f 72  declarations for
2280: 20 70 72 6f 63 65 64 75 72 65 73 20 64 65 66 69   procedures defi
2290: 6e 65 64 20 6c 61 74 65 72 20 69 6e 20 74 68 69  ned later in thi
22a0: 73 20 66 69 6c 65 3a 0a 20 2a 2f 0a 0a 73 74 61  s file:. */..sta
22b0: 74 69 63 20 69 6e 74 09 09 41 63 74 69 76 61 74  tic int..Activat
22c0: 65 4d 65 6e 75 45 6e 74 72 79 20 5f 41 4e 53 49  eMenuEntry _ANSI
22d0: 5f 41 52 47 53 5f 28 28 4d 65 6e 75 20 2a 6d 65  _ARGS_((Menu *me
22e0: 6e 75 50 74 72 2c 0a 09 09 09 20 20 20 20 69 6e  nuPtr,....    in
22f0: 74 20 69 6e 64 65 78 29 29 3b 0a 73 74 61 74 69  t index));.stati
2300: 63 20 76 6f 69 64 09 09 43 6f 6d 70 75 74 65 4d  c void..ComputeM
2310: 65 6e 75 47 65 6f 6d 65 74 72 79 20 5f 41 4e 53  enuGeometry _ANS
2320: 49 5f 41 52 47 53 5f 28 28 0a 09 09 09 20 20 20  I_ARGS_((....   
2330: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
2340: 6e 74 44 61 74 61 29 29 3b 0a 73 74 61 74 69 63  ntData));.static
2350: 20 69 6e 74 09 09 43 6f 6e 66 69 67 75 72 65 4d   int..ConfigureM
2360: 65 6e 75 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28  enu _ANSI_ARGS_(
2370: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
2380: 65 72 70 2c 0a 09 09 09 20 20 20 20 4d 65 6e 75  erp,....    Menu
2390: 20 2a 6d 65 6e 75 50 74 72 2c 20 69 6e 74 20 61   *menuPtr, int a
23a0: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
23b0: 2c 0a 09 09 09 20 20 20 20 69 6e 74 20 66 6c 61  ,....    int fla
23c0: 67 73 29 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  gs));.static int
23d0: 09 09 43 6f 6e 66 69 67 75 72 65 4d 65 6e 75 45  ..ConfigureMenuE
23e0: 6e 74 72 79 20 5f 41 4e 53 49 5f 41 52 47 53 5f  ntry _ANSI_ARGS_
23f0: 28 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  ((Tcl_Interp *in
2400: 74 65 72 70 2c 0a 09 09 09 20 20 20 20 4d 65 6e  terp,....    Men
2410: 75 20 2a 6d 65 6e 75 50 74 72 2c 20 4d 65 6e 75  u *menuPtr, Menu
2420: 45 6e 74 72 79 20 2a 6d 65 50 74 72 2c 20 69 6e  Entry *mePtr, in
2430: 74 20 69 6e 64 65 78 2c 0a 09 09 09 20 20 20 20  t index,....    
2440: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
2450: 2a 61 72 67 76 2c 20 69 6e 74 20 66 6c 61 67 73  *argv, int flags
2460: 29 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 09  ));.static void.
2470: 09 44 65 73 74 72 6f 79 4d 65 6e 75 20 5f 41 4e  .DestroyMenu _AN
2480: 53 49 5f 41 52 47 53 5f 28 28 43 6c 69 65 6e 74  SI_ARGS_((Client
2490: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29  Data clientData)
24a0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 09 09  );.static void..
24b0: 44 65 73 74 72 6f 79 4d 65 6e 75 45 6e 74 72 79  DestroyMenuEntry
24c0: 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 43 6c   _ANSI_ARGS_((Cl
24d0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
24e0: 61 74 61 29 29 3b 0a 73 74 61 74 69 63 20 76 6f  ata));.static vo
24f0: 69 64 09 09 44 69 73 70 6c 61 79 4d 65 6e 75 20  id..DisplayMenu 
2500: 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 43 6c 69  _ANSI_ARGS_((Cli
2510: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
2520: 74 61 29 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  ta));.static voi
2530: 64 09 09 45 76 65 6e 74 75 61 6c 6c 79 52 65 64  d..EventuallyRed
2540: 72 61 77 4d 65 6e 75 20 5f 41 4e 53 49 5f 41 52  rawMenu _ANSI_AR
2550: 47 53 5f 28 28 4d 65 6e 75 20 2a 6d 65 6e 75 50  GS_((Menu *menuP
2560: 74 72 2c 0a 09 09 09 20 20 20 20 4d 65 6e 75 45  tr,....    MenuE
2570: 6e 74 72 79 20 2a 6d 65 50 74 72 29 29 3b 0a 73  ntry *mePtr));.s
2580: 74 61 74 69 63 20 69 6e 74 09 09 47 65 74 4d 65  tatic int..GetMe
2590: 6e 75 49 6e 64 65 78 20 5f 41 4e 53 49 5f 41 52  nuIndex _ANSI_AR
25a0: 47 53 5f 28 28 54 63 6c 5f 49 6e 74 65 72 70 20  GS_((Tcl_Interp 
25b0: 2a 69 6e 74 65 72 70 2c 0a 09 09 09 20 20 20 20  *interp,....    
25c0: 4d 65 6e 75 20 2a 6d 65 6e 75 50 74 72 2c 20 63  Menu *menuPtr, c
25d0: 68 61 72 20 2a 73 74 72 69 6e 67 2c 20 69 6e 74  har *string, int
25e0: 20 6c 61 73 74 4f 4b 2c 0a 09 09 09 20 20 20 20   lastOK,....    
25f0: 69 6e 74 20 2a 69 6e 64 65 78 50 74 72 29 29 3b  int *indexPtr));
2600: 0a 73 74 61 74 69 63 20 69 6e 74 09 09 4d 65 6e  .static int..Men
2610: 75 41 64 64 4f 72 49 6e 73 65 72 74 20 5f 41 4e  uAddOrInsert _AN
2620: 53 49 5f 41 52 47 53 5f 28 28 54 63 6c 5f 49 6e  SI_ARGS_((Tcl_In
2630: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 09 09  terp *interp,...
2640: 09 20 20 20 20 4d 65 6e 75 20 2a 6d 65 6e 75 50  .    Menu *menuP
2650: 74 72 2c 20 63 68 61 72 20 2a 69 6e 64 65 78 53  tr, char *indexS
2660: 74 72 69 6e 67 2c 20 69 6e 74 20 61 72 67 63 2c  tring, int argc,
2670: 0a 09 09 09 20 20 20 20 63 68 61 72 20 2a 2a 61  ....    char **a
2680: 72 67 76 29 29 3b 0a 73 74 61 74 69 63 20 76 6f  rgv));.static vo
2690: 69 64 09 09 4d 65 6e 75 43 6d 64 44 65 6c 65 74  id..MenuCmdDelet
26a0: 65 64 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47  edProc _ANSI_ARG
26b0: 53 5f 28 28 0a 09 09 09 20 20 20 20 43 6c 69 65  S_((....    Clie
26c0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
26d0: 61 29 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  a));.static void
26e0: 09 09 4d 65 6e 75 45 76 65 6e 74 50 72 6f 63 20  ..MenuEventProc 
26f0: 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 43 6c 69  _ANSI_ARGS_((Cli
2700: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
2710: 74 61 2c 0a 09 09 09 20 20 20 20 58 45 76 65 6e  ta,....    XEven
2720: 74 20 2a 65 76 65 6e 74 50 74 72 29 29 3b 0a 73  t *eventPtr));.s
2730: 74 61 74 69 63 20 4d 65 6e 75 45 6e 74 72 79 20  tatic MenuEntry 
2740: 2a 09 4d 65 6e 75 4e 65 77 45 6e 74 72 79 20 5f  *.MenuNewEntry _
2750: 41 4e 53 49 5f 41 52 47 53 5f 28 28 4d 65 6e 75  ANSI_ARGS_((Menu
2760: 20 2a 6d 65 6e 75 50 74 72 2c 20 69 6e 74 20 69   *menuPtr, int i
2770: 6e 64 65 78 2c 0a 09 09 09 20 20 20 20 69 6e 74  ndex,....    int
2780: 20 74 79 70 65 29 29 3b 0a 73 74 61 74 69 63 20   type));.static 
2790: 63 68 61 72 20 2a 09 09 4d 65 6e 75 56 61 72 50  char *..MenuVarP
27a0: 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28  roc _ANSI_ARGS_(
27b0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
27c0: 6e 74 44 61 74 61 2c 0a 09 09 09 20 20 20 20 54  ntData,....    T
27d0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
27e0: 70 2c 20 63 68 61 72 20 2a 6e 61 6d 65 31 2c 20  p, char *name1, 
27f0: 63 68 61 72 20 2a 6e 61 6d 65 32 2c 0a 09 09 09  char *name2,....
2800: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 29 29 3b      int flags));
2810: 0a 73 74 61 74 69 63 20 69 6e 74 09 09 4d 65 6e  .static int..Men
2820: 75 57 69 64 67 65 74 43 6d 64 20 5f 41 4e 53 49  uWidgetCmd _ANSI
2830: 5f 41 52 47 53 5f 28 28 43 6c 69 65 6e 74 44 61  _ARGS_((ClientDa
2840: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09  ta clientData,..
2850: 09 09 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ..    Tcl_Interp
2860: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 61 72   *interp, int ar
2870: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29  gc, char **argv)
2880: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 50  );.static int..P
2890: 6f 73 74 53 75 62 6d 65 6e 75 20 5f 41 4e 53 49  ostSubmenu _ANSI
28a0: 5f 41 52 47 53 5f 28 28 54 63 6c 5f 49 6e 74 65  _ARGS_((Tcl_Inte
28b0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 09 09 09 20  rp *interp,.... 
28c0: 20 20 20 4d 65 6e 75 20 2a 6d 65 6e 75 50 74 72     Menu *menuPtr
28d0: 2c 20 4d 65 6e 75 45 6e 74 72 79 20 2a 6d 65 50  , MenuEntry *meP
28e0: 74 72 29 29 3b 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  tr));.../*. *---
28f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
2930: 2a 20 54 6b 5f 4d 65 6e 75 43 6d 64 20 2d 2d 0a  * Tk_MenuCmd --.
2940: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
2950: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  dure is invoked 
2960: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22  to process the "
2970: 6d 65 6e 75 22 20 54 63 6c 0a 20 2a 09 63 6f 6d  menu" Tcl. *.com
2980: 6d 61 6e 64 2e 20 20 53 65 65 20 74 68 65 20 75  mand.  See the u
2990: 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  ser documentatio
29a0: 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e  n for details on
29b0: 0a 20 2a 09 77 68 61 74 20 69 74 20 64 6f 65 73  . *.what it does
29c0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
29d0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
29e0: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
29f0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
2a00: 2a 09 53 65 65 20 74 68 65 20 75 73 65 72 20 64  *.See the user d
2a10: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a  ocumentation.. *
2a20: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 6b 5f 4d 65  -. */..int.Tk_Me
2a70: 6e 75 43 6d 64 28 63 6c 69 65 6e 74 44 61 74 61  nuCmd(clientData
2a80: 2c 20 69 6e 74 65 72 70 2c 20 61 72 67 63 2c 20  , interp, argc, 
2a90: 61 72 67 76 29 0a 20 20 20 20 43 6c 69 65 6e 74  argv).    Client
2aa0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b  Data clientData;
2ab0: 09 2f 2a 20 4d 61 69 6e 20 77 69 6e 64 6f 77 20  ./* Main window 
2ac0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
2ad0: 09 09 09 09 20 2a 20 69 6e 74 65 72 70 72 65 74  .... * interpret
2ae0: 65 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  er. */.    Tcl_I
2af0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 09 09  nterp *interp;..
2b00: 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72  /* Current inter
2b10: 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69  preter. */.    i
2b20: 6e 74 20 61 72 67 63 3b 09 09 09 2f 2a 20 4e 75  nt argc;.../* Nu
2b30: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
2b40: 73 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  s. */.    char *
2b50: 2a 61 72 67 76 3b 09 09 2f 2a 20 41 72 67 75 6d  *argv;../* Argum
2b60: 65 6e 74 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a  ent strings. */.
2b70: 7b 0a 20 20 20 20 54 6b 5f 57 69 6e 64 6f 77 20  {.    Tk_Window 
2b80: 74 6b 77 69 6e 20 3d 20 28 54 6b 5f 57 69 6e 64  tkwin = (Tk_Wind
2b90: 6f 77 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  ow) clientData;.
2ba0: 20 20 20 20 54 6b 5f 57 69 6e 64 6f 77 20 6e 65      Tk_Window ne
2bb0: 77 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20  w;.    register 
2bc0: 4d 65 6e 75 20 2a 6d 65 6e 75 50 74 72 3b 0a 0a  Menu *menuPtr;..
2bd0: 20 20 20 20 69 66 20 28 61 72 67 63 20 3c 20 32      if (argc < 2
2be0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
2bf0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
2c00: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
2c10: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 09 09 61 72  uld be \"",...ar
2c20: 67 76 5b 30 5d 2c 20 22 20 70 61 74 68 4e 61 6d  gv[0], " pathNam
2c30: 65 20 3f 6f 70 74 69 6f 6e 73 3f 5c 22 22 2c 20  e ?options?\"", 
2c40: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
2c50: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
2c60: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 65  R;.    }..    ne
2c70: 77 20 3d 20 54 6b 5f 43 72 65 61 74 65 57 69 6e  w = Tk_CreateWin
2c80: 64 6f 77 46 72 6f 6d 50 61 74 68 28 69 6e 74 65  dowFromPath(inte
2c90: 72 70 2c 20 74 6b 77 69 6e 2c 20 61 72 67 76 5b  rp, tkwin, argv[
2ca0: 31 5d 2c 20 22 22 29 3b 0a 20 20 20 20 69 66 20  1], "");.    if 
2cb0: 28 6e 65 77 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (new == NULL) {.
2cc0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
2cd0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
2ce0: 0a 20 20 20 20 20 2a 20 49 6e 69 74 69 61 6c 69  .     * Initiali
2cf0: 7a 65 20 74 68 65 20 64 61 74 61 20 73 74 72 75  ze the data stru
2d00: 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 6d 65  cture for the me
2d10: 6e 75 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  nu..     */..   
2d20: 20 6d 65 6e 75 50 74 72 20 3d 20 28 4d 65 6e 75   menuPtr = (Menu
2d30: 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 73 69 7a 65   *) ckalloc(size
2d40: 6f 66 28 4d 65 6e 75 29 29 3b 0a 20 20 20 20 6d  of(Menu));.    m
2d50: 65 6e 75 50 74 72 2d 3e 74 6b 77 69 6e 20 3d 20  enuPtr->tkwin = 
2d60: 6e 65 77 3b 0a 20 20 20 20 6d 65 6e 75 50 74 72  new;.    menuPtr
2d70: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
2d80: 70 3b 0a 20 20 20 20 6d 65 6e 75 50 74 72 2d 3e  p;.    menuPtr->
2d90: 77 69 64 67 65 74 43 6d 64 20 3d 20 54 63 6c 5f  widgetCmd = Tcl_
2da0: 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  CreateCommand(in
2db0: 74 65 72 70 2c 0a 09 20 20 20 20 54 6b 5f 50 61  terp,..    Tk_Pa
2dc0: 74 68 4e 61 6d 65 28 6d 65 6e 75 50 74 72 2d 3e  thName(menuPtr->
2dd0: 74 6b 77 69 6e 29 2c 20 4d 65 6e 75 57 69 64 67  tkwin), MenuWidg
2de0: 65 74 43 6d 64 2c 0a 09 20 20 20 20 28 43 6c 69  etCmd,..    (Cli
2df0: 65 6e 74 44 61 74 61 29 20 6d 65 6e 75 50 74 72  entData) menuPtr
2e00: 2c 20 4d 65 6e 75 43 6d 64 44 65 6c 65 74 65 64  , MenuCmdDeleted
2e10: 50 72 6f 63 29 3b 0a 20 20 20 20 6d 65 6e 75 50  Proc);.    menuP
2e20: 74 72 2d 3e 65 6e 74 72 69 65 73 20 3d 20 4e 55  tr->entries = NU
2e30: 4c 4c 3b 0a 20 20 20 20 6d 65 6e 75 50 74 72 2d  LL;.    menuPtr-
2e40: 3e 6e 75 6d 45 6e 74 72 69 65 73 20 3d 20 30 3b  >numEntries = 0;
2e50: 0a 20 20 20 20 6d 65 6e 75 50 74 72 2d 3e 61 63  .    menuPtr->ac
2e60: 74 69 76 65 20 3d 20 2d 31 3b 0a 20 20 20 20 6d  tive = -1;.    m
2e70: 65 6e 75 50 74 72 2d 3e 62 6f 72 64 65 72 57 69  enuPtr->borderWi
2e80: 64 74 68 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6e  dth = 0;.    men
2e90: 75 50 74 72 2d 3e 6c 61 62 65 6c 57 69 64 74 68  uPtr->labelWidth
2ea0: 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6e 75 50 74   = 0;.    menuPt
2eb0: 72 2d 3e 63 6f 6c 75 6d 6e 57 69 64 74 68 20 3d  r->columnWidth =
2ec0: 20 30 3b 0a 20 20 20 20 6d 65 6e 75 50 74 72 2d   0;.    menuPtr-
2ed0: 3e 6e 75 6d 52 6f 77 73 20 3d 20 30 3b 0a 20 20  >numRows = 0;.  
2ee0: 20 20 6d 65 6e 75 50 74 72 2d 3e 74 65 61 72 4f    menuPtr->tearO
2ef0: 66 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6e 75  ff = 1;.    menu
2f00: 50 74 72 2d 3e 74 61 6b 65 46 6f 63 75 73 20 3d  Ptr->takeFocus =
2f10: 20 4e 55 4c 4c 3b 0a 20 20 20 20 6d 65 6e 75 50   NULL;.    menuP
2f20: 74 72 2d 3e 70 6f 73 74 43 6f 6d 6d 61 6e 64 20  tr->postCommand 
2f30: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 6d 65 6e 75  = NULL;.    menu
2f40: 50 74 72 2d 3e 70 6f 73 74 65 64 43 61 73 63 61  Ptr->postedCasca
2f50: 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 6d  de = NULL;.    m
2f60: 65 6e 75 50 74 72 2d 3e 66 6c 61 67 73 20 3d 20  enuPtr->flags = 
2f70: 30 3b 0a 0a 20 20 20 20 54 6b 5f 53 65 74 43 6c  0;..    Tk_SetCl
2f80: 61 73 73 28 6e 65 77 2c 20 22 4d 65 6e 75 22 29  ass(new, "Menu")
2f90: 3b 0a 20 20 20 20 54 6b 5f 43 72 65 61 74 65 45  ;.    Tk_CreateE
2fa0: 76 65 6e 74 48 61 6e 64 6c 65 72 28 6d 65 6e 75  ventHandler(menu
2fb0: 50 74 72 2d 3e 74 6b 77 69 6e 2c 0a 20 20 20 20  Ptr->tkwin,.    
2fc0: 09 20 20 20 20 43 54 4b 5f 45 58 50 4f 53 45 5f  .    CTK_EXPOSE_
2fd0: 45 56 45 4e 54 5f 4d 41 53 4b 7c 43 54 4b 5f 44  EVENT_MASK|CTK_D
2fe0: 45 53 54 52 4f 59 5f 45 56 45 4e 54 5f 4d 41 53  ESTROY_EVENT_MAS
2ff0: 4b 7c 43 54 4b 5f 46 4f 43 55 53 5f 45 56 45 4e  K|CTK_FOCUS_EVEN
3000: 54 5f 4d 41 53 4b 2c 0a 09 20 20 20 20 4d 65 6e  T_MASK,..    Men
3010: 75 45 76 65 6e 74 50 72 6f 63 2c 20 28 43 6c 69  uEventProc, (Cli
3020: 65 6e 74 44 61 74 61 29 20 6d 65 6e 75 50 74 72  entData) menuPtr
3030: 29 3b 0a 20 20 20 20 69 66 20 28 43 6f 6e 66 69  );.    if (Confi
3040: 67 75 72 65 4d 65 6e 75 28 69 6e 74 65 72 70 2c  gureMenu(interp,
3050: 20 6d 65 6e 75 50 74 72 2c 20 61 72 67 63 2d 32   menuPtr, argc-2
3060: 2c 20 61 72 67 76 2b 32 2c 20 30 29 20 21 3d 20  , argv+2, 0) != 
3070: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 67 6f 74 6f 20  TCL_OK) {..goto 
3080: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  error;.    }..  
3090: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
30a0: 69 6e 74 65 72 70 2c 54 6b 5f 50 61 74 68 4e 61  interp,Tk_PathNa
30b0: 6d 65 28 6d 65 6e 75 50 74 72 2d 3e 74 6b 77 69  me(menuPtr->tkwi
30c0: 6e 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  n), TCL_VOLATILE
30d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
30e0: 4c 5f 4f 4b 3b 0a 0a 20 20 20 20 65 72 72 6f 72  L_OK;..    error
30f0: 3a 0a 20 20 20 20 54 6b 5f 44 65 73 74 72 6f 79  :.    Tk_Destroy
3100: 57 69 6e 64 6f 77 28 6d 65 6e 75 50 74 72 2d 3e  Window(menuPtr->
3110: 74 6b 77 69 6e 29 3b 0a 20 20 20 20 72 65 74 75  tkwin);.    retu
3120: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a  rn TCL_ERROR;.}.
3130: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3170: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 6e 75  -----. *. * Menu
3180: 57 69 64 67 65 74 43 6d 64 20 2d 2d 0a 20 2a 0a  WidgetCmd --. *.
3190: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
31a0: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  e is invoked to 
31b0: 70 72 6f 63 65 73 73 20 74 68 65 20 54 63 6c 20  process the Tcl 
31c0: 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 68 61 74 20  command. *.that 
31d0: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
31e0: 20 77 69 64 67 65 74 20 6d 61 6e 61 67 65 64 20   widget managed 
31f0: 62 79 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a  by this module..
3200: 20 2a 09 53 65 65 20 74 68 65 20 75 73 65 72 20   *.See the user 
3210: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f  documentation fo
3220: 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61  r details on wha
3230: 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a  t it does.. *. *
3240: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
3250: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
3260: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
3270: 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 65 20 74  ffects:. *.See t
3280: 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74  he user document
3290: 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  ation.. *. *----
32a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
32e0: 73 74 61 74 69 63 20 69 6e 74 0a 4d 65 6e 75 57  static int.MenuW
32f0: 69 64 67 65 74 43 6d 64 28 63 6c 69 65 6e 74 44  idgetCmd(clientD
3300: 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 61 72 67  ata, interp, arg
3310: 63 2c 20 61 72 67 76 29 0a 20 20 20 20 43 6c 69  c, argv).    Cli
3320: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
3330: 74 61 3b 09 2f 2a 20 49 6e 66 6f 72 6d 61 74 69  ta;./* Informati
3340: 6f 6e 20 61 62 6f 75 74 20 6d 65 6e 75 20 77 69  on about menu wi
3350: 64 67 65 74 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  dget. */.    Tcl
3360: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
3370: 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74  ../* Current int
3380: 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20  erpreter. */.   
3390: 20 69 6e 74 20 61 72 67 63 3b 09 09 09 2f 2a 20   int argc;.../* 
33a0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
33b0: 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72  nts. */.    char
33c0: 20 2a 2a 61 72 67 76 3b 09 09 2f 2a 20 41 72 67   **argv;../* Arg
33d0: 75 6d 65 6e 74 20 73 74 72 69 6e 67 73 2e 20 2a  ument strings. *
33e0: 2f 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72  /.{.    register
33f0: 20 4d 65 6e 75 20 2a 6d 65 6e 75 50 74 72 20 3d   Menu *menuPtr =
3400: 20 28 4d 65 6e 75 20 2a 29 20 63 6c 69 65 6e 74   (Menu *) client
3410: 44 61 74 61 3b 0a 20 20 20 20 72 65 67 69 73 74  Data;.    regist
3420: 65 72 20 4d 65 6e 75 45 6e 74 72 79 20 2a 6d 65  er MenuEntry *me
3430: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 72 65 73  Ptr;.    int res
3440: 75 6c 74 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20  ult = TCL_OK;.  
3450: 20 20 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b    size_t length;
3460: 0a 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20  .    int c;..   
3470: 20 69 66 20 28 61 72 67 63 20 3c 20 32 29 20 7b   if (argc < 2) {
3480: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
3490: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
34a0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
34b0: 20 62 65 20 5c 22 22 2c 0a 09 09 61 72 67 76 5b   be \"",...argv[
34c0: 30 5d 2c 20 22 20 6f 70 74 69 6f 6e 20 3f 61 72  0], " option ?ar
34d0: 67 20 61 72 67 20 2e 2e 2e 3f 5c 22 22 2c 20 28  g arg ...?\"", (
34e0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
34f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3500: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 6b 5f 50  ;.    }.    Tk_P
3510: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44  reserve((ClientD
3520: 61 74 61 29 20 6d 65 6e 75 50 74 72 29 3b 0a 20  ata) menuPtr);. 
3530: 20 20 20 63 20 3d 20 61 72 67 76 5b 31 5d 5b 30     c = argv[1][0
3540: 5d 3b 0a 20 20 20 20 6c 65 6e 67 74 68 20 3d 20  ];.    length = 
3550: 73 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d 29 3b  strlen(argv[1]);
3560: 0a 20 20 20 20 69 66 20 28 28 63 20 3d 3d 20 27  .    if ((c == '
3570: 61 27 29 20 26 26 20 28 73 74 72 6e 63 6d 70 28  a') && (strncmp(
3580: 61 72 67 76 5b 31 5d 2c 20 22 61 63 74 69 76 61  argv[1], "activa
3590: 74 65 22 2c 20 6c 65 6e 67 74 68 29 20 3d 3d 20  te", length) == 
35a0: 30 29 0a 09 20 20 20 20 26 26 20 28 6c 65 6e 67  0)..    && (leng
35b0: 74 68 20 3e 3d 20 32 29 29 20 7b 0a 09 69 6e 74  th >= 2)) {..int
35c0: 20 69 6e 64 65 78 3b 0a 0a 09 69 66 20 28 61 72   index;...if (ar
35d0: 67 63 20 21 3d 20 33 29 20 7b 0a 09 20 20 20 20  gc != 3) {..    
35e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
35f0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
3600: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
3610: 65 20 5c 22 22 2c 0a 09 09 20 20 20 20 61 72 67  e \"",...    arg
3620: 76 5b 30 5d 2c 20 22 20 61 63 74 69 76 61 74 65  v[0], " activate
3630: 20 69 6e 64 65 78 5c 22 22 2c 20 28 63 68 61 72   index\"", (char
3640: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
3650: 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 7d 0a 09  goto error;..}..
3660: 69 66 20 28 47 65 74 4d 65 6e 75 49 6e 64 65 78  if (GetMenuIndex
3670: 28 69 6e 74 65 72 70 2c 20 6d 65 6e 75 50 74 72  (interp, menuPtr
3680: 2c 20 61 72 67 76 5b 32 5d 2c 20 30 2c 20 26 69  , argv[2], 0, &i
3690: 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  ndex) != TCL_OK)
36a0: 20 7b 0a 09 20 20 20 20 67 6f 74 6f 20 65 72 72   {..    goto err
36b0: 6f 72 3b 0a 09 7d 0a 09 69 66 20 28 6d 65 6e 75  or;..}..if (menu
36c0: 50 74 72 2d 3e 61 63 74 69 76 65 20 3d 3d 20 69  Ptr->active == i
36d0: 6e 64 65 78 29 20 7b 0a 09 20 20 20 20 67 6f 74  ndex) {..    got
36e0: 6f 20 64 6f 6e 65 3b 0a 09 7d 0a 09 69 66 20 28  o done;..}..if (
36f0: 69 6e 64 65 78 20 3e 3d 20 30 29 20 7b 0a 09 20  index >= 0) {.. 
3700: 20 20 20 69 66 20 28 28 6d 65 6e 75 50 74 72 2d     if ((menuPtr-
3710: 3e 65 6e 74 72 69 65 73 5b 69 6e 64 65 78 5d 2d  >entries[index]-
3720: 3e 74 79 70 65 20 3d 3d 20 53 45 50 41 52 41 54  >type == SEPARAT
3730: 4f 52 5f 45 4e 54 52 59 29 0a 09 09 20 20 20 20  OR_ENTRY)...    
3740: 7c 7c 20 28 6d 65 6e 75 50 74 72 2d 3e 65 6e 74  || (menuPtr->ent
3750: 72 69 65 73 5b 69 6e 64 65 78 5d 2d 3e 73 74 61  ries[index]->sta
3760: 74 65 20 3d 3d 20 74 6b 44 69 73 61 62 6c 65 64  te == tkDisabled
3770: 55 69 64 29 29 20 7b 0a 09 09 69 6e 64 65 78 20  Uid)) {...index 
3780: 3d 20 2d 31 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  = -1;..    }..}.
3790: 09 72 65 73 75 6c 74 20 3d 20 41 63 74 69 76 61  .result = Activa
37a0: 74 65 4d 65 6e 75 45 6e 74 72 79 28 6d 65 6e 75  teMenuEntry(menu
37b0: 50 74 72 2c 20 69 6e 64 65 78 29 3b 0a 20 20 20  Ptr, index);.   
37c0: 20 7d 20 65 6c 73 65 20 69 66 20 28 28 63 20 3d   } else if ((c =
37d0: 3d 20 27 61 27 29 20 26 26 20 28 73 74 72 6e 63  = 'a') && (strnc
37e0: 6d 70 28 61 72 67 76 5b 31 5d 2c 20 22 61 64 64  mp(argv[1], "add
37f0: 22 2c 20 6c 65 6e 67 74 68 29 20 3d 3d 20 30 29  ", length) == 0)
3800: 0a 09 20 20 20 20 26 26 20 28 6c 65 6e 67 74 68  ..    && (length
3810: 20 3e 3d 20 32 29 29 20 7b 0a 09 69 66 20 28 61   >= 2)) {..if (a
3820: 72 67 63 20 3c 20 33 29 20 7b 0a 09 20 20 20 20  rgc < 3) {..    
3830: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
3840: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
3850: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
3860: 65 20 5c 22 22 2c 0a 09 09 20 20 20 20 61 72 67  e \"",...    arg
3870: 76 5b 30 5d 2c 20 22 20 61 64 64 20 74 79 70 65  v[0], " add type
3880: 20 3f 6f 70 74 69 6f 6e 73 3f 5c 22 22 2c 20 28   ?options?\"", (
3890: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
38a0: 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a      goto error;.
38b0: 09 7d 0a 09 69 66 20 28 4d 65 6e 75 41 64 64 4f  .}..if (MenuAddO
38c0: 72 49 6e 73 65 72 74 28 69 6e 74 65 72 70 2c 20  rInsert(interp, 
38d0: 6d 65 6e 75 50 74 72 2c 20 28 63 68 61 72 20 2a  menuPtr, (char *
38e0: 29 20 4e 55 4c 4c 2c 0a 09 09 61 72 67 63 2d 32  ) NULL,...argc-2
38f0: 2c 20 61 72 67 76 2b 32 29 20 21 3d 20 54 43 4c  , argv+2) != TCL
3900: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 67 6f 74 6f  _OK) {..    goto
3910: 20 65 72 72 6f 72 3b 0a 09 7d 0a 20 20 20 20 7d   error;..}.    }
3920: 20 65 6c 73 65 20 69 66 20 28 28 63 20 3d 3d 20   else if ((c == 
3930: 27 63 27 29 20 26 26 20 28 73 74 72 6e 63 6d 70  'c') && (strncmp
3940: 28 61 72 67 76 5b 31 5d 2c 20 22 63 67 65 74 22  (argv[1], "cget"
3950: 2c 20 6c 65 6e 67 74 68 29 20 3d 3d 20 30 29 0a  , length) == 0).
3960: 09 20 20 20 20 26 26 20 28 6c 65 6e 67 74 68 20  .    && (length 
3970: 3e 3d 20 32 29 29 20 7b 0a 09 69 66 20 28 61 72  >= 2)) {..if (ar
3980: 67 63 20 21 3d 20 33 29 20 7b 0a 09 20 20 20 20  gc != 3) {..    
3990: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
39a0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
39b0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
39c0: 65 20 5c 22 22 2c 0a 09 09 20 20 20 20 61 72 67  e \"",...    arg
39d0: 76 5b 30 5d 2c 20 22 20 63 67 65 74 20 6f 70 74  v[0], " cget opt
39e0: 69 6f 6e 5c 22 22 2c 0a 09 09 20 20 20 20 28 63  ion\"",...    (c
39f0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
3a00: 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09     goto error;..
3a10: 7d 0a 09 72 65 73 75 6c 74 20 3d 20 54 6b 5f 43  }..result = Tk_C
3a20: 6f 6e 66 69 67 75 72 65 56 61 6c 75 65 28 69 6e  onfigureValue(in
3a30: 74 65 72 70 2c 20 6d 65 6e 75 50 74 72 2d 3e 74  terp, menuPtr->t
3a40: 6b 77 69 6e 2c 20 63 6f 6e 66 69 67 53 70 65 63  kwin, configSpec
3a50: 73 2c 0a 09 09 28 63 68 61 72 20 2a 29 20 6d 65  s,...(char *) me
3a60: 6e 75 50 74 72 2c 20 61 72 67 76 5b 32 5d 2c 20  nuPtr, argv[2], 
3a70: 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  0);.    } else i
3a80: 66 20 28 28 63 20 3d 3d 20 27 63 27 29 20 26 26  f ((c == 'c') &&
3a90: 20 28 73 74 72 6e 63 6d 70 28 61 72 67 76 5b 31   (strncmp(argv[1
3aa0: 5d 2c 20 22 63 6f 6e 66 69 67 75 72 65 22 2c 20  ], "configure", 
3ab0: 6c 65 6e 67 74 68 29 20 3d 3d 20 30 29 0a 09 20  length) == 0).. 
3ac0: 20 20 20 26 26 20 28 6c 65 6e 67 74 68 20 3e 3d     && (length >=
3ad0: 20 32 29 29 20 7b 0a 09 69 66 20 28 61 72 67 63   2)) {..if (argc
3ae0: 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 72 65   == 2) {..    re
3af0: 73 75 6c 74 20 3d 20 54 6b 5f 43 6f 6e 66 69 67  sult = Tk_Config
3b00: 75 72 65 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  ureInfo(interp, 
3b10: 6d 65 6e 75 50 74 72 2d 3e 74 6b 77 69 6e 2c 20  menuPtr->tkwin, 
3b20: 63 6f 6e 66 69 67 53 70 65 63 73 2c 0a 09 09 20  configSpecs,... 
3b30: 20 20 20 28 63 68 61 72 20 2a 29 20 6d 65 6e 75     (char *) menu
3b40: 50 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  Ptr, (char *) NU
3b50: 4c 4c 2c 20 30 29 3b 0a 09 7d 20 65 6c 73 65 20  LL, 0);..} else 
3b60: 69 66 20 28 61 72 67 63 20 3d 3d 20 33 29 20 7b  if (argc == 3) {
3b70: 0a 09 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54  ..    result = T
3b80: 6b 5f 43 6f 6e 66 69 67 75 72 65 49 6e 66 6f 28  k_ConfigureInfo(
3b90: 69 6e 74 65 72 70 2c 20 6d 65 6e 75 50 74 72 2d  interp, menuPtr-
3ba0: 3e 74 6b 77 69 6e 2c 20 63 6f 6e 66 69 67 53 70  >tkwin, configSp
3bb0: 65 63 73 2c 0a 09 09 20 20 20 20 28 63 68 61 72  ecs,...    (char
3bc0: 20 2a 29 20 6d 65 6e 75 50 74 72 2c 20 61 72 67   *) menuPtr, arg
3bd0: 76 5b 32 5d 2c 20 30 29 3b 0a 09 7d 20 65 6c 73  v[2], 0);..} els
3be0: 65 20 7b 0a 09 20 20 20 20 72 65 73 75 6c 74 20  e {..    result 
3bf0: 3d 20 43 6f 6e 66 69 67 75 72 65 4d 65 6e 75 28  = ConfigureMenu(
3c00: 69 6e 74 65 72 70 2c 20 6d 65 6e 75 50 74 72 2c  interp, menuPtr,
3c10: 20 61 72 67 63 2d 32 2c 20 61 72 67 76 2b 32 2c   argc-2, argv+2,
3c20: 0a 09 09 20 20 20 20 54 4b 5f 43 4f 4e 46 49 47  ...    TK_CONFIG
3c30: 5f 41 52 47 56 5f 4f 4e 4c 59 29 3b 0a 09 7d 0a  _ARGV_ONLY);..}.
3c40: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28      } else if ((
3c50: 63 20 3d 3d 20 27 64 27 29 20 26 26 20 28 73 74  c == 'd') && (st
3c60: 72 6e 63 6d 70 28 61 72 67 76 5b 31 5d 2c 20 22  rncmp(argv[1], "
3c70: 64 65 6c 65 74 65 22 2c 20 6c 65 6e 67 74 68 29  delete", length)
3c80: 20 3d 3d 20 30 29 29 20 7b 0a 09 69 6e 74 20 66   == 0)) {..int f
3c90: 69 72 73 74 2c 20 6c 61 73 74 2c 20 69 2c 20 6e  irst, last, i, n
3ca0: 75 6d 44 65 6c 65 74 65 64 3b 0a 0a 09 69 66 20  umDeleted;...if 
3cb0: 28 28 61 72 67 63 20 21 3d 20 33 29 20 26 26 20  ((argc != 3) && 
3cc0: 28 61 72 67 63 20 21 3d 20 34 29 29 20 7b 0a 09  (argc != 4)) {..
3cd0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
3ce0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
3cf0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
3d00: 6c 64 20 62 65 20 5c 22 22 2c 0a 09 09 20 20 20  ld be \"",...   
3d10: 20 61 72 67 76 5b 30 5d 2c 20 22 20 64 65 6c 65   argv[0], " dele
3d20: 74 65 20 66 69 72 73 74 20 3f 6c 61 73 74 3f 5c  te first ?last?\
3d30: 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  "", (char *) NUL
3d40: 4c 29 3b 0a 09 20 20 20 20 67 6f 74 6f 20 65 72  L);..    goto er
3d50: 72 6f 72 3b 0a 09 7d 0a 09 69 66 20 28 47 65 74  ror;..}..if (Get
3d60: 4d 65 6e 75 49 6e 64 65 78 28 69 6e 74 65 72 70  MenuIndex(interp
3d70: 2c 20 6d 65 6e 75 50 74 72 2c 20 61 72 67 76 5b  , menuPtr, argv[
3d80: 32 5d 2c 20 30 2c 20 26 66 69 72 73 74 29 20 21  2], 0, &first) !
3d90: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20  = TCL_OK) {..   
3da0: 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 7d 0a   goto error;..}.
3db0: 09 69 66 20 28 61 72 67 63 20 3d 3d 20 33 29 20  .if (argc == 3) 
3dc0: 7b 0a 09 20 20 20 20 6c 61 73 74 20 3d 20 66 69  {..    last = fi
3dd0: 72 73 74 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  rst;..} else {..
3de0: 20 20 20 20 69 66 20 28 47 65 74 4d 65 6e 75 49      if (GetMenuI
3df0: 6e 64 65 78 28 69 6e 74 65 72 70 2c 20 6d 65 6e  ndex(interp, men
3e00: 75 50 74 72 2c 20 61 72 67 76 5b 33 5d 2c 20 30  uPtr, argv[3], 0
3e10: 2c 20 26 6c 61 73 74 29 20 21 3d 20 54 43 4c 5f  , &last) != TCL_
3e20: 4f 4b 29 20 7b 0a 09 20 20 20 20 20 20 20 20 67  OK) {..        g
3e30: 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 20 20 20 20  oto error;..    
3e40: 7d 0a 09 7d 0a 09 69 66 20 28 6d 65 6e 75 50 74  }..}..if (menuPt
3e50: 72 2d 3e 74 65 61 72 4f 66 66 20 26 26 20 28 66  r->tearOff && (f
3e60: 69 72 73 74 20 3d 3d 20 30 29 29 20 7b 0a 09 20  irst == 0)) {.. 
3e70: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 53 6f     /*..     * So
3e80: 72 72 79 2c 20 63 61 6e 27 74 20 64 65 6c 65 74  rry, can't delet
3e90: 65 20 74 68 65 20 74 65 61 72 6f 66 66 20 65 6e  e the tearoff en
3ea0: 74 72 79 3b 20 20 6d 75 73 74 20 72 65 63 6f 6e  try;  must recon
3eb0: 66 69 67 75 72 65 0a 09 20 20 20 20 20 2a 20 74  figure..     * t
3ec0: 68 65 20 6d 65 6e 75 2e 0a 09 20 20 20 20 20 2a  he menu...     *
3ed0: 2f 0a 09 20 20 20 20 66 69 72 73 74 20 3d 20 31  /..    first = 1
3ee0: 3b 0a 09 7d 0a 09 69 66 20 28 28 66 69 72 73 74  ;..}..if ((first
3ef0: 20 3c 20 30 29 20 7c 7c 20 28 6c 61 73 74 20 3c   < 0) || (last <
3f00: 20 66 69 72 73 74 29 29 20 7b 0a 09 20 20 20 20   first)) {..    
3f10: 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 7d 0a 09 6e  goto done;..}..n
3f20: 75 6d 44 65 6c 65 74 65 64 20 3d 20 6c 61 73 74  umDeleted = last
3f30: 20 2b 20 31 20 2d 20 66 69 72 73 74 3b 0a 09 66   + 1 - first;..f
3f40: 6f 72 20 28 69 20 3d 20 66 69 72 73 74 3b 20 69  or (i = first; i
3f50: 20 3c 3d 20 6c 61 73 74 3b 20 69 2b 2b 29 20 7b   <= last; i++) {
3f60: 0a 09 20 20 20 20 54 6b 5f 45 76 65 6e 74 75 61  ..    Tk_Eventua
3f70: 6c 6c 79 46 72 65 65 28 28 43 6c 69 65 6e 74 44  llyFree((ClientD
3f80: 61 74 61 29 20 6d 65 6e 75 50 74 72 2d 3e 65 6e  ata) menuPtr->en
3f90: 74 72 69 65 73 5b 69 5d 2c 0a 09 09 09 20 20 20  tries[i],....   
3fa0: 20 20 20 44 65 73 74 72 6f 79 4d 65 6e 75 45 6e     DestroyMenuEn
3fb0: 74 72 79 29 3b 0a 09 7d 0a 09 66 6f 72 20 28 69  try);..}..for (i
3fc0: 20 3d 20 6c 61 73 74 2b 31 3b 20 69 20 3c 20 6d   = last+1; i < m
3fd0: 65 6e 75 50 74 72 2d 3e 6e 75 6d 45 6e 74 72 69  enuPtr->numEntri
3fe0: 65 73 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  es; i++) {..    
3ff0: 6d 65 6e 75 50 74 72 2d 3e 65 6e 74 72 69 65 73  menuPtr->entries
4000: 5b 69 2d 6e 75 6d 44 65 6c 65 74 65 64 5d 20 3d  [i-numDeleted] =
4010: 20 6d 65 6e 75 50 74 72 2d 3e 65 6e 74 72 69 65   menuPtr->entrie
4020: 73 5b 69 5d 3b 0a 09 7d 0a 09 6d 65 6e 75 50 74  s[i];..}..menuPt
4030: 72 2d 3e 6e 75 6d 45 6e 74 72 69 65 73 20 2d 3d  r->numEntries -=
4040: 20 6e 75 6d 44 65 6c 65 74 65 64 3b 0a 09 69 66   numDeleted;..if
4050: 20 28 28 6d 65 6e 75 50 74 72 2d 3e 61 63 74 69   ((menuPtr->acti
4060: 76 65 20 3e 3d 20 66 69 72 73 74 29 20 26 26 20  ve >= first) && 
4070: 28 6d 65 6e 75 50 74 72 2d 3e 61 63 74 69 76 65  (menuPtr->active
4080: 20 3c 3d 20 6c 61 73 74 29 29 20 7b 0a 09 20 20   <= last)) {..  
4090: 20 20 6d 65 6e 75 50 74 72 2d 3e 61 63 74 69 76    menuPtr->activ
40a0: 65 20 3d 20 2d 31 3b 0a 09 7d 20 65 6c 73 65 20  e = -1;..} else 
40b0: 69 66 20 28 6d 65 6e 75 50 74 72 2d 3e 61 63 74  if (menuPtr->act
40c0: 69 76 65 20 3e 20 6c 61 73 74 29 20 7b 0a 09 20  ive > last) {.. 
40d0: 20 20 20 6d 65 6e 75 50 74 72 2d 3e 61 63 74 69     menuPtr->acti
40e0: 76 65 20 2d 3d 20 6e 75 6d 44 65 6c 65 74 65 64  ve -= numDeleted
40f0: 3b 0a 09 7d 0a 09 69 66 20 28 21 28 6d 65 6e 75  ;..}..if (!(menu
4100: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 52 45 53  Ptr->flags & RES
4110: 49 5a 45 5f 50 45 4e 44 49 4e 47 29 29 20 7b 0a  IZE_PENDING)) {.
4120: 09 20 20 20 20 6d 65 6e 75 50 74 72 2d 3e 66 6c  .    menuPtr->fl
4130: 61 67 73 20 7c 3d 20 52 45 53 49 5a 45 5f 50 45  ags |= RESIZE_PE
4140: 4e 44 49 4e 47 3b 0a 09 20 20 20 20 54 63 6c 5f  NDING;..    Tcl_
4150: 44 6f 57 68 65 6e 49 64 6c 65 28 43 6f 6d 70 75  DoWhenIdle(Compu
4160: 74 65 4d 65 6e 75 47 65 6f 6d 65 74 72 79 2c 20  teMenuGeometry, 
4170: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 6d 65 6e  (ClientData) men
4180: 75 50 74 72 29 3b 0a 09 7d 0a 20 20 20 20 7d 20  uPtr);..}.    } 
4190: 65 6c 73 65 20 69 66 20 28 28 63 20 3d 3d 20 27  else if ((c == '
41a0: 65 27 29 20 26 26 20 28 6c 65 6e 67 74 68 20 3e  e') && (length >
41b0: 3d 20 37 29 0a 09 20 20 20 20 26 26 20 28 73 74  = 7)..    && (st
41c0: 72 6e 63 6d 70 28 61 72 67 76 5b 31 5d 2c 20 22  rncmp(argv[1], "
41d0: 65 6e 74 72 79 63 67 65 74 22 2c 20 6c 65 6e 67  entrycget", leng
41e0: 74 68 29 20 3d 3d 20 30 29 29 20 7b 0a 09 69 6e  th) == 0)) {..in
41f0: 74 20 69 6e 64 65 78 3b 0a 0a 09 69 66 20 28 61  t index;...if (a
4200: 72 67 63 20 21 3d 20 34 29 20 7b 0a 09 20 20 20  rgc != 4) {..   
4210: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
4220: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
4230: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
4240: 62 65 20 5c 22 22 2c 0a 09 09 20 20 20 20 61 72  be \"",...    ar
4250: 67 76 5b 30 5d 2c 20 22 20 65 6e 74 72 79 63 67  gv[0], " entrycg
4260: 65 74 20 69 6e 64 65 78 20 6f 70 74 69 6f 6e 5c  et index option\
4270: 22 22 2c 0a 09 09 20 20 20 20 28 63 68 61 72 20  "",...    (char 
4280: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 67  *) NULL);..    g
4290: 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 7d 0a 09 69  oto error;..}..i
42a0: 66 20 28 47 65 74 4d 65 6e 75 49 6e 64 65 78 28  f (GetMenuIndex(
42b0: 69 6e 74 65 72 70 2c 20 6d 65 6e 75 50 74 72 2c  interp, menuPtr,
42c0: 20 61 72 67 76 5b 32 5d 2c 20 30 2c 20 26 69 6e   argv[2], 0, &in
42d0: 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  dex) != TCL_OK) 
42e0: 7b 0a 09 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  {..    goto erro
42f0: 72 3b 0a 09 7d 0a 09 69 66 20 28 69 6e 64 65 78  r;..}..if (index
4300: 20 3c 20 30 29 20 7b 0a 09 20 20 20 20 67 6f 74   < 0) {..    got
4310: 6f 20 64 6f 6e 65 3b 0a 09 7d 0a 09 6d 65 50 74  o done;..}..mePt
4320: 72 20 3d 20 6d 65 6e 75 50 74 72 2d 3e 65 6e 74  r = menuPtr->ent
4330: 72 69 65 73 5b 69 6e 64 65 78 5d 3b 0a 09 54 6b  ries[index];..Tk
4340: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e  _Preserve((Clien
4350: 74 44 61 74 61 29 20 6d 65 50 74 72 29 3b 0a 09  tData) mePtr);..
4360: 72 65 73 75 6c 74 20 3d 20 54 6b 5f 43 6f 6e 66  result = Tk_Conf
4370: 69 67 75 72 65 56 61 6c 75 65 28 69 6e 74 65 72  igureValue(inter
4380: 70 2c 20 6d 65 6e 75 50 74 72 2d 3e 74 6b 77 69  p, menuPtr->tkwi
4390: 6e 2c 20 65 6e 74 72 79 43 6f 6e 66 69 67 53 70  n, entryConfigSp
43a0: 65 63 73 2c 0a 09 09 28 63 68 61 72 20 2a 29 20  ecs,...(char *) 
43b0: 6d 65 50 74 72 2c 20 61 72 67 76 5b 33 5d 2c 20  mePtr, argv[3], 
43c0: 43 4f 4d 4d 41 4e 44 5f 4d 41 53 4b 20 3c 3c 20  COMMAND_MASK << 
43d0: 6d 65 50 74 72 2d 3e 74 79 70 65 29 3b 0a 09 54  mePtr->type);..T
43e0: 6b 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  k_Release((Clien
43f0: 74 44 61 74 61 29 20 6d 65 50 74 72 29 3b 0a 20  tData) mePtr);. 
4400: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28 63     } else if ((c
4410: 20 3d 3d 20 27 65 27 29 20 26 26 20 28 6c 65 6e   == 'e') && (len
4420: 67 74 68 20 3e 3d 20 37 29 0a 09 20 20 20 20 26  gth >= 7)..    &
4430: 26 20 28 73 74 72 6e 63 6d 70 28 61 72 67 76 5b  & (strncmp(argv[
4440: 31 5d 2c 20 22 65 6e 74 72 79 63 6f 6e 66 69 67  1], "entryconfig
4450: 75 72 65 22 2c 20 6c 65 6e 67 74 68 29 20 3d 3d  ure", length) ==
4460: 20 30 29 29 20 7b 0a 09 69 6e 74 20 69 6e 64 65   0)) {..int inde
4470: 78 3b 0a 0a 09 69 66 20 28 61 72 67 63 20 3c 20  x;...if (argc < 
4480: 33 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  3) {..    Tcl_Ap
4490: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
44a0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
44b0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
44c0: 0a 09 09 20 20 20 20 61 72 67 76 5b 30 5d 2c 20  ...    argv[0], 
44d0: 22 20 65 6e 74 72 79 63 6f 6e 66 69 67 75 72 65  " entryconfigure
44e0: 20 69 6e 64 65 78 20 3f 6f 70 74 69 6f 6e 20 76   index ?option v
44f0: 61 6c 75 65 20 2e 2e 2e 3f 5c 22 22 2c 0a 09 09  alue ...?\"",...
4500: 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c      (char *) NUL
4510: 4c 29 3b 0a 09 20 20 20 20 67 6f 74 6f 20 65 72  L);..    goto er
4520: 72 6f 72 3b 0a 09 7d 0a 09 69 66 20 28 47 65 74  ror;..}..if (Get
4530: 4d 65 6e 75 49 6e 64 65 78 28 69 6e 74 65 72 70  MenuIndex(interp
4540: 2c 20 6d 65 6e 75 50 74 72 2c 20 61 72 67 76 5b  , menuPtr, argv[
4550: 32 5d 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 21  2], 0, &index) !
4560: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20  = TCL_OK) {..   
4570: 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 7d 0a   goto error;..}.
4580: 09 69 66 20 28 69 6e 64 65 78 20 3c 20 30 29 20  .if (index < 0) 
4590: 7b 0a 09 20 20 20 20 67 6f 74 6f 20 64 6f 6e 65  {..    goto done
45a0: 3b 0a 09 7d 0a 09 6d 65 50 74 72 20 3d 20 6d 65  ;..}..mePtr = me
45b0: 6e 75 50 74 72 2d 3e 65 6e 74 72 69 65 73 5b 69  nuPtr->entries[i
45c0: 6e 64 65 78 5d 3b 0a 09 54 6b 5f 50 72 65 73 65  ndex];..Tk_Prese
45d0: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  rve((ClientData)
45e0: 20 6d 65 50 74 72 29 3b 0a 09 69 66 20 28 61 72   mePtr);..if (ar
45f0: 67 63 20 3d 3d 20 33 29 20 7b 0a 09 20 20 20 20  gc == 3) {..    
4600: 72 65 73 75 6c 74 20 3d 20 54 6b 5f 43 6f 6e 66  result = Tk_Conf
4610: 69 67 75 72 65 49 6e 66 6f 28 69 6e 74 65 72 70  igureInfo(interp
4620: 2c 20 6d 65 6e 75 50 74 72 2d 3e 74 6b 77 69 6e  , menuPtr->tkwin
4630: 2c 20 65 6e 74 72 79 43 6f 6e 66 69 67 53 70 65  , entryConfigSpe
4640: 63 73 2c 0a 09 09 20 20 20 20 28 63 68 61 72 20  cs,...    (char 
4650: 2a 29 20 6d 65 50 74 72 2c 20 28 63 68 61 72 20  *) mePtr, (char 
4660: 2a 29 20 4e 55 4c 4c 2c 0a 09 09 20 20 20 20 43  *) NULL,...    C
4670: 4f 4d 4d 41 4e 44 5f 4d 41 53 4b 20 3c 3c 20 6d  OMMAND_MASK << m
4680: 65 50 74 72 2d 3e 74 79 70 65 29 3b 0a 09 7d 20  ePtr->type);..} 
4690: 65 6c 73 65 20 69 66 20 28 61 72 67 63 20 3d 3d  else if (argc ==
46a0: 20 34 29 20 7b 0a 09 20 20 20 20 72 65 73 75 6c   4) {..    resul
46b0: 74 20 3d 20 54 6b 5f 43 6f 6e 66 69 67 75 72 65  t = Tk_Configure
46c0: 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 6d 65 6e  Info(interp, men
46d0: 75 50 74 72 2d 3e 74 6b 77 69 6e 2c 20 65 6e 74  uPtr->tkwin, ent
46e0: 72 79 43 6f 6e 66 69 67 53 70 65 63 73 2c 0a 09  ryConfigSpecs,..
46f0: 09 20 20 20 20 28 63 68 61 72 20 2a 29 20 6d 65  .    (char *) me
4700: 50 74 72 2c 20 61 72 67 76 5b 33 5d 2c 20 43 4f  Ptr, argv[3], CO
4710: 4d 4d 41 4e 44 5f 4d 41 53 4b 20 3c 3c 20 6d 65  MMAND_MASK << me
4720: 50 74 72 2d 3e 74 79 70 65 29 3b 0a 09 7d 20 65  Ptr->type);..} e
4730: 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 73 75 6c  lse {..    resul
4740: 74 20 3d 20 43 6f 6e 66 69 67 75 72 65 4d 65 6e  t = ConfigureMen
4750: 75 45 6e 74 72 79 28 69 6e 74 65 72 70 2c 20 6d  uEntry(interp, m
4760: 65 6e 75 50 74 72 2c 20 6d 65 50 74 72 2c 20 69  enuPtr, mePtr, i
4770: 6e 64 65 78 2c 20 61 72 67 63 2d 33 2c 0a 09 09  ndex, argc-3,...
4780: 20 20 20 20 61 72 67 76 2b 33 2c 20 54 4b 5f 43      argv+3, TK_C
4790: 4f 4e 46 49 47 5f 41 52 47 56 5f 4f 4e 4c 59 20  ONFIG_ARGV_ONLY 
47a0: 7c 20 43 4f 4d 4d 41 4e 44 5f 4d 41 53 4b 20 3c  | COMMAND_MASK <
47b0: 3c 20 6d 65 50 74 72 2d 3e 74 79 70 65 29 3b 0a  < mePtr->type);.
47c0: 09 7d 0a 09 54 6b 5f 52 65 6c 65 61 73 65 28 28  .}..Tk_Release((
47d0: 43 6c 69 65 6e 74 44 61 74 61 29 20 6d 65 50 74  ClientData) mePt
47e0: 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  r);.    } else i
47f0: 66 20 28 28 63 20 3d 3d 20 27 69 27 29 20 26 26  f ((c == 'i') &&
4800: 20 28 73 74 72 6e 63 6d 70 28 61 72 67 76 5b 31   (strncmp(argv[1
4810: 5d 2c 20 22 69 6e 64 65 78 22 2c 20 6c 65 6e 67  ], "index", leng
4820: 74 68 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 26  th) == 0)..    &
4830: 26 20 28 6c 65 6e 67 74 68 20 3e 3d 20 33 29 29  & (length >= 3))
4840: 20 7b 0a 09 69 6e 74 20 69 6e 64 65 78 3b 0a 0a   {..int index;..
4850: 09 69 66 20 28 61 72 67 63 20 21 3d 20 33 29 20  .if (argc != 3) 
4860: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
4870: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
4880: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
4890: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 09 09  hould be \"",...
48a0: 20 20 20 20 61 72 67 76 5b 30 5d 2c 20 22 20 69      argv[0], " i
48b0: 6e 64 65 78 20 73 74 72 69 6e 67 5c 22 22 2c 20  ndex string\"", 
48c0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
48d0: 09 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b  .    goto error;
48e0: 0a 09 7d 0a 09 69 66 20 28 47 65 74 4d 65 6e 75  ..}..if (GetMenu
48f0: 49 6e 64 65 78 28 69 6e 74 65 72 70 2c 20 6d 65  Index(interp, me
4900: 6e 75 50 74 72 2c 20 61 72 67 76 5b 32 5d 2c 20  nuPtr, argv[2], 
4910: 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43  0, &index) != TC
4920: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 67 6f 74  L_OK) {..    got
4930: 6f 20 65 72 72 6f 72 3b 0a 09 7d 0a 09 69 66 20  o error;..}..if 
4940: 28 69 6e 64 65 78 20 3c 20 30 29 20 7b 0a 09 20  (index < 0) {.. 
4950: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
4960: 28 69 6e 74 65 72 70 2c 22 6e 6f 6e 65 22 2c 20  (interp,"none", 
4970: 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 7d 20  TCL_STATIC);..} 
4980: 65 6c 73 65 20 7b 0a 09 20 20 20 20 63 68 61 72  else {..    char
4990: 20 62 75 66 66 65 72 5b 32 30 5d 3b 0a 09 20 20   buffer[20];..  
49a0: 20 20 73 70 72 69 6e 74 66 28 62 75 66 66 65 72    sprintf(buffer
49b0: 2c 20 22 25 64 22 2c 20 69 6e 64 65 78 29 3b 0a  , "%d", index);.
49c0: 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
49d0: 6c 74 28 69 6e 74 65 72 70 2c 20 62 75 66 66 65  lt(interp, buffe
49e0: 72 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  r, TCL_VOLATILE)
49f0: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
4a00: 69 66 20 28 28 63 20 3d 3d 20 27 69 27 29 20 26  if ((c == 'i') &
4a10: 26 20 28 73 74 72 6e 63 6d 70 28 61 72 67 76 5b  & (strncmp(argv[
4a20: 31 5d 2c 20 22 69 6e 73 65 72 74 22 2c 20 6c 65  1], "insert", le
4a30: 6e 67 74 68 29 20 3d 3d 20 30 29 0a 09 20 20 20  ngth) == 0)..   
4a40: 20 26 26 20 28 6c 65 6e 67 74 68 20 3e 3d 20 33   && (length >= 3
4a50: 29 29 20 7b 0a 09 69 66 20 28 61 72 67 63 20 3c  )) {..if (argc <
4a60: 20 34 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41   4) {..    Tcl_A
4a70: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
4a80: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
4a90: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
4aa0: 2c 0a 09 09 20 20 20 20 61 72 67 76 5b 30 5d 2c  ,...    argv[0],
4ab0: 20 22 20 69 6e 73 65 72 74 20 69 6e 64 65 78 20   " insert index 
4ac0: 74 79 70 65 20 3f 6f 70 74 69 6f 6e 73 3f 5c 22  type ?options?\"
4ad0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
4ae0: 29 3b 0a 09 20 20 20 20 67 6f 74 6f 20 65 72 72  );..    goto err
4af0: 6f 72 3b 0a 09 7d 0a 09 69 66 20 28 4d 65 6e 75  or;..}..if (Menu
4b00: 41 64 64 4f 72 49 6e 73 65 72 74 28 69 6e 74 65  AddOrInsert(inte
4b10: 72 70 2c 20 6d 65 6e 75 50 74 72 2c 20 61 72 67  rp, menuPtr, arg
4b20: 76 5b 32 5d 2c 0a 09 09 61 72 67 63 2d 33 2c 20  v[2],...argc-3, 
4b30: 61 72 67 76 2b 33 29 20 21 3d 20 54 43 4c 5f 4f  argv+3) != TCL_O
4b40: 4b 29 20 7b 0a 09 20 20 20 20 67 6f 74 6f 20 65  K) {..    goto e
4b50: 72 72 6f 72 3b 0a 09 7d 0a 20 20 20 20 7d 20 65  rror;..}.    } e
4b60: 6c 73 65 20 69 66 20 28 28 63 20 3d 3d 20 27 69  lse if ((c == 'i
4b70: 27 29 20 26 26 20 28 73 74 72 6e 63 6d 70 28 61  ') && (strncmp(a
4b80: 72 67 76 5b 31 5d 2c 20 22 69 6e 76 6f 6b 65 22  rgv[1], "invoke"
4b90: 2c 20 6c 65 6e 67 74 68 29 20 3d 3d 20 30 29 0a  , length) == 0).
4ba0: 09 20 20 20 20 26 26 20 28 6c 65 6e 67 74 68 20  .    && (length 
4bb0: 3e 3d 20 33 29 29 20 7b 0a 09 69 6e 74 20 69 6e  >= 3)) {..int in
4bc0: 64 65 78 3b 0a 0a 09 69 66 20 28 61 72 67 63 20  dex;...if (argc 
4bd0: 21 3d 20 33 29 20 7b 0a 09 20 20 20 20 54 63 6c  != 3) {..    Tcl
4be0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4bf0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
4c00: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
4c10: 22 22 2c 0a 09 09 20 20 20 20 61 72 67 76 5b 30  "",...    argv[0
4c20: 5d 2c 20 22 20 69 6e 76 6f 6b 65 20 69 6e 64 65  ], " invoke inde
4c30: 78 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  x\"", (char *) N
4c40: 55 4c 4c 29 3b 0a 09 20 20 20 20 67 6f 74 6f 20  ULL);..    goto 
4c50: 65 72 72 6f 72 3b 0a 09 7d 0a 09 69 66 20 28 47  error;..}..if (G
4c60: 65 74 4d 65 6e 75 49 6e 64 65 78 28 69 6e 74 65  etMenuIndex(inte
4c70: 72 70 2c 20 6d 65 6e 75 50 74 72 2c 20 61 72 67  rp, menuPtr, arg
4c80: 76 5b 32 5d 2c 20 30 2c 20 26 69 6e 64 65 78 29  v[2], 0, &index)
4c90: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   != TCL_OK) {.. 
4ca0: 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09     goto error;..
4cb0: 7d 0a 09 69 66 20 28 69 6e 64 65 78 20 3c 20 30  }..if (index < 0
4cc0: 29 20 7b 0a 09 20 20 20 20 67 6f 74 6f 20 64 6f  ) {..    goto do
4cd0: 6e 65 3b 0a 09 7d 0a 09 6d 65 50 74 72 20 3d 20  ne;..}..mePtr = 
4ce0: 6d 65 6e 75 50 74 72 2d 3e 65 6e 74 72 69 65 73  menuPtr->entries
4cf0: 5b 69 6e 64 65 78 5d 3b 0a 09 69 66 20 28 6d 65  [index];..if (me
4d00: 50 74 72 2d 3e 73 74 61 74 65 20 3d 3d 20 74 6b  Ptr->state == tk
4d10: 44 69 73 61 62 6c 65 64 55 69 64 29 20 7b 0a 09  DisabledUid) {..
4d20: 20 20 20 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09      goto done;..
4d30: 7d 0a 09 54 6b 5f 50 72 65 73 65 72 76 65 28 28  }..Tk_Preserve((
4d40: 43 6c 69 65 6e 74 44 61 74 61 29 20 6d 65 50 74  ClientData) mePt
4d50: 72 29 3b 0a 09 69 66 20 28 6d 65 50 74 72 2d 3e  r);..if (mePtr->
4d60: 74 79 70 65 20 3d 3d 20 43 48 45 43 4b 5f 42 55  type == CHECK_BU
4d70: 54 54 4f 4e 5f 45 4e 54 52 59 29 20 7b 0a 09 20  TTON_ENTRY) {.. 
4d80: 20 20 20 69 66 20 28 6d 65 50 74 72 2d 3e 66 6c     if (mePtr->fl
4d90: 61 67 73 20 26 20 45 4e 54 52 59 5f 53 45 4c 45  ags & ENTRY_SELE
4da0: 43 54 45 44 29 20 7b 0a 09 09 69 66 20 28 54 63  CTED) {...if (Tc
4db0: 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
4dc0: 20 6d 65 50 74 72 2d 3e 6e 61 6d 65 2c 20 6d 65   mePtr->name, me
4dd0: 50 74 72 2d 3e 6f 66 66 56 61 6c 75 65 2c 0a 09  Ptr->offValue,..
4de0: 09 09 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  ..TCL_GLOBAL_ONL
4df0: 59 7c 54 43 4c 5f 4c 45 41 56 45 5f 45 52 52 5f  Y|TCL_LEAVE_ERR_
4e00: 4d 53 47 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  MSG) == NULL) {.
4e10: 09 09 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54  ..    result = T
4e20: 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 20  CL_ERROR;...}.. 
4e30: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66     } else {...if
4e40: 20 28 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74   (Tcl_SetVar(int
4e50: 65 72 70 2c 20 6d 65 50 74 72 2d 3e 6e 61 6d 65  erp, mePtr->name
4e60: 2c 20 6d 65 50 74 72 2d 3e 6f 6e 56 61 6c 75 65  , mePtr->onValue
4e70: 2c 0a 09 09 09 54 43 4c 5f 47 4c 4f 42 41 4c 5f  ,....TCL_GLOBAL_
4e80: 4f 4e 4c 59 7c 54 43 4c 5f 4c 45 41 56 45 5f 45  ONLY|TCL_LEAVE_E
4e90: 52 52 5f 4d 53 47 29 20 3d 3d 20 4e 55 4c 4c 29  RR_MSG) == NULL)
4ea0: 20 7b 0a 09 09 20 20 20 20 72 65 73 75 6c 74 20   {...    result 
4eb0: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d  = TCL_ERROR;...}
4ec0: 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20  ..    }..} else 
4ed0: 69 66 20 28 6d 65 50 74 72 2d 3e 74 79 70 65 20  if (mePtr->type 
4ee0: 3d 3d 20 52 41 44 49 4f 5f 42 55 54 54 4f 4e 5f  == RADIO_BUTTON_
4ef0: 45 4e 54 52 59 29 20 7b 0a 09 20 20 20 20 69 66  ENTRY) {..    if
4f00: 20 28 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74   (Tcl_SetVar(int
4f10: 65 72 70 2c 20 6d 65 50 74 72 2d 3e 6e 61 6d 65  erp, mePtr->name
4f20: 2c 20 6d 65 50 74 72 2d 3e 6f 6e 56 61 6c 75 65  , mePtr->onValue
4f30: 2c 0a 09 09 20 20 20 20 54 43 4c 5f 47 4c 4f 42  ,...    TCL_GLOB
4f40: 41 4c 5f 4f 4e 4c 59 7c 54 43 4c 5f 4c 45 41 56  AL_ONLY|TCL_LEAV
4f50: 45 5f 45 52 52 5f 4d 53 47 29 20 3d 3d 20 4e 55  E_ERR_MSG) == NU
4f60: 4c 4c 29 20 7b 0a 09 09 72 65 73 75 6c 74 20 3d  LL) {...result =
4f70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
4f80: 20 7d 0a 09 7d 0a 09 69 66 20 28 28 72 65 73 75   }..}..if ((resu
4f90: 6c 74 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 26 26  lt == TCL_OK) &&
4fa0: 20 28 6d 65 50 74 72 2d 3e 63 6f 6d 6d 61 6e 64   (mePtr->command
4fb0: 20 21 3d 20 4e 55 4c 4c 29 29 20 7b 0a 09 20 20   != NULL)) {..  
4fc0: 20 20 72 65 73 75 6c 74 20 3d 20 54 6b 43 6f 70    result = TkCop
4fd0: 79 41 6e 64 47 6c 6f 62 61 6c 45 76 61 6c 28 69  yAndGlobalEval(i
4fe0: 6e 74 65 72 70 2c 20 6d 65 50 74 72 2d 3e 63 6f  nterp, mePtr->co
4ff0: 6d 6d 61 6e 64 29 3b 0a 09 7d 0a 09 69 66 20 28  mmand);..}..if (
5000: 28 72 65 73 75 6c 74 20 3d 3d 20 54 43 4c 5f 4f  (result == TCL_O
5010: 4b 29 20 26 26 20 28 6d 65 50 74 72 2d 3e 74 79  K) && (mePtr->ty
5020: 70 65 20 3d 3d 20 43 41 53 43 41 44 45 5f 45 4e  pe == CASCADE_EN
5030: 54 52 59 29 29 20 7b 0a 09 20 20 20 20 72 65 73  TRY)) {..    res
5040: 75 6c 74 20 3d 20 50 6f 73 74 53 75 62 6d 65 6e  ult = PostSubmen
5050: 75 28 6d 65 6e 75 50 74 72 2d 3e 69 6e 74 65 72  u(menuPtr->inter
5060: 70 2c 20 6d 65 6e 75 50 74 72 2c 20 6d 65 50 74  p, menuPtr, mePt
5070: 72 29 3b 0a 09 7d 0a 09 54 6b 5f 52 65 6c 65 61  r);..}..Tk_Relea
5080: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
5090: 6d 65 50 74 72 29 3b 0a 20 20 20 20 7d 20 65 6c  mePtr);.    } el
50a0: 73 65 20 69 66 20 28 28 63 20 3d 3d 20 27 70 27  se if ((c == 'p'
50b0: 29 20 26 26 20 28 73 74 72 6e 63 6d 70 28 61 72  ) && (strncmp(ar
50c0: 67 76 5b 31 5d 2c 20 22 70 6f 73 74 22 2c 20 6c  gv[1], "post", l
50d0: 65 6e 67 74 68 29 20 3d 3d 20 30 29 0a 09 20 20  ength) == 0)..  
50e0: 20 20 26 26 20 28 6c 65 6e 67 74 68 20 3d 3d 20    && (length == 
50f0: 34 29 29 20 7b 0a 20 20 20 20 09 54 6b 5f 57 69  4)) {.    .Tk_Wi
5100: 6e 64 6f 77 20 74 6b 77 69 6e 20 3d 20 6d 65 6e  ndow tkwin = men
5110: 75 50 74 72 2d 3e 74 6b 77 69 6e 3b 0a 09 69 6e  uPtr->tkwin;..in
5120: 74 20 74 6d 70 3b 0a 09 63 68 61 72 20 2a 70 6c  t tmp;..char *pl
5130: 61 63 65 41 72 67 76 5b 39 5d 3b 0a 20 20 20 20  aceArgv[9];.    
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5180: 20 0a 09 69 66 20 28 61 72 67 63 20 21 3d 20 34   ..if (argc != 4
5190: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
51a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
51b0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
51c0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
51d0: 09 09 20 20 20 20 61 72 67 76 5b 30 5d 2c 20 22  ..    argv[0], "
51e0: 20 70 6f 73 74 20 78 20 79 5c 22 22 2c 20 28 63   post x y\"", (c
51f0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
5200: 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09     goto error;..
5210: 7d 0a 09 69 66 20 28 28 54 63 6c 5f 47 65 74 49  }..if ((Tcl_GetI
5220: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
5230: 32 5d 2c 20 26 74 6d 70 29 20 21 3d 20 54 43 4c  2], &tmp) != TCL
5240: 5f 4f 4b 29 0a 09 09 7c 7c 20 28 54 63 6c 5f 47  _OK)...|| (Tcl_G
5250: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
5260: 67 76 5b 33 5d 2c 20 26 74 6d 70 29 20 21 3d 20  gv[3], &tmp) != 
5270: 54 43 4c 5f 4f 4b 29 29 20 7b 0a 09 20 20 20 20  TCL_OK)) {..    
5280: 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 7d 0a 0a  goto error;..}..
5290: 09 2f 2a 0a 09 20 2a 20 44 65 2d 61 63 74 69 76  ./*.. * De-activ
52a0: 61 74 65 20 61 6e 79 20 61 63 74 69 76 65 20 65  ate any active e
52b0: 6c 65 6d 65 6e 74 2e 0a 09 20 2a 2f 0a 0a 09 41  lement... */...A
52c0: 63 74 69 76 61 74 65 4d 65 6e 75 45 6e 74 72 79  ctivateMenuEntry
52d0: 28 6d 65 6e 75 50 74 72 2c 20 2d 31 29 3b 0a 0a  (menuPtr, -1);..
52e0: 09 2f 2a 0a 09 20 2a 20 49 66 20 74 68 65 72 65  ./*.. * If there
52f0: 20 69 73 20 61 20 63 6f 6d 6d 61 6e 64 20 66 6f   is a command fo
5300: 72 20 74 68 65 20 6d 65 6e 75 2c 20 65 78 65 63  r the menu, exec
5310: 75 74 65 20 69 74 2e 20 20 54 68 69 73 0a 09 20  ute it.  This.. 
5320: 2a 20 6d 61 79 20 63 68 61 6e 67 65 20 74 68 65  * may change the
5330: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 65 6e   size of the men
5340: 75 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f  u, so be sure to
5350: 20 72 65 63 6f 6d 70 75 74 65 0a 09 20 2a 20 74   recompute.. * t
5360: 68 65 20 6d 65 6e 75 27 73 20 67 65 6f 6d 65 74  he menu's geomet
5370: 72 79 20 69 66 20 6e 65 65 64 65 64 2e 0a 09 20  ry if needed... 
5380: 2a 2f 0a 0a 09 69 66 20 28 6d 65 6e 75 50 74 72  */...if (menuPtr
5390: 2d 3e 70 6f 73 74 43 6f 6d 6d 61 6e 64 20 21 3d  ->postCommand !=
53a0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65   NULL) {..    re
53b0: 73 75 6c 74 20 3d 20 54 6b 43 6f 70 79 41 6e 64  sult = TkCopyAnd
53c0: 47 6c 6f 62 61 6c 45 76 61 6c 28 6d 65 6e 75 50  GlobalEval(menuP
53d0: 74 72 2d 3e 69 6e 74 65 72 70 2c 0a 09 09 20 20  tr->interp,...  
53e0: 20 20 6d 65 6e 75 50 74 72 2d 3e 70 6f 73 74 43    menuPtr->postC
53f0: 6f 6d 6d 61 6e 64 29 3b 0a 09 20 20 20 20 69 66  ommand);..    if
5400: 20 28 72 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f   (result != TCL_
5410: 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 72  OK) {...return r
5420: 65 73 75 6c 74 3b 0a 09 20 20 20 20 7d 0a 09 20  esult;..    }.. 
5430: 20 20 20 69 66 20 28 6d 65 6e 75 50 74 72 2d 3e     if (menuPtr->
5440: 66 6c 61 67 73 20 26 20 52 45 53 49 5a 45 5f 50  flags & RESIZE_P
5450: 45 4e 44 49 4e 47 29 20 7b 0a 09 09 54 63 6c 5f  ENDING) {...Tcl_
5460: 43 61 6e 63 65 6c 49 64 6c 65 43 61 6c 6c 28 43  CancelIdleCall(C
5470: 6f 6d 70 75 74 65 4d 65 6e 75 47 65 6f 6d 65 74  omputeMenuGeomet
5480: 72 79 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  ry, (ClientData)
5490: 20 6d 65 6e 75 50 74 72 29 3b 0a 09 09 43 6f 6d   menuPtr);...Com
54a0: 70 75 74 65 4d 65 6e 75 47 65 6f 6d 65 74 72 79  puteMenuGeometry
54b0: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 6d 65  ((ClientData) me
54c0: 6e 75 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 09  nuPtr);..    }..
54d0: 7d 0a 0a 09 54 6b 5f 52 65 73 74 61 63 6b 57 69  }...Tk_RestackWi
54e0: 6e 64 6f 77 28 74 6b 77 69 6e 2c 20 41 62 6f 76  ndow(tkwin, Abov
54f0: 65 2c 20 28 54 6b 5f 57 69 6e 64 6f 77 29 20 4e  e, (Tk_Window) N
5500: 55 4c 4c 29 3b 0a 09 70 6c 61 63 65 41 72 67 76  ULL);..placeArgv
5510: 5b 30 5d 20 3d 20 22 70 6c 61 63 65 22 3b 0a 09  [0] = "place";..
5520: 70 6c 61 63 65 41 72 67 76 5b 31 5d 20 3d 20 54  placeArgv[1] = T
5530: 6b 5f 50 61 74 68 4e 61 6d 65 28 74 6b 77 69 6e  k_PathName(tkwin
5540: 29 3b 0a 09 70 6c 61 63 65 41 72 67 76 5b 32 5d  );..placeArgv[2]
5550: 20 3d 20 22 2d 78 22 3b 0a 09 70 6c 61 63 65 41   = "-x";..placeA
5560: 72 67 76 5b 33 5d 20 3d 20 61 72 67 76 5b 32 5d  rgv[3] = argv[2]
5570: 3b 0a 09 70 6c 61 63 65 41 72 67 76 5b 34 5d 20  ;..placeArgv[4] 
5580: 3d 20 22 2d 79 22 3b 0a 09 70 6c 61 63 65 41 72  = "-y";..placeAr
5590: 67 76 5b 35 5d 20 3d 20 61 72 67 76 5b 33 5d 3b  gv[5] = argv[3];
55a0: 0a 09 70 6c 61 63 65 41 72 67 76 5b 36 5d 20 3d  ..placeArgv[6] =
55b0: 20 22 2d 61 6e 63 68 6f 72 22 3b 0a 09 70 6c 61   "-anchor";..pla
55c0: 63 65 41 72 67 76 5b 37 5d 20 3d 20 22 6e 77 22  ceArgv[7] = "nw"
55d0: 3b 0a 09 70 6c 61 63 65 41 72 67 76 5b 38 5d 20  ;..placeArgv[8] 
55e0: 3d 20 4e 55 4c 4c 3b 0a 09 72 65 73 75 6c 74 20  = NULL;..result 
55f0: 3d 20 54 6b 5f 50 6c 61 63 65 43 6d 64 28 28 43  = Tk_PlaceCmd((C
5600: 6c 69 65 6e 74 44 61 74 61 29 20 74 6b 77 69 6e  lientData) tkwin
5610: 2c 20 69 6e 74 65 72 70 2c 20 38 2c 20 70 6c 61  , interp, 8, pla
5620: 63 65 41 72 67 76 29 3b 0a 20 20 20 20 7d 20 65  ceArgv);.    } e
5630: 6c 73 65 20 69 66 20 28 28 63 20 3d 3d 20 27 70  lse if ((c == 'p
5640: 27 29 20 26 26 20 28 73 74 72 6e 63 6d 70 28 61  ') && (strncmp(a
5650: 72 67 76 5b 31 5d 2c 20 22 70 6f 73 74 63 61 73  rgv[1], "postcas
5660: 63 61 64 65 22 2c 20 6c 65 6e 67 74 68 29 20 3d  cade", length) =
5670: 3d 20 30 29 0a 09 20 20 20 20 26 26 20 28 6c 65  = 0)..    && (le
5680: 6e 67 74 68 20 3e 20 34 29 29 20 7b 0a 09 69 6e  ngth > 4)) {..in
5690: 74 20 69 6e 64 65 78 3b 0a 09 69 66 20 28 61 72  t index;..if (ar
56a0: 67 63 20 21 3d 20 33 29 20 7b 0a 09 20 20 20 20  gc != 3) {..    
56b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
56c0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
56d0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
56e0: 65 20 5c 22 22 2c 0a 09 09 20 20 20 20 61 72 67  e \"",...    arg
56f0: 76 5b 30 5d 2c 20 22 20 70 6f 73 74 63 61 73 63  v[0], " postcasc
5700: 61 64 65 20 69 6e 64 65 78 5c 22 22 2c 20 28 63  ade index\"", (c
5710: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
5720: 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09     goto error;..
5730: 7d 0a 09 69 66 20 28 47 65 74 4d 65 6e 75 49 6e  }..if (GetMenuIn
5740: 64 65 78 28 69 6e 74 65 72 70 2c 20 6d 65 6e 75  dex(interp, menu
5750: 50 74 72 2c 20 61 72 67 76 5b 32 5d 2c 20 30 2c  Ptr, argv[2], 0,
5760: 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f   &index) != TCL_
5770: 4f 4b 29 20 7b 0a 09 20 20 20 20 67 6f 74 6f 20  OK) {..    goto 
5780: 65 72 72 6f 72 3b 0a 09 7d 0a 09 69 66 20 28 28  error;..}..if ((
5790: 69 6e 64 65 78 20 3c 20 30 29 20 7c 7c 20 28 6d  index < 0) || (m
57a0: 65 6e 75 50 74 72 2d 3e 65 6e 74 72 69 65 73 5b  enuPtr->entries[
57b0: 69 6e 64 65 78 5d 2d 3e 74 79 70 65 20 21 3d 20  index]->type != 
57c0: 43 41 53 43 41 44 45 5f 45 4e 54 52 59 29 29 20  CASCADE_ENTRY)) 
57d0: 7b 0a 09 20 20 20 20 72 65 73 75 6c 74 20 3d 20  {..    result = 
57e0: 50 6f 73 74 53 75 62 6d 65 6e 75 28 69 6e 74 65  PostSubmenu(inte
57f0: 72 70 2c 20 6d 65 6e 75 50 74 72 2c 20 28 4d 65  rp, menuPtr, (Me
5800: 6e 75 45 6e 74 72 79 20 2a 29 20 4e 55 4c 4c 29  nuEntry *) NULL)
5810: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
5820: 20 72 65 73 75 6c 74 20 3d 20 50 6f 73 74 53 75   result = PostSu
5830: 62 6d 65 6e 75 28 69 6e 74 65 72 70 2c 20 6d 65  bmenu(interp, me
5840: 6e 75 50 74 72 2c 20 6d 65 6e 75 50 74 72 2d 3e  nuPtr, menuPtr->
5850: 65 6e 74 72 69 65 73 5b 69 6e 64 65 78 5d 29 3b  entries[index]);
5860: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ..}.    } else i
5870: 66 20 28 28 63 20 3d 3d 20 27 74 27 29 20 26 26  f ((c == 't') &&
5880: 20 28 73 74 72 6e 63 6d 70 28 61 72 67 76 5b 31   (strncmp(argv[1
5890: 5d 2c 20 22 74 79 70 65 22 2c 20 6c 65 6e 67 74  ], "type", lengt
58a0: 68 29 20 3d 3d 20 30 29 29 20 7b 0a 09 69 6e 74  h) == 0)) {..int
58b0: 20 69 6e 64 65 78 3b 0a 09 69 66 20 28 61 72 67   index;..if (arg
58c0: 63 20 21 3d 20 33 29 20 7b 0a 09 20 20 20 20 54  c != 3) {..    T
58d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
58e0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
58f0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
5900: 20 5c 22 22 2c 0a 09 09 20 20 20 20 61 72 67 76   \"",...    argv
5910: 5b 30 5d 2c 20 22 20 74 79 70 65 20 69 6e 64 65  [0], " type inde
5920: 78 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  x\"", (char *) N
5930: 55 4c 4c 29 3b 0a 09 20 20 20 20 67 6f 74 6f 20  ULL);..    goto 
5940: 65 72 72 6f 72 3b 0a 09 7d 0a 09 69 66 20 28 47  error;..}..if (G
5950: 65 74 4d 65 6e 75 49 6e 64 65 78 28 69 6e 74 65  etMenuIndex(inte
5960: 72 70 2c 20 6d 65 6e 75 50 74 72 2c 20 61 72 67  rp, menuPtr, arg
5970: 76 5b 32 5d 2c 20 30 2c 20 26 69 6e 64 65 78 29  v[2], 0, &index)
5980: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   != TCL_OK) {.. 
5990: 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09     goto error;..
59a0: 7d 0a 09 69 66 20 28 69 6e 64 65 78 20 3c 20 30  }..if (index < 0
59b0: 29 20 7b 0a 09 20 20 20 20 67 6f 74 6f 20 64 6f  ) {..    goto do
59c0: 6e 65 3b 0a 09 7d 0a 09 6d 65 50 74 72 20 3d 20  ne;..}..mePtr = 
59d0: 6d 65 6e 75 50 74 72 2d 3e 65 6e 74 72 69 65 73  menuPtr->entries
59e0: 5b 69 6e 64 65 78 5d 3b 0a 09 73 77 69 74 63 68  [index];..switch
59f0: 20 28 6d 65 50 74 72 2d 3e 74 79 70 65 29 20 7b   (mePtr->type) {
5a00: 0a 09 20 20 20 20 63 61 73 65 20 43 4f 4d 4d 41  ..    case COMMA
5a10: 4e 44 5f 45 4e 54 52 59 3a 0a 09 09 54 63 6c 5f  ND_ENTRY:...Tcl_
5a20: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
5a30: 2c 22 63 6f 6d 6d 61 6e 64 22 2c 54 43 4c 5f 53  ,"command",TCL_S
5a40: 54 41 54 49 43 29 3b 0a 09 09 62 72 65 61 6b 3b  TATIC);...break;
5a50: 0a 09 20 20 20 20 63 61 73 65 20 53 45 50 41 52  ..    case SEPAR
5a60: 41 54 4f 52 5f 45 4e 54 52 59 3a 0a 09 09 54 63  ATOR_ENTRY:...Tc
5a70: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
5a80: 72 70 2c 22 73 65 70 61 72 61 74 6f 72 22 2c 54  rp,"separator",T
5a90: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 62 72  CL_STATIC);...br
5aa0: 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 43  eak;..    case C
5ab0: 48 45 43 4b 5f 42 55 54 54 4f 4e 5f 45 4e 54 52  HECK_BUTTON_ENTR
5ac0: 59 3a 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75  Y:...Tcl_SetResu
5ad0: 6c 74 28 69 6e 74 65 72 70 2c 22 63 68 65 63 6b  lt(interp,"check
5ae0: 62 75 74 74 6f 6e 22 2c 54 43 4c 5f 53 54 41 54  button",TCL_STAT
5af0: 49 43 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20  IC);...break;.. 
5b00: 20 20 20 63 61 73 65 20 52 41 44 49 4f 5f 42 55     case RADIO_BU
5b10: 54 54 4f 4e 5f 45 4e 54 52 59 3a 0a 09 09 54 63  TTON_ENTRY:...Tc
5b20: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
5b30: 72 70 2c 22 72 61 64 69 6f 62 75 74 74 6f 6e 22  rp,"radiobutton"
5b40: 2c 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09  ,TCL_STATIC);...
5b50: 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65  break;..    case
5b60: 20 43 41 53 43 41 44 45 5f 45 4e 54 52 59 3a 0a   CASCADE_ENTRY:.
5b70: 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28  ..Tcl_SetResult(
5b80: 69 6e 74 65 72 70 2c 22 63 61 73 63 61 64 65 22  interp,"cascade"
5b90: 2c 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09  ,TCL_STATIC);...
5ba0: 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65  break;..    case
5bb0: 20 54 45 41 52 4f 46 46 5f 45 4e 54 52 59 3a 0a   TEAROFF_ENTRY:.
5bc0: 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28  ..Tcl_SetResult(
5bd0: 69 6e 74 65 72 70 2c 22 74 65 61 72 6f 66 66 22  interp,"tearoff"
5be0: 2c 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09  ,TCL_STATIC);...
5bf0: 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 7d 20  break;..}.    } 
5c00: 65 6c 73 65 20 69 66 20 28 28 63 20 3d 3d 20 27  else if ((c == '
5c10: 75 27 29 20 26 26 20 28 73 74 72 6e 63 6d 70 28  u') && (strncmp(
5c20: 61 72 67 76 5b 31 5d 2c 20 22 75 6e 70 6f 73 74  argv[1], "unpost
5c30: 22 2c 20 6c 65 6e 67 74 68 29 20 3d 3d 20 30 29  ", length) == 0)
5c40: 29 20 7b 0a 09 63 68 61 72 20 2a 70 6c 61 63 65  ) {..char *place
5c50: 41 72 67 76 5b 34 5d 3b 0a 0a 09 69 66 20 28 61  Argv[4];...if (a
5c60: 72 67 63 20 21 3d 20 32 29 20 7b 0a 09 20 20 20  rgc != 2) {..   
5c70: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
5c80: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
5c90: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
5ca0: 62 65 20 5c 22 22 2c 0a 09 09 20 20 20 20 61 72  be \"",...    ar
5cb0: 67 76 5b 30 5d 2c 20 22 20 75 6e 70 6f 73 74 5c  gv[0], " unpost\
5cc0: 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  "", (char *) NUL
5cd0: 4c 29 3b 0a 09 20 20 20 20 67 6f 74 6f 20 65 72  L);..    goto er
5ce0: 72 6f 72 3b 0a 09 7d 0a 09 70 6c 61 63 65 41 72  ror;..}..placeAr
5cf0: 67 76 5b 30 5d 20 3d 20 22 70 6c 61 63 65 22 3b  gv[0] = "place";
5d00: 0a 09 70 6c 61 63 65 41 72 67 76 5b 31 5d 20 3d  ..placeArgv[1] =
5d10: 20 22 66 6f 72 67 65 74 22 3b 0a 09 70 6c 61 63   "forget";..plac
5d20: 65 41 72 67 76 5b 32 5d 20 3d 20 54 6b 5f 50 61  eArgv[2] = Tk_Pa
5d30: 74 68 4e 61 6d 65 28 6d 65 6e 75 50 74 72 2d 3e  thName(menuPtr->
5d40: 74 6b 77 69 6e 29 3b 0a 09 70 6c 61 63 65 41 72  tkwin);..placeAr
5d50: 67 76 5b 33 5d 20 3d 20 4e 55 4c 4c 3b 0a 09 72  gv[3] = NULL;..r
5d60: 65 73 75 6c 74 20 3d 20 54 6b 5f 50 6c 61 63 65  esult = Tk_Place
5d70: 43 6d 64 28 28 43 6c 69 65 6e 74 44 61 74 61 29  Cmd((ClientData)
5d80: 20 6d 65 6e 75 50 74 72 2d 3e 74 6b 77 69 6e 2c   menuPtr->tkwin,
5d90: 20 69 6e 74 65 72 70 2c 20 33 2c 20 70 6c 61 63   interp, 3, plac
5da0: 65 41 72 67 76 29 3b 0a 09 69 66 20 28 72 65 73  eArgv);..if (res
5db0: 75 6c 74 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ult == TCL_OK) {
5dc0: 0a 09 20 20 20 20 72 65 73 75 6c 74 20 3d 20 50  ..    result = P
5dd0: 6f 73 74 53 75 62 6d 65 6e 75 28 69 6e 74 65 72  ostSubmenu(inter
5de0: 70 2c 20 6d 65 6e 75 50 74 72 2c 20 28 4d 65 6e  p, menuPtr, (Men
5df0: 75 45 6e 74 72 79 20 2a 29 20 4e 55 4c 4c 29 3b  uEntry *) NULL);
5e00: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ..}.    } else i
5e10: 66 20 28 28 63 20 3d 3d 20 27 79 27 29 20 26 26  f ((c == 'y') &&
5e20: 20 28 73 74 72 6e 63 6d 70 28 61 72 67 76 5b 31   (strncmp(argv[1
5e30: 5d 2c 20 22 79 70 6f 73 69 74 69 6f 6e 22 2c 20  ], "yposition", 
5e40: 6c 65 6e 67 74 68 29 20 3d 3d 20 30 29 29 20 7b  length) == 0)) {
5e50: 0a 09 69 6e 74 20 69 6e 64 65 78 3b 0a 0a 09 69  ..int index;...i
5e60: 66 20 28 61 72 67 63 20 21 3d 20 33 29 20 7b 0a  f (argc != 3) {.
5e70: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
5e80: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
5e90: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
5ea0: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 09 09 20 20  uld be \"",...  
5eb0: 20 20 61 72 67 76 5b 30 5d 2c 20 22 20 79 70 6f    argv[0], " ypo
5ec0: 73 69 74 69 6f 6e 20 69 6e 64 65 78 5c 22 22 2c  sition index\"",
5ed0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
5ee0: 0a 09 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72  ..    goto error
5ef0: 3b 0a 09 7d 0a 09 69 66 20 28 47 65 74 4d 65 6e  ;..}..if (GetMen
5f00: 75 49 6e 64 65 78 28 69 6e 74 65 72 70 2c 20 6d  uIndex(interp, m
5f10: 65 6e 75 50 74 72 2c 20 61 72 67 76 5b 32 5d 2c  enuPtr, argv[2],
5f20: 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54   0, &index) != T
5f30: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 67 6f  CL_OK) {..    go
5f40: 74 6f 20 65 72 72 6f 72 3b 0a 09 7d 0a 09 69 66  to error;..}..if
5f50: 20 28 69 6e 64 65 78 20 3c 20 30 20 7c 7c 20 6d   (index < 0 || m
5f60: 65 6e 75 50 74 72 2d 3e 6e 75 6d 52 6f 77 73 20  enuPtr->numRows 
5f70: 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c  == 0) {..    Tcl
5f80: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
5f90: 70 2c 22 30 22 2c 54 43 4c 5f 53 54 41 54 49 43  p,"0",TCL_STATIC
5fa0: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  );..} else {..  
5fb0: 20 20 63 68 61 72 20 62 75 66 66 65 72 5b 32 30    char buffer[20
5fc0: 5d 3b 0a 09 20 20 20 20 73 70 72 69 6e 74 66 28  ];..    sprintf(
5fd0: 62 75 66 66 65 72 2c 20 22 25 64 22 2c 0a 09 09  buffer, "%d",...
5fe0: 20 20 20 20 28 69 6e 64 65 78 25 6d 65 6e 75 50      (index%menuP
5ff0: 74 72 2d 3e 6e 75 6d 52 6f 77 73 29 20 2b 20 6d  tr->numRows) + m
6000: 65 6e 75 50 74 72 2d 3e 62 6f 72 64 65 72 57 69  enuPtr->borderWi
6010: 64 74 68 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  dth);..    Tcl_S
6020: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
6030: 62 75 66 66 65 72 2c 54 43 4c 5f 56 4f 4c 41 54  buffer,TCL_VOLAT
6040: 49 4c 45 29 3b 0a 09 7d 0a 20 20 20 20 7d 20 65  ILE);..}.    } e
6050: 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  lse {..Tcl_Appen
6060: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
6070: 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c  "bad option \"",
6080: 20 61 72 67 76 5b 31 5d 2c 0a 09 09 22 5c 22 3a   argv[1],..."\":
6090: 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 61 74   must be activat
60a0: 65 2c 20 61 64 64 2c 20 63 67 65 74 2c 20 63 6f  e, add, cget, co
60b0: 6e 66 69 67 75 72 65 2c 20 64 65 6c 65 74 65 2c  nfigure, delete,
60c0: 20 22 2c 0a 09 09 22 65 6e 74 72 79 63 67 65 74   ",..."entrycget
60d0: 2c 20 65 6e 74 72 79 63 6f 6e 66 69 67 75 72 65  , entryconfigure
60e0: 2c 20 69 6e 64 65 78 2c 20 69 6e 73 65 72 74 2c  , index, insert,
60f0: 20 69 6e 76 6f 6b 65 2c 20 22 2c 0a 09 09 22 70   invoke, ",..."p
6100: 6f 73 74 2c 20 70 6f 73 74 63 61 73 63 61 64 65  ost, postcascade
6110: 2c 20 74 79 70 65 2c 20 75 6e 70 6f 73 74 2c 20  , type, unpost, 
6120: 6f 72 20 79 70 6f 73 69 74 69 6f 6e 22 2c 0a 09  or yposition",..
6130: 09 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b  .(char *) NULL);
6140: 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20  ..goto error;.  
6150: 20 20 7d 0a 20 20 20 20 64 6f 6e 65 3a 0a 20 20    }.    done:.  
6160: 20 20 54 6b 5f 52 65 6c 65 61 73 65 28 28 43 6c    Tk_Release((Cl
6170: 69 65 6e 74 44 61 74 61 29 20 6d 65 6e 75 50 74  ientData) menuPt
6180: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
6190: 65 73 75 6c 74 3b 0a 0a 20 20 20 20 65 72 72 6f  esult;..    erro
61a0: 72 3a 0a 20 20 20 20 54 6b 5f 52 65 6c 65 61 73  r:.    Tk_Releas
61b0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 6d  e((ClientData) m
61c0: 65 6e 75 50 74 72 29 3b 0a 20 20 20 20 72 65 74  enuPtr);.    ret
61d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d  urn TCL_ERROR;.}
61e0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
61f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
6230: 2a 0a 20 2a 20 44 65 73 74 72 6f 79 4d 65 6e 75  *. * DestroyMenu
6240: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
6250: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
6260: 6b 65 64 20 62 79 20 54 6b 5f 45 76 65 6e 74 75  ked by Tk_Eventu
6270: 61 6c 6c 79 46 72 65 65 20 6f 72 20 54 6b 5f 52  allyFree or Tk_R
6280: 65 6c 65 61 73 65 0a 20 2a 09 74 6f 20 63 6c 65  elease. *.to cle
6290: 61 6e 20 75 70 20 74 68 65 20 69 6e 74 65 72 6e  an up the intern
62a0: 61 6c 20 73 74 72 75 63 74 75 72 65 20 6f 66 20  al structure of 
62b0: 61 20 6d 65 6e 75 20 61 74 20 61 20 73 61 66 65  a menu at a safe
62c0: 20 74 69 6d 65 0a 20 2a 09 28 77 68 65 6e 20 6e   time. *.(when n
62d0: 6f 2d 6f 6e 65 20 69 73 20 75 73 69 6e 67 20 69  o-one is using i
62e0: 74 20 61 6e 79 6d 6f 72 65 29 2e 0a 20 2a 0a 20  t anymore).. *. 
62f0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
6300: 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ne.. *. * Side e
6310: 66 66 65 63 74 73 3a 0a 20 2a 09 45 76 65 72 79  ffects:. *.Every
6320: 74 68 69 6e 67 20 61 73 73 6f 63 69 61 74 65 64  thing associated
6330: 20 77 69 74 68 20 74 68 65 20 6d 65 6e 75 20 69   with the menu i
6340: 73 20 66 72 65 65 64 20 75 70 2e 0a 20 2a 0a 20  s freed up.. *. 
6350: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
6360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6390: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
63a0: 74 69 63 20 76 6f 69 64 0a 44 65 73 74 72 6f 79  tic void.Destroy
63b0: 4d 65 6e 75 28 63 6c 69 65 6e 74 44 61 74 61 29  Menu(clientData)
63c0: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20  .    ClientData 
63d0: 63 6c 69 65 6e 74 44 61 74 61 3b 09 2f 2a 20 49  clientData;./* I
63e0: 6e 66 6f 20 61 62 6f 75 74 20 6d 65 6e 75 20 77  nfo about menu w
63f0: 69 64 67 65 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20  idget. */.{.    
6400: 72 65 67 69 73 74 65 72 20 4d 65 6e 75 20 2a 6d  register Menu *m
6410: 65 6e 75 50 74 72 20 3d 20 28 4d 65 6e 75 20 2a  enuPtr = (Menu *
6420: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  ) clientData;.  
6430: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a    int i;..    /*
6440: 0a 20 20 20 20 20 2a 20 46 72 65 65 20 75 70 20  .     * Free up 
6450: 61 6c 6c 20 74 68 65 20 73 74 75 66 66 20 74 68  all the stuff th
6460: 61 74 20 72 65 71 75 69 72 65 73 20 73 70 65 63  at requires spec
6470: 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2c 20 74 68  ial handling, th
6480: 65 6e 0a 20 20 20 20 20 2a 20 6c 65 74 20 54 6b  en.     * let Tk
6490: 5f 46 72 65 65 4f 70 74 69 6f 6e 73 20 68 61 6e  _FreeOptions han
64a0: 64 6c 65 20 61 6c 6c 20 74 68 65 20 73 74 61 6e  dle all the stan
64b0: 64 61 72 64 20 6f 70 74 69 6f 6e 2d 72 65 6c 61  dard option-rela
64c0: 74 65 64 0a 20 20 20 20 20 2a 20 73 74 75 66 66  ted.     * stuff
64d0: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 66  ..     */..    f
64e0: 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 6d  or (i = 0; i < m
64f0: 65 6e 75 50 74 72 2d 3e 6e 75 6d 45 6e 74 72 69  enuPtr->numEntri
6500: 65 73 3b 20 69 2b 2b 29 20 7b 0a 09 44 65 73 74  es; i++) {..Dest
6510: 72 6f 79 4d 65 6e 75 45 6e 74 72 79 28 28 43 6c  royMenuEntry((Cl
6520: 69 65 6e 74 44 61 74 61 29 20 6d 65 6e 75 50 74  ientData) menuPt
6530: 72 2d 3e 65 6e 74 72 69 65 73 5b 69 5d 29 3b 0a  r->entries[i]);.
6540: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6d 65      }.    if (me
6550: 6e 75 50 74 72 2d 3e 65 6e 74 72 69 65 73 20 21  nuPtr->entries !
6560: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6b 66 72 65  = NULL) {..ckfre
6570: 65 28 28 63 68 61 72 20 2a 29 20 6d 65 6e 75 50  e((char *) menuP
6580: 74 72 2d 3e 65 6e 74 72 69 65 73 29 3b 0a 20 20  tr->entries);.  
6590: 20 20 7d 0a 20 20 20 20 54 6b 5f 46 72 65 65 4f    }.    Tk_FreeO
65a0: 70 74 69 6f 6e 73 28 63 6f 6e 66 69 67 53 70 65  ptions(configSpe
65b0: 63 73 2c 20 28 63 68 61 72 20 2a 29 20 6d 65 6e  cs, (char *) men
65c0: 75 50 74 72 2c 20 30 29 3b 0a 20 20 20 20 63 6b  uPtr, 0);.    ck
65d0: 66 72 65 65 28 28 63 68 61 72 20 2a 29 20 6d 65  free((char *) me
65e0: 6e 75 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  nuPtr);.}.../*. 
65f0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
6600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6630: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 65  -------. *. * De
6640: 73 74 72 6f 79 4d 65 6e 75 45 6e 74 72 79 20 2d  stroyMenuEntry -
6650: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  -. *. *.This pro
6660: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65  cedure is invoke
6670: 64 20 62 79 20 54 6b 5f 45 76 65 6e 74 75 61 6c  d by Tk_Eventual
6680: 6c 79 46 72 65 65 20 6f 72 20 54 6b 5f 52 65 6c  lyFree or Tk_Rel
6690: 65 61 73 65 0a 20 2a 09 74 6f 20 63 6c 65 61 6e  ease. *.to clean
66a0: 20 75 70 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   up the internal
66b0: 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 61 20   structure of a 
66c0: 6d 65 6e 75 20 65 6e 74 72 79 20 61 74 20 61 20  menu entry at a 
66d0: 73 61 66 65 20 74 69 6d 65 0a 20 2a 09 28 77 68  safe time. *.(wh
66e0: 65 6e 20 6e 6f 2d 6f 6e 65 20 69 73 20 75 73 69  en no-one is usi
66f0: 6e 67 20 69 74 20 61 6e 79 6d 6f 72 65 29 2e 0a  ng it anymore)..
6700: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
6710: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69  *.None.. *. * Si
6720: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 45  de effects:. *.E
6730: 76 65 72 79 74 68 69 6e 67 20 61 73 73 6f 63 69  verything associ
6740: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6d 65  ated with the me
6750: 6e 75 20 65 6e 74 72 79 20 69 73 20 66 72 65 65  nu entry is free
6760: 64 20 75 70 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  d up.. *. *-----
6770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67b0: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  -. */..static vo
67c0: 69 64 0a 44 65 73 74 72 6f 79 4d 65 6e 75 45 6e  id.DestroyMenuEn
67d0: 74 72 79 28 63 6c 69 65 6e 74 44 61 74 61 29 0a  try(clientData).
67e0: 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63      ClientData c
67f0: 6c 69 65 6e 74 44 61 74 61 3b 09 09 2f 2a 20 50  lientData;../* P
6800: 6f 69 6e 74 65 72 20 74 6f 20 65 6e 74 72 79 20  ointer to entry 
6810: 74 6f 20 62 65 20 66 72 65 65 64 2e 20 2a 2f 0a  to be freed. */.
6820: 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 4d  {.    register M
6830: 65 6e 75 45 6e 74 72 79 20 2a 6d 65 50 74 72 20  enuEntry *mePtr 
6840: 3d 20 28 4d 65 6e 75 45 6e 74 72 79 20 2a 29 20  = (MenuEntry *) 
6850: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20  clientData;.    
6860: 4d 65 6e 75 20 2a 6d 65 6e 75 50 74 72 20 3d 20  Menu *menuPtr = 
6870: 6d 65 50 74 72 2d 3e 6d 65 6e 75 50 74 72 3b 0a  mePtr->menuPtr;.
6880: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 46  .    /*.     * F
6890: 72 65 65 20 75 70 20 61 6c 6c 20 74 68 65 20 73  ree up all the s
68a0: 74 75 66 66 20 74 68 61 74 20 72 65 71 75 69 72  tuff that requir
68b0: 65 73 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  es special handl
68c0: 69 6e 67 2c 20 74 68 65 6e 0a 20 20 20 20 20 2a  ing, then.     *
68d0: 20 6c 65 74 20 54 6b 5f 46 72 65 65 4f 70 74 69   let Tk_FreeOpti
68e0: 6f 6e 73 20 68 61 6e 64 6c 65 20 61 6c 6c 20 74  ons handle all t
68f0: 68 65 20 73 74 61 6e 64 61 72 64 20 6f 70 74 69  he standard opti
6900: 6f 6e 2d 72 65 6c 61 74 65 64 0a 20 20 20 20 20  on-related.     
6910: 2a 20 73 74 75 66 66 2e 0a 20 20 20 20 20 2a 2f  * stuff..     */
6920: 0a 0a 20 20 20 20 69 66 20 28 6d 65 6e 75 50 74  ..    if (menuPt
6930: 72 2d 3e 70 6f 73 74 65 64 43 61 73 63 61 64 65  r->postedCascade
6940: 20 3d 3d 20 6d 65 50 74 72 29 20 7b 0a 09 2f 2a   == mePtr) {../*
6950: 0a 09 20 2a 20 49 67 6e 6f 72 65 20 65 72 72 6f  .. * Ignore erro
6960: 72 73 20 77 68 69 6c 65 20 75 6e 70 6f 73 74 69  rs while unposti
6970: 6e 67 20 74 68 65 20 6d 65 6e 75 2c 20 73 69 6e  ng the menu, sin
6980: 63 65 20 69 74 27 73 20 70 6f 73 73 69 62 6c 65  ce it's possible
6990: 0a 09 20 2a 20 74 68 61 74 20 74 68 65 20 6d 65  .. * that the me
69a0: 6e 75 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  nu has already b
69b0: 65 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  een deleted and 
69c0: 74 68 65 20 75 6e 70 6f 73 74 20 77 69 6c 6c 0a  the unpost will.
69d0: 09 20 2a 20 67 65 6e 65 72 61 74 65 20 61 6e 20  . * generate an 
69e0: 65 72 72 6f 72 2e 0a 09 20 2a 2f 0a 0a 09 50 6f  error... */...Po
69f0: 73 74 53 75 62 6d 65 6e 75 28 6d 65 6e 75 50 74  stSubmenu(menuPt
6a00: 72 2d 3e 69 6e 74 65 72 70 2c 20 6d 65 6e 75 50  r->interp, menuP
6a10: 74 72 2c 20 28 4d 65 6e 75 45 6e 74 72 79 20 2a  tr, (MenuEntry *
6a20: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20  ) NULL);.    }. 
6a30: 20 20 20 69 66 20 28 6d 65 50 74 72 2d 3e 6e 61     if (mePtr->na
6a40: 6d 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  me != NULL) {..T
6a50: 63 6c 5f 55 6e 74 72 61 63 65 56 61 72 28 6d 65  cl_UntraceVar(me
6a60: 6e 75 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 6d  nuPtr->interp, m
6a70: 65 50 74 72 2d 3e 6e 61 6d 65 2c 0a 09 09 54 43  ePtr->name,...TC
6a80: 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 7c 54 43  L_GLOBAL_ONLY|TC
6a90: 4c 5f 54 52 41 43 45 5f 57 52 49 54 45 53 7c 54  L_TRACE_WRITES|T
6aa0: 43 4c 5f 54 52 41 43 45 5f 55 4e 53 45 54 53 2c  CL_TRACE_UNSETS,
6ab0: 0a 09 09 4d 65 6e 75 56 61 72 50 72 6f 63 2c 20  ...MenuVarProc, 
6ac0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 6d 65 50  (ClientData) meP
6ad0: 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  tr);.    }.    T
6ae0: 6b 5f 46 72 65 65 4f 70 74 69 6f 6e 73 28 65 6e  k_FreeOptions(en
6af0: 74 72 79 43 6f 6e 66 69 67 53 70 65 63 73 2c 20  tryConfigSpecs, 
6b00: 28 63 68 61 72 20 2a 29 20 6d 65 50 74 72 2c 0a  (char *) mePtr,.
6b10: 09 20 20 20 20 28 43 4f 4d 4d 41 4e 44 5f 4d 41  .    (COMMAND_MA
6b20: 53 4b 20 3c 3c 20 6d 65 50 74 72 2d 3e 74 79 70  SK << mePtr->typ
6b30: 65 29 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28  e));.    ckfree(
6b40: 28 63 68 61 72 20 2a 29 20 6d 65 50 74 72 29 3b  (char *) mePtr);
6b50: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
6b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ba0: 0a 20 2a 0a 20 2a 20 43 6f 6e 66 69 67 75 72 65  . *. * Configure
6bb0: 4d 65 6e 75 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Menu --. *. *.Th
6bc0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
6bd0: 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
6be0: 73 20 61 6e 20 61 72 67 76 2f 61 72 67 63 20 6c  s an argv/argc l
6bf0: 69 73 74 2c 20 70 6c 75 73 0a 20 2a 09 74 68 65  ist, plus. *.the
6c00: 20 54 6b 20 6f 70 74 69 6f 6e 20 64 61 74 61 62   Tk option datab
6c10: 61 73 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ase, in order to
6c20: 20 63 6f 6e 66 69 67 75 72 65 20 28 6f 72 0a 20   configure (or. 
6c30: 2a 09 72 65 63 6f 6e 66 69 67 75 72 65 29 20 61  *.reconfigure) a
6c40: 20 6d 65 6e 75 20 77 69 64 67 65 74 2e 0a 20 2a   menu widget.. *
6c50: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
6c60: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
6c70: 20 69 73 20 61 20 73 74 61 6e 64 61 72 64 20 54   is a standard T
6c80: 63 6c 20 72 65 73 75 6c 74 2e 20 20 49 66 20 54  cl result.  If T
6c90: 43 4c 5f 45 52 52 4f 52 20 69 73 0a 20 2a 09 72  CL_ERROR is. *.r
6ca0: 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 69 6e  eturned, then in
6cb0: 74 65 72 70 2d 3e 72 65 73 75 6c 74 20 63 6f 6e  terp->result con
6cc0: 74 61 69 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d  tains an error m
6cd0: 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69  essage.. *. * Si
6ce0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
6cf0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 6e 66  onfiguration inf
6d00: 6f 72 6d 61 74 69 6f 6e 2c 20 73 75 63 68 20 61  ormation, such a
6d10: 73 20 63 6f 6c 6f 72 73 2c 20 66 6f 6e 74 2c 20  s colors, font, 
6d20: 65 74 63 2e 20 67 65 74 20 73 65 74 0a 20 2a 09  etc. get set. *.
6d30: 66 6f 72 20 6d 65 6e 75 50 74 72 3b 20 20 6f 6c  for menuPtr;  ol
6d40: 64 20 72 65 73 6f 75 72 63 65 73 20 67 65 74 20  d resources get 
6d50: 66 72 65 65 64 2c 20 69 66 20 74 68 65 72 65 20  freed, if there 
6d60: 77 65 72 65 20 61 6e 79 2e 0a 20 2a 0a 20 2a 2d  were any.. *. *-
6d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6db0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69  -----. */..stati
6dc0: 63 20 69 6e 74 0a 43 6f 6e 66 69 67 75 72 65 4d  c int.ConfigureM
6dd0: 65 6e 75 28 69 6e 74 65 72 70 2c 20 6d 65 6e 75  enu(interp, menu
6de0: 50 74 72 2c 20 61 72 67 63 2c 20 61 72 67 76 2c  Ptr, argc, argv,
6df0: 20 66 6c 61 67 73 29 0a 20 20 20 20 54 63 6c 5f   flags).    Tcl_
6e00: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 09  Interp *interp;.
6e10: 09 2f 2a 20 55 73 65 64 20 66 6f 72 20 65 72 72  ./* Used for err
6e20: 6f 72 20 72 65 70 6f 72 74 69 6e 67 2e 20 2a 2f  or reporting. */
6e30: 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 4d 65  .    register Me
6e40: 6e 75 20 2a 6d 65 6e 75 50 74 72 3b 09 2f 2a 20  nu *menuPtr;./* 
6e50: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
6e60: 74 20 77 69 64 67 65 74 3b 20 20 6d 61 79 20 6f  t widget;  may o
6e70: 72 20 6d 61 79 0a 09 09 09 09 20 2a 20 6e 6f 74  r may..... * not
6e80: 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 76 61   already have va
6e90: 6c 75 65 73 20 66 6f 72 20 73 6f 6d 65 20 66 69  lues for some fi
6ea0: 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  elds. */.    int
6eb0: 20 61 72 67 63 3b 09 09 09 2f 2a 20 4e 75 6d 62   argc;.../* Numb
6ec0: 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72  er of valid entr
6ed0: 69 65 73 20 69 6e 20 61 72 67 76 2e 20 2a 2f 0a  ies in argv. */.
6ee0: 20 20 20 20 63 68 61 72 20 2a 2a 61 72 67 76 3b      char **argv;
6ef0: 09 09 2f 2a 20 41 72 67 75 6d 65 6e 74 73 2e 20  ../* Arguments. 
6f00: 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  */.    int flags
6f10: 3b 09 09 09 2f 2a 20 46 6c 61 67 73 20 74 6f 20  ;.../* Flags to 
6f20: 70 61 73 73 20 74 6f 20 54 6b 5f 43 6f 6e 66 69  pass to Tk_Confi
6f30: 67 75 72 65 57 69 64 67 65 74 2e 20 2a 2f 0a 7b  gureWidget. */.{
6f40: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20  .    int i;..   
6f50: 20 69 66 20 28 54 6b 5f 43 6f 6e 66 69 67 75 72   if (Tk_Configur
6f60: 65 57 69 64 67 65 74 28 69 6e 74 65 72 70 2c 20  eWidget(interp, 
6f70: 6d 65 6e 75 50 74 72 2d 3e 74 6b 77 69 6e 2c 20  menuPtr->tkwin, 
6f80: 63 6f 6e 66 69 67 53 70 65 63 73 2c 0a 09 20 20  configSpecs,..  
6f90: 20 20 61 72 67 63 2c 20 61 72 67 76 2c 20 28 63    argc, argv, (c
6fa0: 68 61 72 20 2a 29 20 6d 65 6e 75 50 74 72 2c 20  har *) menuPtr, 
6fb0: 66 6c 61 67 73 29 20 21 3d 20 54 43 4c 5f 4f 4b  flags) != TCL_OK
6fc0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
6fd0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
6fe0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 66 74 65    /*.     * Afte
6ff0: 72 20 72 65 63 6f 6e 66 69 67 75 72 69 6e 67 20  r reconfiguring 
7000: 61 20 6d 65 6e 75 2c 20 77 65 20 6e 65 65 64 20  a menu, we need 
7010: 74 6f 20 72 65 63 6f 6e 66 69 67 75 72 65 20 61  to reconfigure a
7020: 6c 6c 20 6f 66 20 74 68 65 0a 20 20 20 20 20 2a  ll of the.     *
7030: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
7040: 6d 65 6e 75 2c 20 73 69 6e 63 65 20 73 6f 6d 65  menu, since some
7050: 20 6f 66 20 74 68 65 20 74 68 69 6e 67 73 20 69   of the things i
7060: 6e 20 74 68 65 20 63 68 69 6c 64 72 65 6e 0a 20  n the children. 
7070: 20 20 20 20 2a 20 28 73 75 63 68 20 61 73 20 67      * (such as g
7080: 72 61 70 68 69 63 73 20 63 6f 6e 74 65 78 74 73  raphics contexts
7090: 29 20 6d 61 79 20 68 61 76 65 20 74 6f 20 63 68  ) may have to ch
70a0: 61 6e 67 65 20 74 6f 20 72 65 66 6c 65 63 74 20  ange to reflect 
70b0: 63 68 61 6e 67 65 73 0a 20 20 20 20 20 2a 20 69  changes.     * i
70c0: 6e 20 74 68 65 20 70 61 72 65 6e 74 2e 0a 20 20  n the parent..  
70d0: 20 20 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 20 28     */..    for (
70e0: 69 20 3d 20 30 3b 20 69 20 3c 20 6d 65 6e 75 50  i = 0; i < menuP
70f0: 74 72 2d 3e 6e 75 6d 45 6e 74 72 69 65 73 3b 20  tr->numEntries; 
7100: 69 2b 2b 29 20 7b 0a 09 4d 65 6e 75 45 6e 74 72  i++) {..MenuEntr
7110: 79 20 2a 6d 65 50 74 72 3b 0a 0a 09 6d 65 50 74  y *mePtr;...mePt
7120: 72 20 3d 20 6d 65 6e 75 50 74 72 2d 3e 65 6e 74  r = menuPtr->ent
7130: 72 69 65 73 5b 69 5d 3b 0a 09 43 6f 6e 66 69 67  ries[i];..Config
7140: 75 72 65 4d 65 6e 75 45 6e 74 72 79 28 69 6e 74  ureMenuEntry(int
7150: 65 72 70 2c 20 6d 65 6e 75 50 74 72 2c 20 6d 65  erp, menuPtr, me
7160: 50 74 72 2c 20 69 2c 20 30 2c 20 28 63 68 61 72  Ptr, i, 0, (char
7170: 20 2a 2a 29 20 4e 55 4c 4c 2c 0a 09 09 54 4b 5f   **) NULL,...TK_
7180: 43 4f 4e 46 49 47 5f 41 52 47 56 5f 4f 4e 4c 59  CONFIG_ARGV_ONLY
7190: 20 7c 20 43 4f 4d 4d 41 4e 44 5f 4d 41 53 4b 20   | COMMAND_MASK 
71a0: 3c 3c 20 6d 65 50 74 72 2d 3e 74 79 70 65 29 3b  << mePtr->type);
71b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
71c0: 20 20 20 20 2a 20 44 65 70 65 6e 64 69 6e 67 20      * Depending 
71d0: 6f 6e 20 74 68 65 20 2d 74 65 61 72 4f 66 66 20  on the -tearOff 
71e0: 6f 70 74 69 6f 6e 2c 20 6d 61 6b 65 20 73 75 72  option, make sur
71f0: 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  e that there is 
7200: 6f 72 0a 20 20 20 20 20 2a 20 69 73 6e 27 74 20  or.     * isn't 
7210: 61 6e 20 69 6e 69 74 69 61 6c 20 74 65 61 72 2d  an initial tear-
7220: 6f 66 66 20 65 6e 74 72 79 20 61 74 20 74 68 65  off entry at the
7230: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
7240: 65 20 6d 65 6e 75 2e 0a 20 20 20 20 20 2a 2f 0a  e menu..     */.
7250: 0a 20 20 20 20 69 66 20 28 6d 65 6e 75 50 74 72  .    if (menuPtr
7260: 2d 3e 74 65 61 72 4f 66 66 29 20 7b 0a 09 69 66  ->tearOff) {..if
7270: 20 28 28 6d 65 6e 75 50 74 72 2d 3e 6e 75 6d 45   ((menuPtr->numE
7280: 6e 74 72 69 65 73 20 3d 3d 20 30 29 0a 09 09 7c  ntries == 0)...|
7290: 7c 20 28 6d 65 6e 75 50 74 72 2d 3e 65 6e 74 72  | (menuPtr->entr
72a0: 69 65 73 5b 30 5d 2d 3e 74 79 70 65 20 21 3d 20  ies[0]->type != 
72b0: 54 45 41 52 4f 46 46 5f 45 4e 54 52 59 29 29 20  TEAROFF_ENTRY)) 
72c0: 7b 0a 09 20 20 20 20 4d 65 6e 75 4e 65 77 45 6e  {..    MenuNewEn
72d0: 74 72 79 28 6d 65 6e 75 50 74 72 2c 20 30 2c 20  try(menuPtr, 0, 
72e0: 54 45 41 52 4f 46 46 5f 45 4e 54 52 59 29 3b 0a  TEAROFF_ENTRY);.
72f0: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  .}.    } else if
7300: 20 28 28 6d 65 6e 75 50 74 72 2d 3e 6e 75 6d 45   ((menuPtr->numE
7310: 6e 74 72 69 65 73 20 3e 20 30 29 0a 09 20 20 20  ntries > 0)..   
7320: 20 26 26 20 28 6d 65 6e 75 50 74 72 2d 3e 65 6e   && (menuPtr->en
7330: 74 72 69 65 73 5b 30 5d 2d 3e 74 79 70 65 20 3d  tries[0]->type =
7340: 3d 20 54 45 41 52 4f 46 46 5f 45 4e 54 52 59 29  = TEAROFF_ENTRY)
7350: 29 20 7b 0a 09 54 6b 5f 45 76 65 6e 74 75 61 6c  ) {..Tk_Eventual
7360: 6c 79 46 72 65 65 28 28 43 6c 69 65 6e 74 44 61  lyFree((ClientDa
7370: 74 61 29 20 6d 65 6e 75 50 74 72 2d 3e 65 6e 74  ta) menuPtr->ent
7380: 72 69 65 73 5b 30 5d 2c 0a 09 09 09 20 20 44 65  ries[0],....  De
7390: 73 74 72 6f 79 4d 65 6e 75 45 6e 74 72 79 29 3b  stroyMenuEntry);
73a0: 0a 09 66 6f 72 20 28 69 20 3d 20 31 3b 20 69 20  ..for (i = 1; i 
73b0: 3c 20 6d 65 6e 75 50 74 72 2d 3e 6e 75 6d 45 6e  < menuPtr->numEn
73c0: 74 72 69 65 73 3b 20 20 69 2b 2b 29 20 7b 0a 09  tries;  i++) {..
73d0: 20 20 20 20 6d 65 6e 75 50 74 72 2d 3e 65 6e 74      menuPtr->ent
73e0: 72 69 65 73 5b 69 2d 31 5d 20 3d 20 6d 65 6e 75  ries[i-1] = menu
73f0: 50 74 72 2d 3e 65 6e 74 72 69 65 73 5b 69 5d 3b  Ptr->entries[i];
7400: 0a 09 7d 0a 09 6d 65 6e 75 50 74 72 2d 3e 6e 75  ..}..menuPtr->nu
7410: 6d 45 6e 74 72 69 65 73 2d 2d 3b 0a 20 20 20 20  mEntries--;.    
7420: 7d 0a 0a 20 20 20 20 69 66 20 28 21 28 6d 65 6e  }..    if (!(men
7430: 75 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 52 45  uPtr->flags & RE
7440: 53 49 5a 45 5f 50 45 4e 44 49 4e 47 29 29 20 7b  SIZE_PENDING)) {
7450: 0a 09 6d 65 6e 75 50 74 72 2d 3e 66 6c 61 67 73  ..menuPtr->flags
7460: 20 7c 3d 20 52 45 53 49 5a 45 5f 50 45 4e 44 49   |= RESIZE_PENDI
7470: 4e 47 3b 0a 09 54 63 6c 5f 44 6f 57 68 65 6e 49  NG;..Tcl_DoWhenI
7480: 64 6c 65 28 43 6f 6d 70 75 74 65 4d 65 6e 75 47  dle(ComputeMenuG
7490: 65 6f 6d 65 74 72 79 2c 20 28 43 6c 69 65 6e 74  eometry, (Client
74a0: 44 61 74 61 29 20 6d 65 6e 75 50 74 72 29 3b 0a  Data) menuPtr);.
74b0: 20 20 20 20 7d 0a 0a 20 20 20 20 54 6b 5f 53 65      }..    Tk_Se
74c0: 74 49 6e 74 65 72 6e 61 6c 42 6f 72 64 65 72 28  tInternalBorder(
74d0: 6d 65 6e 75 50 74 72 2d 3e 74 6b 77 69 6e 2c 20  menuPtr->tkwin, 
74e0: 6d 65 6e 75 50 74 72 2d 3e 62 6f 72 64 65 72 57  menuPtr->borderW
74f0: 69 64 74 68 29 3b 0a 0a 20 20 20 20 72 65 74 75  idth);..    retu
7500: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
7510: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
7520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
7560: 20 43 6f 6e 66 69 67 75 72 65 4d 65 6e 75 45 6e   ConfigureMenuEn
7570: 74 72 79 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  try --. *. *.Thi
7580: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 63  s procedure is c
7590: 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73  alled to process
75a0: 20 61 6e 20 61 72 67 76 2f 61 72 67 63 20 6c 69   an argv/argc li
75b0: 73 74 2c 20 70 6c 75 73 0a 20 2a 09 74 68 65 20  st, plus. *.the 
75c0: 54 6b 20 6f 70 74 69 6f 6e 20 64 61 74 61 62 61  Tk option databa
75d0: 73 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  se, in order to 
75e0: 63 6f 6e 66 69 67 75 72 65 20 28 6f 72 0a 20 2a  configure (or. *
75f0: 09 72 65 63 6f 6e 66 69 67 75 72 65 29 20 6f 6e  .reconfigure) on
7600: 65 20 65 6e 74 72 79 20 69 6e 20 61 20 6d 65 6e  e entry in a men
7610: 75 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  u.. *. * Results
7620: 3a 0a 20 2a 09 54 68 65 20 72 65 74 75 72 6e 20  :. *.The return 
7630: 76 61 6c 75 65 20 69 73 20 61 20 73 74 61 6e 64  value is a stand
7640: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20  ard Tcl result. 
7650: 20 49 66 20 54 43 4c 5f 45 52 52 4f 52 20 69 73   If TCL_ERROR is
7660: 0a 20 2a 09 72 65 74 75 72 6e 65 64 2c 20 74 68  . *.returned, th
7670: 65 6e 20 69 6e 74 65 72 70 2d 3e 72 65 73 75 6c  en interp->resul
7680: 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 72  t contains an er
7690: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a  ror message.. *.
76a0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
76b0: 0a 20 2a 09 43 6f 6e 66 69 67 75 72 61 74 69 6f  . *.Configuratio
76c0: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 75  n information su
76d0: 63 68 20 61 73 20 6c 61 62 65 6c 20 61 6e 64 20  ch as label and 
76e0: 61 63 63 65 6c 65 72 61 74 6f 72 20 67 65 74 0a  accelerator get.
76f0: 20 2a 09 73 65 74 20 66 6f 72 20 6d 65 50 74 72   *.set for mePtr
7700: 3b 20 20 6f 6c 64 20 72 65 73 6f 75 72 63 65 73  ;  old resources
7710: 20 67 65 74 20 66 72 65 65 64 2c 20 69 66 20 74   get freed, if t
7720: 68 65 72 65 20 77 65 72 65 20 61 6e 79 2e 0a 20  here were any.. 
7730: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
7740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
7780: 73 74 61 74 69 63 20 69 6e 74 0a 43 6f 6e 66 69  static int.Confi
7790: 67 75 72 65 4d 65 6e 75 45 6e 74 72 79 28 69 6e  gureMenuEntry(in
77a0: 74 65 72 70 2c 20 6d 65 6e 75 50 74 72 2c 20 6d  terp, menuPtr, m
77b0: 65 50 74 72 2c 20 69 6e 64 65 78 2c 20 61 72 67  ePtr, index, arg
77c0: 63 2c 20 61 72 67 76 2c 20 66 6c 61 67 73 29 0a  c, argv, flags).
77d0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
77e0: 69 6e 74 65 72 70 3b 09 09 09 2f 2a 20 55 73 65  interp;.../* Use
77f0: 64 20 66 6f 72 20 65 72 72 6f 72 20 72 65 70 6f  d for error repo
7800: 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 4d 65  rting. */.    Me
7810: 6e 75 20 2a 6d 65 6e 75 50 74 72 3b 09 09 09 2f  nu *menuPtr;.../
7820: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
7830: 6f 75 74 20 77 68 6f 6c 65 20 6d 65 6e 75 2e 20  out whole menu. 
7840: 2a 2f 0a 20 20 20 20 72 65 67 69 73 74 65 72 20  */.    register 
7850: 4d 65 6e 75 45 6e 74 72 79 20 2a 6d 65 50 74 72  MenuEntry *mePtr
7860: 3b 09 09 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f  ;../* Informatio
7870: 6e 20 61 62 6f 75 74 20 6d 65 6e 75 20 65 6e 74  n about menu ent
7880: 72 79 3b 20 20 6d 61 79 0a 09 09 09 09 09 20 2a  ry;  may...... *
7890: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 61 6c 72 65   or may not alre
78a0: 61 64 79 20 68 61 76 65 20 76 61 6c 75 65 73 20  ady have values 
78b0: 66 6f 72 0a 09 09 09 09 09 20 2a 20 73 6f 6d 65  for...... * some
78c0: 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20   fields. */.    
78d0: 69 6e 74 20 69 6e 64 65 78 3b 09 09 09 09 2f 2a  int index;..../*
78e0: 20 49 6e 64 65 78 20 6f 66 20 6d 65 50 74 72 20   Index of mePtr 
78f0: 77 69 74 68 69 6e 20 6d 65 6e 75 50 74 72 27 73  within menuPtr's
7900: 0a 09 09 09 09 09 20 2a 20 65 6e 74 72 69 65 73  ...... * entries
7910: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 72 67  . */.    int arg
7920: 63 3b 09 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20  c;..../* Number 
7930: 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73  of valid entries
7940: 20 69 6e 20 61 72 67 76 2e 20 2a 2f 0a 20 20 20   in argv. */.   
7950: 20 63 68 61 72 20 2a 2a 61 72 67 76 3b 09 09 09   char **argv;...
7960: 2f 2a 20 41 72 67 75 6d 65 6e 74 73 2e 20 2a 2f  /* Arguments. */
7970: 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 09  .    int flags;.
7980: 09 09 09 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c  .../* Additional
7990: 20 66 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74   flags to pass t
79a0: 6f 0a 09 09 09 09 09 20 2a 20 54 6b 5f 43 6f 6e  o...... * Tk_Con
79b0: 66 69 67 75 72 65 57 69 64 67 65 74 2e 20 2a 2f  figureWidget. */
79c0: 0a 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  .{.    /*.     *
79d0: 20 49 66 20 74 68 69 73 20 65 6e 74 72 79 20 69   If this entry i
79e0: 73 20 61 20 63 61 73 63 61 64 65 20 61 6e 64 20  s a cascade and 
79f0: 74 68 65 20 63 61 73 63 61 64 65 20 69 73 20 70  the cascade is p
7a00: 6f 73 74 65 64 2c 20 74 68 65 6e 20 75 6e 70 6f  osted, then unpo
7a10: 73 74 0a 20 20 20 20 20 2a 20 69 74 20 62 65 66  st.     * it bef
7a20: 6f 72 65 20 72 65 63 6f 6e 66 69 67 75 72 69 6e  ore reconfigurin
7a30: 67 20 74 68 65 20 65 6e 74 72 79 20 28 6f 74 68  g the entry (oth
7a40: 65 72 77 69 73 65 20 74 68 65 20 72 65 63 6f 6e  erwise the recon
7a50: 66 69 67 75 72 65 20 6d 69 67 68 74 0a 20 20 20  figure might.   
7a60: 20 20 2a 20 63 68 61 6e 67 65 20 74 68 65 20 6e    * change the n
7a70: 61 6d 65 20 6f 66 20 74 68 65 20 63 61 73 63 61  ame of the casca
7a80: 64 65 64 20 65 6e 74 72 79 2c 20 6c 65 61 76 69  ded entry, leavi
7a90: 6e 67 20 61 20 70 6f 73 74 65 64 20 6d 65 6e 75  ng a posted menu
7aa0: 0a 20 20 20 20 20 2a 20 68 69 67 68 20 61 6e 64  .     * high and
7ab0: 20 64 72 79 29 2e 0a 20 20 20 20 20 2a 2f 0a 0a   dry)..     */..
7ac0: 20 20 20 20 69 66 20 28 6d 65 6e 75 50 74 72 2d      if (menuPtr-
7ad0: 3e 70 6f 73 74 65 64 43 61 73 63 61 64 65 20 3d  >postedCascade =
7ae0: 3d 20 6d 65 50 74 72 29 20 7b 0a 09 69 66 20 28  = mePtr) {..if (
7af0: 50 6f 73 74 53 75 62 6d 65 6e 75 28 6d 65 6e 75  PostSubmenu(menu
7b00: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 6d 65 6e  Ptr->interp, men
7b10: 75 50 74 72 2c 20 28 4d 65 6e 75 45 6e 74 72 79  uPtr, (MenuEntry
7b20: 20 2a 29 20 4e 55 4c 4c 29 0a 09 09 21 3d 20 54   *) NULL)...!= T
7b30: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63  CL_OK) {..    Tc
7b40: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
7b50: 72 28 6d 65 6e 75 50 74 72 2d 3e 69 6e 74 65 72  r(menuPtr->inter
7b60: 70 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  p);..}.    }..  
7b70: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 66 20 74    /*.     * If t
7b80: 68 69 73 20 65 6e 74 72 79 20 69 73 20 61 20 63  his entry is a c
7b90: 68 65 63 6b 20 62 75 74 74 6f 6e 20 6f 72 20 72  heck button or r
7ba0: 61 64 69 6f 20 62 75 74 74 6f 6e 2c 20 74 68 65  adio button, the
7bb0: 6e 20 72 65 6d 6f 76 65 0a 20 20 20 20 20 2a 20  n remove.     * 
7bc0: 69 74 73 20 6f 6c 64 20 74 72 61 63 65 20 70 72  its old trace pr
7bd0: 6f 63 65 64 75 72 65 2e 0a 20 20 20 20 20 2a 2f  ocedure..     */
7be0: 0a 0a 20 20 20 20 69 66 20 28 28 6d 65 50 74 72  ..    if ((mePtr
7bf0: 2d 3e 6e 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 20  ->name != NULL) 
7c00: 26 26 0a 09 20 20 20 20 28 28 6d 65 50 74 72 2d  &&..    ((mePtr-
7c10: 3e 74 79 70 65 20 3d 3d 20 43 48 45 43 4b 5f 42  >type == CHECK_B
7c20: 55 54 54 4f 4e 5f 45 4e 54 52 59 29 0a 09 20 20  UTTON_ENTRY)..  
7c30: 20 20 7c 7c 20 28 6d 65 50 74 72 2d 3e 74 79 70    || (mePtr->typ
7c40: 65 20 3d 3d 20 52 41 44 49 4f 5f 42 55 54 54 4f  e == RADIO_BUTTO
7c50: 4e 5f 45 4e 54 52 59 29 29 29 20 7b 0a 09 54 63  N_ENTRY))) {..Tc
7c60: 6c 5f 55 6e 74 72 61 63 65 56 61 72 28 6d 65 6e  l_UntraceVar(men
7c70: 75 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 6d 65  uPtr->interp, me
7c80: 50 74 72 2d 3e 6e 61 6d 65 2c 0a 09 09 54 43 4c  Ptr->name,...TCL
7c90: 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 7c 54 43 4c  _GLOBAL_ONLY|TCL
7ca0: 5f 54 52 41 43 45 5f 57 52 49 54 45 53 7c 54 43  _TRACE_WRITES|TC
7cb0: 4c 5f 54 52 41 43 45 5f 55 4e 53 45 54 53 2c 0a  L_TRACE_UNSETS,.
7cc0: 09 09 4d 65 6e 75 56 61 72 50 72 6f 63 2c 20 28  ..MenuVarProc, (
7cd0: 43 6c 69 65 6e 74 44 61 74 61 29 20 6d 65 50 74  ClientData) mePt
7ce0: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  r);.    }..    i
7cf0: 66 20 28 54 6b 5f 43 6f 6e 66 69 67 75 72 65 57  f (Tk_ConfigureW
7d00: 69 64 67 65 74 28 69 6e 74 65 72 70 2c 20 6d 65  idget(interp, me
7d10: 6e 75 50 74 72 2d 3e 74 6b 77 69 6e 2c 20 65 6e  nuPtr->tkwin, en
7d20: 74 72 79 43 6f 6e 66 69 67 53 70 65 63 73 2c 0a  tryConfigSpecs,.
7d30: 09 20 20 20 20 61 72 67 63 2c 20 61 72 67 76 2c  .    argc, argv,
7d40: 20 28 63 68 61 72 20 2a 29 20 6d 65 50 74 72 2c   (char *) mePtr,
7d50: 0a 09 20 20 20 20 66 6c 61 67 73 20 7c 20 28 43  ..    flags | (C
7d60: 4f 4d 4d 41 4e 44 5f 4d 41 53 4b 20 3c 3c 20 6d  OMMAND_MASK << m
7d70: 65 50 74 72 2d 3e 74 79 70 65 29 29 20 21 3d 20  ePtr->type)) != 
7d80: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72  TCL_OK) {..retur
7d90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7da0: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
7db0: 2a 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77  * The code below
7dc0: 20 68 61 6e 64 6c 65 73 20 73 70 65 63 69 61 6c   handles special
7dd0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73   configuration s
7de0: 74 75 66 66 20 6e 6f 74 20 74 61 6b 65 6e 0a 20  tuff not taken. 
7df0: 20 20 20 20 2a 20 63 61 72 65 20 6f 66 20 62 79      * care of by
7e00: 20 54 6b 5f 43 6f 6e 66 69 67 75 72 65 57 69 64   Tk_ConfigureWid
7e10: 67 65 74 2c 20 73 75 63 68 20 61 73 20 73 70 65  get, such as spe
7e20: 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  cial processing 
7e30: 66 6f 72 0a 20 20 20 20 20 2a 20 64 65 66 61 75  for.     * defau
7e40: 6c 74 73 2c 20 73 69 7a 69 6e 67 20 73 74 72 69  lts, sizing stri
7e50: 6e 67 73 2c 20 67 72 61 70 68 69 63 73 20 63 6f  ngs, graphics co
7e60: 6e 74 65 78 74 73 2c 20 65 74 63 2e 0a 20 20 20  ntexts, etc..   
7e70: 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6d 65    */..    if (me
7e80: 50 74 72 2d 3e 6c 61 62 65 6c 20 3d 3d 20 4e 55  Ptr->label == NU
7e90: 4c 4c 29 20 7b 0a 09 6d 65 50 74 72 2d 3e 6c 61  LL) {..mePtr->la
7ea0: 62 65 6c 4c 65 6e 67 74 68 20 3d 20 30 3b 0a 20  belLength = 0;. 
7eb0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6d 65 50     } else {..meP
7ec0: 74 72 2d 3e 6c 61 62 65 6c 4c 65 6e 67 74 68 20  tr->labelLength 
7ed0: 3d 20 73 74 72 6c 65 6e 28 6d 65 50 74 72 2d 3e  = strlen(mePtr->
7ee0: 6c 61 62 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  label);.    }.  
7ef0: 20 20 69 66 20 28 6d 65 50 74 72 2d 3e 61 63 63    if (mePtr->acc
7f00: 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6d  el == NULL) {..m
7f10: 65 50 74 72 2d 3e 61 63 63 65 6c 4c 65 6e 67 74  ePtr->accelLengt
7f20: 68 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73  h = 0;.    } els
7f30: 65 20 7b 0a 09 6d 65 50 74 72 2d 3e 61 63 63 65  e {..mePtr->acce
7f40: 6c 4c 65 6e 67 74 68 20 3d 20 73 74 72 6c 65 6e  lLength = strlen
7f50: 28 6d 65 50 74 72 2d 3e 61 63 63 65 6c 29 3b 0a  (mePtr->accel);.
7f60: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d      }..    if (m
7f70: 65 50 74 72 2d 3e 73 74 61 74 65 20 3d 3d 20 74  ePtr->state == t
7f80: 6b 41 63 74 69 76 65 55 69 64 29 20 7b 0a 09 69  kActiveUid) {..i
7f90: 66 20 28 69 6e 64 65 78 20 21 3d 20 6d 65 6e 75  f (index != menu
7fa0: 50 74 72 2d 3e 61 63 74 69 76 65 29 20 7b 0a 09  Ptr->active) {..
7fb0: 20 20 20 20 41 63 74 69 76 61 74 65 4d 65 6e 75      ActivateMenu
7fc0: 45 6e 74 72 79 28 6d 65 6e 75 50 74 72 2c 20 69  Entry(menuPtr, i
7fd0: 6e 64 65 78 29 3b 0a 09 7d 0a 20 20 20 20 7d 20  ndex);..}.    } 
7fe0: 65 6c 73 65 20 7b 0a 09 69 66 20 28 69 6e 64 65  else {..if (inde
7ff0: 78 20 3d 3d 20 6d 65 6e 75 50 74 72 2d 3e 61 63  x == menuPtr->ac
8000: 74 69 76 65 29 20 7b 0a 09 20 20 20 20 41 63 74  tive) {..    Act
8010: 69 76 61 74 65 4d 65 6e 75 45 6e 74 72 79 28 6d  ivateMenuEntry(m
8020: 65 6e 75 50 74 72 2c 20 2d 31 29 3b 0a 09 7d 0a  enuPtr, -1);..}.
8030: 09 69 66 20 28 28 6d 65 50 74 72 2d 3e 73 74 61  .if ((mePtr->sta
8040: 74 65 20 21 3d 20 74 6b 4e 6f 72 6d 61 6c 55 69  te != tkNormalUi
8050: 64 29 20 26 26 20 28 6d 65 50 74 72 2d 3e 73 74  d) && (mePtr->st
8060: 61 74 65 20 21 3d 20 74 6b 44 69 73 61 62 6c 65  ate != tkDisable
8070: 64 55 69 64 29 29 20 7b 0a 09 20 20 20 20 54 63  dUid)) {..    Tc
8080: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8090: 6e 74 65 72 70 2c 20 22 62 61 64 20 73 74 61 74  nterp, "bad stat
80a0: 65 20 76 61 6c 75 65 20 5c 22 22 2c 20 6d 65 50  e value \"", meP
80b0: 74 72 2d 3e 73 74 61 74 65 2c 0a 09 09 20 20 20  tr->state,...   
80c0: 20 22 5c 22 3a 20 20 6d 75 73 74 20 62 65 20 6e   "\":  must be n
80d0: 6f 72 6d 61 6c 2c 20 61 63 74 69 76 65 2c 20 6f  ormal, active, o
80e0: 72 20 64 69 73 61 62 6c 65 64 22 2c 20 28 63 68  r disabled", (ch
80f0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
8100: 20 20 6d 65 50 74 72 2d 3e 73 74 61 74 65 20 3d    mePtr->state =
8110: 20 74 6b 4e 6f 72 6d 61 6c 55 69 64 3b 0a 09 20   tkNormalUid;.. 
8120: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8130: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ROR;..}.    }.. 
8140: 20 20 20 69 66 20 28 28 6d 65 50 74 72 2d 3e 74     if ((mePtr->t
8150: 79 70 65 20 3d 3d 20 43 48 45 43 4b 5f 42 55 54  ype == CHECK_BUT
8160: 54 4f 4e 5f 45 4e 54 52 59 29 0a 09 20 20 20 20  TON_ENTRY)..    
8170: 7c 7c 20 28 6d 65 50 74 72 2d 3e 74 79 70 65 20  || (mePtr->type 
8180: 3d 3d 20 52 41 44 49 4f 5f 42 55 54 54 4f 4e 5f  == RADIO_BUTTON_
8190: 45 4e 54 52 59 29 29 20 7b 0a 09 63 68 61 72 20  ENTRY)) {..char 
81a0: 2a 76 61 6c 75 65 3b 0a 0a 09 69 66 20 28 6d 65  *value;...if (me
81b0: 50 74 72 2d 3e 6e 61 6d 65 20 3d 3d 20 4e 55 4c  Ptr->name == NUL
81c0: 4c 29 20 7b 0a 09 20 20 20 20 6d 65 50 74 72 2d  L) {..    mePtr-
81d0: 3e 6e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29  >name = (char *)
81e0: 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e   ckalloc((unsign
81f0: 65 64 29 20 28 6d 65 50 74 72 2d 3e 6c 61 62 65  ed) (mePtr->labe
8200: 6c 4c 65 6e 67 74 68 20 2b 20 31 29 29 3b 0a 09  lLength + 1));..
8210: 20 20 20 20 73 74 72 63 70 79 28 6d 65 50 74 72      strcpy(mePtr
8220: 2d 3e 6e 61 6d 65 2c 20 28 6d 65 50 74 72 2d 3e  ->name, (mePtr->
8230: 6c 61 62 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20 3f  label == NULL) ?
8240: 20 22 22 20 3a 20 6d 65 50 74 72 2d 3e 6c 61 62   "" : mePtr->lab
8250: 65 6c 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 65 50  el);..}..if (meP
8260: 74 72 2d 3e 6f 6e 56 61 6c 75 65 20 3d 3d 20 4e  tr->onValue == N
8270: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6d 65 50 74  ULL) {..    mePt
8280: 72 2d 3e 6f 6e 56 61 6c 75 65 20 3d 20 28 63 68  r->onValue = (ch
8290: 61 72 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75  ar *) ckalloc((u
82a0: 6e 73 69 67 6e 65 64 29 0a 09 09 20 20 20 20 28  nsigned)...    (
82b0: 6d 65 50 74 72 2d 3e 6c 61 62 65 6c 4c 65 6e 67  mePtr->labelLeng
82c0: 74 68 20 2b 20 31 29 29 3b 0a 09 20 20 20 20 73  th + 1));..    s
82d0: 74 72 63 70 79 28 6d 65 50 74 72 2d 3e 6f 6e 56  trcpy(mePtr->onV
82e0: 61 6c 75 65 2c 20 28 6d 65 50 74 72 2d 3e 6c 61  alue, (mePtr->la
82f0: 62 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 22  bel == NULL) ? "
8300: 22 20 3a 20 6d 65 50 74 72 2d 3e 6c 61 62 65 6c  " : mePtr->label
8310: 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 53  );..}.../*.. * S
8320: 65 6c 65 63 74 20 74 68 65 20 65 6e 74 72 79 20  elect the entry 
8330: 69 66 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  if the associate
8340: 64 20 76 61 72 69 61 62 6c 65 20 68 61 73 20 74  d variable has t
8350: 68 65 0a 09 20 2a 20 61 70 70 72 6f 70 72 69 61  he.. * appropria
8360: 74 65 20 76 61 6c 75 65 2c 20 69 6e 69 74 69 61  te value, initia
8370: 6c 69 7a 65 20 74 68 65 20 76 61 72 69 61 62 6c  lize the variabl
8380: 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 0a  e if it doesn't.
8390: 09 20 2a 20 65 78 69 73 74 2c 20 74 68 65 6e 20  . * exist, then 
83a0: 73 65 74 20 61 20 74 72 61 63 65 20 6f 6e 20 74  set a trace on t
83b0: 68 65 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d  he variable to m
83c0: 6f 6e 69 74 6f 72 20 66 75 74 75 72 65 0a 09 20  onitor future.. 
83d0: 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 69 74 73  * changes to its
83e0: 20 76 61 6c 75 65 2e 0a 09 20 2a 2f 0a 0a 09 76   value... */...v
83f0: 61 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74 56 61  alue = Tcl_GetVa
8400: 72 28 69 6e 74 65 72 70 2c 20 6d 65 50 74 72 2d  r(interp, mePtr-
8410: 3e 6e 61 6d 65 2c 20 54 43 4c 5f 47 4c 4f 42 41  >name, TCL_GLOBA
8420: 4c 5f 4f 4e 4c 59 29 3b 0a 09 6d 65 50 74 72 2d  L_ONLY);..mePtr-
8430: 3e 66 6c 61 67 73 20 26 3d 20 7e 45 4e 54 52 59  >flags &= ~ENTRY
8440: 5f 53 45 4c 45 43 54 45 44 3b 0a 09 69 66 20 28  _SELECTED;..if (
8450: 76 61 6c 75 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  value != NULL) {
8460: 0a 09 20 20 20 20 69 66 20 28 73 74 72 63 6d 70  ..    if (strcmp
8470: 28 76 61 6c 75 65 2c 20 6d 65 50 74 72 2d 3e 6f  (value, mePtr->o
8480: 6e 56 61 6c 75 65 29 20 3d 3d 20 30 29 20 7b 0a  nValue) == 0) {.
8490: 09 09 6d 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c  ..mePtr->flags |
84a0: 3d 20 45 4e 54 52 59 5f 53 45 4c 45 43 54 45 44  = ENTRY_SELECTED
84b0: 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65  ;..    }..} else
84c0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 56   {..    Tcl_SetV
84d0: 61 72 28 69 6e 74 65 72 70 2c 20 6d 65 50 74 72  ar(interp, mePtr
84e0: 2d 3e 6e 61 6d 65 2c 0a 09 09 20 20 20 20 28 6d  ->name,...    (m
84f0: 65 50 74 72 2d 3e 74 79 70 65 20 3d 3d 20 43 48  ePtr->type == CH
8500: 45 43 4b 5f 42 55 54 54 4f 4e 5f 45 4e 54 52 59  ECK_BUTTON_ENTRY
8510: 29 20 3f 20 6d 65 50 74 72 2d 3e 6f 66 66 56 61  ) ? mePtr->offVa
8520: 6c 75 65 20 3a 20 22 22 2c 0a 09 09 20 20 20 20  lue : "",...    
8530: 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
8540: 3b 0a 09 7d 0a 09 54 63 6c 5f 54 72 61 63 65 56  ;..}..Tcl_TraceV
8550: 61 72 28 69 6e 74 65 72 70 2c 20 6d 65 50 74 72  ar(interp, mePtr
8560: 2d 3e 6e 61 6d 65 2c 0a 09 09 54 43 4c 5f 47 4c  ->name,...TCL_GL
8570: 4f 42 41 4c 5f 4f 4e 4c 59 7c 54 43 4c 5f 54 52  OBAL_ONLY|TCL_TR
8580: 41 43 45 5f 57 52 49 54 45 53 7c 54 43 4c 5f 54  ACE_WRITES|TCL_T
8590: 52 41 43 45 5f 55 4e 53 45 54 53 2c 0a 09 09 4d  RACE_UNSETS,...M
85a0: 65 6e 75 56 61 72 50 72 6f 63 2c 20 28 43 6c 69  enuVarProc, (Cli
85b0: 65 6e 74 44 61 74 61 29 20 6d 65 50 74 72 29 3b  entData) mePtr);
85c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
85d0: 21 28 6d 65 6e 75 50 74 72 2d 3e 66 6c 61 67 73  !(menuPtr->flags
85e0: 20 26 20 52 45 53 49 5a 45 5f 50 45 4e 44 49 4e   & RESIZE_PENDIN
85f0: 47 29 29 20 7b 0a 09 6d 65 6e 75 50 74 72 2d 3e  G)) {..menuPtr->
8600: 66 6c 61 67 73 20 7c 3d 20 52 45 53 49 5a 45 5f  flags |= RESIZE_
8610: 50 45 4e 44 49 4e 47 3b 0a 09 54 63 6c 5f 44 6f  PENDING;..Tcl_Do
8620: 57 68 65 6e 49 64 6c 65 28 43 6f 6d 70 75 74 65  WhenIdle(Compute
8630: 4d 65 6e 75 47 65 6f 6d 65 74 72 79 2c 20 28 43  MenuGeometry, (C
8640: 6c 69 65 6e 74 44 61 74 61 29 20 6d 65 6e 75 50  lientData) menuP
8650: 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  tr);.    }.    r
8660: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
8670: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
8680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86b0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6d 70  -----. *. * Comp
86c0: 75 74 65 4d 65 6e 75 47 65 6f 6d 65 74 72 79 20  uteMenuGeometry 
86d0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
86e0: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
86f0: 65 64 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20  ed to recompute 
8700: 74 68 65 20 73 69 7a 65 20 61 6e 64 0a 20 2a 09  the size and. *.
8710: 6c 61 79 6f 75 74 20 6f 66 20 61 20 6d 65 6e 75  layout of a menu
8720: 2e 20 20 49 74 20 69 73 20 63 61 6c 6c 65 64 20  .  It is called 
8730: 61 73 20 61 20 77 68 65 6e 2d 69 64 6c 65 20 68  as a when-idle h
8740: 61 6e 64 6c 65 72 20 73 6f 0a 20 2a 09 74 68 61  andler so. *.tha
8750: 74 20 69 74 20 6f 6e 6c 79 20 67 65 74 73 20 64  t it only gets d
8760: 6f 6e 65 20 6f 6e 63 65 2c 20 65 76 65 6e 20 69  one once, even i
8770: 66 20 61 20 67 72 6f 75 70 20 6f 66 20 63 68 61  f a group of cha
8780: 6e 67 65 73 20 69 73 0a 20 2a 09 6d 61 64 65 20  nges is. *.made 
8790: 74 6f 20 74 68 65 20 6d 65 6e 75 2e 0a 20 2a 0a  to the menu.. *.
87a0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
87b0: 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  one.. *. * Side 
87c0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 69 65 6c  effects:. *.Fiel
87d0: 64 73 20 6f 66 20 6d 65 6e 75 20 65 6e 74 72 69  ds of menu entri
87e0: 65 73 20 61 72 65 20 63 68 61 6e 67 65 64 20 74  es are changed t
87f0: 6f 20 72 65 66 6c 65 63 74 20 74 68 65 69 72 0a  o reflect their.
8800: 20 2a 09 63 75 72 72 65 6e 74 20 70 6f 73 69 74   *.current posit
8810: 69 6f 6e 73 2c 20 61 6e 64 20 74 68 65 20 73 69  ions, and the si
8820: 7a 65 20 6f 66 20 74 68 65 20 6d 65 6e 75 20 77  ze of the menu w
8830: 69 6e 64 6f 77 0a 20 2a 09 69 74 73 65 6c 66 20  indow. *.itself 
8840: 6d 61 79 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  may be changed..
8850: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
8860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8890: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
88a0: 76 6f 69 64 0a 43 6f 6d 70 75 74 65 4d 65 6e 75  void.ComputeMenu
88b0: 47 65 6f 6d 65 74 72 79 28 63 6c 69 65 6e 74 44  Geometry(clientD
88c0: 61 74 61 29 0a 20 20 20 20 43 6c 69 65 6e 74 44  ata).    ClientD
88d0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 09  ata clientData;.
88e0: 09 2f 2a 20 53 74 72 75 63 74 75 72 65 20 64 65  ./* Structure de
88f0: 73 63 72 69 62 69 6e 67 20 6d 65 6e 75 2e 20 2a  scribing menu. *
8900: 2f 0a 7b 0a 20 20 20 20 4d 65 6e 75 20 2a 6d 65  /.{.    Menu *me
8910: 6e 75 50 74 72 20 3d 20 28 4d 65 6e 75 20 2a 29  nuPtr = (Menu *)
8920: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20   clientData;.   
8930: 20 72 65 67 69 73 74 65 72 20 4d 65 6e 75 45 6e   register MenuEn
8940: 74 72 79 20 2a 6d 65 50 74 72 3b 0a 20 20 20 20  try *mePtr;.    
8950: 69 6e 74 20 6d 61 78 4c 61 62 65 6c 57 69 64 74  int maxLabelWidt
8960: 68 2c 20 6d 61 78 41 63 63 65 6c 57 69 64 74 68  h, maxAccelWidth
8970: 3b 0a 20 20 20 20 69 6e 74 20 6e 75 6d 43 6f 6c  ;.    int numCol
8980: 75 6d 6e 73 2c 20 77 69 64 74 68 2c 20 68 65 69  umns, width, hei
8990: 67 68 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ght;.    int i;.
89a0: 0a 20 20 20 20 69 66 20 28 6d 65 6e 75 50 74 72  .    if (menuPtr
89b0: 2d 3e 74 6b 77 69 6e 20 3d 3d 20 4e 55 4c 4c 29  ->tkwin == NULL)
89c0: 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20   {..return;.    
89d0: 7d 0a 0a 20 20 20 20 6d 61 78 4c 61 62 65 6c 57  }..    maxLabelW
89e0: 69 64 74 68 20 3d 20 6d 61 78 41 63 63 65 6c 57  idth = maxAccelW
89f0: 69 64 74 68 20 3d 20 30 3b 0a 0a 20 20 20 20 66  idth = 0;..    f
8a00: 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 6d  or (i = 0; i < m
8a10: 65 6e 75 50 74 72 2d 3e 6e 75 6d 45 6e 74 72 69  enuPtr->numEntri
8a20: 65 73 3b 20 69 2b 2b 29 20 7b 0a 09 2f 2a 0a 09  es; i++) {../*..
8a30: 20 2a 20 46 6f 72 20 65 61 63 68 20 65 6e 74 72   * For each entr
8a40: 79 2c 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6c  y, compute the l
8a50: 61 62 65 6c 20 61 6e 64 20 61 63 63 65 6c 65 72  abel and acceler
8a60: 61 74 6f 72 20 77 69 64 74 68 2e 0a 09 20 2a 2f  ator width... */
8a70: 0a 0a 09 6d 65 50 74 72 20 3d 20 6d 65 6e 75 50  ...mePtr = menuP
8a80: 74 72 2d 3e 65 6e 74 72 69 65 73 5b 69 5d 3b 0a  tr->entries[i];.
8a90: 0a 09 69 66 20 28 6d 65 50 74 72 2d 3e 6c 61 62  ..if (mePtr->lab
8aa0: 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  el != NULL) {.. 
8ab0: 20 20 20 28 76 6f 69 64 29 20 54 6b 4d 65 61 73     (void) TkMeas
8ac0: 75 72 65 43 68 61 72 73 28 6d 65 50 74 72 2d 3e  ureChars(mePtr->
8ad0: 6c 61 62 65 6c 2c 0a 09 09 20 20 20 20 6d 65 50  label,...    meP
8ae0: 74 72 2d 3e 6c 61 62 65 6c 4c 65 6e 67 74 68 2c  tr->labelLength,
8af0: 20 30 2c 20 28 69 6e 74 29 20 31 30 30 30 30 30   0, (int) 100000
8b00: 2c 20 30 2c 0a 09 09 20 20 20 20 54 4b 5f 4e 45  , 0,...    TK_NE
8b10: 57 4c 49 4e 45 53 5f 4e 4f 54 5f 53 50 45 43 49  WLINES_NOT_SPECI
8b20: 41 4c 2c 20 26 77 69 64 74 68 29 3b 0a 09 20 20  AL, &width);..  
8b30: 20 20 69 66 20 28 77 69 64 74 68 20 3e 20 6d 61    if (width > ma
8b40: 78 4c 61 62 65 6c 57 69 64 74 68 29 20 7b 0a 09  xLabelWidth) {..
8b50: 09 6d 61 78 4c 61 62 65 6c 57 69 64 74 68 20 3d  .maxLabelWidth =
8b60: 20 77 69 64 74 68 3b 0a 09 20 20 20 20 7d 0a 09   width;..    }..
8b70: 7d 0a 0a 09 69 66 20 28 6d 65 50 74 72 2d 3e 61  }...if (mePtr->a
8b80: 63 63 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ccel != NULL) {.
8b90: 09 20 20 20 20 28 76 6f 69 64 29 20 54 6b 4d 65  .    (void) TkMe
8ba0: 61 73 75 72 65 43 68 61 72 73 28 6d 65 50 74 72  asureChars(mePtr
8bb0: 2d 3e 61 63 63 65 6c 2c 20 6d 65 50 74 72 2d 3e  ->accel, mePtr->
8bc0: 61 63 63 65 6c 4c 65 6e 67 74 68 2c 0a 09 09 20  accelLength,... 
8bd0: 20 20 20 30 2c 20 28 69 6e 74 29 20 31 30 30 30     0, (int) 1000
8be0: 30 30 2c 20 30 2c 20 54 4b 5f 4e 45 57 4c 49 4e  00, 0, TK_NEWLIN
8bf0: 45 53 5f 4e 4f 54 5f 53 50 45 43 49 41 4c 2c 20  ES_NOT_SPECIAL, 
8c00: 26 77 69 64 74 68 29 3b 0a 09 20 20 20 20 69 66  &width);..    if
8c10: 20 28 77 69 64 74 68 20 3e 20 6d 61 78 41 63 63   (width > maxAcc
8c20: 65 6c 57 69 64 74 68 29 20 7b 0a 09 09 6d 61 78  elWidth) {...max
8c30: 41 63 63 65 6c 57 69 64 74 68 20 3d 20 77 69 64  AccelWidth = wid
8c40: 74 68 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20  th;..    }..}.  
8c50: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
8c60: 20 2a 20 47 6f 74 20 61 6c 6c 20 74 68 65 20 73   * Got all the s
8c70: 69 7a 65 73 2e 20 20 55 70 64 61 74 65 20 66 69  izes.  Update fi
8c80: 65 6c 64 73 20 69 6e 20 74 68 65 20 6d 65 6e 75  elds in the menu
8c90: 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e   structure, then
8ca0: 0a 20 20 20 20 20 2a 20 72 65 73 69 7a 65 20 74  .     * resize t
8cb0: 68 65 20 77 69 6e 64 6f 77 20 69 66 20 6e 65 63  he window if nec
8cc0: 65 73 73 61 72 79 2e 0a 20 20 20 20 20 2a 0a 20  essary..     *. 
8cd0: 20 20 20 20 2a 20 43 6f 6c 75 6d 6e 20 77 69 64      * Column wid
8ce0: 74 68 20 69 73 20 6d 61 78 2e 20 6c 61 62 65 6c  th is max. label
8cf0: 20 61 6e 64 20 61 63 63 65 6c 65 72 61 74 6f 72   and accelerator
8d00: 20 77 69 64 74 68 73 20 2b 20 32 20 73 70 61 63   widths + 2 spac
8d10: 65 73 0a 20 20 20 20 20 2a 20 66 6f 72 20 73 65  es.     * for se
8d20: 6c 65 63 74 69 6f 6e 20 61 6e 64 20 63 61 73 63  lection and casc
8d30: 61 64 65 20 69 6e 64 69 63 61 74 6f 72 73 2e 0a  ade indicators..
8d40: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6d 65 6e       */..    men
8d50: 75 50 74 72 2d 3e 6c 61 62 65 6c 57 69 64 74 68  uPtr->labelWidth
8d60: 20 3d 20 6d 61 78 4c 61 62 65 6c 57 69 64 74 68   = maxLabelWidth
8d70: 3b 0a 20 20 20 20 6d 65 6e 75 50 74 72 2d 3e 63  ;.    menuPtr->c
8d80: 6f 6c 75 6d 6e 57 69 64 74 68 20 3d 20 6d 61 78  olumnWidth = max
8d90: 4c 61 62 65 6c 57 69 64 74 68 20 2b 20 6d 61 78  LabelWidth + max
8da0: 41 63 63 65 6c 57 69 64 74 68 20 2b 20 32 3b 0a  AccelWidth + 2;.
8db0: 20 20 20 20 6e 75 6d 43 6f 6c 75 6d 6e 73 20 3d      numColumns =
8dc0: 20 31 20 2b 20 28 6d 65 6e 75 50 74 72 2d 3e 6e   1 + (menuPtr->n
8dd0: 75 6d 45 6e 74 72 69 65 73 20 2d 20 31 29 0a 09  umEntries - 1)..
8de0: 20 20 20 20 2f 20 28 43 74 6b 5f 44 69 73 70 6c      / (Ctk_Displ
8df0: 61 79 48 65 69 67 68 74 28 54 6b 5f 44 69 73 70  ayHeight(Tk_Disp
8e00: 6c 61 79 28 6d 65 6e 75 50 74 72 2d 3e 74 6b 77  lay(menuPtr->tkw
8e10: 69 6e 29 29 0a 09 20 20 20 20 2d 20 32 2a 6d 65  in))..    - 2*me
8e20: 6e 75 50 74 72 2d 3e 62 6f 72 64 65 72 57 69 64  nuPtr->borderWid
8e30: 74 68 29 3b 0a 20 20 20 20 69 66 20 28 6e 75 6d  th);.    if (num
8e40: 43 6f 6c 75 6d 6e 73 20 3c 3d 20 30 29 20 7b 0a  Columns <= 0) {.
8e50: 09 6d 65 6e 75 50 74 72 2d 3e 6e 75 6d 52 6f 77  .menuPtr->numRow
8e60: 73 20 3d 20 6e 75 6d 43 6f 6c 75 6d 6e 73 20 3d  s = numColumns =
8e70: 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b   0;.    } else {
8e80: 0a 09 6d 65 6e 75 50 74 72 2d 3e 6e 75 6d 52 6f  ..menuPtr->numRo
8e90: 77 73 20 3d 20 31 20 2b 20 28 6d 65 6e 75 50 74  ws = 1 + (menuPt
8ea0: 72 2d 3e 6e 75 6d 45 6e 74 72 69 65 73 20 2d 20  r->numEntries - 
8eb0: 31 29 2f 6e 75 6d 43 6f 6c 75 6d 6e 73 3b 0a 20  1)/numColumns;. 
8ec0: 20 20 20 7d 0a 20 20 20 20 77 69 64 74 68 20 3d     }.    width =
8ed0: 20 6d 65 6e 75 50 74 72 2d 3e 63 6f 6c 75 6d 6e   menuPtr->column
8ee0: 57 69 64 74 68 20 2a 20 6e 75 6d 43 6f 6c 75 6d  Width * numColum
8ef0: 6e 73 20 2b 20 32 2a 6d 65 6e 75 50 74 72 2d 3e  ns + 2*menuPtr->
8f00: 62 6f 72 64 65 72 57 69 64 74 68 3b 0a 20 20 20  borderWidth;.   
8f10: 20 68 65 69 67 68 74 20 3d 20 6d 65 6e 75 50 74   height = menuPt
8f20: 72 2d 3e 6e 75 6d 52 6f 77 73 20 2b 20 32 2a 6d  r->numRows + 2*m
8f30: 65 6e 75 50 74 72 2d 3e 62 6f 72 64 65 72 57 69  enuPtr->borderWi
8f40: 64 74 68 3b 0a 0a 20 20 20 20 69 66 20 28 28 77  dth;..    if ((w
8f50: 69 64 74 68 20 21 3d 20 54 6b 5f 52 65 71 57 69  idth != Tk_ReqWi
8f60: 64 74 68 28 6d 65 6e 75 50 74 72 2d 3e 74 6b 77  dth(menuPtr->tkw
8f70: 69 6e 29 29 20 7c 7c 0a 09 20 20 20 20 28 68 65  in)) ||..    (he
8f80: 69 67 68 74 20 21 3d 20 54 6b 5f 52 65 71 48 65  ight != Tk_ReqHe
8f90: 69 67 68 74 28 6d 65 6e 75 50 74 72 2d 3e 74 6b  ight(menuPtr->tk
8fa0: 77 69 6e 29 29 29 20 7b 0a 09 54 6b 5f 47 65 6f  win))) {..Tk_Geo
8fb0: 6d 65 74 72 79 52 65 71 75 65 73 74 28 6d 65 6e  metryRequest(men
8fc0: 75 50 74 72 2d 3e 74 6b 77 69 6e 2c 20 77 69 64  uPtr->tkwin, wid
8fd0: 74 68 2c 20 68 65 69 67 68 74 29 3b 0a 20 20 20  th, height);.   
8fe0: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20   } else {../*.. 
8ff0: 2a 20 4d 75 73 74 20 61 6c 77 61 79 73 20 66 6f  * Must always fo
9000: 72 63 65 20 61 20 72 65 64 69 73 70 6c 61 79 20  rce a redisplay 
9010: 68 65 72 65 20 69 66 20 74 68 65 20 77 69 6e 64  here if the wind
9020: 6f 77 20 69 73 20 6d 61 70 70 65 64 0a 09 20 2a  ow is mapped.. *
9030: 20 28 65 76 65 6e 20 69 66 20 74 68 65 20 73 69   (even if the si
9040: 7a 65 20 64 69 64 6e 27 74 20 63 68 61 6e 67 65  ze didn't change
9050: 2c 20 73 6f 6d 65 74 68 69 6e 67 20 65 6c 73 65  , something else
9060: 20 6d 69 67 68 74 20 68 61 76 65 0a 09 20 2a 20   might have.. * 
9070: 63 68 61 6e 67 65 64 20 69 6e 20 74 68 65 20 6d  changed in the m
9080: 65 6e 75 2c 20 73 75 63 68 20 61 73 20 61 20 6c  enu, such as a l
9090: 61 62 65 6c 20 6f 72 20 61 63 63 65 6c 65 72 61  abel or accelera
90a0: 74 6f 72 29 2e 20 20 54 68 65 0a 09 20 2a 20 72  tor).  The.. * r
90b0: 65 73 69 7a 65 20 77 69 6c 6c 20 66 6f 72 63 65  esize will force
90c0: 20 61 20 72 65 64 69 73 70 6c 61 79 20 61 62 6f   a redisplay abo
90d0: 76 65 2e 0a 09 20 2a 2f 0a 0a 09 45 76 65 6e 74  ve... */...Event
90e0: 75 61 6c 6c 79 52 65 64 72 61 77 4d 65 6e 75 28  uallyRedrawMenu(
90f0: 6d 65 6e 75 50 74 72 2c 20 28 4d 65 6e 75 45 6e  menuPtr, (MenuEn
9100: 74 72 79 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  try *) NULL);.  
9110: 20 20 7d 0a 0a 20 20 20 20 6d 65 6e 75 50 74 72    }..    menuPtr
9120: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 52 45 53 49  ->flags &= ~RESI
9130: 5a 45 5f 50 45 4e 44 49 4e 47 3b 0a 7d 0a 0c 0a  ZE_PENDING;.}...
9140: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
9150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
9190: 2a 20 44 69 73 70 6c 61 79 4d 65 6e 75 20 2d 2d  * DisplayMenu --
91a0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
91b0: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
91c0: 20 74 6f 20 64 69 73 70 6c 61 79 20 61 20 6d 65   to display a me
91d0: 6e 75 20 77 69 64 67 65 74 2e 0a 20 2a 0a 20 2a  nu widget.. *. *
91e0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
91f0: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  e.. *. * Side ef
9200: 66 65 63 74 73 3a 0a 20 2a 09 43 6f 6d 6d 61 6e  fects:. *.Comman
9210: 64 73 20 61 72 65 20 6f 75 74 70 75 74 20 74 6f  ds are output to
9220: 20 58 20 74 6f 20 64 69 73 70 6c 61 79 20 74 68   X to display th
9230: 65 20 6d 65 6e 75 20 69 6e 20 69 74 73 0a 20 2a  e menu in its. *
9240: 09 63 75 72 72 65 6e 74 20 6d 6f 64 65 2e 0a 20  .current mode.. 
9250: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
9260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
92a0: 73 74 61 74 69 63 20 76 6f 69 64 0a 44 69 73 70  static void.Disp
92b0: 6c 61 79 4d 65 6e 75 28 63 6c 69 65 6e 74 44 61  layMenu(clientDa
92c0: 74 61 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 61  ta).    ClientDa
92d0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 09 2f  ta clientData;./
92e0: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
92f0: 6f 75 74 20 77 69 64 67 65 74 2e 20 2a 2f 0a 7b  out widget. */.{
9300: 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 4d 65  .    register Me
9310: 6e 75 20 2a 6d 65 6e 75 50 74 72 20 3d 20 28 4d  nu *menuPtr = (M
9320: 65 6e 75 20 2a 29 20 63 6c 69 65 6e 74 44 61 74  enu *) clientDat
9330: 61 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20  a;.    register 
9340: 4d 65 6e 75 45 6e 74 72 79 20 2a 6d 65 50 74 72  MenuEntry *mePtr
9350: 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 54  ;.    register T
9360: 6b 5f 57 69 6e 64 6f 77 20 74 6b 77 69 6e 20 3d  k_Window tkwin =
9370: 20 6d 65 6e 75 50 74 72 2d 3e 74 6b 77 69 6e 3b   menuPtr->tkwin;
9380: 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 3b 0a  .    int index;.
9390: 20 20 20 20 69 6e 74 20 78 2c 20 79 2c 20 75 6e      int x, y, un
93a0: 64 65 72 6c 69 6e 65 58 3b 0a 20 20 20 20 43 74  derlineX;.    Ct
93b0: 6b 5f 53 74 79 6c 65 20 73 74 79 6c 65 3b 0a 20  k_Style style;. 
93c0: 20 20 20 69 6e 74 20 66 69 6c 6c 43 68 61 72 3b     int fillChar;
93d0: 0a 0a 20 20 20 20 69 66 20 28 28 6d 65 6e 75 50  ..    if ((menuP
93e0: 74 72 2d 3e 74 6b 77 69 6e 20 3d 3d 20 4e 55 4c  tr->tkwin == NUL
93f0: 4c 29 20 7c 7c 20 21 54 6b 5f 49 73 4d 61 70 70  L) || !Tk_IsMapp
9400: 65 64 28 74 6b 77 69 6e 29 29 20 7b 0a 09 67 6f  ed(tkwin)) {..go
9410: 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a  to done;.    }..
9420: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4c 6f      /*.     * Lo
9430: 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f  op through all o
9440: 66 20 74 68 65 20 65 6e 74 72 69 65 73 2c 20 64  f the entries, d
9450: 72 61 77 69 6e 67 20 74 68 65 6d 20 6f 6e 65 20  rawing them one 
9460: 61 74 20 61 20 74 69 6d 65 2e 0a 20 20 20 20 20  at a time..     
9470: 2a 2f 0a 0a 20 20 20 20 78 20 3d 20 79 20 3d 20  */..    x = y = 
9480: 6d 65 6e 75 50 74 72 2d 3e 62 6f 72 64 65 72 57  menuPtr->borderW
9490: 69 64 74 68 3b 0a 20 20 20 20 66 6f 72 20 28 69  idth;.    for (i
94a0: 6e 64 65 78 20 3d 20 30 3b 20 69 6e 64 65 78 20  ndex = 0; index 
94b0: 3c 20 6d 65 6e 75 50 74 72 2d 3e 6e 75 6d 45 6e  < menuPtr->numEn
94c0: 74 72 69 65 73 3b 20 69 6e 64 65 78 2b 2b 29 20  tries; index++) 
94d0: 7b 0a 09 6d 65 50 74 72 20 3d 20 6d 65 6e 75 50  {..mePtr = menuP
94e0: 74 72 2d 3e 65 6e 74 72 69 65 73 5b 69 6e 64 65  tr->entries[inde
94f0: 78 5d 3b 0a 09 69 66 20 28 28 6d 65 50 74 72 2d  x];..if ((mePtr-
9500: 3e 66 6c 61 67 73 20 26 20 45 4e 54 52 59 5f 4e  >flags & ENTRY_N
9510: 45 45 44 53 5f 52 45 44 49 53 50 4c 41 59 29 29  EEDS_REDISPLAY))
9520: 20 7b 0a 09 20 20 20 20 6d 65 50 74 72 2d 3e 66   {..    mePtr->f
9530: 6c 61 67 73 20 26 3d 20 7e 45 4e 54 52 59 5f 4e  lags &= ~ENTRY_N
9540: 45 45 44 53 5f 52 45 44 49 53 50 4c 41 59 3b 0a  EEDS_REDISPLAY;.
9550: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a  ..    /*..     *
9560: 20 46 69 6c 6c 20 42 61 63 6b 67 72 6f 75 6e 64   Fill Background
9570: 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20  ...     */...   
9580: 20 73 74 79 6c 65 20 3d 20 28 6d 65 50 74 72 2d   style = (mePtr-
9590: 3e 73 74 61 74 65 20 3d 3d 20 74 6b 44 69 73 61  >state == tkDisa
95a0: 62 6c 65 64 55 69 64 29 0a 09 09 20 20 20 20 3f  bledUid)...    ?
95b0: 20 43 54 4b 5f 44 49 53 41 42 4c 45 44 5f 53 54   CTK_DISABLED_ST
95c0: 59 4c 45 20 3a 20 43 54 4b 5f 50 4c 41 49 4e 5f  YLE : CTK_PLAIN_
95d0: 53 54 59 4c 45 3b 0a 09 20 20 20 20 69 66 20 28  STYLE;..    if (
95e0: 6d 65 50 74 72 2d 3e 74 79 70 65 20 3d 3d 20 53  mePtr->type == S
95f0: 45 50 41 52 41 54 4f 52 5f 45 4e 54 52 59 29 20  EPARATOR_ENTRY) 
9600: 7b 0a 09 09 66 69 6c 6c 43 68 61 72 20 3d 20 27  {...fillChar = '
9610: 2d 27 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20  -';..    } else 
9620: 69 66 20 28 6d 65 50 74 72 2d 3e 74 79 70 65 20  if (mePtr->type 
9630: 3d 3d 20 54 45 41 52 4f 46 46 5f 45 4e 54 52 59  == TEAROFF_ENTRY
9640: 29 20 7b 0a 09 09 66 69 6c 6c 43 68 61 72 20 3d  ) {...fillChar =
9650: 20 27 3d 27 3b 0a 09 20 20 20 20 7d 20 65 6c 73   '=';..    } els
9660: 65 20 7b 0a 09 09 66 69 6c 6c 43 68 61 72 20 3d  e {...fillChar =
9670: 20 27 20 27 3b 0a 09 20 20 20 20 7d 0a 09 20 20   ' ';..    }..  
9680: 20 20 43 74 6b 5f 46 69 6c 6c 52 65 63 74 28 74    Ctk_FillRect(t
9690: 6b 77 69 6e 2c 20 78 2c 20 79 2c 20 78 20 2b 20  kwin, x, y, x + 
96a0: 6d 65 6e 75 50 74 72 2d 3e 63 6f 6c 75 6d 6e 57  menuPtr->columnW
96b0: 69 64 74 68 2c 20 79 20 2b 20 31 2c 0a 09 09 20  idth, y + 1,... 
96c0: 20 20 20 73 74 79 6c 65 2c 20 66 69 6c 6c 43 68     style, fillCh
96d0: 61 72 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 6d  ar);...    if (m
96e0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 45 4e  ePtr->flags & EN
96f0: 54 52 59 5f 53 45 4c 45 43 54 45 44 29 20 7b 0a  TRY_SELECTED) {.
9700: 09 09 2f 2a 0a 09 09 20 2a 20 44 72 61 77 20 63  ../*... * Draw c
9710: 68 65 63 6b 2f 72 61 64 69 6f 2d 62 75 74 74 6f  heck/radio-butto
9720: 6e 20 69 6e 64 69 63 61 74 6f 72 2e 0a 09 09 20  n indicator.... 
9730: 2a 2f 0a 0a 09 09 43 74 6b 5f 44 72 61 77 43 68  */....Ctk_DrawCh
9740: 61 72 61 63 74 65 72 28 74 6b 77 69 6e 2c 20 78  aracter(tkwin, x
9750: 2c 20 79 2c 20 73 74 79 6c 65 2c 20 27 2a 27 29  , y, style, '*')
9760: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f  ;..    }...    /
9770: 2a 0a 09 20 20 20 20 20 2a 20 44 72 61 77 20 6c  *..     * Draw l
9780: 61 62 65 6c 20 66 6f 72 20 65 6e 74 72 79 2e 0a  abel for entry..
9790: 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69  .     */...    i
97a0: 66 20 28 6d 65 50 74 72 2d 3e 6c 61 62 65 6c 20  f (mePtr->label 
97b0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 54 6b 44  != NULL) {...TkD
97c0: 69 73 70 6c 61 79 43 68 61 72 73 28 74 6b 77 69  isplayChars(tkwi
97d0: 6e 2c 20 73 74 79 6c 65 2c 20 6d 65 50 74 72 2d  n, style, mePtr-
97e0: 3e 6c 61 62 65 6c 2c 20 6d 65 50 74 72 2d 3e 6c  >label, mePtr->l
97f0: 61 62 65 6c 4c 65 6e 67 74 68 2c 0a 09 09 09 78  abelLength,....x
9800: 20 2b 20 31 2c 20 79 2c 20 78 20 2b 20 31 2c 20   + 1, y, x + 1, 
9810: 54 4b 5f 4e 45 57 4c 49 4e 45 53 5f 4e 4f 54 5f  TK_NEWLINES_NOT_
9820: 53 50 45 43 49 41 4c 29 3b 0a 09 09 69 66 20 28  SPECIAL);...if (
9830: 6d 65 50 74 72 2d 3e 75 6e 64 65 72 6c 69 6e 65  mePtr->underline
9840: 20 3e 3d 20 30 29 20 7b 0a 0a 09 09 20 20 20 20   >= 0) {....    
9850: 28 76 6f 69 64 29 20 54 6b 4d 65 61 73 75 72 65  (void) TkMeasure
9860: 43 68 61 72 73 28 6d 65 50 74 72 2d 3e 6c 61 62  Chars(mePtr->lab
9870: 65 6c 2c 20 6d 65 50 74 72 2d 3e 75 6e 64 65 72  el, mePtr->under
9880: 6c 69 6e 65 2c 0a 09 09 09 20 20 20 20 78 20 2b  line,....    x +
9890: 20 31 2c 20 78 20 2b 20 6d 65 6e 75 50 74 72 2d   1, x + menuPtr-
98a0: 3e 63 6f 6c 75 6d 6e 57 69 64 74 68 2c 20 78 20  >columnWidth, x 
98b0: 2b 20 31 2c 0a 09 09 09 20 20 20 20 54 4b 5f 57  + 1,....    TK_W
98c0: 48 4f 4c 45 5f 57 4f 52 44 53 7c 54 4b 5f 41 54  HOLE_WORDS|TK_AT
98d0: 5f 4c 45 41 53 54 5f 4f 4e 45 2c 20 26 75 6e 64  _LEAST_ONE, &und
98e0: 65 72 6c 69 6e 65 58 29 3b 0a 09 09 20 20 20 20  erlineX);...    
98f0: 54 6b 44 69 73 70 6c 61 79 43 68 61 72 73 28 74  TkDisplayChars(t
9900: 6b 77 69 6e 2c 20 43 54 4b 5f 55 4e 44 45 52 4c  kwin, CTK_UNDERL
9910: 49 4e 45 5f 53 54 59 4c 45 2c 0a 09 09 09 20 20  INE_STYLE,....  
9920: 20 20 6d 65 50 74 72 2d 3e 6c 61 62 65 6c 20 2b    mePtr->label +
9930: 20 6d 65 50 74 72 2d 3e 75 6e 64 65 72 6c 69 6e   mePtr->underlin
9940: 65 2c 20 31 2c 0a 09 09 09 20 20 20 20 75 6e 64  e, 1,....    und
9950: 65 72 6c 69 6e 65 58 2c 20 79 2c 20 78 20 2b 20  erlineX, y, x + 
9960: 31 2c 0a 09 09 09 20 20 20 20 54 4b 5f 4e 45 57  1,....    TK_NEW
9970: 4c 49 4e 45 53 5f 4e 4f 54 5f 53 50 45 43 49 41  LINES_NOT_SPECIA
9980: 4c 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a  L);...}..    }..
9990: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
99a0: 44 72 61 77 20 61 63 63 65 6c 65 72 61 74 6f 72  Draw accelerator
99b0: 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20  ...     */...   
99c0: 20 69 66 20 28 6d 65 50 74 72 2d 3e 61 63 63 65   if (mePtr->acce
99d0: 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 54  l != NULL) {...T
99e0: 6b 44 69 73 70 6c 61 79 43 68 61 72 73 28 74 6b  kDisplayChars(tk
99f0: 77 69 6e 2c 20 73 74 79 6c 65 2c 0a 09 09 09 6d  win, style,....m
9a00: 65 50 74 72 2d 3e 61 63 63 65 6c 2c 20 6d 65 50  ePtr->accel, meP
9a10: 74 72 2d 3e 61 63 63 65 6c 4c 65 6e 67 74 68 2c  tr->accelLength,
9a20: 0a 09 09 09 78 20 2b 20 31 20 2b 20 6d 65 6e 75  ....x + 1 + menu
9a30: 50 74 72 2d 3e 6c 61 62 65 6c 57 69 64 74 68 2c  Ptr->labelWidth,
9a40: 20 79 2c 0a 09 09 09 78 20 2b 20 31 20 2b 20 6d   y,....x + 1 + m
9a50: 65 6e 75 50 74 72 2d 3e 6c 61 62 65 6c 57 69 64  enuPtr->labelWid
9a60: 74 68 2c 20 54 4b 5f 4e 45 57 4c 49 4e 45 53 5f  th, TK_NEWLINES_
9a70: 4e 4f 54 5f 53 50 45 43 49 41 4c 29 3b 0a 09 20  NOT_SPECIAL);.. 
9a80: 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 6d     }...    if (m
9a90: 65 50 74 72 2d 3e 74 79 70 65 20 3d 3d 20 43 41  ePtr->type == CA
9aa0: 53 43 41 44 45 5f 45 4e 54 52 59 29 20 7b 0a 09  SCADE_ENTRY) {..
9ab0: 09 2f 2a 0a 09 09 20 2a 20 44 72 61 77 20 63 61  ./*... * Draw ca
9ac0: 73 63 61 64 65 20 61 72 72 6f 77 2e 0a 09 09 20  scade arrow.... 
9ad0: 2a 2f 0a 0a 09 09 43 74 6b 5f 44 72 61 77 43 68  */....Ctk_DrawCh
9ae0: 61 72 61 63 74 65 72 28 74 6b 77 69 6e 2c 20 78  aracter(tkwin, x
9af0: 20 2b 20 6d 65 6e 75 50 74 72 2d 3e 63 6f 6c 75   + menuPtr->colu
9b00: 6d 6e 57 69 64 74 68 20 2d 20 31 2c 20 79 2c 0a  mnWidth - 1, y,.
9b10: 09 09 09 73 74 79 6c 65 2c 20 27 3e 27 29 3b 0a  ...style, '>');.
9b20: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20  .    }...    if 
9b30: 28 69 6e 64 65 78 20 3d 3d 20 6d 65 6e 75 50 74  (index == menuPt
9b40: 72 2d 3e 61 63 74 69 76 65 20 26 26 20 6d 65 6e  r->active && men
9b50: 75 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 47 4f  uPtr->flags & GO
9b60: 54 5f 46 4f 43 55 53 29 20 7b 0a 09 09 2f 2a 0a  T_FOCUS) {.../*.
9b70: 09 09 20 2a 20 50 6c 61 63 65 20 63 75 72 73 6f  .. * Place curso
9b80: 72 2e 0a 09 09 20 2a 2f 0a 0a 09 09 43 74 6b 5f  r.... */....Ctk_
9b90: 53 65 74 43 75 72 73 6f 72 28 74 6b 77 69 6e 2c  SetCursor(tkwin,
9ba0: 20 78 20 2b 20 31 2c 20 79 29 3b 0a 09 20 20 20   x + 1, y);..   
9bb0: 20 7d 0a 09 7d 0a 0a 09 79 20 2b 3d 20 31 3b 0a   }..}...y += 1;.
9bc0: 09 69 66 20 28 79 20 3d 3d 20 54 6b 5f 48 65 69  .if (y == Tk_Hei
9bd0: 67 68 74 28 74 6b 77 69 6e 29 20 2d 20 6d 65 6e  ght(tkwin) - men
9be0: 75 50 74 72 2d 3e 62 6f 72 64 65 72 57 69 64 74  uPtr->borderWidt
9bf0: 68 29 20 7b 0a 09 20 20 20 20 79 20 3d 20 6d 65  h) {..    y = me
9c00: 6e 75 50 74 72 2d 3e 62 6f 72 64 65 72 57 69 64  nuPtr->borderWid
9c10: 74 68 3b 0a 09 20 20 20 20 78 20 2b 3d 20 6d 65  th;..    x += me
9c20: 6e 75 50 74 72 2d 3e 63 6f 6c 75 6d 6e 57 69 64  nuPtr->columnWid
9c30: 74 68 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  th;..}.    }..  
9c40: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 44 72 61 77    /*.     * Draw
9c50: 20 62 6f 72 64 65 72 2c 20 69 66 20 6e 65 63 65   border, if nece
9c60: 73 73 61 72 79 2e 0a 20 20 20 20 20 2a 2f 0a 20  ssary..     */. 
9c70: 20 20 20 69 66 20 28 6d 65 6e 75 50 74 72 2d 3e     if (menuPtr->
9c80: 66 6c 61 67 73 20 26 20 42 4f 52 44 45 52 5f 4e  flags & BORDER_N
9c90: 45 45 44 45 44 29 20 7b 0a 09 43 74 6b 5f 44 72  EEDED) {..Ctk_Dr
9ca0: 61 77 42 6f 72 64 65 72 28 74 6b 77 69 6e 2c 20  awBorder(tkwin, 
9cb0: 43 54 4b 5f 50 4c 41 49 4e 5f 53 54 59 4c 45 2c  CTK_PLAIN_STYLE,
9cc0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
9cd0: 20 20 20 20 7d 0a 0a 20 20 20 20 64 6f 6e 65 3a      }..    done:
9ce0: 0a 20 20 20 20 6d 65 6e 75 50 74 72 2d 3e 66 6c  .    menuPtr->fl
9cf0: 61 67 73 20 26 3d 20 7e 28 42 4f 52 44 45 52 5f  ags &= ~(BORDER_
9d00: 4e 45 45 44 45 44 7c 52 45 44 52 41 57 5f 50 45  NEEDED|REDRAW_PE
9d10: 4e 44 49 4e 47 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  NDING);.}.../*. 
9d20: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
9d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
9d60: 20 2a 0a 20 2a 20 47 65 74 4d 65 6e 75 49 6e 64   *. * GetMenuInd
9d70: 65 78 20 2d 2d 0a 20 2a 0a 20 2a 09 50 61 72 73  ex --. *. *.Pars
9d80: 65 20 61 20 74 65 78 74 75 61 6c 20 69 6e 64 65  e a textual inde
9d90: 78 20 69 6e 74 6f 20 61 20 6d 65 6e 75 20 61 6e  x into a menu an
9da0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  d return the num
9db0: 65 72 69 63 61 6c 0a 20 2a 09 69 6e 64 65 78 20  erical. *.index 
9dc0: 6f 66 20 74 68 65 20 69 6e 64 69 63 61 74 65 64  of the indicated
9dd0: 20 65 6e 74 72 79 2e 0a 20 2a 0a 20 2a 20 52 65   entry.. *. * Re
9de0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
9df0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
9e00: 20 20 49 66 20 61 6c 6c 20 77 65 6e 74 20 77 65    If all went we
9e10: 6c 6c 2c 20 74 68 65 6e 20 2a 69 6e 64 65 78 50  ll, then *indexP
9e20: 74 72 20 69 73 0a 20 2a 09 66 69 6c 6c 65 64 20  tr is. *.filled 
9e30: 69 6e 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  in with the entr
9e40: 79 20 69 6e 64 65 78 20 63 6f 72 72 65 73 70 6f  y index correspo
9e50: 6e 64 69 6e 67 20 74 6f 20 73 74 72 69 6e 67 0a  nding to string.
9e60: 20 2a 09 28 72 61 6e 67 65 73 20 66 72 6f 6d 20   *.(ranges from 
9e70: 2d 31 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  -1 to the number
9e80: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
9e90: 68 65 20 6d 65 6e 75 20 6d 69 6e 75 73 0a 20 2a  he menu minus. *
9ea0: 09 6f 6e 65 29 2e 20 20 4f 74 68 65 72 77 69 73  .one).  Otherwis
9eb0: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
9ec0: 67 65 20 69 73 20 6c 65 66 74 20 69 6e 20 69 6e  ge is left in in
9ed0: 74 65 72 70 2d 3e 72 65 73 75 6c 74 2e 0a 20 2a  terp->result.. *
9ee0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
9ef0: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
9f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
9f40: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 47  */..static int.G
9f50: 65 74 4d 65 6e 75 49 6e 64 65 78 28 69 6e 74 65  etMenuIndex(inte
9f60: 72 70 2c 20 6d 65 6e 75 50 74 72 2c 20 73 74 72  rp, menuPtr, str
9f70: 69 6e 67 2c 20 6c 61 73 74 4f 4b 2c 20 69 6e 64  ing, lastOK, ind
9f80: 65 78 50 74 72 29 0a 20 20 20 20 54 63 6c 5f 49  exPtr).    Tcl_I
9f90: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 09 09  nterp *interp;..
9fa0: 2f 2a 20 46 6f 72 20 65 72 72 6f 72 20 6d 65 73  /* For error mes
9fb0: 73 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 4d 65  sages. */.    Me
9fc0: 6e 75 20 2a 6d 65 6e 75 50 74 72 3b 09 09 2f 2a  nu *menuPtr;../*
9fd0: 20 4d 65 6e 75 20 66 6f 72 20 77 68 69 63 68 20   Menu for which 
9fe0: 74 68 65 20 69 6e 64 65 78 20 69 73 20 62 65 69  the index is bei
9ff0: 6e 67 0a 09 09 09 09 20 2a 20 73 70 65 63 69 66  ng..... * specif
a000: 69 65 64 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72  ied. */.    char
a010: 20 2a 73 74 72 69 6e 67 3b 09 09 2f 2a 20 53 70   *string;../* Sp
a020: 65 63 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 61  ecification of a
a030: 6e 20 65 6e 74 72 79 20 69 6e 20 6d 65 6e 75 2e  n entry in menu.
a040: 20 20 53 65 65 0a 09 09 09 09 20 2a 20 6d 61 6e    See..... * man
a050: 75 61 6c 20 65 6e 74 72 79 20 66 6f 72 20 76 61  ual entry for va
a060: 6c 69 64 20 2e 2a 2f 0a 20 20 20 20 69 6e 74 20  lid .*/.    int 
a070: 6c 61 73 74 4f 4b 3b 09 09 09 2f 2a 20 4e 6f 6e  lastOK;.../* Non
a080: 2d 7a 65 72 6f 20 6d 65 61 6e 73 20 69 74 73 20  -zero means its 
a090: 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20 69 6e 64  OK to return ind
a0a0: 65 78 0a 09 09 09 09 20 2a 20 6a 75 73 74 20 2a  ex..... * just *
a0b0: 61 66 74 65 72 2a 20 6c 61 73 74 20 65 6e 74 72  after* last entr
a0c0: 79 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 69  y. */.    int *i
a0d0: 6e 64 65 78 50 74 72 3b 09 09 2f 2a 20 57 68 65  ndexPtr;../* Whe
a0e0: 72 65 20 74 6f 20 73 74 6f 72 65 20 63 6f 6e 76  re to store conv
a0f0: 65 72 74 65 64 20 72 65 6c 69 65 66 2e 20 2a 2f  erted relief. */
a100: 0a 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 79 3b  .{.    int i, y;
a110: 0a 0a 20 20 20 20 69 66 20 28 28 73 74 72 69 6e  ..    if ((strin
a120: 67 5b 30 5d 20 3d 3d 20 27 61 27 29 20 26 26 20  g[0] == 'a') && 
a130: 28 73 74 72 63 6d 70 28 73 74 72 69 6e 67 2c 20  (strcmp(string, 
a140: 22 61 63 74 69 76 65 22 29 20 3d 3d 20 30 29 29  "active") == 0))
a150: 20 7b 0a 09 2a 69 6e 64 65 78 50 74 72 20 3d 20   {..*indexPtr = 
a160: 6d 65 6e 75 50 74 72 2d 3e 61 63 74 69 76 65 3b  menuPtr->active;
a170: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  ..return TCL_OK;
a180: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
a190: 28 28 73 74 72 69 6e 67 5b 30 5d 20 3d 3d 20 27  ((string[0] == '
a1a0: 6c 27 29 20 26 26 20 28 73 74 72 63 6d 70 28 73  l') && (strcmp(s
a1b0: 74 72 69 6e 67 2c 20 22 6c 61 73 74 22 29 20 3d  tring, "last") =
a1c0: 3d 20 30 29 29 0a 09 7c 7c 20 28 28 73 74 72 69  = 0))..|| ((stri
a1d0: 6e 67 5b 30 5d 20 3d 3d 20 27 65 27 29 20 26 26  ng[0] == 'e') &&
a1e0: 20 28 73 74 72 63 6d 70 28 73 74 72 69 6e 67 2c   (strcmp(string,
a1f0: 20 22 65 6e 64 22 29 20 3d 3d 20 30 29 29 29 20   "end") == 0))) 
a200: 7b 0a 09 2a 69 6e 64 65 78 50 74 72 20 3d 20 6d  {..*indexPtr = m
a210: 65 6e 75 50 74 72 2d 3e 6e 75 6d 45 6e 74 72 69  enuPtr->numEntri
a220: 65 73 20 2d 20 28 28 6c 61 73 74 4f 4b 29 20 3f  es - ((lastOK) ?
a230: 20 30 20 3a 20 31 29 3b 0a 09 72 65 74 75 72 6e   0 : 1);..return
a240: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a   TCL_OK;.    }..
a250: 20 20 20 20 69 66 20 28 28 73 74 72 69 6e 67 5b      if ((string[
a260: 30 5d 20 3d 3d 20 27 6e 27 29 20 26 26 20 28 73  0] == 'n') && (s
a270: 74 72 63 6d 70 28 73 74 72 69 6e 67 2c 20 22 6e  trcmp(string, "n
a280: 6f 6e 65 22 29 20 3d 3d 20 30 29 29 20 7b 0a 09  one") == 0)) {..
a290: 2a 69 6e 64 65 78 50 74 72 20 3d 20 2d 31 3b 0a  *indexPtr = -1;.
a2a0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a  .return TCL_OK;.
a2b0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
a2c0: 74 72 69 6e 67 5b 30 5d 20 3d 3d 20 27 40 27 29  tring[0] == '@')
a2d0: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 57 69 74 68 20   {../*.. * With 
a2e0: 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20 6d 65 6e  multi-column men
a2f0: 75 73 20 49 20 72 65 61 6c 6c 79 20 6e 65 65 64  us I really need
a300: 20 62 6f 74 68 20 74 68 65 20 78 20 61 6e 64 20   both the x and 
a310: 79 0a 09 20 2a 20 63 6f 6f 72 64 69 6e 61 74 65  y.. * coordinate
a320: 73 20 68 65 72 65 20 2d 20 62 75 74 20 49 20 64  s here - but I d
a330: 6f 6e 27 74 20 74 68 69 6e 6b 20 61 6e 79 20 43  on't think any C
a340: 54 6b 20 73 70 65 63 69 66 69 63 0a 09 20 2a 20  Tk specific.. * 
a350: 61 70 70 73 20 6e 65 65 64 20 74 6f 20 73 70 65  apps need to spe
a360: 63 69 66 79 20 69 6e 64 65 78 65 73 20 74 68 69  cify indexes thi
a370: 73 20 77 61 79 20 61 6e 64 20 54 6b 20 6f 6e 6c  s way and Tk onl
a380: 79 20 75 73 65 73 0a 09 20 2a 20 6f 6e 65 20 63  y uses.. * one c
a390: 6f 6f 72 64 69 6e 61 74 65 2e 0a 09 20 2a 2f 0a  oordinate... */.
a3a0: 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74  ..if (Tcl_GetInt
a3b0: 28 69 6e 74 65 72 70 2c 20 73 74 72 69 6e 67 2b  (interp, string+
a3c0: 31 2c 20 20 26 79 29 20 3d 3d 20 54 43 4c 5f 4f  1,  &y) == TCL_O
a3d0: 4b 29 20 7b 0a 09 20 20 20 20 69 20 3d 20 79 20  K) {..    i = y 
a3e0: 2d 20 6d 65 6e 75 50 74 72 2d 3e 62 6f 72 64 65  - menuPtr->borde
a3f0: 72 57 69 64 74 68 3b 0a 09 20 20 20 20 69 66 20  rWidth;..    if 
a400: 28 69 20 3c 20 30 29 20 7b 0a 09 09 69 20 3d 20  (i < 0) {...i = 
a410: 30 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69  0;..    } else i
a420: 66 20 28 69 20 3e 3d 20 6d 65 6e 75 50 74 72 2d  f (i >= menuPtr-
a430: 3e 6e 75 6d 45 6e 74 72 69 65 73 29 20 7b 0a 09  >numEntries) {..
a440: 09 69 20 3d 20 6d 65 6e 75 50 74 72 2d 3e 6e 75  .i = menuPtr->nu
a450: 6d 45 6e 74 72 69 65 73 2d 31 3b 0a 09 20 20 20  mEntries-1;..   
a460: 20 7d 0a 09 20 20 20 20 2a 69 6e 64 65 78 50 74   }..    *indexPt
a470: 72 20 3d 20 69 3b 0a 09 20 20 20 20 72 65 74 75  r = i;..    retu
a480: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 7d 20 65 6c  rn TCL_OK;..} el
a490: 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65  se {..    Tcl_Se
a4a0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
a4b0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 20 54  (char *) NULL, T
a4c0: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 7d 0a 20  CL_STATIC);..}. 
a4d0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 73     }..    if (is
a4e0: 64 69 67 69 74 28 55 43 48 41 52 28 73 74 72 69  digit(UCHAR(stri
a4f0: 6e 67 5b 30 5d 29 29 29 20 7b 0a 09 69 66 20 28  ng[0]))) {..if (
a500: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
a510: 70 2c 20 73 74 72 69 6e 67 2c 20 20 26 69 29 20  p, string,  &i) 
a520: 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  == TCL_OK) {..  
a530: 20 20 69 66 20 28 69 20 3e 3d 20 6d 65 6e 75 50    if (i >= menuP
a540: 74 72 2d 3e 6e 75 6d 45 6e 74 72 69 65 73 29 20  tr->numEntries) 
a550: 7b 0a 09 09 69 66 20 28 6c 61 73 74 4f 4b 29 20  {...if (lastOK) 
a560: 7b 0a 09 09 20 20 20 20 69 20 3d 20 6d 65 6e 75  {...    i = menu
a570: 50 74 72 2d 3e 6e 75 6d 45 6e 74 72 69 65 73 3b  Ptr->numEntries;
a580: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20  ...} else {...  
a590: 20 20 69 20 3d 20 6d 65 6e 75 50 74 72 2d 3e 6e    i = menuPtr->n
a5a0: 75 6d 45 6e 74 72 69 65 73 20 2d 20 31 3b 0a 09  umEntries - 1;..
a5b0: 09 7d 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69  .}..    } else i
a5c0: 66 20 28 69 20 3c 20 30 29 20 7b 0a 09 09 69 20  f (i < 0) {...i 
a5d0: 3d 20 2d 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20  = -1;..    }..  
a5e0: 20 20 2a 69 6e 64 65 78 50 74 72 20 3d 20 69 3b    *indexPtr = i;
a5f0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
a600: 5f 4f 4b 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74  _OK;..}..Tcl_Set
a610: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
a620: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 20 54 43  char *) NULL, TC
a630: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  L_STATIC);.    }
a640: 0a 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30  ..    for (i = 0
a650: 3b 20 69 20 3c 20 6d 65 6e 75 50 74 72 2d 3e 6e  ; i < menuPtr->n
a660: 75 6d 45 6e 74 72 69 65 73 3b 20 69 2b 2b 29 20  umEntries; i++) 
a670: 7b 0a 09 63 68 61 72 20 2a 6c 61 62 65 6c 3b 0a  {..char *label;.
a680: 0a 09 6c 61 62 65 6c 20 3d 20 6d 65 6e 75 50 74  ..label = menuPt
a690: 72 2d 3e 65 6e 74 72 69 65 73 5b 69 5d 2d 3e 6c  r->entries[i]->l
a6a0: 61 62 65 6c 3b 0a 09 69 66 20 28 28 6c 61 62 65  abel;..if ((labe
a6b0: 6c 20 21 3d 20 4e 55 4c 4c 29 0a 09 09 26 26 20  l != NULL)...&& 
a6c0: 28 54 63 6c 5f 53 74 72 69 6e 67 4d 61 74 63 68  (Tcl_StringMatch
a6d0: 28 6d 65 6e 75 50 74 72 2d 3e 65 6e 74 72 69 65  (menuPtr->entrie
a6e0: 73 5b 69 5d 2d 3e 6c 61 62 65 6c 2c 20 73 74 72  s[i]->label, str
a6f0: 69 6e 67 29 29 29 20 7b 0a 09 20 20 20 20 2a 69  ing))) {..    *i
a700: 6e 64 65 78 50 74 72 20 3d 20 69 3b 0a 09 20 20  ndexPtr = i;..  
a710: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
a720: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  ..}.    }..    T
a730: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a740: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 6d 65 6e  interp, "bad men
a750: 75 20 65 6e 74 72 79 20 69 6e 64 65 78 20 5c 22  u entry index \"
a760: 22 2c 0a 09 20 20 20 20 73 74 72 69 6e 67 2c 20  ",..    string, 
a770: 22 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  "\"", (char *) N
a780: 55 4c 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ULL);.    return
a790: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0c 0a   TCL_ERROR;.}...
a7a0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
a7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a7e0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 6e 75 45 76  ---. *. * MenuEv
a7f0: 65 6e 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a  entProc --. *. *
a800: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
a810: 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68  is invoked by th
a820: 65 20 54 6b 20 64 69 73 70 61 74 63 68 65 72 20  e Tk dispatcher 
a830: 66 6f 72 20 76 61 72 69 6f 75 73 0a 20 2a 09 65  for various. *.e
a840: 76 65 6e 74 73 20 6f 6e 20 6d 65 6e 75 73 2e 0a  vents on menus..
a850: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
a860: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69  *.None.. *. * Si
a870: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 57  de effects:. *.W
a880: 68 65 6e 20 74 68 65 20 77 69 6e 64 6f 77 20 67  hen the window g
a890: 65 74 73 20 64 65 6c 65 74 65 64 2c 20 69 6e 74  ets deleted, int
a8a0: 65 72 6e 61 6c 20 73 74 72 75 63 74 75 72 65 73  ernal structures
a8b0: 20 67 65 74 0a 20 2a 09 63 6c 65 61 6e 65 64 20   get. *.cleaned 
a8c0: 75 70 2e 20 20 57 68 65 6e 20 69 74 20 67 65 74  up.  When it get
a8d0: 73 20 65 78 70 6f 73 65 64 2c 20 69 74 20 69 73  s exposed, it is
a8e0: 20 72 65 64 69 73 70 6c 61 79 65 64 2e 0a 20 2a   redisplayed.. *
a8f0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
a900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a930: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  -. */..static vo
a940: 69 64 0a 4d 65 6e 75 45 76 65 6e 74 50 72 6f 63  id.MenuEventProc
a950: 28 63 6c 69 65 6e 74 44 61 74 61 2c 20 65 76 65  (clientData, eve
a960: 6e 74 50 74 72 29 0a 20 20 20 20 43 6c 69 65 6e  ntPtr).    Clien
a970: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
a980: 3b 09 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e  ;./* Information
a990: 20 61 62 6f 75 74 20 77 69 6e 64 6f 77 2e 20 2a   about window. *
a9a0: 2f 0a 20 20 20 20 58 45 76 65 6e 74 20 2a 65 76  /.    XEvent *ev
a9b0: 65 6e 74 50 74 72 3b 09 09 2f 2a 20 49 6e 66 6f  entPtr;../* Info
a9c0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 65 76  rmation about ev
a9d0: 65 6e 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 4d 65  ent. */.{.    Me
a9e0: 6e 75 20 2a 6d 65 6e 75 50 74 72 20 3d 20 28 4d  nu *menuPtr = (M
a9f0: 65 6e 75 20 2a 29 20 63 6c 69 65 6e 74 44 61 74  enu *) clientDat
aa00: 61 3b 0a 20 20 20 20 69 66 20 28 65 76 65 6e 74  a;.    if (event
aa10: 50 74 72 2d 3e 74 79 70 65 20 3d 3d 20 43 54 4b  Ptr->type == CTK
aa20: 5f 45 58 50 4f 53 45 5f 45 56 45 4e 54 29 20 7b  _EXPOSE_EVENT) {
aa30: 0a 09 45 76 65 6e 74 75 61 6c 6c 79 52 65 64 72  ..EventuallyRedr
aa40: 61 77 4d 65 6e 75 28 6d 65 6e 75 50 74 72 2c 20  awMenu(menuPtr, 
aa50: 28 4d 65 6e 75 45 6e 74 72 79 20 2a 29 20 4e 55  (MenuEntry *) NU
aa60: 4c 4c 29 3b 0a 09 6d 65 6e 75 50 74 72 2d 3e 66  LL);..menuPtr->f
aa70: 6c 61 67 73 20 7c 3d 20 42 4f 52 44 45 52 5f 4e  lags |= BORDER_N
aa80: 45 45 44 45 44 3b 0a 20 20 20 20 7d 20 65 6c 73  EEDED;.    } els
aa90: 65 20 69 66 20 28 65 76 65 6e 74 50 74 72 2d 3e  e if (eventPtr->
aaa0: 74 79 70 65 20 3d 3d 20 43 54 4b 5f 44 45 53 54  type == CTK_DEST
aab0: 52 4f 59 5f 45 56 45 4e 54 29 20 7b 0a 09 69 66  ROY_EVENT) {..if
aac0: 20 28 6d 65 6e 75 50 74 72 2d 3e 74 6b 77 69 6e   (menuPtr->tkwin
aad0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
aae0: 20 6d 65 6e 75 50 74 72 2d 3e 74 6b 77 69 6e 20   menuPtr->tkwin 
aaf0: 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c  = NULL;..    Tcl
ab00: 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28 6d  _DeleteCommand(m
ab10: 65 6e 75 50 74 72 2d 3e 69 6e 74 65 72 70 2c 0a  enuPtr->interp,.
ab20: 09 09 20 20 20 20 54 63 6c 5f 47 65 74 43 6f 6d  ..    Tcl_GetCom
ab30: 6d 61 6e 64 4e 61 6d 65 28 6d 65 6e 75 50 74 72  mandName(menuPtr
ab40: 2d 3e 69 6e 74 65 72 70 2c 20 6d 65 6e 75 50 74  ->interp, menuPt
ab50: 72 2d 3e 77 69 64 67 65 74 43 6d 64 29 29 3b 0a  r->widgetCmd));.
ab60: 09 7d 0a 09 69 66 20 28 6d 65 6e 75 50 74 72 2d  .}..if (menuPtr-
ab70: 3e 66 6c 61 67 73 20 26 20 52 45 44 52 41 57 5f  >flags & REDRAW_
ab80: 50 45 4e 44 49 4e 47 29 20 7b 0a 09 20 20 20 20  PENDING) {..    
ab90: 54 63 6c 5f 43 61 6e 63 65 6c 49 64 6c 65 43 61  Tcl_CancelIdleCa
aba0: 6c 6c 28 44 69 73 70 6c 61 79 4d 65 6e 75 2c 20  ll(DisplayMenu, 
abb0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 6d 65 6e  (ClientData) men
abc0: 75 50 74 72 29 3b 0a 09 7d 0a 09 69 66 20 28 6d  uPtr);..}..if (m
abd0: 65 6e 75 50 74 72 2d 3e 66 6c 61 67 73 20 26 20  enuPtr->flags & 
abe0: 52 45 53 49 5a 45 5f 50 45 4e 44 49 4e 47 29 20  RESIZE_PENDING) 
abf0: 7b 0a 09 20 20 20 20 54 63 6c 5f 43 61 6e 63 65  {..    Tcl_Cance
ac00: 6c 49 64 6c 65 43 61 6c 6c 28 43 6f 6d 70 75 74  lIdleCall(Comput
ac10: 65 4d 65 6e 75 47 65 6f 6d 65 74 72 79 2c 20 28  eMenuGeometry, (
ac20: 43 6c 69 65 6e 74 44 61 74 61 29 20 6d 65 6e 75  ClientData) menu
ac30: 50 74 72 29 3b 0a 09 7d 0a 09 54 6b 5f 45 76 65  Ptr);..}..Tk_Eve
ac40: 6e 74 75 61 6c 6c 79 46 72 65 65 28 28 43 6c 69  ntuallyFree((Cli
ac50: 65 6e 74 44 61 74 61 29 20 6d 65 6e 75 50 74 72  entData) menuPtr
ac60: 2c 20 44 65 73 74 72 6f 79 4d 65 6e 75 29 3b 0a  , DestroyMenu);.
ac70: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 65      } else if (e
ac80: 76 65 6e 74 50 74 72 2d 3e 74 79 70 65 20 3d 3d  ventPtr->type ==
ac90: 20 43 54 4b 5f 46 4f 43 55 53 5f 45 56 45 4e 54   CTK_FOCUS_EVENT
aca0: 29 20 7b 0a 09 6d 65 6e 75 50 74 72 2d 3e 66 6c  ) {..menuPtr->fl
acb0: 61 67 73 20 7c 3d 20 47 4f 54 5f 46 4f 43 55 53  ags |= GOT_FOCUS
acc0: 3b 0a 09 69 66 20 28 6d 65 6e 75 50 74 72 2d 3e  ;..if (menuPtr->
acd0: 61 63 74 69 76 65 20 21 3d 20 2d 31 29 20 7b 0a  active != -1) {.
ace0: 09 20 20 20 20 45 76 65 6e 74 75 61 6c 6c 79 52  .    EventuallyR
acf0: 65 64 72 61 77 4d 65 6e 75 28 6d 65 6e 75 50 74  edrawMenu(menuPt
ad00: 72 2c 20 6d 65 6e 75 50 74 72 2d 3e 65 6e 74 72  r, menuPtr->entr
ad10: 69 65 73 5b 6d 65 6e 75 50 74 72 2d 3e 61 63 74  ies[menuPtr->act
ad20: 69 76 65 5d 29 3b 0a 09 7d 0a 20 20 20 20 7d 20  ive]);..}.    } 
ad30: 65 6c 73 65 20 69 66 20 28 65 76 65 6e 74 50 74  else if (eventPt
ad40: 72 2d 3e 74 79 70 65 20 3d 3d 20 43 54 4b 5f 55  r->type == CTK_U
ad50: 4e 46 4f 43 55 53 5f 45 56 45 4e 54 29 20 7b 0a  NFOCUS_EVENT) {.
ad60: 09 6d 65 6e 75 50 74 72 2d 3e 66 6c 61 67 73 20  .menuPtr->flags 
ad70: 26 3d 20 7e 47 4f 54 5f 46 4f 43 55 53 3b 0a 20  &= ~GOT_FOCUS;. 
ad80: 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d     }.}.../*. *--
ad90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ada0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
adb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
adc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
add0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 6e 75 43  ----. *. * MenuC
ade0: 6d 64 44 65 6c 65 74 65 64 50 72 6f 63 20 2d 2d  mdDeletedProc --
adf0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
ae00: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
ae10: 20 77 68 65 6e 20 61 20 77 69 64 67 65 74 20 63   when a widget c
ae20: 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65  ommand is delete
ae30: 64 2e 20 20 49 66 0a 20 2a 09 74 68 65 20 77 69  d.  If. *.the wi
ae40: 64 67 65 74 20 69 73 6e 27 74 20 61 6c 72 65 61  dget isn't alrea
ae50: 64 79 20 69 6e 20 74 68 65 20 70 72 6f 63 65 73  dy in the proces
ae60: 73 20 6f 66 20 62 65 69 6e 67 20 64 65 73 74 72  s of being destr
ae70: 6f 79 65 64 2c 0a 20 2a 09 74 68 69 73 20 63 6f  oyed,. *.this co
ae80: 6d 6d 61 6e 64 20 64 65 73 74 72 6f 79 73 20 69  mmand destroys i
ae90: 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  t.. *. * Results
aea0: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
aeb0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
aec0: 2a 09 54 68 65 20 77 69 64 67 65 74 20 69 73 20  *.The widget is 
aed0: 64 65 73 74 72 6f 79 65 64 2e 0a 20 2a 0a 20 2a  destroyed.. *. *
aee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af20: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
af30: 69 63 20 76 6f 69 64 0a 4d 65 6e 75 43 6d 64 44  ic void.MenuCmdD
af40: 65 6c 65 74 65 64 50 72 6f 63 28 63 6c 69 65 6e  eletedProc(clien
af50: 74 44 61 74 61 29 0a 20 20 20 20 43 6c 69 65 6e  tData).    Clien
af60: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
af70: 3b 09 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  ;./* Pointer to 
af80: 77 69 64 67 65 74 20 72 65 63 6f 72 64 20 66 6f  widget record fo
af90: 72 20 77 69 64 67 65 74 2e 20 2a 2f 0a 7b 0a 20  r widget. */.{. 
afa0: 20 20 20 4d 65 6e 75 20 2a 6d 65 6e 75 50 74 72     Menu *menuPtr
afb0: 20 3d 20 28 4d 65 6e 75 20 2a 29 20 63 6c 69 65   = (Menu *) clie
afc0: 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 6b 5f 57  ntData;.    Tk_W
afd0: 69 6e 64 6f 77 20 74 6b 77 69 6e 20 3d 20 6d 65  indow tkwin = me
afe0: 6e 75 50 74 72 2d 3e 74 6b 77 69 6e 3b 0a 0a 20  nuPtr->tkwin;.. 
aff0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 68 69     /*.     * Thi
b000: 73 20 70 72 6f 63 65 64 75 72 65 20 63 6f 75 6c  s procedure coul
b010: 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 69 74  d be invoked eit
b020: 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20  her because the 
b030: 77 69 6e 64 6f 77 20 77 61 73 0a 20 20 20 20 20  window was.     
b040: 2a 20 64 65 73 74 72 6f 79 65 64 20 61 6e 64 20  * destroyed and 
b050: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20  the command was 
b060: 74 68 65 6e 20 64 65 6c 65 74 65 64 20 28 69 6e  then deleted (in
b070: 20 77 68 69 63 68 20 63 61 73 65 20 74 6b 77 69   which case tkwi
b080: 6e 0a 20 20 20 20 20 2a 20 69 73 20 4e 55 4c 4c  n.     * is NULL
b090: 29 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  ) or because the
b0a0: 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 64 65 6c   command was del
b0b0: 65 74 65 64 2c 20 61 6e 64 20 74 68 65 6e 20 74  eted, and then t
b0c0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20  his procedure.  
b0d0: 20 20 20 2a 20 64 65 73 74 72 6f 79 73 20 74 68     * destroys th
b0e0: 65 20 77 69 64 67 65 74 2e 0a 20 20 20 20 20 2a  e widget..     *
b0f0: 2f 0a 0a 20 20 20 20 69 66 20 28 74 6b 77 69 6e  /..    if (tkwin
b100: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6d 65 6e   != NULL) {..men
b110: 75 50 74 72 2d 3e 74 6b 77 69 6e 20 3d 20 4e 55  uPtr->tkwin = NU
b120: 4c 4c 3b 0a 09 54 6b 5f 44 65 73 74 72 6f 79 57  LL;..Tk_DestroyW
b130: 69 6e 64 6f 77 28 74 6b 77 69 6e 29 3b 0a 20 20  indow(tkwin);.  
b140: 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d    }.}.../*. *---
b150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b190: 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 6e 75 4e 65  ---. *. * MenuNe
b1a0: 77 45 6e 74 72 79 20 2d 2d 0a 20 2a 0a 20 2a 09  wEntry --. *. *.
b1b0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 61  This procedure a
b1c0: 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 69 6e 69  llocates and ini
b1d0: 74 69 61 6c 69 7a 65 73 20 61 20 6e 65 77 20 6d  tializes a new m
b1e0: 65 6e 75 20 65 6e 74 72 79 2e 0a 20 2a 0a 20 2a  enu entry.. *. *
b1f0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65   Results:. *.The
b200: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
b210: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
b220: 6e 65 77 20 6d 65 6e 75 20 65 6e 74 72 79 20 73  new menu entry s
b230: 74 72 75 63 74 75 72 65 2c 0a 20 2a 09 77 68 69  tructure,. *.whi
b240: 63 68 20 68 61 73 20 62 65 65 6e 20 6d 61 6c 6c  ch has been mall
b250: 6f 63 2d 65 64 2c 20 69 6e 69 74 69 61 6c 69 7a  oc-ed, initializ
b260: 65 64 2c 20 61 6e 64 20 65 6e 74 65 72 65 64 20  ed, and entered 
b270: 69 6e 74 6f 20 74 68 65 0a 20 2a 09 65 6e 74 72  into the. *.entr
b280: 79 20 61 72 72 61 79 20 66 6f 72 20 74 68 65 20  y array for the 
b290: 20 6d 65 6e 75 2e 0a 20 2a 0a 20 2a 20 53 69 64   menu.. *. * Sid
b2a0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 74  e effects:. *.St
b2b0: 6f 72 61 67 65 20 67 65 74 73 20 61 6c 6c 6f 63  orage gets alloc
b2c0: 61 74 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ated.. *. *-----
b2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b310: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 4d 65  -. */..static Me
b320: 6e 75 45 6e 74 72 79 20 2a 0a 4d 65 6e 75 4e 65  nuEntry *.MenuNe
b330: 77 45 6e 74 72 79 28 6d 65 6e 75 50 74 72 2c 20  wEntry(menuPtr, 
b340: 69 6e 64 65 78 2c 20 74 79 70 65 29 0a 20 20 20  index, type).   
b350: 20 4d 65 6e 75 20 2a 6d 65 6e 75 50 74 72 3b 09   Menu *menuPtr;.
b360: 09 2f 2a 20 4d 65 6e 75 20 74 68 61 74 20 77 69  ./* Menu that wi
b370: 6c 6c 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20  ll hold the new 
b380: 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 20 20 69 6e  entry. */.    in
b390: 74 20 69 6e 64 65 78 3b 09 09 09 2f 2a 20 57 68  t index;.../* Wh
b3a0: 65 72 65 20 69 6e 20 74 68 65 20 6d 65 6e 75 20  ere in the menu 
b3b0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73  the new entry is
b3c0: 20 74 6f 0a 09 09 09 09 20 2a 20 67 6f 2e 20 2a   to..... * go. *
b3d0: 2f 0a 20 20 20 20 69 6e 74 20 74 79 70 65 3b 09  /.    int type;.
b3e0: 09 09 2f 2a 20 54 68 65 20 74 79 70 65 20 6f 66  ../* The type of
b3f0: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 2e 20   the new entry. 
b400: 2a 2f 0a 7b 0a 20 20 20 20 4d 65 6e 75 45 6e 74  */.{.    MenuEnt
b410: 72 79 20 2a 6d 65 50 74 72 3b 0a 20 20 20 20 4d  ry *mePtr;.    M
b420: 65 6e 75 45 6e 74 72 79 20 2a 2a 6e 65 77 45 6e  enuEntry **newEn
b430: 74 72 69 65 73 3b 0a 20 20 20 20 69 6e 74 20 69  tries;.    int i
b440: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
b450: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 61 72   Create a new ar
b460: 72 61 79 20 6f 66 20 65 6e 74 72 69 65 73 20 77  ray of entries w
b470: 69 74 68 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f  ith an empty slo
b480: 74 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a  t for the.     *
b490: 20 6e 65 77 20 65 6e 74 72 79 2e 0a 20 20 20 20   new entry..    
b4a0: 20 2a 2f 0a 0a 20 20 20 20 6e 65 77 45 6e 74 72   */..    newEntr
b4b0: 69 65 73 20 3d 20 28 4d 65 6e 75 45 6e 74 72 79  ies = (MenuEntry
b4c0: 20 2a 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e   **) ckalloc((un
b4d0: 73 69 67 6e 65 64 29 0a 09 20 20 20 20 28 28 6d  signed)..    ((m
b4e0: 65 6e 75 50 74 72 2d 3e 6e 75 6d 45 6e 74 72 69  enuPtr->numEntri
b4f0: 65 73 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6e  es+1)*sizeof(Men
b500: 75 45 6e 74 72 79 20 2a 29 29 29 3b 0a 20 20 20  uEntry *)));.   
b510: 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c   for (i = 0; i <
b520: 20 69 6e 64 65 78 3b 20 69 2b 2b 29 20 7b 0a 09   index; i++) {..
b530: 6e 65 77 45 6e 74 72 69 65 73 5b 69 5d 20 3d 20  newEntries[i] = 
b540: 6d 65 6e 75 50 74 72 2d 3e 65 6e 74 72 69 65 73  menuPtr->entries
b550: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  [i];.    }.    f
b560: 6f 72 20 28 20 20 3b 20 69 20 3c 20 6d 65 6e 75  or (  ; i < menu
b570: 50 74 72 2d 3e 6e 75 6d 45 6e 74 72 69 65 73 3b  Ptr->numEntries;
b580: 20 69 2b 2b 29 20 7b 0a 09 6e 65 77 45 6e 74 72   i++) {..newEntr
b590: 69 65 73 5b 69 2b 31 5d 20 3d 20 6d 65 6e 75 50  ies[i+1] = menuP
b5a0: 74 72 2d 3e 65 6e 74 72 69 65 73 5b 69 5d 3b 0a  tr->entries[i];.
b5b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6d 65      }.    if (me
b5c0: 6e 75 50 74 72 2d 3e 6e 75 6d 45 6e 74 72 69 65  nuPtr->numEntrie
b5d0: 73 20 21 3d 20 30 29 20 7b 0a 09 63 6b 66 72 65  s != 0) {..ckfre
b5e0: 65 28 28 63 68 61 72 20 2a 29 20 6d 65 6e 75 50  e((char *) menuP
b5f0: 74 72 2d 3e 65 6e 74 72 69 65 73 29 3b 0a 20 20  tr->entries);.  
b600: 20 20 7d 0a 20 20 20 20 6d 65 6e 75 50 74 72 2d    }.    menuPtr-
b610: 3e 65 6e 74 72 69 65 73 20 3d 20 6e 65 77 45 6e  >entries = newEn
b620: 74 72 69 65 73 3b 0a 20 20 20 20 6d 65 6e 75 50  tries;.    menuP
b630: 74 72 2d 3e 6e 75 6d 45 6e 74 72 69 65 73 2b 2b  tr->numEntries++
b640: 3b 0a 20 20 20 20 6d 65 6e 75 50 74 72 2d 3e 65  ;.    menuPtr->e
b650: 6e 74 72 69 65 73 5b 69 6e 64 65 78 5d 20 3d 20  ntries[index] = 
b660: 6d 65 50 74 72 20 3d 20 28 4d 65 6e 75 45 6e 74  mePtr = (MenuEnt
b670: 72 79 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 73 69  ry *) ckalloc(si
b680: 7a 65 6f 66 28 4d 65 6e 75 45 6e 74 72 79 29 29  zeof(MenuEntry))
b690: 3b 0a 20 20 20 20 6d 65 50 74 72 2d 3e 74 79 70  ;.    mePtr->typ
b6a0: 65 20 3d 20 74 79 70 65 3b 0a 20 20 20 20 6d 65  e = type;.    me
b6b0: 50 74 72 2d 3e 6d 65 6e 75 50 74 72 20 3d 20 6d  Ptr->menuPtr = m
b6c0: 65 6e 75 50 74 72 3b 0a 20 20 20 20 6d 65 50 74  enuPtr;.    mePt
b6d0: 72 2d 3e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b  r->label = NULL;
b6e0: 0a 20 20 20 20 6d 65 50 74 72 2d 3e 6c 61 62 65  .    mePtr->labe
b6f0: 6c 4c 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20 20  lLength = 0;.   
b700: 20 6d 65 50 74 72 2d 3e 75 6e 64 65 72 6c 69 6e   mePtr->underlin
b710: 65 20 3d 20 2d 31 3b 0a 20 20 20 20 6d 65 50 74  e = -1;.    mePt
b720: 72 2d 3e 61 63 63 65 6c 20 3d 20 4e 55 4c 4c 3b  r->accel = NULL;
b730: 0a 20 20 20 20 6d 65 50 74 72 2d 3e 61 63 63 65  .    mePtr->acce
b740: 6c 4c 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20 20  lLength = 0;.   
b750: 20 6d 65 50 74 72 2d 3e 73 74 61 74 65 20 3d 20   mePtr->state = 
b760: 74 6b 4e 6f 72 6d 61 6c 55 69 64 3b 0a 20 20 20  tkNormalUid;.   
b770: 20 6d 65 50 74 72 2d 3e 69 6e 64 69 63 61 74 6f   mePtr->indicato
b780: 72 4f 6e 20 3d 20 31 3b 0a 20 20 20 20 6d 65 50  rOn = 1;.    meP
b790: 74 72 2d 3e 63 6f 6d 6d 61 6e 64 20 3d 20 4e 55  tr->command = NU
b7a0: 4c 4c 3b 0a 20 20 20 20 6d 65 50 74 72 2d 3e 6e  LL;.    mePtr->n
b7b0: 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ame = NULL;.    
b7c0: 6d 65 50 74 72 2d 3e 6f 6e 56 61 6c 75 65 20 3d  mePtr->onValue =
b7d0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 6d 65 50 74 72   NULL;.    mePtr
b7e0: 2d 3e 6f 66 66 56 61 6c 75 65 20 3d 20 4e 55 4c  ->offValue = NUL
b7f0: 4c 3b 0a 20 20 20 20 6d 65 50 74 72 2d 3e 66 6c  L;.    mePtr->fl
b800: 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ags = 0;.    ret
b810: 75 72 6e 20 6d 65 50 74 72 3b 0a 7d 0a 0c 0a 2f  urn mePtr;.}.../
b820: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
b830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
b870: 20 4d 65 6e 75 41 64 64 4f 72 49 6e 73 65 72 74   MenuAddOrInsert
b880: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
b890: 72 6f 63 65 64 75 72 65 20 64 6f 65 73 20 61 6c  rocedure does al
b8a0: 6c 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66  l of the work of
b8b0: 20 74 68 65 20 22 61 64 64 22 20 61 6e 64 20 22   the "add" and "
b8c0: 69 6e 73 65 72 74 22 0a 20 2a 09 77 69 64 67 65  insert". *.widge
b8d0: 74 20 63 6f 6d 6d 61 6e 64 73 2c 20 61 6c 6c 6f  t commands, allo
b8e0: 77 69 6e 67 20 74 68 65 20 63 6f 64 65 20 66 6f  wing the code fo
b8f0: 72 20 74 68 65 73 65 20 74 6f 20 62 65 20 73 68  r these to be sh
b900: 61 72 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  ared.. *. * Resu
b910: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
b920: 72 64 20 54 63 6c 20 72 65 74 75 72 6e 20 76 61  rd Tcl return va
b930: 6c 75 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  lue.. *. * Side 
b940: 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 20 6e 65  effects:. *.A ne
b950: 77 20 6d 65 6e 75 20 65 6e 74 72 79 20 69 73 20  w menu entry is 
b960: 63 72 65 61 74 65 64 20 69 6e 20 6d 65 6e 75 50  created in menuP
b970: 74 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  tr.. *. *-------
b980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
b9c0: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a   */..static int.
b9d0: 4d 65 6e 75 41 64 64 4f 72 49 6e 73 65 72 74 28  MenuAddOrInsert(
b9e0: 69 6e 74 65 72 70 2c 20 6d 65 6e 75 50 74 72 2c  interp, menuPtr,
b9f0: 20 69 6e 64 65 78 53 74 72 69 6e 67 2c 20 61 72   indexString, ar
ba00: 67 63 2c 20 61 72 67 76 29 0a 20 20 20 20 54 63  gc, argv).    Tc
ba10: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
ba20: 3b 09 09 09 2f 2a 20 55 73 65 64 20 66 6f 72 20  ;.../* Used for 
ba30: 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 2e  error reporting.
ba40: 20 2a 2f 0a 20 20 20 20 4d 65 6e 75 20 2a 6d 65   */.    Menu *me
ba50: 6e 75 50 74 72 3b 09 09 09 2f 2a 20 57 69 64 67  nuPtr;.../* Widg
ba60: 65 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 63  et in which to c
ba70: 72 65 61 74 65 20 6e 65 77 0a 09 09 09 09 09 20  reate new...... 
ba80: 2a 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 20 20  * entry. */.    
ba90: 63 68 61 72 20 2a 69 6e 64 65 78 53 74 72 69 6e  char *indexStrin
baa0: 67 3b 09 09 09 2f 2a 20 53 74 72 69 6e 67 20 64  g;.../* String d
bab0: 65 73 63 72 69 62 69 6e 67 20 69 6e 64 65 78 20  escribing index 
bac0: 61 74 20 77 68 69 63 68 0a 09 09 09 09 09 20 2a  at which...... *
bad0: 20 74 6f 20 69 6e 73 65 72 74 2e 20 20 4e 55 4c   to insert.  NUL
bae0: 4c 20 6d 65 61 6e 73 20 69 6e 73 65 72 74 20 61  L means insert a
baf0: 74 0a 09 09 09 09 09 20 2a 20 65 6e 64 2e 20 2a  t...... * end. *
bb00: 2f 0a 20 20 20 20 69 6e 74 20 61 72 67 63 3b 09  /.    int argc;.
bb10: 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  .../* Number of 
bb20: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 72 67 76  elements in argv
bb30: 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a  . */.    char **
bb40: 61 72 67 76 3b 09 09 09 2f 2a 20 41 72 67 75 6d  argv;.../* Argum
bb50: 65 6e 74 73 20 74 6f 20 63 6f 6d 6d 61 6e 64 3a  ents to command:
bb60: 20 20 66 69 72 73 74 20 61 72 67 0a 09 09 09 09    first arg.....
bb70: 09 20 2a 20 69 73 20 74 79 70 65 20 6f 66 20 65  . * is type of e
bb80: 6e 74 72 79 2c 20 6f 74 68 65 72 73 20 61 72 65  ntry, others are
bb90: 0a 09 09 09 09 09 20 2a 20 63 6f 6e 66 69 67 20  ...... * config 
bba0: 6f 70 74 69 6f 6e 73 2e 20 2a 2f 0a 7b 0a 20 20  options. */.{.  
bbb0: 20 20 69 6e 74 20 63 2c 20 74 79 70 65 2c 20 69    int c, type, i
bbc0: 2c 20 69 6e 64 65 78 3b 0a 20 20 20 20 73 69 7a  , index;.    siz
bbd0: 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 20 20 20 20  e_t length;.    
bbe0: 4d 65 6e 75 45 6e 74 72 79 20 2a 6d 65 50 74 72  MenuEntry *mePtr
bbf0: 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 64 65 78  ;..    if (index
bc00: 53 74 72 69 6e 67 20 21 3d 20 4e 55 4c 4c 29 20  String != NULL) 
bc10: 7b 0a 09 69 66 20 28 47 65 74 4d 65 6e 75 49 6e  {..if (GetMenuIn
bc20: 64 65 78 28 69 6e 74 65 72 70 2c 20 6d 65 6e 75  dex(interp, menu
bc30: 50 74 72 2c 20 69 6e 64 65 78 53 74 72 69 6e 67  Ptr, indexString
bc40: 2c 20 31 2c 20 26 69 6e 64 65 78 29 20 21 3d 20  , 1, &index) != 
bc50: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72  TCL_OK) {..    r
bc60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
bc70: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..}.    } else {
bc80: 0a 09 69 6e 64 65 78 20 3d 20 6d 65 6e 75 50 74  ..index = menuPt
bc90: 72 2d 3e 6e 75 6d 45 6e 74 72 69 65 73 3b 0a 20  r->numEntries;. 
bca0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 69 6e 64     }.    if (ind
bcb0: 65 78 20 3c 20 30 29 20 7b 0a 09 54 63 6c 5f 41  ex < 0) {..Tcl_A
bcc0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
bcd0: 72 70 2c 20 22 62 61 64 20 69 6e 64 65 78 20 5c  rp, "bad index \
bce0: 22 22 2c 20 69 6e 64 65 78 53 74 72 69 6e 67 2c  "", indexString,
bcf0: 20 22 5c 22 22 2c 0a 09 09 20 28 63 68 61 72 20   "\"",... (char 
bd00: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
bd10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
bd20: 20 7d 0a 20 20 20 20 69 66 20 28 6d 65 6e 75 50   }.    if (menuP
bd30: 74 72 2d 3e 74 65 61 72 4f 66 66 20 26 26 20 28  tr->tearOff && (
bd40: 69 6e 64 65 78 20 3d 3d 20 30 29 29 20 7b 0a 09  index == 0)) {..
bd50: 69 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 7d  index = 1;.    }
bd60: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
bd70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 74  Figure out the t
bd80: 79 70 65 20 6f 66 20 74 68 65 20 6e 65 77 20 65  ype of the new e
bd90: 6e 74 72 79 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  ntry..     */.. 
bda0: 20 20 20 63 20 3d 20 61 72 67 76 5b 30 5d 5b 30     c = argv[0][0
bdb0: 5d 3b 0a 20 20 20 20 6c 65 6e 67 74 68 20 3d 20  ];.    length = 
bdc0: 73 74 72 6c 65 6e 28 61 72 67 76 5b 30 5d 29 3b  strlen(argv[0]);
bdd0: 0a 20 20 20 20 69 66 20 28 28 63 20 3d 3d 20 27  .    if ((c == '
bde0: 63 27 29 20 26 26 20 28 73 74 72 6e 63 6d 70 28  c') && (strncmp(
bdf0: 61 72 67 76 5b 30 5d 2c 20 22 63 61 73 63 61 64  argv[0], "cascad
be00: 65 22 2c 20 6c 65 6e 67 74 68 29 20 3d 3d 20 30  e", length) == 0
be10: 29 0a 09 20 20 20 20 26 26 20 28 6c 65 6e 67 74  )..    && (lengt
be20: 68 20 3e 3d 20 32 29 29 20 7b 0a 09 74 79 70 65  h >= 2)) {..type
be30: 20 3d 20 43 41 53 43 41 44 45 5f 45 4e 54 52 59   = CASCADE_ENTRY
be40: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
be50: 28 28 63 20 3d 3d 20 27 63 27 29 20 26 26 20 28  ((c == 'c') && (
be60: 73 74 72 6e 63 6d 70 28 61 72 67 76 5b 30 5d 2c  strncmp(argv[0],
be70: 20 22 63 68 65 63 6b 62 75 74 74 6f 6e 22 2c 20   "checkbutton", 
be80: 6c 65 6e 67 74 68 29 20 3d 3d 20 30 29 0a 09 20  length) == 0).. 
be90: 20 20 20 26 26 20 28 6c 65 6e 67 74 68 20 3e 3d     && (length >=
bea0: 20 32 29 29 20 7b 0a 09 74 79 70 65 20 3d 20 43   2)) {..type = C
beb0: 48 45 43 4b 5f 42 55 54 54 4f 4e 5f 45 4e 54 52  HECK_BUTTON_ENTR
bec0: 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  Y;.    } else if
bed0: 20 28 28 63 20 3d 3d 20 27 63 27 29 20 26 26 20   ((c == 'c') && 
bee0: 28 73 74 72 6e 63 6d 70 28 61 72 67 76 5b 30 5d  (strncmp(argv[0]
bef0: 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 6c 65 6e  , "command", len
bf00: 67 74 68 29 20 3d 3d 20 30 29 0a 09 20 20 20 20  gth) == 0)..    
bf10: 26 26 20 28 6c 65 6e 67 74 68 20 3e 3d 20 32 29  && (length >= 2)
bf20: 29 20 7b 0a 09 74 79 70 65 20 3d 20 43 4f 4d 4d  ) {..type = COMM
bf30: 41 4e 44 5f 45 4e 54 52 59 3b 0a 20 20 20 20 7d  AND_ENTRY;.    }
bf40: 20 65 6c 73 65 20 69 66 20 28 28 63 20 3d 3d 20   else if ((c == 
bf50: 27 72 27 29 0a 09 20 20 20 20 26 26 20 28 73 74  'r')..    && (st
bf60: 72 6e 63 6d 70 28 61 72 67 76 5b 30 5d 2c 20 22  rncmp(argv[0], "
bf70: 72 61 64 69 6f 62 75 74 74 6f 6e 22 2c 20 6c 65  radiobutton", le
bf80: 6e 67 74 68 29 20 3d 3d 20 30 29 29 20 7b 0a 09  ngth) == 0)) {..
bf90: 74 79 70 65 20 3d 20 52 41 44 49 4f 5f 42 55 54  type = RADIO_BUT
bfa0: 54 4f 4e 5f 45 4e 54 52 59 3b 0a 20 20 20 20 7d  TON_ENTRY;.    }
bfb0: 20 65 6c 73 65 20 69 66 20 28 28 63 20 3d 3d 20   else if ((c == 
bfc0: 27 73 27 29 0a 09 20 20 20 20 26 26 20 28 73 74  's')..    && (st
bfd0: 72 6e 63 6d 70 28 61 72 67 76 5b 30 5d 2c 20 22  rncmp(argv[0], "
bfe0: 73 65 70 61 72 61 74 6f 72 22 2c 20 6c 65 6e 67  separator", leng
bff0: 74 68 29 20 3d 3d 20 30 29 29 20 7b 0a 09 74 79  th) == 0)) {..ty
c000: 70 65 20 3d 20 53 45 50 41 52 41 54 4f 52 5f 45  pe = SEPARATOR_E
c010: 4e 54 52 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65  NTRY;.    } else
c020: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
c030: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
c040: 64 20 6d 65 6e 75 20 65 6e 74 72 79 20 74 79 70  d menu entry typ
c050: 65 20 5c 22 22 2c 0a 09 09 61 72 67 76 5b 30 5d  e \"",...argv[0]
c060: 2c 20 22 5c 22 3a 20 20 6d 75 73 74 20 62 65 20  , "\":  must be 
c070: 63 61 73 63 61 64 65 2c 20 63 68 65 63 6b 62 75  cascade, checkbu
c080: 74 74 6f 6e 2c 20 22 2c 0a 09 09 22 63 6f 6d 6d  tton, ",..."comm
c090: 61 6e 64 2c 20 72 61 64 69 6f 62 75 74 74 6f 6e  and, radiobutton
c0a0: 2c 20 6f 72 20 73 65 70 61 72 61 74 6f 72 22 2c  , or separator",
c0b0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
c0c0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
c0d0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  OR;.    }.    me
c0e0: 50 74 72 20 3d 20 4d 65 6e 75 4e 65 77 45 6e 74  Ptr = MenuNewEnt
c0f0: 72 79 28 6d 65 6e 75 50 74 72 2c 20 69 6e 64 65  ry(menuPtr, inde
c100: 78 2c 20 74 79 70 65 29 3b 0a 20 20 20 20 69 66  x, type);.    if
c110: 20 28 43 6f 6e 66 69 67 75 72 65 4d 65 6e 75 45   (ConfigureMenuE
c120: 6e 74 72 79 28 69 6e 74 65 72 70 2c 20 6d 65 6e  ntry(interp, men
c130: 75 50 74 72 2c 20 6d 65 50 74 72 2c 20 69 6e 64  uPtr, mePtr, ind
c140: 65 78 2c 0a 09 20 20 20 20 61 72 67 63 2d 31 2c  ex,..    argc-1,
c150: 20 61 72 67 76 2b 31 2c 20 30 29 20 21 3d 20 54   argv+1, 0) != T
c160: 43 4c 5f 4f 4b 29 20 7b 0a 09 44 65 73 74 72 6f  CL_OK) {..Destro
c170: 79 4d 65 6e 75 45 6e 74 72 79 28 28 43 6c 69 65  yMenuEntry((Clie
c180: 6e 74 44 61 74 61 29 20 6d 65 50 74 72 29 3b 0a  ntData) mePtr);.
c190: 09 66 6f 72 20 28 69 20 3d 20 69 6e 64 65 78 2b  .for (i = index+
c1a0: 31 3b 20 69 20 3c 20 6d 65 6e 75 50 74 72 2d 3e  1; i < menuPtr->
c1b0: 6e 75 6d 45 6e 74 72 69 65 73 3b 20 69 2b 2b 29  numEntries; i++)
c1c0: 20 7b 0a 09 20 20 20 20 6d 65 6e 75 50 74 72 2d   {..    menuPtr-
c1d0: 3e 65 6e 74 72 69 65 73 5b 69 2d 31 5d 20 3d 20  >entries[i-1] = 
c1e0: 6d 65 6e 75 50 74 72 2d 3e 65 6e 74 72 69 65 73  menuPtr->entries
c1f0: 5b 69 5d 3b 0a 09 7d 0a 09 6d 65 6e 75 50 74 72  [i];..}..menuPtr
c200: 2d 3e 6e 75 6d 45 6e 74 72 69 65 73 2d 2d 3b 0a  ->numEntries--;.
c210: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
c220: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  R;.    }.    ret
c230: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a  urn TCL_OK;.}...
c240: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
c250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c280: 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 6e 75 56 61  ---. *. * MenuVa
c290: 72 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54  rProc --. *. *.T
c2a0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
c2b0: 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 73 6f   invoked when so
c2c0: 6d 65 6f 6e 65 20 63 68 61 6e 67 65 73 20 74 68  meone changes th
c2d0: 65 0a 20 2a 09 73 74 61 74 65 20 76 61 72 69 61  e. *.state varia
c2e0: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
c2f0: 69 74 68 20 61 20 72 61 64 69 6f 62 75 74 74 6f  ith a radiobutto
c300: 6e 20 6f 72 20 63 68 65 63 6b 62 75 74 74 6f 6e  n or checkbutton
c310: 0a 20 2a 09 6d 65 6e 75 20 65 6e 74 72 79 2e 20  . *.menu entry. 
c320: 20 54 68 65 20 65 6e 74 72 79 27 73 20 73 65 6c   The entry's sel
c330: 65 63 74 65 64 20 73 74 61 74 65 20 69 73 20 73  ected state is s
c340: 65 74 20 74 6f 20 6d 61 74 63 68 0a 20 2a 09 74  et to match. *.t
c350: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
c360: 76 61 72 69 61 62 6c 65 2e 0a 20 2a 0a 20 2a 20  variable.. *. * 
c370: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 55 4c 4c  Results:. *.NULL
c380: 20 69 73 20 61 6c 77 61 79 73 20 72 65 74 75 72   is always retur
c390: 6e 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ned.. *. * Side 
c3a0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20  effects:. *.The 
c3b0: 6d 65 6e 75 20 65 6e 74 72 79 20 6d 61 79 20 62  menu entry may b
c3c0: 65 63 6f 6d 65 20 73 65 6c 65 63 74 65 64 20 6f  ecome selected o
c3d0: 72 20 64 65 73 65 6c 65 63 74 65 64 2e 0a 20 2a  r deselected.. *
c3e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
c3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c420: 2d 0a 20 2a 2f 0a 0a 09 2f 2a 20 41 52 47 53 55  -. */.../* ARGSU
c430: 53 45 44 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  SED */.static ch
c440: 61 72 20 2a 0a 4d 65 6e 75 56 61 72 50 72 6f 63  ar *.MenuVarProc
c450: 28 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74  (clientData, int
c460: 65 72 70 2c 20 6e 61 6d 65 31 2c 20 6e 61 6d 65  erp, name1, name
c470: 32 2c 20 66 6c 61 67 73 29 0a 20 20 20 20 43 6c  2, flags).    Cl
c480: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
c490: 61 74 61 3b 09 2f 2a 20 49 6e 66 6f 72 6d 61 74  ata;./* Informat
c4a0: 69 6f 6e 20 61 62 6f 75 74 20 6d 65 6e 75 20 65  ion about menu e
c4b0: 6e 74 72 79 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  ntry. */.    Tcl
c4c0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
c4d0: 09 09 2f 2a 20 49 6e 74 65 72 70 72 65 74 65 72  ../* Interpreter
c4e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69   containing vari
c4f0: 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 63 68 61  able. */.    cha
c500: 72 20 2a 6e 61 6d 65 31 3b 09 09 2f 2a 20 46 69  r *name1;../* Fi
c510: 72 73 74 20 70 61 72 74 20 6f 66 20 76 61 72 69  rst part of vari
c520: 61 62 6c 65 27 73 20 6e 61 6d 65 2e 20 2a 2f 0a  able's name. */.
c530: 20 20 20 20 63 68 61 72 20 2a 6e 61 6d 65 32 3b      char *name2;
c540: 09 09 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74  ../* Second part
c550: 20 6f 66 20 76 61 72 69 61 62 6c 65 27 73 20 6e   of variable's n
c560: 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ame. */.    int 
c570: 66 6c 61 67 73 3b 09 09 09 2f 2a 20 44 65 73 63  flags;.../* Desc
c580: 72 69 62 65 73 20 77 68 61 74 20 6a 75 73 74 20  ribes what just 
c590: 68 61 70 70 65 6e 65 64 2e 20 2a 2f 0a 7b 0a 20  happened. */.{. 
c5a0: 20 20 20 4d 65 6e 75 45 6e 74 72 79 20 2a 6d 65     MenuEntry *me
c5b0: 50 74 72 20 3d 20 28 4d 65 6e 75 45 6e 74 72 79  Ptr = (MenuEntry
c5c0: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a   *) clientData;.
c5d0: 20 20 20 20 4d 65 6e 75 20 2a 6d 65 6e 75 50 74      Menu *menuPt
c5e0: 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 76 61 6c  r;.    char *val
c5f0: 75 65 3b 0a 0a 20 20 20 20 6d 65 6e 75 50 74 72  ue;..    menuPtr
c600: 20 3d 20 6d 65 50 74 72 2d 3e 6d 65 6e 75 50 74   = mePtr->menuPt
c610: 72 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  r;..    /*.     
c620: 2a 20 49 66 20 74 68 65 20 76 61 72 69 61 62 6c  * If the variabl
c630: 65 20 69 73 20 62 65 69 6e 67 20 75 6e 73 65 74  e is being unset
c640: 2c 20 74 68 65 6e 20 72 65 2d 65 73 74 61 62 6c  , then re-establ
c650: 69 73 68 20 74 68 65 0a 20 20 20 20 20 2a 20 74  ish the.     * t
c660: 72 61 63 65 20 75 6e 6c 65 73 73 20 74 68 65 20  race unless the 
c670: 77 68 6f 6c 65 20 69 6e 74 65 72 70 72 65 74 65  whole interprete
c680: 72 20 69 73 20 67 6f 69 6e 67 20 61 77 61 79 2e  r is going away.
c690: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66  .     */..    if
c6a0: 20 28 66 6c 61 67 73 20 26 20 54 43 4c 5f 54 52   (flags & TCL_TR
c6b0: 41 43 45 5f 55 4e 53 45 54 53 29 20 7b 0a 09 6d  ACE_UNSETS) {..m
c6c0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  ePtr->flags &= ~
c6d0: 45 4e 54 52 59 5f 53 45 4c 45 43 54 45 44 3b 0a  ENTRY_SELECTED;.
c6e0: 09 69 66 20 28 28 66 6c 61 67 73 20 26 20 54 43  .if ((flags & TC
c6f0: 4c 5f 54 52 41 43 45 5f 44 45 53 54 52 4f 59 45  L_TRACE_DESTROYE
c700: 44 29 20 26 26 20 21 28 66 6c 61 67 73 20 26 20  D) && !(flags & 
c710: 54 43 4c 5f 49 4e 54 45 52 50 5f 44 45 53 54 52  TCL_INTERP_DESTR
c720: 4f 59 45 44 29 29 20 7b 0a 09 20 20 20 20 54 63  OYED)) {..    Tc
c730: 6c 5f 54 72 61 63 65 56 61 72 28 69 6e 74 65 72  l_TraceVar(inter
c740: 70 2c 20 6d 65 50 74 72 2d 3e 6e 61 6d 65 2c 0a  p, mePtr->name,.
c750: 09 09 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c  ..    TCL_GLOBAL
c760: 5f 4f 4e 4c 59 7c 54 43 4c 5f 54 52 41 43 45 5f  _ONLY|TCL_TRACE_
c770: 57 52 49 54 45 53 7c 54 43 4c 5f 54 52 41 43 45  WRITES|TCL_TRACE
c780: 5f 55 4e 53 45 54 53 2c 0a 09 09 20 20 20 20 4d  _UNSETS,...    M
c790: 65 6e 75 56 61 72 50 72 6f 63 2c 20 63 6c 69 65  enuVarProc, clie
c7a0: 6e 74 44 61 74 61 29 3b 0a 09 7d 0a 09 45 76 65  ntData);..}..Eve
c7b0: 6e 74 75 61 6c 6c 79 52 65 64 72 61 77 4d 65 6e  ntuallyRedrawMen
c7c0: 75 28 6d 65 6e 75 50 74 72 2c 20 28 4d 65 6e 75  u(menuPtr, (Menu
c7d0: 45 6e 74 72 79 20 2a 29 20 4e 55 4c 4c 29 3b 0a  Entry *) NULL);.
c7e0: 09 72 65 74 75 72 6e 20 28 63 68 61 72 20 2a 29  .return (char *)
c7f0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
c800: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 55 73 65 20    /*.     * Use 
c810: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
c820: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 75 70 64   variable to upd
c830: 61 74 65 20 74 68 65 20 73 65 6c 65 63 74 65 64  ate the selected
c840: 20 73 74 61 74 75 73 20 6f 66 0a 20 20 20 20 20   status of.     
c850: 2a 20 74 68 65 20 6d 65 6e 75 20 65 6e 74 72 79  * the menu entry
c860: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 76  ..     */..    v
c870: 61 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74 56 61  alue = Tcl_GetVa
c880: 72 28 69 6e 74 65 72 70 2c 20 6d 65 50 74 72 2d  r(interp, mePtr-
c890: 3e 6e 61 6d 65 2c 20 54 43 4c 5f 47 4c 4f 42 41  >name, TCL_GLOBA
c8a0: 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66 20  L_ONLY);.    if 
c8b0: 28 76 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20  (value == NULL) 
c8c0: 7b 0a 09 76 61 6c 75 65 20 3d 20 22 22 3b 0a 20  {..value = "";. 
c8d0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 72     }.    if (str
c8e0: 63 6d 70 28 76 61 6c 75 65 2c 20 6d 65 50 74 72  cmp(value, mePtr
c8f0: 2d 3e 6f 6e 56 61 6c 75 65 29 20 3d 3d 20 30 29  ->onValue) == 0)
c900: 20 7b 0a 09 69 66 20 28 6d 65 50 74 72 2d 3e 66   {..if (mePtr->f
c910: 6c 61 67 73 20 26 20 45 4e 54 52 59 5f 53 45 4c  lags & ENTRY_SEL
c920: 45 43 54 45 44 29 20 7b 0a 09 20 20 20 20 72 65  ECTED) {..    re
c930: 74 75 72 6e 20 28 63 68 61 72 20 2a 29 20 4e 55  turn (char *) NU
c940: 4c 4c 3b 0a 09 7d 0a 09 6d 65 50 74 72 2d 3e 66  LL;..}..mePtr->f
c950: 6c 61 67 73 20 7c 3d 20 45 4e 54 52 59 5f 53 45  lags |= ENTRY_SE
c960: 4c 45 43 54 45 44 3b 0a 20 20 20 20 7d 20 65 6c  LECTED;.    } el
c970: 73 65 20 69 66 20 28 6d 65 50 74 72 2d 3e 66 6c  se if (mePtr->fl
c980: 61 67 73 20 26 20 45 4e 54 52 59 5f 53 45 4c 45  ags & ENTRY_SELE
c990: 43 54 45 44 29 20 7b 0a 09 6d 65 50 74 72 2d 3e  CTED) {..mePtr->
c9a0: 66 6c 61 67 73 20 26 3d 20 7e 45 4e 54 52 59 5f  flags &= ~ENTRY_
c9b0: 53 45 4c 45 43 54 45 44 3b 0a 20 20 20 20 7d 20  SELECTED;.    } 
c9c0: 65 6c 73 65 20 7b 0a 09 72 65 74 75 72 6e 20 28  else {..return (
c9d0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 3b 0a 20 20  char *) NULL;.  
c9e0: 20 20 7d 0a 20 20 20 20 45 76 65 6e 74 75 61 6c    }.    Eventual
c9f0: 6c 79 52 65 64 72 61 77 4d 65 6e 75 28 6d 65 6e  lyRedrawMenu(men
ca00: 75 50 74 72 2c 20 28 4d 65 6e 75 45 6e 74 72 79  uPtr, (MenuEntry
ca10: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 72   *) NULL);.    r
ca20: 65 74 75 72 6e 20 28 63 68 61 72 20 2a 29 20 4e  eturn (char *) N
ca30: 55 4c 4c 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  ULL;.}.../*. *--
ca40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca80: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 76 65 6e 74  ----. *. * Event
ca90: 75 61 6c 6c 79 52 65 64 72 61 77 4d 65 6e 75 20  uallyRedrawMenu 
caa0: 2d 2d 0a 20 2a 0a 20 2a 09 41 72 72 61 6e 67 65  --. *. *.Arrange
cab0: 20 66 6f 72 20 61 6e 20 65 6e 74 72 79 20 6f 66   for an entry of
cac0: 20 61 20 6d 65 6e 75 2c 20 6f 72 20 74 68 65 20   a menu, or the 
cad0: 77 68 6f 6c 65 20 6d 65 6e 75 2c 20 74 6f 20 62  whole menu, to b
cae0: 65 0a 20 2a 09 72 65 64 69 73 70 6c 61 79 65 64  e. *.redisplayed
caf0: 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69   at some point i
cb00: 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a 20 2a  n the future.. *
cb10: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
cb20: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  None.. *. * Side
cb30: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 20 77   effects:. *.A w
cb40: 68 65 6e 2d 69 64 6c 65 20 68 61 6e 64 65 72 20  hen-idle hander 
cb50: 69 73 20 73 63 68 65 64 75 6c 65 64 20 74 6f 20  is scheduled to 
cb60: 64 6f 20 74 68 65 20 72 65 64 69 73 70 6c 61 79  do the redisplay
cb70: 2c 20 69 66 20 74 68 65 72 65 0a 20 2a 09 69 73  , if there. *.is
cb80: 6e 27 74 20 6f 6e 65 20 61 6c 72 65 61 64 79 20  n't one already 
cb90: 73 63 68 65 64 75 6c 65 64 2e 0a 20 2a 0a 20 2a  scheduled.. *. *
cba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbe0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
cbf0: 69 63 20 76 6f 69 64 0a 45 76 65 6e 74 75 61 6c  ic void.Eventual
cc00: 6c 79 52 65 64 72 61 77 4d 65 6e 75 28 6d 65 6e  lyRedrawMenu(men
cc10: 75 50 74 72 2c 20 6d 65 50 74 72 29 0a 20 20 20  uPtr, mePtr).   
cc20: 20 72 65 67 69 73 74 65 72 20 4d 65 6e 75 20 2a   register Menu *
cc30: 6d 65 6e 75 50 74 72 3b 09 2f 2a 20 49 6e 66 6f  menuPtr;./* Info
cc40: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 6d 65  rmation about me
cc50: 6e 75 20 74 6f 20 72 65 64 72 61 77 2e 20 2a 2f  nu to redraw. */
cc60: 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 4d 65  .    register Me
cc70: 6e 75 45 6e 74 72 79 20 2a 6d 65 50 74 72 3b 09  nuEntry *mePtr;.
cc80: 2f 2a 20 45 6e 74 72 79 20 74 6f 20 72 65 64 72  /* Entry to redr
cc90: 61 77 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20  aw.  NULL means 
cca0: 72 65 64 72 61 77 0a 09 09 09 09 20 2a 20 61 6c  redraw..... * al
ccb0: 6c 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e  l the entries in
ccc0: 20 74 68 65 20 6d 65 6e 75 2e 20 2a 2f 0a 7b 0a   the menu. */.{.
ccd0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
cce0: 66 20 28 6d 65 6e 75 50 74 72 2d 3e 74 6b 77 69  f (menuPtr->tkwi
ccf0: 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  n == NULL) {..re
cd00: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
cd10: 69 66 20 28 6d 65 50 74 72 20 21 3d 20 4e 55 4c  if (mePtr != NUL
cd20: 4c 29 20 7b 0a 09 6d 65 50 74 72 2d 3e 66 6c 61  L) {..mePtr->fla
cd30: 67 73 20 7c 3d 20 45 4e 54 52 59 5f 4e 45 45 44  gs |= ENTRY_NEED
cd40: 53 5f 52 45 44 49 53 50 4c 41 59 3b 0a 20 20 20  S_REDISPLAY;.   
cd50: 20 7d 20 65 6c 73 65 20 7b 0a 09 66 6f 72 20 28   } else {..for (
cd60: 69 20 3d 20 30 3b 20 69 20 3c 20 6d 65 6e 75 50  i = 0; i < menuP
cd70: 74 72 2d 3e 6e 75 6d 45 6e 74 72 69 65 73 3b 20  tr->numEntries; 
cd80: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 6d 65 6e 75  i++) {..    menu
cd90: 50 74 72 2d 3e 65 6e 74 72 69 65 73 5b 69 5d 2d  Ptr->entries[i]-
cda0: 3e 66 6c 61 67 73 20 7c 3d 20 45 4e 54 52 59 5f  >flags |= ENTRY_
cdb0: 4e 45 45 44 53 5f 52 45 44 49 53 50 4c 41 59 3b  NEEDS_REDISPLAY;
cdc0: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ..}.    }.    if
cdd0: 20 28 28 6d 65 6e 75 50 74 72 2d 3e 74 6b 77 69   ((menuPtr->tkwi
cde0: 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7c 7c 20 21 54  n == NULL) || !T
cdf0: 6b 5f 49 73 4d 61 70 70 65 64 28 6d 65 6e 75 50  k_IsMapped(menuP
ce00: 74 72 2d 3e 74 6b 77 69 6e 29 0a 09 20 20 20 20  tr->tkwin)..    
ce10: 7c 7c 20 28 6d 65 6e 75 50 74 72 2d 3e 66 6c 61  || (menuPtr->fla
ce20: 67 73 20 26 20 52 45 44 52 41 57 5f 50 45 4e 44  gs & REDRAW_PEND
ce30: 49 4e 47 29 29 20 7b 0a 09 72 65 74 75 72 6e 3b  ING)) {..return;
ce40: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
ce50: 6f 57 68 65 6e 49 64 6c 65 28 44 69 73 70 6c 61  oWhenIdle(Displa
ce60: 79 4d 65 6e 75 2c 20 28 43 6c 69 65 6e 74 44 61  yMenu, (ClientDa
ce70: 74 61 29 20 6d 65 6e 75 50 74 72 29 3b 0a 20 20  ta) menuPtr);.  
ce80: 20 20 6d 65 6e 75 50 74 72 2d 3e 66 6c 61 67 73    menuPtr->flags
ce90: 20 7c 3d 20 52 45 44 52 41 57 5f 50 45 4e 44 49   |= REDRAW_PENDI
cea0: 4e 47 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  NG;.}.../*. *---
ceb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ced0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
cef0: 2a 20 50 6f 73 74 53 75 62 6d 65 6e 75 20 2d 2d  * PostSubmenu --
cf00: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
cf10: 65 64 75 72 65 20 61 72 72 61 6e 67 65 73 20 66  edure arranges f
cf20: 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  or a particular 
cf30: 73 75 62 6d 65 6e 75 20 28 69 2e 65 2e 20 74 68  submenu (i.e. th
cf40: 65 0a 20 2a 09 6d 65 6e 75 20 63 6f 72 72 65 73  e. *.menu corres
cf50: 70 6f 6e 64 69 6e 67 20 74 6f 20 61 20 67 69 76  ponding to a giv
cf60: 65 6e 20 63 61 73 63 61 64 65 20 65 6e 74 72 79  en cascade entry
cf70: 29 20 74 6f 20 62 65 0a 20 2a 09 70 6f 73 74 65  ) to be. *.poste
cf80: 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  d.. *. * Results
cf90: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
cfa0: 54 63 6c 20 72 65 74 75 72 6e 20 72 65 73 75 6c  Tcl return resul
cfb0: 74 2e 20 20 45 72 72 6f 72 73 20 6d 61 79 20 6f  t.  Errors may o
cfc0: 63 63 75 72 20 69 6e 20 74 68 65 0a 20 2a 09 54  ccur in the. *.T
cfd0: 63 6c 20 63 6f 6d 6d 61 6e 64 73 20 67 65 6e 65  cl commands gene
cfe0: 72 61 74 65 64 20 74 6f 20 70 6f 73 74 20 61 6e  rated to post an
cff0: 64 20 75 6e 70 6f 73 74 20 73 75 62 6d 65 6e 75  d unpost submenu
d000: 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  s.. *. * Side ef
d010: 66 65 63 74 73 3a 0a 20 2a 09 49 66 20 74 68 65  fects:. *.If the
d020: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
d030: 73 75 62 6d 65 6e 75 20 70 6f 73 74 65 64 2c 20  submenu posted, 
d040: 69 74 20 69 73 20 75 6e 70 6f 73 74 65 64 2e 0a  it is unposted..
d050: 20 2a 09 54 68 65 20 6e 65 77 20 73 75 62 6d 65   *.The new subme
d060: 6e 75 20 69 73 20 74 68 65 6e 20 70 6f 73 74 65  nu is then poste
d070: 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  d.. *. *--------
d080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
d0c0: 69 63 20 69 6e 74 0a 50 6f 73 74 53 75 62 6d 65  ic int.PostSubme
d0d0: 6e 75 28 69 6e 74 65 72 70 2c 20 6d 65 6e 75 50  nu(interp, menuP
d0e0: 74 72 2c 20 6d 65 50 74 72 29 0a 20 20 20 20 54  tr, mePtr).    T
d0f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
d100: 70 3b 09 09 2f 2a 20 55 73 65 64 20 66 6f 72 20  p;../* Used for 
d110: 69 6e 76 6f 6b 69 6e 67 20 73 75 62 2d 63 6f 6d  invoking sub-com
d120: 6d 61 6e 64 73 20 61 6e 64 0a 09 09 09 09 20 2a  mands and..... *
d130: 20 72 65 70 6f 72 74 69 6e 67 20 65 72 72 6f 72   reporting error
d140: 73 2e 20 2a 2f 0a 20 20 20 20 72 65 67 69 73 74  s. */.    regist
d150: 65 72 20 4d 65 6e 75 20 2a 6d 65 6e 75 50 74 72  er Menu *menuPtr
d160: 3b 09 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e  ;./* Information
d170: 20 61 62 6f 75 74 20 6d 65 6e 75 20 61 73 20 61   about menu as a
d180: 20 77 68 6f 6c 65 2e 20 2a 2f 0a 20 20 20 20 72   whole. */.    r
d190: 65 67 69 73 74 65 72 20 4d 65 6e 75 45 6e 74 72  egister MenuEntr
d1a0: 79 20 2a 6d 65 50 74 72 3b 09 2f 2a 20 49 6e 66  y *mePtr;./* Inf
d1b0: 6f 20 61 62 6f 75 74 20 73 75 62 6d 65 6e 75 20  o about submenu 
d1c0: 74 68 61 74 20 69 73 20 74 6f 20 62 65 0a 09 09  that is to be...
d1d0: 09 09 20 2a 20 70 6f 73 74 65 64 2e 20 20 4e 55  .. * posted.  NU
d1e0: 4c 4c 20 6d 65 61 6e 73 20 6d 61 6b 65 20 73 75  LL means make su
d1f0: 72 65 20 74 68 61 74 0a 09 09 09 09 20 2a 20 6e  re that..... * n
d200: 6f 20 73 75 62 6d 65 6e 75 20 69 73 20 70 6f 73  o submenu is pos
d210: 74 65 64 2e 20 2a 2f 0a 7b 0a 20 20 20 20 63 68  ted. */.{.    ch
d220: 61 72 20 73 74 72 69 6e 67 5b 33 30 5d 3b 0a 20  ar string[30];. 
d230: 20 20 20 69 6e 74 20 72 65 73 75 6c 74 2c 20 78     int result, x
d240: 2c 20 79 2c 20 69 3b 0a 0a 20 20 20 20 69 66 20  , y, i;..    if 
d250: 28 6d 65 50 74 72 20 3d 3d 20 6d 65 6e 75 50 74  (mePtr == menuPt
d260: 72 2d 3e 70 6f 73 74 65 64 43 61 73 63 61 64 65  r->postedCascade
d270: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
d280: 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  OK;.    }..    i
d290: 66 20 28 6d 65 6e 75 50 74 72 2d 3e 70 6f 73 74  f (menuPtr->post
d2a0: 65 64 43 61 73 63 61 64 65 20 21 3d 20 4e 55 4c  edCascade != NUL
d2b0: 4c 29 20 7b 0a 09 45 76 65 6e 74 75 61 6c 6c 79  L) {..Eventually
d2c0: 52 65 64 72 61 77 4d 65 6e 75 28 6d 65 6e 75 50  RedrawMenu(menuP
d2d0: 74 72 2c 20 6d 65 6e 75 50 74 72 2d 3e 70 6f 73  tr, menuPtr->pos
d2e0: 74 65 64 43 61 73 63 61 64 65 29 3b 0a 09 72 65  tedCascade);..re
d2f0: 73 75 6c 74 20 3d 20 54 63 6c 5f 56 61 72 45 76  sult = Tcl_VarEv
d300: 61 6c 28 69 6e 74 65 72 70 2c 20 6d 65 6e 75 50  al(interp, menuP
d310: 74 72 2d 3e 70 6f 73 74 65 64 43 61 73 63 61 64  tr->postedCascad
d320: 65 2d 3e 6e 61 6d 65 2c 0a 09 09 22 20 75 6e 70  e->name,..." unp
d330: 6f 73 74 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ost", (char *) N
d340: 55 4c 4c 29 3b 0a 09 6d 65 6e 75 50 74 72 2d 3e  ULL);..menuPtr->
d350: 70 6f 73 74 65 64 43 61 73 63 61 64 65 20 3d 20  postedCascade = 
d360: 4e 55 4c 4c 3b 0a 09 69 66 20 28 72 65 73 75 6c  NULL;..if (resul
d370: 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  t != TCL_OK) {..
d380: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c      return resul
d390: 74 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  t;..}.    }..   
d3a0: 20 69 66 20 28 28 6d 65 50 74 72 20 21 3d 20 4e   if ((mePtr != N
d3b0: 55 4c 4c 29 20 26 26 20 28 6d 65 50 74 72 2d 3e  ULL) && (mePtr->
d3c0: 6e 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 0a 09 20  name != NULL).. 
d3d0: 20 20 20 26 26 20 54 6b 5f 49 73 4d 61 70 70 65     && Tk_IsMappe
d3e0: 64 28 6d 65 6e 75 50 74 72 2d 3e 74 6b 77 69 6e  d(menuPtr->tkwin
d3f0: 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b  )) {../*.. * Mak
d400: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
d410: 63 61 73 63 61 64 65 64 20 73 75 62 6d 65 6e 75  cascaded submenu
d420: 20 69 73 20 61 20 63 68 69 6c 64 20 6f 66 20 74   is a child of t
d430: 68 65 0a 09 20 2a 20 70 61 72 65 6e 74 20 6d 65  he.. * parent me
d440: 6e 75 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 43  nu... */...if (C
d450: 74 6b 5f 50 61 72 65 6e 74 42 79 4e 61 6d 65 28  tk_ParentByName(
d460: 69 6e 74 65 72 70 2c 20 6d 65 50 74 72 2d 3e 6e  interp, mePtr->n
d470: 61 6d 65 2c 20 6d 65 6e 75 50 74 72 2d 3e 74 6b  ame, menuPtr->tk
d480: 77 69 6e 29 0a 09 09 21 3d 20 6d 65 6e 75 50 74  win)...!= menuPt
d490: 72 2d 3e 74 6b 77 69 6e 29 20 7b 0a 09 20 20 20  r->tkwin) {..   
d4a0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
d4b0: 74 28 69 6e 74 65 72 70 2c 20 22 63 61 73 63 61  t(interp, "casca
d4c0: 64 65 64 20 73 75 62 2d 6d 65 6e 75 20 22 2c 0a  ded sub-menu ",.
d4d0: 09 09 20 20 20 20 6d 65 50 74 72 2d 3e 6e 61 6d  ..    mePtr->nam
d4e0: 65 2c 20 22 20 6d 75 73 74 20 62 65 20 61 20 63  e, " must be a c
d4f0: 68 69 6c 64 20 6f 66 20 22 2c 0a 09 09 20 20 20  hild of ",...   
d500: 20 54 6b 5f 50 61 74 68 4e 61 6d 65 28 6d 65 6e   Tk_PathName(men
d510: 75 50 74 72 2d 3e 74 6b 77 69 6e 29 2c 20 28 63  uPtr->tkwin), (c
d520: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
d530: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d540: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a  ROR;..}.../*.. *
d550: 20 50 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 61   Position the ca
d560: 73 63 61 64 65 20 77 69 74 68 20 69 74 73 20 75  scade with its u
d570: 70 70 65 72 20 6c 65 66 74 20 63 6f 72 6e 65 72  pper left corner
d580: 20 73 6c 69 67 68 74 6c 79 0a 09 20 2a 20 62 65   slightly.. * be
d590: 6c 6f 77 20 61 6e 64 20 74 6f 20 74 68 65 20 6c  low and to the l
d5a0: 65 66 74 20 6f 66 20 74 68 65 20 75 70 70 65 72  eft of the upper
d5b0: 20 72 69 67 68 74 20 63 6f 72 6e 65 72 20 6f 66   right corner of
d5c0: 20 74 68 65 0a 09 20 2a 20 6d 65 6e 75 20 65 6e   the.. * menu en
d5d0: 74 72 79 20 28 74 68 69 73 20 69 73 20 61 6e 20  try (this is an 
d5e0: 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 74 63 68  attempt to match
d5f0: 20 4d 6f 74 69 66 20 62 65 68 61 76 69 6f 72 29   Motif behavior)
d600: 2e 0a 09 20 2a 2f 0a 0a 09 66 6f 72 20 28 69 20  ... */...for (i 
d610: 3d 20 30 3b 20 69 20 3c 20 6d 65 6e 75 50 74 72  = 0; i < menuPtr
d620: 2d 3e 6e 75 6d 45 6e 74 72 69 65 73 3b 20 69 2b  ->numEntries; i+
d630: 2b 29 20 7b 0a 09 20 20 20 20 69 66 20 28 6d 65  +) {..    if (me
d640: 6e 75 50 74 72 2d 3e 65 6e 74 72 69 65 73 5b 69  nuPtr->entries[i
d650: 5d 20 3d 3d 20 6d 65 50 74 72 29 20 20 62 72 65  ] == mePtr)  bre
d660: 61 6b 3b 0a 09 7d 0a 09 78 20 3d 20 43 74 6b 5f  ak;..}..x = Ctk_
d670: 41 62 73 4c 65 66 74 28 6d 65 6e 75 50 74 72 2d  AbsLeft(menuPtr-
d680: 3e 74 6b 77 69 6e 29 0a 09 09 2b 20 28 69 2f 6d  >tkwin)...+ (i/m
d690: 65 6e 75 50 74 72 2d 3e 6e 75 6d 52 6f 77 73 20  enuPtr->numRows 
d6a0: 2b 20 31 29 2a 6d 65 6e 75 50 74 72 2d 3e 63 6f  + 1)*menuPtr->co
d6b0: 6c 75 6d 6e 57 69 64 74 68 0a 09 09 2b 20 6d 65  lumnWidth...+ me
d6c0: 6e 75 50 74 72 2d 3e 62 6f 72 64 65 72 57 69 64  nuPtr->borderWid
d6d0: 74 68 3b 0a 09 79 20 3d 20 43 74 6b 5f 41 62 73  th;..y = Ctk_Abs
d6e0: 54 6f 70 28 6d 65 6e 75 50 74 72 2d 3e 74 6b 77  Top(menuPtr->tkw
d6f0: 69 6e 29 20 2b 20 28 69 25 6d 65 6e 75 50 74 72  in) + (i%menuPtr
d700: 2d 3e 6e 75 6d 52 6f 77 73 29 0a 09 09 2b 20 6d  ->numRows)...+ m
d710: 65 6e 75 50 74 72 2d 3e 62 6f 72 64 65 72 57 69  enuPtr->borderWi
d720: 64 74 68 3b 0a 09 73 70 72 69 6e 74 66 28 73 74  dth;..sprintf(st
d730: 72 69 6e 67 2c 20 22 25 64 20 25 64 22 2c 20 78  ring, "%d %d", x
d740: 2c 20 79 29 3b 0a 09 72 65 73 75 6c 74 20 3d 20  , y);..result = 
d750: 54 63 6c 5f 56 61 72 45 76 61 6c 28 69 6e 74 65  Tcl_VarEval(inte
d760: 72 70 2c 20 6d 65 50 74 72 2d 3e 6e 61 6d 65 2c  rp, mePtr->name,
d770: 20 22 20 70 6f 73 74 20 22 2c 20 73 74 72 69 6e   " post ", strin
d780: 67 2c 0a 09 09 28 63 68 61 72 20 2a 29 20 4e 55  g,...(char *) NU
d790: 4c 4c 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74  LL);..if (result
d7a0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   != TCL_OK) {.. 
d7b0: 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74     return result
d7c0: 3b 0a 09 7d 0a 09 6d 65 6e 75 50 74 72 2d 3e 70  ;..}..menuPtr->p
d7d0: 6f 73 74 65 64 43 61 73 63 61 64 65 20 3d 20 6d  ostedCascade = m
d7e0: 65 50 74 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ePtr;.    }.    
d7f0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
d800: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
d810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
d850: 2a 0a 20 2a 20 41 63 74 69 76 61 74 65 4d 65 6e  *. * ActivateMen
d860: 75 45 6e 74 72 79 20 2d 2d 0a 20 2a 0a 20 2a 09  uEntry --. *. *.
d870: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
d880: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 6d 61 6b  s invoked to mak
d890: 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6d  e a particular m
d8a0: 65 6e 75 20 65 6e 74 72 79 0a 20 2a 09 74 68 65  enu entry. *.the
d8b0: 20 61 63 74 69 76 65 20 6f 6e 65 2c 20 64 65 61   active one, dea
d8c0: 63 74 69 76 61 74 69 6e 67 20 61 6e 79 20 6f 74  ctivating any ot
d8d0: 68 65 72 20 65 6e 74 72 79 20 74 68 61 74 20 6d  her entry that m
d8e0: 69 67 68 74 0a 20 2a 09 63 75 72 72 65 6e 74 6c  ight. *.currentl
d8f0: 79 20 62 65 20 61 63 74 69 76 65 2e 0a 20 2a 0a  y be active.. *.
d900: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54   * Results:. *.T
d910: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
d920: 69 73 20 61 20 73 74 61 6e 64 61 72 64 20 54 63  is a standard Tc
d930: 6c 20 72 65 73 75 6c 74 20 28 65 72 72 6f 72 73  l result (errors
d940: 20 63 61 6e 20 6f 63 63 75 72 0a 20 2a 09 77 68   can occur. *.wh
d950: 69 6c 65 20 70 6f 73 74 69 6e 67 20 61 6e 64 20  ile posting and 
d960: 75 6e 70 6f 73 74 69 6e 67 20 73 75 62 6d 65 6e  unposting submen
d970: 75 73 29 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  us).. *. * Side 
d980: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 65 6e 75  effects:. *.Menu
d990: 20 65 6e 74 72 69 65 73 20 67 65 74 20 72 65 64   entries get red
d9a0: 69 73 70 6c 61 79 65 64 2c 20 61 6e 64 20 74 68  isplayed, and th
d9b0: 65 20 61 63 74 69 76 65 20 65 6e 74 72 79 20 63  e active entry c
d9c0: 68 61 6e 67 65 73 2e 0a 20 2a 09 53 75 62 6d 65  hanges.. *.Subme
d9d0: 6e 75 73 20 6d 61 79 20 67 65 74 20 70 6f 73 74  nus may get post
d9e0: 65 64 20 61 6e 64 20 75 6e 70 6f 73 74 65 64 2e  ed and unposted.
d9f0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
da00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
da40: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 41 63 74  ..static int.Act
da50: 69 76 61 74 65 4d 65 6e 75 45 6e 74 72 79 28 6d  ivateMenuEntry(m
da60: 65 6e 75 50 74 72 2c 20 69 6e 64 65 78 29 0a 20  enuPtr, index). 
da70: 20 20 20 72 65 67 69 73 74 65 72 20 4d 65 6e 75     register Menu
da80: 20 2a 6d 65 6e 75 50 74 72 3b 09 09 2f 2a 20 4d   *menuPtr;../* M
da90: 65 6e 75 20 69 6e 20 77 68 69 63 68 20 74 6f 20  enu in which to 
daa0: 61 63 74 69 76 61 74 65 2e 20 2a 2f 0a 20 20 20  activate. */.   
dab0: 20 69 6e 74 20 69 6e 64 65 78 3b 09 09 09 09 2f   int index;..../
dac0: 2a 20 49 6e 64 65 78 20 6f 66 20 65 6e 74 72 79  * Index of entry
dad0: 20 74 6f 20 61 63 74 69 76 61 74 65 2c 20 6f 72   to activate, or
dae0: 0a 09 09 09 09 09 20 2a 20 2d 31 20 74 6f 20 64  ...... * -1 to d
daf0: 65 61 63 74 69 76 61 74 65 20 61 6c 6c 20 65 6e  eactivate all en
db00: 74 72 69 65 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20  tries. */.{.    
db10: 72 65 67 69 73 74 65 72 20 4d 65 6e 75 45 6e 74  register MenuEnt
db20: 72 79 20 2a 6d 65 50 74 72 3b 0a 20 20 20 20 69  ry *mePtr;.    i
db30: 6e 74 20 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f  nt result = TCL_
db40: 4f 4b 3b 0a 0a 20 20 20 20 69 66 20 28 6d 65 6e  OK;..    if (men
db50: 75 50 74 72 2d 3e 61 63 74 69 76 65 20 3e 3d 20  uPtr->active >= 
db60: 30 29 20 7b 0a 09 6d 65 50 74 72 20 3d 20 6d 65  0) {..mePtr = me
db70: 6e 75 50 74 72 2d 3e 65 6e 74 72 69 65 73 5b 6d  nuPtr->entries[m
db80: 65 6e 75 50 74 72 2d 3e 61 63 74 69 76 65 5d 3b  enuPtr->active];
db90: 0a 0a 09 2f 2a 0a 09 20 2a 20 44 6f 6e 27 74 20  .../*.. * Don't 
dba0: 63 68 61 6e 67 65 20 74 68 65 20 73 74 61 74 65  change the state
dbb0: 20 75 6e 6c 65 73 73 20 69 74 27 73 20 63 75 72   unless it's cur
dbc0: 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 28 73  rently active (s
dbd0: 74 61 74 65 0a 09 20 2a 20 6d 69 67 68 74 20 61  tate.. * might a
dbe0: 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
dbf0: 20 63 68 61 6e 67 65 64 20 74 6f 20 64 69 73 61   changed to disa
dc00: 62 6c 65 64 29 2e 0a 09 20 2a 2f 0a 0a 09 69 66  bled)... */...if
dc10: 20 28 6d 65 50 74 72 2d 3e 73 74 61 74 65 20 3d   (mePtr->state =
dc20: 3d 20 74 6b 41 63 74 69 76 65 55 69 64 29 20 7b  = tkActiveUid) {
dc30: 0a 09 20 20 20 20 6d 65 50 74 72 2d 3e 73 74 61  ..    mePtr->sta
dc40: 74 65 20 3d 20 74 6b 4e 6f 72 6d 61 6c 55 69 64  te = tkNormalUid
dc50: 3b 0a 09 7d 0a 09 45 76 65 6e 74 75 61 6c 6c 79  ;..}..Eventually
dc60: 52 65 64 72 61 77 4d 65 6e 75 28 6d 65 6e 75 50  RedrawMenu(menuP
dc70: 74 72 2c 20 6d 65 6e 75 50 74 72 2d 3e 65 6e 74  tr, menuPtr->ent
dc80: 72 69 65 73 5b 6d 65 6e 75 50 74 72 2d 3e 61 63  ries[menuPtr->ac
dc90: 74 69 76 65 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  tive]);.    }.  
dca0: 20 20 6d 65 6e 75 50 74 72 2d 3e 61 63 74 69 76    menuPtr->activ
dcb0: 65 20 3d 20 69 6e 64 65 78 3b 0a 20 20 20 20 69  e = index;.    i
dcc0: 66 20 28 69 6e 64 65 78 20 3e 3d 20 30 29 20 7b  f (index >= 0) {
dcd0: 0a 09 6d 65 50 74 72 20 3d 20 6d 65 6e 75 50 74  ..mePtr = menuPt
dce0: 72 2d 3e 65 6e 74 72 69 65 73 5b 69 6e 64 65 78  r->entries[index
dcf0: 5d 3b 0a 09 6d 65 50 74 72 2d 3e 73 74 61 74 65  ];..mePtr->state
dd00: 20 3d 20 74 6b 41 63 74 69 76 65 55 69 64 3b 0a   = tkActiveUid;.
dd10: 09 45 76 65 6e 74 75 61 6c 6c 79 52 65 64 72 61  .EventuallyRedra
dd20: 77 4d 65 6e 75 28 6d 65 6e 75 50 74 72 2c 20 6d  wMenu(menuPtr, m
dd30: 65 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ePtr);.    }.   
dd40: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a   return result;.
dd50: 7d 0a                                            }.