我在 RHEL7 设置中有八个显示器,全部运行 Motif 窗口管理器 (MWM),其中一个或多个显示器仅显示 vncviewer 会话。
只要 vncviewer 是窗口式的,其行为就符合预期:键盘输入会直接发送到具有焦点的窗口。但是,VNC 窗口旨在不加修饰并使用整个屏幕。
问题是,当我将 vncviewer 置于全屏模式时,它会抓取所有键盘输入。只有它(以及其他全屏 vncviewer 会话,如果有的话)可以接收键盘输入,但我无法在非 vncviewer 窗口中输入。
TigerVNC(1.8.0、1.12.0 以及 1.12.80)和 RealVNC 6.22.515 都存在此问题。在 RealVNC 中,我可以通过将 GrabKeyboard 设置为 0 来在一定程度上操纵此行为,但这只会扭转问题:然后我可以将键盘输入发送到非 vncviewer 窗口,但当 vncviewer 处于全屏模式时,不会发送到它。
有人知道这里发生了什么导致这个问题吗?我所做的就是去掉窗口装饰并使用整个屏幕。全屏还做了什么导致这个问题?
我查看了 TigerVNC 源代码,没有发现任何可疑的东西:
public class DesktopWindow extends JFrame
{
// ...
public void fullscreen_on()
{
fullScreen.setParam(true);
lastState = getExtendedState();
lastBounds = getBounds();
dispose();
// Screen bounds calculation affected by maximized window?
setExtendedState(JFrame.NORMAL);
setUndecorated(true);
setVisible(true);
setBounds(getScreenBounds());
}
// ...
}
对于 TigerVNC,我在其问题跟踪器中发现了几个相关问题,但它们应该已在 1.12 中得到修复: https://github.com/TigerVNC/tigervnc/issues/447 https://github.com/TigerVNC/tigervnc/issues/931
事实上,我在使用 RealVNC 时遇到了完全相同的问题,这让我怀疑这是否真的是 TigerVNC 的一个错误。