Deteksi aplikasi terminal (CLI/TUI) + perbaikan shortcut lazydocker
- internal/shortcut/terminal.go: RunsInTerminal() menebak dari library dinamis
(tanpa lib GUI = aplikasi terminal); script selalu true, .exe wine false
- checkbox 'Run in a terminal window' kini muncul untuk semua executable, bukan
hanya script, dan terisi otomatis saat berkas dipilih
- dialog edit: kalau entri lama belum menyalakan Terminal padahal aplikasinya
CLI/TUI, muncul catatan kecil sebagai petunjuk
- tes: script/.exe/binary CLI (test binary)/binary GUI (helium)/lazydocker nyata
- kasus nyata: lazydocker & docker-dash terpasang Terminal=false -> TUI gagal
('open /dev/tty: no such device or address'); dengan Terminal=true TUI jalan
This commit is contained in:
1 parent
35e83dba09
commit
63869e9158
7 files changed
+180
-18
No files matched your search
@@ -0,0 +1,48 @@
|
||||
package shortcut
|
||||
|
||||
import (
|
||||
"debug/elf"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// guiLibs adalah library yang menandakan aplikasi berjendela sendiri.
|
||||
// Kalau binary tidak memakai satu pun dari ini, biasanya ia program terminal.
|
||||
var guiLibs = []string{
|
||||
"libX11", "libxcb", "libwayland-client", "libgtk", "libgdk",
|
||||
"libQt5", "libQt6", "libSDL", "libGL", "libEGL", "libglfw", "libglib",
|
||||
}
|
||||
|
||||
// RunsInTerminal menebak apakah program perlu jendela terminal.
|
||||
//
|
||||
// Script dan aplikasi baris perintah butuh Terminal=true di .desktop,
|
||||
// sedangkan aplikasi GUI tidak (kalau dipaksa, jendela terminal ikut terbuka).
|
||||
// Tebakannya dari daftar library dinamis: tanpa library GUI dianggap CLI.
|
||||
func RunsInTerminal(path string) bool {
|
||||
kind := DetectKind(path)
|
||||
if kind == KindScript {
|
||||
return true
|
||||
}
|
||||
if kind == KindWindows {
|
||||
return false // .exe Windows (lewat wine) umumnya GUI
|
||||
}
|
||||
|
||||
f, err := elf.Open(path)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
libs, err := f.DynString(elf.DT_NEEDED)
|
||||
if err != nil {
|
||||
// binary statis (Go murni) tanpa dependency dinamis: kemungkinan CLI
|
||||
return true
|
||||
}
|
||||
for _, lib := range libs {
|
||||
for _, gui := range guiLibs {
|
||||
if strings.Contains(lib, gui) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
Reference in new issue
Block a user