我有一个LWJGL程序(LWJGL 2.9.0),有时随机挂起.调试它的问题是总是抓住鼠标.在Windows上可以没有任何问题地返回鼠标,但在linux上(我使用Linux Kubuntu)我知道回鼠的唯一方法是停止应用程序.当抓取鼠标时断点发生时会发生同样的问题.
使用netbeans调试模式我可以随时暂停应用程序并获取一些信息,但是当应用程序挂起鼠标时不再有效(没有光标).是否可以在不停止应用程序或仅使用键盘进行调试的情况下恢复鼠标?
解决方法:
到目前为止,我已找到5个解决此问题的方法:
>根据您的IDE和操作系统,这可能会也可能不起作用 – 如果您能够切换到IDE窗口,您可以尝试使用键盘快捷键暂停执行,然后评估表达式以取消鼠标.在这种情况下,您需要评估的表达式是Mouse.setGrabbed(false).当断点命中并且鼠标卡在LWJGL窗口内时,这也很有用.自从我第一次提出这个问题后,我切换到了IntelliJ IDEA,所以这里是如何在IDE中执行此操作:打开“运行”菜单,然后选择“暂停”,然后使用F7或F8进一步逐行执行代码,然后再次按alt u并选择“evaluate expression”.
>配置断点以评估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()
>远程调试 – 如果您可以访问第二台计算机并且在启动程序之前知道需要远程调试,那么这是一个很好的解决方案.
在第一台计算机上以调试模式启动它并将调试器连接到第二台计算机上.
> [仅限linux]通过启动第二个X会话
切换到tty1 / 2 / …使用ctrl alt Fn(例如ctr alt F1 for tty1),登录并运行命令startx.这应该开始新的X会话,你在tty或tty8的tty.您可以使用ctrl alt Fn(通常为F7和F8)在图形环境之间切换.
不幸的是,如果您的应用程序占用大量内存而无法运行第二个X会话,则这不是一个好的解决方案.
> [仅限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
>有时您可能需要将设备重新连接到以前的主设备.
注意:最好在开始调试之前添加新指针.
我还注意到一些窗口管理器有一些问题,多个游标会导致各种意外错误 – 例如“打字停止工作”,或键入工作,但在错误的窗口.因此,正常启用多个游标可能不是一个好选择.