如何在Linux上使用Java领先GEdit

时间:2018-12-12 13:16:02

标签: linux xorg

我们基于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_IDGIO_LAUNCHED_DESKTOP_FILEGIO_LAUNCHED_DESKTOP_FILE_PID,并且HISTCONTROL设置为{{1 }}代替ignoredupsignorespaceSHLVL而不是2,并且4设置为TERM而不是dump

基于Stephan Schlecht的代码,我发现以下应重现该问题的Java代码:

xterm-256color

对环境变量的2次访问是必不可少的。

3 个答案:

答案 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

gedit demo

答案 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>

删除这些行会使问题消失。