我们基于Java / SWT的应用程序可以启动用户可编辑的第三方应用程序,例如编辑。例如,在Linux(CentOS 7,Gnome 3.28.2)上,启动“ gedit”时,它可以很好地打开,但是在我们应用程序窗口的后面。奇怪的是,当从终端(gnome-terminal
)启动“ gedit”时,GEdit出现在最前面。
如何告诉“ gedit”(或其他人)作为最前面的应用程序启动?
更新:
当我从IDE(IDEA)启动Java应用程序时,它可以按预期运行(Gedit位于前面)。如果我从shell脚本启动应用程序,它将按预期运行。如果我从指向外壳脚本的.desktop文件启动应用程序,则Gedit不仅会打开文件,还会显示有关准备就绪的通知。也许这某种程度上混淆了应用程序窗口的Z顺序?还是取决于环境变量:如果从.desktop文件启动,则还可以使用环境变量DESKTOP_STARTUP_ID
,GIO_LAUNCHED_DESKTOP_FILE
,GIO_LAUNCHED_DESKTOP_FILE_PID
,并且HISTCONTROL
设置为{{1 }}代替ignoredups
,ignorespace
是SHLVL
而不是2
,并且4
设置为TERM
而不是dump
。
基于Stephan Schlecht的代码,我发现以下应重现该问题的Java代码:
xterm-256color
对环境变量的2次访问是必不可少的。
答案 0 :(得分:3)
现在可以做出许多假设(例如.desktop文件的内容),但最好是逐步说明其工作方式,例如像这样:
测试程序
此SWT程序通过Runtime.getRuntime()。exec启动“ gedit”。
import java.io.IOException;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class EditorOpener {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setSize(500, 200);
shell.setText("Editor Opener");
shell.setLayout(new RowLayout());
final Button button = new Button(shell, SWT.PUSH);
button.setText("open gedit");
button.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent event) {
String[] cmdArray = new String[] { "/usr/bin/gedit" };
try {
Runtime.getRuntime().exec(cmdArray);
}
catch(IOException ex) {
ex.printStackTrace();
}
}
public void widgetDefaultSelected(SelectionEvent event) {
}
});
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
调用Java程序
从如下所示的shell脚本中调用Java程序:
#!/usr/bin/bash
java -cp /path/to/swt.jar:/path/to/classes EditorOpener
.desktop文件
指向外壳文件的.desktop文件如下所示:
[Desktop Entry]
Type=Application
Terminal=false
Name=Opener
Icon=utilities-terminal
Exec='/home/stephan/Documents/opener.sh'
Categories=Application;
结果
通过点击打开gedit 按钮,将按预期在所有其他窗口上方启动gedit。
演示
该测试是在CentOS Linux 7上完成的:
gnome-shell --version
给出输出:
GNOME Shell 3.28.3
答案 1 :(得分:1)
此实用程序wmctrl可以轻松完成您想要的操作。
对于您的用例,您将使用wmctrl -a "gedit"
或类似的名称。在手册页中:
-a
Switch to the desktop containing the window <WIN>, raise the window, and give it focus.
或者,您可以将程序最小化,然后在gedit
完成后再次恢复。
答案 2 :(得分:0)
原因是我们的.desktop
文件包含以下行
StartupNotify=true
StartupWMClass=<main-class>
删除这些行会使问题消失。