From b0c4ae71dccf1969bd95f05522408299d2c67026 Mon Sep 17 00:00:00 2001 From: Chong Yidong Date: Sat, 30 Sep 2006 15:45:35 +0000 Subject: [PATCH] * wid-edit.el (widget-button-click-moves-point): New variable. (widget-button-click): If widget-button-click-moves-point is non-nil, set point after performing the button action * cus-edit.el (custom-mode): Set widget-button-click-moves-point. --- lisp/ChangeLog | 8 ++++++++ lisp/cus-edit.el | 7 +++++++ lisp/wid-edit.el | 16 ++++++++++++---- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 2f7de53a2a9..9cd53f8dc0d 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,11 @@ +2006-09-30 Chong Yidong + + * wid-edit.el (widget-button-click-moves-point): New variable. + (widget-button-click): If widget-button-click-moves-point is + non-nil, set point after performing the button action + + * cus-edit.el (custom-mode): Set widget-button-click-moves-point. + 2006-09-30 Martin Rudalics * files.el (find-file-existing): Modified to not allow wildcards. diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el index 2f752c5fb66..ab3f7ec2b92 100644 --- a/lisp/cus-edit.el +++ b/lisp/cus-edit.el @@ -4555,6 +4555,13 @@ if that value is non-nil." (setq widget-documentation-face 'custom-documentation) (make-local-variable 'widget-button-face) (setq widget-button-face custom-button) + + ;; We need this because of the "More" button on docstrings. + ;; Otherwise clicking on "More" can push point offscreen, which + ;; causes the window to recenter on point, which pushes the + ;; newly-revealed docstring offscreen; which is annoying. -- cyd. + (set (make-local-variable 'widget-button-click-moves-point) t) + (set (make-local-variable 'widget-button-pressed-face) custom-button-pressed) (set (make-local-variable 'widget-mouse-face) custom-button-mouse) diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el index e518fff34fa..5d8580ef22c 100644 --- a/lisp/wid-edit.el +++ b/lisp/wid-edit.el @@ -912,6 +912,10 @@ Recommended as a parent keymap for modes using widgets.") ;; backward-compatibility alias (put 'widget-button-pressed-face 'face-alias 'widget-button-pressed) +(defvar widget-button-click-moves-point nil + "If non-nil, `widget-button-click' moves point to a button after invoking it. +If nil, point returns to its original position after invoking a button.") + (defun widget-button-click (event) "Invoke the button that the mouse is pointing at." (interactive "e") @@ -922,7 +926,8 @@ Recommended as a parent keymap for modes using widgets.") (start (event-start event)) (button (get-char-property pos 'button (and (windowp (posn-window start)) - (window-buffer (posn-window start)))))) + (window-buffer (posn-window start))))) + newpoint) (when (or (null button) (catch 'button-press-cancelled ;; Mouse click on a widget button. Do the following @@ -974,12 +979,15 @@ Recommended as a parent keymap for modes using widgets.") ;; When mouse is released over the button, run ;; its action function. - (when (and pos - (eq (get-char-property pos 'button) button)) - (widget-apply-action button event))) + (when (and pos (eq (get-char-property pos 'button) button)) + (goto-char pos) + (widget-apply-action button event) + (if widget-button-click-moves-point + (setq newpoint (point))))) (overlay-put overlay 'face face) (overlay-put overlay 'mouse-face mouse-face)))) + (if newpoint (goto-char newpoint)) ;; This loses if the widget action switches windows. -- cyd ;; (unless (pos-visible-in-window-p (widget-event-point event)) ;; (mouse-set-point event)