Update of /project/mcclim/cvsroot/mcclim/Backends/gtkairo In directory clnet:/tmp/cvs-serv29303
Modified Files: BUGS event.lisp ffi.lisp gtk-ffi.lisp Added Files: keygen.lisp keys.lisp Removed Files: keysymdef.lisp Log Message:
Reimplemented key event handling.
* event.lisp (*KEYSYMS*, DEFINE-KEYSYM): Removed. (*KEYS*, DEFINE-KEY): New. (GDKMODIFIERTYPE->MODIFIER-STATE): Ignore hyper, too. (STATE-WITHOUT-BUTTONS): New. (+CLIM-MODIFIERS+, MODIFY-MODIFIERS): Copy&Paste from CLIM-CLX. (KEY-HANDLER): Reimplemented using *keys* and modify-modifiers. * ffi.lisp: Regenerated. * keys.lisp: New file. * keygen.lisp: New file. * keysymdef.lisp: Removed.
--- /project/mcclim/cvsroot/mcclim/Backends/gtkairo/BUGS 2006/11/25 21:11:33 1.13 +++ /project/mcclim/cvsroot/mcclim/Backends/gtkairo/BUGS 2006/12/10 16:34:32 1.14 @@ -104,7 +104,7 @@ visible part of a (scrolled) sheet. Right now we're copying the entire window around, which seems excessive.
-19. +(FIXED) 19. Key press events for modifier keys don't have the corresponding modifier bit set; key release events do. This is opposite to what CLIM-CLX does. --- /project/mcclim/cvsroot/mcclim/Backends/gtkairo/event.lisp 2006/12/03 19:17:26 1.15 +++ /project/mcclim/cvsroot/mcclim/Backends/gtkairo/event.lisp 2006/12/10 16:34:32 1.16 @@ -22,10 +22,10 @@ ;;; Locking rule for this file: The entire event loop grabs the GTK ;;; lock, individual callees don't.
-(defvar *keysyms* (make-hash-table)) +(defvar *keys* (make-hash-table))
-(defmacro define-keysym (name id) - `(setf (gethash ,id *keysyms*) ',name)) +(defmacro define-key (name &rest clauses) + `(setf (gethash ,name *keys*) ',clauses))
(defun connect-signal (widget name sym) (g-signal-connect widget name (cffi:get-callback sym))) @@ -170,7 +170,7 @@ (if (logtest GDK_CONTROL_MASK state) +control-key+ 0) (if (logtest GDK_MOD1_MASK state) +meta-key+ 0) ;; (if (logtest GDK_MOD2_MASK state) +super-key+ 0) - (if (logtest GDK_MOD3_MASK state) +hyper-key+ 0) + ;; (if (logtest GDK_MOD3_MASK state) +hyper-key+ 0) ;;; (if (logtest GDK_MOD4_MASK state) ??? 0) ;;; (if (logtest GDK_MOD5_MASK state) ??? 0) ;;; (if (logtest GDK_LOCK_MASK state) ??? 0) @@ -209,44 +209,62 @@ :sheet (widget->sheet widget *port*) :modifier-state (gdkmodifiertype->modifier-state state)))))
+(defun state-without-buttons (state) + (logand state (1- GDK_BUTTON1_MASK))) + +;; aus CLIM-CLX geklaut: +(defconstant +clim-modifiers+ '(((:meta-left :meta-right) #.+meta-key+) + ((:hyper-left :hyper-right) #.+hyper-key+) + ((:super-left :super-right) #.+super-key+) + ((:shift-left :shift-right) #.+shift-key+) + ((:control-left :control-right) + #.+control-key+))) +(defun modify-modifiers (type keysym-keyword modifiers) + (let ((keysym-modifier (loop for (keysyms modifier) in +clim-modifiers+ + if (member keysym-keyword keysyms) + return modifier))) + (cond ((and keysym-modifier (eql type GDK_KEY_PRESS)) + (logior modifiers keysym-modifier)) + ((and keysym-modifier (eql type GDK_KEY_RELEASE)) + (logandc2 modifiers keysym-modifier)) + (t modifiers)))) + (define-signal key-handler (widget event) (let ((sheet (widget->sheet widget *port*))) - (multiple-value-bind (root-x root-y state) + (multiple-value-bind (root-x root-y) (%gdk-display-get-pointer) (multiple-value-bind (x y) (mirror-pointer-position (sheet-direct-mirror sheet)) (cffi:with-foreign-slots ((type time state keyval string length) event gdkeventkey) - (let ((char (when (plusp length) - ;; fixme: what about the other characters in `string'? - (char string 0))) - (sym (gethash keyval *keysyms*))) - (cond - ((eq sym :backspace) - (setf char #\backspace)) - ((eq sym :tab) - (setf char #\tab)) - ((null char)) - ((eql char #\return)) - ((eql char #\escape) - (setf char nil)) - ((< 0 (char-code char) 32) - (setf char (code-char (+ (char-code char) 96))))) - (enqueue - (make-instance (if (eql type GDK_KEY_PRESS) - 'key-press-event - 'key-release-event) - :key-name sym - ;; fixme: was ist mit dem rest des strings? - ;; fixme: laut dokumentation hier nicht utf-8 - :key-character char - :x x - :y y - :graft-x root-x - :graft-y root-y - :sheet sheet - :modifier-state (gdkmodifiertype->modifier-state state) - :timestamp time)))))))) + (let ((state (state-without-buttons state)) + (modifier-state (gdkmodifiertype->modifier-state state))) + (let ((clauses (gethash keyval *keys*)) + sym char) + (loop + for (st sy ch) in clauses + when (or (eql st t) (find state st)) + do + (setf sym sy) + (setf char ch) + (return)) + (unless char + (setf modifier-state + (modify-modifiers type sym modifier-state))) + (unless (eq sym 'throw-away) + (enqueue + (make-instance (if (eql type GDK_KEY_PRESS) + 'key-press-event + 'key-release-event) + :key-name sym + :key-character char + :x x + :y y + :graft-x root-x + :graft-y root-y + :sheet sheet + :modifier-state modifier-state + :timestamp time))))))))))
(defvar *last-seen-button* 3)
--- /project/mcclim/cvsroot/mcclim/Backends/gtkairo/ffi.lisp 2006/11/26 17:54:08 1.7 +++ /project/mcclim/cvsroot/mcclim/Backends/gtkairo/ffi.lisp 2006/12/10 16:34:32 1.8 @@ -906,6 +906,11 @@ (invalidate_children :int) ;gboolean )
+(defcfun "gdk_x11_drawable_get_xid" + :unsigned-long + (drawable :pointer) ;GdkDrawable * + ) + (defcfun "gtk_adjustment_new" :pointer (value :double) ;gdouble --- /project/mcclim/cvsroot/mcclim/Backends/gtkairo/gtk-ffi.lisp 2006/11/25 21:14:53 1.17 +++ /project/mcclim/cvsroot/mcclim/Backends/gtkairo/gtk-ffi.lisp 2006/12/10 16:34:32 1.18 @@ -357,6 +357,8 @@ GdkGrabStatus GdkWindowHints GtkStateType GdkDragAction GConnectFlags GdkDragProtocol
+ gdk_x11_drawable_get_xid + cairo_format_t cairo_operator_t cairo_fill_rule_t cairo_line_cap_t cairo_line_join_t cairo_font_slant_t cairo_font_weight_t cairo_status_t cairo_filter_t cairo_extend_t))
--- /project/mcclim/cvsroot/mcclim/Backends/gtkairo/keygen.lisp 2006/12/10 16:34:33 NONE +++ /project/mcclim/cvsroot/mcclim/Backends/gtkairo/keygen.lisp 2006/12/10 16:34:33 1.1 ;;; -*- Mode: Lisp; -*-
;;; (c) 2006 David Lichteblau (david@lichteblau.com)
;;; This library is free software; you can redistribute it and/or ;;; modify it under the terms of the GNU Library General Public ;;; License as published by the Free Software Foundation; either ;;; version 2 of the License, or (at your option) any later version. ;;; ;;; This library is distributed in the hope that it will be useful, ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;;; Library General Public License for more details. ;;; ;;; You should have received a copy of the GNU Library General Public ;;; License along with this library; if not, write to the ;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;;; Boston, MA 02111-1307 USA.
(in-package :clim-gtkairo)
#+(or) (defparameter *key-table* (clim-gtkairo::collect-key-table)) #+(or) (print-key-table)
(define-application-frame keygen () () (:panes (target :application)) (:layouts (default target)) (:top-level ()))
(defmacro with-backend (name &body body) `(let* ((clim:*default-server-path* (list ,name)) (clim::*default-frame-manager* (car (climi::frame-managers (find-port))))) ,@body))
(defun collect-key-table () (with-backend :clx (run-frame-top-level (make-application-frame 'keygen :top-level-lambda (lambda (clx) (with-backend :gtkairo (run-frame-top-level (make-application-frame 'keygen :top-level-lambda (lambda (gtk) (collect-key-table-1 clx gtk))))))))))
(defun collect-key-table-1 (clx gtk) (let ((real-handler (fdefinition 'key-handler-impl)) (table (make-hash-table))) (unwind-protect (progn (setf (fdefinition 'key-handler-impl) (lambda (widget event) (cffi:with-foreign-slots ((type time state keyval) event gdkeventkey) (setf (gethash time table) (list (state-without-buttons state) keyval))) (funcall real-handler widget event))) (collect-key-table-2 clx gtk table)) (setf (fdefinition 'key-handler-impl) real-handler))))
(defun collect-key-table-2 (clx gtk native-events) (let* ((clx-target (find-pane-named clx 'target)) (clx-win (clim:sheet-mirror clx-target)) (dpy (xlib:window-display clx-win)) (screen (xlib:display-default-screen dpy)) (min (xlib:display-min-keycode dpy)) (max (xlib:display-max-keycode dpy)) (gtk-target (find-pane-named gtk 'target)) (gtk-win (xlib::lookup-window dpy (gdk_x11_drawable_get_xid (cffi:foreign-slot-value (mirror-widget (clim:sheet-mirror gtk-target)) 'gtkwidget 'gdkwindow)))) (time 0) (clx-events (make-hash-table)) (gtk-events (make-hash-table))) (format t "Waiting for windows to come up...~%") (sleep 5) (dotimes (state 64) (format t "Sending events for state ~D...~%" state) (loop for code from min to max do (dolist (type '(:key-press :key-release)) (send-key-event screen clx-win state type code :time time) (send-key-event screen gtk-win state type code :time time) (slurp-events clx-target clx-events t) (slurp-events gtk-target gtk-events) (incf time)))) (format t "Waiting for events to come in...~%") (sleep 5) (slurp-events clx-target clx-events) (slurp-events gtk-target gtk-events) (format t "Done.~%") (let ((result (make-array time)) (real-failures 0) (mod-failures 0) (misses 0)) (dotimes (x time) (let* ((e (gethash x clx-events)) (f (gethash x gtk-events)) (a (de e)) (b (de f))) (cond ((null f) (incf misses)) ((equal a b) ;; (format t "PASS ~A~%" a) ) ((equal (cdr a) (cdr b)) (format t "FAIL ~A/~A~%" a b) (incf mod-failures)) (t (format t "FAIL ~A/~A~%" a b) (incf real-failures))) (setf (elt result x) (cons e (gethash x native-events))))) (format t "~D failures, ~D modifier failures, ~D misses~%" real-failures mod-failures misses) result)))
(defun slurp-events (target table &optional block) (loop for e = (slurp-key-event target block) while e do (setf (gethash (event-timestamp e) table) e) (setf block nil)))
(defun de (ev) (if ev (list (event-modifier-state ev) (keyboard-event-key-name ev) (keyboard-event-character ev)) nil))
(defun send-key-event (screen win state type code &key time) (xlib:send-event win type (list type) :code code :state state :window win :root (xlib:screen-root screen) :time (or time 0) :x 1 :y 2 :root-x 10 :root-y 20 :same-screen-p t))
(defun slurp-key-event (pane &optional block) (loop for event = (if block (event-read pane) (event-read-no-hang pane)) until (typep event '(or null key-press-event key-release-event)) finally (return event)))
(defun cwd () (slot-value (asdf:find-system :clim-gtkairo) 'asdf::relative-pathname))
(defun print-key-table () (let ((table (make-hash-table))) (loop for (ok state value) across *key-table* do (when value (let* ((name (if ok (keyboard-event-key-name ok) 'throw-away)) (char (if ok (keyboard-event-character ok) 'throw-away)) (def (gethash value table))) (dolist (clause def (push (list (list state) name char) (gethash value table))) (when (and (eql (second clause) name) (eql (third clause) char)) (pushnew state (car clause)) (return)))))) (with-open-file (s (merge-pathnames "Backends/gtkairo/keys.lisp" (cwd)) :direction :output :if-exists :rename-and-delete) (write-line ";; autogenerated by keygen.lisp" s) (print '(in-package :clim-gtkairo) s) (loop for value being each hash-key in table using (hash-value spec) do (print `(define-key ,value ,@(simplify-spec spec)) s)))))
(defun simplify-spec (clauses) (flet ((count-keys (x) (length (car x)))) (let* ((max (reduce #'max clauses :key #'count-keys)) (clause (find max clauses :key #'count-keys))) (append (remove clause clauses) `((t ,@(cdr clause))))))) --- /project/mcclim/cvsroot/mcclim/Backends/gtkairo/keys.lisp 2006/12/10 16:34:33 NONE +++ /project/mcclim/cvsroot/mcclim/Backends/gtkairo/keys.lisp 2006/12/10 16:34:33 1.1 ;; autogenerated by keygen.lisp
(IN-PACKAGE :CLIM-GTKAIRO) (DEFINE-KEY 0 ((0) THROW-AWAY THROW-AWAY) (T NIL NIL)) (DEFINE-KEY 65307 (T :ESCAPE NIL)) (DEFINE-KEY 49 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|1| #\1) (T :! #!)) (DEFINE-KEY 50 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|2| #\2) (T :@ #@)) (DEFINE-KEY 51 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|3| #\3) (T :|#| ##)) (DEFINE-KEY 52 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|4| #\4) (T :$ #$)) (DEFINE-KEY 53 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|5| #\5) (T :% #%)) (DEFINE-KEY 54 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|6| #\6) (T :DEAD-CIRCUMFLEX NIL)) (DEFINE-KEY 55 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|7| #\7) (T :& #&)) (DEFINE-KEY 56 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|8| #\8) (T :* #*)) (DEFINE-KEY 57 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|9| #\9) (T :|(| #()) (DEFINE-KEY 48 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|0| #\0) (T :|)| #))) (DEFINE-KEY 91 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :[ #[) (T :{ #{)) (DEFINE-KEY 93 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :] #]) (T :} #})) (DEFINE-KEY 65288 (T :BACKSPACE #\Backspace)) (DEFINE-KEY 65289 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :TAB #\Tab) (T :ISO-LEFT-TAB NIL)) (DEFINE-KEY 39 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|'| #') (T :|"| #")) (DEFINE-KEY 44 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|,| #,) (T :< #<)) (DEFINE-KEY 46 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|.| #.) (T :> #>)) (DEFINE-KEY 112 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|p| #\p) (T :P #\P)) (DEFINE-KEY 121 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|y| #\y) (T :Y #\Y)) (DEFINE-KEY 102 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|f| #\f) (T :F #\F)) (DEFINE-KEY 103 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|g| #\g) (T :G #\G)) (DEFINE-KEY 99 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|c| #\c) (T :C #\C)) (DEFINE-KEY 114 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|r| #\r) (T :R #\R)) (DEFINE-KEY 108 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|l| #\l) (T :L #\L)) (DEFINE-KEY 47 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :/ #/) (T :? #?)) (DEFINE-KEY 61 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) := #=) (T :+ #+)) (DEFINE-KEY 65293 (T :RETURN #\Return)) (DEFINE-KEY 65509 (T :CAPS-LOCK NIL)) (DEFINE-KEY 97 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|a| #\a) (T :A #\A)) (DEFINE-KEY 111 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|o| #\o) (T :O #\O)) (DEFINE-KEY 101 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|e| #\e) (T :E #\E)) (DEFINE-KEY 117 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|u| #\u) (T :U #\U)) (DEFINE-KEY 105 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|i| #\i) (T :I #\I)) (DEFINE-KEY 100 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|d| #\d) (T :D #\D)) (DEFINE-KEY 104 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|h| #\h) (T :H #\H)) (DEFINE-KEY 116 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|t| #\t) (T :T #\T)) (DEFINE-KEY 110 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|n| #\n) (T :N #\N)) (DEFINE-KEY 115 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|s| #\s) (T :S #\S)) (DEFINE-KEY 45 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :- #-) (T :_ #_)) (DEFINE-KEY 96 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|`| #`) (T :DEAD-TILDE NIL)) (DEFINE-KEY 65505 (T :SHIFT-LEFT NIL)) (DEFINE-KEY 65508 (T :CONTROL-RIGHT NIL)) (DEFINE-KEY 58 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|:| #:) (T :|;| #;)) (DEFINE-KEY 113 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|q| #\q) (T :Q #\Q)) (DEFINE-KEY 106 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|j| #\j) (T :J #\J)) (DEFINE-KEY 107 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|k| #\k) (T :K #\K)) (DEFINE-KEY 120 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|x| #\x) (T :X #\X)) (DEFINE-KEY 98 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|b| #\b) (T :B #\B)) (DEFINE-KEY 109 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|m| #\m) (T :M #\M)) (DEFINE-KEY 119 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|w| #\w) (T :W #\W)) (DEFINE-KEY 118 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|v| #\v) (T :V #\V)) (DEFINE-KEY 122 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|z| #\z) (T :Z #\Z)) (DEFINE-KEY 65506 (T :SHIFT-RIGHT NIL)) (DEFINE-KEY 65450 (T :KP-MULTIPLY NIL)) (DEFINE-KEY 65511 (T :META-LEFT NIL)) (DEFINE-KEY 32 (T :| | #\ )) (DEFINE-KEY 65507 (T :CONTROL-LEFT NIL)) (DEFINE-KEY 65470 (T :F1 NIL)) (DEFINE-KEY 65471 (T :F2 NIL)) (DEFINE-KEY 65472 (T :F3 NIL)) (DEFINE-KEY 65473 (T :F4 NIL)) (DEFINE-KEY 65474 (T :F5 NIL)) (DEFINE-KEY 65475 (T :F6 NIL)) (DEFINE-KEY 65476 (T :F7 NIL)) (DEFINE-KEY 65477 (T :F8 NIL)) (DEFINE-KEY 65478 (T :F9 NIL)) (DEFINE-KEY 65479 (T :F10 NIL)) (DEFINE-KEY 65407 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :NUM-LOCK NIL) (T :POINTER-ENABLE-KEYS NIL)) (DEFINE-KEY 65300 (T :SCROLL-LOCK NIL)) (DEFINE-KEY 65429 ((44 40 36 32 12 8 4 0) :KP-HOME NIL) (T :KP-7 NIL)) (DEFINE-KEY 65431 ((44 40 36 32 12 8 4 0) :KP-UP NIL) (T :KP-8 NIL)) (DEFINE-KEY 65434 ((44 40 36 32 12 8 4 0) :KP-PRIOR NIL) (T :KP-9 NIL)) (DEFINE-KEY 65453 (T :KP-SUBTRACT NIL)) (DEFINE-KEY 65430 ((44 40 36 32 12 8 4 0) :KP-LEFT NIL) (T :KP-4 NIL)) (DEFINE-KEY 65437 ((44 40 36 32 12 8 4 0) :KP-BEGIN NIL) (T :KP-5 NIL)) (DEFINE-KEY 65432 ((44 40 36 32 12 8 4 0) :KP-RIGHT NIL) (T :KP-6 NIL)) (DEFINE-KEY 65451 (T :KP-ADD NIL)) (DEFINE-KEY 65436 ((44 40 36 32 12 8 4 0) :KP-END NIL) (T :KP-1 NIL)) (DEFINE-KEY 65433 ((44 40 36 32 12 8 4 0) :KP-DOWN NIL) (T :KP-2 NIL)) (DEFINE-KEY 65435 ((44 40 36 32 12 8 4 0) :KP-NEXT NIL) (T :KP-3 NIL)) (DEFINE-KEY 65438 ((44 40 36 32 12 8 4 0) :KP-INSERT NIL) (T :KP-0 NIL)) (DEFINE-KEY 65439 ((44 40 36 32 12 8 4 0) :KP-DELETE NIL) (T :KP-DECIMAL NIL)) (DEFINE-KEY 65377 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :PRINT NIL) (T :SYS-REQ NIL)) (DEFINE-KEY 60 ((62 58 54 50 46 42 38 34 30 26 22 18 14 10 6 2) :> #>) (T :< #<)) (DEFINE-KEY 65480 (T :F11 NIL)) (DEFINE-KEY 65312 (T :MULTI-KEY NIL)) (DEFINE-KEY 65360 (T :HOME NIL)) (DEFINE-KEY 65362 (T :UP NIL)) (DEFINE-KEY 65365 (T :PRIOR NIL)) (DEFINE-KEY 65361 (T :LEFT NIL)) (DEFINE-KEY 65363 (T :RIGHT NIL)) (DEFINE-KEY 65367 (T :END NIL)) (DEFINE-KEY 65364 (T :DOWN NIL)) (DEFINE-KEY 65366 (T :NEXT NIL)) (DEFINE-KEY 65379 (T :INSERT NIL)) (DEFINE-KEY 65535 (T :DELETE #\Rubout)) (DEFINE-KEY 65421 (T :KP-ENTER NIL)) (DEFINE-KEY 92 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :|\| #\) (T :||| #|)) (DEFINE-KEY 65299 ((60 56 52 48 44 40 36 32 28 24 20 16 12 8 4 0) :PAUSE NIL) (T :BREAK NIL)) (DEFINE-KEY 65455 (T :KP-DIVIDE NIL)) (DEFINE-KEY 65512 (T :META-RIGHT NIL)) (DEFINE-KEY 65383 (T :MENU NIL)) (DEFINE-KEY 268828536 (T :SUN-AUDIO-MUTE NIL)) (DEFINE-KEY 268828535 (T :SUN-AUDIO-LOWER-VOLUME NIL)) (DEFINE-KEY 268828537 (T :SUN-AUDIO-RAISE-VOLUME NIL)) (DEFINE-KEY 33 (T :! #!)) (DEFINE-KEY 64 (T :@ #@)) (DEFINE-KEY 35 (T :|#| ##)) (DEFINE-KEY 36 (T :$ #$)) (DEFINE-KEY 37 (T :% #%)) (DEFINE-KEY 65106 (T :DEAD-CIRCUMFLEX NIL)) (DEFINE-KEY 38 (T :& #&)) (DEFINE-KEY 42 (T :* #*)) (DEFINE-KEY 40 (T :|(| #()) (DEFINE-KEY 41 (T :|)| #))) (DEFINE-KEY 123 (T :{ #{)) (DEFINE-KEY 125 (T :} #})) (DEFINE-KEY 65056 (T :ISO-LEFT-TAB NIL)) (DEFINE-KEY 34 (T :|"| #")) (DEFINE-KEY 62 (T :> #>)) (DEFINE-KEY 80 (T :P #\P)) (DEFINE-KEY 89 (T :Y #\Y)) (DEFINE-KEY 70 (T :F #\F)) (DEFINE-KEY 71 (T :G #\G)) (DEFINE-KEY 67 (T :C #\C)) (DEFINE-KEY 82 (T :R #\R)) (DEFINE-KEY 76 (T :L #\L)) (DEFINE-KEY 63 (T :? #?)) (DEFINE-KEY 43 (T :+ #+)) (DEFINE-KEY 65 (T :A #\A)) (DEFINE-KEY 79 (T :O #\O)) (DEFINE-KEY 69 (T :E #\E)) (DEFINE-KEY 85 (T :U #\U)) (DEFINE-KEY 73 (T :I #\I)) (DEFINE-KEY 68 (T :D #\D)) (DEFINE-KEY 72 (T :H #\H)) (DEFINE-KEY 84 (T :T #\T)) (DEFINE-KEY 78 (T :N #\N)) (DEFINE-KEY 83 (T :S #\S))
[28 lines skipped]