supported more terminals
This commit is contained in:
parent
1708bd5317
commit
0d32a794bf
2
kf-manager.desktop
Executable file → Normal file
2
kf-manager.desktop
Executable file → Normal 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
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -2303,17 +2304,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) {
|
||||
@ -2330,6 +2350,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());
|
||||
@ -2471,8 +2509,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 {
|
||||
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) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user