changeset 19347:bdac48dda163

Many changes.
author Richard M. Stallman <rms@gnu.org>
date Thu, 14 Aug 1997 21:59:05 +0000
parents 69538f436b92
children bdcb6282a658
files lisp/strokes.el
diffstat 1 files changed, 208 insertions(+), 204 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/strokes.el	Thu Aug 14 13:58:31 1997 +0000
+++ b/lisp/strokes.el	Thu Aug 14 21:59:05 1997 +0000
@@ -1,10 +1,9 @@
-;;; strokes.el	-- Control Emacs through mouse strokes --
+;;; strokes.el --- control Emacs through mouse strokes
 
 ;; Copyright (C) 1997 Free Software Foundation, Inc.
 
 ;; Author: David Bakhash <cadet@mit.edu>
 ;; Maintainer: David Bakhash <cadet@mit.edu>
-;; Created: 12 April 1997
 ;; Keywords: lisp, mouse, extensions
 
 ;; This file is part of GNU Emacs.
@@ -195,10 +194,9 @@
 
 (autoload 'reporter-submit-bug-report "reporter")
 (autoload 'mail-position-on-field "sendmail")
-(eval-when-compile
-  (mapcar 'require '(pp reporter advice)))
-
-(require 'levents)
+(eval-and-compile
+  (mapcar 'require '(pp reporter advice custom cl))
+  (mapcar 'load '("cl-macs" "cl-seq" "levents")))
 
 ;;; Constants...
 
@@ -213,6 +211,14 @@
 
 ;;; user variables...
 
+;; suggested Custom hack, so strokes is compatible with emacs19...
+
+(eval-and-compile
+  (if (fboundp 'defgroup) nil 
+    (defmacro defgroup (&rest forms) nil)  
+    (defmacro defcustom (name init doc &rest forms)  
+      (list 'defvar name init doc))))
+
 (defgroup strokes nil
   "Control Emacs through mouse strokes"
   :group 'mouse)
@@ -224,7 +230,7 @@
 
 (defcustom strokes-character ?@
   "*Character used when drawing strokes in the strokes buffer.
-\(The default is lower-case `o', which works okay\)."
+\(The default is lower-case `@', which works okay\)."
   :type 'character
   :group 'strokes)
 
@@ -316,12 +322,12 @@
 
 (defsubst strokes-click-p (stroke)
   "Non-nil if STROKE is really click."
-  (< (length stroke) 3))
+  (< (length stroke) 2))
 
 ;;; old, but worked pretty good (just in case)...
 ;;(defmacro strokes-define-stroke (stroke-map stroke def)
 ;;  "Add STROKE to STROKE-MAP alist with given command DEF"
-;;  (list 'if (list '< (list 'length stroke) 3)
+;;  (list 'if (list '< (list 'length stroke) 2)
 ;;	(list 'error
 ;;	      "That's a click, not a stroke.  See `strokes-click-command'")
 ;;	(list 'setq stroke-map (list 'cons (list 'cons stroke def)
@@ -407,7 +413,7 @@
              ;; then strokes is no good and we'll have to use the original
              ad-do-it
            ;; otherwise, we can make strokes work too...
-	     (let ((strokes-click-command
+	   (let ((strokes-click-command
                   ',(intern (format "ad-Orig-%s" command))))
              (strokes-do-stroke (ad-get-arg 0))))))))
 
@@ -494,7 +500,7 @@
 	    (if (windowp end-w)
 		(nth 1 (window-edges end-w))
 	      (/ (cdr (posn-x-y (event-end event)))
-		 ((frame-char-height end-w)))))
+		 (frame-char-height end-w))))
       (if (>= end-w-top w-top)
 	  (strokes-event-closest-point-1 start-window)
 	(window-start start-window)))))
@@ -507,7 +513,7 @@
   "Undo the last stroke definition."
   (interactive)
   (let ((command (cdar strokes-global-map)))
-    (if (y-or-n-p-maybe-dialog-box
+    (if (y-or-n-p
 	 (format "really delete last stroke definition, defined to `%s'? "
 		 command))
 	(progn
@@ -829,58 +835,61 @@
 This function will display the stroke interactively as it is being
 entered in the strokes buffer if the variable
 `strokes-use-strokes-buffer' is non-nil.
-Optional EVENT is currently not used, but hopefully will be soon."
+Optional EVENT is acceptable as the starting event of the stroke"
   (save-excursion
-    (track-mouse
-      (let ((pix-locs nil)
-	    (grid-locs nil)
-	    (event nil))
-	(if strokes-use-strokes-buffer
-	    ;; switch to the strokes buffer and
-	    ;; display the stroke as it's being read
-	    (save-window-excursion
-	      (set-window-configuration strokes-window-configuration)
-	      (if prompt
-		  (progn
-		    (message prompt)
-		    (setq event (read-event))
-		    (while (not (button-press-event-p event))
-		      (setq event (read-event)))))
-	      (unwind-protect
-		  (progn
-		    (setq event (read-event))
-		    (while (not (button-release-event-p event))
-		      (if (strokes-mouse-event-p event)
-			  (let ((point (strokes-event-closest-point event)))
-			    (when point
-			      (goto-char point)
-			      (subst-char-in-region point (1+ point) ?\  strokes-character))
-			    (push (cons (event-x-pixel event)
-					(event-y-pixel event))
-				  pix-locs)))
-		      (setq event (read-event))))
-		;; protected
-		;; clean up strokes buffer and then bury it.
-		(when (equal (buffer-name) strokes-buffer-name)
-		  (subst-char-in-region (point-min) (point-max) strokes-character ?\ )
-		  (goto-char (point-min))
-		  (bury-buffer))))
-	  ;; Otherwise, don't use strokes buffer and read stroke silently
-	  (if prompt
-	      (progn
-		(message prompt)
-		(setq event (read-event))
-		(while (not (button-press-event-p event))
-		  (setq event (read-event)))))
-	  (setq event (read-event))
-	  (while (not (button-release-event-p event))
-	    (if (strokes-mouse-event-p event)
-		(push (cons (event-x-pixel event)
-			    (event-y-pixel event))
-		      pix-locs))
-	    (setq event (read-event))))
-	(setq grid-locs (strokes-renormalize-to-grid (nreverse pix-locs)))
-	(strokes-fill-stroke (strokes-eliminate-consecutive-redundancies grid-locs))))))
+    (let ((pix-locs nil)
+	  (grid-locs nil)
+	  (safe-to-draw-p nil))
+      (if strokes-use-strokes-buffer
+	  ;; switch to the strokes buffer and
+	  ;; display the stroke as it's being read
+	  (save-window-excursion
+	    (set-window-configuration strokes-window-configuration)
+	    (when prompt
+	      (message prompt)
+	      (setq event (read-event))
+	      (or (button-press-event-p event)
+		  (error "You must draw with the mouse")))
+	    (unwind-protect
+		(track-mouse
+		  (or event (setq event (read-event)
+				  safe-to-draw-p t))
+		  (while (not (button-release-event-p event))
+		    (if (strokes-mouse-event-p event)
+			(let ((point (strokes-event-closest-point event)))
+			  (if (and point safe-to-draw-p)
+			      ;; we can draw that point
+			      (progn
+				(goto-char point)
+				(subst-char-in-region point (1+ point) ?\  strokes-character))
+			    ;; otherwise, we can start drawing the next time...
+			    (setq safe-to-draw-p t))
+			  (push (cons (event-x-pixel event)
+				      (event-y-pixel event))
+				pix-locs)))
+		    (setq event (read-event)))))
+	    ;; protected
+	    ;; clean up strokes buffer and then bury it.
+	    (when (equal (buffer-name) strokes-buffer-name)
+	      (subst-char-in-region (point-min) (point-max) strokes-character ?\ )
+	      (goto-char (point-min))
+	      (bury-buffer))))
+      ;; Otherwise, don't use strokes buffer and read stroke silently
+      (when prompt
+	(message prompt)
+	(setq event (read-event))
+	(or (button-press-event-p event)
+	    (error "You must draw with the mouse")))
+      (track-mouse
+	(or event (setq event (read-event)))
+	(while (not (button-release-event-p event))
+	  (if (strokes-mouse-event-p event)
+	      (push (cons (event-x-pixel event)
+			  (event-y-pixel event))
+		    pix-locs))
+	  (setq event (read-event))))
+      (setq grid-locs (strokes-renormalize-to-grid (nreverse pix-locs)))
+      (strokes-fill-stroke (strokes-eliminate-consecutive-redundancies grid-locs)))))
 
 ;;;###autoload
 (defun strokes-read-complex-stroke (&optional prompt event)
@@ -889,49 +898,47 @@
 Note that a complex stroke allows the user to pen-up and pen-down.  This
 is implemented by allowing the user to paint with button1 or button2 and
 then complete the stroke with button3.
-Optional EVENT is currently not used, but hopefully will be soon."
+Optional EVENT is acceptable as the starting event of the stroke"
   (save-excursion
     (save-window-excursion
-      (track-mouse
-	(set-window-configuration strokes-window-configuration)
-	(let ((pix-locs nil)
-	      (grid-locs nil)
-	      (event (or event (read-event))))
-	  (if prompt
-	      (while (not (button-press-event-p event))
-		(message prompt)
-		(setq event (read-event))))
-	  (unwind-protect
-	      (progn
-		(setq event (read-event))
-		(while (not (and (button-press-event-p event)
-				 (eq (event-button event) 3)))
-		  (while (not (button-release-event-p event))
-		    (if (strokes-mouse-event-p event)
-			(let ((point (strokes-event-closest-point event)))
-			  (when point
-			    (goto-char point)
-			    (subst-char-in-region point (1+ point) ?\ strokes-character))
-			  (push (cons (event-x-pixel event)
-				      (event-y-pixel event))
-				pix-locs)))
-		    (setq event (read-event)))
-		  (push strokes-lift pix-locs)
-		  (while (not (button-press-event-p event))
-		    (setq event (read-event))))
-		;; ### KLUDGE! ### sit and wait
-		;; for some useless event to
-		;; happen to fix the minibuffer bug.
-		(while (not (button-release-event-p (read-event))))
-		(setq pix-locs (nreverse (cdr pix-locs))
-		      grid-locs (strokes-renormalize-to-grid pix-locs))
-		(strokes-fill-stroke
-		 (strokes-eliminate-consecutive-redundancies grid-locs)))
-	    ;; protected
-	    (when (equal (buffer-name) strokes-buffer-name)
-	      (subst-char-in-region (point-min) (point-max) strokes-character ?\ )
-	      (goto-char (point-min))
-	      (bury-buffer))))))))
+      (set-window-configuration strokes-window-configuration)
+      (let ((pix-locs nil)
+	    (grid-locs nil))
+	(if prompt
+	    (while (not (button-press-event-p event))
+	      (message prompt)
+	      (setq event (read-event))))
+	(unwind-protect
+	    (track-mouse
+	      (or event (setq event (read-event)))
+	      (while (not (and (button-press-event-p event)
+			       (eq (event-button event) 3)))
+		(while (not (button-release-event-p event))
+		  (if (strokes-mouse-event-p event)
+		      (let ((point (strokes-event-closest-point event)))
+			(when point
+			  (goto-char point)
+			  (subst-char-in-region point (1+ point) ?\ strokes-character))
+			(push (cons (event-x-pixel event)
+				    (event-y-pixel event))
+			      pix-locs)))
+		  (setq event (read-event)))
+		(push strokes-lift pix-locs)
+		(while (not (button-press-event-p event))
+		  (setq event (read-event))))
+	      ;; ### KLUDGE! ### sit and wait
+	      ;; for some useless event to
+	      ;; happen to fix the minibuffer bug.
+	      (while (not (button-release-event-p (read-event))))
+	      (setq pix-locs (nreverse (cdr pix-locs))
+		    grid-locs (strokes-renormalize-to-grid pix-locs))
+	      (strokes-fill-stroke
+	       (strokes-eliminate-consecutive-redundancies grid-locs)))
+	  ;; protected
+	  (when (equal (buffer-name) strokes-buffer-name)
+	    (subst-char-in-region (point-min) (point-max) strokes-character ?\ )
+	    (goto-char (point-min))
+	    (bury-buffer)))))))
 
 (defun strokes-execute-stroke (stroke)
   "Given STROKE, execute the command which corresponds to it.
@@ -949,7 +956,7 @@
 	   (command-execute command))
 	  ((null strokes-global-map)
 	   (if (file-exists-p strokes-file)
-	       (and (y-or-n-p-maybe-dialog-box
+	       (and (y-or-n-p
 		     (format "No strokes loaded.  Load `%s'? "
 			     strokes-file))
 		    (strokes-load-user-strokes))
@@ -998,122 +1005,121 @@
 ;;;###autoload
 (defalias 'describe-stroke 'strokes-describe-stroke)
 
-;;; ### FORGET IT!  I COULN'T GET THE EMACS READER TO PARSE THIS FUNCTION ###
 ;;;###autoload
-;;(defun strokes-help ()
-;;  "Get instructional help on using the the `strokes' package."
-;;  (interactive)
-;;  (with-output-to-temp-buffer "*Help with Strokes*"
-;;    (let ((helpdoc
-;;	   "This is help for the strokes package.
+(defun strokes-help ()
+  "Get instructional help on using the the `strokes' package."
+  (interactive)
+  (with-output-to-temp-buffer "*Help with Strokes*"
+    (let ((helpdoc
+	   "This is help for the strokes package.
 
-;;If you find something wrong with strokes, or feel that it can be
-;;improved in some way, then please feel free to email me:
+If you find something wrong with strokes, or feel that it can be
+improved in some way, then please feel free to email me:
 
-;;David Bakhash <cadet@mit.edu>
+David Bakhash <cadet@mit.edu>
 
-;;or just do
+or just do
 
-;;M-x strokes-report-bug
+M-x strokes-report-bug
 
-;;------------------------------------------------------------
+------------------------------------------------------------
 
-;;** Strokes...
+** Strokes...
 
-;;The strokes package allows you to define strokes, made with
-;;the mouse or other pointer device, that Emacs can interpret as
-;;corresponding to commands, and then executes the commands.  It does
-;;character recognition, so you don't have to worry about getting it
-;;right every time.
+The strokes package allows you to define strokes, made with
+the mouse or other pointer device, that Emacs can interpret as
+corresponding to commands, and then executes the commands.  It does
+character recognition, so you don't have to worry about getting it
+right every time.
 
-;;Strokes are easy to program and fun to use.  To start strokes going,
-;;you'll want to put the following line in your .emacs file as mentioned
-;;in the commentary to strokes.el.
+Strokes are easy to program and fun to use.  To start strokes going,
+you'll want to put the following line in your .emacs file as mentioned
+in the commentary to strokes.el.
+
+This will load strokes when and only when you start Emacs on a window
+system, with a mouse or other pointer device defined.
 
-;;This will load strokes when and only when you start Emacs on a window
-;;system, with a mouse or other pointer device defined.
+To toggle strokes-mode, you just do
+
+> M-x strokes-mode
 
-;;To toggle strokes-mode, you just do
+** Strokes for controling the behavior of Emacs...
 
-;;> M-x strokes-mode
-
-;;** Strokes for controling the behavior of Emacs...
+When you're ready to start defining strokes, just use the command
 
-;;When you're ready to start defining strokes, just use the command
-
-;;> M-x global-set-stroke
+> M-x global-set-stroke
 
-;;You will see a ` *strokes*' buffer which is waiting for you to enter in
-;;your stroke.  When you enter in the stroke, you draw with button1 or
-;;button2, and then end with button3.  Next, you enter in the command
-;;which will be executed when that stroke is invoked.  Simple as that.
-;;For now, try to define a stroke to copy a region.  This is a popular
-;;edit command, so type
+You will see a ` *strokes*' buffer which is waiting for you to enter in
+your stroke.  When you enter in the stroke, you draw with button1 or
+button2, and then end with button3.  Next, you enter in the command
+which will be executed when that stroke is invoked.  Simple as that.
+For now, try to define a stroke to copy a region.  This is a popular
+edit command, so type
 
-;;> M-x global-set-stroke
+> M-x global-set-stroke
 
-;;Then, in the ` *strokes*' buffer, draw the letter `C' (for `copy'\)
-;;and then, when it asks you to enter the command to map that to, type
+Then, in the ` *strokes*' buffer, draw the letter `C' (for `copy'\)
+and then, when it asks you to enter the command to map that to, type
+
+> copy-region-as-kill
 
-;;> copy-region-as-kill
+That's about as hard as it gets.
+Remember: paint with button1 or button2 and then end with button3.
 
-;;That's about as hard as it gets.
-;;Remember: paint with button1 or button2 and then end with button3.
+If ever you want to know what a certain strokes maps to, then do
 
-;;If ever you want to know what a certain strokes maps to, then do
-
-;;> M-x describe-stroke
+> M-x describe-stroke
 
-;;and you can enter in any arbitrary stroke.  Remember: The strokes
-;;package lets you program in simple and complex, or multi-lift, strokes.
-;;The only difference is how you *invoke* the two.  You will most likely
-;;use simple strokes, as complex strokes were developed for
-;;Chinese/Japanese/Korean.  So the middle mouse button, button2, will
-;;invoke the command `strokes-do-stroke' in buffers where button2 doesn't
-;;already have a meaning other than its original, which is `mouse-yank'.
-;;But don't worry: `mouse-yank' will still work with strokes.  See the
-;;variable `strokes-click-command'.
+and you can enter in any arbitrary stroke.  Remember: The strokes
+package lets you program in simple and complex, or multi-lift, strokes.
+The only difference is how you *invoke* the two.  You will most likely
+use simple strokes, as complex strokes were developed for
+Chinese/Japanese/Korean.  So the middle mouse button, button2, will
+invoke the command `strokes-do-stroke' in buffers where button2 doesn't
+already have a meaning other than its original, which is `mouse-yank'.
+But don't worry: `mouse-yank' will still work with strokes.  See the
+variable `strokes-click-command'.
 
-;;If ever you define a stroke which you don't like, then you can unset
-;;it with the command
+If ever you define a stroke which you don't like, then you can unset
+it with the command
 
-;;> M-x strokes-unset-last-stroke
+> M-x strokes-unset-last-stroke
 
-;;Your strokes are stored as you enter them.  They get saved in a file
-;;called ~/.strokes, along with other strokes configuration variables.
-;;You can change this location by setting the variable `strokes-file'.
-;;You will be prompted to save them when you exit Emacs, or you can save
-;;them with
+Your strokes are stored as you enter them.  They get saved in a file
+called ~/.strokes, along with other strokes configuration variables.
+You can change this location by setting the variable `strokes-file'.
+You will be prompted to save them when you exit Emacs, or you can save
+them with
 
-;;> M-x save-strokes
+> M-x save-strokes
 
-;;Your strokes get loaded automatically when you enable `strokes-mode'.
-;;You can also load in your user-defined strokes with
+Your strokes get loaded automatically when you enable `strokes-mode'.
+You can also load in your user-defined strokes with
 
-;;> M-x load-user-strokes
+> M-x load-user-strokes
 
-;;** A few more important things...
+** A few more important things...
 
-;;o The command `strokes-do-stroke' is also invoked with M-button2, so that you
-;;  can still enter a stroke in modes which use button2 for other things,
-;;  such as cross-referencing.
+o The command `strokes-do-stroke' is also invoked with M-button2, so that you
+  can still enter a stroke in modes which use button2 for other things,
+  such as cross-referencing.
 
-;;o Strokes are a bit computer-dependent in that they depend somewhat on
-;;  the speed of the computer you're working on.  This means that you
-;;  may have to tweak some variables.  You can read about them in the
-;;  commentary of `strokes.el'.  Better to just use apropos and read their
-;;  docstrings.  All variables/functions start with `strokes'.  The one
-;;  variable which many people wanted to see was
-;;  `strokes-use-strokes-buffer' which allows the user to use strokes
-;;  silently--without displaying the strokes.  All variables can be set
-;;  by customizing the group named `strokes' via the customization package:
+o Strokes are a bit computer-dependent in that they depend somewhat on
+  the speed of the computer you're working on.  This means that you
+  may have to tweak some variables.  You can read about them in the
+  commentary of `strokes.el'.  Better to just use apropos and read their
+  docstrings.  All variables/functions start with `strokes'.  The one
+  variable which many people wanted to see was
+  `strokes-use-strokes-buffer' which allows the user to use strokes
+  silently--without displaying the strokes.  All variables can be set
+  by customizing the group named `strokes' via the customization package:
 
-;;  > M-x customize"))
-;;    (save-excursion
-;;	(princ helpdoc)
-;;	(set-buffer standard-output)
-;;	(help-mode))
-;;      (print-help-return-message)))))
+  > M-x customize"))
+    (save-excursion
+	(princ helpdoc)
+	(set-buffer standard-output)
+	(help-mode))
+      (print-help-return-message))))
 
 (defun strokes-report-bug ()
   "Submit a bug report for strokes."
@@ -1164,7 +1170,7 @@
 	   ;; if window is dedicated or a minibuffer
 	   nil)
 	  ((or (interactive-p)
-	       (not (buffer-live-p (get-buffer strokes-buffer-name)))
+	       (not (bufferp (get-buffer strokes-buffer-name)))
 	       (null strokes-window-configuration))
 	   ;; create `strokes-window-configuration' from scratch...
 	   (save-excursion
@@ -1218,7 +1224,7 @@
 	    (strokes-load-user-strokes)
 	    (if (and (not (equal current strokes-global-map))
 		     (or (interactive-p)
-			 (yes-or-no-p-maybe-dialog-box "save your strokes? ")))
+			 (yes-or-no-p "save your strokes? ")))
 		(progn
 		  (require 'pp)		; pretty-print variables
 		  (message "Saving strokes in %s..." strokes-file)
@@ -1285,14 +1291,14 @@
 	   (and (file-exists-p strokes-file)
 		(null strokes-global-map)
 		(strokes-load-user-strokes))
-	   (add-hook 'kill-emacs-hook
+	   (add-hook 'kill-emacs-query-functions
 		     'strokes-prompt-user-save-strokes)
 	   (add-hook 'select-frame-hook
 		     'strokes-update-window-configuration)
 	   (strokes-update-window-configuration)
-	   (define-key global-map [(button2)] 'strokes-do-stroke)
-	   (define-key global-map [(meta button2)] 'strokes-do-stroke)
-	   ;;	   (define-key global-map [(control button2)] 'strokes-do-complex-stroke)
+	   (define-key global-map [(down-mouse-2)] 'strokes-do-stroke)
+	   (define-key global-map [(meta down-mouse-2)] 'strokes-do-stroke)
+	   ;;	   (define-key global-map [(control down-mouse-2)] 'strokes-do-complex-stroke)
 	   (ad-activate-regexp "^strokes-") ; advise button2 commands
 	   (setq strokes-mode t))
 	  (t				; turn off strokes
@@ -1300,9 +1306,9 @@
 	       (kill-buffer (get-buffer strokes-buffer-name)))
 	   (remove-hook 'select-frame-hook
 			'strokes-update-window-configuration)
-	   (if (string-match "^strokes-" (symbol-name (key-binding [(button2)])))
-	       (define-key global-map [(button2)] strokes-click-command))
-	   (if (string-match "^strokes-" (symbol-name (key-binding [(meta button2)])))
+	   (if (string-match "^strokes-" (symbol-name (key-binding [(down-mouse-2)])))
+	       (define-key global-map [(down-mouse-2)] strokes-click-command))
+	   (if (string-match "^strokes-" (symbol-name (key-binding [(meta down-mouse-2)])))
 	       (global-unset-key [(meta button2)]))
 	   ;;	   (if (string-match "^strokes-" (symbol-name (key-binding [(shift button2)])))	
 	   ;;	       (global-unset-key [(shift button2)]))
@@ -1311,12 +1317,10 @@
   (force-mode-line-update))
 
 (or (assq 'strokes-mode minor-mode-alist)
-(setq minor-mode-alist (cons (list 'strokes-mode strokes-modeline-string)
-			     minor-mode-alist)))
+    (setq minor-mode-alist (cons (list 'strokes-mode strokes-modeline-string)
+				 minor-mode-alist)))
 
 (provide 'strokes)
 (run-hooks 'strokes-load-hook)
 
 ;;; strokes.el ends here
-
-