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:
parent
90826f3533
commit
c12d52f21b
|
@ -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)))
|
||||||
|
|
||||||
;; ----------------------------------------
|
;; ----------------------------------------
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user