(keyval (C-> GdkEvent "GdkEvent key keyval")))
(let ((string (c-peek-cstring alien))
(char-bits (gdk-key-state->char-bits state)))
- (if (zero? (string-length string))
- (cond ((fix:= length 1)
- (handler widget #\NUL char-bits))
- ((fix:= length 0)
- (handler widget (gdk-keyval->name keyval) char-bits))
- (else (error "Unexpected length in GdkEventKey.")))
- (let ((l (string-length string)))
- (let loop ((i 0))
- (if (fix:< i l)
- (and (handler widget (string-ref string i) char-bits)
- (loop (fix:1+ i)))
- #t)))))))))
+ (cond ((zero? (string-length string))
+ (cond ((fix:= length 1)
+ (handler widget #\NUL char-bits))
+ ((fix:= length 0)
+ (handler widget (gdk-keyval->name keyval) char-bits))
+ (else (error "Unexpected length in GdkEventKey."))))
+ ;; Kludge: BackSpace and C-h both have "key string" "\b"?!
+ ;; And Delete is already "\177" (aka (string #\rubout)).
+ ((and (fix:= 1 (string-length string))
+ (char=? #\backspace (string-ref string 0)))
+ (let ((name (gdk-keyval->name keyval)))
+ (cond ((string-ci=? (symbol-name name) "backspace")
+ (handler widget #\backspace char-bits))
+ ((memq name '(|h| |H|))
+ (handler widget #\C-h
+ (fix:- char-bits char-bit:control)))
+ (else (error "Unexpected backspace keyval:" keyval)))))
+ (else
+ (let ((l (string-length string)))
+ (let loop ((i 0))
+ (if (fix:< i l)
+ (and (handler widget (string-ref string i) char-bits)
+ (loop (fix:1+ i)))
+ #t))))))))))
(define (set-fix-widget-motion-handler! widget handler)
(guarantee-fix-widget widget 'set-fix-widget-motion-handler!)
(gdk-name (car gdk-name.keyval))
(string (symbol-name gdk-name))
(name (cond ((string-prefix? "GDK_KEY_" string)
- (intern (string-replace
- (string-tail string 8) #\_ #\-)))
+ (string->symbol (string-tail string 8)))
(else
(warn "Unexpected GdkKeysym name:" gdk-name)
gdk-name))))