Java LWJGL抓取鼠标-在应用程序挂起或抓取鼠标点击断点时进行调试
我有一个LWJGL程序(LWJGL 2.9.0),有时会随机挂起。调试它的问题是鼠标总是被抓取。在Windows上,可以毫无问题地将鼠标拿回,但在linux上(我使用linux Kubuntu),我知道拿回鼠标的唯一方法是停止应用程序。当抓取鼠标时,断点命中时也会发生同样的问题Java LWJGL抓取鼠标-在应用程序挂起或抓取鼠标点击断点时进行调试,java,linux,debugging,lwjgl,freeze,Java,Linux,Debugging,Lwjgl,Freeze,我有一个LWJGL程序(LWJGL 2.9.0),有时会随机挂起。调试它的问题是鼠标总是被抓取。在Windows上,可以毫无问题地将鼠标拿回,但在linux上(我使用linux Kubuntu),我知道拿回鼠标的唯一方法是停止应用程序。当抓取鼠标时,断点命中时也会发生同样的问题 使用netbeans调试模式,我可以随时暂停应用程序并获取一些信息,但当应用程序挂起时,鼠标不再工作(没有光标)。是否可以在不停止应用程序或仅使用键盘调试的情况下拿回鼠标 到目前为止,我已经找到了5种解决这个问题的方法:
使用netbeans调试模式,我可以随时暂停应用程序并获取一些信息,但当应用程序挂起时,鼠标不再工作(没有光标)。是否可以在不停止应用程序或仅使用键盘调试的情况下拿回鼠标 到目前为止,我已经找到了5种解决这个问题的方法:
Mouse.sethapped(false)
。当断点命中并且鼠标卡在LWJGL窗口中时,这也很有用。因为我第一次问这个问题,所以我切换到IntelliJ IDEA,下面是如何在IDE中执行此操作:alt+u打开“run”菜单,然后选择“pause”,然后使用F7或F8进一步遍历代码一行,然后再次按alt+u并选择“evaluate expression”import org.lwjgl.input.Mouse;
public class DebugHelper {
public static boolean restoreMouse() {
Mouse.setGrabbed(false);
return true;
}
}
然后将断点条件设置为com.capen.DebugHelper.restoreMouse()
- 运行
。第二个鼠标指针应出现在屏幕上。这将创建键盘/指针对,您不需要对添加的第二个键盘执行任何操作。它不会连接到任何物理设备xinput创建主指针名称
- 运行
列出所有设备 在我的笔记本电脑上,它看起来像这样:xinput list
新添加的鼠标指针(主设备)的id为15。我有一个触摸板和一个外部鼠标,这样我可以将其中一个附加到新光标上,而将另一个附加到旧光标上。如果没有2个物理设备,则可以保留旧指针,而不附加任何物理设备⎡ 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)]
- 现在运行
。例如,如果我想将触摸板连接到新指针: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!:),顺便说一句,这实际上会强制取消它