anchor.diff:           (keycode (gir:field event "hardware_keycode"))
            (keyval (gir:field event "keyval"))
            (keyval-name (gir:invoke ((gir-gdk *browser*) 'keyval-name) keyval))
  -         ;; character is sometimes an integer...?
  -         (character (gir:invoke ((gir-gdk *browser*) 'keyval-to-unicode) keyval))
  +         (character (code-char (gir:invoke ((gir-gdk *browser*) 'keyval-to-unicode) keyval)))
            (printable-value (printable-p sender event))
  -         ;; (key-string (or printable-value
  -         ;;                 (derive-key-string keyval-name character)))
  -         ;; (modifiers (funcall (modifier-translator *browser*)
  -         ;;                     (key-event-modifiers event)
  -         ;;                     event))
  -         )
  -    (print character)
  -
  -    ;; (if modifiers
  -    ;;     (log:debug key-string keycode character keyval-name modifiers)
  -    ;;     (log:debug key-string keycode character keyval-name))
  -    ;; (if key-string
  -    ;;     (progn
  -    ;;       (alex:appendf (key-stack sender)
  -    ;;                     (list (keymap:make-key :code keycode
  -    ;;                                            :value key-string
  -    ;;                                            :modifiers modifiers
  -    ;;                                            :status :pressed)))
  -    ;;       (funcall (input-dispatcher sender) event (active-buffer sender) sender printable-value))
  -    ;;     ;; Do not forward modifier-only to renderer.
  -    ;;     t)
  -    ))
  +         (key-string (or printable-value
  +                         (derive-key-string keyval-name character)))
  +         (modifiers (funcall (modifier-translator *browser*)
  +                             (gir:field event "state")
  +                             event)))
  +    (if modifiers
  +        (log:debug key-string keycode character keyval-name modifiers)
  +        (log:debug key-string keycode character keyval-name))
  +    (if key-string
  +        (progn
  +          (alex:appendf (key-stack sender)
  +                        (list (keymap:make-key :code keycode
  +                                               :value key-string
  +                                               :modifiers modifiers
  +                                               :status :pressed)))
  +          (funcall (input-dispatcher sender) event (active-buffer sender) sender printable-value))
  +        t)))
   
   (define-ffi-method on-signal-key-release-event ((sender gobject-gtk-window) event)
     "Don't handle key release events."
  
positive.code: 
  (define-class gobject-gtk-browser ()
    ((modifier-translator
      #'translate-modifiers
      :documentation "Function that returns a list of modifiers
  understood by `keymap:make-key'.")
     (gir-gtk (gir:ffi "Gtk"))
  
negative.code:   "Return list of modifiers fit for `keymap:make-key'.
  See `gobject-gtk-browser's `modifier-translator' slot."
    (declare (ignore event))
    (let ((modifiers (list)))
      (dolist (mdef '((#b1    :shift)
                      (#b100  :ctrl)
                      (#b1000 :alt)))
        (destructuring-bind (int modifier)
            mdef
          (unless (zerop (logand int modifier-state))
            (push modifier modifiers))))
      modifiers))
  
  ;; (defun key-event-modifiers (key-event)
  ;;   (gdk:gdk-event-key-state key-event))
  