我对xfwm4有问题。使用以下代码:

Shell s = windowVector.get(0).getShell();
s.setActive();


上面没有出现被其他外壳覆盖的外壳窗口。使用kwin(KDE窗口管理器)可以正常工作。 Shell是使用以下构造函数创建的:

shell = new Shell(mainShell, SWT.NO_TRIM | SWT.MODELESS);


在两种情况下,SWT方法:

OS.gdk_window_focus (window, OS.GDK_CURRENT_TIME);


被调用,但是在xfwm4 shell中获得了焦点,并且没有在所有其他shell窗口之上(在我的应用程序中)被提升。这是xfwm4中的错误吗?可能是某些配置问题,或者我想念一些东西。

编辑:

我可能不准确。我尝试setActive的外壳在其他子外壳下。以下代码解释并简化了我要实现的目标:

Shell mainShell = new Shell(Display.getDefault(), SWT.NO_TRIM);
mainShell.setBounds(0, 0, 300, 200);
mainShell.open();
final Shell shell1 = new Shell(mainShell, SWT.NO_TRIM | SWT.MODELESS);
shell1.setBounds(0, 0, 300, 200);
shell1.open();
Shell shell2 = new Shell(mainShell, SWT.NO_TRIM | SWT.MODELESS);
shell2.setBounds(0, 0, 300, 200);
shell2.open();
Thread thread = new Thread() {

    @Override
    public void run() {
        try {
                Thread.sleep(2000);
                System.out.println("Raise shell1 above");
                shell1.setActive();
        }
        catch(InterruptedException e) {
            e.printStackTrace();
        }
    }
};
thread.start();
while( !mainShell.isDisposed()) {
    if( !Display.getDefault().readAndDispatch()) {
        Display.getDefault().sleep();
    }
}
Display.getDefault().dispose();


此代码在kwin中可以正常工作,在xfwm4中,shell1保持在shell2之下并保持隐藏状态。

最佳答案

我不能专门谈论xfwm4,但是是的,许多窗口管理器都有某种形式的输入窃取预防功能。

您不希望任何随机的应用程序夺走您的注意力或迫使您的注意力从正在做的事情上转移。

但是,窗口管理器之间如何实现此行为不同。大多数都应该(理想情况下)允许当前关注的应用程序将焦点放在该应用程序的新创建的窗口上,但是我想并不是所有的人都这样做。

关于java - 上面的xfwm4中未引发SWT Shell,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25892951/

10-12 02:16