LWJGL抓住了鼠标 - 如果应用程序挂起或使用抓取的鼠标点击断点时调试

时间:2014-05-21 22:36:45

标签: java linux debugging lwjgl hang

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

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

2 个答案:

答案 0 :(得分:4)

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

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

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

    或者,您可以设置断点并应用具有取消鼠标的代码的条件,例如:     包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会话

    使用ctrl + alt + Fn切换到tty1 / 2 / ...(例如ctr + alt + F1用于tty1),登录并运行命令startx。这应该开始新的X会话,你在tty或tty8的tty。您可以使用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

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

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

答案 1 :(得分:2)

为了完整性'缘故: 如果您发现自己陷入困境并且迫切地想要停止调试,可以在代码中的某处添加此代码段:

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

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

它可能无法正常工作,但它可能会为您节省调试时间 [别忘了再次从代码中删除它;)]