diff lisp/hyperbole/hmouse-mod.el @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/hyperbole/hmouse-mod.el	Mon Aug 13 08:45:50 2007 +0200
@@ -0,0 +1,148 @@
+;;!emacs
+;;
+;; FILE:         hmouse-mod.el
+;; SUMMARY:      Action Key acts as CONTROL modifier and Assist Key as META modifier.
+;; USAGE:        GNU Emacs Lisp Library
+;; KEYWORDS:     hypermedia, mouse
+;;
+;; AUTHOR:       Bob Weiner
+;; ORG:          Motorola, Inc., PPG
+;;
+;; ORIG-DATE:     8-Oct-92 at 19:08:31
+;; LAST-MOD:     14-Apr-95 at 16:06:26 by Bob Weiner
+;;
+;; This file is part of Hyperbole.
+;; Available for use and distribution under the same terms as GNU Emacs.
+;;
+;; Copyright (C) 1992-1995, Free Software Foundation, Inc.
+;; Developed with support from Motorola Inc.
+;;
+;; DESCRIPTION:  
+;;
+;;   This module is meant to be used with a chord keyboard in one hand for
+;;   typing and a mouse in the other.  It requires that Hyperbole be loaded
+;;   in order to work.  Hyperbole defines two Smart Keys, the Action Key and
+;;   the Assist Key, on the middle and right buttons by default.
+;;
+;;   If the Action Key is held down while alpha characters are typed,
+;;   they are translated into Control keys instead.  The Assist
+;;   Key translates them into Meta keys.  When both Smart Keys
+;;   are depressed, Control-Meta keys are produced.  The commands bound
+;;   to the characters produced are then run.
+;;
+;;   So the Smart Keys modify the keys typed, e.g. Action Key + {a}
+;;   runs the function for {C-a}.
+;;
+;;   If no keys are typed while the Smart Keys are down, they operate as
+;;   normally under Hyperbole.
+;;
+;;   TO INVOKE:
+;;
+;;       (hmouse-mod-set-global-map)
+;;
+;; DESCRIP-END.
+
+;;; ************************************************************************
+;;; Other required Elisp libraries
+;;; ************************************************************************
+
+(require 'hyperbole)
+
+;;; ************************************************************************
+;;; Public variables
+;;; ************************************************************************
+
+(defvar hmouse-mod-global-map nil
+  "Global key map installed by hmouse-mod-set-global-map function.
+Translates self-insert-command characters into control and meta characters if
+the Action or Assist Keys are depressed at the time of key press.")
+
+;;; ************************************************************************
+;;; Public functions
+;;; ************************************************************************
+
+(defun hmouse-mod-insert-command (count)
+  "Surrogate function for self-insert-command.  Accounts for modifier Smart Keys."
+  (interactive "p")
+  (if (and (boundp 'action-key-depressed-flag)
+	   (boundp 'assist-key-depressed-flag))
+      (cond ((and action-key-depressed-flag assist-key-depressed-flag)
+	     (setq action-key-cancelled t
+		   assist-key-cancelled t)
+	     (let* ((c (downcase last-command-char))
+		    (key (char-to-string (+ 128 (% (- c ?\`) 128)))))
+	       (if (and (or (= c ?\C-@)
+			    (>= c ?a) (<= c ?z)))
+		   (hmouse-mod-execute-command key)
+		 (beep)))
+	     )
+	    ;; Control keys
+	    (action-key-depressed-flag
+	      (setq action-key-cancelled t)
+	      (let ((c (downcase last-command-char)))
+		(if (and (or (= c ?\C-@)
+			     (>= c ?a) (<= c ?z)))
+		    (hmouse-mod-execute-command
+		      (char-to-string (- c ?\`)))
+		  (beep)))
+	      )
+	    ;; Meta keys
+	    (assist-key-depressed-flag
+	      (setq assist-key-cancelled t)
+	      (hmouse-mod-execute-command
+		(char-to-string (+ 128 (% last-command-char 128))))
+	      )
+	    (t (call-interactively 'self-insert-command)))
+    (call-interactively 'self-insert-command))
+  )
+
+(defun hmouse-mod-keyboard-quit ()
+  "Surrogate function for keyboard-quit.  Cancels any hmouse-mod-prefix."
+  (interactive)
+  (setq hmouse-mod-prefix nil)
+  (keyboard-quit))
+
+(defun hmouse-mod-set-global-map ()
+  "Creates 'hmouse-mod-global-map' and installs as current global map.
+It accounts for modifier Smart Keys."
+  (interactive)
+  (setq hmouse-mod-global-map (copy-keymap global-map))
+  (substitute-key-definition
+    'self-insert-command 'hmouse-mod-insert-command hmouse-mod-global-map)
+  (substitute-key-definition
+    'keyboard-quit 'hmouse-mod-keyboard-quit hmouse-mod-global-map)
+  (use-global-map hmouse-mod-global-map))
+
+;;; ************************************************************************
+;;; Private functions
+;;; ************************************************************************
+
+(defun hmouse-mod-execute-command (key)
+  "Executes command associated with keyboard KEY or if KEY prefix, records it."
+  (setq key (concat hmouse-mod-prefix key))
+  (let ((binding (key-binding key)))
+    (cond ((and (not (or (vectorp binding) (stringp binding)))
+		(commandp binding))
+	   (if (> (length key) 1)
+	       (or noninteractive (message (key-description key))))
+	   (setq hmouse-mod-prefix nil)
+	   (call-interactively binding))
+	  ((symbolp binding)
+	   (setq hmouse-mod-prefix nil)
+	   (error "(hmouse-mod-execute-command): {%s} not bound to a command."
+		  (key-description key)))
+	  ((integerp binding)
+	   (setq hmouse-mod-prefix nil)
+	   (error "(hmouse-mod-execute-command): {%s} invalid key sequence."
+		  (key-description key)))
+	  (t (or noninteractive (message (key-description key)))
+	     (setq hmouse-mod-prefix key)))))
+
+;;; ************************************************************************
+;;; Private variables
+;;; ************************************************************************
+
+(defvar hmouse-mod-prefix nil
+  "Prefix key part of current key sequence.")
+
+(provide 'hmouse-mod)