cocoa: fix problems with some input methods (such as Kotoeri)

but the problem remains that the input state is invisible while
 characters are being composed
This commit is contained in:
Matthew Flatt 2011-01-17 20:26:46 -07:00
parent 90826f3533
commit c12d52f21b

View File

@ -164,6 +164,7 @@
(unless (do-key-event wxb event self #f #f) (unless (do-key-event wxb event self #f #f)
(super-tell #:type _void keyUp: event))] (super-tell #:type _void keyUp: event))]
[-a _void (insertText: [_NSStringOrAttributed str]) [-a _void (insertText: [_NSStringOrAttributed str])
(set-saved-marked! wxb #f #f)
(let ([cit (current-insert-text)]) (let ([cit (current-insert-text)])
(if cit (if cit
(set-box! cit str) (set-box! cit str)
@ -178,17 +179,22 @@
[-a _id (validAttributesForMarkedText) [-a _id (validAttributesForMarkedText)
(tell NSArray array)] (tell NSArray array)]
[-a _void (unmarkText) [-a _void (unmarkText)
(set-saved-marked! wxb #f)] (set-saved-marked! wxb #f #f)]
[-a _NSRange (markedRange) [-a _NSRange (markedRange)
(let ([saved-marked (get-saved-marked wxb)]) (let ([saved-marked (get-saved-marked wxb)])
(make-NSRange 0 (if saved-marked 0 (length saved-marked))))] (make-NSRange 0 (if saved-marked (string-length saved-marked) 0)))]
[-a _NSRange (selectedRange) (make-NSRange 0 0)] [-a _NSRange (selectedRange)
(or (let ([s (get-saved-selected wxb)])
(and s
(make-NSRange (car s) (cdr s))))
(make-NSRange 0 0))]
[-a _void (setMarkedText: [_NSStringOrAttributed aString] selectedRange: [_NSRange selRange]) [-a _void (setMarkedText: [_NSStringOrAttributed aString] selectedRange: [_NSRange selRange])
;; We interpreter a call to `setMarkedText:' as meaning that the ;; We interpreter a call to `setMarkedText:' as meaning that the
;; key is a dead key for composing some other character. ;; key is a dead key for composing some other character.
(let ([m (current-set-mark)]) (when m (set-box! m #t))) (let ([m (current-set-mark)]) (when m (set-box! m #t)))
;; At the same time, we need to remember the text: ;; At the same time, we need to remember the text:
(set-saved-marked! wxb (range-substring aString selRange)) (set-saved-marked! wxb aString (cons (NSRange-location selRange)
(NSRange-length selRange)))
(void)] (void)]
[-a _id (validAttributesForMarkedText) #f] [-a _id (validAttributesForMarkedText) #f]
[-a _id (attributedSubstringFromRange: [_NSRange theRange]) [-a _id (attributedSubstringFromRange: [_NSRange theRange])
@ -234,17 +240,22 @@
(lambda () (lambda ()
(send wx do-on-drop-file s))))))))))) (send wx do-on-drop-file s)))))))))))
#t]) #t])
(define (set-saved-marked! wxb str) (define (set-saved-marked! wxb str sel)
(let ([wx (->wx wxb)]) (let ([wx (->wx wxb)])
(when wx (when wx
(send wx set-saved-marked str)))) (send wx set-saved-marked str sel))))
(define (get-saved-marked wxb) (define (get-saved-marked wxb)
(let ([wx (->wx wxb)]) (let ([wx (->wx wxb)])
(and wx (and wx
(send wx get-saved-marked)))) (send wx get-saved-marked))))
(define (get-saved-selected wxb)
(let ([wx (->wx wxb)])
(and wx
(send wx get-saved-selected))))
(define (range-substring s range) (define (range-substring s range)
(let ([start (min (max 0 (NSRange-location range)) (string-length s))]) (let ([start (min (max 0 (NSRange-location range)) (string-length s))])
(substring s start (max (min start (NSRange-length range)) (string-length s))))) (substring s start (max (+ start (NSRange-length range))
(string-length s)))))
(define-objc-mixin (KeyMouseTextResponder Superclass) (define-objc-mixin (KeyMouseTextResponder Superclass)
@ -264,8 +275,9 @@
(and (and
wx wx
(let ([inserted-text (box #f)] (let ([inserted-text (box #f)]
[set-mark (box #f)]) [set-mark (box #f)]
(unless wheel? [had-saved-text? (and (send wx get-saved-marked) #t)])
(when down?
;; Calling `interpretKeyEvents:' allows key combinations to be ;; Calling `interpretKeyEvents:' allows key combinations to be
;; handled, such as option-e followed by e to produce é. The ;; handled, such as option-e followed by e to produce é. The
;; call to `interpretKeyEvents:' typically calls `insertText:', ;; call to `interpretKeyEvents:' typically calls `insertText:',
@ -289,6 +301,7 @@
[(unbox inserted-text)] [(unbox inserted-text)]
[else [else
(tell #:type _NSString event characters)])] (tell #:type _NSString event characters)])]
[dead-key? (unbox set-mark)]
[control? (bit? modifiers NSControlKeyMask)] [control? (bit? modifiers NSControlKeyMask)]
[option? (bit? modifiers NSAlternateKeyMask)] [option? (bit? modifiers NSAlternateKeyMask)]
[delta-y (and wheel? [delta-y (and wheel?
@ -297,6 +310,7 @@
[wheel? (if (positive? delta-y) [wheel? (if (positive? delta-y)
'(wheel-up) '(wheel-up)
'(wheel-down))] '(wheel-down))]
[had-saved-text? str]
[(map-key-code (tell #:type _ushort event keyCode)) [(map-key-code (tell #:type _ushort event keyCode))
=> list] => list]
[(string=? "" str) '(#\nul)] [(string=? "" str) '(#\nul)]
@ -310,7 +324,7 @@
(string-ref alt-str 0))))))) (string-ref alt-str 0)))))))
=> list] => list]
[else str])]) [else str])])
(for/fold ([result #f]) ([one-code codes]) (for/fold ([result dead-key?]) ([one-code codes])
(or (or
;; Handle one key event ;; Handle one key event
(let-values ([(x y) (send wx window-point-to-view pos)]) (let-values ([(x y) (send wx window-point-to-view pos)])
@ -794,8 +808,10 @@
;; For multi-key character composition: ;; For multi-key character composition:
(define saved-marked #f) (define saved-marked #f)
(define/public (set-saved-marked v) (set! saved-marked v)) (define saved-sel #f)
(define/public (get-saved-marked) saved-marked))) (define/public (set-saved-marked v sel) (set! saved-marked v) (set! saved-sel sel))
(define/public (get-saved-marked) saved-marked)
(define/public (get-saved-selected) saved-sel)))
;; ---------------------------------------- ;; ----------------------------------------