supported more terminals #3
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
|
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
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user