[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