X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/7ad8fe5e2876518a8f33b80050f98dab4ff78398..c5ad92de10abe251165a21977b388d3e799660ac:/lisp/button.el diff --git a/lisp/button.el b/lisp/button.el index 6a558af445..0676ba8695 100644 --- a/lisp/button.el +++ b/lisp/button.el @@ -1,10 +1,10 @@ ;;; button.el --- clickable buttons ;; -;; Copyright (C) 2001, 2002, 2003, 2004, 2005, -;; 2006, 2007, 2008 Free Software Foundation, Inc. +;; Copyright (C) 2001-2013 Free Software Foundation, Inc. ;; ;; Author: Miles Bader ;; Keywords: extensions +;; Package: emacs ;; ;; This file is part of GNU Emacs. ;; @@ -37,10 +37,12 @@ ;; the button is represented by a marker or buffer-position pointing ;; somewhere in the button. In the latter case, no markers into the ;; buffer are retained, which is important for speed if there are are -;; extremely large numbers of buttons. +;; extremely large numbers of buttons. Note however that if there is +;; an existing face text-property at the site of the button, the +;; button face may not be visible. Using overlays avoids this. ;; ;; Using `define-button-type' to define default properties for buttons -;; is not necessary, but it is is encouraged, since doing so makes the +;; is not necessary, but it is encouraged, since doing so makes the ;; resulting code clearer and more efficient. ;; @@ -52,10 +54,7 @@ ;; Use color for the MS-DOS port because it doesn't support underline. ;; FIXME if MS-DOS correctly answers the (supports) question, it need ;; no longer be a special case. -(defface button '((((type pc) (class color)) - (:foreground "lightblue")) - (((supports :underline t)) :underline t) - (t (:foreground "lightblue"))) +(defface button '((t :inherit link)) "Default face used for buttons." :group 'basic-faces) @@ -84,7 +83,7 @@ Mode-specific keymaps may want to use this as their parent keymap.") (put 'default-button 'type 'button) ;; action may be either a function to call, or a marker to go to (put 'default-button 'action 'ignore) -(put 'default-button 'help-echo "mouse-2, RET: Push this button") +(put 'default-button 'help-echo (purecopy "mouse-2, RET: Push this button")) ;; Make overlay buttons go away if their underlying text is deleted. (put 'default-button 'evaporate t) ;; Prevent insertions adjacent to the text-property buttons from @@ -289,9 +288,12 @@ button-type from which to inherit other properties; see `define-button-type'. This function is like `make-button', except that the button is actually -part of the text instead of being a property of the buffer. Creating -large numbers of buttons can also be somewhat faster using -`make-text-button'. +part of the text instead of being a property of the buffer. That is, +this function uses text properties, the other uses overlays. +Creating large numbers of buttons can also be somewhat faster +using `make-text-button'. Note, however, that if there is an existing +face property at the site of the button, the button face may not be visible. +You may want to use `make-button' in that case. BEG can also be a string, in which case it is made into a button. @@ -347,7 +349,9 @@ Also see `make-text-button'." ;; Finding buttons in a buffer (defun button-at (pos) - "Return the button at position POS in the current buffer, or nil." + "Return the button at position POS in the current buffer, or nil. +If the button at POS is a text property button, the return value +is a marker pointing to POS." (let ((button (get-char-property pos 'button))) (if (or (overlayp button) (null button)) button @@ -437,15 +441,22 @@ Returns the button found." (goto-char (button-start button))) ;; Move to Nth next button (let ((iterator (if (> n 0) #'next-button #'previous-button)) - (wrap-start (if (> n 0) (point-min) (point-max)))) + (wrap-start (if (> n 0) (point-min) (point-max))) + opoint fail) (setq n (abs n)) (setq button t) ; just to start the loop - (while (and (> n 0) button) + (while (and (null fail) (> n 0) button) (setq button (funcall iterator (point))) (when (and (not button) wrap) (setq button (funcall iterator wrap-start t))) (when button (goto-char (button-start button)) + ;; Avoid looping forever (e.g., if all the buttons have + ;; the `skip' property). + (cond ((null opoint) + (setq opoint (point))) + ((= opoint (point)) + (setq fail t))) (unless (button-get button 'skip) (setq n (1- n))))))) (if (null button) @@ -469,5 +480,4 @@ Returns the button found." (provide 'button) -;; arch-tag: 5f2c7627-413b-4097-b282-630f89d9c5e9 ;;; button.el ends here