Наше Java / SWT-приложение может запускать редактируемые пользователем сторонние приложения, например редакторы.В Linux (CentOS 7, Gnome 3.28.2), например, при запуске gedit он открывается нормально, но за окном нашего приложения.Странно то, что при запуске «gedit» из Терминала (gnome-terminal
), GEdit появляется как самое переднее окно.
Как сказать «gedit» (или другим), что нужно запускать как переднее окноapplication?
Обновление: Когда я запускаю свое Java-приложение из IDE (IDEA), оно работает как положено (Gedit находится спереди).Если я запускаю свое приложение из shell-скрипта, оно работает как положено.Если я запускаю приложение из файла .desktop, указывающего на сценарий оболочки, Gedit не только открывает файл , но также показывает уведомление о готовности .Может, это как-то смущает z-порядок окон приложений?Или это зависит от переменных среды: при запуске из файла .desktop переменные среды DESKTOP_STARTUP_ID
, GIO_LAUNCHED_DESKTOP_FILE
, GIO_LAUNCHED_DESKTOP_FILE_PID
доступны дополнительно, а для HISTCONTROL
установлено значение ignoredups
вместо ignorespace
, SHLVL
равно 2
вместо 4
, а TERM
установлено на dump
вместо xterm-256color
.
На основе кода Стефана Шлехта я нашел следующий код Java, который должен воспроизвести проблему:
import java.io.*;
import java.util.*;
import org.eclipse.swt.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
public class EditorOpener {
public static void main(String[] args) {
final Map<String, String> getenv = System.getenv();
System.out.println(getenv);
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.addListener(SWT.Selection, event -> new Thread(() -> {
final ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command("/usr/bin/gedit");
final Map<String, String> environment = processBuilder.environment();
System.out.println(environment);
try {
final Process process = processBuilder.start();
process.waitFor();
}
catch (IOException | InterruptedException ex) {
ex.printStackTrace();
}
}).start());
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
Необходим 2 доступа к переменным среды.