修改VirtualBox下的键盘布局

修改VirtualBox下的键盘布局

我在 Linux 上运行 VirtualBox。 (virtualboxUbuntu 14.04 上的 4.3.10 软件包很重要,但我更喜欢与版本无关的解决方案。)我在主机上(在 X11 下)调整了键盘布局,显然这会导致 VirtualBox 误解某些按键。

具体来说,左“Windows”键(LWIN用于 XKB)配置有 xmodmap 来发送

keycode 133 = Hyper_L

在 VirtualBox 虚拟机中,根本无法识别该密钥。我showkey在 Linux 控制台上运行来检查,当我按此键时它没有反应。

如何LWIN在虚拟机中发送正确的键码?触发器可以是这个特定的物理键或Hyper_L键符号。当然其他应用程序一定不能受到影响; xmodmap 行保留。

我使用 Sawfish 作为我的窗口管理器。 Sawfish 特定的解决方案是可以的,但我不确定它是否有帮助:它允许我定义每个窗口的键绑定,但不能单独定义修饰键。我想运行 Windows VM,因此必须将按键的按下和释放事件单独传递到 VM(按LWIN→ 将按键事件传递到 VM),而不仅仅是像LWIN+key 这样的组合。

如果该键是修饰符这一事实使这变得太困难,那么我愿意回退到使CAPS( Caps Lock) 键(它绑定到Mode_switch键符 ( AltGr) 且没有修饰符)在虚拟机中显示为 LWIN。

答案1

您可以尝试编写一个可用于启动 virtualbox 的 bash 脚本,并使其在启动脚本时将 LWIN 配置回默认值,这样中继键盘代码就不会出现问题。然后,如果需要,您可以在虚拟机本身上使用 xmodmap。

如果我的解决方案不起作用,我建议您查看以下两个线程。那里的人也有类似的问题,我想你也许可以使用它。我认为与我的相比,这可能是一个更好的解决方案。祝你好运!

http://ubuntuforums.org/showthread.php?t=1291982

https://forums.virtualbox.org/viewtopic.php?f=7&t=23419

答案2

到目前为止,我一直在做的是在 Sawfish 中或多或少地实现每个窗口的键绑定。我定义了调用xmodmap焦点变化的钩子。它很容易出现竞争条件,但实际上这并不是问题。我在进入和离开类窗口时切换键码 133 的键符号VirtualBox(这适用于管理器以及虚拟机,但对我正在做的事情并不重要)。

(define (add-window-class-matcher class-regexp . assignments)
  "Declare properties for windows whose class matches CLASS-REGEXP.
The string matched against is the X class followed by a slash
followed by the X instance, e.g., \"XTerm/xterm\"."
  (apply add-window-matcher 'WM_CLASS class-regexp assignments))

(define (per-window-keymap-hook window index)
  (let ((xmodmap-expressions-property (window-get window 'xmodmap-expressions)))
    (if (symbolp xmodmap-expressions-property)
        (setq xmodmap-expressions-property
              (symbol-value xmodmap-expressions-property)))
    (when xmodmap-expressions-property
      (let ((expressions (nth index xmodmap-expressions-property))
            (args ()))
        (when expressions
          (while expressions
            (setq args (cons (car expressions) (cons "-e" args))
                  expressions (cdr expressions)))
          (apply call-process nil nil "xmodmap" (nreverse args)))))))
(define (per-window-keymap-in-hook window focus-mode)
  (per-window-keymap-hook window 0))
(define (per-window-keymap-out-hook window focus-mode)
  (per-window-keymap-hook window 1))
(add-hook 'focus-in-hook per-window-keymap-in-hook)
(add-hook 'focus-out-hook per-window-keymap-out-hook)

(define virtualbox-xmodmap-expressions
  '(("keycode 133 = Super_L")
    ("keycode 133 = Hyper_L")))
(add-window-class-matcher "^VirtualBox/"
  `(xmodmap-expressions . virtualbox-xmodmap-expressions))

有一天我可能会将键盘配置切换到 XKB 并运行知识库

答案3

VirtualBox 将键码传递给虚拟机,而不是这些键的解释含义。您的键码映射处于更高的级别,告诉您的主机 X 服务器将每个键码解释为含义。

也就是说,Virtualbox 确实(或者确实如此?)使用各种启发式方法来尝试识别您正在使用的键盘,并进行某种映射。根据提交的票证,我想说这是一个混乱的过程,并且通常涉及 virtualbox 人员需要确切地了解所涉及的键盘是什么样的。

这可能会让您朝着正确的方向前进: https://forums.virtualbox.org/viewtopic.php?f=7&t=57120。看起来有人遇到了类似的问题并且能够解决它。看起来他们正在来宾中进行 xmodmap 映射,这与 Windows 不同,但看起来他们确实能够使以​​前不活动的键起作用,因此它表明您想要的东西是可能的,并说明了一些关于您的信息在Linux虚拟机中测试的方法。

相关内容