LWJGL抓取鼠标 – debugging应用程序是否挂起或断点与抓取的鼠标碰撞

我有一个LWJGL程序(LWJGL 2.9.0),有时会随机挂起。 debugging它的问题是鼠标总是被抓住。 在Windows上可以没有任何问题的鼠标,但在Linux上(我使用的Linux Kubuntu)我知道要回鼠标的唯一方法是停止应用程序。 捕捉鼠标时发生断点时也会发生同样的问题。

使用netbeansdebugging模式我可以暂停应用程序并获取一些信息,但是当应用程序挂起鼠标不再有效(没有游标)。 是否有可能在不停止应用程序或仅使用键盘进行debugging的情况下返回鼠标?

到目前为止,我已经找到了5个解决方案:

  1. 这可能会也可能不会工作,具体取决于您的IDE和操作系统 – 如果您能够切换到IDE窗口,您可以尝试使用键盘快捷方式来暂停执行,然后评估表达式来释放鼠标。 在这种情况下,您需要评估的表达式是Mouse.setGrabbed(false) 。 当断点击中并且鼠标卡在LWJGL窗口中时,这也很有用。 由于我第一次问这个问题,我切换到IntelliJ IDEA所以这里是如何做到这一点在IDE中:alt + u打开“运行”菜单,然后选择“暂停”,然后逐步通过代码一行进一步使用F7或F8 ,然后再次按alt + u并选择“评估表达式”。

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

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

     import org.lwjgl.input.Mouse; public class DebugHelper { public static boolean restoreMouse() { Mouse.setGrabbed(false); return true; } } 

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

  3. 远程调试 – 如果您有权访问第二台计算机,并知道在启动程序之前需要远程调试,那么这是一个很好的解决方案。

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

  4. [仅限Linux]通过启动第二个X会话

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

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

  5. [仅限Linux]您可以添加第二个鼠标指针。 您的LWJGL(或OpenGL)应用程序将只抓取一个鼠标指针,您将获得第二个鼠标指针。

    不幸的是,大多数窗口管理器并不正式支持多个鼠标指针,但这并不意味着它不起作用。 它工作,但有一些烦人的毛刺。

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

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

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

       ⎡ Virtual core pointer id=2 [master pointer (3)] ⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)] ⎜ ↳ ETPS/2 Elantech Touchpad id=14 [slave pointer (2)] ⎜ ↳ A4Tech USB Mouse id=11 [slave pointer (2)] ⎣ Virtual core keyboard id=3 [master keyboard (2)] ↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)] ↳ Power Button id=6 [slave keyboard (3)] ↳ Video Bus id=7 [slave keyboard (3)] ↳ Video Bus id=8 [slave keyboard (3)] ↳ Power Button id=9 [slave keyboard (3)] ↳ Lenovo EasyCamera id=10 [slave keyboard (3)] ↳ Ideapad extra buttons id=12 [slave keyboard (3)] ↳ AT Translated Set 2 keyboard id=13 [slave keyboard (3)] ⎡ new-mouse pointer id=15 [master pointer (16)] ⎜ ↳ new-mouse XTEST pointer id=17 [slave pointer (15)] ⎣ new-mouse keyboard id=16 [master keyboard (15)] ↳ new-mouse XTEST keyboard id=18 [slave keyboard (16)] 

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

    • 现在执行xinput reattach slave-device-id master-device-id 。 例如,如果我想将我的触摸板附加到新的指针: xinput reattach 14 15

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

    • 当你不再需要第二个鼠标指针时,使用xinput remove-master master-device-id ,在我的情况下它将是xinput remove-master 15

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

      注意:最好在开始调试之前添加新的指针。 我还注意到,一些窗口管理器在使用多个游标时会遇到一些问题,这些问题会导致各种意外的错误 – 例如“键入停止工作”,或者在错误的窗口中键入工作。 所以通常启用多个游标可能不是一个好的选择。

为了完整起见,如果你发现自己陷入困境,拼命地不想停止调试,你可以在你的代码的某个地方添加这个代码片段:

 org.lwjgl.input.Mouse.setGrabbed(false); 

然后通过调试命令执行它。
例如在Eclipse中:
使用Run>Execute (默认快捷键: Ctrl+U )或Run>Display (默认快捷键: Ctrl+Shift+D

它可能无法正常工作,但可能为您节省调试会话。
[不要忘记再次从代码中删除它;]]