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

当重量级弹出窗口打开(GTK3)时,Linux上的SWT_AWT会导致无法使用的闪烁,linux,eclipse,swing,gtk,swt,Linux,Eclipse,Swing,Gtk,Swt,我们有一个Eclipse插件,它使用SWT_AWT嵌入Swing渲染器。我们在其他两个平台(MacOS和Windows)的集成方面有一些“怪癖”,但Linux开箱即用几乎无法使用 我们不得不将L&F切换到Metal/Motif,而不是Linux的默认PLAF,后者基于GTK,因为在SWT和AWT争夺GTK线程时,它会立即死锁 切换到金属可以让事情几乎正常工作,但一旦AWT启动任何重量级窗口,Eclipse的其余部分就会开始闪烁——看起来整个框架在鼠标移动时被重画了好几次,以至于无法使用 我们最初

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

我们不得不将L&F切换到Metal/Motif,而不是Linux的默认PLAF,后者基于GTK,因为在SWT和AWT争夺GTK线程时,它会立即死锁

切换到金属可以让事情几乎正常工作,但一旦AWT启动任何重量级窗口,Eclipse的其余部分就会开始闪烁——看起来整个框架在鼠标移动时被重画了好几次,以至于无法使用

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

如果您从Eclipse启动一个新窗口,那么新窗口实例的行为都很好,不会闪烁(尽管旧窗口,如果您不关闭它,会继续出现错误)。。。直到您触发一个弹出或模式AWT对话框,然后它就会再次出现。这似乎意味着这与窗口组有关

如果使用GTK2启动Eclipse,则不会发生这种情况(请参阅)

我的直觉是,这是由本机层中的某些东西引起的——我在一些swing代码中设置了一个断点,只暂停了AWT线程;Eclipse继续工作并闪烁,所以我不认为是AWT发出或消耗的事件

这感觉像是一个Z排序或透明度问题。这就好像AWT重量级被视为导致堆栈中所有其他窗口无效一样。我还想知道金属窗口是否是非GTK窗口,GTK是否对同一窗口组中的非GTK窗口不满意,并默认假定它不能安全地执行选择性失效/重新绘制。

您说“如果使用GTK2启动Eclipse,则不会发生这种情况”,但是。这是追溯计算吗?请注意,GTK没有100%的向后兼容性,即使版本号暗示了这一点。请展示一些代码,用当前的Eclipse和当前的GTK3重现这个问题。