Compare commits

...

2 Commits

Author SHA1 Message Date
1675396d12 Merge pull request 'supported more terminals' (#3) from appmod/java-upgrade-20260130124304 into main
Reviewed-on: #3
2026-02-03 09:52:52 +01:00
rdavidek
0d32a794bf supported more terminals 2026-02-03 09:50:40 +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
Type=Application
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
Icon=/home/kamma/projects/kf-manager/src/main/resources/icon.png
StartupWMClass=cz-kamma-kfmanager-MainApp

View File

@ -5,6 +5,7 @@ import cz.kamma.kfmanager.model.FileItem;
import java.io.*;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.PosixFilePermission;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
@ -185,8 +186,14 @@ public class FileOperations {
}
try {
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) {
// 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) {
try {
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)) {
currentItem[0]++;
if (callback != null) {

View File

@ -14,6 +14,7 @@ import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@ -2304,17 +2305,36 @@ public class MainWindow extends JFrame {
new ProcessBuilder("open", "-a", "Terminal", currentDir.getAbsolutePath()).directory(currentDir).start();
} else {
// 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",
"gnome-terminal",
"konsole",
"xfce4-terminal",
"alacritty",
"kitty",
"foot",
"wezterm",
"mate-terminal",
"terminator",
"tilix",
"qterminal",
"urxvt",
"st",
"xterm"
};
));
boolean successfullyStarted = false;
for (String terminal : terminals) {
@ -2331,6 +2351,24 @@ public class MainWindow extends JFrame {
args.add(shellCommand);
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")) {
args.add("--workdir");
args.add(currentDir.getAbsolutePath());
@ -2472,8 +2510,16 @@ public class MainWindow extends JFrame {
// Otherwise try running as a native process
List<String> cmdList = parseCommand(command);
// Check if command contains shell metacharacters
boolean hasShellMeta = command.matches(".*[|&<>$!;*?].*");
try {
new ProcessBuilder(cmdList).directory(currentDir).start();
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();
}
} catch (IOException ex) {
// Fallback for different OS: try via shell
if (MainApp.CURRENT_OS == MainApp.OS.LINUX || MainApp.CURRENT_OS == MainApp.OS.MACOS) {