anchor.diff:     (lambda (web-view hit-test-result modifiers)
        (declare (ignore web-view))
        (process-mouse-target-changed buffer hit-test-result modifiers)))
  +  ;; Mouse events are captured by the web view first, so we must intercept them here.
  +  (gobject:g-signal-connect
  +   (gtk-object buffer) "button-press-event"
  +   (lambda (web-view event) (declare (ignore web-view))
  +     (push-modifier *browser* event)
  +     (process-button-press-event buffer event)))
  +  ;; TODO: Capture button-release-event?
     ;; Modes might require that buffer exists, so we need to initialize them
     ;; after the view has been created.
     (initialize-modes buffer))
  
positive.code:       (push "S" modifiers))
      modifiers))
  
  (defmethod push-modifier ((browser gtk-browser) event)
    (let ((modifier-state (gdk:gdk-event-key-state event))
          (key-value (gdk:gdk-event-key-keyval event)))
      (when (member :control-mask modifier-state)
        (push "C" (modifiers browser)))
      (when (member :shift-mask modifier-state)
  
negative.code:       (when key-string
          (log:debug character-code key-string (modifiers *browser*))
          (push-input-event character-code key-string (modifiers *browser*) -1 -1 nil sender)))))
  
  (defmethod process-button-press-event ((sender gtk-buffer) event)
    (unless (duplicated-event? event)
      (let* ((button (gdk:gdk-event-button-button event))
             (x (gdk:gdk-event-button-x event))
             (y (gdk:gdk-event-button-y event))
             (key-string (format nil "button~s" button))
             (window (find sender
                           (alexandria:hash-table-values (windows *browser*))
                           :key #'active-buffer)))
        (when key-string
          (push-input-event 0 key-string (modifiers *browser*) x y nil window)))))
  
  (declaim (ftype (function (&optional buffer)) make-context))
  (defun make-context (&optional buffer)
  