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:. */.