supported more terminals #3

Merged
kamma merged 1 commits from appmod/java-upgrade-20260130124304 into main 2026-02-03 09:52:52 +01:00
3 changed files with 66 additions and 5 deletions

2
kf-manager.desktop Executable file → Normal file
View File

@ -3,7 +3,7 @@ Encoding=UTF-8
Version=1.0 Version=1.0
Type=Application Type=Application
Terminal=false Terminal=false
Exec=java -jar /home/kamma/projects/kf-manager/target/kf-manager-1.0-SNAPSHOT-jar-with-dependencies.jar Exec=/home/kamma/jdk-21.0.9+10/bin/java -jar /home/kamma/projects/kf-manager/target/kf-manager-1.0-SNAPSHOT-jar-with-dependencies.jar
Name=KF File Manager Name=KF File Manager
Icon=/home/kamma/projects/kf-manager/src/main/resources/icon.png Icon=/home/kamma/projects/kf-manager/src/main/resources/icon.png
StartupWMClass=cz-kamma-kfmanager-MainApp StartupWMClass=cz-kamma-kfmanager-MainApp

View File

@ -5,6 +5,7 @@ import cz.kamma.kfmanager.model.FileItem;
import java.io.*; import java.io.*;
import java.nio.file.*; import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.PosixFilePermission;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@ -185,8 +186,14 @@ public class FileOperations {
} }
try { try {
Files.setLastModifiedTime(target, Files.getLastModifiedTime(source)); Files.setLastModifiedTime(target, Files.getLastModifiedTime(source));
try {
Set<PosixFilePermission> permissions = Files.getPosixFilePermissions(source);
Files.setPosixFilePermissions(target, permissions);
} catch (UnsupportedOperationException ignore) {
// Not a POSIX filesystem
}
} catch (IOException e) { } catch (IOException e) {
// Ignore failure to set time on some filesystems (like network mounts) // Ignore failure to set time or permissions on some filesystems
} }
} }
@ -222,6 +229,14 @@ public class FileOperations {
while (true) { while (true) {
try { try {
Files.createDirectories(targetDir); Files.createDirectories(targetDir);
try {
Set<PosixFilePermission> permissions = Files.getPosixFilePermissions(dir);
Files.setPosixFilePermissions(targetDir, permissions);
} catch (UnsupportedOperationException ignore) {
} catch (IOException e) {
// Ignore permission set failures for directories too
}
if (!dir.toAbsolutePath().normalize().equals(effectiveSource)) { if (!dir.toAbsolutePath().normalize().equals(effectiveSource)) {
currentItem[0]++; currentItem[0]++;
if (callback != null) { if (callback != null) {

View File

@ -14,6 +14,7 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -2303,17 +2304,36 @@ public class MainWindow extends JFrame {
new ProcessBuilder("open", "-a", "Terminal", currentDir.getAbsolutePath()).directory(currentDir).start(); new ProcessBuilder("open", "-a", "Terminal", currentDir.getAbsolutePath()).directory(currentDir).start();
} else { } else {
// Linux - try common terminal emulators // Linux - try common terminal emulators
String[] terminals = { List<String> terminals = new ArrayList<>();
// 1. Try $TERMINAL environment variable
String envTerminal = System.getenv("TERMINAL");
if (envTerminal != null && !envTerminal.isEmpty()) {
terminals.add(envTerminal);
}
// 2. Try xdg-terminal-exec (modern standard)
terminals.add("xdg-terminal-exec");
// 3. Common terminal emulators
terminals.addAll(Arrays.asList(
"x-terminal-emulator", "x-terminal-emulator",
"gnome-terminal", "gnome-terminal",
"konsole", "konsole",
"xfce4-terminal", "xfce4-terminal",
"alacritty",
"kitty",
"foot",
"wezterm",
"mate-terminal", "mate-terminal",
"terminator", "terminator",
"tilix", "tilix",
"qterminal", "qterminal",
"urxvt",
"st",
"xterm" "xterm"
}; ));
boolean successfullyStarted = false; boolean successfullyStarted = false;
for (String terminal : terminals) { for (String terminal : terminals) {
@ -2330,6 +2350,24 @@ public class MainWindow extends JFrame {
args.add(shellCommand); args.add(shellCommand);
args.add("-i"); args.add("-i");
} }
} else if (terminal.equals("alacritty") || terminal.equals("foot")) {
args.add("--working-directory");
args.add(currentDir.getAbsolutePath());
if (shellCommand != null) {
args.add("-e");
args.add(shellCommand);
args.add("-i");
}
} else if (terminal.equals("kitty") || terminal.equals("wezterm")) {
// Kitty/Wezterm use 'start' or similar, but often just taking args
if (terminal.equals("kitty")) {
args.add("--directory");
args.add(currentDir.getAbsolutePath());
}
if (shellCommand != null) {
args.add(shellCommand);
args.add("-i");
}
} else if (terminal.equals("konsole") || terminal.equals("qterminal")) { } else if (terminal.equals("konsole") || terminal.equals("qterminal")) {
args.add("--workdir"); args.add("--workdir");
args.add(currentDir.getAbsolutePath()); args.add(currentDir.getAbsolutePath());
@ -2471,8 +2509,16 @@ public class MainWindow extends JFrame {
// Otherwise try running as a native process // Otherwise try running as a native process
List<String> cmdList = parseCommand(command); List<String> cmdList = parseCommand(command);
// Check if command contains shell metacharacters
boolean hasShellMeta = command.matches(".*[|&<>$!;*?].*");
try { try {
if (hasShellMeta && (MainApp.CURRENT_OS == MainApp.OS.LINUX || MainApp.CURRENT_OS == MainApp.OS.MACOS)) {
new ProcessBuilder("sh", "-c", command).directory(currentDir).start();
} else {
new ProcessBuilder(cmdList).directory(currentDir).start(); new ProcessBuilder(cmdList).directory(currentDir).start();
}
} catch (IOException ex) { } catch (IOException ex) {
// Fallback for different OS: try via shell // Fallback for different OS: try via shell
if (MainApp.CURRENT_OS == MainApp.OS.LINUX || MainApp.CURRENT_OS == MainApp.OS.MACOS) { if (MainApp.CURRENT_OS == MainApp.OS.LINUX || MainApp.CURRENT_OS == MainApp.OS.MACOS) {