- 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
49 lines
1.2 KiB
Go
49 lines
1.2 KiB
Go
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
|
|
}
|