(defvar quote-event-cursor-shape 'question_arrow) (defun quote-event-that-works nil "Sends the next key or pointer button event directly to the appropriate application window, overriding any window manager bindings for it." (interactive) (let ((override-keymap (make-keymap)) (event-sender (lambda nil (let ((ev (decode-event (current-event)))) (when (eq 'key (car ev)) (allow-events 'replay-keyboard) (throw 'quote-event nil)) (when (and (eq 'mouse (car ev)) (not (eq 'move (caddr ev)))) (allow-events 'replay-pointer) (throw 'quote-event nil)))))) (unwind-protect (let* ((winid (window-id (input-focus))) (kbd-grab (grab-keyboard winid nil t)) (ptr-grab (grab-pointer winid quote-event-cursor-shape t nil))) (add-hook 'unbound-key-hook event-sender) (catch 'quote-event (when (or kbd-grab ptr-grab) (display-message (_ (cond ((not kbd-grab) "[Quote button]") ((not ptr-grab) "[Quote key]") (t "[Quote]")))) (allow-events 'sync-keyboard) (allow-events 'sync-pointer) (recursive-edit)) ; Tried to grab as much as we could but got nothing! (beep))) (remove-hook 'unbound-key-hook event-sender) (display-message nil) (ungrab-keyboard) (ungrab-pointer))))