[movitz-devel] keyboard layouts

sabetts at andrew.cmu.edu sabetts at andrew.cmu.edu
Thu Mar 8 02:22:08 UTC 2007


Hi guys,

I cleaned up my dvorak hack from ages ago. It rearranges some stuff
and creates an exported function, x86-pc.keyboard:set-kbd-layout. call
it with :dvorak or :qwerty to switch to that layout. default is
qwerty, of course. So, now you can eval at the repl:

(x86-pc.keyboard:set-kbd-layout :dvorak)

-Shawn


Index: losp/x86-pc/keyboard.lisp
===================================================================
RCS file: /project/movitz/cvsroot/movitz/losp/x86-pc/keyboard.lisp,v
retrieving revision 1.6
diff -u -r1.6 keyboard.lisp
--- losp/x86-pc/keyboard.lisp	10 Dec 2004 12:48:34 -0000	1.6
+++ losp/x86-pc/keyboard.lisp	8 Mar 2007 02:18:06 -0000
@@ -25,57 +25,120 @@
 	   read-keypress
 	   poll-key
 	   set-leds
-	   cpu-reset))
+	   cpu-reset
+           set-kbd-layout))
 
 (in-package muerte.x86-pc.keyboard)
 
-(defvar *scan-codes-shift*
-    #(#\null   nil      #\!      #\@      #\#      #\$      #\%      #\^ ; #x00
-      #\&      #\*      #\(      #\)      #\_      #\+      nil      nil ; #x08
-      #\Q      #\W      #\E      #\R      #\T      #\Y      #\U      #\I ; #x10
-      #\O      #\P      #\{      #\}     #\newline nil      #\A      #\S ; #x18
-			       
-      #\D      #\F      #\G      #\H      #\J      #\K      #\L      #\: ; #x20
-      #\"      #\~      nil      #\|      #\Z      #\X      #\C      #\V ; #x28
-      #\B      #\N      #\M      #\<      #\>      #\?      nil      nil ; #x30
-      nil      nil      nil      nil      nil      nil      nil      nil ; #x38
-      nil      nil      nil      nil      nil    :pause     nil      nil)) ; #x40
-
-(defparameter *scan-codes*
-    #(#\null   #\escape #\1      #\2      #\3      #\4      #\5      #\6 ; #x00
-      #\7      #\8      #\9      #\0      #\-      #\= #\backspace #\tab ; #x08
-      #\q      #\w      #\e      #\r      #\t      #\y      #\u      #\i ; #x10
-      #\o      #\p      #\[      #\]   #\newline :ctrl-left #\a      #\s ; #x18
-			       
-      #\d      #\f      #\g      #\h      #\j      #\k      #\l      #\; ; #x20
-      #\'      #\`   :shift-left #\\      #\z      #\x      #\c      #\v ; #x28
-      #\b      #\n      #\m      #\,      #\.      #\/  :shift-right #\escape ; #x30
-      :alt-left #\space :caps-lock :f1    :f2      :f3      :f4      :f5 ; #x38
-			       
-      :f6      :f7      :f8      :f9      :f10   :break :scroll-lock nil ; #x40
-      nil      nil      nil      nil      nil      nil      nil      nil ; #x48
-      nil      :kp-ins  nil      :kp-del  nil      nil      nil      :f11 ; #x50
-      :f12     nil      nil      nil      nil      nil      nil      nil ; #x58
+
+(defvar *kbd-layouts*
+  (let ((layout (make-hash-table)))
+    (setf
+     (gethash :qwerty layout)
+     #(#(#\null   #\escape #\1      #\2      #\3      #\4      #\5      #\6 ; #x00
+         #\7      #\8      #\9      #\0      #\-      #\= #\backspace #\tab ; #x08
+         #\q      #\w      #\e      #\r      #\t      #\y      #\u      #\i ; #x10
+         #\o      #\p      #\[      #\]   #\newline :ctrl-left #\a      #\s ; #x18
+			       
+         #\d      #\f      #\g      #\h      #\j      #\k      #\l      #\; ; #x20
+         #\'      #\`   :shift-left #\\      #\z      #\x      #\c      #\v ; #x28
+         #\b      #\n      #\m      #\,      #\.      #\/  :shift-right #\escape ; #x30
+         :alt-left #\space :caps-lock :f1    :f2      :f3      :f4      :f5 ; #x38
+			       
+         :f6      :f7      :f8      :f9      :f10   :break :scroll-lock nil ; #x40
+         nil      nil      nil      nil      nil      nil      nil      nil ; #x48
+         nil      :kp-ins  nil      :kp-del  nil      nil      nil      :f11 ; #x50
+         :f12     nil      nil      nil      nil      nil      nil      nil ; #x58
       			       
-      nil      nil      nil      nil      nil      nil      nil      nil ; #x60
-      nil      nil      nil      nil      nil      nil      nil      nil ; #x68
-      nil      nil      nil      nil      nil      nil      nil      nil ; #x70
-      nil      nil      nil      nil      nil      nil      nil      nil ; #x78
-			       
-      nil      nil      nil      nil      nil      nil      nil      nil ; #x80
-      nil      nil      nil      nil      nil      nil      nil      nil ; #x88
-      nil      nil      nil      nil   :ctrl-right nil      nil      nil ; #x90
-      nil      nil      nil      nil      nil  :ctrl-right  nil      nil ; #x98
+         nil      nil      nil      nil      nil      nil      nil      nil ; #x60
+         nil      nil      nil      nil      nil      nil      nil      nil ; #x68
+         nil      nil      nil      nil      nil      nil      nil      nil ; #x70
+         nil      nil      nil      nil      nil      nil      nil      nil ; #x78
+			       
+         nil      nil      nil      nil      nil      nil      nil      nil ; #x80
+         nil      nil      nil      nil      nil      nil      nil      nil ; #x88
+         nil      nil      nil      nil   :ctrl-right nil      nil      nil ; #x90
+         nil      nil      nil      nil      nil  :ctrl-right  nil      nil ; #x98
       			       
-      nil      nil      nil      nil      nil      nil      nil      nil ; #xa0
-      nil      nil      nil      nil      nil      nil      nil      nil ; #xa8
-      nil      nil      nil      nil      nil      nil      nil      nil ; #xb0
-      :alt-right nil    nil      nil      nil      nil      nil      nil ; #xb8
-
-      nil      nil      nil      nil      nil      nil      nil    :home ; #xc0
-      :up      :page-up nil      :left    nil      :right   nil     :end ; #xc8
-      :down  :page-down :insert  nil #+ignore #\delete nil nil      nil      nil      nil ; #xd0
-      :alt-right nil    nil      nil      :win     :menu    nil      nil)) ; #xd8
+         nil      nil      nil      nil      nil      nil      nil      nil ; #xa0
+         nil      nil      nil      nil      nil      nil      nil      nil ; #xa8
+         nil      nil      nil      nil      nil      nil      nil      nil ; #xb0
+         :alt-right nil    nil      nil      nil      nil      nil      nil ; #xb8
+
+         nil      nil      nil      nil      nil      nil      nil    :home ; #xc0
+         :up      :page-up nil      :left    nil      :right   nil     :end ; #xc8
+         :down  :page-down :insert  nil #+ignore #\delete nil nil      nil      nil      nil ; #xd0
+         :alt-right nil    nil      nil      :win     :menu    nil      nil) ; #x40
+       #(#\null   nil      #\!      #\@      #\#      #\$      #\%      #\^ ; #x00
+         #\&      #\*      #\(      #\)      #\_      #\+      nil      nil ; #x08
+         #\Q      #\W      #\E      #\R      #\T      #\Y      #\U      #\I ; #x10
+         #\O      #\P      #\{      #\}     #\newline nil      #\A      #\S ; #x18
+			       
+         #\D      #\F      #\G      #\H      #\J      #\K      #\L      #\: ; #x20
+         #\"      #\~      nil      #\|      #\Z      #\X      #\C      #\V ; #x28
+         #\B      #\N      #\M      #\<      #\>      #\?      nil      nil ; #x30
+         nil      nil      nil      nil      nil      nil      nil      nil ; #x38
+         nil      nil      nil      nil      nil    :pause     nil      nil)) ; #xd8
+     (gethash :dvorak layout)
+     #(#(#\null   #\escape #\1      #\2      #\3      #\4      #\5      #\6 ; #x00
+         #\7      #\8      #\9      #\0      #\[      #\] #\backspace #\tab ; #x08
+         #\'      #\,      #\.      #\p      #\y      #\f      #\g      #\c ; #x10
+         #\r      #\l      #\/      #\=   #\newline :ctrl-left #\a      #\o ; #x18
+			       
+         #\e      #\u      #\i      #\d      #\h      #\t      #\n      #\s ; #x20
+         #\-      #\`   :shift-left #\\      #\;      #\q      #\j      #\k ; #x28
+         #\x      #\b      #\m      #\w      #\v      #\z  :shift-right #\escape ; #x30
+         :alt-left #\space :caps-lock :f1    :f2      :f3      :f4      :f5 ; #x38
+			       
+         :f6      :f7      :f8      :f9      :f10   :break :scroll-lock nil ; #x40
+         nil      nil      nil      nil      nil      nil      nil      nil ; #x48
+         nil      :kp-ins  nil      :kp-del  nil      nil      nil      :f11 ; #x50
+         :f12     nil      nil      nil      nil      nil      nil      nil ; #x58
+      			       
+         nil      nil      nil      nil      nil      nil      nil      nil ; #x60
+         nil      nil      nil      nil      nil      nil      nil      nil ; #x68
+         nil      nil      nil      nil      nil      nil      nil      nil ; #x70
+         nil      nil      nil      nil      nil      nil      nil      nil ; #x78
+			       
+         nil      nil      nil      nil      nil      nil      nil      nil ; #x80
+         nil      nil      nil      nil      nil      nil      nil      nil ; #x88
+         nil      nil      nil      nil   :ctrl-right nil      nil      nil ; #x90
+         nil      nil      nil      nil      nil  :ctrl-right  nil      nil ; #x98
+      			       
+         nil      nil      nil      nil      nil      nil      nil      nil ; #xa0
+         nil      nil      nil      nil      nil      nil      nil      nil ; #xa8
+         nil      nil      nil      nil      nil      nil      nil      nil ; #xb0
+         :alt-right nil    nil      nil      nil      nil      nil      nil ; #xb8
+
+         nil      nil      nil      nil      nil      nil      nil    :home ; #xc0
+         :up      :page-up nil      :left    nil      :right   nil     :end ; #xc8
+         :down  :page-down :insert  nil #+ignore #\delete nil nil      nil      nil      nil ; #xd0
+         :alt-right nil    nil      nil      :win     :menu    nil      nil) ; #x40
+       #(#\null   nil      #\!      #\@      #\#      #\$      #\%      #\^ ; #x00
+         #\&      #\*      #\(      #\)      #\{      #\}      nil      nil ; #x08
+         #\"      #\<      #\>      #\P      #\Y      #\F      #\G      #\C ; #x10
+         #\R      #\L      #\?      #\+     #\newline nil      #\A      #\O ; #x18
+			       
+         #\E      #\U      #\I      #\D      #\H      #\T      #\N      #\S ; #x20
+         #\_      #\~      nil      #\|      #\:      #\Q      #\J      #\K ; #x28
+         #\X      #\B      #\M      #\W      #\V      #\Z      nil      nil ; #x30
+         nil      nil      nil      nil      nil      nil      nil      nil ; #x38
+         nil      nil      nil      nil      nil    :pause     nil      nil)) ; #xd8
+     )
+    layout)
+  "All defined keyboard layouts.")
+
+;; default to qwerty
+(defparameter *scan-codes* (aref (gethash :qwerty *kbd-layouts*) 0))
+(defparameter *scan-codes-shift* (aref (gethash :qwerty *kbd-layouts*) 1))
+
+(defun set-kbd-layout (layout-id)
+  "Set the keyboard layout to one provided in *kbd-layouts*."
+  (let* ((layout (gethash layout-id *kbd-layouts*))
+         (normal (aref layout 0))
+         (shifted (aref layout 1)))
+    (setf *scan-codes* (copy-seq normal)
+          *scan-codes-shift* (copy-seq shifted))))
 
 (defun lowlevel-event-p ()
   (logbitp 0 (io-port #x64 :unsigned-byte8)))
@@ -149,10 +212,10 @@
 
 (defun decode-key-code (key-code qualifiers)
   (or (and (logbitp +qualifier-shift+ qualifiers)
-	   (< -1 key-code (length *scan-codes-shift*))
-	   (aref *scan-codes-shift* key-code))
+           (< -1 key-code (length *scan-codes-shift*))
+           (aref *scan-codes-shift* key-code))
       (and (< -1 key-code (length *scan-codes*))
-	   (aref *scan-codes* key-code))))
+           (aref *scan-codes* key-code))))
 ;;;  (< -1 key-code (length *scan-codes*)))
 
 (defun get-key ()



More information about the movitz-devel mailing list