Hex Artifact Content

Artifact 2109c0900a4c422fd3b634ef0de87a3327385799:


0000: 2f 2a 20 0a 20 2a 20 74 6b 46 6f 63 75 73 2e 63  /* . * tkFocus.c
0010: 20 28 43 54 6b 29 20 2d 2d 0a 20 2a 0a 20 2a 09   (CTk) --. *. *.
0020: 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69  This file contai
0030: 6e 73 20 70 72 6f 63 65 64 75 72 65 73 20 74 68  ns procedures th
0040: 61 74 20 6d 61 6e 61 67 65 20 74 68 65 20 69 6e  at manage the in
0050: 70 75 74 0a 20 2a 09 66 6f 63 75 73 20 66 6f 72  put. *.focus for
0060: 20 54 6b 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 72   Tk.. *. * Copyr
0070: 69 67 68 74 20 28 63 29 20 31 39 39 30 2d 31 39  ight (c) 1990-19
0080: 39 34 20 54 68 65 20 52 65 67 65 6e 74 73 20 6f  94 The Regents o
0090: 66 20 74 68 65 20 55 6e 69 76 65 72 73 69 74 79  f the University
00a0: 20 6f 66 20 43 61 6c 69 66 6f 72 6e 69 61 2e 0a   of California..
00b0: 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28 63 29   * Copyright (c)
00c0: 20 31 39 39 34 2d 31 39 39 35 20 53 75 6e 20 4d   1994-1995 Sun M
00d0: 69 63 72 6f 73 79 73 74 65 6d 73 2c 20 49 6e 63  icrosystems, Inc
00e0: 2e 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28  .. * Copyright (
00f0: 63 29 20 31 39 39 34 2d 31 39 39 35 20 43 6c 65  c) 1994-1995 Cle
0100: 76 65 6c 61 6e 64 20 43 6c 69 6e 69 63 20 46 6f  veland Clinic Fo
0110: 75 6e 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53  undation. *. * S
0120: 65 65 20 74 68 65 20 66 69 6c 65 20 22 6c 69 63  ee the file "lic
0130: 65 6e 73 65 2e 74 65 72 6d 73 22 20 66 6f 72 20  ense.terms" for 
0140: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 75  information on u
0150: 73 61 67 65 20 61 6e 64 20 72 65 64 69 73 74 72  sage and redistr
0160: 69 62 75 74 69 6f 6e 0a 20 2a 20 6f 66 20 74 68  ibution. * of th
0170: 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 66 6f 72  is file, and for
0180: 20 61 20 44 49 53 43 4c 41 49 4d 45 52 20 4f 46   a DISCLAIMER OF
0190: 20 41 4c 4c 20 57 41 52 52 41 4e 54 49 45 53 2e   ALL WARRANTIES.
01a0: 0a 20 2a 0a 20 2a 20 40 28 23 29 20 24 49 64 3a  . *. * @(#) $Id:
01b0: 20 63 74 6b 2e 73 68 61 72 2c 76 20 31 2e 35 30   ctk.shar,v 1.50
01c0: 20 31 39 39 36 2f 30 31 2f 31 35 20 31 34 3a 34   1996/01/15 14:4
01d0: 37 3a 31 36 20 61 6e 64 72 65 77 6d 20 45 78 70  7:16 andrewm Exp
01e0: 20 61 6e 64 72 65 77 6d 20 24 0a 20 2a 2f 0a 0a   andrewm $. */..
01f0: 23 69 6e 63 6c 75 64 65 20 22 74 6b 49 6e 74 2e  #include "tkInt.
0200: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 6b 50  h".#include "tkP
0210: 6f 72 74 2e 68 22 0a 0a 2f 2a 0a 20 2a 20 48 61  ort.h"../*. * Ha
0220: 73 68 20 74 61 62 6c 65 20 6d 61 70 70 69 6e 67  sh table mapping
0230: 20 74 6f 70 2d 6c 65 76 65 6c 20 77 69 6e 64 6f   top-level windo
0240: 77 73 20 74 6f 20 74 68 65 69 72 20 6c 6f 63 61  ws to their loca
0250: 6c 20 66 6f 63 75 73 20 28 61 20 64 65 73 63 65  l focus (a desce
0260: 6e 64 61 6e 74 0a 20 2a 20 77 69 6e 64 6f 77 29  ndant. * window)
0270: 2e 20 20 42 6f 74 68 20 6b 65 79 20 61 6e 64 20  .  Both key and 
0280: 76 61 6c 75 65 73 20 61 72 65 20 77 69 6e 64 6f  values are windo
0290: 77 20 70 6f 69 6e 74 65 72 73 2e 20 20 54 68 65  w pointers.  The
02a0: 72 65 20 69 73 20 61 6e 0a 20 2a 20 65 6e 74 72  re is an. * entr
02b0: 79 20 66 6f 72 20 65 76 65 72 79 20 74 6f 70 2d  y for every top-
02c0: 6c 65 76 65 6c 20 77 69 6e 64 6f 77 20 74 68 61  level window tha
02d0: 74 20 68 61 73 20 65 76 65 72 20 72 65 63 69 65  t has ever recie
02e0: 76 65 64 20 74 68 65 20 66 6f 63 75 73 2e 0a 20  ved the focus.. 
02f0: 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 48  */..static Tcl_H
0300: 61 73 68 54 61 62 6c 65 20 66 6f 63 75 73 54 61  ashTable focusTa
0310: 62 6c 65 3b 0a 0a 2f 2a 0a 20 2a 20 48 61 73 20  ble;../*. * Has 
0320: 66 69 6c 65 73 20 73 74 61 74 69 63 20 64 61 74  files static dat
0330: 61 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  a been initializ
0340: 65 64 3f 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ed?. */..static 
0350: 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  int initialized 
0360: 3d 20 30 3b 0a 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  = 0;..../*. *---
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
03b0: 2a 20 54 6b 5f 46 6f 63 75 73 43 6d 64 20 2d 2d  * Tk_FocusCmd --
03c0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
03d0: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
03e0: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03f0: 22 66 6f 63 75 73 22 20 54 63 6c 20 63 6f 6d 6d  "focus" Tcl comm
0400: 61 6e 64 2e 0a 20 2a 09 53 65 65 20 74 68 65 20  and.. *.See the 
0410: 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 69  user documentati
0420: 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f  on for details o
0430: 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73 2e 0a  n what it does..
0440: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
0450: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
0460: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
0470: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
0480: 53 65 65 20 74 68 65 20 75 73 65 72 20 64 6f 63  See the user doc
0490: 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20  umentation.. *. 
04a0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
04b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
04e0: 20 2a 2f 0a 0a 69 6e 74 0a 54 6b 5f 46 6f 63 75   */..int.Tk_Focu
04f0: 73 43 6d 64 28 63 6c 69 65 6e 74 44 61 74 61 2c  sCmd(clientData,
0500: 20 69 6e 74 65 72 70 2c 20 61 72 67 63 2c 20 61   interp, argc, a
0510: 72 67 76 29 0a 20 20 20 20 43 6c 69 65 6e 74 44  rgv).    ClientD
0520: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 09  ata clientData;.
0530: 2f 2a 20 4d 61 69 6e 20 77 69 6e 64 6f 77 20 61  /* Main window a
0540: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 09  ssociated with..
0550: 09 09 09 20 2a 20 69 6e 74 65 72 70 72 65 74 65  ... * interprete
0560: 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  r. */.    Tcl_In
0570: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 09 09 2f  terp *interp;../
0580: 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70  * Current interp
0590: 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e  reter. */.    in
05a0: 74 20 61 72 67 63 3b 09 09 09 2f 2a 20 4e 75 6d  t argc;.../* Num
05b0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
05c0: 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a  . */.    char **
05d0: 61 72 67 76 3b 09 09 2f 2a 20 41 72 67 75 6d 65  argv;../* Argume
05e0: 6e 74 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 7b  nt strings. */.{
05f0: 0a 20 20 20 20 54 6b 5f 57 69 6e 64 6f 77 20 74  .    Tk_Window t
0600: 6b 77 69 6e 20 3d 20 28 54 6b 5f 57 69 6e 64 6f  kwin = (Tk_Windo
0610: 77 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  w) clientData;. 
0620: 20 20 20 54 6b 57 69 6e 64 6f 77 20 2a 77 69 6e     TkWindow *win
0630: 50 74 72 20 3d 20 28 54 6b 57 69 6e 64 6f 77 20  Ptr = (TkWindow 
0640: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  *) clientData;. 
0650: 20 20 20 54 6b 57 69 6e 64 6f 77 20 2a 6e 65 77     TkWindow *new
0660: 50 74 72 2c 20 2a 66 6f 63 75 73 57 69 6e 50 74  Ptr, *focusWinPt
0670: 72 2c 20 2a 74 6f 70 4c 65 76 65 6c 50 74 72 3b  r, *topLevelPtr;
0680: 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20  .    char c;.   
0690: 20 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a   size_t length;.
06a0: 20 20 20 20 54 63 6c 5f 48 61 73 68 45 6e 74 72      Tcl_HashEntr
06b0: 79 20 2a 68 50 74 72 3b 0a 0a 20 20 20 20 2f 2a  y *hPtr;..    /*
06c0: 0a 20 20 20 20 20 2a 20 49 66 20 69 6e 76 6f 6b  .     * If invok
06d0: 65 64 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d  ed with no argum
06e0: 65 6e 74 73 2c 20 6a 75 73 74 20 72 65 74 75 72  ents, just retur
06f0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 6f  n the current fo
0700: 63 75 73 20 77 69 6e 64 6f 77 2e 0a 20 20 20 20  cus window..    
0710: 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 61 72 67   */..    if (arg
0720: 63 20 3d 3d 20 31 29 20 7b 0a 09 66 6f 63 75 73  c == 1) {..focus
0730: 57 69 6e 50 74 72 20 3d 20 54 6b 47 65 74 46 6f  WinPtr = TkGetFo
0740: 63 75 73 28 77 69 6e 50 74 72 29 3b 0a 09 69 66  cus(winPtr);..if
0750: 20 28 66 6f 63 75 73 57 69 6e 50 74 72 20 21 3d   (focusWinPtr !=
0760: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63   NULL) {..    Tc
0770: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
0780: 72 70 2c 66 6f 63 75 73 57 69 6e 50 74 72 2d 3e  rp,focusWinPtr->
0790: 70 61 74 68 4e 61 6d 65 2c 54 43 4c 5f 56 4f 4c  pathName,TCL_VOL
07a0: 41 54 49 4c 45 29 3b 0a 09 7d 0a 09 72 65 74 75  ATILE);..}..retu
07b0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
07c0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
07d0: 49 66 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20  If invoked with 
07e0: 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  a single argumen
07f0: 74 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  t beginning with
0800: 20 22 2e 22 20 74 68 65 6e 20 66 6f 63 75 73 0a   "." then focus.
0810: 20 20 20 20 20 2a 20 6f 6e 20 74 68 61 74 20 77       * on that w
0820: 69 6e 64 6f 77 2e 0a 20 20 20 20 20 2a 2f 0a 0a  indow..     */..
0830: 20 20 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20      if (argc == 
0840: 32 29 20 7b 0a 09 69 66 20 28 61 72 67 76 5b 31  2) {..if (argv[1
0850: 5d 5b 30 5d 20 3d 3d 20 30 29 20 7b 0a 09 20 20  ][0] == 0) {..  
0860: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
0870: 0a 09 7d 0a 09 69 66 20 28 61 72 67 76 5b 31 5d  ..}..if (argv[1]
0880: 5b 30 5d 20 3d 3d 20 27 2e 27 29 20 7b 0a 09 20  [0] == '.') {.. 
0890: 20 20 20 6e 65 77 50 74 72 20 3d 20 28 54 6b 57     newPtr = (TkW
08a0: 69 6e 64 6f 77 20 2a 29 20 54 6b 5f 4e 61 6d 65  indow *) Tk_Name
08b0: 54 6f 57 69 6e 64 6f 77 28 69 6e 74 65 72 70 2c  ToWindow(interp,
08c0: 20 61 72 67 76 5b 31 5d 2c 20 74 6b 77 69 6e 29   argv[1], tkwin)
08d0: 3b 0a 09 20 20 20 20 69 66 20 28 6e 65 77 50 74  ;..    if (newPt
08e0: 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  r == NULL) {...r
08f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0900: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66 20  ..    }..    if 
0910: 28 21 28 6e 65 77 50 74 72 2d 3e 66 6c 61 67 73  (!(newPtr->flags
0920: 20 26 20 54 4b 5f 41 4c 52 45 41 44 59 5f 44 45   & TK_ALREADY_DE
0930: 41 44 29 29 20 7b 0a 09 09 43 74 6b 53 65 74 46  AD)) {...CtkSetF
0940: 6f 63 75 73 28 6e 65 77 50 74 72 29 3b 0a 09 20  ocus(newPtr);.. 
0950: 20 20 20 7d 0a 09 20 20 20 20 72 65 74 75 72 6e     }..    return
0960: 20 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 20 20 20 20   TCL_OK;..}.    
0970: 7d 0a 0a 20 20 20 20 6c 65 6e 67 74 68 20 3d 20  }..    length = 
0980: 73 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d 29 3b  strlen(argv[1]);
0990: 0a 20 20 20 20 63 20 3d 20 61 72 67 76 5b 31 5d  .    c = argv[1]
09a0: 5b 31 5d 3b 0a 20 20 20 20 69 66 20 28 28 63 20  [1];.    if ((c 
09b0: 3d 3d 20 27 64 27 29 20 26 26 20 28 73 74 72 6e  == 'd') && (strn
09c0: 63 6d 70 28 61 72 67 76 5b 31 5d 2c 20 22 2d 64  cmp(argv[1], "-d
09d0: 69 73 70 6c 61 79 6f 66 22 2c 20 6c 65 6e 67 74  isplayof", lengt
09e0: 68 29 20 3d 3d 20 30 29 29 20 7b 0a 09 69 66 20  h) == 0)) {..if 
09f0: 28 61 72 67 63 20 21 3d 20 33 29 20 7b 0a 09 20  (argc != 3) {.. 
0a00: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
0a10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
0a20: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
0a30: 64 20 62 65 20 5c 22 22 2c 0a 09 09 20 20 20 20  d be \"",...    
0a40: 61 72 67 76 5b 30 5d 2c 20 22 20 2d 64 69 73 70  argv[0], " -disp
0a50: 6c 61 79 6f 66 20 77 69 6e 64 6f 77 5c 22 22 2c  layof window\"",
0a60: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
0a70: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
0a80: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 6e 65 77 50  _ERROR;..}..newP
0a90: 74 72 20 3d 20 28 54 6b 57 69 6e 64 6f 77 20 2a  tr = (TkWindow *
0aa0: 29 20 54 6b 5f 4e 61 6d 65 54 6f 57 69 6e 64 6f  ) Tk_NameToWindo
0ab0: 77 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  w(interp, argv[2
0ac0: 5d 2c 20 74 6b 77 69 6e 29 3b 0a 09 69 66 20 28  ], tkwin);..if (
0ad0: 6e 65 77 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20  newPtr == NULL) 
0ae0: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  {..    return TC
0af0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 6e 65 77  L_ERROR;..}..new
0b00: 50 74 72 20 3d 20 54 6b 47 65 74 46 6f 63 75 73  Ptr = TkGetFocus
0b10: 28 6e 65 77 50 74 72 29 3b 0a 09 69 66 20 28 6e  (newPtr);..if (n
0b20: 65 77 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b  ewPtr != NULL) {
0b30: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ..    Tcl_SetRes
0b40: 75 6c 74 28 69 6e 74 65 72 70 2c 6e 65 77 50 74  ult(interp,newPt
0b50: 72 2d 3e 70 61 74 68 4e 61 6d 65 2c 54 43 4c 5f  r->pathName,TCL_
0b60: 56 4f 4c 41 54 49 4c 45 29 3b 0a 09 7d 0a 20 20  VOLATILE);..}.  
0b70: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28 63 20    } else if ((c 
0b80: 3d 3d 20 27 66 27 29 20 26 26 20 28 73 74 72 6e  == 'f') && (strn
0b90: 63 6d 70 28 61 72 67 76 5b 31 5d 2c 20 22 2d 66  cmp(argv[1], "-f
0ba0: 6f 72 63 65 22 2c 20 6c 65 6e 67 74 68 29 20 3d  orce", length) =
0bb0: 3d 20 30 29 29 20 7b 0a 09 69 66 20 28 61 72 67  = 0)) {..if (arg
0bc0: 63 20 21 3d 20 33 29 20 7b 0a 09 20 20 20 20 54  c != 3) {..    T
0bd0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
0be0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
0bf0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
0c00: 20 5c 22 22 2c 0a 09 09 20 20 20 20 61 72 67 76   \"",...    argv
0c10: 5b 30 5d 2c 20 22 20 2d 66 6f 72 63 65 20 77 69  [0], " -force wi
0c20: 6e 64 6f 77 5c 22 22 2c 20 28 63 68 61 72 20 2a  ndow\"", (char *
0c30: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65  ) NULL);..    re
0c40: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
0c50: 09 7d 0a 09 69 66 20 28 61 72 67 76 5b 32 5d 5b  .}..if (argv[2][
0c60: 30 5d 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20  0] == 0) {..    
0c70: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09  return TCL_OK;..
0c80: 7d 0a 09 6e 65 77 50 74 72 20 3d 20 28 54 6b 57  }..newPtr = (TkW
0c90: 69 6e 64 6f 77 20 2a 29 20 54 6b 5f 4e 61 6d 65  indow *) Tk_Name
0ca0: 54 6f 57 69 6e 64 6f 77 28 69 6e 74 65 72 70 2c  ToWindow(interp,
0cb0: 20 61 72 67 76 5b 31 5d 2c 20 74 6b 77 69 6e 29   argv[1], tkwin)
0cc0: 3b 0a 09 69 66 20 28 6e 65 77 50 74 72 20 3d 3d  ;..if (newPtr ==
0cd0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65   NULL) {..    re
0ce0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
0cf0: 09 7d 0a 09 43 74 6b 53 65 74 46 6f 63 75 73 28  .}..CtkSetFocus(
0d00: 6e 65 77 50 74 72 29 3b 0a 20 20 20 20 7d 20 65  newPtr);.    } e
0d10: 6c 73 65 20 69 66 20 28 28 63 20 3d 3d 20 27 6c  lse if ((c == 'l
0d20: 27 29 20 26 26 20 28 73 74 72 6e 63 6d 70 28 61  ') && (strncmp(a
0d30: 72 67 76 5b 31 5d 2c 20 22 2d 6c 61 73 74 66 6f  rgv[1], "-lastfo
0d40: 72 22 2c 20 6c 65 6e 67 74 68 29 20 3d 3d 20 30  r", length) == 0
0d50: 29 29 20 7b 0a 09 69 66 20 28 61 72 67 63 20 21  )) {..if (argc !
0d60: 3d 20 33 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  = 3) {..    Tcl_
0d70: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
0d80: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
0d90: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
0da0: 22 2c 0a 09 09 20 20 20 20 61 72 67 76 5b 30 5d  ",...    argv[0]
0db0: 2c 20 22 20 2d 6c 61 73 74 66 6f 72 20 77 69 6e  , " -lastfor win
0dc0: 64 6f 77 5c 22 22 2c 20 28 63 68 61 72 20 2a 29  dow\"", (char *)
0dd0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
0de0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
0df0: 7d 0a 09 6e 65 77 50 74 72 20 3d 20 28 54 6b 57  }..newPtr = (TkW
0e00: 69 6e 64 6f 77 20 2a 29 20 54 6b 5f 4e 61 6d 65  indow *) Tk_Name
0e10: 54 6f 57 69 6e 64 6f 77 28 69 6e 74 65 72 70 2c  ToWindow(interp,
0e20: 20 61 72 67 76 5b 32 5d 2c 20 74 6b 77 69 6e 29   argv[2], tkwin)
0e30: 3b 0a 09 69 66 20 28 6e 65 77 50 74 72 20 3d 3d  ;..if (newPtr ==
0e40: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65   NULL) {..    re
0e50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
0e60: 09 7d 0a 09 74 6f 70 4c 65 76 65 6c 50 74 72 20  .}..topLevelPtr 
0e70: 3d 20 43 74 6b 5f 54 6f 70 4c 65 76 65 6c 28 6e  = Ctk_TopLevel(n
0e80: 65 77 50 74 72 29 3b 0a 09 68 50 74 72 20 3d 20  ewPtr);..hPtr = 
0e90: 54 63 6c 5f 46 69 6e 64 48 61 73 68 45 6e 74 72  Tcl_FindHashEntr
0ea0: 79 28 26 66 6f 63 75 73 54 61 62 6c 65 2c 20 28  y(&focusTable, (
0eb0: 63 68 61 72 20 2a 29 20 74 6f 70 4c 65 76 65 6c  char *) topLevel
0ec0: 50 74 72 29 3b 0a 09 69 66 20 28 68 50 74 72 20  Ptr);..if (hPtr 
0ed0: 26 26 20 28 6e 65 77 50 74 72 20 3d 20 28 54 6b  && (newPtr = (Tk
0ee0: 57 69 6e 64 6f 77 20 2a 29 20 54 63 6c 5f 47 65  Window *) Tcl_Ge
0ef0: 74 48 61 73 68 56 61 6c 75 65 28 68 50 74 72 29  tHashValue(hPtr)
0f00: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65  )) {..    Tcl_Se
0f10: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 74  tResult(interp,t
0f20: 6f 70 4c 65 76 65 6c 50 74 72 2d 3e 70 61 74 68  opLevelPtr->path
0f30: 4e 61 6d 65 2c 54 43 4c 5f 56 4f 4c 41 54 49 4c  Name,TCL_VOLATIL
0f40: 45 29 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73  E);..}.    } els
0f50: 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  e {..Tcl_AppendR
0f60: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
0f70: 61 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 61  ad option \"", a
0f80: 72 67 76 5b 31 5d 2c 0a 09 09 22 5c 22 3a 20 6d  rgv[1],..."\": m
0f90: 75 73 74 20 62 65 20 2d 64 69 73 70 6c 61 79 6f  ust be -displayo
0fa0: 66 2c 20 2d 66 6f 72 63 65 2c 20 6f 72 20 2d 6c  f, -force, or -l
0fb0: 61 73 74 66 6f 72 22 2c 20 28 63 68 61 72 20 2a  astfor", (char *
0fc0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
0fd0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
0fe0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  }.    return TCL
0ff0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1040: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 74 6b 53 65  ----. *. * CtkSe
1050: 74 46 6f 63 75 73 20 2d 2d 0a 20 2a 0a 20 2a 09  tFocus --. *. *.
1060: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
1070: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 63 68 61  s invoked to cha
1080: 6e 67 65 20 74 68 65 20 66 6f 63 75 73 20 77 69  nge the focus wi
1090: 6e 64 6f 77 20 66 6f 72 20 61 0a 20 2a 09 67 69  ndow for a. *.gi
10a0: 76 65 6e 20 64 69 73 70 6c 61 79 20 69 6e 20 61  ven display in a
10b0: 20 67 69 76 65 6e 20 61 70 70 6c 69 63 61 74 69   given applicati
10c0: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  on.. *. * Result
10d0: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
10e0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
10f0: 20 2a 09 45 76 65 6e 74 20 68 61 6e 64 6c 65 72   *.Event handler
1100: 73 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64  s may be invoked
1110: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
1120: 63 68 61 6e 67 65 20 6f 66 0a 20 2a 09 66 6f 63  change of. *.foc
1130: 75 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  us.. *. *-------
1140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1180: 20 2a 2f 0a 0a 76 6f 69 64 0a 43 74 6b 53 65 74   */..void.CtkSet
1190: 46 6f 63 75 73 28 77 69 6e 50 74 72 29 0a 20 20  Focus(winPtr).  
11a0: 20 20 54 6b 57 69 6e 64 6f 77 20 2a 77 69 6e 50    TkWindow *winP
11b0: 74 72 3b 0a 7b 0a 20 20 20 20 54 6b 57 69 6e 64  tr;.{.    TkWind
11c0: 6f 77 20 2a 66 6f 63 75 73 50 74 72 20 3d 20 77  ow *focusPtr = w
11d0: 69 6e 50 74 72 2d 3e 64 69 73 70 50 74 72 2d 3e  inPtr->dispPtr->
11e0: 66 6f 63 75 73 50 74 72 3b 0a 20 20 20 20 43 74  focusPtr;.    Ct
11f0: 6b 5f 45 76 65 6e 74 20 65 76 65 6e 74 3b 0a 20  k_Event event;. 
1200: 20 20 20 54 63 6c 5f 48 61 73 68 45 6e 74 72 79     Tcl_HashEntry
1210: 20 2a 68 50 74 72 3b 0a 20 20 20 20 69 6e 74 20   *hPtr;.    int 
1220: 6e 65 77 3b 0a 0a 20 20 20 20 69 66 20 28 21 69  new;..    if (!i
1230: 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 54  nitialized) {..T
1240: 63 6c 5f 49 6e 69 74 48 61 73 68 54 61 62 6c 65  cl_InitHashTable
1250: 28 26 66 6f 63 75 73 54 61 62 6c 65 2c 20 54 43  (&focusTable, TC
1260: 4c 5f 4f 4e 45 5f 57 4f 52 44 5f 4b 45 59 53 29  L_ONE_WORD_KEYS)
1270: 3b 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  ;..initialized =
1280: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
1290: 20 28 77 69 6e 50 74 72 20 3d 3d 20 28 54 6b 57   (winPtr == (TkW
12a0: 69 6e 64 6f 77 20 2a 29 4e 55 4c 4c 20 7c 7c 20  indow *)NULL || 
12b0: 28 77 69 6e 50 74 72 2d 3e 66 6c 61 67 73 20 26  (winPtr->flags &
12c0: 20 54 4b 5f 41 4c 52 45 41 44 59 5f 44 45 41 44   TK_ALREADY_DEAD
12d0: 29 29 20 7b 0a 20 20 20 20 09 70 61 6e 69 63 28  )) {.    .panic(
12e0: 22 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20  "Attempt to set 
12f0: 66 6f 63 75 73 20 74 6f 20 6e 75 6c 6c 2f 64 65  focus to null/de
1300: 61 64 20 77 69 6e 64 6f 77 22 29 3b 0a 20 20 20  ad window");.   
1310: 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6b 5f 49   }..    if (Tk_I
1320: 73 54 6f 70 4c 65 76 65 6c 28 77 69 6e 50 74 72  sTopLevel(winPtr
1330: 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 57 69 6e  )) {../*.. * Win
1340: 64 6f 77 20 69 73 20 61 20 74 6f 70 2d 6c 65 76  dow is a top-lev
1350: 65 6c 2e 0a 09 20 2a 20 43 68 61 6e 67 65 20 66  el... * Change f
1360: 6f 63 75 73 20 64 65 73 74 69 6e 61 74 69 6f 6e  ocus destination
1370: 20 74 6f 20 6c 6f 63 61 6c 20 66 6f 63 75 73 20   to local focus 
1380: 6f 66 20 74 6f 70 2d 6c 65 76 65 6c 2e 0a 09 20  of top-level... 
1390: 2a 2f 0a 09 68 50 74 72 20 3d 20 54 63 6c 5f 46  */..hPtr = Tcl_F
13a0: 69 6e 64 48 61 73 68 45 6e 74 72 79 28 26 66 6f  indHashEntry(&fo
13b0: 63 75 73 54 61 62 6c 65 2c 20 28 63 68 61 72 20  cusTable, (char 
13c0: 2a 29 20 77 69 6e 50 74 72 29 3b 0a 09 69 66 20  *) winPtr);..if 
13d0: 28 68 50 74 72 20 26 26 20 54 63 6c 5f 47 65 74  (hPtr && Tcl_Get
13e0: 48 61 73 68 56 61 6c 75 65 28 68 50 74 72 29 29  HashValue(hPtr))
13f0: 20 7b 0a 09 20 20 20 20 77 69 6e 50 74 72 20 3d   {..    winPtr =
1400: 20 28 54 6b 57 69 6e 64 6f 77 20 2a 29 20 54 63   (TkWindow *) Tc
1410: 6c 5f 47 65 74 48 61 73 68 56 61 6c 75 65 28 68  l_GetHashValue(h
1420: 50 74 72 29 3b 0a 09 7d 0a 20 20 20 20 7d 20 65  Ptr);..}.    } e
1430: 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20 2a 20 53 65  lse {../*.. * Se
1440: 74 20 6c 6f 63 61 6c 20 66 6f 63 75 73 20 6f 66  t local focus of
1450: 20 77 69 6e 50 74 72 27 73 20 74 6f 70 2d 6c 65   winPtr's top-le
1460: 76 65 6c 20 74 6f 20 77 69 6e 50 74 72 2e 0a 09  vel to winPtr...
1470: 20 2a 2f 0a 09 68 50 74 72 20 3d 20 54 63 6c 5f   */..hPtr = Tcl_
1480: 43 72 65 61 74 65 48 61 73 68 45 6e 74 72 79 28  CreateHashEntry(
1490: 26 66 6f 63 75 73 54 61 62 6c 65 2c 20 28 63 68  &focusTable, (ch
14a0: 61 72 20 2a 29 20 43 74 6b 5f 54 6f 70 4c 65 76  ar *) Ctk_TopLev
14b0: 65 6c 28 77 69 6e 50 74 72 29 2c 0a 09 09 26 6e  el(winPtr),...&n
14c0: 65 77 29 3b 0a 09 54 63 6c 5f 53 65 74 48 61 73  ew);..Tcl_SetHas
14d0: 68 56 61 6c 75 65 28 68 50 74 72 2c 20 28 43 6c  hValue(hPtr, (Cl
14e0: 69 65 6e 74 44 61 74 61 29 20 77 69 6e 50 74 72  ientData) winPtr
14f0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
1500: 20 28 77 69 6e 50 74 72 20 21 3d 20 66 6f 63 75   (winPtr != focu
1510: 73 50 74 72 29 20 7b 0a 20 20 20 20 20 20 20 20  sPtr) {.        
1520: 69 66 20 28 66 6f 63 75 73 50 74 72 20 26 26 20  if (focusPtr && 
1530: 21 28 66 6f 63 75 73 50 74 72 2d 3e 66 6c 61 67  !(focusPtr->flag
1540: 73 20 26 20 54 4b 5f 41 4c 52 45 41 44 59 5f 44  s & TK_ALREADY_D
1550: 45 41 44 29 29 20 7b 0a 09 20 20 20 20 65 76 65  EAD)) {..    eve
1560: 6e 74 2e 74 79 70 65 20 3d 20 43 54 4b 5f 55 4e  nt.type = CTK_UN
1570: 46 4f 43 55 53 5f 45 56 45 4e 54 3b 0a 09 20 20  FOCUS_EVENT;..  
1580: 20 20 65 76 65 6e 74 2e 77 69 6e 64 6f 77 20 3d    event.window =
1590: 20 66 6f 63 75 73 50 74 72 3b 0a 09 20 20 20 20   focusPtr;..    
15a0: 54 6b 5f 48 61 6e 64 6c 65 45 76 65 6e 74 28 26  Tk_HandleEvent(&
15b0: 65 76 65 6e 74 29 3b 0a 09 7d 0a 09 77 69 6e 50  event);..}..winP
15c0: 74 72 2d 3e 64 69 73 70 50 74 72 2d 3e 66 6f 63  tr->dispPtr->foc
15d0: 75 73 50 74 72 20 3d 20 77 69 6e 50 74 72 3b 0a  usPtr = winPtr;.
15e0: 09 43 74 6b 5f 53 65 74 43 75 72 73 6f 72 28 77  .Ctk_SetCursor(w
15f0: 69 6e 50 74 72 2c 20 30 2c 20 30 29 3b 0a 09 65  inPtr, 0, 0);..e
1600: 76 65 6e 74 2e 74 79 70 65 20 3d 20 43 54 4b 5f  vent.type = CTK_
1610: 46 4f 43 55 53 5f 45 56 45 4e 54 3b 0a 09 65 76  FOCUS_EVENT;..ev
1620: 65 6e 74 2e 77 69 6e 64 6f 77 20 3d 20 77 69 6e  ent.window = win
1630: 50 74 72 3b 0a 09 54 6b 5f 48 61 6e 64 6c 65 45  Ptr;..Tk_HandleE
1640: 76 65 6e 74 28 26 65 76 65 6e 74 29 3b 0a 20 20  vent(&event);.  
1650: 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d    }.}.../*. *---
1660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6b 47 65 74 46  ---. *. * TkGetF
16b0: 6f 63 75 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 69  ocus --. *. *.Gi
16c0: 76 65 6e 20 61 20 77 69 6e 64 6f 77 2c 20 74 68  ven a window, th
16d0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
16e0: 75 72 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74  urns the current
16f0: 20 66 6f 63 75 73 0a 20 2a 09 77 69 6e 64 6f 77   focus. *.window
1700: 20 66 6f 72 20 69 74 73 20 61 70 70 6c 69 63 61   for its applica
1710: 74 69 6f 6e 20 61 6e 64 20 64 69 73 70 6c 61 79  tion and display
1720: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
1730: 0a 20 2a 09 54 68 65 20 72 65 74 75 72 6e 20 76  . *.The return v
1740: 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
1750: 72 20 74 6f 20 74 68 65 20 77 69 6e 64 6f 77 20  r to the window 
1760: 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 0a 20  that currently. 
1770: 2a 09 68 61 73 20 74 68 65 20 69 6e 70 75 74 20  *.has the input 
1780: 66 6f 63 75 73 20 66 6f 72 20 74 68 65 20 73 70  focus for the sp
1790: 65 63 69 66 69 65 64 20 61 70 70 6c 69 63 61 74  ecified applicat
17a0: 69 6f 6e 20 61 6e 64 0a 20 2a 09 64 69 73 70 6c  ion and. *.displ
17b0: 61 79 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  ay, or NULL if n
17c0: 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  one.. *. * Side 
17d0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
17e0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
17f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
1830: 2f 0a 0a 54 6b 57 69 6e 64 6f 77 20 2a 0a 54 6b  /..TkWindow *.Tk
1840: 47 65 74 46 6f 63 75 73 28 77 69 6e 50 74 72 29  GetFocus(winPtr)
1850: 0a 20 20 20 20 54 6b 57 69 6e 64 6f 77 20 2a 77  .    TkWindow *w
1860: 69 6e 50 74 72 3b 0a 7b 0a 20 20 20 20 72 65 74  inPtr;.{.    ret
1870: 75 72 6e 20 77 69 6e 50 74 72 2d 3e 64 69 73 70  urn winPtr->disp
1880: 50 74 72 2d 3e 66 6f 63 75 73 50 74 72 3b 0a 7d  Ptr->focusPtr;.}
1890: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
18a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
18e0: 2a 0a 20 2a 20 54 6b 46 6f 63 75 73 44 65 61 64  *. * TkFocusDead
18f0: 57 69 6e 64 6f 77 20 2d 2d 0a 20 2a 0a 20 2a 09  Window --. *. *.
1900: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
1910: 73 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 69  s invoked when i
1920: 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  t is determined 
1930: 74 68 61 74 0a 20 2a 09 61 20 77 69 6e 64 6f 77  that. *.a window
1940: 20 69 73 20 64 65 61 64 2e 20 20 49 74 20 63 6c   is dead.  It cl
1950: 65 61 6e 73 20 75 70 20 66 6f 63 75 73 2d 72 65  eans up focus-re
1960: 6c 61 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  lated informatio
1970: 6e 0a 20 2a 09 61 62 6f 75 74 20 74 68 65 20 77  n. *.about the w
1980: 69 6e 64 6f 77 2e 0a 20 2a 0a 20 2a 20 52 65 73  indow.. *. * Res
1990: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ults:. *.None.. 
19a0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
19b0: 73 3a 0a 20 2a 09 54 68 65 20 69 6e 70 75 74 20  s:. *.The input 
19c0: 66 6f 63 75 73 20 66 6f 72 20 74 68 65 20 77 69  focus for the wi
19d0: 6e 64 6f 77 27 73 20 64 69 73 70 6c 61 79 20 6d  ndow's display m
19e0: 61 79 20 63 68 61 6e 67 65 2e 0a 20 2a 0a 20 2a  ay change.. *. *
19f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a30: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 76 6f 69 64  ------. */..void
1a40: 0a 54 6b 46 6f 63 75 73 44 65 61 64 57 69 6e 64  .TkFocusDeadWind
1a50: 6f 77 28 77 69 6e 50 74 72 29 0a 20 20 20 20 54  ow(winPtr).    T
1a60: 6b 57 69 6e 64 6f 77 20 2a 77 69 6e 50 74 72 3b  kWindow *winPtr;
1a70: 0a 7b 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69  .{.    if (initi
1a80: 61 6c 69 7a 65 64 29 20 7b 0a 09 2f 2a 0a 09 20  alized) {../*.. 
1a90: 2a 20 52 65 6d 6f 76 65 20 77 69 6e 64 6f 77 20  * Remove window 
1aa0: 66 72 6f 6d 20 66 6f 63 75 73 54 61 62 6c 65 2e  from focusTable.
1ab0: 20 20 44 65 6c 65 74 65 20 68 61 73 68 20 65 6e    Delete hash en
1ac0: 74 72 79 20 69 66 20 77 69 6e 50 74 72 0a 09 20  try if winPtr.. 
1ad0: 2a 20 69 73 20 61 20 74 6f 70 2d 6c 65 76 65 6c  * is a top-level
1ae0: 2e 20 20 43 6c 65 61 72 20 68 61 73 68 20 65 6e  .  Clear hash en
1af0: 74 72 79 20 76 61 6c 75 65 20 69 66 20 77 69 6e  try value if win
1b00: 50 74 72 20 68 61 73 20 61 20 6c 6f 63 61 6c 0a  Ptr has a local.
1b10: 09 20 2a 20 66 6f 63 75 73 2e 0a 09 20 2a 2f 0a  . * focus... */.
1b20: 09 54 63 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a  .Tcl_HashEntry *
1b30: 68 50 74 72 3b 0a 09 54 6b 57 69 6e 64 6f 77 20  hPtr;..TkWindow 
1b40: 2a 66 6f 63 75 73 50 74 72 3b 0a 0a 09 69 66 20  *focusPtr;...if 
1b50: 28 54 6b 5f 49 73 54 6f 70 4c 65 76 65 6c 28 77  (Tk_IsTopLevel(w
1b60: 69 6e 50 74 72 29 29 20 7b 0a 09 20 20 20 20 68  inPtr)) {..    h
1b70: 50 74 72 20 3d 20 54 63 6c 5f 46 69 6e 64 48 61  Ptr = Tcl_FindHa
1b80: 73 68 45 6e 74 72 79 28 26 66 6f 63 75 73 54 61  shEntry(&focusTa
1b90: 62 6c 65 2c 20 28 63 68 61 72 20 2a 29 20 77 69  ble, (char *) wi
1ba0: 6e 50 74 72 29 3b 0a 09 20 20 20 20 69 66 20 28  nPtr);..    if (
1bb0: 68 50 74 72 29 20 20 54 63 6c 5f 44 65 6c 65 74  hPtr)  Tcl_Delet
1bc0: 65 48 61 73 68 45 6e 74 72 79 28 68 50 74 72 29  eHashEntry(hPtr)
1bd0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
1be0: 20 68 50 74 72 20 3d 20 54 63 6c 5f 46 69 6e 64   hPtr = Tcl_Find
1bf0: 48 61 73 68 45 6e 74 72 79 28 26 66 6f 63 75 73  HashEntry(&focus
1c00: 54 61 62 6c 65 2c 0a 09 09 20 20 20 20 28 63 68  Table,...    (ch
1c10: 61 72 20 2a 29 20 43 74 6b 5f 54 6f 70 4c 65 76  ar *) Ctk_TopLev
1c20: 65 6c 28 77 69 6e 50 74 72 29 29 3b 0a 09 20 20  el(winPtr));..  
1c30: 20 20 69 66 20 28 68 50 74 72 20 26 26 20 77 69    if (hPtr && wi
1c40: 6e 50 74 72 20 3d 3d 20 28 54 6b 57 69 6e 64 6f  nPtr == (TkWindo
1c50: 77 20 2a 29 20 54 63 6c 5f 47 65 74 48 61 73 68  w *) Tcl_GetHash
1c60: 56 61 6c 75 65 28 68 50 74 72 29 29 20 7b 0a 09  Value(hPtr)) {..
1c70: 09 54 63 6c 5f 53 65 74 48 61 73 68 56 61 6c 75  .Tcl_SetHashValu
1c80: 65 28 68 50 74 72 2c 20 28 43 6c 69 65 6e 74 44  e(hPtr, (ClientD
1c90: 61 74 61 29 20 28 54 6b 57 69 6e 64 6f 77 20 2a  ata) (TkWindow *
1ca0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 7d 0a  ) NULL);..    }.
1cb0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  .}.    }..    if
1cc0: 20 28 77 69 6e 50 74 72 20 3d 3d 20 77 69 6e 50   (winPtr == winP
1cd0: 74 72 2d 3e 64 69 73 70 50 74 72 2d 3e 66 6f 63  tr->dispPtr->foc
1ce0: 75 73 50 74 72 29 20 7b 0a 20 20 20 20 09 2f 2a  usPtr) {.    ./*
1cf0: 0a 20 20 20 20 09 20 2a 20 54 68 69 73 20 77 69  .    . * This wi
1d00: 6e 64 6f 77 20 68 61 73 20 74 68 65 20 66 6f 63  ndow has the foc
1d10: 75 73 2c 20 74 72 79 20 74 6f 20 70 61 73 73 20  us, try to pass 
1d20: 66 6f 63 75 73 20 66 69 72 73 74 20 74 6f 0a 20  focus first to. 
1d30: 20 20 20 09 20 2a 20 77 69 6e 64 6f 77 27 73 20     . * window's 
1d40: 74 6f 70 2d 6c 65 76 65 6c 2c 20 74 68 65 6e 20  top-level, then 
1d50: 74 6f 20 74 6f 70 6d 6f 73 74 20 76 69 73 69 62  to topmost visib
1d60: 6c 65 20 74 6f 70 2d 6c 65 76 65 6c 2c 0a 09 20  le top-level,.. 
1d70: 2a 20 74 68 65 6e 20 74 6f 20 6d 61 69 6e 20 74  * then to main t
1d80: 6f 70 2d 6c 65 76 65 6c 2e 20 20 49 66 20 6e 6f  op-level.  If no
1d90: 6e 65 20 6f 66 20 74 68 65 73 65 20 65 78 69 73  ne of these exis
1da0: 74 0a 20 20 20 20 09 20 2a 20 74 68 65 6e 20 67  t.    . * then g
1db0: 69 76 65 20 75 70 20 2d 20 74 68 65 20 61 70 70  ive up - the app
1dc0: 6c 69 63 61 74 69 6f 6e 20 77 69 6c 6c 20 68 61  lication will ha
1dd0: 76 65 20 65 78 69 74 65 64 0a 20 20 20 20 09 20  ve exited.    . 
1de0: 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6d 6f 72  * before any mor
1df0: 65 20 6b 65 79 20 65 76 65 6e 74 73 20 77 69 6c  e key events wil
1e00: 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 29 2e  l be processed).
1e10: 0a 20 20 20 20 09 20 2a 2f 0a 20 20 20 20 09 54  .    . */.    .T
1e20: 6b 57 69 6e 64 6f 77 20 2a 6e 65 77 46 6f 63 75  kWindow *newFocu
1e30: 73 50 74 72 20 3d 20 43 74 6b 5f 54 6f 70 4c 65  sPtr = Ctk_TopLe
1e40: 76 65 6c 28 77 69 6e 50 74 72 29 3b 0a 0a 09 69  vel(winPtr);...i
1e50: 66 20 28 21 28 6e 65 77 46 6f 63 75 73 50 74 72  f (!(newFocusPtr
1e60: 2d 3e 66 6c 61 67 73 20 26 20 54 4b 5f 41 4c 52  ->flags & TK_ALR
1e70: 45 41 44 59 5f 44 45 41 44 29 29 20 20 67 6f 74  EADY_DEAD))  got
1e80: 6f 20 67 6f 74 66 6f 63 75 73 3b 0a 09 66 6f 72  o gotfocus;..for
1e90: 20 28 6e 65 77 46 6f 63 75 73 50 74 72 20 3d 20   (newFocusPtr = 
1ea0: 43 74 6b 5f 54 6f 70 43 68 69 6c 64 28 77 69 6e  Ctk_TopChild(win
1eb0: 50 74 72 2d 3e 64 69 73 70 50 74 72 2d 3e 72 6f  Ptr->dispPtr->ro
1ec0: 6f 74 50 74 72 29 3b 0a 09 09 20 6e 65 77 46 6f  otPtr);... newFo
1ed0: 63 75 73 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a  cusPtr != NULL;.
1ee0: 09 09 20 6e 65 77 46 6f 63 75 73 50 74 72 20 3d  .. newFocusPtr =
1ef0: 20 43 74 6b 5f 50 72 69 6f 72 53 69 62 6c 69 6e   Ctk_PriorSiblin
1f00: 67 28 6e 65 77 46 6f 63 75 73 50 74 72 29 29 20  g(newFocusPtr)) 
1f10: 7b 0a 09 20 20 20 20 69 66 20 28 21 28 6e 65 77  {..    if (!(new
1f20: 46 6f 63 75 73 50 74 72 2d 3e 66 6c 61 67 73 20  FocusPtr->flags 
1f30: 26 20 54 4b 5f 41 4c 52 45 41 44 59 5f 44 45 41  & TK_ALREADY_DEA
1f40: 44 29 0a 09 09 20 20 20 20 26 26 20 28 6e 65 77  D)...    && (new
1f50: 46 6f 63 75 73 50 74 72 2d 3e 66 6c 61 67 73 20  FocusPtr->flags 
1f60: 26 20 43 54 4b 5f 44 49 53 50 4c 41 59 45 44 29  & CTK_DISPLAYED)
1f70: 29 20 7b 0a 09 09 67 6f 74 6f 20 67 6f 74 66 6f  ) {...goto gotfo
1f80: 63 75 73 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  cus;..    }..}..
1f90: 6e 65 77 46 6f 63 75 73 50 74 72 20 3d 20 43 74  newFocusPtr = Ct
1fa0: 6b 5f 42 6f 74 74 6f 6d 43 68 69 6c 64 28 77 69  k_BottomChild(wi
1fb0: 6e 50 74 72 2d 3e 64 69 73 70 50 74 72 2d 3e 72  nPtr->dispPtr->r
1fc0: 6f 6f 74 50 74 72 29 3b 0a 09 69 66 20 28 6e 65  ootPtr);..if (ne
1fd0: 77 46 6f 63 75 73 50 74 72 20 26 26 20 21 28 6e  wFocusPtr && !(n
1fe0: 65 77 46 6f 63 75 73 50 74 72 2d 3e 66 6c 61 67  ewFocusPtr->flag
1ff0: 73 20 26 20 54 4b 5f 41 4c 52 45 41 44 59 5f 44  s & TK_ALREADY_D
2000: 45 41 44 29 29 20 7b 0a 67 6f 74 66 6f 63 75 73  EAD)) {.gotfocus
2010: 3a 0a 09 20 20 20 20 43 74 6b 53 65 74 46 6f 63  :..    CtkSetFoc
2020: 75 73 28 6e 65 77 46 6f 63 75 73 50 74 72 29 3b  us(newFocusPtr);
2030: 0a 09 7d 0a 20 20 20 20 7d 0a 7d 0a              ..}.    }.}.