]> git.notmuchmail.org Git - notmuch/commitdiff
emacs: show: make buttons select window
authorMark Walters <markwalters1009@gmail.com>
Mon, 7 Jan 2013 21:07:20 +0000 (21:07 +0000)
committerDavid Bremner <bremner@debian.org>
Tue, 19 Feb 2013 00:13:19 +0000 (20:13 -0400)
Emacs has two button type objects: widgets (as used for saved searches
in notmuch-hello) and buttons as used by parts/citations and id links
in notmuch-show. These two behave subtly differently when clicked with
the mouse: widgets select the window clicked before running the
action, buttons do not.

This patch makes all of these behave the same: clicking always selects
the clicked window. It does this by defining a notmuch-button-type
supertype that the other notmuch buttons can inherit from. This
supertype binds the mouse-action to select the window and then
activate the button.

emacs/notmuch-crypto.el
emacs/notmuch-lib.el
emacs/notmuch-show.el
emacs/notmuch-wash.el

index 83e5d37aa4a939fbe366076f8d7b16c3b698685a..52338249a82867a4e0fea4fb7788264fc9b15bd4 100644 (file)
@@ -19,6 +19,8 @@
 ;;
 ;; Authors: Jameson Rollins <jrollins@finestructure.net>
 
 ;;
 ;; Authors: Jameson Rollins <jrollins@finestructure.net>
 
+(require 'notmuch-lib)
+
 (defcustom notmuch-crypto-process-mime nil
   "Should cryptographic MIME parts be processed?
 
 (defcustom notmuch-crypto-process-mime nil
   "Should cryptographic MIME parts be processed?
 
@@ -76,7 +78,8 @@ mode."
 (define-button-type 'notmuch-crypto-status-button-type
   'action (lambda (button) (message (button-get button 'help-echo)))
   'follow-link t
 (define-button-type 'notmuch-crypto-status-button-type
   'action (lambda (button) (message (button-get button 'help-echo)))
   'follow-link t
-  'help-echo "Set notmuch-crypto-process-mime to process cryptographic mime parts.")
+  'help-echo "Set notmuch-crypto-process-mime to process cryptographic mime parts."
+  :supertype 'notmuch-button-type)
 
 (defun notmuch-crypto-insert-sigstatus-button (sigstatus from)
   (let* ((status (plist-get sigstatus :status))
 
 (defun notmuch-crypto-insert-sigstatus-button (sigstatus from)
   (let* ((status (plist-get sigstatus :status))
index d78bcf8065aae699a162241e9e7e92b114a3267a..270e3dc6b343ec3a5d319b5cf91dd8ecc8603c17 100644 (file)
@@ -97,6 +97,21 @@ For example, if you wanted to remove an \"inbox\" tag and add an
   :group 'notmuch-search
   :group 'notmuch-show)
 
   :group 'notmuch-search
   :group 'notmuch-show)
 
+;; By default clicking on a button does not select the window
+;; containing the button (as opposed to clicking on a widget which
+;; does). This means that the button action is then executed in the
+;; current selected window which can cause problems if the button
+;; changes the buffer (e.g., id: links) or moves point.
+;;
+;; This provides a button type which overrides mouse-action so that
+;; the button's window is selected before the action is run. Other
+;; notmuch buttons can get the same behaviour by inheriting from this
+;; button type.
+(define-button-type 'notmuch-button-type
+  'mouse-action (lambda (button)
+                 (select-window (posn-window (event-start last-input-event)))
+                 (button-activate button)))
+
 (defun notmuch-version ()
   "Return a string with the notmuch version number."
   (let ((long-string
 (defun notmuch-version ()
   "Return a string with the notmuch version number."
   (let ((long-string
index 1864dd15a05bb8b24c2255806c9e383d9f5f6e31..acaef8ef2afd3871b071e468025fec44ab9f124c 100644 (file)
@@ -469,7 +469,8 @@ message at DEPTH in the current thread."
   'action 'notmuch-show-part-button-default
   'keymap 'notmuch-show-part-button-map
   'follow-link t
   'action 'notmuch-show-part-button-default
   'keymap 'notmuch-show-part-button-map
   'follow-link t
-  'face 'message-mml)
+  'face 'message-mml
+  :supertype 'notmuch-button-type)
 
 (defvar notmuch-show-part-button-map
   (let ((map (make-sparse-keymap)))
 
 (defvar notmuch-show-part-button-map
   (let ((map (make-sparse-keymap)))
@@ -1085,6 +1086,7 @@ buttons for a corresponding notmuch search."
        ;; Remove the overlay created by goto-address-mode
        (remove-overlays (first link) (second link) 'goto-address t)
        (make-text-button (first link) (second link)
        ;; Remove the overlay created by goto-address-mode
        (remove-overlays (first link) (second link) 'goto-address t)
        (make-text-button (first link) (second link)
+                         :type 'notmuch-button-type
                          'action `(lambda (arg)
                                     (notmuch-show ,(third link)))
                          'follow-link t
                          'action `(lambda (arg)
                                     (notmuch-show ,(third link)))
                          'follow-link t
index d6db4fa290970dd9bf851bd002f08f5e06fdc77d..826b6f43c77ba6853a32f65ad82b67af0a52271c 100644 (file)
@@ -115,7 +115,8 @@ lower).")
 (define-button-type 'notmuch-wash-button-invisibility-toggle-type
   'action 'notmuch-wash-toggle-invisible-action
   'follow-link t
 (define-button-type 'notmuch-wash-button-invisibility-toggle-type
   'action 'notmuch-wash-toggle-invisible-action
   'follow-link t
-  'face 'font-lock-comment-face)
+  'face 'font-lock-comment-face
+  :supertype 'notmuch-button-type)
 
 (define-button-type 'notmuch-wash-button-citation-toggle-type
   'help-echo "mouse-1, RET: Show citation"
 
 (define-button-type 'notmuch-wash-button-citation-toggle-type
   'help-echo "mouse-1, RET: Show citation"