LWJGL 抓取鼠标 - 调试应用程序是否挂起或抓取鼠标命中断点时

bar*_*s2x 5 java linux debugging freeze lwjgl

我有一个 LWJGL 程序(LWJGL 2.9.0),有时会随机挂起。调试它的问题是鼠标总是被抓住。在 Windows 上,可以毫无问题地恢复鼠标,但在 Linux(我使用 Linux Kubuntu)上,我知道恢复鼠标的唯一方法是停止应用程序。当鼠标被抓住时遇到断点时,也会发生同样的问题。

使用netbeans调试模式我可以暂停应用程序并随时获取一些信息,但是当应用程序挂起时鼠标不再工作(没有光标)。是否可以在不停止应用程序或仅使用键盘进行调试的情况下恢复鼠标?

bar*_*s2x 4

到目前为止,我已经找到了解决这个问题的5种方法:

\n\n
    \n
  1. 这可能有效也可能无效,具体取决于您的 IDE 和操作系统 - 如果您能够切换到 IDE 窗口,您可以尝试使用键盘快捷键暂停执行,然后计算表达式以松开鼠标。在这种情况下,您需要计算的表达式是Mouse.setGrabbed(false)。当断点命中并且鼠标卡在 LWJGL 窗口内时,这也很有用。因为我第一次问这个问题,所以我切换到 IntelliJ IDEA,所以这里是如何在 IDE 中执行此操作:alt+u 打开“运行”菜单,然后选择“暂停”,然后使用 F7 或 F8 进一步单步执行代码,然后再次按 alt+u 并选择“计算表达式”。

  2. \n
  3. 配置断点来评估Mouse.setGrabbed(false)

    \n\n

    或者,您可以设置断点并使用取消鼠标的代码应用条件,例如:\n package com.acne;

    \n\n
    import org.lwjgl.input.Mouse;\n\npublic class DebugHelper {\n    public static boolean restoreMouse() {\n        Mouse.setGrabbed(false);\n        return true;\n    }\n}\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    然后将断点条件设置为com.acne.DebugHelper.restoreMouse()

  4. \n
  5. 远程调试 - 如果您可以访问第二台机器并且知道在启动程序之前需要远程调试,那么这是一个很好的解决方案。

    \n\n

    在第一台计算机上以调试模式启动它,并将调试器连接到第二台计算机上。

  6. \n
  7. [仅限 Linux] 通过启动第二个 X 会话

    \n\n

    使用 ctrl+alt+Fn 切换到 tty1/2/...(例如 tty1 为 ctr+alt+F1),登录并运行命令 startx。这应该在您所在的 tty 或 tty8 中启动新的 X 会话。您可以使用 ctrl+alt+Fn(通常是 F7 和 F8)在图形环境之间切换。

    \n\n

    不幸的是,如果您的应用程序占用太多内存而无法运行第二个 X 会话,那么这不是一个好的解决方案。

  8. \n
  9. [仅限 Linux] 您可以添加第二个鼠标指针。您的 LWJGL(或 OpenGL)应用程序将仅捕获一个鼠标指针,您将拥有第二个鼠标指针。

    \n\n

    不幸的是,大多数窗口管理器并不正式支持多个鼠标指针,但这并不意味着它不起作用。它确实有效,但有一些恼人的故障。

    \n\n

    您可以使用 xinput 添加第二个鼠标指针:

    \n\n
      \n
    • 跑步xinput create-master pointer-name。屏幕上应出现第二个鼠标指针。这将创建键盘/指针对,您不需要对第二个添加的键盘执行任何操作。它不会连接到任何物理设备。
    • \n
    • 跑步xinput list以列出您的所有设备

      \n\n

      在我的笔记本电脑上,它看起来像这样:

      \n\n
      \xe2\x8e\xa1 Virtual core pointer                      id=2    [master pointer  (3)]\n\xe2\x8e\x9c   \xe2\x86\xb3 Virtual core XTEST pointer                id=4    [slave  pointer  (2)]\n\xe2\x8e\x9c   \xe2\x86\xb3 ETPS/2 Elantech Touchpad                  id=14   [slave  pointer  (2)]\n\xe2\x8e\x9c   \xe2\x86\xb3 A4Tech USB Mouse                          id=11   [slave  pointer  (2)]\n\xe2\x8e\xa3 Virtual core keyboard                     id=3    [master keyboard (2)]\n    \xe2\x86\xb3 Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]\n    \xe2\x86\xb3 Power Button                              id=6    [slave  keyboard (3)]\n    \xe2\x86\xb3 Video Bus                                 id=7    [slave  keyboard (3)]\n    \xe2\x86\xb3 Video Bus                                 id=8    [slave  keyboard (3)]\n    \xe2\x86\xb3 Power Button                              id=9    [slave  keyboard (3)]\n    \xe2\x86\xb3 Lenovo EasyCamera                         id=10   [slave  keyboard (3)]\n    \xe2\x86\xb3 Ideapad extra buttons                     id=12   [slave  keyboard (3)]\n    \xe2\x86\xb3 AT Translated Set 2 keyboard              id=13   [slave  keyboard (3)]\n\xe2\x8e\xa1 new-mouse pointer                         id=15   [master pointer  (16)]\n\xe2\x8e\x9c   \xe2\x86\xb3 new-mouse XTEST pointer                   id=17   [slave  pointer  (15)]\n\xe2\x8e\xa3 new-mouse keyboard                        id=16   [master keyboard (15)]\n    \xe2\x86\xb3 new-mouse XTEST keyboard                  id=18   [slave  keyboard (16)]\n
      Run Code Online (Sandbox Code Playgroud)\n\n

      新添加的鼠标指针(主设备)的 id=15。我有一个触摸板和一个外接鼠标,因此我可以将其中一个连接到新光标,并将另一个连接到旧光标。如果您没有 2 个物理设备 - 您可以保留旧指针,不连接任何物理设备。

    • \n
    • 现在运行xinput reattach slave-device-id master-device-id。例如,如果我想将触摸板连接到新指针:xinput reattach 14 15

      \n\n

      之后您应该能够控制新添加的指针。

    • \n
    • 当您不再需要使用第二个鼠标指针时xinput remove-master master-device-id,就我而言,它是xinput remove-master 15

    • \n
    • 有时您可能需要将设备重新连接到以前的主设备。

      \n\n

      注意:最好在开始调试之前添加新指针。\n我还注意到某些窗口管理器存在多个光标问题,这些问题会导致各种意外错误 - 例如“打字停止工作”或打字有效但在错误的窗口。因此,通常启用多个游标可能不是一个好的选择。

    • \n
  10. \n
\n