From 0d32a794bf46ebf9fa126b4d9014cd174ac0250a Mon Sep 17 00:00:00 2001 From: rdavidek Date: Tue, 3 Feb 2026 09:50:40 +0100 Subject: [PATCH] supported more terminals --- kf-manager.desktop | 2 +- .../kfmanager/service/FileOperations.java | 17 +++++- .../cz/kamma/kfmanager/ui/MainWindow.java | 52 +++++++++++++++++-- 3 files changed, 66 insertions(+), 5 deletions(-) mode change 100755 => 100644 kf-manager.desktop diff --git a/kf-manager.desktop b/kf-manager.desktop old mode 100755 new mode 100644 index 41ef9ff..3a18891 --- a/kf-manager.desktop +++ b/kf-manager.desktop @@ -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 diff --git a/src/main/java/cz/kamma/kfmanager/service/FileOperations.java b/src/main/java/cz/kamma/kfmanager/service/FileOperations.java index cdc04ea..2baddc7 100644 --- a/src/main/java/cz/kamma/kfmanager/service/FileOperations.java +++ b/src/main/java/cz/kamma/kfmanager/service/FileOperations.java @@ -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 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 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) { diff --git a/src/main/java/cz/kamma/kfmanager/ui/MainWindow.java b/src/main/java/cz/kamma/kfmanager/ui/MainWindow.java index db768f0..9438f3a 100644 --- a/src/main/java/cz/kamma/kfmanager/ui/MainWindow.java +++ b/src/main/java/cz/kamma/kfmanager/ui/MainWindow.java @@ -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 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 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) { -- 2.47.2