我正在使用CLX STUMPWM McCLIM,当我通过“setxkbmap us -variant dvorak -option ctrl:nocaps”修改键盘布局时,键盘布局无法在我的CLIM应用程序中更新,但正确更新其他所有内容(因此,使用COLEMAK我在第一次启动CLIM之前运行了相应的
shell命令.
关于为什么会这样的想法?
最佳答案 这似乎是CLX中一个独立影响McCLIM和stumpwm的错误.
例如,我正在测试它们之间的区别
setxkbmap -layout us
(querty)和
setxkbmap -layout fr
(AZERTY).运行这些命令既不会影响stumpwm的输入栏,也不会影响Climacs.默认队列仍然有效.
X服务器将密钥代码发送到应用程序.应用程序可以使用keymap表解释这些密钥代码,它们可以从服务器请求.
似乎在CLX中,keysym转换的关键代码是由translate.lisp中定义的keycode-> keysym函数执行的.它调用上面定义的display-keyboard-mapping函数:
(defun display-keyboard-mapping (display)
(declare (type display display))
(declare (clx-values (simple-array keysym (display-max-keycode keysyms-per-keycode))))
(or (display-keysym-mapping display)
(setf (display-keysym-mapping display) (keyboard-mapping display))))
显然,这个函数只请求一次keymap表并缓存它.把它改成
(defun display-keyboard-mapping (display)
(declare (type display display))
(declare (clx-values (simple-array keysym (display-max-keycode keysyms-per-keycode))))
(setf (display-keysym-mapping display) (keyboard-mapping display)))
修复了输入栏和Climacs. CAVEAT:我并不认为这不会破坏其他任何东西.
注意:如果尝试使用法语布局从stumpwm的输入栏运行shell命令,请注意!位于/.