Tk Source Code

Hex Artifact Content
Login

Artifact 9513e2cdfa29d4be90f97923304f241c3c77feeda00237f77f756d0109ebfcb9:


0000: 2f 2a 0a 20 2a 20 74 6b 4d 61 63 4f 53 58 4b 65  /*. * tkMacOSXKe
0010: 79 45 76 65 6e 74 2e 63 20 2d 2d 0a 20 2a 0a 20  yEvent.c --. *. 
0020: 2a 09 54 68 69 73 20 66 69 6c 65 20 69 6d 70 6c  *.This file impl
0030: 65 6d 65 6e 74 73 20 66 75 6e 63 74 69 6f 6e 73  ements functions
0040: 20 74 68 61 74 20 64 65 63 6f 64 65 20 26 20 68   that decode & h
0050: 61 6e 64 6c 65 20 6b 65 79 62 6f 61 72 64 20 65  andle keyboard e
0060: 76 65 6e 74 73 20 6f 6e 0a 20 2a 09 4d 61 63 4f  vents on. *.MacO
0070: 53 20 58 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 72  S X.. *. * Copyr
0080: 69 67 68 74 20 32 30 30 31 2d 32 30 30 39 2c 20  ight 2001-2009, 
0090: 41 70 70 6c 65 20 49 6e 63 2e 0a 20 2a 20 43 6f  Apple Inc.. * Co
00a0: 70 79 72 69 67 68 74 20 28 63 29 20 32 30 30 36  pyright (c) 2006
00b0: 2d 32 30 30 39 20 44 61 6e 69 65 6c 20 41 2e 20  -2009 Daniel A. 
00c0: 53 74 65 66 66 65 6e 20 3c 64 61 73 40 75 73 65  Steffen <das@use
00d0: 72 73 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e  rs.sourceforge.n
00e0: 65 74 3e 0a 20 2a 20 43 6f 70 79 72 69 67 68 74  et>. * Copyright
00f0: 20 28 63 29 20 32 30 31 32 20 41 64 72 69 61 6e   (c) 2012 Adrian
0100: 20 52 6f 62 65 72 74 2e 0a 20 2a 20 43 6f 70 79   Robert.. * Copy
0110: 72 69 67 68 74 20 32 30 31 35 2d 32 30 32 30 20  right 2015-2020 
0120: 4d 61 72 63 20 43 75 6c 6c 65 72 2e 0a 20 2a 0a  Marc Culler.. *.
0130: 20 2a 20 53 65 65 20 74 68 65 20 66 69 6c 65 20   * See the file 
0140: 22 6c 69 63 65 6e 73 65 2e 74 65 72 6d 73 22 20  "license.terms" 
0150: 66 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  for information 
0160: 6f 6e 20 75 73 61 67 65 20 61 6e 64 20 72 65 64  on usage and red
0170: 69 73 74 72 69 62 75 74 69 6f 6e 20 6f 66 0a 20  istribution of. 
0180: 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64  * this file, and
0190: 20 66 6f 72 20 61 20 44 49 53 43 4c 41 49 4d 45   for a DISCLAIME
01a0: 52 20 4f 46 20 41 4c 4c 20 57 41 52 52 41 4e 54  R OF ALL WARRANT
01b0: 49 45 53 2e 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75  IES.. */..#inclu
01c0: 64 65 20 22 74 6b 4d 61 63 4f 53 58 50 72 69 76  de "tkMacOSXPriv
01d0: 61 74 65 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  ate.h".#include 
01e0: 22 74 6b 4d 61 63 4f 53 58 49 6e 74 2e 68 22 0a  "tkMacOSXInt.h".
01f0: 23 69 6e 63 6c 75 64 65 20 22 74 6b 4d 61 63 4f  #include "tkMacO
0200: 53 58 43 6f 6e 73 74 61 6e 74 73 2e 68 22 0a 23  SXConstants.h".#
0210: 69 6e 63 6c 75 64 65 20 22 74 6b 4d 61 63 4f 53  include "tkMacOS
0220: 58 57 6d 2e 68 22 0a 0a 2f 2a 0a 20 2a 20 53 65  XWm.h"../*. * Se
0230: 65 20 74 6b 4d 61 63 4f 53 58 50 72 69 76 61 74  e tkMacOSXPrivat
0240: 65 2e 68 20 66 6f 72 20 6d 61 63 72 6f 73 20 72  e.h for macros r
0250: 65 6c 61 74 65 64 20 74 6f 20 6b 65 79 20 65 76  elated to key ev
0260: 65 6e 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  ent processing..
0270: 20 2a 2f 0a 0a 2f 2a 0a 23 69 66 64 65 66 20 54   */../*.#ifdef T
0280: 4b 5f 4d 41 43 5f 44 45 42 55 47 0a 23 64 65 66  K_MAC_DEBUG.#def
0290: 69 6e 65 20 54 4b 5f 4d 41 43 5f 44 45 42 55 47  ine TK_MAC_DEBUG
02a0: 5f 4b 45 59 42 4f 41 52 44 0a 23 65 6e 64 69 66  _KEYBOARD.#endif
02b0: 0a 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 4e 53 5f  .*/..#define NS_
02c0: 4b 45 59 4c 4f 47 20 30 0a 23 64 65 66 69 6e 65  KEYLOG 0.#define
02d0: 20 58 45 56 45 4e 54 5f 4d 4f 44 5f 4d 41 53 4b   XEVENT_MOD_MASK
02e0: 20 28 43 6f 6e 74 72 6f 6c 4d 61 73 6b 20 7c 20   (ControlMask | 
02f0: 4d 6f 64 31 4d 61 73 6b 20 7c 20 4d 6f 64 33 4d  Mod1Mask | Mod3M
0300: 61 73 6b 20 7c 20 4d 6f 64 34 4d 61 73 6b 29 0a  ask | Mod4Mask).
0310: 73 74 61 74 69 63 20 54 6b 5f 57 69 6e 64 6f 77  static Tk_Window
0320: 20 6b 65 79 62 6f 61 72 64 47 72 61 62 57 69 6e   keyboardGrabWin
0330: 50 74 72 20 3d 20 4e 55 4c 4c 3b 20 2f 2a 20 43  Ptr = NULL; /* C
0340: 75 72 72 65 6e 74 20 6b 65 79 62 6f 61 72 64 20  urrent keyboard 
0350: 67 72 61 62 20 77 69 6e 64 6f 77 2e 20 2a 2f 0a  grab window. */.
0360: 73 74 61 74 69 63 20 4e 53 57 69 6e 64 6f 77 20  static NSWindow 
0370: 2a 6b 65 79 62 6f 61 72 64 47 72 61 62 4e 53 57  *keyboardGrabNSW
0380: 69 6e 64 6f 77 20 3d 20 6e 69 6c 3b 20 2f 2a 20  indow = nil; /* 
0390: 49 74 73 20 75 6e 64 65 72 6c 79 69 6e 67 20 4e  Its underlying N
03a0: 53 57 69 6e 64 6f 77 2e 2a 2f 0a 73 74 61 74 69  SWindow.*/.stati
03b0: 63 20 4e 53 4d 6f 64 61 6c 53 65 73 73 69 6f 6e  c NSModalSession
03c0: 20 6d 6f 64 61 6c 53 65 73 73 69 6f 6e 20 3d 20   modalSession = 
03d0: 6e 69 6c 3b 0a 73 74 61 74 69 63 20 42 4f 4f 4c  nil;.static BOOL
03e0: 20 70 72 6f 63 65 73 73 69 6e 67 43 6f 6d 70 6f   processingCompo
03f0: 73 65 20 3d 20 4e 4f 3b 0a 73 74 61 74 69 63 20  se = NO;.static 
0400: 54 6b 5f 57 69 6e 64 6f 77 20 63 6f 6d 70 6f 73  Tk_Window compos
0410: 65 57 69 6e 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61  eWin = NULL;.sta
0420: 74 69 63 20 69 6e 74 20 63 61 72 65 74 5f 78 20  tic int caret_x 
0430: 3d 20 30 2c 20 63 61 72 65 74 5f 79 20 3d 20 30  = 0, caret_y = 0
0440: 2c 20 63 61 72 65 74 5f 68 65 69 67 68 74 20 3d  , caret_height =
0450: 20 30 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20   0;.static void 
0460: 73 65 74 75 70 58 45 76 65 6e 74 28 58 45 76 65  setupXEvent(XEve
0470: 6e 74 20 2a 78 45 76 65 6e 74 2c 20 54 6b 5f 57  nt *xEvent, Tk_W
0480: 69 6e 64 6f 77 20 74 6b 77 69 6e 2c 20 4e 53 55  indow tkwin, NSU
0490: 49 6e 74 65 67 65 72 20 6d 6f 64 69 66 69 65 72  Integer modifier
04a0: 73 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  s);.static void 
04b0: 73 65 74 58 45 76 65 6e 74 50 6f 69 6e 74 28 58  setXEventPoint(X
04c0: 45 76 65 6e 74 20 2a 78 45 76 65 6e 74 2c 20 54  Event *xEvent, T
04d0: 6b 5f 57 69 6e 64 6f 77 20 74 6b 77 69 6e 2c 20  k_Window tkwin, 
04e0: 4e 53 57 69 6e 64 6f 77 20 2a 77 29 3b 0a 73 74  NSWindow *w);.st
04f0: 61 74 69 63 20 4e 53 55 49 6e 74 65 67 65 72 20  atic NSUInteger 
0500: 74 65 78 74 49 6e 70 75 74 4d 6f 64 69 66 69 65  textInputModifie
0510: 72 73 3b 0a 0a 23 70 72 61 67 6d 61 20 6d 61 72  rs;..#pragma mar
0520: 6b 20 54 4b 41 70 70 6c 69 63 61 74 69 6f 6e 28  k TKApplication(
0530: 54 4b 4b 65 79 45 76 65 6e 74 29 0a 0a 40 69 6d  TKKeyEvent)..@im
0540: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 54 4b 41  plementation TKA
0550: 70 70 6c 69 63 61 74 69 6f 6e 28 54 4b 4b 65 79  pplication(TKKey
0560: 45 76 65 6e 74 29 0a 0a 2d 20 28 4e 53 45 76 65  Event)..- (NSEve
0570: 6e 74 20 2a 29 20 74 6b 50 72 6f 63 65 73 73 4b  nt *) tkProcessK
0580: 65 79 45 76 65 6e 74 3a 20 28 4e 53 45 76 65 6e  eyEvent: (NSEven
0590: 74 20 2a 29 20 74 68 65 45 76 65 6e 74 0a 7b 0a  t *) theEvent.{.
05a0: 23 69 66 64 65 66 20 54 4b 5f 4d 41 43 5f 44 45  #ifdef TK_MAC_DE
05b0: 42 55 47 5f 45 56 45 4e 54 53 0a 20 20 20 20 54  BUG_EVENTS.    T
05c0: 4b 4c 6f 67 28 40 22 2d 5b 25 40 28 25 70 29 20  KLog(@"-[%@(%p) 
05d0: 25 73 5d 20 25 40 22 2c 20 5b 73 65 6c 66 20 63  %s] %@", [self c
05e0: 6c 61 73 73 5d 2c 20 73 65 6c 66 2c 20 5f 63 6d  lass], self, _cm
05f0: 64 2c 20 74 68 65 45 76 65 6e 74 29 3b 0a 23 65  d, theEvent);.#e
0600: 6e 64 69 66 0a 20 20 20 20 4e 53 57 69 6e 64 6f  ndif.    NSWindo
0610: 77 20 2a 77 20 3d 20 5b 74 68 65 45 76 65 6e 74  w *w = [theEvent
0620: 20 77 69 6e 64 6f 77 5d 3b 0a 20 20 20 20 54 6b   window];.    Tk
0630: 57 69 6e 64 6f 77 20 2a 77 69 6e 50 74 72 20 3d  Window *winPtr =
0640: 20 54 6b 4d 61 63 4f 53 58 47 65 74 54 6b 57 69   TkMacOSXGetTkWi
0650: 6e 64 6f 77 28 77 29 2c 20 2a 67 72 61 62 57 69  ndow(w), *grabWi
0660: 6e 50 74 72 2c 20 2a 66 6f 63 75 73 57 69 6e 50  nPtr, *focusWinP
0670: 74 72 3b 0a 20 20 20 20 54 6b 5f 57 69 6e 64 6f  tr;.    Tk_Windo
0680: 77 20 74 6b 77 69 6e 20 3d 20 28 54 6b 5f 57 69  w tkwin = (Tk_Wi
0690: 6e 64 6f 77 29 77 69 6e 50 74 72 3b 0a 20 20 20  ndow)winPtr;.   
06a0: 20 4e 53 45 76 65 6e 74 54 79 70 65 20 74 79 70   NSEventType typ
06b0: 65 20 3d 20 5b 74 68 65 45 76 65 6e 74 20 74 79  e = [theEvent ty
06c0: 70 65 5d 3b 0a 20 20 20 20 4e 53 55 49 6e 74 65  pe];.    NSUInte
06d0: 67 65 72 20 76 69 72 74 20 3d 20 5b 74 68 65 45  ger virt = [theE
06e0: 76 65 6e 74 20 6b 65 79 43 6f 64 65 5d 3b 0a 20  vent keyCode];. 
06f0: 20 20 20 4e 53 55 49 6e 74 65 67 65 72 20 6d 6f     NSUInteger mo
0700: 64 69 66 69 65 72 73 20 3d 20 28 5b 74 68 65 45  difiers = ([theE
0710: 76 65 6e 74 20 6d 6f 64 69 66 69 65 72 46 6c 61  vent modifierFla
0720: 67 73 5d 20 26 0a 09 09 09 20 20 20 20 4e 53 44  gs] &....    NSD
0730: 65 76 69 63 65 49 6e 64 65 70 65 6e 64 65 6e 74  eviceIndependent
0740: 4d 6f 64 69 66 69 65 72 46 6c 61 67 73 4d 61 73  ModifierFlagsMas
0750: 6b 29 3b 0a 20 20 20 20 58 45 76 65 6e 74 20 78  k);.    XEvent x
0760: 45 76 65 6e 74 3b 0a 20 20 20 20 4d 61 63 4b 65  Event;.    MacKe
0770: 79 63 6f 64 65 20 6d 61 63 4b 43 3b 0a 20 20 20  ycode macKC;.   
0780: 20 55 6e 69 43 68 61 72 20 6b 65 79 63 68 61 72   UniChar keychar
0790: 20 3d 20 30 3b 0a 20 20 20 20 42 6f 6f 6c 20 63   = 0;.    Bool c
07a0: 61 6e 5f 69 6e 70 75 74 5f 74 65 78 74 2c 20 68  an_input_text, h
07b0: 61 73 5f 6d 6f 64 69 66 69 65 72 73 20 3d 20 4e  as_modifiers = N
07c0: 4f 2c 20 75 73 65 5f 74 65 78 74 5f 69 6e 70 75  O, use_text_inpu
07d0: 74 20 3d 20 4e 4f 3b 0a 20 20 20 20 73 74 61 74  t = NO;.    stat
07e0: 69 63 20 4e 53 55 49 6e 74 65 67 65 72 20 73 61  ic NSUInteger sa
07f0: 76 65 64 4d 6f 64 69 66 69 65 72 73 20 3d 20 30  vedModifiers = 0
0800: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 4e 53 4d  ;.    static NSM
0810: 75 74 61 62 6c 65 41 72 72 61 79 20 2a 6e 73 45  utableArray *nsE
0820: 76 41 72 72 61 79 20 3d 20 6e 69 6c 3b 0a 0a 20  vArray = nil;.. 
0830: 20 20 20 69 66 20 28 6e 73 45 76 41 72 72 61 79     if (nsEvArray
0840: 20 3d 3d 20 6e 69 6c 29 20 7b 0a 20 20 20 20 20   == nil) {.     
0850: 20 20 20 6e 73 45 76 41 72 72 61 79 20 3d 20 5b     nsEvArray = [
0860: 5b 4e 53 4d 75 74 61 62 6c 65 41 72 72 61 79 20  [NSMutableArray 
0870: 61 6c 6c 6f 63 5d 20 69 6e 69 74 57 69 74 68 43  alloc] initWithC
0880: 61 70 61 63 69 74 79 3a 20 31 5d 3b 0a 20 20 20  apacity: 1];.   
0890: 20 20 20 20 20 70 72 6f 63 65 73 73 69 6e 67 43       processingC
08a0: 6f 6d 70 6f 73 65 20 3d 20 4e 4f 3b 0a 20 20 20  ompose = NO;.   
08b0: 20 7d 0a 20 20 20 20 69 66 20 28 21 77 69 6e 50   }.    if (!winP
08c0: 74 72 29 20 7b 0a 09 72 65 74 75 72 6e 20 74 68  tr) {..return th
08d0: 65 45 76 65 6e 74 3b 0a 20 20 20 20 7d 0a 0a 20  eEvent;.    }.. 
08e0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 44 69 73     /*.     * Dis
08f0: 63 61 72 64 20 72 65 70 65 61 74 69 6e 67 20 4b  card repeating K
0900: 65 79 44 6f 77 6e 20 65 76 65 6e 74 73 20 69 66  eyDown events if
0910: 20 74 68 65 20 72 65 70 65 61 74 20 73 70 65 65   the repeat spee
0920: 64 20 68 61 73 20 62 65 65 6e 20 73 65 74 20 74  d has been set t
0930: 6f 0a 20 20 20 20 20 2a 20 22 6f 66 66 22 20 69  o.     * "off" i
0940: 6e 20 53 79 73 74 65 6d 20 50 72 65 66 65 72 65  n System Prefere
0950: 6e 63 65 73 2e 20 20 49 74 20 69 73 20 75 6e 63  nces.  It is unc
0960: 6c 65 61 72 20 77 68 79 20 77 65 20 67 65 74 20  lear why we get 
0970: 74 68 65 73 65 2c 20 62 75 74 20 77 65 20 64 6f  these, but we do
0980: 2e 0a 20 20 20 20 20 2a 20 53 65 65 20 74 69 63  ..     * See tic
0990: 6b 65 74 20 5b 32 65 63 62 30 39 64 31 31 38 5d  ket [2ecb09d118]
09a0: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69  ..     */..    i
09b0: 66 20 28 5b 74 68 65 45 76 65 6e 74 20 74 79 70  f ([theEvent typ
09c0: 65 5d 20 3d 3d 20 20 4e 53 4b 65 79 44 6f 77 6e  e] ==  NSKeyDown
09d0: 20 26 26 0a 09 5b 74 68 65 45 76 65 6e 74 20 69   &&..[theEvent i
09e0: 73 41 52 65 70 65 61 74 5d 20 26 26 0a 09 5b 4e  sARepeat] &&..[N
09f0: 53 45 76 65 6e 74 20 6b 65 79 52 65 70 65 61 74  SEvent keyRepeat
0a00: 44 65 6c 61 79 5d 20 3c 20 30 29 20 7b 0a 20 20  Delay] < 0) {.  
0a10: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
0a20: 20 74 68 65 45 76 65 6e 74 3b 0a 09 7d 0a 0a 20   theEvent;..}.. 
0a30: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 66 20     /*.     * If 
0a40: 61 20 6c 6f 63 61 6c 20 67 72 61 62 20 69 73 20  a local grab is 
0a50: 69 6e 20 65 66 66 65 63 74 2c 20 6b 65 79 20 65  in effect, key e
0a60: 76 65 6e 74 73 20 66 6f 72 20 77 69 6e 64 6f 77  vents for window
0a70: 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a 20  s in the.     * 
0a80: 67 72 61 62 62 65 72 27 73 20 61 70 70 6c 69 63  grabber's applic
0a90: 61 74 69 6f 6e 20 61 72 65 20 72 65 64 69 72 65  ation are redire
0aa0: 63 74 65 64 20 74 6f 20 74 68 65 20 67 72 61 62  cted to the grab
0ab0: 62 65 72 2e 20 20 4b 65 79 20 65 76 65 6e 74 73  ber.  Key events
0ac0: 0a 20 20 20 20 20 2a 20 66 6f 72 20 6f 74 68 65  .     * for othe
0ad0: 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 61  r applications a
0ae0: 72 65 20 64 65 6c 69 76 65 72 65 64 20 6e 6f 72  re delivered nor
0af0: 6d 61 6c 6c 79 2e 20 20 49 66 20 61 20 67 6c 6f  mally.  If a glo
0b00: 62 61 6c 0a 20 20 20 20 20 2a 20 67 72 61 62 20  bal.     * grab 
0b10: 69 73 20 69 6e 20 65 66 66 65 63 74 20 61 6c 6c  is in effect all
0b20: 20 6b 65 79 20 65 76 65 6e 74 73 20 61 72 65 20   key events are 
0b30: 72 65 64 69 72 65 63 74 65 64 20 74 6f 20 74 68  redirected to th
0b40: 65 20 67 72 61 62 62 65 72 2e 0a 20 20 20 20 20  e grabber..     
0b50: 2a 2f 0a 0a 20 20 20 20 67 72 61 62 57 69 6e 50  */..    grabWinP
0b60: 74 72 20 3d 20 77 69 6e 50 74 72 2d 3e 64 69 73  tr = winPtr->dis
0b70: 70 50 74 72 2d 3e 67 72 61 62 57 69 6e 50 74 72  pPtr->grabWinPtr
0b80: 3b 0a 20 20 20 20 69 66 20 28 67 72 61 62 57 69  ;.    if (grabWi
0b90: 6e 50 74 72 29 20 7b 0a 09 69 66 20 28 77 69 6e  nPtr) {..if (win
0ba0: 50 74 72 2d 3e 64 69 73 70 50 74 72 2d 3e 67 72  Ptr->dispPtr->gr
0bb0: 61 62 46 6c 61 67 73 20 7c 7c 20 20 2f 2a 20 67  abFlags ||  /* g
0bc0: 6c 6f 62 61 6c 20 67 72 61 62 20 2a 2f 0a 09 20  lobal grab */.. 
0bd0: 20 20 20 67 72 61 62 57 69 6e 50 74 72 2d 3e 6d     grabWinPtr->m
0be0: 61 69 6e 50 74 72 20 3d 3d 20 77 69 6e 50 74 72  ainPtr == winPtr
0bf0: 2d 3e 6d 61 69 6e 50 74 72 29 7b 20 2f 2a 20 73  ->mainPtr){ /* s
0c00: 61 6d 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ame application 
0c10: 2a 2f 0a 09 20 20 20 20 77 69 6e 50 74 72 20 3d  */..    winPtr =
0c20: 20 77 69 6e 50 74 72 2d 3e 64 69 73 70 50 74 72   winPtr->dispPtr
0c30: 2d 3e 66 6f 63 75 73 50 74 72 3b 0a 09 20 20 20  ->focusPtr;..   
0c40: 20 69 66 20 28 21 77 69 6e 50 74 72 29 20 7b 0a   if (!winPtr) {.
0c50: 09 09 72 65 74 75 72 6e 20 74 68 65 45 76 65 6e  ..return theEven
0c60: 74 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 74  t;..    }..    t
0c70: 6b 77 69 6e 20 3d 20 28 54 6b 5f 57 69 6e 64 6f  kwin = (Tk_Windo
0c80: 77 29 77 69 6e 50 74 72 3b 0a 09 7d 0a 20 20 20  w)winPtr;..}.   
0c90: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
0ca0: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 75 6e  * Extract the un
0cb0: 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 20  icode character 
0cc0: 66 72 6f 6d 20 4b 65 79 55 70 20 61 6e 64 20 4b  from KeyUp and K
0cd0: 65 79 44 6f 77 6e 20 65 76 65 6e 74 73 2e 0a 20  eyDown events.. 
0ce0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28      */..    if (
0cf0: 74 79 70 65 20 3d 3d 20 4e 53 4b 65 79 55 70 20  type == NSKeyUp 
0d00: 7c 7c 20 74 79 70 65 20 3d 3d 20 4e 53 4b 65 79  || type == NSKey
0d10: 44 6f 77 6e 29 20 7b 0a 09 4e 53 53 74 72 69 6e  Down) {..NSStrin
0d20: 67 20 2a 63 68 61 72 61 63 74 65 72 73 20 3d 20  g *characters = 
0d30: 5b 74 68 65 45 76 65 6e 74 20 63 68 61 72 61 63  [theEvent charac
0d40: 74 65 72 73 5d 3b 0a 09 69 66 20 28 63 68 61 72  ters];..if (char
0d50: 61 63 74 65 72 73 2e 6c 65 6e 67 74 68 20 3e 20  acters.length > 
0d60: 30 29 20 7b 0a 09 20 20 20 20 6b 65 79 63 68 61  0) {..    keycha
0d70: 72 20 3d 20 5b 63 68 61 72 61 63 74 65 72 73 20  r = [characters 
0d80: 63 68 61 72 61 63 74 65 72 41 74 49 6e 64 65 78  characterAtIndex
0d90: 3a 30 5d 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20  :0];...    /*.. 
0da0: 20 20 20 20 2a 20 43 75 72 72 65 6e 74 6c 79 2c      * Currently,
0db0: 20 72 65 61 6c 20 6b 65 79 73 20 61 6c 77 61 79   real keys alway
0dc0: 73 20 73 65 6e 64 20 42 4d 50 20 63 68 61 72 61  s send BMP chara
0dd0: 63 74 65 72 73 2c 20 62 75 74 20 77 68 6f 20 6b  cters, but who k
0de0: 6e 6f 77 73 3f 0a 09 20 20 20 20 20 2a 2f 0a 0a  nows?..     */..
0df0: 09 20 20 20 20 69 66 20 28 43 46 53 74 72 69 6e  .    if (CFStrin
0e00: 67 49 73 53 75 72 72 6f 67 61 74 65 48 69 67 68  gIsSurrogateHigh
0e10: 43 68 61 72 61 63 74 65 72 28 6b 65 79 63 68 61  Character(keycha
0e20: 72 29 29 20 7b 0a 09 09 55 6e 69 43 68 61 72 20  r)) {...UniChar 
0e30: 6c 6f 77 43 68 61 72 20 3d 20 5b 63 68 61 72 61  lowChar = [chara
0e40: 63 74 65 72 73 20 63 68 61 72 61 63 74 65 72 41  cters characterA
0e50: 74 49 6e 64 65 78 3a 31 5d 3b 0a 09 09 6b 65 79  tIndex:1];...key
0e60: 63 68 61 72 20 3d 20 43 46 53 74 72 69 6e 67 47  char = CFStringG
0e70: 65 74 4c 6f 6e 67 43 68 61 72 61 63 74 65 72 46  etLongCharacterF
0e80: 6f 72 53 75 72 72 6f 67 61 74 65 50 61 69 72 28  orSurrogatePair(
0e90: 0a 09 09 20 20 20 20 6b 65 79 63 68 61 72 2c 20  ...    keychar, 
0ea0: 6c 6f 77 43 68 61 72 29 3b 0a 09 20 20 20 20 7d  lowChar);..    }
0eb0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 0a 09 20 20 20  ..} else {...   
0ec0: 20 2f 2a 0a 09 20 20 20 20 20 2a 20 54 68 69 73   /*..     * This
0ed0: 20 69 73 20 61 20 64 65 61 64 20 6b 65 79 2c 20   is a dead key, 
0ee0: 73 75 63 68 20 61 73 20 4f 70 74 69 6f 6e 2d 65  such as Option-e
0ef0: 2c 20 73 6f 20 69 74 20 75 73 75 61 6c 6c 79 20  , so it usually 
0f00: 73 68 6f 75 6c 64 20 67 65 74 0a 09 20 20 20 20  should get..    
0f10: 20 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 65   * passed to the
0f20: 20 54 65 78 74 49 6e 70 75 74 43 6c 69 65 6e 74   TextInputClient
0f30: 2e 20 20 42 75 74 20 69 66 20 69 74 20 68 61 73  .  But if it has
0f40: 20 61 20 43 6f 6d 6d 61 6e 64 20 6d 6f 64 69 66   a Command modif
0f50: 69 65 72 0a 09 20 20 20 20 20 2a 20 74 68 65 6e  ier..     * then
0f60: 20 69 74 20 69 73 20 6e 6f 74 20 66 75 6e 63 74   it is not funct
0f70: 69 6f 6e 69 6e 67 20 61 73 20 61 20 64 65 61 64  ioning as a dead
0f80: 20 6b 65 79 20 61 6e 64 20 73 68 6f 75 6c 64 20   key and should 
0f90: 6e 6f 74 20 62 65 0a 09 20 20 20 20 20 2a 20 68  not be..     * h
0fa0: 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 54 65  andled by the Te
0fb0: 78 74 49 6e 70 75 74 43 6c 69 65 6e 74 2e 20 20  xtInputClient.  
0fc0: 53 65 65 20 74 69 63 6b 65 74 20 5b 31 36 32 36  See ticket [1626
0fd0: 65 64 36 35 62 38 5d 20 61 6e 64 20 74 68 65 0a  ed65b8] and the.
0fe0: 09 20 20 20 20 20 2a 20 6d 65 74 68 6f 64 20 70  .     * method p
0ff0: 65 72 66 6f 72 6d 4b 65 79 45 71 75 69 76 61 6c  erformKeyEquival
1000: 65 6e 74 20 77 68 69 63 68 20 69 73 20 69 6d 70  ent which is imp
1010: 6c 65 6d 65 6e 74 65 64 20 69 6e 0a 09 20 20 20  lemented in..   
1020: 20 20 2a 20 74 6b 4d 61 63 4f 53 58 4d 65 6e 75    * tkMacOSXMenu
1030: 2e 63 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20  .c...     */... 
1040: 20 20 20 69 66 20 28 21 28 6d 6f 64 69 66 69 65     if (!(modifie
1050: 72 73 20 26 20 4e 53 43 6f 6d 6d 61 6e 64 4b 65  rs & NSCommandKe
1060: 79 4d 61 73 6b 29 29 20 7b 0a 09 09 75 73 65 5f  yMask)) {...use_
1070: 74 65 78 74 5f 69 6e 70 75 74 20 3d 20 59 45 53  text_input = YES
1080: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 2f 2a  ;..    }..}.../*
1090: 0a 09 20 2a 20 41 70 70 6c 65 20 75 73 65 73 20  .. * Apple uses 
10a0: 30 78 31 30 20 66 6f 72 20 75 6e 72 65 63 6f 67  0x10 for unrecog
10b0: 6e 69 7a 65 64 20 6b 65 79 73 2e 0a 09 20 2a 2f  nized keys... */
10c0: 0a 0a 09 69 66 20 28 6b 65 79 63 68 61 72 20 3d  ...if (keychar =
10d0: 3d 20 30 78 31 30 29 20 7b 0a 09 20 20 20 20 6b  = 0x10) {..    k
10e0: 65 79 63 68 61 72 20 3d 20 55 4e 4b 4e 4f 57 4e  eychar = UNKNOWN
10f0: 5f 4b 45 59 43 48 41 52 3b 0a 09 7d 0a 0a 23 69  _KEYCHAR;..}..#i
1100: 66 20 64 65 66 69 6e 65 64 28 54 4b 5f 4d 41 43  f defined(TK_MAC
1110: 5f 44 45 42 55 47 5f 45 56 45 4e 54 53 29 20 7c  _DEBUG_EVENTS) |
1120: 7c 20 4e 53 5f 4b 45 59 4c 4f 47 20 3d 3d 20 31  | NS_KEYLOG == 1
1130: 0a 09 54 4b 4c 6f 67 28 40 22 2d 5b 25 40 28 25  ..TKLog(@"-[%@(%
1140: 70 29 20 25 73 5d 20 72 65 70 65 61 74 3d 25 64  p) %s] repeat=%d
1150: 20 6d 6f 64 73 3d 25 78 20 63 68 61 72 3d 25 78   mods=%x char=%x
1160: 20 63 6f 64 65 3d 25 6c 75 20 63 3d 25 64 20 74   code=%lu c=%d t
1170: 79 70 65 3d 25 64 22 2c 0a 09 20 20 20 20 20 20  ype=%d",..      
1180: 5b 73 65 6c 66 20 63 6c 61 73 73 5d 2c 20 73 65  [self class], se
1190: 6c 66 2c 20 5f 63 6d 64 2c 0a 09 20 20 20 20 20  lf, _cmd,..     
11a0: 20 28 74 79 70 65 20 3d 3d 20 4e 53 4b 65 79 44   (type == NSKeyD
11b0: 6f 77 6e 29 20 26 26 20 5b 74 68 65 45 76 65 6e  own) && [theEven
11c0: 74 20 69 73 41 52 65 70 65 61 74 5d 2c 20 6d 6f  t isARepeat], mo
11d0: 64 69 66 69 65 72 73 2c 20 6b 65 79 63 68 61 72  difiers, keychar
11e0: 2c 0a 09 20 20 20 20 20 20 76 69 72 74 2c 20 77  ,..      virt, w
11f0: 2c 20 74 79 70 65 29 3b 0a 23 65 6e 64 69 66 0a  , type);.#endif.
1200: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1210: 20 20 20 20 2a 20 42 75 69 6c 64 20 61 20 73 6b      * Build a sk
1220: 65 6c 65 74 6f 6e 20 58 45 76 65 6e 74 2e 20 20  eleton XEvent.  
1230: 57 65 20 6e 65 65 64 20 74 6f 20 62 75 69 6c 64  We need to build
1240: 20 69 74 20 68 65 72 65 2c 20 65 76 65 6e 20 69   it here, even i
1250: 66 20 77 65 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  f we will not.  
1260: 20 20 20 2a 20 73 65 6e 64 20 69 74 2c 20 73 6f     * send it, so
1270: 20 77 65 20 63 61 6e 20 70 61 73 73 20 69 74 20   we can pass it 
1280: 74 6f 20 54 6b 46 6f 63 75 73 4b 65 79 45 76 65  to TkFocusKeyEve
1290: 6e 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  nt to determine 
12a0: 77 68 65 74 68 65 72 20 74 68 65 0a 20 20 20 20  whether the.    
12b0: 20 2a 20 74 61 72 67 65 74 20 77 69 64 67 65 74   * target widget
12c0: 20 63 61 6e 20 69 6e 70 75 74 20 74 65 78 74 2e   can input text.
12d0: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 73 65  .     */..    se
12e0: 74 75 70 58 45 76 65 6e 74 28 26 78 45 76 65 6e  tupXEvent(&xEven
12f0: 74 2c 20 74 6b 77 69 6e 2c 20 6d 6f 64 69 66 69  t, tkwin, modifi
1300: 65 72 73 29 3b 0a 20 20 20 20 68 61 73 5f 6d 6f  ers);.    has_mo
1310: 64 69 66 69 65 72 73 20 3d 20 78 45 76 65 6e 74  difiers = xEvent
1320: 2e 78 6b 65 79 2e 73 74 61 74 65 20 26 20 58 45  .xkey.state & XE
1330: 56 45 4e 54 5f 4d 4f 44 5f 4d 41 53 4b 3b 0a 20  VENT_MOD_MASK;. 
1340: 20 20 20 66 6f 63 75 73 57 69 6e 50 74 72 20 3d     focusWinPtr =
1350: 20 54 6b 46 6f 63 75 73 4b 65 79 45 76 65 6e 74   TkFocusKeyEvent
1360: 28 77 69 6e 50 74 72 2c 20 26 78 45 76 65 6e 74  (winPtr, &xEvent
1370: 29 3b 0a 20 20 20 20 69 66 20 28 66 6f 63 75 73  );.    if (focus
1380: 57 69 6e 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20  WinPtr == NULL) 
1390: 7b 0a 09 54 4b 43 6f 6e 74 65 6e 74 56 69 65 77  {..TKContentView
13a0: 20 2a 63 6f 6e 74 65 6e 74 56 69 65 77 20 3d 20   *contentView = 
13b0: 5b 77 20 63 6f 6e 74 65 6e 74 56 69 65 77 5d 3b  [w contentView];
13c0: 0a 0a 09 2f 2a 0a 09 20 2a 20 54 68 69 73 20 4e  .../*.. * This N
13d0: 53 45 76 65 6e 74 20 69 73 20 62 65 69 6e 67 20  SEvent is being 
13e0: 73 65 6e 74 20 74 6f 20 61 20 77 69 6e 64 6f 77  sent to a window
13f0: 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20   which does not 
1400: 68 61 76 65 20 66 6f 63 75 73 2e 0a 09 20 2a 20  have focus... * 
1410: 54 68 69 73 20 63 6f 75 6c 64 20 6d 65 61 6e 2c  This could mean,
1420: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   for example, th
1430: 61 74 20 74 68 65 20 75 73 65 72 20 64 65 61 63  at the user deac
1440: 74 69 76 61 74 65 64 20 74 68 65 20 54 6b 20 61  tivated the Tk a
1450: 70 70 0a 09 20 2a 20 77 68 69 6c 65 20 74 68 65  pp.. * while the
1460: 20 4e 53 54 65 78 74 49 6e 70 75 74 43 6c 69 65   NSTextInputClie
1470: 6e 74 27 73 20 70 6f 70 75 70 20 63 68 61 72 61  nt's popup chara
1480: 63 74 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 77  cter selection w
1490: 69 6e 64 6f 77 20 77 61 73 0a 09 20 2a 20 73 74  indow was.. * st
14a0: 69 6c 6c 20 6f 70 65 6e 2e 20 20 57 65 20 61 74  ill open.  We at
14b0: 74 65 6d 70 74 20 74 6f 20 61 62 61 6e 64 6f 6e  tempt to abandon
14c0: 20 61 6e 79 20 6f 6e 67 6f 69 6e 67 20 63 6f 6d   any ongoing com
14d0: 70 6f 73 69 74 69 6f 6e 20 6f 70 65 72 61 74 69  position operati
14e0: 6f 6e 0a 09 20 2a 20 61 6e 64 20 64 69 73 63 61  on.. * and disca
14f0: 72 64 20 74 68 65 20 65 76 65 6e 74 2e 0a 09 20  rd the event... 
1500: 2a 2f 0a 0a 09 5b 63 6f 6e 74 65 6e 74 56 69 65  */...[contentVie
1510: 77 20 63 61 6e 63 65 6c 43 6f 6d 70 6f 73 69 6e  w cancelComposin
1520: 67 54 65 78 74 5d 3b 0a 09 72 65 74 75 72 6e 20  gText];..return 
1530: 74 68 65 45 76 65 6e 74 3b 0a 20 20 20 20 7d 0a  theEvent;.    }.
1540: 20 20 20 20 63 61 6e 5f 69 6e 70 75 74 5f 74 65      can_input_te
1550: 78 74 20 3d 20 28 28 66 6f 63 75 73 57 69 6e 50  xt = ((focusWinP
1560: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4b 5f 43  tr->flags & TK_C
1570: 41 4e 5f 49 4e 50 55 54 5f 54 45 58 54 29 20 21  AN_INPUT_TEXT) !
1580: 3d 20 30 29 3b 0a 0a 23 69 66 20 28 4e 53 5f 4b  = 0);..#if (NS_K
1590: 45 59 4c 4f 47 29 0a 20 20 20 20 54 4b 4c 6f 67  EYLOG).    TKLog
15a0: 28 40 22 6b 65 79 44 6f 77 6e 3a 20 25 73 20 63  (@"keyDown: %s c
15b0: 6f 6d 70 6f 73 65 20 73 65 71 75 65 6e 63 65 2e  ompose sequence.
15c0: 5c 6e 22 2c 0a 09 20 20 70 72 6f 63 65 73 73 69  \n",..  processi
15d0: 6e 67 43 6f 6d 70 6f 73 65 20 3d 3d 20 59 45 53  ngCompose == YES
15e0: 20 3f 20 22 43 6f 6e 74 69 6e 75 65 22 20 3a 20   ? "Continue" : 
15f0: 22 42 65 67 69 6e 22 29 3b 0a 23 65 6e 64 69 66  "Begin");.#endif
1600: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
1610: 44 65 63 69 64 65 20 77 68 65 74 68 65 72 20 74  Decide whether t
1620: 68 69 73 20 65 76 65 6e 74 20 73 68 6f 75 6c 64  his event should
1630: 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 77 69   be processed wi
1640: 74 68 20 74 68 65 20 4e 53 54 65 78 74 49 6e 70  th the NSTextInp
1650: 75 74 43 6c 69 65 6e 74 0a 20 20 20 20 20 2a 20  utClient.     * 
1660: 70 72 6f 74 6f 63 6f 6c 2e 0a 20 20 20 20 20 2a  protocol..     *
1670: 2f 0a 0a 20 20 20 20 69 66 20 28 70 72 6f 63 65  /..    if (proce
1680: 73 73 69 6e 67 43 6f 6d 70 6f 73 65 20 7c 7c 0a  ssingCompose ||.
1690: 09 28 74 79 70 65 20 3d 3d 20 4e 53 4b 65 79 44  .(type == NSKeyD
16a0: 6f 77 6e 20 26 26 20 63 61 6e 5f 69 6e 70 75 74  own && can_input
16b0: 5f 74 65 78 74 20 26 26 20 21 68 61 73 5f 6d 6f  _text && !has_mo
16c0: 64 69 66 69 65 72 73 20 26 26 0a 09 20 49 53 5f  difiers &&.. IS_
16d0: 50 52 49 4e 54 41 42 4c 45 28 6b 65 79 63 68 61  PRINTABLE(keycha
16e0: 72 29 29 0a 09 29 20 7b 0a 09 75 73 65 5f 74 65  r))..) {..use_te
16f0: 78 74 5f 69 6e 70 75 74 20 3d 20 59 45 53 3b 0a  xt_input = YES;.
1700: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1710: 20 20 20 2a 20 49 66 20 77 65 20 61 72 65 20 70     * If we are p
1720: 72 6f 63 65 73 73 69 6e 67 20 74 68 69 73 20 4b  rocessing this K
1730: 65 79 44 6f 77 6e 20 65 76 65 6e 74 20 61 73 20  eyDown event as 
1740: 61 6e 20 4e 53 54 65 78 74 49 6e 70 75 74 43 6c  an NSTextInputCl
1750: 69 65 6e 74 20 77 65 20 64 6f 0a 20 20 20 20 20  ient we do.     
1760: 2a 20 6e 6f 74 20 71 75 65 75 65 20 61 6e 20 58  * not queue an X
1770: 45 76 65 6e 74 2e 20 20 57 65 20 70 61 73 73 20  Event.  We pass 
1780: 74 68 65 20 4e 53 45 76 65 6e 74 20 74 6f 20 6f  the NSEvent to o
1790: 75 72 20 69 6e 74 65 72 70 72 65 74 4b 65 79 45  ur interpretKeyE
17a0: 76 65 6e 74 73 0a 20 20 20 20 20 2a 20 6d 65 74  vents.     * met
17b0: 68 6f 64 2e 20 20 57 68 65 6e 20 74 68 65 20 63  hod.  When the c
17c0: 6f 6d 70 6f 73 69 74 69 6f 6e 20 73 65 71 75 65  omposition seque
17d0: 6e 63 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 2c  nce is complete,
17e0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6d 65   the callback me
17f0: 74 68 6f 64 0a 20 20 20 20 20 2a 20 69 6e 73 65  thod.     * inse
1800: 72 74 54 65 78 74 3a 20 72 65 70 6c 61 63 65 6d  rtText: replacem
1810: 65 6e 74 52 61 6e 67 65 20 77 69 6c 6c 20 62 65  entRange will be
1820: 20 63 61 6c 6c 65 64 2e 20 20 54 68 61 74 20 6d   called.  That m
1830: 65 74 68 6f 64 20 67 65 6e 65 72 61 74 65 73 20  ethod generates 
1840: 61 0a 20 20 20 20 20 2a 20 6b 65 79 50 72 65 73  a.     * keyPres
1850: 73 20 58 45 76 65 6e 74 20 77 69 74 68 20 74 68  s XEvent with th
1860: 65 20 73 65 6c 65 63 74 65 64 20 63 68 61 72 61  e selected chara
1870: 63 74 65 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  cter..     */.. 
1880: 20 20 20 69 66 20 28 75 73 65 5f 74 65 78 74 5f     if (use_text_
1890: 69 6e 70 75 74 29 20 7b 0a 09 74 65 78 74 49 6e  input) {..textIn
18a0: 70 75 74 4d 6f 64 69 66 69 65 72 73 20 3d 20 6d  putModifiers = m
18b0: 6f 64 69 66 69 65 72 73 3b 0a 0a 09 2f 2a 0a 09  odifiers;.../*..
18c0: 20 2a 20 49 6e 20 49 4d 45 20 74 68 65 20 45 6e   * In IME the En
18d0: 74 65 72 20 6b 65 79 20 69 73 20 75 73 65 64 20  ter key is used 
18e0: 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 61 20 63  to terminate a c
18f0: 6f 6d 70 6f 73 69 74 69 6f 6e 20 73 65 71 75 65  omposition seque
1900: 6e 63 65 2e 0a 09 20 2a 20 57 68 65 6e 20 74 68  nce... * When th
1910: 65 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65  ere are multiple
1920: 20 63 68 6f 69 63 65 73 20 6f 66 20 69 6e 70 75   choices of inpu
1930: 74 20 74 65 78 74 20 61 76 61 69 6c 61 62 6c 65  t text available
1940: 2c 20 61 6e 64 20 74 68 65 0a 09 20 2a 20 75 73  , and the.. * us
1950: 65 72 27 73 20 73 65 6c 65 63 74 65 64 20 63 68  er's selected ch
1960: 6f 69 63 65 20 69 73 20 6e 6f 74 20 74 68 65 20  oice is not the 
1970: 64 65 66 61 75 6c 74 2c 20 69 74 20 6d 61 79 20  default, it may 
1980: 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a  be necessary to.
1990: 09 20 2a 20 68 69 74 20 74 68 65 20 45 6e 74 65  . * hit the Ente
19a0: 72 20 6b 65 79 20 6d 75 6c 74 69 70 6c 65 20 74  r key multiple t
19b0: 69 6d 65 73 20 62 65 66 6f 72 65 20 74 68 65 20  imes before the 
19c0: 74 65 78 74 20 69 73 20 61 63 63 65 70 74 65 64  text is accepted
19d0: 20 61 6e 64 0a 09 20 2a 20 72 65 6e 64 65 72 65   and.. * rendere
19e0: 64 20 28 53 65 65 20 74 69 63 6b 65 74 20 33 39  d (See ticket 39
19f0: 64 65 39 36 37 37 61 61 5d 29 2e 20 53 6f 20 77  de9677aa]). So w
1a00: 68 65 6e 20 73 65 6e 64 69 6e 67 20 61 6e 20 45  hen sending an E
1a10: 6e 74 65 72 20 6b 65 79 0a 09 20 2a 20 64 75 72  nter key.. * dur
1a20: 69 6e 67 20 63 6f 6d 70 6f 73 69 74 69 6f 6e 2c  ing composition,
1a30: 20 77 65 20 63 6f 6e 74 69 6e 75 65 20 73 65 6e   we continue sen
1a40: 64 69 6e 67 20 45 6e 74 65 72 20 6b 65 79 73 20  ding Enter keys 
1a50: 75 6e 74 69 6c 20 74 68 65 0a 09 20 2a 20 69 6e  until the.. * in
1a60: 70 75 74 54 65 78 74 20 6d 65 74 68 6f 64 20 68  putText method h
1a70: 61 73 20 63 6c 65 61 72 65 64 20 74 68 65 20 70  as cleared the p
1a80: 72 6f 63 65 73 73 69 6e 67 43 6f 6d 70 6f 73 65  rocessingCompose
1a90: 20 66 6c 61 67 2e 0a 09 20 2a 2f 0a 0a 09 69 66   flag... */...if
1aa0: 20 28 70 72 6f 63 65 73 73 69 6e 67 43 6f 6d 70   (processingComp
1ab0: 6f 73 65 20 26 26 20 5b 74 68 65 45 76 65 6e 74  ose && [theEvent
1ac0: 20 6b 65 79 43 6f 64 65 5d 20 3d 3d 20 33 36 29   keyCode] == 36)
1ad0: 20 7b 0a 09 20 20 20 20 5b 6e 73 45 76 41 72 72   {..    [nsEvArr
1ae0: 61 79 20 61 64 64 4f 62 6a 65 63 74 3a 20 74 68  ay addObject: th
1af0: 65 45 76 65 6e 74 5d 3b 0a 09 20 20 20 20 77 68  eEvent];..    wh
1b00: 69 6c 65 28 70 72 6f 63 65 73 73 69 6e 67 43 6f  ile(processingCo
1b10: 6d 70 6f 73 65 29 20 7b 0a 09 09 5b 5b 77 20 63  mpose) {...[[w c
1b20: 6f 6e 74 65 6e 74 56 69 65 77 5d 20 69 6e 74 65  ontentView] inte
1b30: 72 70 72 65 74 4b 65 79 45 76 65 6e 74 73 3a 20  rpretKeyEvents: 
1b40: 6e 73 45 76 41 72 72 61 79 5d 3b 0a 09 20 20 20  nsEvArray];..   
1b50: 20 7d 0a 09 20 20 20 20 5b 6e 73 45 76 41 72 72   }..    [nsEvArr
1b60: 61 79 20 72 65 6d 6f 76 65 4f 62 6a 65 63 74 3a  ay removeObject:
1b70: 20 74 68 65 45 76 65 6e 74 5d 3b 0a 09 7d 20 65   theEvent];..} e
1b80: 6c 73 65 20 7b 0a 09 20 20 20 20 5b 6e 73 45 76  lse {..    [nsEv
1b90: 41 72 72 61 79 20 61 64 64 4f 62 6a 65 63 74 3a  Array addObject:
1ba0: 20 74 68 65 45 76 65 6e 74 5d 3b 0a 09 20 20 20   theEvent];..   
1bb0: 20 5b 5b 77 20 63 6f 6e 74 65 6e 74 56 69 65 77   [[w contentView
1bc0: 5d 20 69 6e 74 65 72 70 72 65 74 4b 65 79 45 76  ] interpretKeyEv
1bd0: 65 6e 74 73 3a 20 6e 73 45 76 41 72 72 61 79 5d  ents: nsEvArray]
1be0: 3b 0a 09 20 20 20 20 5b 6e 73 45 76 41 72 72 61  ;..    [nsEvArra
1bf0: 79 20 72 65 6d 6f 76 65 4f 62 6a 65 63 74 3a 20  y removeObject: 
1c00: 74 68 65 45 76 65 6e 74 5d 3b 0a 09 7d 0a 09 72  theEvent];..}..r
1c10: 65 74 75 72 6e 20 74 68 65 45 76 65 6e 74 3b 0a  eturn theEvent;.
1c20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1c30: 20 20 20 2a 20 57 65 20 61 72 65 20 6e 6f 74 20     * We are not 
1c40: 68 61 6e 64 6c 69 6e 67 20 74 68 69 73 20 65 76  handling this ev
1c50: 65 6e 74 20 61 73 20 61 6e 20 4e 53 54 65 78 74  ent as an NSText
1c60: 49 6e 70 75 74 43 6c 69 65 6e 74 2c 20 73 6f 20  InputClient, so 
1c70: 77 65 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  we need to.     
1c80: 2a 20 66 69 6e 69 73 68 20 63 6f 6e 73 74 72 75  * finish constru
1c90: 63 74 69 6e 67 20 74 68 65 20 58 45 76 65 6e 74  cting the XEvent
1ca0: 20 61 6e 64 20 71 75 65 75 65 20 69 74 2e 0a 20   and queue it.. 
1cb0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6d 61 63 4b      */..    macK
1cc0: 43 2e 76 2e 6f 5f 73 20 3d 20 20 28 28 6d 6f 64  C.v.o_s =  ((mod
1cd0: 69 66 69 65 72 73 20 26 20 4e 53 53 68 69 66 74  ifiers & NSShift
1ce0: 4b 65 79 4d 61 73 6b 20 3f 20 49 4e 44 45 58 5f  KeyMask ? INDEX_
1cf0: 53 48 49 46 54 20 3a 20 30 29 20 7c 0a 09 09 20  SHIFT : 0) |... 
1d00: 20 20 20 28 6d 6f 64 69 66 69 65 72 73 20 26 20     (modifiers & 
1d10: 4e 53 41 6c 74 65 72 6e 61 74 65 4b 65 79 4d 61  NSAlternateKeyMa
1d20: 73 6b 20 3f 20 49 4e 44 45 58 5f 4f 50 54 49 4f  sk ? INDEX_OPTIO
1d30: 4e 20 3a 20 30 29 29 3b 0a 20 20 20 20 6d 61 63  N : 0));.    mac
1d40: 4b 43 2e 76 2e 76 69 72 74 20 3d 20 76 69 72 74  KC.v.virt = virt
1d50: 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 74 79  ;.    switch (ty
1d60: 70 65 29 20 7b 0a 20 20 20 20 63 61 73 65 20 4e  pe) {.    case N
1d70: 53 46 6c 61 67 73 43 68 61 6e 67 65 64 3a 0a 0a  SFlagsChanged:..
1d80: 09 2f 2a 0a 09 20 2a 20 54 68 69 73 20 58 45 76  ./*.. * This XEv
1d90: 65 6e 74 20 69 73 20 61 20 73 69 6d 75 6c 61 74  ent is a simulat
1da0: 65 64 20 4b 65 79 50 72 65 73 73 20 6f 72 20 4b  ed KeyPress or K
1db0: 65 79 52 65 6c 65 61 73 65 20 65 76 65 6e 74 20  eyRelease event 
1dc0: 66 6f 72 20 61 0a 09 20 2a 20 6d 6f 64 69 66 69  for a.. * modifi
1dd0: 65 72 20 6b 65 79 2e 20 20 54 6f 20 64 65 74 65  er key.  To dete
1de0: 72 6d 69 6e 65 20 74 68 65 20 74 79 70 65 2c 20  rmine the type, 
1df0: 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20 68 69  note that the hi
1e00: 67 68 65 73 74 20 62 69 74 0a 09 20 2a 20 77 68  ghest bit.. * wh
1e10: 65 72 65 20 74 68 65 20 66 6c 61 67 73 20 64 69  ere the flags di
1e20: 66 66 65 72 20 69 73 20 31 20 69 66 20 61 6e 64  ffer is 1 if and
1e30: 20 6f 6e 6c 79 20 69 66 20 69 74 20 69 73 20 61   only if it is a
1e40: 20 4b 65 79 50 72 65 73 73 2e 20 54 68 65 0a 09   KeyPress. The..
1e50: 20 2a 20 6d 6f 64 69 66 69 65 72 73 20 61 72 65   * modifiers are
1e60: 20 73 61 76 65 64 20 73 6f 20 77 65 20 63 61 6e   saved so we can
1e70: 20 64 65 74 65 63 74 20 74 68 65 20 6e 65 78 74   detect the next
1e80: 20 66 6c 61 67 20 63 68 61 6e 67 65 2e 0a 09 20   flag change... 
1e90: 2a 2f 0a 0a 09 78 45 76 65 6e 74 2e 78 61 6e 79  */...xEvent.xany
1ea0: 2e 74 79 70 65 20 3d 20 6d 6f 64 69 66 69 65 72  .type = modifier
1eb0: 73 20 3e 20 73 61 76 65 64 4d 6f 64 69 66 69 65  s > savedModifie
1ec0: 72 73 20 3f 20 4b 65 79 50 72 65 73 73 20 3a 20  rs ? KeyPress : 
1ed0: 4b 65 79 52 65 6c 65 61 73 65 3b 0a 09 73 61 76  KeyRelease;..sav
1ee0: 65 64 4d 6f 64 69 66 69 65 72 73 20 3d 20 6d 6f  edModifiers = mo
1ef0: 64 69 66 69 65 72 73 3b 0a 0a 09 2f 2a 0a 09 20  difiers;.../*.. 
1f00: 2a 20 53 65 74 20 74 68 65 20 6b 65 79 63 68 61  * Set the keycha
1f10: 72 20 74 6f 20 4d 4f 44 5f 4b 45 59 43 48 41 52  r to MOD_KEYCHAR
1f20: 20 61 73 20 61 20 73 69 67 6e 61 6c 20 74 6f 20   as a signal to 
1f30: 54 6b 70 47 65 74 4b 65 79 53 79 6d 20 28 73 65  TkpGetKeySym (se
1f40: 65 0a 09 20 2a 20 74 6b 4d 61 63 4f 53 58 4b 65  e.. * tkMacOSXKe
1f50: 79 62 6f 61 72 64 2e 63 29 20 74 68 61 74 20 74  yboard.c) that t
1f60: 68 69 73 20 69 73 20 61 20 6d 6f 64 69 66 69 65  his is a modifie
1f70: 72 20 6b 65 79 20 65 76 65 6e 74 2e 0a 09 20 2a  r key event... *
1f80: 2f 0a 0a 09 6b 65 79 63 68 61 72 20 3d 20 4d 4f  /...keychar = MO
1f90: 44 5f 4b 45 59 43 48 41 52 3b 0a 09 62 72 65 61  D_KEYCHAR;..brea
1fa0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4e 53 4b 65  k;.    case NSKe
1fb0: 79 55 70 3a 0a 09 78 45 76 65 6e 74 2e 78 61 6e  yUp:..xEvent.xan
1fc0: 79 2e 74 79 70 65 20 3d 20 4b 65 79 52 65 6c 65  y.type = KeyRele
1fd0: 61 73 65 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ase;..break;.   
1fe0: 20 63 61 73 65 20 4e 53 4b 65 79 44 6f 77 6e 3a   case NSKeyDown:
1ff0: 0a 09 78 45 76 65 6e 74 2e 78 61 6e 79 2e 74 79  ..xEvent.xany.ty
2000: 70 65 20 3d 20 4b 65 79 50 72 65 73 73 3b 0a 09  pe = KeyPress;..
2010: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
2020: 6c 74 3a 0a 09 72 65 74 75 72 6e 20 74 68 65 45  lt:..return theE
2030: 76 65 6e 74 3b 20 2f 2a 20 55 6e 72 65 63 6f 67  vent; /* Unrecog
2040: 6e 69 7a 65 64 20 6b 65 79 20 65 76 65 6e 74 2e  nized key event.
2050: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6d 61   */.    }.    ma
2060: 63 4b 43 2e 76 2e 6b 65 79 63 68 61 72 20 3d 20  cKC.v.keychar = 
2070: 6b 65 79 63 68 61 72 3b 0a 20 20 20 20 78 45 76  keychar;.    xEv
2080: 65 6e 74 2e 78 6b 65 79 2e 6b 65 79 63 6f 64 65  ent.xkey.keycode
2090: 20 3d 20 6d 61 63 4b 43 2e 75 69 6e 74 3b 0a 20   = macKC.uint;. 
20a0: 20 20 20 73 65 74 58 45 76 65 6e 74 50 6f 69 6e     setXEventPoin
20b0: 74 28 26 78 45 76 65 6e 74 2c 20 74 6b 77 69 6e  t(&xEvent, tkwin
20c0: 2c 20 77 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  , w);..    /*.  
20d0: 20 20 20 2a 20 46 69 6e 61 6c 6c 79 20 77 65 20     * Finally we 
20e0: 63 61 6e 20 71 75 65 75 65 20 74 68 65 20 58 45  can queue the XE
20f0: 76 65 6e 74 2c 20 69 6e 73 65 72 74 69 6e 67 20  vent, inserting 
2100: 61 20 4b 65 79 52 65 6c 65 61 73 65 20 62 65 66  a KeyRelease bef
2110: 6f 72 65 20 61 0a 20 20 20 20 20 2a 20 72 65 70  ore a.     * rep
2120: 65 61 74 65 64 20 4b 65 79 50 72 65 73 73 2e 0a  eated KeyPress..
2130: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20       */..    if 
2140: 28 74 79 70 65 20 3d 3d 20 4e 53 4b 65 79 44 6f  (type == NSKeyDo
2150: 77 6e 20 26 26 20 5b 74 68 65 45 76 65 6e 74 20  wn && [theEvent 
2160: 69 73 41 52 65 70 65 61 74 5d 29 20 7b 0a 09 78  isARepeat]) {..x
2170: 45 76 65 6e 74 2e 78 61 6e 79 2e 74 79 70 65 20  Event.xany.type 
2180: 3d 20 4b 65 79 52 65 6c 65 61 73 65 3b 0a 09 54  = KeyRelease;..T
2190: 6b 5f 51 75 65 75 65 57 69 6e 64 6f 77 45 76 65  k_QueueWindowEve
21a0: 6e 74 28 26 78 45 76 65 6e 74 2c 20 54 43 4c 5f  nt(&xEvent, TCL_
21b0: 51 55 45 55 45 5f 54 41 49 4c 29 3b 0a 09 78 45  QUEUE_TAIL);..xE
21c0: 76 65 6e 74 2e 78 61 6e 79 2e 74 79 70 65 20 3d  vent.xany.type =
21d0: 20 4b 65 79 50 72 65 73 73 3b 0a 20 20 20 20 7d   KeyPress;.    }
21e0: 0a 20 20 20 20 54 6b 5f 51 75 65 75 65 57 69 6e  .    Tk_QueueWin
21f0: 64 6f 77 45 76 65 6e 74 28 26 78 45 76 65 6e 74  dowEvent(&xEvent
2200: 2c 20 54 43 4c 5f 51 55 45 55 45 5f 54 41 49 4c  , TCL_QUEUE_TAIL
2210: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 74 68  );.    return th
2220: 65 45 76 65 6e 74 3b 0a 7d 0a 40 65 6e 64 0a 0c  eEvent;.}.@end..
2230: 0a 0a 40 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ..@implementatio
2240: 6e 20 54 4b 43 6f 6e 74 65 6e 74 56 69 65 77 0a  n TKContentView.
2250: 40 73 79 6e 74 68 65 73 69 7a 65 20 74 6b 44 69  @synthesize tkDi
2260: 72 74 79 52 65 63 74 20 3d 20 5f 74 6b 44 69 72  rtyRect = _tkDir
2270: 74 79 52 65 63 74 3b 0a 40 73 79 6e 74 68 65 73  tyRect;.@synthes
2280: 69 7a 65 20 74 6b 4e 65 65 64 73 44 69 73 70 6c  ize tkNeedsDispl
2290: 61 79 20 3d 20 5f 74 6b 4e 65 65 64 73 44 69 73  ay = _tkNeedsDis
22a0: 70 6c 61 79 3b 0a 0a 2f 2a 0a 20 2a 20 49 6d 70  play;../*. * Imp
22b0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
22c0: 68 65 20 4e 53 54 65 78 74 49 6e 70 75 74 43 6c  he NSTextInputCl
22d0: 69 65 6e 74 20 70 72 6f 74 6f 63 6f 6c 2e 0a 20  ient protocol.. 
22e0: 2a 2f 0a 0a 2f 2a 20 5b 4e 53 54 65 78 74 49 6e  */../* [NSTextIn
22f0: 70 75 74 43 6c 69 65 6e 74 20 69 6e 70 75 74 54  putClient inputT
2300: 65 78 74 3a 20 72 65 70 6c 61 63 65 6d 65 6e 74  ext: replacement
2310: 52 61 6e 67 65 3a 5d 20 69 73 20 63 61 6c 6c 65  Range:] is calle
2320: 64 20 62 79 0a 20 2a 20 69 6e 74 65 72 70 72 65  d by. * interpre
2330: 74 4b 65 79 45 76 65 6e 74 73 20 77 68 65 6e 20  tKeyEvents when 
2340: 61 20 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 73 65  a composition se
2350: 71 75 65 6e 63 65 20 69 73 20 63 6f 6d 70 6c 65  quence is comple
2360: 74 65 2e 20 20 49 74 20 69 73 20 61 6c 73 6f 0a  te.  It is also.
2370: 20 2a 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 77   * called when w
2380: 65 20 64 65 6c 65 74 65 20 77 6f 72 6b 69 6e 67  e delete working
2390: 20 74 65 78 74 2e 20 20 49 6e 20 74 68 61 74 20   text.  In that 
23a0: 63 61 73 65 20 74 68 65 20 63 61 6c 6c 20 69 73  case the call is
23b0: 20 66 6f 6c 6c 6f 77 65 64 0a 20 2a 20 69 6d 6d   followed. * imm
23c0: 65 64 69 61 74 65 6c 79 20 62 79 20 64 6f 43 6f  ediately by doCo
23d0: 6d 6d 61 6e 64 42 79 53 65 6c 65 63 74 6f 72 3a  mmandBySelector:
23e0: 20 64 65 6c 65 74 65 42 61 63 6b 77 61 72 64 3a   deleteBackward:
23f0: 0a 20 2a 2f 0a 2d 20 28 76 6f 69 64 29 69 6e 73  . */.- (void)ins
2400: 65 72 74 54 65 78 74 3a 20 28 69 64 29 61 53 74  ertText: (id)aSt
2410: 72 69 6e 67 0a 20 20 72 65 70 6c 61 63 65 6d 65  ring.  replaceme
2420: 6e 74 52 61 6e 67 65 3a 20 28 4e 53 52 61 6e 67  ntRange: (NSRang
2430: 65 29 72 65 70 52 61 6e 67 65 0a 7b 0a 20 20 20  e)repRange.{.   
2440: 20 69 6e 74 20 69 2c 20 6c 65 6e 2c 20 73 74 61   int i, len, sta
2450: 74 65 3b 0a 20 20 20 20 58 45 76 65 6e 74 20 78  te;.    XEvent x
2460: 45 76 65 6e 74 3b 0a 20 20 20 20 4e 53 53 74 72  Event;.    NSStr
2470: 69 6e 67 20 2a 73 74 72 2c 20 2a 6b 65 79 73 74  ing *str, *keyst
2480: 72 2c 20 2a 6c 6f 77 65 72 3b 0a 20 20 20 20 54  r, *lower;.    T
2490: 6b 57 69 6e 64 6f 77 20 2a 77 69 6e 50 74 72 20  kWindow *winPtr 
24a0: 3d 20 54 6b 4d 61 63 4f 53 58 47 65 74 54 6b 57  = TkMacOSXGetTkW
24b0: 69 6e 64 6f 77 28 5b 73 65 6c 66 20 77 69 6e 64  indow([self wind
24c0: 6f 77 5d 29 3b 0a 20 20 20 20 54 6b 5f 57 69 6e  ow]);.    Tk_Win
24d0: 64 6f 77 20 74 6b 77 69 6e 20 3d 20 28 54 6b 5f  dow tkwin = (Tk_
24e0: 57 69 6e 64 6f 77 29 77 69 6e 50 74 72 3b 0a 20  Window)winPtr;. 
24f0: 20 20 20 42 6f 6f 6c 20 73 65 6e 64 69 6e 67 49     Bool sendingI
2500: 4d 45 54 65 78 74 20 3d 20 4e 4f 3b 0a 0a 20 20  METext = NO;..  
2510: 20 20 73 74 72 20 3d 20 28 5b 61 53 74 72 69 6e    str = ([aStrin
2520: 67 20 69 73 4b 69 6e 64 4f 66 43 6c 61 73 73 3a  g isKindOfClass:
2530: 20 5b 4e 53 41 74 74 72 69 62 75 74 65 64 53 74   [NSAttributedSt
2540: 72 69 6e 67 20 63 6c 61 73 73 5d 5d 29 20 3f 0a  ring class]]) ?.
2550: 20 20 20 20 20 20 20 20 5b 61 53 74 72 69 6e 67          [aString
2560: 20 73 74 72 69 6e 67 5d 20 3a 20 61 53 74 72 69   string] : aStri
2570: 6e 67 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 5b 73  ng;.    len = [s
2580: 74 72 20 6c 65 6e 67 74 68 5d 3b 0a 0a 20 20 20  tr length];..   
2590: 20 69 66 20 28 4e 53 5f 4b 45 59 4c 4f 47 29 20   if (NS_KEYLOG) 
25a0: 7b 0a 09 54 4b 4c 6f 67 28 40 22 69 6e 73 65 72  {..TKLog(@"inser
25b0: 74 54 65 78 74 20 27 25 40 27 5c 74 6c 65 6e 20  tText '%@'\tlen 
25c0: 3d 20 25 64 22 2c 20 61 53 74 72 69 6e 67 2c 20  = %d", aString, 
25d0: 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  len);.    }..   
25e0: 20 2f 2a 0a 20 20 20 20 20 2a 20 43 6c 65 61 72   /*.     * Clear
25f0: 20 61 6e 79 20 77 6f 72 6b 69 6e 67 20 74 65 78   any working tex
2600: 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  t..     */..    
2610: 69 66 20 28 70 72 69 76 61 74 65 57 6f 72 6b 69  if (privateWorki
2620: 6e 67 54 65 78 74 20 21 3d 20 6e 69 6c 29 20 7b  ngText != nil) {
2630: 0a 09 73 65 6e 64 69 6e 67 49 4d 45 54 65 78 74  ..sendingIMEText
2640: 20 3d 20 59 45 53 3b 0a 20 20 20 20 09 5b 73 65   = YES;.    .[se
2650: 6c 66 20 64 65 6c 65 74 65 57 6f 72 6b 69 6e 67  lf deleteWorking
2660: 54 65 78 74 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20  Text];.    }..  
2670: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 6e 73 65    /*.     * Inse
2680: 72 74 20 74 68 65 20 73 74 72 69 6e 67 20 61 73  rt the string as
2690: 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 6b   a sequence of k
26a0: 65 79 73 74 72 6f 6b 65 73 2e 0a 20 20 20 20 20  eystrokes..     
26b0: 2a 2f 0a 0a 20 20 20 20 73 65 74 75 70 58 45 76  */..    setupXEv
26c0: 65 6e 74 28 26 78 45 76 65 6e 74 2c 20 74 6b 77  ent(&xEvent, tkw
26d0: 69 6e 2c 20 74 65 78 74 49 6e 70 75 74 4d 6f 64  in, textInputMod
26e0: 69 66 69 65 72 73 29 3b 0a 20 20 20 20 73 65 74  ifiers);.    set
26f0: 58 45 76 65 6e 74 50 6f 69 6e 74 28 26 78 45 76  XEventPoint(&xEv
2700: 65 6e 74 2c 20 74 6b 77 69 6e 2c 20 5b 73 65 6c  ent, tkwin, [sel
2710: 66 20 77 69 6e 64 6f 77 5d 29 3b 0a 20 20 20 20  f window]);.    
2720: 78 45 76 65 6e 74 2e 78 61 6e 79 2e 74 79 70 65  xEvent.xany.type
2730: 20 3d 20 4b 65 79 50 72 65 73 73 3b 0a 0a 20 20   = KeyPress;..  
2740: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 70 70 6c    /*.     * Appl
2750: 65 20 65 76 69 64 65 6e 74 6c 79 20 73 65 74 73  e evidently sets
2760: 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 30 20 74   location to 0 t
2770: 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 61 6e  o signal that an
2780: 20 61 63 63 65 6e 74 65 64 20 6c 65 74 74 65 72   accented letter
2790: 20 68 61 73 0a 20 20 20 20 20 2a 20 62 65 65 6e   has.     * been
27a0: 20 73 65 6c 65 63 74 65 64 20 66 72 6f 6d 20 74   selected from t
27b0: 68 65 20 61 63 63 65 6e 74 20 6d 65 6e 75 2e 20  he accent menu. 
27c0: 20 41 6e 20 75 6e 61 63 63 65 6e 74 65 64 20 6c   An unaccented l
27d0: 65 74 74 65 72 20 68 61 73 20 61 6c 72 65 61 64  etter has alread
27e0: 79 0a 20 20 20 20 20 2a 20 62 65 65 6e 20 64 69  y.     * been di
27f0: 73 70 6c 61 79 65 64 20 61 6e 64 20 77 65 20 6e  splayed and we n
2800: 65 65 64 20 74 6f 20 65 72 61 73 65 20 69 74 20  eed to erase it 
2810: 62 65 66 6f 72 65 20 64 69 73 70 6c 61 79 69 6e  before displayin
2820: 67 20 74 68 65 20 61 63 63 65 6e 74 65 64 0a 20  g the accented. 
2830: 20 20 20 20 2a 20 6c 65 74 74 65 72 2e 0a 20 20      * letter..  
2840: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 72     */..    if (r
2850: 65 70 52 61 6e 67 65 2e 6c 6f 63 61 74 69 6f 6e  epRange.location
2860: 20 3d 3d 20 30 29 20 7b 0a 09 54 6b 5f 57 69 6e   == 0) {..Tk_Win
2870: 64 6f 77 20 66 6f 63 75 73 57 69 6e 20 3d 20 28  dow focusWin = (
2880: 54 6b 5f 57 69 6e 64 6f 77 29 77 69 6e 50 74 72  Tk_Window)winPtr
2890: 2d 3e 64 69 73 70 50 74 72 2d 3e 66 6f 63 75 73  ->dispPtr->focus
28a0: 50 74 72 3b 0a 09 54 6b 53 65 6e 64 56 69 72 74  Ptr;..TkSendVirt
28b0: 75 61 6c 45 76 65 6e 74 28 66 6f 63 75 73 57 69  ualEvent(focusWi
28c0: 6e 2c 20 22 54 6b 41 63 63 65 6e 74 42 61 63 6b  n, "TkAccentBack
28d0: 73 70 61 63 65 22 2c 20 4e 55 4c 4c 29 3b 0a 20  space", NULL);. 
28e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
28f0: 20 20 2a 20 4e 65 78 74 20 77 65 20 67 65 6e 65    * Next we gene
2900: 72 61 74 65 20 61 6e 20 58 45 76 65 6e 74 20 66  rate an XEvent f
2910: 6f 72 20 65 61 63 68 20 75 6e 69 63 6f 64 65 20  or each unicode 
2920: 63 68 61 72 61 63 74 65 72 20 69 6e 20 6f 75 72  character in our
2930: 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 20 2a 20   string..     * 
2940: 54 68 69 73 20 73 74 72 69 6e 67 20 63 6f 75 6c  This string coul
2950: 64 20 63 6f 6e 74 61 69 6e 20 6e 6f 6e 2d 42 4d  d contain non-BM
2960: 50 20 63 68 61 72 61 63 74 65 72 73 2c 20 66 6f  P characters, fo
2970: 72 20 65 78 61 6d 70 6c 65 20 69 66 20 74 68 65  r example if the
2980: 0a 20 20 20 20 20 2a 20 65 6d 6f 6a 69 20 70 61  .     * emoji pa
2990: 6c 65 74 74 65 20 77 61 73 20 75 73 65 64 2e 0a  lette was used..
29a0: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 4e 53       *.     * NS
29b0: 53 74 72 69 6e 67 20 75 73 65 73 20 55 54 46 2d  String uses UTF-
29c0: 31 36 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 20 77  16 internally, w
29d0: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20  hich means that 
29e0: 61 20 6e 6f 6e 2d 42 4d 50 20 63 68 61 72 61 63  a non-BMP charac
29f0: 74 65 72 20 69 73 0a 20 20 20 20 20 2a 20 72 65  ter is.     * re
2a00: 70 72 65 73 65 6e 74 65 64 20 62 79 20 61 20 73  presented by a s
2a10: 65 71 75 65 6e 63 65 20 6f 66 20 74 77 6f 20 31  equence of two 1
2a20: 36 2d 62 69 74 20 22 73 75 72 72 6f 67 61 74 65  6-bit "surrogate
2a30: 73 22 2e 20 20 57 65 20 72 65 63 6f 72 64 20 74  s".  We record t
2a40: 68 69 73 20 69 6e 0a 20 20 20 20 20 2a 20 74 68  his in.     * th
2a50: 65 20 58 45 76 65 6e 74 20 62 79 20 73 65 74 74  e XEvent by sett
2a60: 69 6e 67 20 74 68 65 20 6c 6f 77 20 6f 72 64 65  ing the low orde
2a70: 72 20 32 31 2d 62 69 74 73 20 6f 66 20 74 68 65  r 21-bits of the
2a80: 20 6b 65 79 63 6f 64 65 20 74 6f 20 74 68 65 20   keycode to the 
2a90: 55 43 53 2d 33 32 0a 20 20 20 20 20 2a 20 76 61  UCS-32.     * va
2aa0: 6c 75 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  lue value of the
2ab0: 20 63 68 61 72 61 63 74 65 72 20 61 6e 64 20 74   character and t
2ac0: 68 65 20 76 69 72 74 75 61 6c 20 6b 65 79 63 6f  he virtual keyco
2ad0: 64 65 20 69 6e 20 74 68 65 20 68 69 67 68 20 6f  de in the high o
2ae0: 72 64 65 72 0a 20 20 20 20 20 2a 20 62 79 74 65  rder.     * byte
2af0: 20 74 6f 20 74 68 65 20 73 70 65 63 69 61 6c 20   to the special 
2b00: 76 61 6c 75 65 20 4e 4f 4e 5f 42 4d 50 2e 0a 20  value NON_BMP.. 
2b10: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 73 74 61 74      */..    stat
2b20: 65 20 3d 20 78 45 76 65 6e 74 2e 78 6b 65 79 2e  e = xEvent.xkey.
2b30: 73 74 61 74 65 3b 0a 20 20 20 20 66 6f 72 20 28  state;.    for (
2b40: 69 20 3d 20 30 3b 20 69 20 3c 20 6c 65 6e 3b 20  i = 0; i < len; 
2b50: 69 2b 2b 29 20 7b 0a 09 55 6e 69 43 68 61 72 20  i++) {..UniChar 
2b60: 6b 65 79 63 68 61 72 3b 0a 09 4d 61 63 4b 65 79  keychar;..MacKey
2b70: 63 6f 64 65 20 6d 61 63 4b 43 20 3d 20 7b 30 7d  code macKC = {0}
2b80: 3b 0a 0a 09 6b 65 79 63 68 61 72 20 3d 20 5b 73  ;...keychar = [s
2b90: 74 72 20 63 68 61 72 61 63 74 65 72 41 74 49 6e  tr characterAtIn
2ba0: 64 65 78 3a 69 5d 3b 0a 09 6d 61 63 4b 43 2e 76  dex:i];..macKC.v
2bb0: 2e 6b 65 79 63 68 61 72 20 3d 20 6b 65 79 63 68  .keychar = keych
2bc0: 61 72 3b 0a 09 69 66 20 28 43 46 53 74 72 69 6e  ar;..if (CFStrin
2bd0: 67 49 73 53 75 72 72 6f 67 61 74 65 48 69 67 68  gIsSurrogateHigh
2be0: 43 68 61 72 61 63 74 65 72 28 6b 65 79 63 68 61  Character(keycha
2bf0: 72 29 29 20 7b 0a 09 20 20 20 20 55 6e 69 43 68  r)) {..    UniCh
2c00: 61 72 20 6c 6f 77 43 68 61 72 20 3d 20 5b 73 74  ar lowChar = [st
2c10: 72 20 63 68 61 72 61 63 74 65 72 41 74 49 6e 64  r characterAtInd
2c20: 65 78 3a 2b 2b 69 5d 3b 0a 09 20 20 20 20 6d 61  ex:++i];..    ma
2c30: 63 4b 43 2e 76 2e 6b 65 79 63 68 61 72 20 3d 20  cKC.v.keychar = 
2c40: 43 46 53 74 72 69 6e 67 47 65 74 4c 6f 6e 67 43  CFStringGetLongC
2c50: 68 61 72 61 63 74 65 72 46 6f 72 53 75 72 72 6f  haracterForSurro
2c60: 67 61 74 65 50 61 69 72 28 0a 09 09 09 09 20 20  gatePair(.....  
2c70: 28 55 6e 69 43 68 61 72 29 6b 65 79 63 68 61 72  (UniChar)keychar
2c80: 2c 20 6c 6f 77 43 68 61 72 29 3b 0a 09 20 20 20  , lowChar);..   
2c90: 20 6d 61 63 4b 43 2e 76 2e 76 69 72 74 20 3d 20   macKC.v.virt = 
2ca0: 4e 4f 4e 5f 42 4d 50 5f 56 49 52 54 55 41 4c 3b  NON_BMP_VIRTUAL;
2cb0: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 70  ..} else if (rep
2cc0: 52 61 6e 67 65 2e 6c 6f 63 61 74 69 6f 6e 20 3d  Range.location =
2cd0: 3d 20 30 20 7c 7c 20 73 65 6e 64 69 6e 67 49 4d  = 0 || sendingIM
2ce0: 45 54 65 78 74 29 20 7b 0a 09 20 20 20 20 6d 61  EText) {..    ma
2cf0: 63 4b 43 2e 76 2e 76 69 72 74 20 3d 20 52 45 50  cKC.v.virt = REP
2d00: 4c 41 43 45 4d 45 4e 54 5f 56 49 52 54 55 41 4c  LACEMENT_VIRTUAL
2d10: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
2d20: 20 6d 61 63 4b 43 2e 75 69 6e 74 20 3d 20 54 6b   macKC.uint = Tk
2d30: 4d 61 63 4f 53 58 41 64 64 56 69 72 74 75 61 6c  MacOSXAddVirtual
2d40: 28 6d 61 63 4b 43 2e 75 69 6e 74 29 3b 0a 09 20  (macKC.uint);.. 
2d50: 20 20 20 78 45 76 65 6e 74 2e 78 6b 65 79 2e 73     xEvent.xkey.s
2d60: 74 61 74 65 20 7c 3d 20 49 4e 44 45 58 32 53 54  tate |= INDEX2ST
2d70: 41 54 45 28 6d 61 63 4b 43 2e 78 2e 78 76 69 72  ATE(macKC.x.xvir
2d80: 74 75 61 6c 29 3b 0a 09 7d 0a 09 6b 65 79 73 74  tual);..}..keyst
2d90: 72 20 3d 20 5b 5b 4e 53 53 74 72 69 6e 67 20 61  r = [[NSString a
2da0: 6c 6c 6f 63 5d 20 69 6e 69 74 57 69 74 68 43 68  lloc] initWithCh
2db0: 61 72 61 63 74 65 72 73 3a 26 6b 65 79 63 68 61  aracters:&keycha
2dc0: 72 20 6c 65 6e 67 74 68 3a 31 5d 3b 0a 09 6c 6f  r length:1];..lo
2dd0: 77 65 72 20 3d 20 5b 6b 65 79 73 74 72 20 6c 6f  wer = [keystr lo
2de0: 77 65 72 63 61 73 65 53 74 72 69 6e 67 5d 3b 0a  wercaseString];.
2df0: 09 69 66 20 28 21 5b 6b 65 79 73 74 72 20 69 73  .if (![keystr is
2e00: 45 71 75 61 6c 3a 20 6c 6f 77 65 72 5d 29 20 7b  Equal: lower]) {
2e10: 0a 09 20 20 20 20 6d 61 63 4b 43 2e 76 2e 6f 5f  ..    macKC.v.o_
2e20: 73 20 7c 3d 20 49 4e 44 45 58 5f 53 48 49 46 54  s |= INDEX_SHIFT
2e30: 3b 0a 09 20 20 20 20 78 45 76 65 6e 74 2e 78 6b  ;..    xEvent.xk
2e40: 65 79 2e 73 74 61 74 65 20 7c 3d 20 53 68 69 66  ey.state |= Shif
2e50: 74 4d 61 73 6b 3b 0a 09 7d 0a 09 69 66 20 28 78  tMask;..}..if (x
2e60: 45 76 65 6e 74 2e 78 6b 65 79 2e 73 74 61 74 65  Event.xkey.state
2e70: 20 26 20 4d 6f 64 32 4d 61 73 6b 29 20 7b 0a 09   & Mod2Mask) {..
2e80: 20 20 20 20 6d 61 63 4b 43 2e 76 2e 6f 5f 73 20      macKC.v.o_s 
2e90: 7c 3d 20 49 4e 44 45 58 5f 4f 50 54 49 4f 4e 3b  |= INDEX_OPTION;
2ea0: 0a 09 7d 0a 09 78 45 76 65 6e 74 2e 78 6b 65 79  ..}..xEvent.xkey
2eb0: 2e 6b 65 79 63 6f 64 65 20 3d 20 6d 61 63 4b 43  .keycode = macKC
2ec0: 2e 75 69 6e 74 3b 0a 20 20 20 20 09 78 45 76 65  .uint;.    .xEve
2ed0: 6e 74 2e 78 61 6e 79 2e 74 79 70 65 20 3d 20 4b  nt.xany.type = K
2ee0: 65 79 50 72 65 73 73 3b 0a 20 20 20 20 09 54 6b  eyPress;.    .Tk
2ef0: 5f 51 75 65 75 65 57 69 6e 64 6f 77 45 76 65 6e  _QueueWindowEven
2f00: 74 28 26 78 45 76 65 6e 74 2c 20 54 43 4c 5f 51  t(&xEvent, TCL_Q
2f10: 55 45 55 45 5f 54 41 49 4c 29 3b 0a 09 78 45 76  UEUE_TAIL);..xEv
2f20: 65 6e 74 2e 78 6b 65 79 2e 73 74 61 74 65 20 3d  ent.xkey.state =
2f30: 20 73 74 61 74 65 3b 0a 20 20 20 20 7d 0a 7d 0a   state;.    }.}.
2f40: 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 72 65 71 75  ./*. * This requ
2f50: 69 72 65 64 20 6d 65 74 68 6f 64 20 69 73 20 61  ired method is a
2f60: 6c 6c 6f 77 65 64 20 74 6f 20 72 65 74 75 72 6e  llowed to return
2f70: 20 6e 69 6c 2e 0a 20 2a 2f 0a 0a 2d 20 28 4e 53   nil.. */..- (NS
2f80: 41 74 74 72 69 62 75 74 65 64 53 74 72 69 6e 67  AttributedString
2f90: 20 2a 29 61 74 74 72 69 62 75 74 65 64 53 75 62   *)attributedSub
2fa0: 73 74 72 69 6e 67 46 6f 72 50 72 6f 70 6f 73 65  stringForPropose
2fb0: 64 52 61 6e 67 65 3a 28 4e 53 52 61 6e 67 65 29  dRange:(NSRange)
2fc0: 74 68 65 52 61 6e 67 65 0a 20 20 20 20 20 20 61  theRange.      a
2fd0: 63 74 75 61 6c 52 61 6e 67 65 3a 28 4e 53 52 61  ctualRange:(NSRa
2fe0: 6e 67 65 50 6f 69 6e 74 65 72 29 74 68 65 50 6f  ngePointer)thePo
2ff0: 69 6e 74 65 72 0a 7b 0a 20 20 20 20 72 65 74 75  inter.{.    retu
3000: 72 6e 20 6e 69 6c 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  rn nil;.}../*. *
3010: 20 54 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20   This method is 
3020: 73 75 70 70 6f 73 65 64 20 74 6f 20 69 6e 73 65  supposed to inse
3030: 72 74 20 28 6f 72 20 72 65 70 6c 61 63 65 20 73  rt (or replace s
3040: 65 6c 65 63 74 65 64 20 74 65 78 74 20 77 69 74  elected text wit
3050: 68 29 20 74 68 65 20 73 74 72 69 6e 67 0a 20 2a  h) the string. *
3060: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 74 68   argument. If th
3070: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  e argument is an
3080: 20 4e 53 53 74 72 69 6e 67 2c 20 69 74 20 73 68   NSString, it sh
3090: 6f 75 6c 64 20 62 65 20 64 69 73 70 6c 61 79 65  ould be displaye
30a0: 64 20 77 69 74 68 20 61 0a 20 2a 20 64 69 73 74  d with a. * dist
30b0: 69 6e 67 75 69 73 68 69 6e 67 20 61 70 70 65 61  inguishing appea
30c0: 72 61 6e 63 65 2c 20 65 2e 67 20 75 6e 64 65 72  rance, e.g under
30d0: 6c 69 6e 65 64 2e 0a 20 2a 2f 0a 0a 2d 20 28 76  lined.. */..- (v
30e0: 6f 69 64 29 73 65 74 4d 61 72 6b 65 64 54 65 78  oid)setMarkedTex
30f0: 74 3a 20 28 69 64 29 61 53 74 72 69 6e 67 0a 09  t: (id)aString..
3100: 73 65 6c 65 63 74 65 64 52 61 6e 67 65 3a 20 28  selectedRange: (
3110: 4e 53 52 61 6e 67 65 29 73 65 6c 52 61 6e 67 65  NSRange)selRange
3120: 0a 20 20 20 20 20 72 65 70 6c 61 63 65 6d 65 6e  .     replacemen
3130: 74 52 61 6e 67 65 3a 20 28 4e 53 52 61 6e 67 65  tRange: (NSRange
3140: 29 72 65 70 52 61 6e 67 65 0a 7b 0a 20 20 20 20  )repRange.{.    
3150: 54 6b 57 69 6e 64 6f 77 20 2a 77 69 6e 50 74 72  TkWindow *winPtr
3160: 20 3d 20 54 6b 4d 61 63 4f 53 58 47 65 74 54 6b   = TkMacOSXGetTk
3170: 57 69 6e 64 6f 77 28 5b 73 65 6c 66 20 77 69 6e  Window([self win
3180: 64 6f 77 5d 29 3b 0a 20 20 20 20 54 6b 5f 57 69  dow]);.    Tk_Wi
3190: 6e 64 6f 77 20 66 6f 63 75 73 57 69 6e 20 3d 20  ndow focusWin = 
31a0: 28 54 6b 5f 57 69 6e 64 6f 77 29 77 69 6e 50 74  (Tk_Window)winPt
31b0: 72 2d 3e 64 69 73 70 50 74 72 2d 3e 66 6f 63 75  r->dispPtr->focu
31c0: 73 50 74 72 3b 0a 20 20 20 20 4e 53 53 74 72 69  sPtr;.    NSStri
31d0: 6e 67 20 2a 74 65 6d 70 3b 0a 20 20 20 20 4e 53  ng *temp;.    NS
31e0: 53 74 72 69 6e 67 20 2a 73 74 72 3b 0a 0a 20 20  String *str;..  
31f0: 20 20 73 74 72 20 3d 20 28 5b 61 53 74 72 69 6e    str = ([aStrin
3200: 67 20 69 73 4b 69 6e 64 4f 66 43 6c 61 73 73 3a  g isKindOfClass:
3210: 20 5b 4e 53 41 74 74 72 69 62 75 74 65 64 53 74   [NSAttributedSt
3220: 72 69 6e 67 20 63 6c 61 73 73 5d 5d 29 20 3f 0a  ring class]]) ?.
3230: 20 20 20 20 20 20 20 20 5b 61 53 74 72 69 6e 67          [aString
3240: 20 73 74 72 69 6e 67 5d 20 3a 20 61 53 74 72 69   string] : aStri
3250: 6e 67 3b 0a 20 20 20 20 69 66 20 28 66 6f 63 75  ng;.    if (focu
3260: 73 57 69 6e 29 20 7b 0a 0a 09 2f 2a 0a 09 20 2a  sWin) {.../*.. *
3270: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 77 69   Remember the wi
3280: 64 67 65 74 20 77 68 65 72 65 20 74 68 65 20 63  dget where the c
3290: 6f 6d 70 6f 73 69 74 69 6f 6e 20 69 73 20 68 61  omposition is ha
32a0: 70 70 65 6e 69 6e 67 2c 20 69 6e 20 63 61 73 65  ppening, in case
32b0: 20 69 74 0a 09 20 2a 20 67 65 74 73 20 64 65 66   it.. * gets def
32c0: 6f 63 75 73 73 65 64 20 64 75 72 69 6e 67 20 74  ocussed during t
32d0: 68 65 20 63 6f 6d 70 6f 73 69 74 69 6f 6e 2e 0a  he composition..
32e0: 09 20 2a 2f 0a 0a 09 63 6f 6d 70 6f 73 65 57 69  . */...composeWi
32f0: 6e 20 3d 20 66 6f 63 75 73 57 69 6e 3b 0a 20 20  n = focusWin;.  
3300: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 74 75    } else {..retu
3310: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rn;.    }.    if
3320: 20 28 4e 53 5f 4b 45 59 4c 4f 47 29 20 7b 0a 09   (NS_KEYLOG) {..
3330: 54 4b 4c 6f 67 28 40 22 73 65 74 4d 61 72 6b 65  TKLog(@"setMarke
3340: 64 54 65 78 74 20 27 25 40 27 20 6c 65 6e 20 3d  dText '%@' len =
3350: 25 6c 75 20 72 61 6e 67 65 20 25 6c 75 20 66 72  %lu range %lu fr
3360: 6f 6d 20 25 6c 75 22 2c 20 73 74 72 2c 0a 09 20  om %lu", str,.. 
3370: 20 20 20 20 20 28 75 6e 73 69 67 6e 65 64 20 6c       (unsigned l
3380: 6f 6e 67 29 20 5b 73 74 72 20 6c 65 6e 67 74 68  ong) [str length
3390: 5d 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ], (unsigned lon
33a0: 67 29 20 73 65 6c 52 61 6e 67 65 2e 6c 65 6e 67  g) selRange.leng
33b0: 74 68 2c 0a 09 20 20 20 20 20 20 28 75 6e 73 69  th,..      (unsi
33c0: 67 6e 65 64 20 6c 6f 6e 67 29 20 73 65 6c 52 61  gned long) selRa
33d0: 6e 67 65 2e 6c 6f 63 61 74 69 6f 6e 29 3b 0a 20  nge.location);. 
33e0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 70 72     }..    if (pr
33f0: 69 76 61 74 65 57 6f 72 6b 69 6e 67 54 65 78 74  ivateWorkingText
3400: 20 21 3d 20 6e 69 6c 29 20 7b 0a 09 5b 73 65 6c   != nil) {..[sel
3410: 66 20 64 65 6c 65 74 65 57 6f 72 6b 69 6e 67 54  f deleteWorkingT
3420: 65 78 74 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ext];.    }..   
3430: 20 69 66 20 28 5b 73 74 72 20 6c 65 6e 67 74 68   if ([str length
3440: 5d 20 3d 3d 20 30 29 20 7b 0a 09 72 65 74 75 72  ] == 0) {..retur
3450: 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  n;.    }..    /*
3460: 0a 20 20 20 20 20 2a 20 55 73 65 20 6f 75 72 20  .     * Use our 
3470: 69 6e 73 65 72 74 54 65 78 74 20 6d 65 74 68 6f  insertText metho
3480: 64 20 74 6f 20 64 69 73 70 6c 61 79 20 74 68 65  d to display the
3490: 20 6d 61 72 6b 65 64 20 74 65 78 74 2e 0a 20 20   marked text..  
34a0: 20 20 20 2a 2f 0a 0a 20 20 20 20 54 6b 53 65 6e     */..    TkSen
34b0: 64 56 69 72 74 75 61 6c 45 76 65 6e 74 28 66 6f  dVirtualEvent(fo
34c0: 63 75 73 57 69 6e 2c 20 22 54 6b 53 74 61 72 74  cusWin, "TkStart
34d0: 49 4d 45 4d 61 72 6b 65 64 54 65 78 74 22 2c 20  IMEMarkedText", 
34e0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 72 6f 63 65  NULL);.    proce
34f0: 73 73 69 6e 67 43 6f 6d 70 6f 73 65 20 3d 20 59  ssingCompose = Y
3500: 45 53 3b 0a 20 20 20 20 74 65 6d 70 20 3d 20 5b  ES;.    temp = [
3510: 73 74 72 20 63 6f 70 79 5d 3b 0a 20 20 20 20 5b  str copy];.    [
3520: 73 65 6c 66 20 69 6e 73 65 72 74 54 65 78 74 3a  self insertText:
3530: 20 74 65 6d 70 20 72 65 70 6c 61 63 65 6d 65 6e   temp replacemen
3540: 74 52 61 6e 67 65 3a 72 65 70 52 61 6e 67 65 5d  tRange:repRange]
3550: 3b 0a 20 20 20 20 70 72 69 76 61 74 65 57 6f 72  ;.    privateWor
3560: 6b 69 6e 67 54 65 78 74 20 3d 20 74 65 6d 70 3b  kingText = temp;
3570: 0a 20 20 20 20 54 6b 53 65 6e 64 56 69 72 74 75  .    TkSendVirtu
3580: 61 6c 45 76 65 6e 74 28 66 6f 63 75 73 57 69 6e  alEvent(focusWin
3590: 2c 20 22 54 6b 45 6e 64 49 4d 45 4d 61 72 6b 65  , "TkEndIMEMarke
35a0: 64 54 65 78 74 22 2c 20 4e 55 4c 4c 29 3b 0a 7d  dText", NULL);.}
35b0: 0a 0a 2d 20 28 42 4f 4f 4c 29 68 61 73 4d 61 72  ..- (BOOL)hasMar
35c0: 6b 65 64 54 65 78 74 0a 7b 0a 20 20 20 20 72 65  kedText.{.    re
35d0: 74 75 72 6e 20 70 72 69 76 61 74 65 57 6f 72 6b  turn privateWork
35e0: 69 6e 67 54 65 78 74 20 21 3d 20 6e 69 6c 3b 0a  ingText != nil;.
35f0: 7d 0a 0a 2d 20 28 4e 53 52 61 6e 67 65 29 6d 61  }..- (NSRange)ma
3600: 72 6b 65 64 52 61 6e 67 65 0a 7b 0a 20 20 20 20  rkedRange.{.    
3610: 4e 53 52 61 6e 67 65 20 72 6e 67 20 3d 20 70 72  NSRange rng = pr
3620: 69 76 61 74 65 57 6f 72 6b 69 6e 67 54 65 78 74  ivateWorkingText
3630: 20 21 3d 20 6e 69 6c 0a 09 3f 20 4e 53 4d 61 6b   != nil..? NSMak
3640: 65 52 61 6e 67 65 28 30 2c 20 5b 70 72 69 76 61  eRange(0, [priva
3650: 74 65 57 6f 72 6b 69 6e 67 54 65 78 74 20 6c 65  teWorkingText le
3660: 6e 67 74 68 5d 29 0a 09 3a 20 4e 53 4d 61 6b 65  ngth])..: NSMake
3670: 52 61 6e 67 65 28 4e 53 4e 6f 74 46 6f 75 6e 64  Range(NSNotFound
3680: 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66 20 28 4e  , 0);..    if (N
3690: 53 5f 4b 45 59 4c 4f 47 29 20 7b 0a 09 54 4b 4c  S_KEYLOG) {..TKL
36a0: 6f 67 28 40 22 6d 61 72 6b 65 64 52 61 6e 67 65  og(@"markedRange
36b0: 20 72 65 71 75 65 73 74 22 29 3b 0a 20 20 20 20   request");.    
36c0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 6e 67  }.    return rng
36d0: 3b 0a 7d 0a 0a 2d 20 28 76 6f 69 64 29 75 6e 6d  ;.}..- (void)unm
36e0: 61 72 6b 54 65 78 74 0a 7b 0a 20 20 20 20 69 66  arkText.{.    if
36f0: 20 28 4e 53 5f 4b 45 59 4c 4f 47 29 20 7b 0a 09   (NS_KEYLOG) {..
3700: 54 4b 4c 6f 67 28 40 22 75 6e 6d 61 72 6b 54 65  TKLog(@"unmarkTe
3710: 78 74 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xt");.    }.    
3720: 5b 73 65 6c 66 20 64 65 6c 65 74 65 57 6f 72 6b  [self deleteWork
3730: 69 6e 67 54 65 78 74 5d 3b 0a 20 20 20 20 70 72  ingText];.    pr
3740: 6f 63 65 73 73 69 6e 67 43 6f 6d 70 6f 73 65 20  ocessingCompose 
3750: 3d 20 4e 4f 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 43  = NO;.}../*. * C
3760: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 73 79 73  alled by the sys
3770: 74 65 6d 20 74 6f 20 67 65 74 20 61 20 70 6f 73  tem to get a pos
3780: 69 74 69 6f 6e 20 66 6f 72 20 70 6f 70 75 70 20  ition for popup 
3790: 63 68 61 72 61 63 74 65 72 20 73 65 6c 65 63 74  character select
37a0: 69 6f 6e 20 77 69 6e 64 6f 77 73 0a 20 2a 20 73  ion windows. * s
37b0: 75 63 68 20 61 73 20 61 20 43 68 61 72 61 63 74  uch as a Charact
37c0: 65 72 20 50 61 6c 65 74 74 65 2c 20 6f 72 20 61  er Palette, or a
37d0: 20 73 65 6c 65 63 74 69 6f 6e 20 6d 65 6e 75 20   selection menu 
37e0: 66 6f 72 20 49 4d 45 2e 0a 20 2a 2f 0a 0a 2d 20  for IME.. */..- 
37f0: 28 4e 53 52 65 63 74 29 66 69 72 73 74 52 65 63  (NSRect)firstRec
3800: 74 46 6f 72 43 68 61 72 61 63 74 65 72 52 61 6e  tForCharacterRan
3810: 67 65 3a 20 28 4e 53 52 61 6e 67 65 29 74 68 65  ge: (NSRange)the
3820: 52 61 6e 67 65 0a 09 09 09 20 61 63 74 75 61 6c  Range.... actual
3830: 52 61 6e 67 65 3a 20 28 4e 53 52 61 6e 67 65 50  Range: (NSRangeP
3840: 6f 69 6e 74 65 72 29 74 68 65 50 6f 69 6e 74 65  ointer)thePointe
3850: 72 0a 7b 0a 20 20 20 20 4e 53 52 65 63 74 20 72  r.{.    NSRect r
3860: 65 63 74 3b 0a 20 20 20 20 4e 53 50 6f 69 6e 74  ect;.    NSPoint
3870: 20 70 74 3b 0a 20 20 20 20 70 74 2e 78 20 3d 20   pt;.    pt.x = 
3880: 63 61 72 65 74 5f 78 3b 0a 20 20 20 20 70 74 2e  caret_x;.    pt.
3890: 79 20 3d 20 63 61 72 65 74 5f 79 3b 0a 0a 20 20  y = caret_y;..  
38a0: 20 20 70 74 20 3d 20 5b 73 65 6c 66 20 63 6f 6e    pt = [self con
38b0: 76 65 72 74 50 6f 69 6e 74 3a 20 70 74 20 74 6f  vertPoint: pt to
38c0: 56 69 65 77 3a 20 6e 69 6c 5d 3b 0a 20 20 20 20  View: nil];.    
38d0: 70 74 20 3d 20 5b 5b 73 65 6c 66 20 77 69 6e 64  pt = [[self wind
38e0: 6f 77 5d 20 74 6b 43 6f 6e 76 65 72 74 50 6f 69  ow] tkConvertPoi
38f0: 6e 74 54 6f 53 63 72 65 65 6e 3a 20 70 74 5d 3b  ntToScreen: pt];
3900: 0a 20 20 20 20 70 74 2e 79 20 2d 3d 20 63 61 72  .    pt.y -= car
3910: 65 74 5f 68 65 69 67 68 74 3b 0a 0a 20 20 20 20  et_height;..    
3920: 72 65 63 74 2e 6f 72 69 67 69 6e 20 3d 20 70 74  rect.origin = pt
3930: 3b 0a 20 20 20 20 72 65 63 74 2e 73 69 7a 65 2e  ;.    rect.size.
3940: 77 69 64 74 68 20 3d 20 30 3b 0a 20 20 20 20 72  width = 0;.    r
3950: 65 63 74 2e 73 69 7a 65 2e 68 65 69 67 68 74 20  ect.size.height 
3960: 3d 20 63 61 72 65 74 5f 68 65 69 67 68 74 3b 0a  = caret_height;.
3970: 20 20 20 20 72 65 74 75 72 6e 20 72 65 63 74 3b      return rect;
3980: 0a 7d 0a 0a 2d 20 28 4e 53 49 6e 74 65 67 65 72  .}..- (NSInteger
3990: 29 63 6f 6e 76 65 72 73 61 74 69 6f 6e 49 64 65  )conversationIde
39a0: 6e 74 69 66 69 65 72 0a 7b 0a 20 20 20 20 72 65  ntifier.{.    re
39b0: 74 75 72 6e 20 28 4e 53 49 6e 74 65 67 65 72 29  turn (NSInteger)
39c0: 20 73 65 6c 66 3b 0a 7d 0a 0a 2d 20 28 76 6f 69   self;.}..- (voi
39d0: 64 29 64 6f 43 6f 6d 6d 61 6e 64 42 79 53 65 6c  d)doCommandBySel
39e0: 65 63 74 6f 72 3a 20 28 53 45 4c 29 61 53 65 6c  ector: (SEL)aSel
39f0: 65 63 74 6f 72 0a 7b 0a 20 20 20 20 69 66 20 28  ector.{.    if (
3a00: 4e 53 5f 4b 45 59 4c 4f 47 29 20 7b 0a 09 54 4b  NS_KEYLOG) {..TK
3a10: 4c 6f 67 28 40 22 64 6f 43 6f 6d 6d 61 6e 64 42  Log(@"doCommandB
3a20: 79 53 65 6c 65 63 74 6f 72 3a 20 25 40 22 2c 20  ySelector: %@", 
3a30: 4e 53 53 74 72 69 6e 67 46 72 6f 6d 53 65 6c 65  NSStringFromSele
3a40: 63 74 6f 72 28 61 53 65 6c 65 63 74 6f 72 29 29  ctor(aSelector))
3a50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 6f 63  ;.    }.    proc
3a60: 65 73 73 69 6e 67 43 6f 6d 70 6f 73 65 20 3d 20  essingCompose = 
3a70: 4e 4f 3b 0a 20 20 20 20 69 66 20 28 61 53 65 6c  NO;.    if (aSel
3a80: 65 63 74 6f 72 20 3d 3d 20 40 73 65 6c 65 63 74  ector == @select
3a90: 6f 72 20 28 64 65 6c 65 74 65 42 61 63 6b 77 61  or (deleteBackwa
3aa0: 72 64 3a 29 29 20 7b 0a 09 54 6b 57 69 6e 64 6f  rd:)) {..TkWindo
3ab0: 77 20 2a 77 69 6e 50 74 72 20 3d 20 54 6b 4d 61  w *winPtr = TkMa
3ac0: 63 4f 53 58 47 65 74 54 6b 57 69 6e 64 6f 77 28  cOSXGetTkWindow(
3ad0: 5b 73 65 6c 66 20 77 69 6e 64 6f 77 5d 29 3b 0a  [self window]);.
3ae0: 09 54 6b 5f 57 69 6e 64 6f 77 20 66 6f 63 75 73  .Tk_Window focus
3af0: 57 69 6e 20 3d 20 28 54 6b 5f 57 69 6e 64 6f 77  Win = (Tk_Window
3b00: 29 77 69 6e 50 74 72 2d 3e 64 69 73 70 50 74 72  )winPtr->dispPtr
3b10: 2d 3e 66 6f 63 75 73 50 74 72 3b 0a 09 54 6b 53  ->focusPtr;..TkS
3b20: 65 6e 64 56 69 72 74 75 61 6c 45 76 65 6e 74 28  endVirtualEvent(
3b30: 66 6f 63 75 73 57 69 6e 2c 20 22 54 6b 41 63 63  focusWin, "TkAcc
3b40: 65 6e 74 42 61 63 6b 73 70 61 63 65 22 2c 20 4e  entBackspace", N
3b50: 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2d  ULL);.    }.}..-
3b60: 20 28 4e 53 41 72 72 61 79 20 2a 29 76 61 6c 69   (NSArray *)vali
3b70: 64 41 74 74 72 69 62 75 74 65 73 46 6f 72 4d 61  dAttributesForMa
3b80: 72 6b 65 64 54 65 78 74 0a 7b 0a 20 20 20 20 73  rkedText.{.    s
3b90: 74 61 74 69 63 20 4e 53 41 72 72 61 79 20 2a 61  tatic NSArray *a
3ba0: 72 72 20 3d 20 6e 69 6c 3b 0a 20 20 20 20 69 66  rr = nil;.    if
3bb0: 20 28 61 72 72 20 3d 3d 20 6e 69 6c 29 20 7b 0a   (arr == nil) {.
3bc0: 09 61 72 72 20 3d 20 5b 5b 4e 53 41 72 72 61 79  .arr = [[NSArray
3bd0: 20 61 6c 6c 6f 63 5d 20 69 6e 69 74 57 69 74 68   alloc] initWith
3be0: 4f 62 6a 65 63 74 73 3a 0a 09 20 20 20 20 4e 53  Objects:..    NS
3bf0: 55 6e 64 65 72 6c 69 6e 65 53 74 79 6c 65 41 74  UnderlineStyleAt
3c00: 74 72 69 62 75 74 65 4e 61 6d 65 2c 0a 09 20 20  tributeName,..  
3c10: 20 20 4e 53 55 6e 64 65 72 6c 69 6e 65 43 6f 6c    NSUnderlineCol
3c20: 6f 72 41 74 74 72 69 62 75 74 65 4e 61 6d 65 2c  orAttributeName,
3c30: 0a 09 20 20 20 20 6e 69 6c 5d 3b 0a 09 5b 61 72  ..    nil];..[ar
3c40: 72 20 72 65 74 61 69 6e 5d 3b 0a 20 20 20 20 7d  r retain];.    }
3c50: 0a 20 20 20 20 72 65 74 75 72 6e 20 61 72 72 3b  .    return arr;
3c60: 0a 7d 0a 0a 2d 20 28 4e 53 52 61 6e 67 65 29 73  .}..- (NSRange)s
3c70: 65 6c 65 63 74 65 64 52 61 6e 67 65 0a 7b 0a 20  electedRange.{. 
3c80: 20 20 20 69 66 20 28 4e 53 5f 4b 45 59 4c 4f 47     if (NS_KEYLOG
3c90: 29 20 7b 0a 09 54 4b 4c 6f 67 28 40 22 73 65 6c  ) {..TKLog(@"sel
3ca0: 65 63 74 65 64 52 61 6e 67 65 20 72 65 71 75 65  ectedRange reque
3cb0: 73 74 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  st");.    }.    
3cc0: 72 65 74 75 72 6e 20 4e 53 4d 61 6b 65 52 61 6e  return NSMakeRan
3cd0: 67 65 28 30 2c 20 30 29 3b 0a 7d 0a 0a 2d 20 28  ge(0, 0);.}..- (
3ce0: 4e 53 55 49 6e 74 65 67 65 72 29 63 68 61 72 61  NSUInteger)chara
3cf0: 63 74 65 72 49 6e 64 65 78 46 6f 72 50 6f 69 6e  cterIndexForPoin
3d00: 74 3a 20 28 4e 53 50 6f 69 6e 74 29 74 68 65 50  t: (NSPoint)theP
3d10: 6f 69 6e 74 0a 7b 0a 20 20 20 20 69 66 20 28 4e  oint.{.    if (N
3d20: 53 5f 4b 45 59 4c 4f 47 29 20 7b 0a 09 54 4b 4c  S_KEYLOG) {..TKL
3d30: 6f 67 28 40 22 63 68 61 72 61 63 74 65 72 49 6e  og(@"characterIn
3d40: 64 65 78 46 6f 72 50 6f 69 6e 74 20 72 65 71 75  dexForPoint requ
3d50: 65 73 74 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  est");.    }.   
3d60: 20 72 65 74 75 72 6e 20 4e 53 4e 6f 74 46 6f 75   return NSNotFou
3d70: 6e 64 3b 0a 7d 0a 0a 2d 20 28 4e 53 41 74 74 72  nd;.}..- (NSAttr
3d80: 69 62 75 74 65 64 53 74 72 69 6e 67 20 2a 29 61  ibutedString *)a
3d90: 74 74 72 69 62 75 74 65 64 53 75 62 73 74 72 69  ttributedSubstri
3da0: 6e 67 46 72 6f 6d 52 61 6e 67 65 3a 20 28 4e 53  ngFromRange: (NS
3db0: 52 61 6e 67 65 29 74 68 65 52 61 6e 67 65 0a 7b  Range)theRange.{
3dc0: 0a 20 20 20 20 73 74 61 74 69 63 20 4e 53 41 74  .    static NSAt
3dd0: 74 72 69 62 75 74 65 64 53 74 72 69 6e 67 20 2a  tributedString *
3de0: 73 74 72 20 3d 20 6e 69 6c 3b 0a 20 20 20 20 69  str = nil;.    i
3df0: 66 20 28 73 74 72 20 3d 3d 20 6e 69 6c 29 20 7b  f (str == nil) {
3e00: 0a 09 73 74 72 20 3d 20 5b 4e 53 41 74 74 72 69  ..str = [NSAttri
3e10: 62 75 74 65 64 53 74 72 69 6e 67 20 6e 65 77 5d  butedString new]
3e20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
3e30: 4e 53 5f 4b 45 59 4c 4f 47 29 20 7b 0a 09 54 4b  NS_KEYLOG) {..TK
3e40: 4c 6f 67 28 40 22 61 74 74 72 69 62 75 74 65 64  Log(@"attributed
3e50: 53 75 62 73 74 72 69 6e 67 46 72 6f 6d 52 61 6e  SubstringFromRan
3e60: 67 65 20 72 65 71 75 65 73 74 22 29 3b 0a 20 20  ge request");.  
3e70: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73    }.    return s
3e80: 74 72 3b 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20  tr;.}./* End of 
3e90: 4e 53 54 65 78 74 49 6e 70 75 74 43 6c 69 65 6e  NSTextInputClien
3ea0: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
3eb0: 2e 20 2a 2f 0a 0a 40 65 6e 64 0a 0c 0a 0a 40 69  . */..@end....@i
3ec0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 54 4b  mplementation TK
3ed0: 43 6f 6e 74 65 6e 74 56 69 65 77 28 54 4b 4b 65  ContentView(TKKe
3ee0: 79 45 76 65 6e 74 29 0a 0a 2f 2a 0a 20 2a 20 54  yEvent)../*. * T
3ef0: 65 6c 6c 20 74 68 65 20 77 69 64 67 65 74 20 74  ell the widget t
3f00: 6f 20 65 72 61 73 65 20 74 68 65 20 64 69 73 70  o erase the disp
3f10: 6c 61 79 65 64 20 63 6f 6d 70 6f 73 69 6e 67 20  layed composing 
3f20: 63 68 61 72 61 63 74 65 72 73 2e 20 20 54 68 69  characters.  Thi
3f30: 73 0a 20 2a 20 69 73 20 6e 6f 74 20 70 61 72 74  s. * is not part
3f40: 20 6f 66 20 74 68 65 20 4e 53 54 65 78 74 49 6e   of the NSTextIn
3f50: 70 75 74 43 6c 69 65 6e 74 20 70 72 6f 74 6f 63  putClient protoc
3f60: 6f 6c 2e 0a 20 2a 2f 0a 0a 2d 20 28 76 6f 69 64  ol.. */..- (void
3f70: 29 64 65 6c 65 74 65 57 6f 72 6b 69 6e 67 54 65  )deleteWorkingTe
3f80: 78 74 0a 7b 0a 20 20 20 20 69 66 20 28 70 72 69  xt.{.    if (pri
3f90: 76 61 74 65 57 6f 72 6b 69 6e 67 54 65 78 74 20  vateWorkingText 
3fa0: 3d 3d 20 6e 69 6c 29 20 7b 0a 09 72 65 74 75 72  == nil) {..retur
3fb0: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  n;.    } else {.
3fc0: 0a 09 69 66 20 28 4e 53 5f 4b 45 59 4c 4f 47 29  ..if (NS_KEYLOG)
3fd0: 20 7b 0a 09 20 20 20 20 54 4b 4c 6f 67 28 40 22   {..    TKLog(@"
3fe0: 64 65 6c 65 74 65 57 6f 72 6b 69 6e 67 54 65 78  deleteWorkingTex
3ff0: 74 20 6c 65 6e 20 3d 20 25 6c 75 5c 6e 22 2c 0a  t len = %lu\n",.
4000: 09 09 20 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ..  (unsigned lo
4010: 6e 67 29 5b 70 72 69 76 61 74 65 57 6f 72 6b 69  ng)[privateWorki
4020: 6e 67 54 65 78 74 20 6c 65 6e 67 74 68 5d 29 3b  ngText length]);
4030: 0a 09 7d 0a 0a 09 5b 70 72 69 76 61 74 65 57 6f  ..}...[privateWo
4040: 72 6b 69 6e 67 54 65 78 74 20 72 65 6c 65 61 73  rkingText releas
4050: 65 5d 3b 0a 09 70 72 69 76 61 74 65 57 6f 72 6b  e];..privateWork
4060: 69 6e 67 54 65 78 74 20 3d 20 6e 69 6c 3b 0a 09  ingText = nil;..
4070: 70 72 6f 63 65 73 73 69 6e 67 43 6f 6d 70 6f 73  processingCompos
4080: 65 20 3d 20 4e 4f 3b 0a 09 69 66 20 28 63 6f 6d  e = NO;..if (com
4090: 70 6f 73 65 57 69 6e 29 20 7b 0a 09 20 20 20 20  poseWin) {..    
40a0: 54 6b 53 65 6e 64 56 69 72 74 75 61 6c 45 76 65  TkSendVirtualEve
40b0: 6e 74 28 63 6f 6d 70 6f 73 65 57 69 6e 2c 20 22  nt(composeWin, "
40c0: 54 6b 43 6c 65 61 72 49 4d 45 4d 61 72 6b 65 64  TkClearIMEMarked
40d0: 54 65 78 74 22 2c 20 4e 55 4c 4c 29 3b 0a 09 7d  Text", NULL);..}
40e0: 0a 20 20 20 20 7d 0a 7d 0a 0a 2d 20 28 76 6f 69  .    }.}..- (voi
40f0: 64 29 63 61 6e 63 65 6c 43 6f 6d 70 6f 73 69 6e  d)cancelComposin
4100: 67 54 65 78 74 0a 7b 0a 20 20 20 20 69 66 20 28  gText.{.    if (
4110: 4e 53 5f 4b 45 59 4c 4f 47 29 20 7b 0a 09 54 4b  NS_KEYLOG) {..TK
4120: 4c 6f 67 28 40 22 63 61 6e 63 65 6c 43 6f 6d 70  Log(@"cancelComp
4130: 6f 73 69 6e 67 54 65 78 74 22 29 3b 0a 20 20 20  osingText");.   
4140: 20 7d 0a 20 20 20 20 5b 73 65 6c 66 20 64 65 6c   }.    [self del
4150: 65 74 65 57 6f 72 6b 69 6e 67 54 65 78 74 5d 3b  eteWorkingText];
4160: 0a 20 20 20 20 70 72 6f 63 65 73 73 69 6e 67 43  .    processingC
4170: 6f 6d 70 6f 73 65 20 3d 20 4e 4f 3b 0a 7d 0a 0a  ompose = NO;.}..
4180: 40 65 6e 64 0a 0a 2f 2a 0a 20 2a 20 53 65 74 20  @end../*. * Set 
4190: 75 70 20 62 61 73 69 63 20 66 69 65 6c 64 73 20  up basic fields 
41a0: 69 6e 20 78 65 76 65 6e 74 20 66 6f 72 20 6b 65  in xevent for ke
41b0: 79 62 6f 61 72 64 20 69 6e 70 75 74 2e 0a 20 2a  yboard input.. *
41c0: 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 73  /..static void.s
41d0: 65 74 75 70 58 45 76 65 6e 74 28 58 45 76 65 6e  etupXEvent(XEven
41e0: 74 20 2a 78 45 76 65 6e 74 2c 20 54 6b 5f 57 69  t *xEvent, Tk_Wi
41f0: 6e 64 6f 77 20 74 6b 77 69 6e 2c 20 4e 53 55 49  ndow tkwin, NSUI
4200: 6e 74 65 67 65 72 20 6d 6f 64 69 66 69 65 72 73  nteger modifiers
4210: 29 0a 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  ).{.    unsigned
4220: 20 69 6e 74 20 73 74 61 74 65 20 3d 20 30 3b 0a   int state = 0;.
4230: 20 20 20 20 44 69 73 70 6c 61 79 20 2a 64 69 73      Display *dis
4240: 70 6c 61 79 3b 0a 0a 20 20 20 20 69 66 20 28 74  play;..    if (t
4250: 6b 77 69 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  kwin == NULL) {.
4260: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20  .return;.    }. 
4270: 20 20 20 64 69 73 70 6c 61 79 20 3d 20 54 6b 5f     display = Tk_
4280: 44 69 73 70 6c 61 79 28 74 6b 77 69 6e 29 3b 0a  Display(tkwin);.
4290: 20 20 20 20 69 66 20 28 6d 6f 64 69 66 69 65 72      if (modifier
42a0: 73 29 20 7b 0a 09 73 74 61 74 65 20 3d 20 28 6d  s) {..state = (m
42b0: 6f 64 69 66 69 65 72 73 20 26 20 4e 53 41 6c 70  odifiers & NSAlp
42c0: 68 61 53 68 69 66 74 4b 65 79 4d 61 73 6b 20 3f  haShiftKeyMask ?
42d0: 20 4c 6f 63 6b 4d 61 73 6b 20 20 20 20 3a 20 30   LockMask    : 0
42e0: 29 20 7c 0a 09 20 20 20 20 20 20 20 20 28 6d 6f  ) |..        (mo
42f0: 64 69 66 69 65 72 73 20 26 20 4e 53 53 68 69 66  difiers & NSShif
4300: 74 4b 65 79 4d 61 73 6b 20 20 20 20 20 20 3f 20  tKeyMask      ? 
4310: 53 68 69 66 74 4d 61 73 6b 20 20 20 3a 20 30 29  ShiftMask   : 0)
4320: 20 7c 0a 09 20 20 20 20 20 20 20 20 28 6d 6f 64   |..        (mod
4330: 69 66 69 65 72 73 20 26 20 4e 53 43 6f 6e 74 72  ifiers & NSContr
4340: 6f 6c 4b 65 79 4d 61 73 6b 20 20 20 20 3f 20 43  olKeyMask    ? C
4350: 6f 6e 74 72 6f 6c 4d 61 73 6b 20 3a 20 30 29 20  ontrolMask : 0) 
4360: 7c 0a 09 20 20 20 20 20 20 20 20 28 6d 6f 64 69  |..        (modi
4370: 66 69 65 72 73 20 26 20 4e 53 43 6f 6d 6d 61 6e  fiers & NSComman
4380: 64 4b 65 79 4d 61 73 6b 20 20 20 20 3f 20 4d 6f  dKeyMask    ? Mo
4390: 64 31 4d 61 73 6b 20 20 20 20 3a 20 30 29 20 7c  d1Mask    : 0) |
43a0: 0a 09 20 20 20 20 20 20 20 20 28 6d 6f 64 69 66  ..        (modif
43b0: 69 65 72 73 20 26 20 4e 53 41 6c 74 65 72 6e 61  iers & NSAlterna
43c0: 74 65 4b 65 79 4d 61 73 6b 20 20 3f 20 4d 6f 64  teKeyMask  ? Mod
43d0: 32 4d 61 73 6b 20 20 20 20 3a 20 30 29 20 7c 0a  2Mask    : 0) |.
43e0: 09 20 20 20 20 20 20 20 20 28 6d 6f 64 69 66 69  .        (modifi
43f0: 65 72 73 20 26 20 4e 53 4e 75 6d 65 72 69 63 50  ers & NSNumericP
4400: 61 64 4b 65 79 4d 61 73 6b 20 3f 20 4d 6f 64 33  adKeyMask ? Mod3
4410: 4d 61 73 6b 20 20 20 20 3a 20 30 29 20 7c 0a 09  Mask    : 0) |..
4420: 20 20 20 20 20 20 20 20 28 6d 6f 64 69 66 69 65          (modifie
4430: 72 73 20 26 20 4e 53 46 75 6e 63 74 69 6f 6e 4b  rs & NSFunctionK
4440: 65 79 4d 61 73 6b 20 20 20 3f 20 4d 6f 64 34 4d  eyMask   ? Mod4M
4450: 61 73 6b 20 20 20 20 3a 20 30 29 20 3b 0a 20 20  ask    : 0) ;.  
4460: 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 78    }.    memset(x
4470: 45 76 65 6e 74 2c 20 30 2c 20 73 69 7a 65 6f 66  Event, 0, sizeof
4480: 28 58 45 76 65 6e 74 29 29 3b 0a 20 20 20 20 78  (XEvent));.    x
4490: 45 76 65 6e 74 2d 3e 78 61 6e 79 2e 73 65 72 69  Event->xany.seri
44a0: 61 6c 20 3d 20 4c 61 73 74 4b 6e 6f 77 6e 52 65  al = LastKnownRe
44b0: 71 75 65 73 74 50 72 6f 63 65 73 73 65 64 28 64  questProcessed(d
44c0: 69 73 70 6c 61 79 29 3b 0a 20 20 20 20 78 45 76  isplay);.    xEv
44d0: 65 6e 74 2d 3e 78 61 6e 79 2e 64 69 73 70 6c 61  ent->xany.displa
44e0: 79 20 3d 20 54 6b 5f 44 69 73 70 6c 61 79 28 74  y = Tk_Display(t
44f0: 6b 77 69 6e 29 3b 0a 20 20 20 20 78 45 76 65 6e  kwin);.    xEven
4500: 74 2d 3e 78 61 6e 79 2e 77 69 6e 64 6f 77 20 3d  t->xany.window =
4510: 20 54 6b 5f 57 69 6e 64 6f 77 49 64 28 74 6b 77   Tk_WindowId(tkw
4520: 69 6e 29 3b 0a 0a 20 20 20 20 78 45 76 65 6e 74  in);..    xEvent
4530: 2d 3e 78 6b 65 79 2e 72 6f 6f 74 20 3d 20 58 52  ->xkey.root = XR
4540: 6f 6f 74 57 69 6e 64 6f 77 28 64 69 73 70 6c 61  ootWindow(displa
4550: 79 2c 20 30 29 3b 0a 20 20 20 20 78 45 76 65 6e  y, 0);.    xEven
4560: 74 2d 3e 78 6b 65 79 2e 74 69 6d 65 20 3d 20 54  t->xkey.time = T
4570: 6b 70 47 65 74 4d 53 28 29 3b 0a 20 20 20 20 78  kpGetMS();.    x
4580: 45 76 65 6e 74 2d 3e 78 6b 65 79 2e 73 74 61 74  Event->xkey.stat
4590: 65 20 3d 20 73 74 61 74 65 3b 0a 20 20 20 20 78  e = state;.    x
45a0: 45 76 65 6e 74 2d 3e 78 6b 65 79 2e 73 61 6d 65  Event->xkey.same
45b0: 5f 73 63 72 65 65 6e 20 3d 20 74 72 75 65 3b 0a  _screen = true;.
45c0: 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74      /* No need t
45d0: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 6f 74 68  o initialize oth
45e0: 65 72 20 66 69 65 6c 64 73 20 69 6d 70 6c 69 63  er fields implic
45f0: 69 74 6c 79 20 68 65 72 65 2c 0a 20 20 20 20 20  itly here,.     
4600: 2a 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  * because of the
4610: 20 6d 65 6d 73 65 74 28 29 20 61 62 6f 76 65 2e   memset() above.
4620: 20 2a 2f 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f   */.}..static vo
4630: 69 64 0a 73 65 74 58 45 76 65 6e 74 50 6f 69 6e  id.setXEventPoin
4640: 74 28 0a 20 20 20 20 58 45 76 65 6e 74 20 2a 78  t(.    XEvent *x
4650: 45 76 65 6e 74 2c 0a 20 20 20 20 54 6b 5f 57 69  Event,.    Tk_Wi
4660: 6e 64 6f 77 20 74 6b 77 69 6e 2c 0a 20 20 20 20  ndow tkwin,.    
4670: 4e 53 57 69 6e 64 6f 77 20 2a 77 29 0a 7b 0a 20  NSWindow *w).{. 
4680: 20 20 20 54 6b 57 69 6e 64 6f 77 20 2a 77 69 6e     TkWindow *win
4690: 50 74 72 20 3d 20 28 54 6b 57 69 6e 64 6f 77 20  Ptr = (TkWindow 
46a0: 2a 29 20 74 6b 77 69 6e 3b 0a 20 20 20 20 4e 53  *) tkwin;.    NS
46b0: 50 6f 69 6e 74 20 6c 6f 63 61 6c 20 3d 20 5b 77  Point local = [w
46c0: 20 20 6d 6f 75 73 65 4c 6f 63 61 74 69 6f 6e 4f    mouseLocationO
46d0: 75 74 73 69 64 65 4f 66 45 76 65 6e 74 53 74 72  utsideOfEventStr
46e0: 65 61 6d 5d 3b 0a 20 20 20 20 4e 53 50 6f 69 6e  eam];.    NSPoin
46f0: 74 20 67 6c 6f 62 61 6c 20 3d 20 5b 77 20 74 6b  t global = [w tk
4700: 43 6f 6e 76 65 72 74 50 6f 69 6e 74 54 6f 53 63  ConvertPointToSc
4710: 72 65 65 6e 3a 20 6c 6f 63 61 6c 5d 3b 0a 20 20  reen: local];.  
4720: 20 20 69 6e 74 20 77 69 6e 5f 78 2c 20 77 69 6e    int win_x, win
4730: 5f 79 3b 0a 0a 20 20 20 20 69 66 20 28 54 6b 5f  _y;..    if (Tk_
4740: 49 73 45 6d 62 65 64 64 65 64 28 77 69 6e 50 74  IsEmbedded(winPt
4750: 72 29 29 20 7b 0a 09 54 6b 57 69 6e 64 6f 77 20  r)) {..TkWindow 
4760: 2a 63 6f 6e 74 50 74 72 20 3d 20 54 6b 70 47 65  *contPtr = TkpGe
4770: 74 4f 74 68 65 72 57 69 6e 64 6f 77 28 77 69 6e  tOtherWindow(win
4780: 50 74 72 29 3b 0a 09 69 66 20 28 54 6b 5f 49 73  Ptr);..if (Tk_Is
4790: 54 6f 70 4c 65 76 65 6c 28 63 6f 6e 74 50 74 72  TopLevel(contPtr
47a0: 29 29 20 7b 0a 09 20 20 20 20 6c 6f 63 61 6c 2e  )) {..    local.
47b0: 78 20 2d 3d 20 63 6f 6e 74 50 74 72 2d 3e 77 6d  x -= contPtr->wm
47c0: 49 6e 66 6f 50 74 72 2d 3e 78 49 6e 50 61 72 65  InfoPtr->xInPare
47d0: 6e 74 3b 0a 09 20 20 20 20 6c 6f 63 61 6c 2e 79  nt;..    local.y
47e0: 20 2d 3d 20 63 6f 6e 74 50 74 72 2d 3e 77 6d 49   -= contPtr->wmI
47f0: 6e 66 6f 50 74 72 2d 3e 79 49 6e 50 61 72 65 6e  nfoPtr->yInParen
4800: 74 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  t;..} else {..  
4810: 20 20 54 6b 57 69 6e 64 6f 77 20 2a 74 6f 70 50    TkWindow *topP
4820: 74 72 20 3d 20 54 6b 4d 61 63 4f 53 58 47 65 74  tr = TkMacOSXGet
4830: 48 6f 73 74 54 6f 70 6c 65 76 65 6c 28 77 69 6e  HostToplevel(win
4840: 50 74 72 29 2d 3e 77 69 6e 50 74 72 3b 0a 09 20  Ptr)->winPtr;.. 
4850: 20 20 20 6c 6f 63 61 6c 2e 78 20 2d 3d 20 28 74     local.x -= (t
4860: 6f 70 50 74 72 2d 3e 77 6d 49 6e 66 6f 50 74 72  opPtr->wmInfoPtr
4870: 2d 3e 78 49 6e 50 61 72 65 6e 74 20 2b 20 63 6f  ->xInParent + co
4880: 6e 74 50 74 72 2d 3e 63 68 61 6e 67 65 73 2e 78  ntPtr->changes.x
4890: 29 3b 0a 09 20 20 20 20 6c 6f 63 61 6c 2e 79 20  );..    local.y 
48a0: 2d 3d 20 28 74 6f 70 50 74 72 2d 3e 77 6d 49 6e  -= (topPtr->wmIn
48b0: 66 6f 50 74 72 2d 3e 79 49 6e 50 61 72 65 6e 74  foPtr->yInParent
48c0: 20 2b 20 63 6f 6e 74 50 74 72 2d 3e 63 68 61 6e   + contPtr->chan
48d0: 67 65 73 2e 79 29 3b 0a 09 7d 0a 20 20 20 20 7d  ges.y);..}.    }
48e0: 20 65 6c 73 65 20 69 66 20 28 77 69 6e 50 74 72   else if (winPtr
48f0: 2d 3e 77 6d 49 6e 66 6f 50 74 72 20 21 3d 20 4e  ->wmInfoPtr != N
4900: 55 4c 4c 29 20 7b 0a 09 6c 6f 63 61 6c 2e 78 20  ULL) {..local.x 
4910: 2d 3d 20 77 69 6e 50 74 72 2d 3e 77 6d 49 6e 66  -= winPtr->wmInf
4920: 6f 50 74 72 2d 3e 78 49 6e 50 61 72 65 6e 74 3b  oPtr->xInParent;
4930: 0a 09 6c 6f 63 61 6c 2e 79 20 2d 3d 20 77 69 6e  ..local.y -= win
4940: 50 74 72 2d 3e 77 6d 49 6e 66 6f 50 74 72 2d 3e  Ptr->wmInfoPtr->
4950: 79 49 6e 50 61 72 65 6e 74 3b 0a 20 20 20 20 7d  yInParent;.    }
4960: 0a 20 20 20 20 74 6b 77 69 6e 20 3d 20 54 6b 5f  .    tkwin = Tk_
4970: 54 6f 70 43 6f 6f 72 64 73 54 6f 57 69 6e 64 6f  TopCoordsToWindo
4980: 77 28 74 6b 77 69 6e 2c 20 6c 6f 63 61 6c 2e 78  w(tkwin, local.x
4990: 2c 20 6c 6f 63 61 6c 2e 79 2c 20 26 77 69 6e 5f  , local.y, &win_
49a0: 78 2c 20 26 77 69 6e 5f 79 29 3b 0a 20 20 20 20  x, &win_y);.    
49b0: 6c 6f 63 61 6c 2e 78 20 3d 20 77 69 6e 5f 78 3b  local.x = win_x;
49c0: 0a 20 20 20 20 6c 6f 63 61 6c 2e 79 20 3d 20 77  .    local.y = w
49d0: 69 6e 5f 79 3b 0a 20 20 20 20 67 6c 6f 62 61 6c  in_y;.    global
49e0: 2e 79 20 3d 20 54 6b 4d 61 63 4f 53 58 5a 65 72  .y = TkMacOSXZer
49f0: 6f 53 63 72 65 65 6e 48 65 69 67 68 74 28 29 20  oScreenHeight() 
4a00: 2d 20 67 6c 6f 62 61 6c 2e 79 3b 0a 20 20 20 20  - global.y;.    
4a10: 78 45 76 65 6e 74 2d 3e 78 62 75 74 74 6f 6e 2e  xEvent->xbutton.
4a20: 78 20 3d 20 6c 6f 63 61 6c 2e 78 3b 0a 20 20 20  x = local.x;.   
4a30: 20 78 45 76 65 6e 74 2d 3e 78 62 75 74 74 6f 6e   xEvent->xbutton
4a40: 2e 79 20 3d 20 6c 6f 63 61 6c 2e 79 3b 0a 20 20  .y = local.y;.  
4a50: 20 20 78 45 76 65 6e 74 2d 3e 78 62 75 74 74 6f    xEvent->xbutto
4a60: 6e 2e 78 5f 72 6f 6f 74 20 3d 20 67 6c 6f 62 61  n.x_root = globa
4a70: 6c 2e 78 3b 0a 20 20 20 20 78 45 76 65 6e 74 2d  l.x;.    xEvent-
4a80: 3e 78 62 75 74 74 6f 6e 2e 79 5f 72 6f 6f 74 20  >xbutton.y_root 
4a90: 3d 20 67 6c 6f 62 61 6c 2e 79 3b 0a 7d 0a 0a 23  = global.y;.}..#
4aa0: 70 72 61 67 6d 61 20 6d 61 72 6b 20 2d 0a 0c 0a  pragma mark -...
4ab0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
4ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
4b00: 2a 20 58 47 72 61 62 4b 65 79 62 6f 61 72 64 20  * XGrabKeyboard 
4b10: 2d 2d 0a 20 2a 0a 20 2a 09 53 69 6d 75 6c 61 74  --. *. *.Simulat
4b20: 65 73 20 61 20 6b 65 79 62 6f 61 72 64 20 67 72  es a keyboard gr
4b30: 61 62 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  ab by setting th
4b40: 65 20 66 6f 63 75 73 2e 0a 20 2a 0a 20 2a 20 52  e focus.. *. * R
4b50: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 6c 77 61 79  esults:. *.Alway
4b60: 73 20 72 65 74 75 72 6e 73 20 47 72 61 62 53 75  s returns GrabSu
4b70: 63 63 65 73 73 2e 0a 20 2a 0a 20 2a 20 53 69 64  ccess.. *. * Sid
4b80: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65  e effects:. *.Se
4b90: 74 73 20 74 68 65 20 6b 65 79 62 6f 61 72 64 20  ts the keyboard 
4ba0: 66 6f 63 75 73 20 74 6f 20 74 68 65 20 73 70 65  focus to the spe
4bb0: 63 69 66 69 65 64 20 77 69 6e 64 6f 77 2e 0a 20  cified window.. 
4bc0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
4bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
4c10: 69 6e 74 0a 58 47 72 61 62 4b 65 79 62 6f 61 72  int.XGrabKeyboar
4c20: 64 28 0a 20 20 20 20 44 69 73 70 6c 61 79 2a 20  d(.    Display* 
4c30: 64 69 73 70 6c 61 79 2c 0a 20 20 20 20 57 69 6e  display,.    Win
4c40: 64 6f 77 20 67 72 61 62 5f 77 69 6e 64 6f 77 2c  dow grab_window,
4c50: 0a 20 20 20 20 42 6f 6f 6c 20 6f 77 6e 65 72 5f  .    Bool owner_
4c60: 65 76 65 6e 74 73 2c 0a 20 20 20 20 69 6e 74 20  events,.    int 
4c70: 70 6f 69 6e 74 65 72 5f 6d 6f 64 65 2c 0a 20 20  pointer_mode,.  
4c80: 20 20 69 6e 74 20 6b 65 79 62 6f 61 72 64 5f 6d    int keyboard_m
4c90: 6f 64 65 2c 0a 20 20 20 20 54 69 6d 65 20 74 69  ode,.    Time ti
4ca0: 6d 65 29 0a 7b 0a 20 20 20 20 6b 65 79 62 6f 61  me).{.    keyboa
4cb0: 72 64 47 72 61 62 57 69 6e 50 74 72 20 3d 20 54  rdGrabWinPtr = T
4cc0: 6b 5f 49 64 54 6f 57 69 6e 64 6f 77 28 64 69 73  k_IdToWindow(dis
4cd0: 70 6c 61 79 2c 20 67 72 61 62 5f 77 69 6e 64 6f  play, grab_windo
4ce0: 77 29 3b 0a 20 20 20 20 54 6b 57 69 6e 64 6f 77  w);.    TkWindow
4cf0: 20 2a 63 61 70 74 75 72 65 57 69 6e 50 74 72 20   *captureWinPtr 
4d00: 3d 20 28 54 6b 57 69 6e 64 6f 77 20 2a 29 20 54  = (TkWindow *) T
4d10: 6b 70 47 65 74 43 61 70 74 75 72 65 28 29 3b 0a  kpGetCapture();.
4d20: 0a 20 20 20 20 69 66 20 28 6b 65 79 62 6f 61 72  .    if (keyboar
4d30: 64 47 72 61 62 57 69 6e 50 74 72 20 26 26 20 63  dGrabWinPtr && c
4d40: 61 70 74 75 72 65 57 69 6e 50 74 72 29 20 7b 0a  aptureWinPtr) {.
4d50: 09 4e 53 57 69 6e 64 6f 77 20 2a 77 20 3d 20 54  .NSWindow *w = T
4d60: 6b 4d 61 63 4f 53 58 47 65 74 4e 53 57 69 6e 64  kMacOSXGetNSWind
4d70: 6f 77 46 6f 72 44 72 61 77 61 62 6c 65 28 67 72  owForDrawable(gr
4d80: 61 62 5f 77 69 6e 64 6f 77 29 3b 0a 09 4d 61 63  ab_window);..Mac
4d90: 44 72 61 77 61 62 6c 65 20 2a 6d 61 63 57 69 6e  Drawable *macWin
4da0: 20 3d 20 28 4d 61 63 44 72 61 77 61 62 6c 65 20   = (MacDrawable 
4db0: 2a 29 67 72 61 62 5f 77 69 6e 64 6f 77 3b 0a 0a  *)grab_window;..
4dc0: 09 69 66 20 28 77 20 26 26 20 6d 61 63 57 69 6e  .if (w && macWin
4dd0: 2d 3e 74 6f 70 6c 65 76 65 6c 2d 3e 77 69 6e 50  ->toplevel->winP
4de0: 74 72 20 3d 3d 20 28 54 6b 57 69 6e 64 6f 77 20  tr == (TkWindow 
4df0: 2a 29 20 63 61 70 74 75 72 65 57 69 6e 50 74 72  *) captureWinPtr
4e00: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 6d 6f 64  ) {..    if (mod
4e10: 61 6c 53 65 73 73 69 6f 6e 20 29 20 7b 0a 09 09  alSession ) {...
4e20: 69 66 20 28 6b 65 79 62 6f 61 72 64 47 72 61 62  if (keyboardGrab
4e30: 4e 53 57 69 6e 64 6f 77 20 3d 3d 20 77 29 20 7b  NSWindow == w) {
4e40: 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 47 72  ...    return Gr
4e50: 61 62 53 75 63 63 65 73 73 3b 0a 09 09 7d 20 65  abSuccess;...} e
4e60: 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f  lse {...    Tcl_
4e70: 50 61 6e 69 63 28 22 58 47 72 61 62 4b 65 79 62  Panic("XGrabKeyb
4e80: 6f 61 72 64 3a 20 61 6c 72 65 61 64 79 20 67 72  oard: already gr
4e90: 61 62 62 65 64 22 29 3b 0a 09 09 7d 0a 09 20 20  abbed");...}..  
4ea0: 20 20 7d 0a 09 20 20 20 20 6b 65 79 62 6f 61 72    }..    keyboar
4eb0: 64 47 72 61 62 4e 53 57 69 6e 64 6f 77 20 3d 20  dGrabNSWindow = 
4ec0: 77 3b 0a 09 20 20 20 20 5b 77 20 72 65 74 61 69  w;..    [w retai
4ed0: 6e 5d 3b 0a 09 20 20 20 20 6d 6f 64 61 6c 53 65  n];..    modalSe
4ee0: 73 73 69 6f 6e 20 3d 20 5b 4e 53 41 70 70 20 62  ssion = [NSApp b
4ef0: 65 67 69 6e 4d 6f 64 61 6c 53 65 73 73 69 6f 6e  eginModalSession
4f00: 46 6f 72 57 69 6e 64 6f 77 3a 77 5d 3b 0a 09 7d  ForWindow:w];..}
4f10: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
4f20: 6e 20 47 72 61 62 53 75 63 63 65 73 73 3b 0a 7d  n GrabSuccess;.}
4f30: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
4f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
4f80: 2a 0a 20 2a 20 58 55 6e 67 72 61 62 4b 65 79 62  *. * XUngrabKeyb
4f90: 6f 61 72 64 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65  oard --. *. *.Re
4fa0: 6c 65 61 73 65 73 20 74 68 65 20 73 69 6d 75 6c  leases the simul
4fb0: 61 74 65 64 20 6b 65 79 62 6f 61 72 64 20 67 72  ated keyboard gr
4fc0: 61 62 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ab.. *. * Result
4fd0: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
4fe0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
4ff0: 20 2a 09 53 65 74 73 20 74 68 65 20 6b 65 79 62   *.Sets the keyb
5000: 6f 61 72 64 20 66 6f 63 75 73 20 62 61 63 6b 20  oard focus back 
5010: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65 66  to the value bef
5020: 6f 72 65 20 74 68 65 20 67 72 61 62 2e 0a 20 2a  ore the grab.. *
5030: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
5040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69  ---------. */..i
5080: 6e 74 0a 58 55 6e 67 72 61 62 4b 65 79 62 6f 61  nt.XUngrabKeyboa
5090: 72 64 28 0a 20 20 20 20 44 69 73 70 6c 61 79 2a  rd(.    Display*
50a0: 20 64 69 73 70 6c 61 79 2c 0a 20 20 20 20 54 69   display,.    Ti
50b0: 6d 65 20 74 69 6d 65 29 0a 7b 0a 20 20 20 20 69  me time).{.    i
50c0: 66 20 28 6d 6f 64 61 6c 53 65 73 73 69 6f 6e 29  f (modalSession)
50d0: 20 7b 0a 09 5b 4e 53 41 70 70 20 65 6e 64 4d 6f   {..[NSApp endMo
50e0: 64 61 6c 53 65 73 73 69 6f 6e 3a 6d 6f 64 61 6c  dalSession:modal
50f0: 53 65 73 73 69 6f 6e 5d 3b 0a 09 6d 6f 64 61 6c  Session];..modal
5100: 53 65 73 73 69 6f 6e 20 3d 20 6e 69 6c 3b 0a 20  Session = nil;. 
5110: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6b 65 79     }.    if (key
5120: 62 6f 61 72 64 47 72 61 62 4e 53 57 69 6e 64 6f  boardGrabNSWindo
5130: 77 29 20 7b 0a 09 5b 6b 65 79 62 6f 61 72 64 47  w) {..[keyboardG
5140: 72 61 62 4e 53 57 69 6e 64 6f 77 20 72 65 6c 65  rabNSWindow rele
5150: 61 73 65 5d 3b 0a 09 6b 65 79 62 6f 61 72 64 47  ase];..keyboardG
5160: 72 61 62 4e 53 57 69 6e 64 6f 77 20 3d 20 6e 69  rabNSWindow = ni
5170: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6b 65 79  l;.    }.    key
5180: 62 6f 61 72 64 47 72 61 62 57 69 6e 50 74 72 20  boardGrabWinPtr 
5190: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75  = NULL;.    retu
51a0: 72 6e 20 53 75 63 63 65 73 73 3b 0a 7d 0a 0c 0a  rn Success;.}...
51b0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
51c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
5200: 2a 20 54 6b 4d 61 63 4f 53 58 47 65 74 4d 6f 64  * TkMacOSXGetMod
5210: 61 6c 53 65 73 73 69 6f 6e 20 2d 2d 0a 20 2a 0a  alSession --. *.
5220: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52   * Results:. *.R
5230: 65 74 75 72 6e 73 20 74 68 65 20 63 75 72 72 65  eturns the curre
5240: 6e 74 20 6d 6f 64 61 6c 20 73 65 73 73 69 6f 6e  nt modal session
5250: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
5260: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
5270: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
5280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 4d  ---------. */..M
52c0: 4f 44 55 4c 45 5f 53 43 4f 50 45 20 4e 53 4d 6f  ODULE_SCOPE NSMo
52d0: 64 61 6c 53 65 73 73 69 6f 6e 0a 54 6b 4d 61 63  dalSession.TkMac
52e0: 4f 53 58 47 65 74 4d 6f 64 61 6c 53 65 73 73 69  OSXGetModalSessi
52f0: 6f 6e 28 76 6f 69 64 29 0a 7b 0a 20 20 20 20 72  on(void).{.    r
5300: 65 74 75 72 6e 20 6d 6f 64 61 6c 53 65 73 73 69  eturn modalSessi
5310: 6f 6e 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  on;.}.../*. *---
5320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5360: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6b 5f 53 65 74  ---. *. * Tk_Set
5370: 43 61 72 65 74 50 6f 73 20 2d 2d 0a 20 2a 0a 20  CaretPos --. *. 
5380: 2a 09 54 68 69 73 20 65 6e 61 62 6c 65 73 20 63  *.This enables c
5390: 6f 72 72 65 63 74 20 70 6c 61 63 65 6d 65 6e 74  orrect placement
53a0: 20 6f 66 20 74 68 65 20 70 6f 70 75 70 73 20 75   of the popups u
53b0: 73 65 64 20 66 6f 72 20 63 68 61 72 61 63 74 65  sed for characte
53c0: 72 0a 20 2a 20 20 20 20 20 20 73 65 6c 65 63 74  r. *      select
53d0: 69 6f 6e 20 62 79 20 74 68 65 20 4e 53 54 65 78  ion by the NSTex
53e0: 74 49 6e 70 75 74 43 6c 69 65 6e 74 2e 20 20 49  tInputClient.  I
53f0: 74 20 67 65 74 73 20 63 61 6c 6c 65 64 20 62 79  t gets called by
5400: 20 74 65 78 74 20 65 6e 74 72 79 0a 20 2a 20 20   text entry. *  
5410: 20 20 20 20 77 69 64 67 65 74 73 20 77 68 65 6e      widgets when
5420: 65 76 65 72 20 74 68 65 20 63 75 72 73 6f 72 20  ever the cursor 
5430: 69 73 20 64 72 61 77 6e 2e 20 20 49 74 20 64 6f  is drawn.  It do
5440: 65 73 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 68  es nothing if th
5450: 65 20 77 69 64 67 65 74 27 73 0a 20 2a 20 20 20  e widget's. *   
5460: 20 20 20 4e 53 57 69 6e 64 6f 77 20 69 73 20 6e     NSWindow is n
5470: 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 4b  ot the current K
5480: 65 79 57 69 6e 64 6f 77 2e 20 20 4f 74 68 65 72  eyWindow.  Other
5490: 77 69 73 65 20 69 74 20 75 70 64 61 74 65 73 20  wise it updates 
54a0: 74 68 65 0a 20 2a 20 20 20 20 20 20 64 69 73 70  the. *      disp
54b0: 6c 61 79 27 73 20 63 61 72 65 74 20 73 74 72 75  lay's caret stru
54c0: 63 74 75 72 65 20 61 6e 64 20 72 65 63 6f 72 64  cture and record
54d0: 73 20 74 68 65 20 63 61 72 65 74 20 67 65 6f 6d  s the caret geom
54e0: 65 74 72 79 20 69 6e 20 73 74 61 74 69 63 0a 20  etry in static. 
54f0: 2a 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 73  *      variables
5500: 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
5510: 4e 53 54 65 78 74 49 6e 70 75 74 43 6c 69 65 6e  NSTextInputClien
5520: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
5530: 2e 20 20 41 6e 79 0a 20 2a 20 20 20 20 20 20 77  .  Any. *      w
5540: 69 64 67 65 74 20 70 61 73 73 65 64 20 74 6f 20  idget passed to 
5550: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
5560: 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ll be marked as 
5570: 62 65 69 6e 67 20 61 62 6c 65 20 74 6f 20 69 6e  being able to in
5580: 70 75 74 0a 20 2a 20 20 20 20 20 20 74 65 78 74  put. *      text
5590: 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
55a0: 54 4b 5f 43 41 4e 5f 49 4e 50 55 54 5f 54 45 58  TK_CAN_INPUT_TEX
55b0: 54 20 66 6c 61 67 2e 0a 20 2a 0a 20 2a 20 52 65  T flag.. *. * Re
55c0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
55d0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
55e0: 73 3a 0a 20 2a 20 20 20 20 20 20 53 65 74 73 20  s:. *      Sets 
55f0: 74 68 65 20 43 41 4e 5f 49 4e 50 55 54 5f 54 45  the CAN_INPUT_TE
5600: 58 54 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 77  XT flag on the w
5610: 69 64 67 65 74 20 70 61 73 73 65 64 20 61 73 20  idget passed as 
5620: 74 6b 77 69 6e 2e 20 20 4d 61 79 20 75 70 64 61  tkwin.  May upda
5630: 74 65 0a 20 2a 20 20 20 20 20 20 74 68 65 20 64  te. *      the d
5640: 69 73 70 6c 61 79 27 73 20 63 61 72 65 74 20 73  isplay's caret s
5650: 74 72 75 63 74 75 72 65 20 61 73 20 77 65 6c 6c  tructure as well
5660: 20 61 73 20 74 68 65 20 73 74 61 74 69 63 20 76   as the static v
5670: 61 72 69 61 62 6c 65 73 20 63 61 72 65 74 5f 78  ariables caret_x
5680: 2c 0a 20 2a 20 20 20 20 20 20 63 61 72 65 74 5f  ,. *      caret_
5690: 79 20 61 6e 64 20 63 61 72 65 74 5f 68 65 69 67  y and caret_heig
56a0: 68 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ht.. *. *-------
56b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
56f0: 20 2a 2f 0a 0a 76 6f 69 64 0a 54 6b 5f 53 65 74   */..void.Tk_Set
5700: 43 61 72 65 74 50 6f 73 28 0a 20 20 20 20 54 6b  CaretPos(.    Tk
5710: 5f 57 69 6e 64 6f 77 20 74 6b 77 69 6e 2c 0a 20  _Window tkwin,. 
5720: 20 20 20 69 6e 74 20 78 2c 0a 20 20 20 20 69 6e     int x,.    in
5730: 74 20 79 2c 0a 20 20 20 20 69 6e 74 20 68 65 69  t y,.    int hei
5740: 67 68 74 29 0a 20 7b 0a 20 20 20 20 54 6b 57 69  ght). {.    TkWi
5750: 6e 64 6f 77 20 2a 77 69 6e 50 74 72 20 3d 20 28  ndow *winPtr = (
5760: 54 6b 57 69 6e 64 6f 77 20 2a 29 20 74 6b 77 69  TkWindow *) tkwi
5770: 6e 3b 0a 20 20 20 20 54 6b 43 61 72 65 74 20 2a  n;.    TkCaret *
5780: 63 61 72 65 74 50 74 72 20 3d 20 26 28 77 69 6e  caretPtr = &(win
5790: 50 74 72 2d 3e 64 69 73 70 50 74 72 2d 3e 63 61  Ptr->dispPtr->ca
57a0: 72 65 74 29 3b 0a 20 20 20 20 4e 53 57 69 6e 64  ret);.    NSWind
57b0: 6f 77 20 2a 77 20 3d 20 54 6b 4d 61 63 4f 53 58  ow *w = TkMacOSX
57c0: 47 65 74 4e 53 57 69 6e 64 6f 77 46 6f 72 44 72  GetNSWindowForDr
57d0: 61 77 61 62 6c 65 28 54 6b 5f 57 69 6e 64 6f 77  awable(Tk_Window
57e0: 49 64 28 74 6b 77 69 6e 29 29 3b 0a 0a 20 20 20  Id(tkwin));..   
57f0: 20 2f 2a 0a 20 20 20 20 20 2a 20 52 65 67 69 73   /*.     * Regis
5800: 74 65 72 20 74 68 69 73 20 77 69 64 67 65 74 20  ter this widget 
5810: 61 73 20 62 65 69 6e 67 20 63 61 70 61 62 6c 65  as being capable
5820: 20 6f 66 20 74 65 78 74 20 69 6e 70 75 74 2c 20   of text input, 
5830: 73 6f 20 77 65 20 6b 6e 6f 77 20 77 65 0a 20 20  so we know we.  
5840: 20 20 20 2a 20 73 68 6f 75 6c 64 20 70 72 6f 63     * should proc
5850: 65 73 73 20 28 61 70 70 72 6f 70 72 69 61 74 65  ess (appropriate
5860: 29 20 6b 65 79 20 65 76 65 6e 74 73 20 66 6f 72  ) key events for
5870: 20 74 68 69 73 20 77 69 6e 64 6f 77 20 77 69 74   this window wit
5880: 68 20 74 68 65 0a 20 20 20 20 20 2a 20 4e 53 54  h the.     * NST
5890: 65 78 74 49 6e 70 75 74 43 6c 69 65 6e 74 20 70  extInputClient p
58a0: 72 6f 74 6f 63 6f 6c 2e 0a 20 20 20 20 20 2a 2f  rotocol..     */
58b0: 0a 0a 20 20 20 20 77 69 6e 50 74 72 2d 3e 66 6c  ..    winPtr->fl
58c0: 61 67 73 20 7c 3d 20 54 4b 5f 43 41 4e 5f 49 4e  ags |= TK_CAN_IN
58d0: 50 55 54 5f 54 45 58 54 3b 0a 20 20 20 20 69 66  PUT_TEXT;.    if
58e0: 20 28 77 20 26 26 20 21 5b 77 20 69 73 4b 65 79   (w && ![w isKey
58f0: 57 69 6e 64 6f 77 5d 29 20 7b 0a 09 72 65 74 75  Window]) {..retu
5900: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rn;.    }.    if
5910: 20 28 28 63 61 72 65 74 50 74 72 2d 3e 77 69 6e   ((caretPtr->win
5920: 50 74 72 20 3d 3d 20 77 69 6e 50 74 72 0a 09 20  Ptr == winPtr.. 
5930: 26 26 20 63 61 72 65 74 50 74 72 2d 3e 78 20 3d  && caretPtr->x =
5940: 3d 20 78 29 20 26 26 20 28 63 61 72 65 74 50 74  = x) && (caretPt
5950: 72 2d 3e 79 20 3d 3d 20 79 29 29 20 7b 0a 09 72  r->y == y)) {..r
5960: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20  eturn;.    }..  
5970: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 55 70 64 61    /*.     * Upda
5980: 74 65 20 74 68 65 20 64 69 73 70 6c 61 79 27 73  te the display's
5990: 20 63 61 72 65 74 20 69 6e 66 6f 72 6d 61 74 69   caret informati
59a0: 6f 6e 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  on..     */..   
59b0: 20 63 61 72 65 74 50 74 72 2d 3e 77 69 6e 50 74   caretPtr->winPt
59c0: 72 20 3d 20 77 69 6e 50 74 72 3b 0a 20 20 20 20  r = winPtr;.    
59d0: 63 61 72 65 74 50 74 72 2d 3e 78 20 3d 20 78 3b  caretPtr->x = x;
59e0: 0a 20 20 20 20 63 61 72 65 74 50 74 72 2d 3e 79  .    caretPtr->y
59f0: 20 3d 20 79 3b 0a 20 20 20 20 63 61 72 65 74 50   = y;.    caretP
5a00: 74 72 2d 3e 68 65 69 67 68 74 20 3d 20 68 65 69  tr->height = hei
5a10: 67 68 74 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ght;..    /*.   
5a20: 20 20 2a 20 52 65 63 6f 72 64 20 74 68 65 20 63    * Record the c
5a30: 61 72 65 74 20 67 65 6f 6d 65 74 72 79 20 69 6e  aret geometry in
5a40: 20 73 74 61 74 69 63 20 76 61 72 69 61 62 6c 65   static variable
5a50: 73 20 66 6f 72 20 75 73 65 20 77 68 65 6e 20 70  s for use when p
5a60: 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 2a  rocessing.     *
5a70: 20 6b 65 79 20 65 76 65 6e 74 73 2e 20 20 57 65   key events.  We
5a80: 20 75 73 65 20 74 68 65 20 54 4b 43 6f 6e 74 65   use the TKConte
5a90: 78 74 56 69 65 77 20 63 6f 6f 72 64 69 6e 61 74  xtView coordinat
5aa0: 65 20 73 79 73 74 65 6d 20 66 6f 72 20 74 68 69  e system for thi
5ab0: 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  s..     */..    
5ac0: 63 61 72 65 74 5f 68 65 69 67 68 74 20 3d 20 68  caret_height = h
5ad0: 65 69 67 68 74 3b 0a 20 20 20 20 77 68 69 6c 65  eight;.    while
5ae0: 20 28 21 54 6b 5f 49 73 54 6f 70 4c 65 76 65 6c   (!Tk_IsTopLevel
5af0: 28 74 6b 77 69 6e 29 29 20 7b 0a 09 78 20 2b 3d  (tkwin)) {..x +=
5b00: 20 54 6b 5f 58 28 74 6b 77 69 6e 29 3b 0a 09 79   Tk_X(tkwin);..y
5b10: 20 2b 3d 20 54 6b 5f 59 28 74 6b 77 69 6e 29 3b   += Tk_Y(tkwin);
5b20: 0a 09 74 6b 77 69 6e 20 3d 20 54 6b 5f 50 61 72  ..tkwin = Tk_Par
5b30: 65 6e 74 28 74 6b 77 69 6e 29 3b 0a 09 69 66 20  ent(tkwin);..if 
5b40: 28 74 6b 77 69 6e 20 3d 3d 20 4e 55 4c 4c 29 20  (tkwin == NULL) 
5b50: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 3b 0a 09  {..    return;..
5b60: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 72 65  }.    }.    care
5b70: 74 5f 78 20 3d 20 78 3b 0a 20 20 20 20 63 61 72  t_x = x;.    car
5b80: 65 74 5f 79 20 3d 20 54 6b 5f 48 65 69 67 68 74  et_y = Tk_Height
5b90: 28 74 6b 77 69 6e 29 20 2d 20 79 3b 0a 7d 0a 0c  (tkwin) - y;.}..
5ba0: 0a 2f 2a 0a 20 2a 20 4c 6f 63 61 6c 20 56 61 72  ./*. * Local Var
5bb0: 69 61 62 6c 65 73 3a 0a 20 2a 20 6d 6f 64 65 3a  iables:. * mode:
5bc0: 20 6f 62 6a 63 0a 20 2a 20 63 2d 62 61 73 69 63   objc. * c-basic
5bd0: 2d 6f 66 66 73 65 74 3a 20 34 0a 20 2a 20 66 69  -offset: 4. * fi
5be0: 6c 6c 2d 63 6f 6c 75 6d 6e 3a 20 37 39 0a 20 2a  ll-column: 79. *
5bf0: 20 63 6f 64 69 6e 67 3a 20 75 74 66 2d 38 0a 20   coding: utf-8. 
5c00: 2a 20 45 6e 64 3a 0a 20 2a 2f 0a                 * End:. */.