Common lisp CLX、stumpwm、McCLIM键盘布局在启动时锁定

Common lisp CLX、stumpwm、McCLIM键盘布局在启动时锁定,common-lisp,clim,stumpwm,Common Lisp,Clim,Stumpwm,我正在使用CLX+STUMPWM+McCLIM,当我通过“setxkbmap us-variant dvorak-option ctrl:nocaps”修改键盘布局时,键盘布局在我的CLIM应用程序中无法更新,但其他所有内容都会正确更新(因此,要使用COLEMAK,我在第一次启动CLIM之前运行相应的shell命令) 关于为什么会这样的想法?这似乎是CLX中的一个bug,它独立地影响着McCLIM和stumpwm 例如,我正在测试 setxkbmap -layout us (querty)和

我正在使用CLX+STUMPWM+McCLIM,当我通过“setxkbmap us-variant dvorak-option ctrl:nocaps”修改键盘布局时,键盘布局在我的CLIM应用程序中无法更新,但其他所有内容都会正确更新(因此,要使用COLEMAK,我在第一次启动CLIM之前运行相应的shell命令)


关于为什么会这样的想法?

这似乎是CLX中的一个bug,它独立地影响着McCLIM和stumpwm

例如,我正在测试

setxkbmap -layout us
(querty)和

(阿泽蒂)。运行这些命令既不会影响stumpwm的输入栏,也不会影响Climacs。默认的querty仍然有效

X服务器向应用程序发送密钥码。应用程序可以使用keymap表解释这些键码,它们可以从服务器请求该表

在CLX中,keycode到keysym的转换似乎是由translate.lisp中定义的
keycode->keysym
函数执行的。它调用其正上方定义的
显示键盘映射
函数:

(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。警告:我不认为这不会破坏其他任何东西。


注意:如果试图使用法语布局从stumpwm的输入栏运行shell命令,请注意!定位在/

我已经使用此修复程序几天了-它似乎没有损坏任何东西。
(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)))