[gsharp-cvs] CVS update: gsharp/gui.lisp

Robert Strandh rstrandh at common-lisp.net
Thu Feb 19 06:39:42 UTC 2004


Update of /project/gsharp/cvsroot/gsharp
In directory common-lisp.net:/tmp/cvs-serv24530

Modified Files:
	gui.lisp 
Log Message:
Added Emacs-style keboard macro facility. 

Date: Thu Feb 19 01:39:41 2004
Author: rstrandh

Index: gsharp/gui.lisp
diff -u gsharp/gui.lisp:1.4 gsharp/gui.lisp:1.5
--- gsharp/gui.lisp:1.4	Wed Feb 18 13:16:16 2004
+++ gsharp/gui.lisp	Thu Feb 19 01:39:41 2004
@@ -11,6 +11,7 @@
 (defparameter *x-command-table* (make-hash-table :test #'equal))
 (defparameter *i-command-table* (make-hash-table :test #'equal))
 (defparameter *ix-command-table* (make-hash-table :test #'equal))
+(defparameter *c-x-command-table* (make-hash-table :test #'equal))
 (defparameter *commands* *global-command-table*)
 
 (defun add-command (gesture command table)
@@ -64,6 +65,7 @@
 (add-command '(#\n :meta) 'com-next-layer *global-command-table*)
 (add-command '(#\x) *x-command-table* *global-command-table*)
 (add-command '(#\i) *i-command-table* *global-command-table*)
+(add-command '(#\x :control) *c-x-command-table* *global-command-table*)
 
 ;;; i command table
 (add-command '(#\.) 'com-istate-more-dots *i-command-table*)
@@ -83,6 +85,13 @@
 (add-command '(#\[) 'com-fewer-lbeams *x-command-table*)
 (add-command '(#\]) 'com-fewer-rbeams *x-command-table*)
 
+;;; c-x-command-table
+(add-command '(#\( :shift) 'com-start-kbd-macro *c-x-command-table*)
+(add-command '(#\() 'com-start-kbd-macro *c-x-command-table*)
+(add-command '(#\) :shift) 'com-end-kbd-macro *c-x-command-table*)
+(add-command '(#\)) 'com-end-kbd-macro *c-x-command-table*)
+(add-command '(#\e) 'com-call-last-kbd-macro *c-x-command-table*)
+
 (defmethod redisplay-gsharp-panes (frame &key force-p)
   (loop for pane in (frame-current-panes frame)
 	do (when (typep pane 'score-pane)
@@ -90,18 +99,24 @@
 
 (defvar *gsharp-frame*)
 
+(defparameter *kbd-macro-recording-p* nil)
+(defparameter *kbd-macro-keys* '())
+
 (defmethod dispatch-event :around ((pane score-pane) (event key-press-event))
   (when (keyboard-event-character event)
     (let* ((key (list (keyboard-event-character event)
 		      (event-modifier-state event)))
 	   (command (gethash key *commands*)))
+      (when *kbd-macro-recording-p* (push key *kbd-macro-keys*))
       (cond ((hash-table-p command) (setf *commands* command))
 	    ((fboundp command)
 	     (handler-case (funcall command)
 	       (gsharp-condition (condition) (format *error-output* "~a~%" condition)))
 	     (setf *commands* *global-command-table*))
 	    (t (format *error-output* "no command for ~a~%" key)
-	       (setf *commands* *global-command-table*)))
+	       (setf *commands* *global-command-table*)
+	       (when *kbd-macro-recording-p* (setf *kbd-macro-keys* '()
+						   *kbd-macro-recording-p* nil))))
       (redisplay-gsharp-panes *gsharp-frame* :force-p t))))
 	    
 (define-application-frame gsharp ()
@@ -1038,3 +1053,24 @@
 	  ((eq (aref keysig 4) :natural) (setf (aref keysig 4) :flat))
 	  ((eq (aref keysig 0) :natural) (setf (aref keysig 0) :flat))
 	  ((eq (aref keysig 3) :natural) (setf (aref keysig 3) :flat)))))
+
+;;; macro processing
+(define-gsharp-command com-start-kbd-macro ()
+  (message "defining keyboad macro~%")
+  (setf *kbd-macro-recording-p* t
+	*kbd-macro-keys* '()))  
+
+(define-gsharp-command com-end-kbd-macro ()
+  (message "keyboad macro defined~%")
+  (setf *kbd-macro-recording-p* nil
+	*kbd-macro-keys* (nreverse *kbd-macro-keys*)))
+
+(define-gsharp-command com-call-last-kbd-macro ()
+  (loop with commands = *global-command-table*
+	for key in *kbd-macro-keys* do
+	(let ((command (gethash key commands)))
+	  (cond ((hash-table-p command) (setf commands command))
+		((fboundp command)
+		 (handler-case (funcall command)
+		   (gsharp-condition (condition) (format *error-output* "~a~%" condition))))
+		(t (message "no command for ~a~%" key))))))





More information about the Gsharp-cvs mailing list