Java LWJGL抓取鼠标-在应用程序挂起或抓取鼠标点击断点时进行调试

Java LWJGL抓取鼠标-在应用程序挂起或抓取鼠标点击断点时进行调试,java,linux,debugging,lwjgl,freeze,Java,Linux,Debugging,Lwjgl,Freeze,我有一个LWJGL程序(LWJGL 2.9.0),有时会随机挂起。调试它的问题是鼠标总是被抓取。在Windows上,可以毫无问题地将鼠标拿回,但在linux上(我使用linux Kubuntu),我知道拿回鼠标的唯一方法是停止应用程序。当抓取鼠标时,断点命中时也会发生同样的问题 使用netbeans调试模式,我可以随时暂停应用程序并获取一些信息,但当应用程序挂起时,鼠标不再工作(没有光标)。是否可以在不停止应用程序或仅使用键盘调试的情况下拿回鼠标 到目前为止,我已经找到了5种解决这个问题的方法:

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


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

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

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

  • 将断点配置为计算鼠标.sethapped(false)

    或者,您可以设置断点,并使用取消鼠标拖动的代码应用条件,例如: 包装com.cn

    import org.lwjgl.input.Mouse;
    
    public class DebugHelper {
        public static boolean restoreMouse() {
            Mouse.setGrabbed(false);
            return true;
        }
    }
    
    然后将断点条件设置为
    com.capen.DebugHelper.restoreMouse()

  • 远程调试—如果您可以访问第二台计算机,并且知道在启动程序之前需要进行远程调试,那么这是一个很好的解决方案

    在第一台计算机上,以调试模式启动它,并在第二台计算机上附加调试器

  • [仅限linux]通过启动第二个X会话

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

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

  • [仅限linux]您可以添加第二个鼠标指针。您的LWJGL(或OpenGL)应用程序将只捕获一个鼠标指针,您将拥有第二个鼠标指针

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

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

    • 运行
      xinput创建主指针名称
      。第二个鼠标指针应出现在屏幕上。这将创建键盘/指针对,您不需要对添加的第二个键盘执行任何操作。它不会连接到任何物理设备
    • 运行
      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重新连接从设备id主设备id
      。例如,如果我想将触摸板连接到新指针:
      xinput reatach 14 15

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

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

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

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


  • 为了完整性: 如果您发现自己陷入困境,非常不想停止调试,可以在代码中的某个地方添加以下代码段:

    org.lwjgl.input.Mouse.setGrabbed(false);
    
    然后通过调试命令执行它。
    例如在Eclipse中:
    使用
    Run>Execute
    (默认快捷方式:
    Ctrl+U
    )或
    Run>Display
    (默认快捷方式:
    Ctrl+Shift+D

    它可能不会一直工作,但可能会为您节省一个调试会话。

    [别忘了再次从代码中删除它;)]

    您使用的是什么Linux发行版、OpenGL/LWJGL版本、显示驱动程序和IDE?对于Linux Xorg,这在这里起到了作用。问题是,通常在发生这种情况时,我的代码已经到达断点,我没有鼠标光标,并且不知道/没有为其配置键盘快捷键“计算表达式”。但使用工作键盘,我仍然可以启动终端并运行一些命令来启用第二个光标。另一种方法是配置断点以计算鼠标。sethapped(false)。@Barteks2x您尝试过吗?在始终计算的监视表达式上使用它(只要它可见且未最小化)@founderio这很好,因为完整的软件包名称很重要,可以在任何发生断点的地方找到它。这可以让我控制我的两个鼠标(是的,我两侧各有一个,有时我使用左手(主要是在游戏中)其他右手)独立地,显示2个鼠标指针?如果你愿意,我可以把这变成一个完整的问题,thx!:),顺便说一句,这实际上会强制取消它