annotate lisp/modes/strokes.el @ 180:add28d59e586

Added tag r20-3b16 for changeset 9ad43877534d
author cvs
date Mon, 13 Aug 2007 09:52:21 +0200
parents 6075d714658b
children 3d6bfa290dbd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1 ;;; strokes.el -- Control XEmacs through mouse strokes --
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
2 ;; Mon Jun 2 12:40:41 EDT 1997
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
3
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
4 ;; Copyright (C) 1997 Free Software Foundation, Inc.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
5
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
6 ;; Author: David Bakhash <cadet@mit.edu>
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
7 ;; Maintainer: David Bakhash <cadet@mit.edu>
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
8 ;; Version: 2.3
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
9 ;; Created: 12 April 1997
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
10 ;; Keywords: lisp, mouse, extensions
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
11
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
12 ;; This file is part of XEmacs.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
13
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
14 ;; XEmacs is free software; you can redistribute it and/or modify it
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
15 ;; under the terms of the GNU General Public License as published by
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
16 ;; the Free Software Foundation; either version 2 of the License, or
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
17 ;; (at your option) any later version.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
18
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
19 ;; XEmacs program is distributed in the hope that it will be useful,
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
20 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
21 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
22 ;; General Public License for more details.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
23
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
24 ;; You should have received a copy of the GNU General Public License
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
25 ;; along with XEmacs; see the file COPYING. If not, write to the Free
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
26 ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
27 ;; 02111-1307, USA.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
28
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
29 ;;; Synched up with: Not in FSF.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
30
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
31 ;;; Commentary:
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
32
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
33 ;; This package is written for for XEmacs v19.14 and up.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
34 ;; This is the strokes package. It is intended to allow the user to
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
35 ;; control XEmacs by means of mouse strokes. Once strokes is loaded, you
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
36 ;; can always get help be invoking `strokes-help':
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
37
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
38 ;; > M-x strokes-help
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
39
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
40 ;; and you can learn how to use the package. A mouse stroke, for now,
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
41 ;; can be defined as holding the middle button, for instance, and then
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
42 ;; moving the mouse in whatever pattern you wish, which you have set
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
43 ;; XEmacs to understand as mapping to a given command. For example, you
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
44 ;; may wish the have a mouse stroke that looks like a capital `C' which
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
45 ;; means `copy-region-as-kill'. Treat strokes just like you do key
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
46 ;; bindings. For example, XEmacs sets key bindings globally with the
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
47 ;; `global-set-key' command. Likewise, you can do
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
48
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
49 ;; > M-x global-set-stroke
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
50
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
51 ;; to interactively program in a stroke. It would be wise to set the
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
52 ;; first one to this very command, so that from then on, you invoke
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
53 ;; `global-set-stroke' with a stroke. likewise, there may eventually
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
54 ;; be a `local-set-stroke' command, also analogous to `local-set-key'.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
55
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
56 ;; You can always unset the last stroke definition with the command
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
57
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
58 ;; > M-x strokes-unset-last-stroke
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
59
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
60 ;; and the last stroke that was added to `strokes-global-map' will be
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
61 ;; removed.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
62
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
63 ;; Other analogies between strokes and key bindings are as follows:
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
64
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
65 ;; 1) To describe a stroke binding, you can type
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
66
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
67 ;; > M-x describe-stroke
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
68
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
69 ;; analogous to `describe-key'. It's also wise to have a stroke,
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
70 ;; like an `h', for help, or a `?', mapped to `describe-stroke'.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
71
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
72 ;; 2) stroke bindings are set internally through the lisp function
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
73 ;; `define-stroke', similar to the `define-key' function. some
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
74 ;; examples for a 3x3 stroke grid would be
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
75
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
76 ;; (define-stroke c-mode-stroke-map
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
77 ;; '((0 . 0) (1 . 1) (2 . 2))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
78 ;; 'kill-region)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
79 ;; (define-stroke strokes-global-map
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
80 ;; '((0 . 0) (0 . 1) (0 . 2) (1 . 2) (2 . 2))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
81 ;; 'list-buffers)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
82
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
83 ;; however, if you would probably just have the user enter in the
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
84 ;; stroke interactively and then set the stroke to whatever he/she
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
85 ;; entered. The lisp function to interactively read a stroke is
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
86 ;; `strokes-read-stroke'. This is especially helpful when you're
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
87 ;; on a fast computer that can handle a 9x9 stroke grid.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
88
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
89 ;; NOTE: only global stroke bindings are currently implemented,
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
90 ;; however mode- and buffer-local stroke bindings may eventually
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
91 ;; be implemented in a future version.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
92
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
93 ;; The important variables to be aware of for this package are listed
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
94 ;; below. They can all be altered through the customizing package via
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
95
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
96 ;; > M-x customize
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
97
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
98 ;; and customizing the group named `strokes'. You can also read
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
99 ;; documentation on the variables there.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
100
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
101 ;; `strokes-minimum-match-score' (determines the threshold of error that
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
102 ;; makes a stroke acceptable or unacceptable. If your strokes arn't
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
103 ;; matching, then you should raise this variable.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
104
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
105 ;; `strokes-grid-resolution' (determines the grid dimensions that you use
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
106 ;; when defining/reading strokes. The finer the grid your computer can
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
107 ;; handle, the more you can do, but even a 3x3 grid is pretty cool.)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
108 ;; The default value (7) should be fine for most decent computers.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
109 ;; NOTE: This variable should not be set to a number less than 3.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
110
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
111 ;; `strokes-display-strokes-buffer' will allow you to hide the strokes
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
112 ;; buffer when doing simple strokes. This is a speedup for slow
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
113 ;; computers as well as people who don't want to see their strokes.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
114
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
115 ;; If you find that your mouse is accelerating too fast, you can
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
116 ;; execute the UNIX X command to slow it down. A good possibility is
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
117
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
118 ;; % xset m 5/4 8
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
119
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
120 ;; which seems, heuristically, to work okay, without much disruption.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
121
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
122 ;; Whenever you load in the strokes package, you will be able to save
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
123 ;; what you've done upon exiting XEmacs. You can also do
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
124
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
125 ;; > M-x save-strokes
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
126
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
127 ;; and it will save your strokes in ~/.strokes, or you may wish to change
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
128 ;; this by setting the variable `strokes-file'.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
129
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
130 ;; Note that internally, all of the routines that are part of this
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
131 ;; package are able to deal with complex strokes, as they are a superset
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
132 ;; of simple strokes. However, the default of this package will map
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
133 ;; mouse button2 to the command `strokes-do-stroke', and NOT
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
134 ;; `strokes-do-complex-stroke'. If you wish to use complex strokes, you
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
135 ;; will have to override this key mapping. Complex strokes are terminated
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
136 ;; with mouse button3. The strokes package will not interfere with
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
137 ;; `mouse-yank', but you may want to examine how this is done (see the
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
138 ;; variable `strokes-click-command')
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
139
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
140 ;; To get strokes to work as part of your your setup, then you'll have
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
141 ;; put the strokes package in your load-path (preferably byte-compiled)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
142 ;; and then add the following to your .xemacs-options file (or wherever
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
143 ;; you put XEmacs-specific startup preferences):
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
144
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
145 ;;(and (fboundp 'device-on-window-system-p)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
146 ;; (device-on-window-system-p)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
147 ;; (require 'strokes))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
148
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
149 ;; Once loaded, you can start stroking. You can also toggle between
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
150 ;; strokes mode by simple typing
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
151
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
152 ;; > M-x strokes-mode
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
154 ;; I am now in the process of porting this package to emacs. I also hope
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
155 ;; that, with the help of others, this package will be useful in entering
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
156 ;; in pictographic-like language text using the mouse (i.e. Korean).
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
157 ;; Japanese and Chinese are a bit trickier, but I'm sure that with help
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
158 ;; it can be done. The next version will allow the user to enter strokes
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
159 ;; which "remove the pencil from the paper" so to speak, so one character
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
160 ;; can have multiple strokes.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
161
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
162 ;; You can read more about strokes at:
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
163
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
164 ;; http://www.mit.edu/people/cadet/strokes-help.html
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
165
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
166 ;; If you're interested in using strokes for writing English into XEmacs
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
167 ;; using strokes, then you'll want to read about it on the web page above
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
168 ;; or just download from http://www.mit.edu/people/cadet/strokes-abc.el,
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
169 ;; which is nothing but a file with some helper commands for inserting
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
170 ;; alphanumerics and punctuation.
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
171
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
172 ;; Great thanks to Rob Ristroph for his generosity in letting me use his
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
173 ;; PC to develop this, Jason Johnson for his help in algorithms, Euna
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
174 ;; Kim for her help in Korean, and massive thanks to the helpful guys
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
175 ;; on the help instance on athena (zeno, jered, amu, gsstark, ghudson, etc)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
176 ;; Special thanks to Steve Baur and Hrvoje Niksic for all their help.
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
177 ;; And even more thanks to Dave Gillespie for all the elisp help--he
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
178 ;; is responsible for helping me use the cl macros at (near) max speed.
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
179
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
180 ;; Tasks: (what I'm getting ready for future version)...
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
181 ;; 2) use 'strokes-read-complex-stroke for korean, etc.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
182 ;; 4) buffer-local 'strokes-local-map, and mode-stroke-maps would be nice
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
183 ;; 5) 'list-strokes (kinda important). What do people want?
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
184 ;; How about an optional docstring for each stroke so that a person
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
185 ;; can examine the strokes-file and actually make sense of it?
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
186 ;; (e.g. "This stroke is a pentagram")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
187 ;; 6) add some hooks, like `strokes-read-stroke-hook'
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
188 ;; 7) See what people think of the factory settings. Should I change
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
189 ;; them? They're all pretty arbitrary in a way. I guess they
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
190 ;; should be minimal, but computers are getting lots faster, and
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
191 ;; if I choose the defaults too conservatively, then strokes will
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
192 ;; surely dissapoint some people on decent machines (until they
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
193 ;; figure out M-x customize). I need feedback.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
194 ;; Other: I always have the most beta version of strokes, so if you
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
195 ;; want it just let me know.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
196
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
197 ;;; Change Log:
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
198
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
199 ;; 1.3: provided user variable `strokes-use-strokes-buffer' to let users
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
200 ;; hide the strokes and strokes buffer when entering simple strokes.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
201 ;; 1.3: cleaned up most leaks.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
202 ;; 1.3: with Jari Aalto's help, cleaned up overall program.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
203 ;; 1.3: added `strokes-help' for help on strokes
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
204 ;; 1.3: fixed 'strokes-load-hook bug
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
205 ;; 1.3: email address change: now <cadet@mit.edu>
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
206 ;; 1.3: added `strokes-report-bug' based on efs/dired's `dired-report-bug'
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
207 ;; 1.3: added more dialog-box queries for mouse-event stuff.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
208 ;; 1.4: allowed strokes to invoke kbd macros as well (thanks gsstark!)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
209 ;; 2.0: fixed up ordering of certain functions.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
210 ;; 2.0: fixed bug applying to strokes in dedicated and minibuffer windows.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
211 ;; 2.0: punted the C-h way of invoking strokes help routines.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
212 ;; 2.0: fixed `strokes-define-stroke' so it would error check against
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
213 ;; defining strokes that were too short (really clicks)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
214 ;; 2.0: added `strokes-toggle-strokes-buffer' interactive function
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
215 ;; 2.0: added `customize' support, thanks to patch from Hrvoje (thanks)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
216 ;; 2.1: strokes no longer forces `mouse-yank-at-point' to t on mouse-yank
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
217 ;; (i.e. `mouse-yank-at-point' is up to you again)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
218 ;; 2.1: toggling strokes-mode off and then back on no longer deletes
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
219 ;; the strokes that you programmed in but didn't save before
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
220 ;; toggling off strokes-mode.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
221 ;; 2.1: advised may functions for modes like VM and w3 so that they too
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
222 ;; can use strokes, while still mantaining old button2 functionality.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
223 ;; 2.1: with steve's help, got the autoload for `strokes-mode' and
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
224 ;; fixed up the package so loading it does not enable strokes
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
225 ;; until user calls `strokes-mode'.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
226 ;; 2.2: made sure that abbrev-mode was off in the ` *strokes*' buffer
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
227 ;; 2.2: added more dired advice for mouse permissions commands
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
228 ;; 2.2: added some checks to see if saving strokes is really necessary so
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
229 ;; the user doesn't get promped aimlessly.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
230 ;; 2.2: change the `strokes-lift' symbol to a keyword of value `:strokes-lift'
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
231 ;; for legibility. IF YOUR OLD STROKES DON'T WORK, THIS IS PROBABLY WHY.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
232 ;; 2.2: I might have to change this back to `'strokes-lift' because the keyword
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
233 ;; fails in emacs, though I don't know why.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
234 ;; 2.2: `strokes-describe-stroke' is nicer during recursive edits
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
235 ;; 2.2: provided `strokes-fill-stroke' to fill in empty spaces of strokes
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
236 ;; as an important step towards platform (speed) independence.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
237 ;; Because of this, I moved the global setting of `strokes-last-stroke'
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
238 ;; from `strokes-eliminate-consecutive-redundancies' to
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
239 ;; `strokes-fill-stroke' since the latter comes later in processing
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
240 ;; a user stroke.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
241 ;; 2.2: Finally changed the defaults, so now `strokes-grid-resolution' is 9
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
242 ;; and `strokes-minimum-match-score' is 1000 by default. This will surely
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
243 ;; mess some people up, but if so, just set it back w/ M-x customize.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
244 ;; 2.2: Fixed up the mechanism for updating the `strokes-window-configuration'.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
245 ;; Now it only uses one function (`strokes-update-window-configuration')
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
246 ;; which does it all, and much more efficiently (thanks RMS!).
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
247 ;; 2.2 Fixed up the appearance of the *strokes* buffer so that there are no
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
248 ;; ugly line truncations, and I got rid of the bug which would draw the stroke
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
249 ;; on the wrong line. I still wish that `event-closest-point' was smarter.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
250 ;; In fact, `event-closest-point' does *not* do what its name suggests.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
251 ;; 2.3 Added more to `strokes-update-window-configuration' so it goes to hell less often
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
252 ;; 2.3 `strokes-mode' no longer will undefine keys unless it's sure that the user had
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
253 ;; had them mapped to a strokes command.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
254 ;; 2.3 added more magic autoload statements so strokes work more smoothly.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
255 ;; similarly, I made strokes-mode turn itself on when the user defines a stroke
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
256 ;; (thanks Hrvoje).
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
257 ;; 2.3 Added "Strokes" to the modeline when strokes is on, and allow toggling strokes
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
258 ;; with mouse button2.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
259 ;; 2.3 Added `list-strokes', which is a really nice function which graphically lists
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
260 ;; all the strokes that the user has defined and their corresponding commands.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
261 ;; `list-strokes' will appropriately colorize the pixmaps to display some time info.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
262
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
263 ;;; Code:
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
264
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
265 ;;; Requirements and provisions...
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
266
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
267 (autoload 'reporter-submit-bug-report "reporter")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
268 (autoload 'mail-position-on-field "sendmail")
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
269 (eval-when-compile
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
270 (mapc 'require '(xpm-mode pp annotations reporter advice)))
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
271
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
272 ;;; Constants...
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
273
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
274 (defconst strokes-version "2.3")
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
275
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
276 (defconst strokes-bug-address "cadet@mit.edu")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
277
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
278 (defconst strokes-lift :strokes-lift
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
279 "Symbol representing a stroke lift event for complex strokes.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
280 Complex strokes are those which contain two or more simple strokes.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
281 This will be useful for when XEmacs understands Chinese.")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
282
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
283 (defconst strokes-xpm-header "/* XPM */
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
284 static char * stroke_xpm[] = {
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
285 /* width height ncolors cpp [x_hot y_hot] */
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
286 \"33 33 9 1 26 23\",
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
287 /* colors */
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
288 \" c #D9D9D9D9D9D9\",
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
289 \"* s iconColor1 m black c black\",
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
290 \"R c #FFFF00000000\",
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
291 \"O c #FFFF80000000\",
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
292 \"Y c #FFFFFFFF0000\",
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
293 \"G c #0000FFFF0000\",
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
294 \"B c #00000000FFFF\",
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
295 \"P c #FFFF0000FFFF\",
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
296 \". c #45458B8B0000\",
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
297 /* pixels */\n"
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
298 "The header to all xpm buffers created by strokes")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
299
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
300 ;;; user variables...
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
301
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
302 (defgroup strokes nil
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
303 "Control Emacs through mouse strokes"
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
304 :group 'mouse)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
305
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
306 (defcustom strokes-modeline-string " Strokes"
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
307 "*Modeline identification when strokes are on \(default is \" Strokes\"\)."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
308 :type 'string
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
309 :group 'strokes)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
310
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
311 (defcustom strokes-character ?o
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
312 "*Character used when drawing strokes in the strokes buffer.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
313 \(The default is lower-case `o', which works okay\)."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
314 :type 'character
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
315 :group 'strokes)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
316
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
317 (defcustom strokes-minimum-match-score 1000
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
318 "*Minimum score for a stroke to be considered a possible match.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
319 Requiring a perfect match would set this variable to 0.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
320 The default value is 1000, but it's mostly dependent on how precisely
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
321 you manage to replicate your user-defined strokes. It also depends on
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
322 the value of `strokes-grid-resolution', since a higher grid resolution
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
323 will correspond to more sample points, and thus more distance
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
324 measurements. Usually, this is not a problem since you first set
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
325 `strokes-grid-resolution' based on what your computer seems to be able
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
326 to handle (though the defaults are usually more than sufficent), and
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
327 then you can set `strokes-minimum-match-score' to something that works
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
328 for you. The only purpose of this variable is to insure that if you
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
329 do a bogus stroke that really doesn't match any of the predefined
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
330 ones, then strokes should NOT pick the one that came closest."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
331 :type 'integer
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
332 :group 'strokes)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
333
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
334 (defcustom strokes-grid-resolution 9
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
335 "*Integer defining dimensions of the stroke grid.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
336 The grid is a square grid, where STROKES-GRID-RESOLUTION defaults to
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
337 `9', making a 9x9 grid whose coordinates go from (0 . 0) on the top
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
338 left to ((STROKES-GRID-RESOLUTION - 1) . (STROKES-GRID-RESOLUTION - 1))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
339 on the bottom right. The greater the resolution, the more intricate
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
340 your strokes can be.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
341 NOTE: This variable should be odd and MUST NOT be less than 3.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
342 WARNING: Changing the value of this variable will gravely affect the
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
343 strokes you have already programmed in. You should try to
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
344 figure out what it should be based on your needs and on how
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
345 quick the particular platform(s) you're operating on, and
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
346 only then start programming in your custom strokes."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
347 :type 'integer
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
348 :group 'strokes)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
349
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
350 (defcustom strokes-file "~/.strokes"
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
351 "*File containing saved strokes for stroke-mode (default is ~/.strokes)."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
352 :type 'file
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
353 :group 'strokes)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
354
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
355 (defcustom strokes-buffer-name " *strokes*"
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
356 "The buffer that the strokes take place in (default is ` *strokes*')."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
357 :type 'string
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
358 :group 'strokes)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
359
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
360 (defcustom strokes-use-strokes-buffer t
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
361 "*If non-nil, the strokes buffer is used and strokes are displayed.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
362 If nil, strokes will be read the same, however the user will not be
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
363 able to see the strokes. This be helpful for people who don't like
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
364 the delay in switching to the strokes buffer."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
365 :type 'boolean
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
366 :group 'strokes)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
367
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
368 (defcustom strokes-click-command 'mouse-yank
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
369 "*Command to execute when stroke is actually a `click' event.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
370 This is set to `mouse-yank' by default."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
371 :type 'function
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
372 :group 'strokes)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
373
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
374 ;;; internal variables...
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
375
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
376 ;;;###autoload
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
377 (defvar strokes-mode nil
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
378 "Non-nil when `strokes' is globally enabled")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
379
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
380 (defvar strokes-window-configuration nil
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
381 "The special window configuration used when entering strokes.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
382 This is set properly in the function `strokes-update-window-configuration'.")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
383
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
384 (defvar strokes-last-stroke nil
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
385 "Last stroke entered by the user.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
386 Its value gets set every time the function
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
387 `strokes-fill-stroke' gets called,
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
388 since that is the best time to set the variable")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
389
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
390 (defvar strokes-global-map '()
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
391 "Association list of strokes and their definitions.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
392 Each entry is (STROKE . COMMAND) where STROKE is itself a list of
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
393 coordinates (X . Y) where X and Y are lists of positions on the
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
394 normalized stroke grid, with the top left at (0 . 0). COMMAND is the
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
395 corresponding interactive function")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
396
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
397 (defvar strokes-load-hook nil
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
398 "Function or functions to be called when `strokes' is loaded.")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
399
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
400 (defvar edit-strokes-menu
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
401 '("Edit-Strokes"
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
402 ["Add stroke..." strokes-global-set-stroke t]
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
403 ["Delete stroke..." strokes-edit-delete-stroke t]
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
404 ["Change stroke" strokes-smaller t]
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
405 ["Change definition" strokes-larger t]
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
406 ["[Re]List Strokes chronologically" strokes-list-strokes t]
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
407 ["[Re]List Strokes alphabetically" strokes-list-strokes t]
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
408 ["Quit" strokes-edit-quit t]
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
409 ))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
410
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
411 ;;; Macros...
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
412
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
413 (defsubst strokes-click-p (stroke)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
414 "Non-nil if STROKE is really click."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
415 (< (length stroke) 3))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
416
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
417 ;;; old, but worked pretty good (just in case)...
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
418 ;;(defmacro strokes-define-stroke (stroke-map stroke def)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
419 ;; "Add STROKE to STROKE-MAP alist with given command DEF"
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
420 ;; (list 'if (list '< (list 'length stroke) 3)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
421 ;; (list 'error
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
422 ;; "That's a click, not a stroke. See `strokes-click-command'")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
423 ;; (list 'setq stroke-map (list 'cons (list 'cons stroke def)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
424 ;; (list 'remassoc stroke stroke-map)))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
425
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
426 (defmacro strokes-define-stroke (stroke-map stroke def)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
427 "Add STROKE to STROKE-MAP alist with given command DEF"
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
428 `(if (strokes-click-p ,stroke)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
429 (error "That's a click, not a stroke; see `strokes-click-command'")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
430 (setq ,stroke-map (cons (cons ,stroke ,def)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
431 (remassoc ,stroke ,stroke-map)))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
432
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
433 (defalias 'define-stroke 'strokes-define-stroke)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
434
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
435 (defsubst strokes-square (x)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
436 "Returns the square of the number X"
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
437 (* x x))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
438
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
439 (defsubst strokes-distance-squared (p1 p2)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
440 "Gets the distance (squared) between to points P1 and P2.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
441 Each point is a cons cells (X . Y)"
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
442 (let ((x1 (car p1))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
443 (y1 (cdr p1))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
444 (x2 (car p2))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
445 (y2 (cdr p2)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
446 (+ (strokes-square (- x2 x1))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
447 (strokes-square (- y2 y1)))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
448
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
449 ;;; Advice for various functions...
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
450
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
451 ;; I'd originally wanted to write a macro that would just take in the
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
452 ;; generic functions which use mouse button2 in various modes. Most of
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
453 ;; them are identical in form: they take an event as the single argument
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
454 ;; and then do their thing. I tried writing a macro that looked
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
455 ;; something like this, but failed. Advice just ain't that easy. The
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
456 ;; one that bugged me the most was `Manual-follow-xref', because that had
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
457 ;; &rest arguments, and I didn't know how to work around it in defadvice.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
458 ;; However, I was able to fix up most of the important modes (i.e. the
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
459 ;; ones I use all the time). One `bug' in the program that I just can't
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
460 ;; seem to figure out is why I can only advise other button2 functions
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
461 ;; successfully when the variable `strokes-use-strokes-buffer' is nil. I
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
462 ;; did all the save-excursion/save-window-excursion stuff SPECIFICALLY so
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
463 ;; that using the strokes buffer or not would absolutely not affect any
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
464 ;; other part of the program. If someone can figure out how to make the
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
465 ;; following advices work w/ regardless of that variable
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
466 ;; `strokes-use-strokes-buffer', then that would be a great victory. If
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
467 ;; someone out there would be kind enough to make the commented code
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
468 ;; below work, I'd be grateful. By the way, I put the `protect' keywords
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
469 ;; there to insure that if a stroke went bad, then
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
470 ;; `strokes-click-command' would be set back. If this isn't necessary,
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
471 ;; then feel free to let me know.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
472
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
473 ;; For what follows, I really wanted something that would work like this:
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
474
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
475 ;;(strokes-fix-button2 'vm-mouse-button-2)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
476
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
477 ;; Or even better, I could have simply done something like:
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
478
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
479 ;;(mapcar 'strokes-fix-button2
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
480 ;; '(vm-mouse-button-2
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
481 ;; rmail-summary-mouse-goto-msg
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
482 ;; <rest of them>))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
483
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
484 ;;; With help from Hans (author of advice.el)...
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
485 (defmacro strokes-fix-button2-command (command)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
486 "Fix COMMAND so that it can also work with strokes.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
487 COMMAND must take one event argument.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
488 Example of how one might fix up a command that's bound to button2
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
489 and which is an interactive funcion of one event argument:
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
490
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
491 (strokes-fix-button2-command 'vm-mouse-button-2)"
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
492 (let ((command (eval command)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
493 `(progn
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
494 (defadvice ,command (around strokes-fix-button2 compile preactivate)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
495 ,(format "Fix %s to work with strokes." command)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
496 (if strokes-use-strokes-buffer
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
497 ;; then strokes is no good and we'll have to use the original
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
498 ad-do-it
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
499 ;; otherwise, we can make strokes work too...
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
500 (let ((strokes-click-command
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
501 ',(intern (format "ad-Orig-%s" command))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
502 (strokes-do-stroke (ad-get-arg 0))))))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
503
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
504 (strokes-fix-button2-command 'vm-mouse-button-2)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
505 (strokes-fix-button2-command 'rmail-summary-mouse-goto-msg)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
506 (strokes-fix-button2-command 'Buffer-menu-mouse-select)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
507 (strokes-fix-button2-command 'w3-widget-button-click)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
508 (strokes-fix-button2-command 'widget-image-button-press)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
509 (strokes-fix-button2-command 'Info-follow-clicked-node)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
510 (strokes-fix-button2-command 'compile-mouse-goto-error)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
511 (strokes-fix-button2-command 'gdbsrc-select-or-yank)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
512 (strokes-fix-button2-command 'hypropos-mouse-get-doc)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
513 (strokes-fix-button2-command 'gnus-mouse-pick-group)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
514 (strokes-fix-button2-command 'gnus-mouse-pick-article)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
515 (strokes-fix-button2-command 'gnus-article-push-button)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
516 (strokes-fix-button2-command 'dired-mouse-find-file)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
517 (strokes-fix-button2-command 'url-dired-find-file-mouse)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
518 (strokes-fix-button2-command 'dired-u-r-mouse-toggle)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
519 (strokes-fix-button2-command 'dired-u-w-mouse-toggle)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
520 (strokes-fix-button2-command 'dired-u-x-mouse-toggle)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
521 (strokes-fix-button2-command 'dired-g-r-mouse-toggle)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
522 (strokes-fix-button2-command 'dired-g-w-mouse-toggle)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
523 (strokes-fix-button2-command 'dired-g-x-mouse-toggle)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
524 (strokes-fix-button2-command 'dired-o-r-mouse-toggle)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
525 (strokes-fix-button2-command 'dired-o-w-mouse-toggle)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
526 (strokes-fix-button2-command 'isearch-yank-x-selection)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
527 (strokes-fix-button2-command 'occur-mode-mouse-goto)
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
528 (strokes-fix-button2-command 'cvs-mouse-find-file)
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
529
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
530 ;;; I can fix the customize widget button click, but then
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
531 ;;; people will get confused when they try to customize
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
532 ;;; strokes with the mouse and customize tells them that
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
533 ;;; `strokes-click-command' is mapped to `ad-Orig-widget-button-click'
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
534 ;;(strokes-fix-button2-command 'widget-button-click)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
535
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
536 ;;; without the advice, each advised function would look like...
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
537 ;;(defadvice vm-mouse-button-2 (around vm-strokes activate protect)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
538 ;; "Allow strokes to work in VM."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
539 ;; (if strokes-use-strokes-buffer
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
540 ;; ;; then strokes is no good and we'll have to use the original
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
541 ;; ad-do-it
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
542 ;; ;; otherwise, we can make strokes work too...
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
543 ;; (let ((strokes-click-command 'ad-Orig-vm-mouse-button-2))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
544 ;; (strokes-do-stroke (ad-get-arg 0)))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
545
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
546 ;;; Functions...
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
547
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
548 (defun strokes-lift-p (object)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
549 "Return non-nil if object is a stroke-lift"
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
550 (eq object strokes-lift))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
551
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
552 (defun strokes-unset-last-stroke ()
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
553 "Undo the last stroke definition."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
554 (interactive)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
555 (let ((command (cdar strokes-global-map)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
556 (if (y-or-n-p-maybe-dialog-box
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
557 (format "really delete last stroke definition, defined to `%s'? "
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
558 command))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
559 (progn
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
560 (setq strokes-global-map (cdr strokes-global-map))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
561 (message "That stroke has been deleted"))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
562 (message "Nothing done"))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
563
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
564 ;;;###autoload
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
565 (defun strokes-global-set-stroke (stroke command)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
566 "Interactively give STROKE the global binding as COMMAND.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
567 Operated just like `global-set-key', except for strokes.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
568 COMMAND is a symbol naming an interactively-callable function. STROKE
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
569 is a list of sampled positions on the stroke grid as described in the
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
570 documentation for the `strokes-define-stroke' function."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
571 (interactive
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
572 (list
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
573 (and (or strokes-mode (strokes-mode t))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
574 (strokes-read-complex-stroke
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
575 "Define a new stroke. Draw with button1 (or 2). End with button3..."))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
576 (read-command "command to map stroke to: ")))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
577 (strokes-define-stroke strokes-global-map stroke command))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
578
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
579 ;;;###autoload
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
580 (defalias 'global-set-stroke 'strokes-global-set-stroke)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
581
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
582 ;;(defun global-unset-stroke (stroke); FINISH THIS DEFUN!
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
583 ;; "delete all strokes matching STROKE from `strokes-global-map',
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
584 ;; letting the user input
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
585 ;; the stroke with the mouse"
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
586 ;; (interactive
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
587 ;; (list
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
588 ;; (strokes-read-stroke "Enter the stroke you want to delete...")))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
589 ;; (strokes-define-stroke 'strokes-global-map stroke command))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
590
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
591 (defun strokes-get-grid-position (stroke-extent position &optional grid-resolution)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
592 "Map POSITION to a new grid position based on its STROKE-EXTENT and GRID-RESOLUTION.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
593 STROKE-EXTENT as a list \(\(xmin . ymin\) \(xmax . ymax\)\).
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
594 If POSITION is a `strokes-lift', then it is itself returned.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
595 Optional GRID-RESOLUTION may be used in place of STROKES-GRID-RESOLUTION.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
596 The grid is a square whose dimesion is [0,GRID-RESOLUTION)."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
597 (cond ((consp position) ; actual pixel location
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
598 (let ((grid-resolution (or grid-resolution strokes-grid-resolution))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
599 (x (car position))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
600 (y (cdr position))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
601 (xmin (caar stroke-extent))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
602 (ymin (cdar stroke-extent))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
603 ;; the `1+' is there to insure that the
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
604 ;; formula evaluates correctly at the boundaries
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
605 (xmax (1+ (caadr stroke-extent)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
606 (ymax (1+ (cdadr stroke-extent))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
607 (cons (floor (* grid-resolution
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
608 (/ (float (- x xmin))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
609 (- xmax xmin))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
610 (floor (* grid-resolution
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
611 (/ (float (- y ymin))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
612 (- ymax ymin)))))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
613 ((strokes-lift-p position) ; stroke lift
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
614 strokes-lift)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
615
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
616 ;;(defun strokes-get-grid-position (stroke-extent pix-pos)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
617 ;; "Return the stroke-grid position for PIX-POS given the total STROKE-EXTENT.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
618 ;;STROKE-EXTENT as a list \(\(xmin . ymin\) \(xmax . ymax\)\) and a particular
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
619 ;;pixel position or `strokes-lift', find the corresponding grid position
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
620 ;;\(based on `strokes-grid-resolution'\) for the PIX-POS."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
621 ;; (cond ((consp pix-pos) ; actual pixel location
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
622 ;; (let ((x (car pix-pos))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
623 ;; (y (cdr pix-pos))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
624 ;; (xmin (caar stroke-extent))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
625 ;; (ymin (cdar stroke-extent))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
626 ;; ;; the `1+' is there to insure that the
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
627 ;; ;; formula evaluates correctly at the boundaries
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
628 ;; (xmax (1+ (caadr stroke-extent)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
629 ;; (ymax (1+ (cdadr stroke-extent))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
630 ;; (cons (floor (* strokes-grid-resolution
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
631 ;; (/ (float (- x xmin))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
632 ;; (- xmax xmin))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
633 ;; (floor (* strokes-grid-resolution
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
634 ;; (/ (float (- y ymin))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
635 ;; (- ymax ymin)))))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
636 ;; ((strokes-lift-p pix-pos) ; stroke lift
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
637 ;; strokes-lift)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
638
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
639 (defun strokes-get-stroke-extent (pixel-positions)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
640 "From a list of absolute PIXEL-POSITIONS, returns absolute spatial extent.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
641 The return value is a list ((xmin . ymin) (xmax . ymax))."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
642 (if pixel-positions
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
643 (let ((xmin (caar pixel-positions))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
644 (xmax (caar pixel-positions))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
645 (ymin (cdar pixel-positions))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
646 (ymax (cdar pixel-positions))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
647 (rest (cdr pixel-positions)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
648 (while rest
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
649 (if (consp (car rest))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
650 (let ((x (caar rest))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
651 (y (cdar rest)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
652 (if (< x xmin)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
653 (setq xmin x))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
654 (if (> x xmax)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
655 (setq xmax x))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
656 (if (< y ymin)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
657 (setq ymin y))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
658 (if (> y ymax)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
659 (setq ymax y))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
660 (setq rest (cdr rest)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
661 (let ((delta-x (- xmax xmin))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
662 (delta-y (- ymax ymin)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
663 (if (> delta-x delta-y)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
664 (setq ymin (- ymin
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
665 (/ (- delta-x delta-y)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
666 2))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
667 ymax (+ ymax
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
668 (/ (- delta-x delta-y)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
669 2)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
670 (setq xmin (- xmin
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
671 (/ (- delta-y delta-x)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
672 2))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
673 xmax (+ xmax
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
674 (/ (- delta-y delta-x)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
675 2))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
676 (list (cons xmin ymin)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
677 (cons xmax ymax))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
678 nil))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
679
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
680 (defun strokes-eliminate-consecutive-redundancies (entries)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
681 "Returns a list with no consecutive redundant entries."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
682 ;; defun a grande vitesse grace a Dave G.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
683 (loop for element on entries
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
684 if (not (equal (car element) (cadr element)))
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
685 collect (car element)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
686 ;; (loop for element on entries
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
687 ;; nconc (if (not (equal (car el) (cadr el)))
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
688 ;; (list (car el)))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
689 ;; yet another (orig) way of doing it...
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
690 ;; (if entries
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
691 ;; (let* ((current (car entries))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
692 ;; (rest (cdr entries))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
693 ;; (non-redundant-list (list current))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
694 ;; (next nil))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
695 ;; (while rest
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
696 ;; (setq next (car rest))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
697 ;; (if (equal current next)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
698 ;; (setq rest (cdr rest))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
699 ;; (setq non-redundant-list (cons next non-redundant-list)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
700 ;; current next
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
701 ;; rest (cdr rest))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
702 ;; (nreverse non-redundant-list))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
703 ;; nil))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
704
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
705 (defun strokes-renormalize-to-grid (positions &optional grid-resolution)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
706 "Map POSITIONS to a new grid whose dimensions are based on GRID-RESOLUTION.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
707 POSITIONS is a list of positions and stroke-lifts.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
708 Optional GRID-RESOLUTION may be used in place of STROKES-GRID-RESOLUTION.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
709 The grid is a square whose dimesion is [0,GRID-RESOLUTION)."
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
710 (or grid-resolution (setq grid-resolution strokes-grid-resolution))
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
711 (let ((stroke-extent (strokes-get-stroke-extent positions)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
712 (mapcar (function
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
713 (lambda (pos)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
714 (strokes-get-grid-position stroke-extent pos grid-resolution)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
715 positions)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
716
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
717 ;;(defun strokes-normalize-pixels-to-grid (pixel-positions)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
718 ;; "Map PIXEL-POSITIONS to the stroke grid.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
719 ;;PIXEL-POSITIONS is a list of pixel-positions and stroke-lifts. The
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
720 ;;normalized stroke grid is defined by the variable STROKES-GRID-RESOLUTION"
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
721 ;; (let ((stroke-extent (strokes-get-stroke-extent pixel-positions)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
722 ;; (mapcar (function
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
723 ;; (lambda (pix-pos)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
724 ;; (strokes-get-grid-position stroke-extent pix-pos)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
725 ;; pixel-positions)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
726
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
727 (defun strokes-fill-stroke (unfilled-stroke &optional force)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
728 "Fill in missing grid locations in the list of UNFILLED-STROKE.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
729 If FORCE is non-nil, then fill the stroke even if it's `stroke-click'.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
730 NOTE: This is where the global variable `strokes-last-stroke' is set."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
731 (setq strokes-last-stroke ; this is global
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
732 (if (and (strokes-click-p unfilled-stroke)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
733 (not force))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
734 unfilled-stroke
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
735 (loop for grid-locs on unfilled-stroke
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
736 nconc (let* ((current (car grid-locs))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
737 (current-is-a-point-p (consp current))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
738 (next (cadr grid-locs))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
739 (next-is-a-point-p (consp next))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
740 (both-are-points-p (and current-is-a-point-p
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
741 next-is-a-point-p))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
742 (x1 (and current-is-a-point-p
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
743 (car current)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
744 (y1 (and current-is-a-point-p
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
745 (cdr current)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
746 (x2 (and next-is-a-point-p
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
747 (car next)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
748 (y2 (and next-is-a-point-p
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
749 (cdr next)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
750 (delta-x (and both-are-points-p
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
751 (- x2 x1)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
752 (delta-y (and both-are-points-p
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
753 (- y2 y1)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
754 (slope (and both-are-points-p
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
755 (if (zerop delta-x)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
756 nil ; undefined vertical slope
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
757 (/ (float delta-y)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
758 delta-x)))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
759 (cond ((not both-are-points-p)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
760 (list current))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
761 ((null slope) ; undefinded vertical slope
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
762 (if (>= delta-y 0)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
763 (loop for y from y1 below y2
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
764 collect (cons x1 y))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
765 (loop for y from y1 above y2
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
766 collect (cons x1 y))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
767 ((zerop slope) ; (= y1 y2)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
768 (if (>= delta-x 0)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
769 (loop for x from x1 below x2
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
770 collect (cons x y1))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
771 (loop for x from x1 above x2
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
772 collect (cons x y1))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
773 ((>= (abs delta-x) (abs delta-y))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
774 (if (> delta-x 0)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
775 (loop for x from x1 below x2
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
776 collect (cons x
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
777 (+ y1
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
778 (round (* slope
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
779 (- x x1))))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
780 (loop for x from x1 above x2
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
781 collect (cons x
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
782 (+ y1
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
783 (round (* slope
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
784 (- x x1))))))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
785 (t ; (< (abs delta-x) (abs delta-y))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
786 (if (> delta-y 0)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
787 (loop for y from y1 below y2
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
788 collect (cons (+ x1
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
789 (round (/ (- y y1)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
790 slope)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
791 y))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
792 (loop for y from y1 above y2
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
793 collect (cons (+ x1
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
794 (round (/ (- y y1)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
795 slope)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
796 y))))))))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
797
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
798 (defun strokes-rate-stroke (stroke1 stroke2)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
799 "Rates STROKE1 with STROKE2 and returns a score based on a distance metric.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
800 Note: the rating is an error rating, and therefore, a return of 0
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
801 represents a perfect match. Also note that the order of stroke
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
802 arguments is order-independent for the algorithm used here."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
803 (if (and stroke1 stroke2)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
804 (let ((rest1 (cdr stroke1))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
805 (rest2 (cdr stroke2))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
806 (err (strokes-distance-squared (car stroke1)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
807 (car stroke2))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
808 (while (and rest1 rest2)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
809 (while (and (consp (car rest1))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
810 (consp (car rest2)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
811 (setq err (+ err
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
812 (strokes-distance-squared (car rest1)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
813 (car rest2)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
814 stroke1 rest1
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
815 stroke2 rest2
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
816 rest1 (cdr stroke1)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
817 rest2 (cdr stroke2)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
818 (cond ((and (strokes-lift-p (car rest1))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
819 (strokes-lift-p (car rest2)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
820 (setq rest1 (cdr rest1)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
821 rest2 (cdr rest2)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
822 ((strokes-lift-p (car rest2))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
823 (while (consp (car rest1))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
824 (setq err (+ err
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
825 (strokes-distance-squared (car rest1)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
826 (car stroke2)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
827 rest1 (cdr rest1))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
828 ((strokes-lift-p (car rest1))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
829 (while (consp (car rest2))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
830 (setq err (+ err
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
831 (strokes-distance-squared (car stroke1)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
832 (car rest2)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
833 rest2 (cdr rest2))))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
834 (if (null rest2)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
835 (while (consp (car rest1))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
836 (setq err (+ err
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
837 (strokes-distance-squared (car rest1)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
838 (car stroke2)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
839 rest1 (cdr rest1))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
840 (if (null rest1)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
841 (while (consp (car rest2))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
842 (setq err (+ err
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
843 (strokes-distance-squared (car stroke1)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
844 (car rest2)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
845 rest2 (cdr rest2))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
846 (if (or (strokes-lift-p (car rest1))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
847 (strokes-lift-p (car rest2)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
848 (setq err nil)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
849 err))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
850 nil))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
851
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
852 (defun strokes-match-stroke (stroke stroke-map)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
853 "Finds the best matching command of STROKE in STROKE-MAP.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
854 Returns the corresponding match as (COMMAND . SCORE)."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
855 (if (and stroke stroke-map)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
856 (let ((score (strokes-rate-stroke stroke (caar stroke-map)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
857 (command (cdar stroke-map))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
858 (map (cdr stroke-map)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
859 (while map
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
860 (let ((newscore (strokes-rate-stroke stroke (caar map))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
861 (if (or (and newscore score (< newscore score))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
862 (and newscore (null score)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
863 (setq score newscore
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
864 command (cdar map)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
865 (setq map (cdr map))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
866 (if score
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
867 (cons command score)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
868 nil))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
869 nil))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
870
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
871 ;;;###autoload
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
872 (defun strokes-read-stroke (&optional prompt event)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
873 "Read a simple stroke (interactively) and return the stroke.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
874 Optional PROMPT in minibuffer displays before and during stroke reading.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
875 This function will display the stroke interactively as it is being
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
876 entered in the strokes buffer if the variable
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
877 `strokes-use-strokes-buffer' is non-nil.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
878 Optional EVENT is currently not used, but hopefully will be soon."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
879 (save-excursion
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
880 (let ((pix-locs nil)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
881 (grid-locs nil)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
882 (event (or event (make-event))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
883 (if strokes-use-strokes-buffer
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
884 ;; switch to the strokes buffer and
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
885 ;; display the stroke as it's being read
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
886 (save-window-excursion
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
887 (set-window-configuration strokes-window-configuration)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
888 (if prompt
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
889 (progn
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
890 (setq event (next-event event prompt))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
891 (while (not (button-press-event-p event))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
892 (dispatch-event event)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
893 (setq event (next-event event)))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
894 (unwind-protect
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
895 (progn
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
896 (setq event (next-event event))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
897 (while (not (button-release-event-p event))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
898 (if (mouse-event-p event)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
899 (let ((point (event-closest-point event)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
900 (when point
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
901 (goto-char point)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
902 (subst-char-in-region point (1+ point) ?\ strokes-character))
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
903 (push (cons (event-x-pixel event)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
904 (event-y-pixel event))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
905 pix-locs)))
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
906 (setq event (next-event event))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
907 ;; protected
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
908 ;; clean up strokes buffer and then bury it.
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
909 (when (equal (buffer-name) strokes-buffer-name)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
910 (subst-char-in-region (point-min) (point-max) strokes-character ?\ )
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
911 (goto-char (point-min))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
912 (bury-buffer))))
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
913 ;; Otherwise, don't use strokes buffer and read stroke silently
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
914 (if prompt
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
915 (progn
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
916 (setq event (next-event event prompt))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
917 (while (not (button-press-event-p event))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
918 (dispatch-event event)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
919 (setq event (next-event event)))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
920 (setq event (next-event))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
921 (while (not (button-release-event-p event))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
922 (if (mouse-event-p event)
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
923 (push (cons (event-x-pixel event)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
924 (event-y-pixel event))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
925 pix-locs))
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
926 (setq event (next-event event))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
927 (setq grid-locs (strokes-renormalize-to-grid (nreverse pix-locs)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
928 (strokes-fill-stroke (strokes-eliminate-consecutive-redundancies grid-locs)))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
929
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
930 ;;;###autoload
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
931 (defun strokes-read-complex-stroke (&optional prompt event)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
932 "Read a complex stroke (interactively) and return the stroke.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
933 Optional PROMPT in minibuffer displays before and during stroke reading.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
934 Note that a complex stroke allows the user to pen-up and pen-down. This
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
935 is implemented by allowing the user to paint with button1 or button2 and
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
936 then complete the stroke with button3.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
937 Optional EVENT is currently not used, but hopefully will be soon."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
938 (save-excursion
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
939 (save-window-excursion
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
940 (set-window-configuration strokes-window-configuration)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
941 (let ((pix-locs nil)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
942 (grid-locs nil)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
943 (event (or event (next-event nil prompt))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
944 (if prompt
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
945 (while (not (button-press-event-p event))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
946 (dispatch-event event)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
947 (setq event (next-event event))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
948 (unwind-protect
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
949 (progn
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
950 (setq event (next-event event prompt))
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
951 (while (not (and (button-press-event-p event)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
952 (eq (event-button event) 3)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
953 (while (not (button-release-event-p event))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
954 (if (mouse-event-p event)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
955 (let ((point (event-closest-point event)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
956 (when point
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
957 (goto-char point)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
958 (subst-char-in-region point (1+ point) ?\ strokes-character))
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
959 (push (cons (event-x-pixel event)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
960 (event-y-pixel event))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
961 pix-locs)))
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
962 (setq event (next-event event prompt)))
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
963 (push strokes-lift pix-locs)
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
964 (while (not (button-press-event-p event))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
965 (dispatch-event event)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
966 (setq event (next-event event prompt))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
967 (setq pix-locs (nreverse (cdr pix-locs))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
968 grid-locs (strokes-renormalize-to-grid pix-locs))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
969 (strokes-fill-stroke
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
970 (strokes-eliminate-consecutive-redundancies grid-locs)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
971 ;; protected
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
972 (when (equal (buffer-name) strokes-buffer-name)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
973 (subst-char-in-region (point-min) (point-max) strokes-character ?\ )
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
974 (goto-char (point-min))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
975 (bury-buffer)))))))
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
976
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
977 (defun strokes-execute-stroke (stroke)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
978 "Given STROKE, execute the command which corresponds to it.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
979 The command will be executed provided one exists for that stroke,
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
980 based on the variable `strokes-minimum-match-score'.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
981 If no stroke matches, nothing is done and return value is nil."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
982 (let* ((match (strokes-match-stroke stroke strokes-global-map))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
983 (command (car match))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
984 (score (cdr match)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
985 (cond ((strokes-click-p stroke)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
986 ;; This is the case of a `click' type event
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
987 (command-execute strokes-click-command))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
988 ((and match (<= score strokes-minimum-match-score))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
989 (message "%s" command)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
990 (command-execute command))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
991 ((null strokes-global-map)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
992 (if (file-exists-p strokes-file)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
993 (and (y-or-n-p-maybe-dialog-box
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
994 (format "No strokes loaded. Load `%s'? "
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
995 strokes-file))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
996 (strokes-load-user-strokes))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
997 (error "No strokes defined; use `global-set-stroke'")))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
998 (t
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
999 (error
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1000 "No stroke matches; see variable `strokes-minimum-match-score'")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1001 nil))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1002
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1003 ;;;###autoload
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1004 (defun strokes-do-stroke (event)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1005 "Read a simple stroke from the user and then exectute its comand.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1006 This must be bound to a mouse event."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1007 (interactive "e")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1008 (or strokes-mode (strokes-mode t))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1009 (strokes-execute-stroke (strokes-read-stroke nil event)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1010
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1011 ;;;###autoload
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1012 (defun strokes-do-complex-stroke (event)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1013 "Read a complex stroke from the user and then exectute its command.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1014 This must be bound to a mouse event."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1015 (interactive "e")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1016 (or strokes-mode (strokes-mode t))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1017 (strokes-execute-stroke (strokes-read-complex-stroke nil event)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1018
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1019 ;;;###autoload
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1020 (defun strokes-describe-stroke (stroke)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1021 "Displays the command which STROKE maps to, reading STROKE interactively."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1022 (interactive
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1023 (list
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1024 (strokes-read-complex-stroke
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1025 "Enter stroke to describe; end with button3...")))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1026 (let* ((match (strokes-match-stroke stroke strokes-global-map))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1027 (command (or (and (strokes-click-p stroke)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1028 strokes-click-command)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1029 (car match)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1030 (score (cdr match)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1031 (if (or (and match
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1032 (<= score strokes-minimum-match-score))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1033 (and (strokes-click-p stroke)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1034 strokes-click-command))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1035 (message "That stroke maps to `%s'" command)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1036 (message "That stroke is undefined"))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1037 (sleep-for 1))) ; helpful for recursive edits
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1038
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1039 ;;;###autoload
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1040 (defalias 'describe-stroke 'strokes-describe-stroke)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1041
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1042 ;;;###autoload
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1043 (defun strokes-help ()
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1044 "Get instructional help on using the the `strokes' package."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1045 (interactive)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1046 (with-displaying-help-buffer
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1047 (function
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1048 (lambda ()
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1049 (save-excursion
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1050 (let ((helpdoc
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1051 "This is help for the strokes package.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1052
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1053 If you find something wrong with it, or feel that it can be improved
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1054 in some way, then please feel free to email me:
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1055
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1056 David Bakhash <cadet@mit.edu>
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1057
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1058 or just do
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1059
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1060 M-x strokes-report-bug
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1061
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1062 ------------------------------------------------------------
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1063
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1064 The strokes package allows you to define strokes (that you make with
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1065 the mouse or other pointer device) that XEmacs can interpret as
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1066 corresponding to commands, and then executes the commands. It does
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1067 character recognition, so you don't have to worry about getting it
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1068 right every time.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1069
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1070 Strokes are easy to program and fun to use. To start strokes going,
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1071 you'll want to put the following line in your .emacs file:
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1072
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1073 (and (fboundp 'device-on-window-system-p)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1074 (device-on-window-system-p)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1075 (require 'strokes))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1076
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1077 This will load strokes when and only when you start XEmacs on a window
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1078 system (i.e. that has a pointer (mouse) device, etc.).
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1079
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1080 To toggle strokes-mode, you just do
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1081
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1082 > M-x strokes-mode
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1083
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1084 When you're ready to start defining strokes, just use the command
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1085
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1086 > M-x global-set-stroke
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1087
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1088 You will see a ` *strokes*' buffer which is waiting for you to enter in
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1089 your stroke. When you enter in the stroke, you draw with button1 or
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1090 button2, and then end with button3. Next, you enter in the command
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1091 which will be executed when that stroke is invoked. Simple as that.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1092 For now, try to define a stroke to copy a region. This is a popular
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1093 edit command, so type
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1094
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1095 > M-x global-set-stroke
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1096
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1097 Then, in the ` *strokes*' buffer, draw the letter `C' (for `copy')
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1098 and then, when it asks you to enter the command to map that to, type
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1099
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1100 > copy-region-as-kill
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1101
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1102 That's about as hard as it gets.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1103 Remember: paint with button1 or button2 and then end with button3.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1104
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1105 If ever you want to know what a certain strokes maps to, then do
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1106
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1107 > M-x describe-stroke
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1108
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1109 and you can enter in any arbitrary stroke. Remember: The strokes
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1110 package lets you program in simple and complex (multi-lift) strokes.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1111 The only difference is how you *invoke* the two. You will most likely
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1112 use simple strokes, as complex strokes were developed for
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1113 Chinese/Japanese/Korean. So the middle mouse button (button2) will
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1114 invoke the command `strokes-do-stroke' in buffers where button2 doesn't
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1115 already have a meaning other than its original, which is `mouse-yank'.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1116 But don't worry: `mouse-yank' will still work with strokes (see the
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1117 variable `strokes-click-command').
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1118
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1119 If ever you define a stroke which you don't like, then you can unset
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1120 it with the command
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1121
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1122 > M-x strokes-unset-last-stroke
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1123
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1124 You can always get an idea of what your current strokes look like with
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1125 the command
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1126
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1127 > M-x list-strokes
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1128
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1129 Your strokes will be displayed in alphabetical order (based on command
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1130 names) and the beginning of each simple stroke will be marked by a
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1131 color dot. Since you may have several simple strokes in a complex
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1132 stroke, the dot colors are arranged in the rainbow color sequence,
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1133 `ROYGBIV'. If you want a listing of your strokes from most recent
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1134 down, then use a prefix argument:
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1135
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1136 > C-u M-x list-strokes
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1137
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1138 Your strokes are stored as you enter them. They get saved in a file
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1139 called ~/.strokes, along with other strokes configuration variables.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1140 You can change this location by setting the variable `strokes-file'.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1141 You will be prompted to save them when you exit XEmacs, or you can save
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1142 them with
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1143
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1144 > M-x save-strokes
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1145
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1146 Your strokes get loaded automatically when you enable `strokes-mode'.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1147 You can also load in your user-defined strokes with
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1148
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1149 > M-x load-user-strokes
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1150
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1151 A few more important things:
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1152
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1153 o The command `strokes-do-stroke' is also invoked with C-button2, so that you
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1154 can still enter a stroke in modes which use button2 for other things,
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1155 such as cross-referencing.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1156
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1157 o Complex strokes (i.e. `strokes-do-complex-stroke'), by default, use
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1158 Sh-button2.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1159
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1160 o Strokes are a bit computer-dependent in that they depend somewhat on
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1161 the speed of the computer you're working on. This means that you
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1162 may have to tweak some variables. You can read about them in the
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1163 commentary of `strokes.el'. Better to just use apropos and read their
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1164 docstrings. All variables/functions start with `strokes'. The one
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1165 variable which many people wanted to see was
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1166 `strokes-use-strokes-buffer' which allows the user to use strokes
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1167 silently--without displaying the strokes. All variables can be set
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1168 by customizing the group named `strokes' via the customization package:
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1169
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1170 > M-x customize
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1171
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1172 o A problem with strokes happens when you resize windows. If you
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1173 enlarge your XEmacs window a lot and realize that your strokes
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1174 buffer is not big enough, you may need to fix it with
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1175
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1176 > M-x strokes-update-window-configuration."))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1177 (princ helpdoc standard-output)))))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1178
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1179 (defun strokes-report-bug ()
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1180 "Submit a bug report for strokes."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1181 (interactive)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1182 (let ((reporter-prompt-for-summary-p t))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1183 (or (boundp 'reporter-version)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1184 (setq reporter-version
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1185 "Your version of reporter is obsolete. Please upgrade."))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1186 (reporter-submit-bug-report
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1187 strokes-bug-address "Strokes"
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1188 (cons
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1189 'strokes-version
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1190 (nconc
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1191 (mapcar
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1192 'intern
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1193 (sort
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1194 (let (completion-ignore-case)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1195 (all-completions "strokes-" obarray 'user-variable-p))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1196 'string-lessp))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1197 (list 'reporter-version)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1198 (function
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1199 (lambda ()
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1200 (save-excursion
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1201 (mail-position-on-field "subject")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1202 (beginning-of-line)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1203 (skip-chars-forward "^:\n")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1204 (if (looking-at ": Strokes;")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1205 (progn
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1206 (goto-char (match-end 0))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1207 (delete-char -1)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1208 (insert " " strokes-version " bug:")))))))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1209
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1210 (defsubst strokes-fill-current-buffer-with-whitespace ()
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1211 "Erase the contents of the current buffer and fill it with whitespace"
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1212 (erase-buffer)
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1213 (loop repeat (frame-height) do
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1214 (insert-char ?\ (1- (frame-width)))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1215 (newline))
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1216 (goto-char (point-min)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1217
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1218 (defun strokes-update-window-configuration ()
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1219 "Insure that `strokes-window-configuration' is up-to-date."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1220 (interactive)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1221 (let ((current-window (selected-window)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1222 (cond ((or (window-minibuffer-p current-window)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1223 (window-dedicated-p current-window))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1224 ;; don't try to update strokes window configuration
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1225 ;; if window is dedicated or a minibuffer
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1226 nil)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1227 ((or (interactive-p)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1228 (not (buffer-live-p (get-buffer strokes-buffer-name)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1229 (null strokes-window-configuration))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1230 ;; create `strokes-window-configuration' from scratch...
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1231 (save-excursion
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1232 (save-window-excursion
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1233 (get-buffer-create strokes-buffer-name)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1234 (set-window-buffer current-window strokes-buffer-name)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1235 (delete-other-windows)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1236 (fundamental-mode)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1237 (auto-save-mode 0)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1238 (if (featurep 'font-lock)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1239 (font-lock-mode 0))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1240 (abbrev-mode 0)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1241 (buffer-disable-undo (current-buffer))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1242 (setq truncate-lines nil)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1243 (strokes-fill-current-buffer-with-whitespace)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1244 (setq strokes-window-configuration (current-window-configuration))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1245 (bury-buffer))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1246 (t ; `strokes buffer' still exists...
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1247 ;; update the strokes-window-configuration for this specific frame...
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1248 (save-excursion
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1249 (save-window-excursion
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1250 (set-window-buffer current-window strokes-buffer-name)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1251 (delete-other-windows)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1252 (strokes-fill-current-buffer-with-whitespace)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1253 (setq strokes-window-configuration (current-window-configuration))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1254 (bury-buffer)))))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1255
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1256 ;;;###autoload
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1257 (defun strokes-load-user-strokes ()
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1258 "Load user-defined strokes from file named by `strokes-file'."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1259 (interactive)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1260 (cond ((and (file-exists-p strokes-file)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1261 (file-readable-p strokes-file))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1262 (load-file strokes-file))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1263 ((interactive-p)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1264 (error "Trouble loading user-defined strokes; nothing done"))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1265 (t
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1266 (message "No user-defined strokes, sorry"))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1267
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1268 ;;;###autoload
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1269 (defalias 'load-user-strokes 'strokes-load-user-strokes)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1270
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1271 (defun strokes-prompt-user-save-strokes ()
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1272 "Save user-defined strokes to file named by `strokes-file'."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1273 (interactive)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1274 (save-excursion
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1275 (let ((current strokes-global-map))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1276 (unwind-protect
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1277 (progn
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1278 (setq strokes-global-map nil)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1279 (strokes-load-user-strokes)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1280 (if (and (not (equal current strokes-global-map))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1281 (or (interactive-p)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1282 (yes-or-no-p-maybe-dialog-box "save your strokes? ")))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1283 (progn
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1284 (require 'pp) ; pretty-print variables
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1285 (message "Saving strokes in %s..." strokes-file)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1286 (get-buffer-create "*saved-strokes*")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1287 (set-buffer "*saved-strokes*")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1288 (erase-buffer)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1289 (emacs-lisp-mode)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1290 (goto-char (point-min))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1291 (insert-string
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1292 ";; -*- Syntax: Emacs-Lisp; Mode: emacs-lisp -*-\n")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1293 (insert-string (format ";;; saved strokes for %s, as of %s\n\n"
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1294 (user-full-name)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1295 (format-time-string "%B %e, %Y" nil)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1296 (message "Saving strokes in %s..." strokes-file)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1297 (insert-string (format "(setq strokes-global-map '%s)"
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1298 (pp current)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1299 (message "Saving strokes in %s..." strokes-file)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1300 (indent-region (point-min) (point-max) nil)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1301 (write-region (point-min)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1302 (point-max)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1303 strokes-file))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1304 (message "(no changes need to be saved)")))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1305 ;; protected
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1306 (if (get-buffer "*saved-strokes*")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1307 (kill-buffer (get-buffer "*saved-strokes*")))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1308 (setq strokes-global-map current)))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1309
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1310 (defalias 'save-strokes 'strokes-prompt-user-save-strokes)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1311
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1312 (defun strokes-toggle-strokes-buffer (&optional arg)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1313 "Toggle the use of the strokes buffer.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1314 In other words, toggle the variabe `strokes-use-strokes-buffer'.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1315 With ARG, use strokes buffer if and only if ARG is positive or true.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1316 Returns value of `strokes-use-strokes-buffer'."
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1317 (interactive "P")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1318 (setq strokes-use-strokes-buffer
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1319 (if arg (> (prefix-numeric-value arg) 0)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1320 (not strokes-use-strokes-buffer))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1321
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1322 (defun strokes-xpm-for-stroke (&optional stroke bufname b/w-only)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1323 "Create an xpm pixmap for the given STROKE in buffer `*strokes-xpm*'.
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1324 If STROKE is not supplied, then `strokes-last-stroke' will be used.
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1325 Optional BUFNAME to name something else.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1326 The pixmap will contain time information via rainbow dot colors
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1327 where each individual strokes begins.
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1328 Optional B/W-ONLY non-nil will create a mono pixmap, not intended
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1329 for trying to figure out the order of strokes, but rather for reading
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1330 the stroke as a character in some language."
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1331 (interactive)
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1332 (save-excursion
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1333 (let ((buf (get-buffer-create (or bufname "*strokes-xpm*")))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1334 (stroke (strokes-eliminate-consecutive-redundancies
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1335 (strokes-fill-stroke
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1336 (strokes-renormalize-to-grid (or stroke
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1337 strokes-last-stroke)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1338 31))))
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1339 (lift-flag t)
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1340 (rainbow-chars (list ?R ?O ?Y ?G ?B ?P))) ; ROYGBIV w/o indigo
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1341 (set-buffer buf)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1342 (erase-buffer)
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1343 (insert strokes-xpm-header)
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1344 (loop repeat 33 do
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1345 (insert-char ?\")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1346 (insert-char ?\ 33)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1347 (insert "\",")
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1348 (newline)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1349 finally
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1350 (forward-line -1)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1351 (end-of-line)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1352 (insert "}\n"))
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1353 (loop for point in stroke
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1354 for x = (car-safe point)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1355 for y = (cdr-safe point) do
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1356 (cond ((consp point)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1357 ;; draw a point, and possibly a starting-point
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1358 (if (and lift-flag (not b/w-only))
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1359 ;; mark starting point with the appropriate color
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1360 (let ((char (or (car rainbow-chars) ?\.)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1361 (loop for i from 0 to 2 do
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1362 (loop for j from 0 to 2 do
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1363 (goto-line (+ 16 i y))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1364 (forward-char (+ 1 j x))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1365 (delete-char 1)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1366 (insert-char char)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1367 (setq rainbow-chars (cdr rainbow-chars)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1368 lift-flag nil))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1369 ;; Otherwise, just plot the point...
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1370 (goto-line (+ 17 y))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1371 (forward-char (+ 2 x))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1372 (subst-char-in-region (point) (1+ (point)) ?\ ?\*)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1373 ((strokes-lift-p point)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1374 ;; a lift--tell the loop to X out the next point...
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1375 (setq lift-flag t))))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1376 (when (interactive-p)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1377 (require 'xpm-mode)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1378 (pop-to-buffer "*strokes-xpm*")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1379 ;; (xpm-mode 1)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1380 (xpm-show-image)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1381 (goto-char (point-min))))))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1382
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1383 ;;; Strokes Edit stuff...
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1384
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1385 (defun strokes-edit-quit ()
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1386 (interactive)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1387 (or (one-window-p t 0)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1388 (delete-window))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1389 (kill-buffer "*Strokes List*"))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1390
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1391 (define-derived-mode edit-strokes-mode list-mode
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1392 "Edit-Strokes"
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1393 "Major mode for `edit-strokes' and `list-strokes' buffers.
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1394
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1395 Editing commands:
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1396
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1397 \\{edit-strokes-mode-map}"
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1398 (setq truncate-lines nil
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1399 auto-show-mode nil ; don't want problems here either
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1400 mode-popup-menu edit-strokes-menu) ; what about extent-specific stuff?
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1401 (and (featurep 'menubar)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1402 current-menubar
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1403 (set (make-local-variable 'current-menubar)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1404 (copy-sequence current-menubar))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1405 (add-submenu nil edit-strokes-menu)))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1406
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1407 (let ((map edit-strokes-mode-map))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1408 (define-key map "<" 'beginning-of-buffer)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1409 (define-key map ">" 'end-of-buffer)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1410 ;; (define-key map "c" 'strokes-copy-other-face)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1411 ;; (define-key map "C" 'strokes-copy-this-face)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1412 ;; (define-key map "s" 'strokes-smaller)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1413 ;; (define-key map "l" 'strokes-larger)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1414 ;; (define-key map "b" 'strokes-bold)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1415 ;; (define-key map "i" 'strokes-italic)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1416 (define-key map "e" 'strokes-list-edit)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1417 ;; (define-key map "f" 'strokes-font)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1418 ;; (define-key map "u" 'strokes-underline)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1419 ;; (define-key map "t" 'strokes-truefont)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1420 ;; (define-key map "F" 'strokes-foreground)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1421 ;; (define-key map "B" 'strokes-background)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1422 ;; (define-key map "D" 'strokes-doc-string)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1423 (define-key map "a" 'strokes-global-set-stroke)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1424 (define-key map "d" 'strokes-list-delete-stroke)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1425 ;; (define-key map "n" 'strokes-list-next)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1426 ;; (define-key map "p" 'strokes-list-prev)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1427 ;; (define-key map " " 'strokes-list-next)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1428 ;; (define-key map "\C-?" 'strokes-list-prev)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1429 (define-key map "g" 'strokes-list-strokes) ; refresh display
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1430 (define-key map "q" 'strokes-edit-quit)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1431 (define-key map [(control c) (control c)] 'bury-buffer))
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1432
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1433 ;;;###autoload
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1434 (defun strokes-edit-strokes (&optional chronological strokes-map)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1435 ;; ### DEAL WITH THE 2nd ARGUMENT ISSUE! ###
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1436 "Edit strokes in a pop-up buffer containing strokes and their definitions.
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1437 If STROKES-MAP is not given, `strokes-global-map' will be used instead.
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1438
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1439 Editing commands:
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1440
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1441 \\{edit-faces-mode-map}"
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1442 (interactive "P")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1443 (pop-to-buffer (get-buffer-create "*Strokes List*"))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1444 (reset-buffer (current-buffer)) ; handy function from minibuf.el
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1445 (setq strokes-map (or strokes-map
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1446 strokes-global-map
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1447 (progn
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1448 (strokes-load-user-strokes)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1449 strokes-global-map)))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1450 (or chronological
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1451 (setq strokes-map (sort (copy-sequence strokes-map)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1452 'strokes-alphabetic-lessp)))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1453 ;; (push-window-configuration)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1454 (insert
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1455 "Command Stroke\n"
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1456 "------- ------")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1457 (loop for def in strokes-map
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1458 for i from 0 to (1- (length strokes-map)) do
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1459 (let ((stroke (car def))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1460 (command-name (symbol-name (cdr def))))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1461 (strokes-xpm-for-stroke stroke " *strokes-xpm*")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1462 (newline 2)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1463 (insert-char ?\ 45)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1464 (beginning-of-line)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1465 (insert command-name)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1466 (beginning-of-line)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1467 (forward-char 45)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1468 (set (intern (format "strokes-list-annotation-%d" i))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1469 (make-annotation (make-glyph
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1470 (list
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1471 (vector 'xpm
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1472 :data (buffer-substring
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1473 (point-min " *strokes-xpm*")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1474 (point-max " *strokes-xpm*")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1475 " *strokes-xpm*"))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1476 [string :data "[Stroke]"]))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1477 (point) 'text))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1478 (set-annotation-data (symbol-value (intern (format "strokes-list-annotation-%d" i)))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1479 def))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1480 finally do (kill-region (1+ (point)) (point-max)))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1481 (edit-strokes-mode)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1482 (goto-char (point-min)))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1483
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1484 ;;;###autoload
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1485 (defalias 'edit-strokes 'strokes-edit-strokes)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1486
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1487 ;;;###autoload
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1488 (defun strokes-list-strokes (&optional chronological strokes-map)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1489 "Pop up a buffer containing an alphabetical listing of strokes in STROKES-MAP.
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1490 With CHRONOLOGICAL prefix arg \(\\[universal-argument]\) list strokes
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1491 chronologically by command name.
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1492 If STROKES-MAP is not given, `strokes-global-map' will be used instead."
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1493 (interactive "P")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1494 (setq strokes-map (or strokes-map
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1495 strokes-global-map
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1496 (progn
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1497 (strokes-load-user-strokes)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1498 strokes-global-map)))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1499 (if (not chronological)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1500 ;; then alphabetize the strokes based on command names...
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1501 (setq strokes-map (sort (copy-sequence strokes-map)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1502 'strokes-alphabetic-lessp)))
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1503 (push-window-configuration)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1504 (set-buffer (get-buffer-create "*Strokes List*"))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1505 (setq buffer-read-only nil)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1506 (erase-buffer)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1507 (insert
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1508 "Command Stroke\n"
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1509 "------- ------")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1510 (loop for def in strokes-map do
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1511 (let ((stroke (car def))
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1512 (command-name (symbol-name (cdr def))))
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1513 (strokes-xpm-for-stroke stroke " *strokes-xpm*")
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1514 (newline 2)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1515 (insert-char ?\ 45)
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1516 (beginning-of-line)
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1517 (insert command-name)
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1518 (beginning-of-line)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1519 (forward-char 45)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1520 (make-annotation (make-glyph
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1521 (list
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1522 (vector 'xpm
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1523 :data (buffer-substring
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1524 (point-min " *strokes-xpm*")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1525 (point-max " *strokes-xpm*")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1526 " *strokes-xpm*"))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1527 [string :data "[Image]"]))
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1528 (point) 'text))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1529 finally do (kill-region (1+ (point)) (point-max)))
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1530 (view-buffer "*Strokes List*" t)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1531 (goto-char (point-min))
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1532 (define-key view-minor-mode-map [(q)] (lambda ()
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1533 (interactive)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1534 (view-quit)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1535 (pop-window-configuration)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1536 ;; (bury-buffer "*Strokes List*")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1537 (define-key view-minor-mode-map [(q)] 'view-quit))))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1538
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1539 (defun strokes-alphabetic-lessp (stroke1 stroke2)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1540 "T iff command name for STROKE1 is less than STROKE2's in lexicographic order."
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1541 (let ((command-name-1 (symbol-name (cdr stroke1)))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1542 (command-name-2 (symbol-name (cdr stroke2))))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1543 (string-lessp command-name-1 command-name-2)))
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1544
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1545 ;;;###autoload
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1546 (defalias 'list-strokes 'strokes-list-strokes)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1547
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1548 ;;;###autoload
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1549 (defun strokes-mode (&optional arg)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1550 "Toggle strokes being enabled.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1551 With ARG, turn strokes on if and only if ARG is positive or true.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1552 Note that `strokes-mode' is a global mode. Think of it as a minor
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1553 mode in all buffers when activated.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1554 By default, strokes are invoked with mouse button-2. You can define
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1555 new strokes with
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1556
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1557 > M-x global-set-stroke"
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1558 (interactive "P")
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1559 (let ((on-p (if arg
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1560 (> (prefix-numeric-value arg) 0)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1561 (not strokes-mode))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1562 (cond ((not (device-on-window-system-p))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1563 (error "Can't use strokes without windows"))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1564 (on-p ; turn on strokes
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1565 (and (file-exists-p strokes-file)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1566 (null strokes-global-map)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1567 (strokes-load-user-strokes))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1568 (add-hook 'kill-emacs-hook
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1569 'strokes-prompt-user-save-strokes)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1570 (add-hook 'select-frame-hook
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1571 'strokes-update-window-configuration)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1572 (strokes-update-window-configuration)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1573 (define-key global-map [(button2)] 'strokes-do-stroke)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1574 (define-key global-map [(control button2)] 'strokes-do-stroke)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1575 (define-key global-map [(shift button2)]
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1576 'strokes-do-complex-stroke)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1577 (ad-activate-regexp "^strokes-") ; advise button2 commands
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1578 (setq strokes-mode t))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1579 (t ; turn off strokes
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1580 (if (get-buffer strokes-buffer-name)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1581 (kill-buffer (get-buffer strokes-buffer-name)))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1582 (remove-hook 'select-frame-hook
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1583 'strokes-update-window-configuration)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1584 (if (string-match "^strokes-" (symbol-name (key-binding [(button2)])))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1585 (define-key global-map [(button2)] strokes-click-command))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1586 (if (string-match "^strokes-" (symbol-name (key-binding [(control button2)])))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1587 (global-unset-key [(control button2)]))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1588 (if (string-match "^strokes-" (symbol-name (key-binding [(shift button2)])))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1589 (global-unset-key [(shift button2)]))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1590 (ad-deactivate-regexp "^strokes-") ; unadvise strokes-button2 commands
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1591 (setq strokes-mode nil))))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1592 (redraw-modeline))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1593
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1594 (add-minor-mode 'strokes-mode strokes-modeline-string nil nil 'strokes-mode)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1595
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1596 (unless (find-face 'strokes-char-face)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1597 (copy-face 'default 'strokes-char-face)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1598 (set-face-background 'strokes-char-face "lightgray"))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1599
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1600 (defconst strokes-char-value-hashtable (make-hashtable 62) ;
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1601 ; (make-char-table
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1602 ; 'syntax)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1603 ; in 20.*
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1604 ;; ### This will become a char-table for XEmacs-20 !!! ###
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1605 "The table which stores values for the character keys.")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1606 (puthash ?0 0 strokes-char-value-hashtable) ; (put-char-table ?0 0
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1607 ; strokes-value-chartable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1608 ; in 20.*
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1609 (puthash ?1 1 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1610 (puthash ?2 2 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1611 (puthash ?3 3 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1612 (puthash ?4 4 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1613 (puthash ?5 5 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1614 (puthash ?6 6 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1615 (puthash ?7 7 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1616 (puthash ?8 8 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1617 (puthash ?9 9 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1618 (puthash ?a 10 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1619 (puthash ?b 11 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1620 (puthash ?c 12 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1621 (puthash ?d 13 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1622 (puthash ?e 14 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1623 (puthash ?f 15 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1624 (puthash ?g 16 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1625 (puthash ?h 17 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1626 (puthash ?i 18 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1627 (puthash ?j 19 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1628 (puthash ?k 20 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1629 (puthash ?l 21 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1630 (puthash ?m 22 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1631 (puthash ?n 23 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1632 (puthash ?o 24 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1633 (puthash ?p 25 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1634 (puthash ?q 26 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1635 (puthash ?r 27 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1636 (puthash ?s 28 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1637 (puthash ?t 29 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1638 (puthash ?u 30 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1639 (puthash ?v 31 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1640 (puthash ?w 32 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1641 (puthash ?x 33 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1642 (puthash ?y 34 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1643 (puthash ?z 35 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1644 (puthash ?A 36 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1645 (puthash ?B 37 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1646 (puthash ?C 38 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1647 (puthash ?D 39 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1648 (puthash ?E 40 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1649 (puthash ?F 41 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1650 (puthash ?G 42 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1651 (puthash ?H 43 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1652 (puthash ?I 44 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1653 (puthash ?J 45 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1654 (puthash ?K 46 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1655 (puthash ?L 47 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1656 (puthash ?M 48 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1657 (puthash ?N 49 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1658 (puthash ?O 50 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1659 (puthash ?P 51 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1660 (puthash ?Q 52 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1661 (puthash ?R 53 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1662 (puthash ?S 54 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1663 (puthash ?T 55 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1664 (puthash ?U 56 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1665 (puthash ?V 57 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1666 (puthash ?W 58 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1667 (puthash ?X 59 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1668 (puthash ?Y 60 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1669 (puthash ?Z 61 strokes-char-value-hashtable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1670
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1671 (defconst strokes-base64-chars
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1672 ;; I can easily have made this a vector of single-character strings,
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1673 ;; like (vector "0" "1" "2" ...), and then the program would run
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1674 ;; faster since it wouldn't then have to call `char-to-string' when it
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1675 ;; did the `concat'. I left them as chars here because I want
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1676 ;; *them* to change `concat' so that it accepts chars and deals with
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1677 ;; them properly. i.e. the form: (concat "abc" ?T "xyz") should
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1678 ;; return "abcTxyz" NOT "abc84xyz" (XEmacs 19.*) and NOT an error
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1679 ;; (XEmacs 20.*).
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1680 ;; (vector "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1681 ;; "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o"
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1682 ;; "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z" "A" "B" "C" "D"
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1683 ;; "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S"
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1684 ;; "T" "U" "V" "W" "X" "Y" "Z")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1685 (vector ?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1686 ?a ?b ?c ?d ?e ?f ?g ?h ?i ?j ?k ?l ?m ?n ?o ?p ?q ?r ?s ?t ?u ?v ?w ?x ?y ?z
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1687 ?A ?B ?C ?D ?E ?F ?G ?H ?I ?J ?K ?L ?M ?N ?O ?P ?Q ?R ?S ?T ?U ?V ?W ?X ?Y ?Z)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1688 "Character vector for fast lookup of base-64 encoding of numbers in [0,61].")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1689
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1690 (defsubst strokes-xpm-char-on-p (char)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1691 ;; ### CAUTION: `char-equal' may need to change to `char=' ###
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1692 "Non-nil if CHAR represents an `on' bit in the xpm."
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1693 (char-equal char ?*))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1694
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1695 (defsubst strokes-xpm-char-bit-p (char)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1696 "Non-nil if CHAR represents an `on' or `off' bit in the xpm."
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1697 ;; ### CAUTION: `char-equal' may need to change to `char=' ###
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1698 (or (char-equal char ?\ )
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1699 (char-equal char ?*)))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1700
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1701 ;;(defsubst strokes-xor (a b) ### Should I make this an inline function? ###
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1702 ;; "T iff one and only one of A and B is non-nil; otherwise, returns nil.
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1703 ;;NOTE: Don't use this as a numeric xor since it treats all non-nil
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1704 ;; values as t including `0' (zero)."
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1705 ;; (eq (null a) (not (null b))))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1706
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1707 (defsubst strokes-xpm-encode-length-as-string (length)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1708 "Given some LENGTH in [0,62) do a fast lookup of it's encoding."
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1709 (char-to-string (aref strokes-base64-chars length)))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1710
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1711 (defsubst strokes-xpm-decode-char (character)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1712 "Given a CHARACTER, do a fast lookup to find its corresponding integer value."
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1713 ;; ### NOTE: for XEmacs-20.* this will need to be changed to deal w/
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1714 ;; char-tables !!! ###
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1715 (gethash character strokes-char-value-hashtable)) ; (get-char-table
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1716 ; character
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1717 ; strokes-value-chartable)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1718
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1719 (defun strokes-xpm-to-compressed-string (&optional xpm-buffer)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1720 "Convert the xpm in XPM-BUFFER into a compressed string representing the stroke.
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1721 XPM-BUFFER is an optional argument, and defaults to `*strokes-xpm*'."
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1722 (save-excursion
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1723 (set-buffer (setq xpm-buffer (or xpm-buffer "*strokes-xpm*")))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1724 (goto-char (point-min))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1725 (search-forward "/* pixels */") ; skip past header junk
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1726 (forward-char 2)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1727 ;; a note for below:
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1728 ;; the `current-char' is the char being counted -- NOT the char at (point)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1729 ;; which happens to be called `char-at-point'
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1730 (let ((compressed-string "+/") ; initialize the output
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1731 (count 0) ; keep a current count of
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1732 ; `current-char'
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1733 (last-char-was-on-p t) ; last entered stream
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1734 ; represented `on' bits
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1735 (current-char-is-on-p nil) ; current stream represents `on' bits
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1736 (char-at-point (char-after))) ; read the first char
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1737 (while (not (char-equal char-at-point ?})) ; a `}' denotes the
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1738 ; end of the pixmap
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1739 (cond ((zerop count) ; must restart counting
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1740 ;; check to see if the `char-at-point' is an actual pixmap bit
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1741 (when (strokes-xpm-char-bit-p char-at-point)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1742 (setq count 1
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1743 current-char-is-on-p (strokes-xpm-char-on-p char-at-point)))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1744 (forward-char 1))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1745 ((= count 61) ; maximum single char's
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1746 ; encoding length
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1747 (setq compressed-string (concat compressed-string
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1748 ;; add a zero-length
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1749 ;; encoding when
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1750 ;; necessary
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1751 (when (eq last-char-was-on-p
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1752 current-char-is-on-p)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1753 ;; "0"
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1754 (strokes-xpm-encode-length-as-string 0))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1755 (strokes-xpm-encode-length-as-string 61))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1756 last-char-was-on-p current-char-is-on-p
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1757 count 0)) ; note that we just set
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1758 ; count=0 and *don't* advance
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1759 ; (point)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1760 ((strokes-xpm-char-bit-p char-at-point) ; an actual xpm bit
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1761 (if (eq current-char-is-on-p
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1762 (strokes-xpm-char-on-p char-at-point))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1763 ;; yet another of the same bit-type, so we continue
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1764 ;; counting...
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1765 (progn
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1766 (incf count)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1767 (forward-char 1))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1768 ;; otherwise, it's the opposite bit-type, so we do a
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1769 ;; write and then restart count ### NOTE (for myself
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1770 ;; to be aware of) ### I really should advance
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1771 ;; (point) in this case instead of letting another
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1772 ;; iteration go through and letting the case: count=0
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1773 ;; take care of this stuff for me. That's why
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1774 ;; there's no (forward-char 1) below.
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1775 (setq compressed-string (concat compressed-string
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1776 ;; add a zero-length
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1777 ;; encoding when
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1778 ;; necessary
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1779 (when (eq last-char-was-on-p
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1780 current-char-is-on-p)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1781 ;; "0"
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1782 (strokes-xpm-encode-length-as-string 0))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1783 (strokes-xpm-encode-length-as-string count))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1784 count 0
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1785 last-char-was-on-p current-char-is-on-p)))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1786 (t ; ELSE it's some other useless
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1787 ; char, like `"' or `,'
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1788 (forward-char 1)))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1789 (setq char-at-point (char-after)))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1790 (concat compressed-string
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1791 (when (> count 0)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1792 (concat (when (eq last-char-was-on-p
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1793 current-char-is-on-p)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1794 ;; "0"
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1795 (strokes-xpm-encode-length-as-string 0))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1796 (strokes-xpm-encode-length-as-string count)))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1797 "/"))))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1798
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1799 (defun strokes-strokify-buffer (&optional buffer)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1800 "Decode stroke strings in BUFFER and display their corresponding glyphs.
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1801 BUFFER defaults to the current buffer."
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1802 (interactive)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1803 ;; (interactive "*bStrokify buffer: ")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1804 (save-excursion
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1805 (set-buffer (or buffer (setq buffer (current-buffer))))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1806 (if (interactive-p)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1807 (message "Strokifying %s..." buffer))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1808 (goto-char (point-min))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1809 (let (ext string)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1810 ;; The comment below is what i'd have to do if I wanted to deal with
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1811 ;; random newlines in the midst of the compressed strings.
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1812 ;; If I do this, I'll also have to change `strokes-xpm-to-compress-string'
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1813 ;; to deal with the newline, and possibly other whitespace stuff. YUCK!
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1814 ;; (while (re-search-forward "\\+/\\(\\w\\|
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1815 ;;\\)+/" nil t nil (get-buffer buffer))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1816 (while (re-search-forward "\\+/\\w+/" nil t nil (get-buffer buffer))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1817 (setq string (buffer-substring (+ 2 (match-beginning 0))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1818 (1- (match-end 0))))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1819 (strokes-xpm-for-compressed-string string " *strokes-xpm*")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1820 (replace-match " ")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1821 (setq ext (make-extent (1- (point)) (point)))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1822 (set-extent-property ext 'type 'stroke-glyph)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1823 (set-extent-property ext 'start-open t)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1824 (set-extent-property ext 'end-open t)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1825 (set-extent-property ext 'detachable t)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1826 (set-extent-property ext 'duplicable t)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1827 (set-extent-property ext 'data string)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1828 (set-extent-face ext 'strokes-char-face)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1829 (set-extent-end-glyph ext (make-glyph
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1830 (list
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1831 (vector 'xpm
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1832 :data (buffer-substring
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1833 (point-min " *strokes-xpm*")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1834 (point-max " *strokes-xpm*")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1835 " *strokes-xpm*"))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1836 [string :data "[Stroke]"])))))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1837 (if (interactive-p)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1838 (message "Strokifying %s...done" buffer))))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1839
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1840 (defun strokes-unstrokify-buffer (&optional buffer)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1841 "Convert the glyphs in BUFFER to thier base-64 ASCII representations.
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1842 BUFFER defaults to the current buffer"
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1843 ;; ### NOTE !!! ### (for me)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1844 ;; For later on, you can/should make the inserted strings atomic
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1845 ;; extents, so that the users have a clue that they shouldn't be
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1846 ;; editing inside them. Plus, if you make them extents, you can
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1847 ;; very easily just hide the glyphs, so if you unstrokify, and the
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1848 ;; restrokify, then those that already are glyphed don't need to be
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1849 ;; re-calculated, etc. It's just nicer that way. The only things
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1850 ;; to worry about is cleanup (i.e. do the glyphs get gc'd when the
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1851 ;; buffer is killed?
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1852 ;; (interactive "*bUnstrokify buffer: ")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1853 (interactive)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1854 (save-excursion
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1855 (set-buffer (setq buffer (or buffer (current-buffer))))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1856 ;; (map-extents
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1857 ;; (lambda (ext buf)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1858 ;; (when (eq (extent-property ext 'type) 'stroke-glyph)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1859 ;; (goto-char (extent-start-position ext))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1860 ;; (delete-char 1) ; ### What the hell do I do here? ###
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1861 ;; (insert "+/" (extent-property ext 'data) "/")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1862 ;; (delete-extent ext))))))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1863 (let (start)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1864 (map-extents
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1865 (lambda (ext buf)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1866 (when (eq (extent-property ext 'type) 'stroke-glyph)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1867 (setq start (goto-char (extent-start-position ext)))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1868 ;; (insert "+/" (extent-property ext 'data) "/")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1869 (insert-string "+/")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1870 (insert-string (extent-property ext 'data))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1871 (insert-string "/")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1872 (delete-char 1)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1873 (set-extent-endpoints ext start (point))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1874 (set-extent-property ext 'type 'stroke-string)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1875 (set-extent-property ext 'atomic t)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1876 ;; (set-extent-property ext 'read-only t)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1877 (set-extent-face ext 'strokes-char-face)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1878 (set-extent-property ext 'stroke-glyph (extent-end-glyph ext))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1879 (set-extent-end-glyph ext nil)))))))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1880
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1881 (defun strokes-xpm-for-compressed-string (compressed-string &optional bufname)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1882 "Convert the stroke represented by COMPRESSED-STRING into an xpm.
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1883 Store xpm in buffer BUFNAME if supplied \(default is `*strokes-xpm*'\)"
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1884 (save-excursion
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1885 (or bufname (setq bufname "*strokes-xpm*"))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1886 (erase-buffer (set-buffer (get-buffer-create bufname)))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1887 (insert compressed-string)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1888 (goto-char (point-min))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1889 (let ((current-char-is-on-p nil))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1890 (while (not (eobp))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1891 (insert-char
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1892 (if current-char-is-on-p
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1893 ?*
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1894 ?\ )
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1895 (strokes-xpm-decode-char (char-after)))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1896 (delete-char 1)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1897 (setq current-char-is-on-p (not current-char-is-on-p)))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1898 (goto-char (point-min))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1899 (loop repeat 33 do
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1900 (insert-char ?\")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1901 (forward-char 33)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1902 (insert "\",\n"))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1903 (goto-char (point-min))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1904 (insert strokes-xpm-header))))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1905
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1906 (defun strokes-compose-complex-stroke ()
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1907 (interactive "*")
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1908 (let ((strokes-grid-resolution 33))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1909 (strokes-read-complex-stroke)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1910 (strokes-xpm-for-stroke nil nil t)
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1911 (insert (strokes-xpm-to-compressed-string))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1912 (strokes-strokify-buffer)))
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1913
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1914 (provide 'strokes)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1915 (run-hooks 'strokes-load-hook)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1916
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 153
diff changeset
1917 ;;; strokes.el ends here