diff --git a/tools/cmd/icat/magick.go b/tools/cmd/icat/magick.go index 621109b91..d3390730f 100644 --- a/tools/cmd/icat/magick.go +++ b/tools/cmd/icat/magick.go @@ -14,7 +14,6 @@ import ( "path/filepath" "strconv" "strings" - "sync" "kitty/tools/tui/graphics" "kitty/tools/utils" @@ -24,12 +23,13 @@ import ( var _ = fmt.Print -var find_exe_lock sync.Once -var magick_exe string = "" - -func find_magick_exe() { - magick_exe = utils.Which("magick") -} +var MagickExe = (&utils.Once[string]{Run: func() string { + ans := utils.Which("magick") + if ans == "" { + ans = utils.Which("magick", "/usr/local/bin", "/opt/bin", "/opt/homebrew/bin", "/usr/bin", "/bin", "/usr/sbin", "/sbin") + } + return ans +}}).Get func run_magick(path string, cmd []string) ([]byte, error) { c := exec.Command(cmd[0], cmd[1:]...) @@ -154,10 +154,9 @@ func parse_identify_record(ans *IdentifyRecord, raw *IdentifyOutput) (err error) } func Identify(path string) (ans []IdentifyRecord, err error) { - find_exe_lock.Do(find_magick_exe) cmd := []string{"identify"} - if magick_exe != "" { - cmd = []string{magick_exe, cmd[0]} + if MagickExe() != "" { + cmd = []string{MagickExe(), cmd[0]} } q := `{"fmt":"%m","canvas":"%g","transparency":"%A","gap":"%T","index":"%p","size":"%wx%h",` + `"dpi":"%xx%y","dispose":"%D","orientation":"%[EXIF:Orientation]"},` @@ -227,10 +226,9 @@ func check_resize(frame *image_frame) error { } func Render(path string, ro *RenderOptions, frames []IdentifyRecord) (ans []*image_frame, err error) { - find_exe_lock.Do(find_magick_exe) cmd := []string{"convert"} - if magick_exe != "" { - cmd = []string{magick_exe, cmd[0]} + if MagickExe() != "" { + cmd = []string{MagickExe(), cmd[0]} } ans = make([]*image_frame, 0, len(frames)) defer func() { diff --git a/tools/utils/mimetypes.go b/tools/utils/mimetypes.go index 80a38935a..b6d01d2f8 100644 --- a/tools/utils/mimetypes.go +++ b/tools/utils/mimetypes.go @@ -11,12 +11,9 @@ import ( "os" "path/filepath" "strings" - "sync" ) var _ = fmt.Print -var user_mime_only_once sync.Once -var user_defined_mime_map map[string]string func load_mime_file(filename string, mime_map map[string]string) error { f, err := os.Open(filename) @@ -45,18 +42,19 @@ func load_mime_file(filename string, mime_map map[string]string) error { return nil } -func load_user_mime_maps() { +var UserMimeMap = (&Once[map[string]string]{Run: func() map[string]string { conf_path := filepath.Join(ConfigDir(), "mime.types") - err := load_mime_file(conf_path, user_defined_mime_map) + ans := make(map[string]string, 32) + err := load_mime_file(conf_path, ans) if err != nil && !errors.Is(err, fs.ErrNotExist) { fmt.Fprintln(os.Stderr, "Failed to parse", conf_path, "for MIME types with error:", err) } -} + return ans +}}).Get func GuessMimeType(filename string) string { - user_mime_only_once.Do(load_user_mime_maps) ext := filepath.Ext(filename) - mime_with_parameters := user_defined_mime_map[ext] + mime_with_parameters := UserMimeMap()[ext] if mime_with_parameters == "" { mime_with_parameters = mime.TypeByExtension(ext) }