annotate lisp/button.el @ 106768:21fd634f447a

Make line<->pixel_y conversion macros aware of native menu/tool bars. They are placed above the internal border. This supersedes special treatment of native tool bars in the display code. This fixes wrong display position of native menu bars and bogus mouse highlighting of native tool bars, both of which can be found when internal border width is large. Also it fixes wrong flashed part on visible bell with native menu bars. * frame.h (FRAME_TOP_MARGIN_HEIGHT): New macro. (FRAME_LINE_TO_PIXEL_Y, FRAME_PIXEL_Y_TO_LINE): Take account of pseudo windows above internal border. * window.h (WINDOW_MENU_BAR_P, WINDOW_TOOL_BAR_P): New macros. (WINDOW_TOP_EDGE_Y, WINDOW_BOTTOM_EDGE_Y): Take account of pseudo windows above internal border. * xdisp.c (get_glyph_string_clip_rects, init_glyph_string): Don't treat tool bar windows specially. * xfns.c (x_set_tool_bar_lines): Take account of menu bar height. * xterm.c (x_after_update_window_line): Don't treat tool bar windows specially. (XTflash): Take account of menu bar height. * w32term.c (x_after_update_window_line): Don't treat tool bar windows specially.
author YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
date Sat, 09 Jan 2010 13:16:32 +0900
parents 26baacb565b0
children 1d1d5d9bd884
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
42497
4c6b45c79a59 Fix header.
Pavel Janík <Pavel@Janik.cz>
parents: 40595
diff changeset
1 ;;; button.el --- clickable buttons
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
2 ;;
68651
3bd95f4f2941 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 67836
diff changeset
3 ;; Copyright (C) 2001, 2002, 2003, 2004, 2005,
100908
a9dc0e7c3f2b Add 2009 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 97184
diff changeset
4 ;; 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
5 ;;
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
6 ;; Author: Miles Bader <miles@gnu.org>
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
7 ;; Keywords: extensions
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
8 ;;
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
9 ;; This file is part of GNU Emacs.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
10 ;;
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 92948
diff changeset
11 ;; GNU Emacs is free software: you can redistribute it and/or modify
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
12 ;; it under the terms of the GNU General Public License as published by
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 92948
diff changeset
13 ;; the Free Software Foundation, either version 3 of the License, or
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 92948
diff changeset
14 ;; (at your option) any later version.
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 92948
diff changeset
15
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
19 ;; GNU General Public License for more details.
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 92948
diff changeset
20
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 92948
diff changeset
22 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
23
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
24 ;;; Commentary:
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
25 ;;
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
26 ;; This package defines functions for inserting and manipulating
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
27 ;; clickable buttons in Emacs buffers, such as might be used for help
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
28 ;; hyperlinks, etc.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
29 ;;
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
30 ;; In some ways it duplicates functionality also offered by the
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
31 ;; `widget' package, but the button package has the advantage that it
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
32 ;; is (1) much faster, (2) much smaller, and (3) much, much, simpler
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
33 ;; (the code, that is, not the interface).
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
34 ;;
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
35 ;; Buttons can either use overlays, in which case the button is
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
36 ;; represented by the overlay itself, or text-properties, in which case
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
37 ;; the button is represented by a marker or buffer-position pointing
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
38 ;; somewhere in the button. In the latter case, no markers into the
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
39 ;; buffer are retained, which is important for speed if there are are
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
40 ;; extremely large numbers of buttons.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
41 ;;
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
42 ;; Using `define-button-type' to define default properties for buttons
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
43 ;; is not necessary, but it is is encouraged, since doing so makes the
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
44 ;; resulting code clearer and more efficient.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
45 ;;
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
46
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
47 ;;; Code:
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
48
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
49
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
50 ;; Globals
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
51
60162
82eaf594d12a (escape-glyph, minibuffer-prompt, button): Add commentary for
Eli Zaretskii <eliz@gnu.org>
parents: 57483
diff changeset
52 ;; Use color for the MS-DOS port because it doesn't support underline.
77498
9db4aaa87823 (button): Use underline if supported, else fall back to color.
Glenn Morris <rgm@gnu.org>
parents: 77437
diff changeset
53 ;; FIXME if MS-DOS correctly answers the (supports) question, it need
9db4aaa87823 (button): Use underline if supported, else fall back to color.
Glenn Morris <rgm@gnu.org>
parents: 77437
diff changeset
54 ;; no longer be a special case.
77437
fa273fd354c2 (button): Inherit from link face on a tty.
Nick Roberts <nickrob@snap.net.nz>
parents: 77431
diff changeset
55 (defface button '((((type pc) (class color))
40337
57f029917c77 (button): Special face definition for MS-DOS terminals.
Eli Zaretskii <eliz@gnu.org>
parents: 39917
diff changeset
56 (:foreground "lightblue"))
77498
9db4aaa87823 (button): Use underline if supported, else fall back to color.
Glenn Morris <rgm@gnu.org>
parents: 77437
diff changeset
57 (((supports :underline t)) :underline t)
9db4aaa87823 (button): Use underline if supported, else fall back to color.
Glenn Morris <rgm@gnu.org>
parents: 77437
diff changeset
58 (t (:foreground "lightblue")))
49001
85b083d06a17 (defface button): Add group.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 42497
diff changeset
59 "Default face used for buttons."
67836
68ab7e53d86a (button): Put into group `basic-faces'.
Richard M. Stallman <rms@gnu.org>
parents: 67375
diff changeset
60 :group 'basic-faces)
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
61
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
62 (defvar button-map
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
63 (let ((map (make-sparse-keymap)))
91704
bd5e4ff73402 * button.el (button-map):
Jason Rumney <jasonr@gnu.org>
parents: 88017
diff changeset
64 ;; The following definition needs to avoid using escape sequences that
bd5e4ff73402 * button.el (button-map):
Jason Rumney <jasonr@gnu.org>
parents: 88017
diff changeset
65 ;; might get converted to ^M when building loaddefs.el
bd5e4ff73402 * button.el (button-map):
Jason Rumney <jasonr@gnu.org>
parents: 88017
diff changeset
66 (define-key map [(control ?m)] 'push-button)
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
67 (define-key map [mouse-2] 'push-button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
68 map)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
69 "Keymap used by buttons.")
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
70
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
71 (defvar button-buffer-map
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
72 (let ((map (make-sparse-keymap)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
73 (define-key map [?\t] 'forward-button)
67375
77493abd2418 (button-buffer-map): Bind M-TAB to `backward-button'.
Juri Linkov <juri@jurta.org>
parents: 64762
diff changeset
74 (define-key map "\e\t" 'backward-button)
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
75 (define-key map [backtab] 'backward-button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
76 map)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
77 "Keymap useful for buffers containing buttons.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
78 Mode-specific keymaps may want to use this as their parent keymap.")
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
79
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
80 ;; Default properties for buttons
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
81 (put 'default-button 'face 'button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
82 (put 'default-button 'mouse-face 'highlight)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
83 (put 'default-button 'keymap button-map)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
84 (put 'default-button 'type 'button)
57483
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
85 ;; action may be either a function to call, or a marker to go to
39703
a093c43d935c (button-nop): Function removed.
Miles Bader <miles@gnu.org>
parents: 39676
diff changeset
86 (put 'default-button 'action 'ignore)
105870
26baacb565b0 * textmodes/tex-mode.el (tex-alt-dvi-print-command)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 100908
diff changeset
87 (put 'default-button 'help-echo (purecopy "mouse-2, RET: Push this button"))
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
88 ;; Make overlay buttons go away if their underlying text is deleted.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
89 (put 'default-button 'evaporate t)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
90 ;; Prevent insertions adjacent to the text-property buttons from
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
91 ;; inheriting its properties.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
92 (put 'default-button 'rear-nonsticky t)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
93
39916
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
94 ;; A `category-symbol' property for the default button type
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
95 (put 'button 'button-category-symbol 'default-button)
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
96
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
97
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
98 ;; Button types (which can be used to hold default properties for buttons)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
99
39716
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
100 ;; Because button-type properties are inherited by buttons using the
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
101 ;; special `category' property (implemented by both overlays and
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
102 ;; text-properties), we need to store them on a symbol to which the
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
103 ;; `category' properties can point. Instead of using the symbol that's
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
104 ;; the name of each button-type, however, we use a separate symbol (with
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
105 ;; `-button' appended, and uninterned) to store the properties. This is
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
106 ;; to avoid name clashes.
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
107
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
108 ;; [this is an internal function]
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
109 (defsubst button-category-symbol (type)
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
110 "Return the symbol used by button-type TYPE to store properties.
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
111 Buttons inherit them by setting their `category' property to that symbol."
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
112 (or (get type 'button-category-symbol)
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
113 (error "Unknown button type `%s'" type)))
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
114
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
115 (defun define-button-type (name &rest properties)
88017
ad6ec43b41bc (define-button-type): Clarify type of NAME in docstring.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 87649
diff changeset
116 "Define a `button type' called NAME (a symbol).
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
117 The remaining arguments form a sequence of PROPERTY VALUE pairs,
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
118 specifying properties to use as defaults for buttons with this type
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
119 \(a button's type may be set by giving it a `type' property when
39917
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
120 creating the button, using the :type keyword argument).
39716
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
121
39917
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
122 In addition, the keyword argument :supertype may be used to specify a
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
123 button-type from which NAME inherits its default property values
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
124 \(however, the inheritance happens only when NAME is defined; subsequent
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
125 changes to a supertype are not reflected in its subtypes)."
40595
3ba2b666d7e1 (define-button-type): Make sure every user-defined button type has a supertype.
Miles Bader <miles@gnu.org>
parents: 40337
diff changeset
126 (let ((catsym (make-symbol (concat (symbol-name name) "-button")))
3ba2b666d7e1 (define-button-type): Make sure every user-defined button type has a supertype.
Miles Bader <miles@gnu.org>
parents: 40337
diff changeset
127 (super-catsym
3ba2b666d7e1 (define-button-type): Make sure every user-defined button type has a supertype.
Miles Bader <miles@gnu.org>
parents: 40337
diff changeset
128 (button-category-symbol
39916
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
129 (or (plist-get properties 'supertype)
40595
3ba2b666d7e1 (define-button-type): Make sure every user-defined button type has a supertype.
Miles Bader <miles@gnu.org>
parents: 40337
diff changeset
130 (plist-get properties :supertype)
3ba2b666d7e1 (define-button-type): Make sure every user-defined button type has a supertype.
Miles Bader <miles@gnu.org>
parents: 40337
diff changeset
131 'button))))
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
132 ;; Provide a link so that it's easy to find the real symbol.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
133 (put name 'button-category-symbol catsym)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
134 ;; Initialize NAME's properties using the global defaults.
39716
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
135 (let ((default-props (symbol-plist super-catsym)))
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
136 (while default-props
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
137 (put catsym (pop default-props) (pop default-props))))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
138 ;; Add NAME as the `type' property, which will then be returned as
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
139 ;; the type property of individual buttons.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
140 (put catsym 'type name)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
141 ;; Add the properties in PROPERTIES to the real symbol.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
142 (while properties
39916
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
143 (let ((prop (pop properties)))
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
144 (when (eq prop :supertype)
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
145 (setq prop 'supertype))
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
146 (put catsym prop (pop properties))))
40595
3ba2b666d7e1 (define-button-type): Make sure every user-defined button type has a supertype.
Miles Bader <miles@gnu.org>
parents: 40337
diff changeset
147 ;; Make sure there's a `supertype' property
3ba2b666d7e1 (define-button-type): Make sure every user-defined button type has a supertype.
Miles Bader <miles@gnu.org>
parents: 40337
diff changeset
148 (unless (get catsym 'supertype)
3ba2b666d7e1 (define-button-type): Make sure every user-defined button type has a supertype.
Miles Bader <miles@gnu.org>
parents: 40337
diff changeset
149 (put catsym 'supertype 'button))
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
150 name))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
151
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
152 (defun button-type-put (type prop val)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
153 "Set the button-type TYPE's PROP property to VAL."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
154 (put (button-category-symbol type) prop val))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
155
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
156 (defun button-type-get (type prop)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
157 "Get the property of button-type TYPE named PROP."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
158 (get (button-category-symbol type) prop))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
159
39716
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
160 (defun button-type-subtype-p (type supertype)
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
161 "Return t if button-type TYPE is a subtype of SUPERTYPE."
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
162 (or (eq type supertype)
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
163 (and type
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
164 (button-type-subtype-p (button-type-get type 'supertype)
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
165 supertype))))
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
166
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
167
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
168 ;; Button properties and other attributes
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
169
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
170 (defun button-start (button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
171 "Return the position at which BUTTON starts."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
172 (if (overlayp button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
173 (overlay-start button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
174 ;; Must be a text-property button.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
175 (or (previous-single-property-change (1+ button) 'button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
176 (point-min))))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
177
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
178 (defun button-end (button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
179 "Return the position at which BUTTON ends."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
180 (if (overlayp button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
181 (overlay-end button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
182 ;; Must be a text-property button.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
183 (or (next-single-property-change button 'button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
184 (point-max))))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
185
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
186 (defun button-get (button prop)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
187 "Get the property of button BUTTON named PROP."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
188 (if (overlayp button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
189 (overlay-get button prop)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
190 ;; Must be a text-property button.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
191 (get-text-property button prop)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
192
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
193 (defun button-put (button prop val)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
194 "Set BUTTON's PROP property to VAL."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
195 ;; Treat some properties specially.
39916
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
196 (cond ((memq prop '(type :type))
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
197 ;; We translate a `type' property a `category' property, since
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
198 ;; that's what's actually used by overlays/text-properties for
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
199 ;; inheriting properties.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
200 (setq prop 'category)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
201 (setq val (button-category-symbol val)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
202 ((eq prop 'category)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
203 ;; Disallow updating the `category' property directly.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
204 (error "Button `category' property may not be set directly")))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
205 ;; Add the property.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
206 (if (overlayp button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
207 (overlay-put button prop val)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
208 ;; Must be a text-property button.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
209 (put-text-property
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
210 (or (previous-single-property-change (1+ button) 'button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
211 (point-min))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
212 (or (next-single-property-change button 'button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
213 (point-max))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
214 prop val)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
215
39676
9e8365caa0ee (button-activate): USE-MOUSE-ACTION is optional.
Miles Bader <miles@gnu.org>
parents: 39668
diff changeset
216 (defsubst button-activate (button &optional use-mouse-action)
39655
6aeeb8a310af (next-button, previous-button): Respect `skip' property.
Miles Bader <miles@gnu.org>
parents: 39643
diff changeset
217 "Call BUTTON's action property.
6aeeb8a310af (next-button, previous-button): Respect `skip' property.
Miles Bader <miles@gnu.org>
parents: 39643
diff changeset
218 If USE-MOUSE-ACTION is non-nil, invoke the button's mouse-action
6aeeb8a310af (next-button, previous-button): Respect `skip' property.
Miles Bader <miles@gnu.org>
parents: 39643
diff changeset
219 instead of its normal action; if the button has no mouse-action,
6aeeb8a310af (next-button, previous-button): Respect `skip' property.
Miles Bader <miles@gnu.org>
parents: 39643
diff changeset
220 the normal action is used instead."
57483
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
221 (let ((action (or (and use-mouse-action (button-get button 'mouse-action))
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
222 (button-get button 'action))))
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
223 (if (markerp action)
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
224 (save-selected-window
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
225 (select-window (display-buffer (marker-buffer action)))
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
226 (goto-char action)
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
227 (recenter 0))
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
228 (funcall action button))))
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
229
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
230 (defun button-label (button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
231 "Return BUTTON's text label."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
232 (buffer-substring-no-properties (button-start button) (button-end button)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
233
39916
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
234 (defsubst button-type (button)
39917
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
235 "Return BUTTON's button-type."
39916
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
236 (button-get button 'type))
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
237
39716
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
238 (defun button-has-type-p (button type)
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
239 "Return t if BUTTON has button-type TYPE, or one of TYPE's subtypes."
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
240 (button-type-subtype-p (button-get button 'type) type))
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
241
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
242
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
243 ;; Creating overlay buttons
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
244
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
245 (defun make-button (beg end &rest properties)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
246 "Make a button from BEG to END in the current buffer.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
247 The remaining arguments form a sequence of PROPERTY VALUE pairs,
39917
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
248 specifying properties to add to the button.
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
249 In addition, the keyword argument :type may be used to specify a
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
250 button-type from which to inherit other properties; see
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
251 `define-button-type'.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
252
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
253 Also see `make-text-button', `insert-button'."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
254 (let ((overlay (make-overlay beg end nil t nil)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
255 (while properties
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
256 (button-put overlay (pop properties) (pop properties)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
257 ;; Put a pointer to the button in the overlay, so it's easy to get
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
258 ;; when we don't actually have a reference to the overlay.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
259 (overlay-put overlay 'button overlay)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
260 ;; If the user didn't specify a type, use the default.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
261 (unless (overlay-get overlay 'category)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
262 (overlay-put overlay 'category 'default-button))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
263 ;; OVERLAY is the button, so return it
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
264 overlay))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
265
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
266 (defun insert-button (label &rest properties)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
267 "Insert a button with the label LABEL.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
268 The remaining arguments form a sequence of PROPERTY VALUE pairs,
39917
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
269 specifying properties to add to the button.
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
270 In addition, the keyword argument :type may be used to specify a
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
271 button-type from which to inherit other properties; see
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
272 `define-button-type'.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
273
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
274 Also see `insert-text-button', `make-button'."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
275 (apply #'make-button
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
276 (prog1 (point) (insert label))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
277 (point)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
278 properties))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
279
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
280
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
281 ;; Creating text-property buttons
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
282
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
283 (defun make-text-button (beg end &rest properties)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
284 "Make a button from BEG to END in the current buffer.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
285 The remaining arguments form a sequence of PROPERTY VALUE pairs,
39917
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
286 specifying properties to add to the button.
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
287 In addition, the keyword argument :type may be used to specify a
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
288 button-type from which to inherit other properties; see
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
289 `define-button-type'.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
290
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
291 This function is like `make-button', except that the button is actually
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
292 part of the text instead of being a property of the buffer. Creating
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
293 large numbers of buttons can also be somewhat faster using
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
294 `make-text-button'.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
295
95776
dc7fbbea402e (make-text-button): Allow `start' to be a string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94678
diff changeset
296 BEG can also be a string, in which case it is made into a button.
dc7fbbea402e (make-text-button): Allow `start' to be a string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94678
diff changeset
297
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
298 Also see `insert-text-button'."
95776
dc7fbbea402e (make-text-button): Allow `start' to be a string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94678
diff changeset
299 (let ((object nil)
dc7fbbea402e (make-text-button): Allow `start' to be a string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94678
diff changeset
300 (type-entry
60339
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
301 (or (plist-member properties 'type)
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
302 (plist-member properties :type))))
95776
dc7fbbea402e (make-text-button): Allow `start' to be a string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94678
diff changeset
303 (when (stringp beg)
dc7fbbea402e (make-text-button): Allow `start' to be a string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94678
diff changeset
304 (setq object beg beg 0 end (length object)))
60339
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
305 ;; Disallow setting the `category' property directly.
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
306 (when (plist-get properties 'category)
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
307 (error "Button `category' property may not be set directly"))
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
308 (if (null type-entry)
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
309 ;; The user didn't specify a `type' property, use the default.
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
310 (setq properties (cons 'category (cons 'default-button properties)))
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
311 ;; The user did specify a `type' property. Translate it into a
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
312 ;; `category' property, which is what's actually used by
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
313 ;; text-properties for inheritance.
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
314 (setcar type-entry 'category)
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
315 (setcar (cdr type-entry)
95776
dc7fbbea402e (make-text-button): Allow `start' to be a string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94678
diff changeset
316 (button-category-symbol (car (cdr type-entry)))))
dc7fbbea402e (make-text-button): Allow `start' to be a string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94678
diff changeset
317 ;; Now add all the text properties at once
dc7fbbea402e (make-text-button): Allow `start' to be a string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94678
diff changeset
318 (add-text-properties beg end
dc7fbbea402e (make-text-button): Allow `start' to be a string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94678
diff changeset
319 ;; Each button should have a non-eq `button'
dc7fbbea402e (make-text-button): Allow `start' to be a string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94678
diff changeset
320 ;; property so that next-single-property-change can
dc7fbbea402e (make-text-button): Allow `start' to be a string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94678
diff changeset
321 ;; detect boundaries reliably.
dc7fbbea402e (make-text-button): Allow `start' to be a string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94678
diff changeset
322 (cons 'button (cons (list t) properties))
dc7fbbea402e (make-text-button): Allow `start' to be a string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94678
diff changeset
323 object)
dc7fbbea402e (make-text-button): Allow `start' to be a string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94678
diff changeset
324 ;; Return something that can be used to get at the button.
dc7fbbea402e (make-text-button): Allow `start' to be a string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94678
diff changeset
325 beg))
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
326
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
327 (defun insert-text-button (label &rest properties)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
328 "Insert a button with the label LABEL.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
329 The remaining arguments form a sequence of PROPERTY VALUE pairs,
39917
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
330 specifying properties to add to the button.
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
331 In addition, the keyword argument :type may be used to specify a
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
332 button-type from which to inherit other properties; see
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
333 `define-button-type'.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
334
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
335 This function is like `insert-button', except that the button is
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
336 actually part of the text instead of being a property of the buffer.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
337 Creating large numbers of buttons can also be somewhat faster using
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
338 `insert-text-button'.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
339
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
340 Also see `make-text-button'."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
341 (apply #'make-text-button
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
342 (prog1 (point) (insert label))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
343 (point)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
344 properties))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
345
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
346
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
347 ;; Finding buttons in a buffer
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
348
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
349 (defun button-at (pos)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
350 "Return the button at position POS in the current buffer, or nil."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
351 (let ((button (get-char-property pos 'button)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
352 (if (or (overlayp button) (null button))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
353 button
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
354 ;; Must be a text-property button; return a marker pointing to it.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
355 (copy-marker pos t))))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
356
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
357 (defun next-button (pos &optional count-current)
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
358 "Return the next button after position POS in the current buffer.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
359 If COUNT-CURRENT is non-nil, count any button at POS in the search,
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
360 instead of starting at the next button."
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
361 (unless count-current
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
362 ;; Search for the next button boundary.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
363 (setq pos (next-single-char-property-change pos 'button)))
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
364 (and (< pos (point-max))
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
365 (or (button-at pos)
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
366 ;; We must have originally been on a button, and are now in
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
367 ;; the inter-button space. Recurse to find a button.
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
368 (next-button pos))))
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
369
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
370 (defun previous-button (pos &optional count-current)
76869
c93f4d8744d5 (previous-button): Rewrite to account for adjacent buttons.
Chong Yidong <cyd@stupidchicken.com>
parents: 76771
diff changeset
371 "Return the previous button before position POS in the current buffer.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
372 If COUNT-CURRENT is non-nil, count any button at POS in the search,
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
373 instead of starting at the next button."
76869
c93f4d8744d5 (previous-button): Rewrite to account for adjacent buttons.
Chong Yidong <cyd@stupidchicken.com>
parents: 76771
diff changeset
374 (let ((button (button-at pos)))
c93f4d8744d5 (previous-button): Rewrite to account for adjacent buttons.
Chong Yidong <cyd@stupidchicken.com>
parents: 76771
diff changeset
375 (if button
c93f4d8744d5 (previous-button): Rewrite to account for adjacent buttons.
Chong Yidong <cyd@stupidchicken.com>
parents: 76771
diff changeset
376 (if count-current
c93f4d8744d5 (previous-button): Rewrite to account for adjacent buttons.
Chong Yidong <cyd@stupidchicken.com>
parents: 76771
diff changeset
377 button
c93f4d8744d5 (previous-button): Rewrite to account for adjacent buttons.
Chong Yidong <cyd@stupidchicken.com>
parents: 76771
diff changeset
378 ;; We started out on a button, so move to its start and look
c93f4d8744d5 (previous-button): Rewrite to account for adjacent buttons.
Chong Yidong <cyd@stupidchicken.com>
parents: 76771
diff changeset
379 ;; for the previous button boundary.
c93f4d8744d5 (previous-button): Rewrite to account for adjacent buttons.
Chong Yidong <cyd@stupidchicken.com>
parents: 76771
diff changeset
380 (setq pos (previous-single-char-property-change
c93f4d8744d5 (previous-button): Rewrite to account for adjacent buttons.
Chong Yidong <cyd@stupidchicken.com>
parents: 76771
diff changeset
381 (button-start button) 'button))
c93f4d8744d5 (previous-button): Rewrite to account for adjacent buttons.
Chong Yidong <cyd@stupidchicken.com>
parents: 76771
diff changeset
382 (let ((new-button (button-at pos)))
c93f4d8744d5 (previous-button): Rewrite to account for adjacent buttons.
Chong Yidong <cyd@stupidchicken.com>
parents: 76771
diff changeset
383 (if new-button
c93f4d8744d5 (previous-button): Rewrite to account for adjacent buttons.
Chong Yidong <cyd@stupidchicken.com>
parents: 76771
diff changeset
384 ;; We are in a button again; this can happen if there
c93f4d8744d5 (previous-button): Rewrite to account for adjacent buttons.
Chong Yidong <cyd@stupidchicken.com>
parents: 76771
diff changeset
385 ;; are adjacent buttons (or at bob).
76870
4d65750e175f Minor tweak.
Chong Yidong <cyd@stupidchicken.com>
parents: 76869
diff changeset
386 (unless (= pos (button-start button)) new-button)
76869
c93f4d8744d5 (previous-button): Rewrite to account for adjacent buttons.
Chong Yidong <cyd@stupidchicken.com>
parents: 76771
diff changeset
387 ;; We are now in the space between buttons.
c93f4d8744d5 (previous-button): Rewrite to account for adjacent buttons.
Chong Yidong <cyd@stupidchicken.com>
parents: 76771
diff changeset
388 (previous-button pos))))
c93f4d8744d5 (previous-button): Rewrite to account for adjacent buttons.
Chong Yidong <cyd@stupidchicken.com>
parents: 76771
diff changeset
389 ;; We started out in the space between buttons.
c93f4d8744d5 (previous-button): Rewrite to account for adjacent buttons.
Chong Yidong <cyd@stupidchicken.com>
parents: 76771
diff changeset
390 (setq pos (previous-single-char-property-change pos 'button))
c93f4d8744d5 (previous-button): Rewrite to account for adjacent buttons.
Chong Yidong <cyd@stupidchicken.com>
parents: 76771
diff changeset
391 (or (button-at pos)
c93f4d8744d5 (previous-button): Rewrite to account for adjacent buttons.
Chong Yidong <cyd@stupidchicken.com>
parents: 76771
diff changeset
392 (and (> pos (point-min))
c93f4d8744d5 (previous-button): Rewrite to account for adjacent buttons.
Chong Yidong <cyd@stupidchicken.com>
parents: 76771
diff changeset
393 (button-at (1- pos)))))))
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
394
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
395
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
396 ;; User commands
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
397
39655
6aeeb8a310af (next-button, previous-button): Respect `skip' property.
Miles Bader <miles@gnu.org>
parents: 39643
diff changeset
398 (defun push-button (&optional pos use-mouse-action)
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
399 "Perform the action specified by a button at location POS.
57483
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
400 POS may be either a buffer position or a mouse-event. If
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
401 USE-MOUSE-ACTION is non-nil, invoke the button's mouse-action
39655
6aeeb8a310af (next-button, previous-button): Respect `skip' property.
Miles Bader <miles@gnu.org>
parents: 39643
diff changeset
402 instead of its normal action; if the button has no mouse-action,
57483
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
403 the normal action is used instead. The action may be either a
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
404 function to call or a marker to display.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
405 POS defaults to point, except when `push-button' is invoked
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
406 interactively as the result of a mouse-event, in which case, the
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
407 mouse event is used.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
408 If there's no button at POS, do nothing and return nil, otherwise
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
409 return t."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
410 (interactive
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
411 (list (if (integerp last-command-event) (point) last-command-event)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
412 (if (and (not (integerp pos)) (eventp pos))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
413 ;; POS is a mouse event; switch to the proper window/buffer
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
414 (let ((posn (event-start pos)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
415 (with-current-buffer (window-buffer (posn-window posn))
39655
6aeeb8a310af (next-button, previous-button): Respect `skip' property.
Miles Bader <miles@gnu.org>
parents: 39643
diff changeset
416 (push-button (posn-point posn) t)))
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
417 ;; POS is just normal position
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
418 (let ((button (button-at (or pos (point)))))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
419 (if (not button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
420 nil
39655
6aeeb8a310af (next-button, previous-button): Respect `skip' property.
Miles Bader <miles@gnu.org>
parents: 39643
diff changeset
421 (button-activate button use-mouse-action)
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
422 t))))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
423
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
424 (defun forward-button (n &optional wrap display-message)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
425 "Move to the Nth next button, or Nth previous button if N is negative.
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
426 If N is 0, move to the start of any button at point.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
427 If WRAP is non-nil, moving past either end of the buffer continues from the
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
428 other end.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
429 If DISPLAY-MESSAGE is non-nil, the button's help-echo string is displayed.
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
430 Any button with a non-nil `skip' property is skipped over.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
431 Returns the button found."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
432 (interactive "p\nd\nd")
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
433 (let (button)
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
434 (if (zerop n)
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
435 ;; Move to start of current button
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
436 (if (setq button (button-at (point)))
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
437 (goto-char (button-start button)))
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
438 ;; Move to Nth next button
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
439 (let ((iterator (if (> n 0) #'next-button #'previous-button))
97184
a9fd3177343b (forward-button): Avoid infloop.
Chong Yidong <cyd@stupidchicken.com>
parents: 95776
diff changeset
440 (wrap-start (if (> n 0) (point-min) (point-max)))
a9fd3177343b (forward-button): Avoid infloop.
Chong Yidong <cyd@stupidchicken.com>
parents: 95776
diff changeset
441 opoint fail)
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
442 (setq n (abs n))
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
443 (setq button t) ; just to start the loop
97184
a9fd3177343b (forward-button): Avoid infloop.
Chong Yidong <cyd@stupidchicken.com>
parents: 95776
diff changeset
444 (while (and (null fail) (> n 0) button)
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
445 (setq button (funcall iterator (point)))
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
446 (when (and (not button) wrap)
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
447 (setq button (funcall iterator wrap-start t)))
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
448 (when button
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
449 (goto-char (button-start button))
97184
a9fd3177343b (forward-button): Avoid infloop.
Chong Yidong <cyd@stupidchicken.com>
parents: 95776
diff changeset
450 ;; Avoid looping forever (e.g., if all the buttons have
a9fd3177343b (forward-button): Avoid infloop.
Chong Yidong <cyd@stupidchicken.com>
parents: 95776
diff changeset
451 ;; the `skip' property).
a9fd3177343b (forward-button): Avoid infloop.
Chong Yidong <cyd@stupidchicken.com>
parents: 95776
diff changeset
452 (cond ((null opoint)
a9fd3177343b (forward-button): Avoid infloop.
Chong Yidong <cyd@stupidchicken.com>
parents: 95776
diff changeset
453 (setq opoint (point)))
a9fd3177343b (forward-button): Avoid infloop.
Chong Yidong <cyd@stupidchicken.com>
parents: 95776
diff changeset
454 ((= opoint (point))
a9fd3177343b (forward-button): Avoid infloop.
Chong Yidong <cyd@stupidchicken.com>
parents: 95776
diff changeset
455 (setq fail t)))
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
456 (unless (button-get button 'skip)
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
457 (setq n (1- n)))))))
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
458 (if (null button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
459 (error (if wrap "No buttons!" "No more buttons"))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
460 (let ((msg (and display-message (button-get button 'help-echo))))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
461 (when msg
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
462 (message "%s" msg)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
463 button)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
464
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
465 (defun backward-button (n &optional wrap display-message)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
466 "Move to the Nth previous button, or Nth next button if N is negative.
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
467 If N is 0, move to the start of any button at point.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
468 If WRAP is non-nil, moving past either end of the buffer continues from the
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
469 other end.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
470 If DISPLAY-MESSAGE is non-nil, the button's help-echo string is displayed.
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
471 Any button with a non-nil `skip' property is skipped over.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
472 Returns the button found."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
473 (interactive "p\nd\nd")
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
474 (forward-button (- n) wrap display-message))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
475
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
476
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
477 (provide 'button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
478
83768
4bdc932ccd9a *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78236
diff changeset
479 ;; arch-tag: 5f2c7627-413b-4097-b282-630f89d9c5e9
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
480 ;;; button.el ends here