46 lines
1.2 KiB
Go
46 lines
1.2 KiB
Go
//go:build darwin
|
|
|
|
package backend
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
)
|
|
|
|
func SetMacOSFileIconFromImage(filePath, imagePath string, iconSize int) error {
|
|
if filePath == "" {
|
|
return fmt.Errorf("file path is required")
|
|
}
|
|
if imagePath == "" {
|
|
return fmt.Errorf("image path is required")
|
|
}
|
|
|
|
resizedPath, err := ResizeImageForIcon(imagePath, iconSize)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer os.Remove(resizedPath)
|
|
|
|
script := `
|
|
use framework "AppKit"
|
|
on run argv
|
|
set imagePath to item 1 of argv
|
|
set targetPath to item 2 of argv
|
|
set iconImage to current application's NSImage's alloc()'s initWithContentsOfFile:imagePath
|
|
if iconImage is missing value then error "Failed to load icon image"
|
|
set didSet to (current application's NSWorkspace's sharedWorkspace()'s setIcon:iconImage forFile:targetPath options:0) as boolean
|
|
if didSet is false then error "Failed to set custom file icon"
|
|
end run
|
|
`
|
|
|
|
cmd := exec.Command("osascript", "-", resizedPath, filePath)
|
|
cmd.Stdin = strings.NewReader(script)
|
|
output, err := cmd.CombinedOutput()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to apply macOS file icon: %v (%s)", err, strings.TrimSpace(string(output)))
|
|
}
|
|
return nil
|
|
}
|