打开重量级弹出窗口GTK3时,Linux上的SWT_AWT导致无法使用的闪烁

问题描述

我们有一个Eclipse插件,它使用SWT_AWT嵌入了Swing渲染器。我们在其他两个平台(MacOS和Windows)上有一些集成的“怪癖”,但是现成的Linux几乎无法使用。

我们不得不将L&F切换为Metal / Motif,而不是Linux的默认PLAF,后者是基于GTK的,因为否则SWT和AWT争夺GTK线程时,它将立即陷入僵局。

切换到Metal可以使几乎正常工作,但是只要AWT启动了任何重量级的窗口,Eclipse的其余部分就会开始闪烁-好像整个框架都被重画了几幅鼠标四处移动,直到无法使用的程度。

我们最初是通过工具提示来发现它的,但是从那时起,弹出菜单和模式JOptionPane / JFileChooser对话框也触发了它。一旦实现了任何一种,那么闪烁就开始发生并且不会消失。在这种配置下,您似乎永远也不会从SWT_AWT容器中获得轻量级的弹出窗口-试图查找建议的工具提示/菜单是否可以完全在父容器的边界内绘制的弹出逻辑会对父容器进行某种类型的测试,而不会无法识别嵌入式容器类,因此返回false。

如果您从Eclipse启动一个新窗口,则新窗口实例的运行情况都很好,并且不会闪烁(尽管旧的实例,如果您不关闭它,则会发生异常)...直到触发弹出窗口或模态AWT对话框,随后会再次出现。这似乎暗示它与窗口组有关。

如果您使用GTK2启动Eclipse,则不会发生(请参见https://wiki.eclipse.org/SWT/Devel/Gtk/Dev_guide#Launching_SWT_applications_on_GTK2_or_GTK3

我的直觉是它是由本机层中的某些东西引起的-我在一些摆动代码中设置了一个断点,并且仅暂停了AWT线程; Eclipse进行工作和闪烁,因此我不认为它是从AWT发出或消耗的事件。

有点像Z顺序或透明度问题。就像正在处理AWT重量级对象一样,它导致堆栈中的所有其他窗口都无效。我还想知道“金属”窗口是否是非GTK窗口,而GTK是否对同一窗口组中的非GTK窗口感到不满意,并且默认情况下假定它不能安全地执行选择性无效/重新绘制。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...