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

CLX, stumpwm, McCLIM keyboard layout locked on startup

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

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

这似乎是 CLX 中的一个错误,独立影响 McCLIM 和 stumpwm。

例如,我正在测试

之间的区别
setxkbmap -layout us

(查询)和

setxkbmap -layout fr

(天蓝色)。 运行 这些命令既不影响 stumpwm 的输入栏,也不影响 Climacs。默认查询仍然有效。

X 服务器向应用程序发送键码。应用程序可以使用它们可以从服务器请求的键映射 table 来解释这些键码。

似乎在 CLX 中,keycode 到 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))))

显然,这个函数只请求一次键映射 table 并缓存它。将其更改为

(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 命令,请注意!位于 /.