diff --git a/Makefile b/Makefile
index df81be7..9dccc41 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,9 @@
-why: *.go go.mod go.sum noise.png
+documentTypes.plist: filetypes/filetypes.go
+ go generate main.go
+
+why: *.go go.mod go.sum noise.png documentTypes.plist
go build .
why.app: why
- go tool appify -author "David Ashby" -id "in.yetaga.why" -name "why" -icon ./icon.png ./why
+ go tool appify -author "David Ashby" -id "in.yetaga.why" -name "why" -icon ./icon.png -plist ./documentTypes.plist ./why
rm why.app/Contents/README
diff --git a/documentTypes.plist b/documentTypes.plist
new file mode 100644
index 0000000..1f7715c
--- /dev/null
+++ b/documentTypes.plist
@@ -0,0 +1,172 @@
+
+CFBundleDocumentTypes
+
+
+ CFBundleTypeExtensions
+
+ bmp
+ BMP
+
+ CFBundleTypeIconFile
+ bmp.icns
+ CFBundleTypeMIMETypes
+
+ image/bmp
+
+ CFBundleTypeName
+ Windows Bitmap Image
+ CFBundleTypeOSTypes
+
+ BMP
+ BMPf
+
+ CFBundleTypeRole
+ Viewer
+ LSItemContentTypes
+
+ com.microsoft.bmp
+
+ LSTypeIsPackage
+
+
+
+ CFBundleTypeExtensions
+
+ jpg
+ JPG
+ jpeg
+ JPEG
+
+ CFBundleTypeIconFile
+ jpeg.icns
+ CFBundleTypeMIMETypes
+
+ image/jpeg
+
+ CFBundleTypeName
+ JPEG Image
+ CFBundleTypeOSTypes
+
+ JPEG
+
+ CFBundleTypeRole
+ Viewer
+ LSItemContentTypes
+
+ public.jpeg
+
+ LSTypeIsPackage
+
+
+
+ CFBundleTypeExtensions
+
+ gif
+ GIF
+
+ CFBundleTypeIconFile
+ gif.icns
+ CFBundleTypeMIMETypes
+
+ image/gif
+
+ CFBundleTypeName
+ Graphics Interchange Format Image
+ CFBundleTypeOSTypes
+
+ GIFf
+
+ CFBundleTypeRole
+ Viewer
+ LSItemContentTypes
+
+ com.compuserve.gif
+
+ LSTypeIsPackage
+
+
+
+ CFBundleTypeExtensions
+
+ PNG
+ png
+
+ CFBundleTypeIconFile
+ png.icns
+ CFBundleTypeMIMETypes
+
+ image/png
+
+ CFBundleTypeName
+ Portable Network Graphics Image
+ CFBundleTypeOSTypes
+
+ PNGf
+
+ CFBundleTypeRole
+ Viewer
+ LSItemContentTypes
+
+ public.png
+
+ LSTypeIsPackage
+
+
+
+ CFBundleTypeExtensions
+
+ tga
+ TGA
+
+ CFBundleTypeIconFile
+ tga.icns
+ CFBundleTypeMIMETypes
+
+ image/targa
+ image/tga
+ application/tga
+
+ CFBundleTypeName
+ Targa Image
+ CFBundleTypeOSTypes
+
+ TPIC
+
+ CFBundleTypeRole
+ Viewer
+ LSItemContentTypes
+
+ com.truevision.tga-image
+
+ LSTypeIsPackage
+
+
+
+ CFBundleTypeExtensions
+
+ tiff
+ TIFF
+ tif
+ TIF
+
+ CFBundleTypeIconFile
+ tiff.icns
+ CFBundleTypeMIMETypes
+
+ image/tiff
+
+ CFBundleTypeName
+ TIFF Image
+ CFBundleTypeOSTypes
+
+ TIFF
+
+ CFBundleTypeRole
+ Viewer
+ LSItemContentTypes
+
+ public.tiff
+
+ LSTypeIsPackage
+
+
diff --git a/filetypes/cmd/gen.go b/filetypes/cmd/gen.go
new file mode 100644
index 0000000..c395fc6
--- /dev/null
+++ b/filetypes/cmd/gen.go
@@ -0,0 +1,58 @@
+package main
+
+import (
+ "fmt"
+ "os"
+ "text/template"
+
+ "git.yetaga.in/alazyreader/why/filetypes"
+)
+
+func main() {
+ tpl, err := template.New("template").Parse(tmpl)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fplist, err := os.Create("documentTypes.plist")
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer fplist.Close()
+ if err := tpl.Execute(fplist, filetypes.Valid); err != nil {
+ fmt.Println(err)
+ return
+ }
+}
+
+var tmpl = `
+CFBundleDocumentTypes
+{{ range . }}
+
+ CFBundleTypeExtensions
+ {{ range .MacExtensions }}
+ {{ . }}{{ end }}
+
+ CFBundleTypeIconFile
+ {{ .IconFile }}
+ CFBundleTypeMIMETypes
+ {{ range .MIMETypes }}
+ {{ . }}{{ end }}
+
+ CFBundleTypeName
+ {{ .TypeName }}
+ CFBundleTypeOSTypes
+ {{ range .OSTypes }}
+ {{ . }}{{ end }}
+
+ CFBundleTypeRole
+ Viewer
+ LSItemContentTypes
+
+ {{ .ItemContentTypes }}
+
+ LSTypeIsPackage
+
+ {{ end }}
+`
diff --git a/filetypes/filetypes.go b/filetypes/filetypes.go
new file mode 100644
index 0000000..29e2f70
--- /dev/null
+++ b/filetypes/filetypes.go
@@ -0,0 +1,86 @@
+package filetypes
+
+import (
+ "fmt"
+
+ tk "modernc.org/tk9.0"
+)
+
+type FileDescription struct {
+ TkType tk.FileType
+ MacExtensions []string
+ IconFile string
+ MIMETypes []string
+ TypeName string
+ OSTypes []string
+ ItemContentTypes string
+}
+
+var Valid = []FileDescription{
+ {
+ TkType: tk.FileType{TypeName: "BMP", Extensions: []string{".bmp"}},
+ MacExtensions: []string{"bmp", "BMP"},
+ IconFile: "bmp.icns",
+ MIMETypes: []string{"image/bmp"},
+ TypeName: "Windows Bitmap Image",
+ OSTypes: []string{"BMP ", "BMPf"},
+ ItemContentTypes: "com.microsoft.bmp",
+ },
+ {
+ TkType: tk.FileType{TypeName: "JPEG", Extensions: []string{".jpg", ".jpeg"}},
+ MacExtensions: []string{"jpg", "JPG", "jpeg", "JPEG"},
+ IconFile: "jpeg.icns",
+ MIMETypes: []string{"image/jpeg"},
+ TypeName: "JPEG Image",
+ OSTypes: []string{"JPEG"},
+ ItemContentTypes: "public.jpeg",
+ },
+ {
+ TkType: tk.FileType{TypeName: "GIF", Extensions: []string{".gif"}},
+ MacExtensions: []string{"gif", "GIF"},
+ IconFile: "gif.icns",
+ MIMETypes: []string{"image/gif"},
+ TypeName: "Graphics Interchange Format Image",
+ OSTypes: []string{"GIFf"},
+ ItemContentTypes: "com.compuserve.gif",
+ },
+ {
+ TkType: tk.FileType{TypeName: "PNG", Extensions: []string{".png"}},
+ MacExtensions: []string{"PNG", "png"},
+ IconFile: "png.icns",
+ MIMETypes: []string{"image/png"},
+ TypeName: "Portable Network Graphics Image",
+ OSTypes: []string{"PNGf"},
+ ItemContentTypes: "public.png",
+ },
+ {
+ TkType: tk.FileType{TypeName: "TGA", Extensions: []string{".tga"}},
+ MacExtensions: []string{"tga", "TGA"},
+ IconFile: "tga.icns",
+ MIMETypes: []string{"image/targa", "image/tga", "application/tga"},
+ TypeName: "Targa Image",
+ OSTypes: []string{"TPIC"},
+ ItemContentTypes: "com.truevision.tga-image",
+ },
+ {
+ TkType: tk.FileType{TypeName: "TIFF", Extensions: []string{".tiff"}},
+ MacExtensions: []string{"tiff", "TIFF", "tif", "TIF"},
+ IconFile: "tiff.icns",
+ MIMETypes: []string{"image/tiff"},
+ TypeName: "TIFF Image",
+ OSTypes: []string{"TIFF"},
+ ItemContentTypes: "public.tiff",
+ },
+}
+
+func GetTkTypes(fds []FileDescription) []tk.FileType {
+ fts := make([]tk.FileType, len(fds))
+ for i, fd := range fds {
+ fts[i] = fd.TkType
+ }
+ return fts
+}
+
+func main() {
+ fmt.Println("test")
+}
diff --git a/go.mod b/go.mod
index 9a50b2d..2c17185 100644
--- a/go.mod
+++ b/go.mod
@@ -1,13 +1,14 @@
module git.yetaga.in/alazyreader/why
-go 1.24.0
+go 1.24.2
require (
github.com/disintegration/imaging v1.6.2
- modernc.org/tk9.0 v0.69.2-0.20250422161729-57986fe43019
+ modernc.org/tk9.0 v0.69.2-0.20250503045026-5f4b255796b2
)
require (
+ git.yetaga.in/alazyreader/appify v0.0.0-20250503185351-c56d5058ecd7 // indirect
github.com/JackMordaunt/icns v1.0.0 // indirect
github.com/adrg/xdg v0.5.3 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
@@ -15,8 +16,6 @@ require (
github.com/evilsocket/islazy v1.11.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
- github.com/machinebox/appify v0.0.0-20180512101119-15c1e09ce924 // indirect
- github.com/matryer/is v1.4.1 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/ncruces/go-strftime v0.1.9 // indirect
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect
@@ -26,34 +25,34 @@ require (
golang.org/x/image v0.26.0 // indirect
golang.org/x/net v0.39.0 // indirect
golang.org/x/sys v0.32.0 // indirect
- modernc.org/fileutil v1.3.0 // indirect
+ modernc.org/fileutil v1.3.1 // indirect
modernc.org/fsm v1.3.2 // indirect
- modernc.org/gc/v3 v3.0.0-20250225134559-fd9931328834 // indirect
- modernc.org/knuth v0.5.4 // indirect
- modernc.org/libX11 v0.11.15 // indirect
- modernc.org/libXau v0.9.14 // indirect
- modernc.org/libXdmcp v0.12.13 // indirect
+ modernc.org/gc/v3 v3.1.0 // indirect
+ modernc.org/knuth v0.5.5 // indirect
+ modernc.org/libX11 v0.11.17 // indirect
+ modernc.org/libXau v0.9.15 // indirect
+ modernc.org/libXdmcp v0.12.14 // indirect
modernc.org/libXft v0.10.19 // indirect
modernc.org/libXrender v0.9.13 // indirect
- modernc.org/libbsd v0.11.9 // indirect
- modernc.org/libc v1.63.0 // indirect
+ modernc.org/libbsd v0.11.10 // indirect
+ modernc.org/libc v1.65.0 // indirect
modernc.org/libexpat v0.10.12 // indirect
modernc.org/libfontconfig v0.8.11 // indirect
modernc.org/libfreetype v0.9.18 // indirect
- modernc.org/libmd v0.12.16 // indirect
- modernc.org/libtcl9.0 v0.16.4 // indirect
- modernc.org/libtk9.0 v0.16.3 // indirect
- modernc.org/libxcb v0.12.0 // indirect
- modernc.org/libz v0.16.15 // indirect
+ modernc.org/libmd v0.12.17 // indirect
+ modernc.org/libtcl9.0 v0.16.5 // indirect
+ modernc.org/libtk9.0 v0.16.5 // indirect
+ modernc.org/libxcb v0.12.2 // indirect
+ modernc.org/libz v0.16.16 // indirect
modernc.org/mathutil v1.7.1 // indirect
modernc.org/memory v1.10.0 // indirect
modernc.org/ngrab v0.1.0 // indirect
- modernc.org/rec v0.3.3 // indirect
+ modernc.org/rec v0.3.4 // indirect
modernc.org/regexp v1.7.9 // indirect
modernc.org/sortutil v1.2.1 // indirect
modernc.org/strutil v1.2.1 // indirect
- modernc.org/tcl9.0 v0.16.1 // indirect
+ modernc.org/tcl9.0 v0.16.3 // indirect
modernc.org/token v1.1.0 // indirect
)
-tool github.com/machinebox/appify
+tool git.yetaga.in/alazyreader/appify
diff --git a/go.sum b/go.sum
index 9844073..8e69983 100644
--- a/go.sum
+++ b/go.sum
@@ -1,3 +1,7 @@
+git.yetaga.in/alazyreader/appify v0.0.0-20250503174620-8405a8d01bbf h1:CIKowzAteCRfrCfmleu5OpT4Q0Fyq4YGrjVfxQoeKyo=
+git.yetaga.in/alazyreader/appify v0.0.0-20250503174620-8405a8d01bbf/go.mod h1:IiKVQ0CCXOttESuneF0yMzNsfUEt9Qyw0WuLBxrJPNQ=
+git.yetaga.in/alazyreader/appify v0.0.0-20250503185351-c56d5058ecd7 h1:LaEQIwrahg2uZhiZFE8syyodmMjKSP6/gtLEiQY3LXo=
+git.yetaga.in/alazyreader/appify v0.0.0-20250503185351-c56d5058ecd7/go.mod h1:IiKVQ0CCXOttESuneF0yMzNsfUEt9Qyw0WuLBxrJPNQ=
github.com/JackMordaunt/icns v1.0.0 h1:41cNyWyQrG6beMw7m93LFK5o1GhefflsBTkauUkUtG8=
github.com/JackMordaunt/icns v1.0.0/go.mod h1:ubRqphS0f2OD07BuNaQSuw9uHUVQNBX5g38n6i2bdqM=
github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78=
@@ -18,8 +22,6 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
-github.com/machinebox/appify v0.0.0-20180512101119-15c1e09ce924 h1:uXvs2WoTfOUZuGu+qJUUZWb5UxBU59DLlZhZBxNgBFs=
-github.com/machinebox/appify v0.0.0-20180512101119-15c1e09ce924/go.mod h1:sqsRpT+VgEXox31qA9IQ9sEO8VQ/q7v7Y9WFxWkQTF0=
github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ=
github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
@@ -36,8 +38,6 @@ github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
-golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw=
-golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM=
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM=
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
@@ -47,111 +47,79 @@ golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU=
golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
-golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw=
-golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
+golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU=
-golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ=
golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU=
+golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-modernc.org/cc/v4 v4.25.2 h1:T2oH7sZdGvTaie0BRNFbIYsabzCxUQg8nLqCdQ2i0ic=
-modernc.org/cc/v4 v4.25.2/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
modernc.org/cc/v4 v4.26.0 h1:QMYvbVduUGH0rrO+5mqF/PSPPRZNpRtg2CLELy7vUpA=
-modernc.org/ccgo/v4 v4.25.2 h1:OIXoYwU8LU+niNKTi3OyfgQacetOpgrEJMGMsDZQt4g=
-modernc.org/ccgo/v4 v4.25.2/go.mod h1:Cf2zhnyzU8MivGJl/asSCJ7T9COaAWpenv0lnf1XY+U=
+modernc.org/cc/v4 v4.26.0/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
modernc.org/ccgo/v4 v4.26.0 h1:gVzXaDzGeBYJ2uXTOpR8FR7OlksDOe9jxnjhIKCsiTc=
-modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=
-modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ=
+modernc.org/ccgo/v4 v4.26.0/go.mod h1:Sem8f7TFUtVXkG2fiaChQtyyfkqhJBg/zjEJBkmuAVY=
+modernc.org/fileutil v1.3.1 h1:8vq5fe7jdtEvoCf3Zf9Nm0Q05sH6kGx0Op2CPx1wTC8=
+modernc.org/fileutil v1.3.1/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc=
modernc.org/fsm v1.3.2 h1:f58HBydnAmLhugDKOlNniDYfKRcOH/3T4xQTO1AZXag=
modernc.org/fsm v1.3.2/go.mod h1:5eK6OWqnX8io83LPfzIlNnUrkpxN/r1ONq3wVi8kvio=
modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI=
modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito=
-modernc.org/gc/v3 v3.0.0-20250225134559-fd9931328834 h1:Qv+IG+6zQZSvUPRwUOgnMoAhy6rAhBB7WYY8IAfKG+c=
-modernc.org/gc/v3 v3.0.0-20250225134559-fd9931328834/go.mod h1:LG5UO1Ran4OO0JRKz2oNiXhR5nNrgz0PzH7UKhz0aMU=
-modernc.org/knuth v0.5.4 h1:F8mDs7ME3oN9eyx01n6/xVmJ4F5U/qEhSYPnPXaZrps=
-modernc.org/knuth v0.5.4/go.mod h1:e5SBb35HQBj2aFwbBO3ClPcViLY3Wi0LzaOd7c/3qMk=
-modernc.org/libX11 v0.11.14 h1:PgPms46sSh2DcvyoKiN6b4P/C8oWRK3wY7UjBW63CJc=
-modernc.org/libX11 v0.11.14/go.mod h1:81woNnAmSSwxSbzcWvusNsQjWkZFqxhJGdJn1r/KVh4=
-modernc.org/libX11 v0.11.15 h1:3D3NQXOmbORMmn++s04I5VsKs8wZemf2J3NyYVSNFVg=
-modernc.org/libX11 v0.11.15/go.mod h1:qgN+KhFg1QCVsPv3iM7M0BBbZTgFI975YK3wr1zndA4=
-modernc.org/libXau v0.9.9 h1:M+I0tAYSU5/xZEvGH9yCpMOyFy1fbuixrONJX0XJTUk=
-modernc.org/libXau v0.9.9/go.mod h1:CQMi6xKr4ejSzktdkI+p6hKmE+ibvHMpaH5XWyIu5ic=
-modernc.org/libXau v0.9.14 h1:BA1gpF6ekuRxpg1ae9Pej5qaoaqe1gTLMVZSanD99W0=
-modernc.org/libXau v0.9.14/go.mod h1:SBL9NzJwYtmzTM4E60ACsYYJ+9mpkpi8Sx+VEM7dnOw=
-modernc.org/libXdmcp v0.12.9 h1:VdL/KAY0F+hVcxwR0GIgClPlKjc9OMCSRC1NXyIyllQ=
-modernc.org/libXdmcp v0.12.9/go.mod h1:ggxs82DX1F9+SArhp8/PcJM4qmES47pnV0AHtKF9giI=
-modernc.org/libXdmcp v0.12.13 h1:ZyMSTJcuUNtfFs/tIQULB57LPDA7DZogn85o8oC5jJI=
-modernc.org/libXdmcp v0.12.13/go.mod h1:oFUZJ4Gwa2E1g0p6FYUeUsBCJozmg2eSE2UV0heIdb8=
+modernc.org/gc/v3 v3.1.0 h1:CiObI+9ROz7pjjH3iAgMPaFCN5zE3sN5KF4jet8BWdc=
+modernc.org/gc/v3 v3.1.0/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY=
+modernc.org/knuth v0.5.5 h1:6lap2U/ISm8aC/4NU58ALFCRllNPaK0EZcIGY/oDgUg=
+modernc.org/knuth v0.5.5/go.mod h1:e5SBb35HQBj2aFwbBO3ClPcViLY3Wi0LzaOd7c/3qMk=
+modernc.org/libX11 v0.11.17 h1:eDwulcBXBtL4frWL6icZJB/waLydlpHt1mb6TknomkM=
+modernc.org/libX11 v0.11.17/go.mod h1:KC3QhbAzNLtag+yj41yjCq/ZBy8jYAfo7rvf9aKL3Mc=
+modernc.org/libXau v0.9.15 h1:erNjsLtSZ/9D015erwJbHeDsutkT6LEOON+VI8YuLb0=
+modernc.org/libXau v0.9.15/go.mod h1:LGo6mRHOYNa4ym1ttCifNrWiFc1neZfcfDfgGdy7+tM=
+modernc.org/libXdmcp v0.12.14 h1:plw/jQFUFpNCEjyV+BzCHr/16LnjiHx/RxzNK0p1B3w=
+modernc.org/libXdmcp v0.12.14/go.mod h1:f7BBFOuCpELPBj5YrDf5JXIuXzIHUncB1mRObDLCj8Y=
modernc.org/libXft v0.10.19 h1:GuMqRxQBBC3feRH7TMkCC6EIeY8j7+HLm5oQlNSxAIw=
modernc.org/libXft v0.10.19/go.mod h1:x7wcmlnUzG9SLfXZMG1DbMN6bRwNV+eZT4xN+iQSLkQ=
modernc.org/libXrender v0.9.13 h1:aTH9Ii0TepPm1MmC9aDr06UXNw5XvrIHC45y+3ULeRY=
modernc.org/libXrender v0.9.13/go.mod h1:6K3VytTIn9aA8WOZQY0ZjB172pVI0VR66WLOsVW7sLo=
-modernc.org/libbsd v0.11.8 h1:lBSRhXYUMjuiYUfYWF1VcT9kTIFH8j/aaDYF+Pck964=
-modernc.org/libbsd v0.11.8/go.mod h1:g8wcLe7VT2dSI0R4z0xIF4UHZRMIpjIQPIpRJN6td7o=
-modernc.org/libbsd v0.11.9 h1:pSlbW7odcLV3VkbvaRem+VfWakCzEvIF5GkCGfJcW1I=
-modernc.org/libbsd v0.11.9/go.mod h1:djHSKwma0pxO46lWLEoJdHyQQGw3y57lXs3UejXpNFc=
-modernc.org/libc v1.62.1 h1:s0+fv5E3FymN8eJVmnk0llBe6rOxCu/DEU+XygRbS8s=
-modernc.org/libc v1.62.1/go.mod h1:iXhATfJQLjG3NWy56a6WVU73lWOcdYVxsvwCgoPljuo=
-modernc.org/libc v1.63.0 h1:wKzb61wOGCzgahQBORb1b0dZonh8Ufzl/7r4Yf1D5YA=
-modernc.org/libc v1.63.0/go.mod h1:wDzH1mgz1wUIEwottFt++POjGRO9sgyQKrpXaz3x89E=
+modernc.org/libbsd v0.11.10 h1:BYRxR4L7paz3UPreS1PuKB08vULCIGcHX3GA4bBpwzQ=
+modernc.org/libbsd v0.11.10/go.mod h1:NdciOdGkUDnB93ld9/nxlNG8yKhTGr6BzNGzlPErqtI=
+modernc.org/libc v1.65.0 h1:e183gLDnAp9VJh6gWKdTy0CThL9Pt7MfcR/0bgb7Y1Y=
+modernc.org/libc v1.65.0/go.mod h1:7m9VzGq7APssBTydds2zBcxGREwvIGpuUBaKTXdm2Qs=
modernc.org/libexpat v0.10.12 h1:SNjo4U5z7Uu01qId6RTDH5uYT1+T94Z1JJ0s8g1FB2o=
modernc.org/libexpat v0.10.12/go.mod h1:E4er4v37XcC813LkDSqbt7SB1Jj071/ceIorg1kRjzI=
modernc.org/libfontconfig v0.8.11 h1:Tqz8Ooi0qgLvD6JUbNzamqlyOwq3NPAE2N4cOF3ymYw=
modernc.org/libfontconfig v0.8.11/go.mod h1:jQaZKgJBVGmupcOKGH8C1rGr/T+VftwG/idM3cycwKY=
modernc.org/libfreetype v0.9.18 h1:RBCWzuMAmxt7Wqq/oCS08nFCscqYUDFbRPuCkTYqHCo=
modernc.org/libfreetype v0.9.18/go.mod h1:wHJJk5gn2Dw93JBGwLeSB5mAaxF6sKTbsM/p1ygQudQ=
-modernc.org/libmd v0.12.15 h1:LgXokdUq+nawxNPSSce/0FvmM3atr62JOqLq9LDmY7U=
-modernc.org/libmd v0.12.15/go.mod h1:HwP6ekjVbbTn5t/xJHRi2aK47fY6vs1bSPqunl8mVt4=
-modernc.org/libmd v0.12.16 h1:ZN/zuLI/1XWziYETHscTfZS8Y2y9+QNO1M/cNLeSaKM=
-modernc.org/libmd v0.12.16/go.mod h1:FNkvT9ZLG4azbJ0evioCCMlESfjcp4h/9b0Chptf3hk=
-modernc.org/libtcl9.0 v0.16.3 h1:/zRNPpQwuI4g6RymMnk+WMcUVsw7ubb3Su1HmAz0pRk=
-modernc.org/libtcl9.0 v0.16.3/go.mod h1:yci8r8dmrCHyiAD/6uUnU33FHgDcD5zpjI2o8geI8wg=
-modernc.org/libtcl9.0 v0.16.4 h1:2l89BUqhERtlwlooikMJIexh7lDplaE66IPdtBPgAsA=
-modernc.org/libtcl9.0 v0.16.4/go.mod h1:wS8cDFpEeEFNAk2dwTXX3xfRj6Ro2xBEahgwSUbFsX8=
-modernc.org/libtk9.0 v0.16.2 h1:deSs6jHnQA8cigX2CLzvWrpTMWuruQKB2Q3B7uzAdRw=
-modernc.org/libtk9.0 v0.16.2/go.mod h1:6oy9MEoR04AUHCAKQ0hYVlcZWbWAiMaXlHCu7Ig2AU4=
-modernc.org/libtk9.0 v0.16.3 h1:MUnf4JrLFb1xLqlHxp6WzlVdhSvh9R25xLKVaJ8YgHU=
-modernc.org/libtk9.0 v0.16.3/go.mod h1:pSLpdqe6Ioc+OcGABQXlxvfMWk+Lmwp/WUMxE24ezQ0=
-modernc.org/libxcb v0.11.3 h1:N7DIx5UPn6xpWTkCGQ5SY/wKWaDWaixRMHCPA/4SPMs=
-modernc.org/libxcb v0.11.3/go.mod h1:Gv8miMFngEJMKsMA5zSCGgLDE/o85OWAKrdOiZY8hbk=
-modernc.org/libxcb v0.12.0 h1:y7BhbYeJRdJIv4VxmW2uhY9vSY8yqIHtuB2QAoJrdzw=
-modernc.org/libxcb v0.12.0/go.mod h1:eP7i7d5NBjWNq8njt3u1l6PoDfTU/R5i+cLuIOldbKY=
-modernc.org/libz v0.16.15 h1:E1JHwmF+LYxE97PgZqlVoiNM3JletNYy8lM4rQuWhWg=
-modernc.org/libz v0.16.15/go.mod h1:ZEfDnPewNb6xrSxZwAnRckDsC0C7cObJqIsDCmhl9ko=
+modernc.org/libmd v0.12.17 h1:bWo6Gb3kBiYKxOeRvhISd/VJZUejYydnEH5u9osinU0=
+modernc.org/libmd v0.12.17/go.mod h1:AIRFRz1/xNBhwspSuxtFfrb8yRJfn2o66re0ZtRBxCo=
+modernc.org/libtcl9.0 v0.16.5 h1:HWUh3ZtdUE8XOGilxHNwRBEGE9i0jeyzypveRoK/GPE=
+modernc.org/libtcl9.0 v0.16.5/go.mod h1:rKOuD5Ytvnqr8+HpIGlaozWwlgzi+ki75L/1IUDKeR8=
+modernc.org/libtk9.0 v0.16.5 h1:KEIlGev1mHBa4t/g3dL4/SNfLHSYEoO6C5Dg3wczFY8=
+modernc.org/libtk9.0 v0.16.5/go.mod h1:95l9j6RkE8jkbUOkPs8ZrYMjtfllU4QMHntiXt1t6pY=
+modernc.org/libxcb v0.12.2 h1:N5nVW4HCLVGT2y5E3vfGEY6BMRFn4PRH8//DmpolYAI=
+modernc.org/libxcb v0.12.2/go.mod h1:PP+9wTGB9E8MPEoVUiRdC1uesfmqFA7iNHEHU6M1rxY=
+modernc.org/libz v0.16.16 h1:4kGPL+nynQQFoE28T3t7wfauF80puO/G/6opFO3Xik4=
+modernc.org/libz v0.16.16/go.mod h1:c9DKRBJzQSMLAK1W+Toq3ZkzJGt2UihYZwgnTwEXih4=
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
-modernc.org/memory v1.9.1 h1:V/Z1solwAVmMW1yttq3nDdZPJqV1rM05Ccq6KMSZ34g=
-modernc.org/memory v1.9.1/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw=
modernc.org/memory v1.10.0 h1:fzumd51yQ1DxcOxSO+S6X7+QTuVU+n8/Aj7swYjFfC4=
modernc.org/memory v1.10.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw=
modernc.org/ngrab v0.1.0 h1:21cX4tAIfLNjR4ax7JMfHTz2ztnjVGcCSsztoG6EFMk=
modernc.org/ngrab v0.1.0/go.mod h1:dDGjUip6IXmb5Y5M8RPYD7Sg4S/VdfG5akxK34uYtOE=
modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8=
modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns=
-modernc.org/rec v0.3.3 h1:u4sHCz+Ey5vBXfSScSDal3rSf9RsBGjR/8pPL0ZqOaY=
-modernc.org/rec v0.3.3/go.mod h1:sZ5tGUH9yNUrqwUrpD044f+5zLSOXTB6sE/u789vRto=
+modernc.org/rec v0.3.4 h1:Xz45MWGOIqFsxUuSqaF5Spe0lFpKhF4CAGouVIz5fr4=
+modernc.org/rec v0.3.4/go.mod h1:WuVkIAFWRDdsRcNRbxdv5Bw/uWSOmiVaUegJ5GwAKq0=
modernc.org/regexp v1.7.9 h1:PnzXQinFBbSiXcLunjHWrKPvZqNmyw0DfdZx0rvvzQo=
modernc.org/regexp v1.7.9/go.mod h1:DsTv3IO8vq8ahN8IHKJ0s3j5oFNfkBnGN6VuWzr7Afs=
modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w=
modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE=
modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0=
modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A=
-modernc.org/tcl9.0 v0.16.0 h1:Me5on7SpLPIv3yEkUiFVG14YR1AbvzHrZGkEu4s696s=
-modernc.org/tcl9.0 v0.16.0/go.mod h1:RMBQkc0bU2Sl7et9IoZjFG3Bcehh+6ARJgVBpKJ48+4=
-modernc.org/tcl9.0 v0.16.1 h1:D9WYmjBavBhtXHSQ06NAwO8ij9nRJ1eCgygdHzyxpTg=
-modernc.org/tcl9.0 v0.16.1/go.mod h1:d8Ifo4FINBlgfztjJisQjom2QsoAJJE6RNxW/+5goj8=
-modernc.org/tk9.0 v0.68.0 h1:Qt6ENHG774ZYsDpMq5R1VKR0S5PQdyuQXFtMol6WJyg=
-modernc.org/tk9.0 v0.68.0/go.mod h1:YAR5KsxdaU5uTL+1PLEXrQN+rrhJ+Sz+suwXM7piwFU=
-modernc.org/tk9.0 v0.68.2-0.20250417123848-ef9ac7c6aea1 h1:Gg+D6aT+sW5zTGjRspRv2HPnWAJvamXpDwEx+ea1GzA=
-modernc.org/tk9.0 v0.68.2-0.20250417123848-ef9ac7c6aea1/go.mod h1:YAR5KsxdaU5uTL+1PLEXrQN+rrhJ+Sz+suwXM7piwFU=
-modernc.org/tk9.0 v0.69.1 h1:XKrpVqmSu5Mm8nKqMrIrHak+xiNHWCMleT5xkN0GXi4=
-modernc.org/tk9.0 v0.69.1/go.mod h1:5+l1KGhaMWL3ORkSFykTb5sZIKRNcsRAKJWOLr0qJLI=
-modernc.org/tk9.0 v0.69.2-0.20250422161729-57986fe43019 h1:o3qrJ0Axl5wRplB4AzTy9q6wrIRdJkS8cRsPFhz7F/Q=
-modernc.org/tk9.0 v0.69.2-0.20250422161729-57986fe43019/go.mod h1:Mz1RSwwp5yLex7Z+DKJ4rgPZ4Q8tx1AlbdIUFvES58w=
+modernc.org/tcl9.0 v0.16.3 h1:Ykk//Y1Y5hWAsP4PdNO8cuyNQoHaUi5R1MfhcR7nl14=
+modernc.org/tcl9.0 v0.16.3/go.mod h1:medUnDX1LjAFR3Mbkbl7caOcasZhG2ImZWpnQzN0HeI=
+modernc.org/tk9.0 v0.69.2-0.20250503045026-5f4b255796b2 h1:6YB9d9tKW9acsnqaOSL05jkaRcQICNOaSs9vhU3Uh9s=
+modernc.org/tk9.0 v0.69.2-0.20250503045026-5f4b255796b2/go.mod h1:1aRzoF7LJP3qcELn4OgCa93OCCH91W9Az5W4eLM9clg=
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
diff --git a/main.go b/main.go
index 869155c..0eb00e2 100644
--- a/main.go
+++ b/main.go
@@ -10,6 +10,7 @@ import (
"strconv"
"strings"
+ "git.yetaga.in/alazyreader/why/filetypes"
"github.com/disintegration/imaging"
tk "modernc.org/tk9.0"
)
@@ -24,16 +25,8 @@ var noise []byte
//go:embed icon.png
var icon []byte
-var validFileTypes = []tk.FileType{
- {TypeName: "BMP", Extensions: []string{".bmp"}},
- {TypeName: "JPEG", Extensions: []string{".jpg", ".jpeg"}},
- {TypeName: "GIF", Extensions: []string{".gif"}},
- {TypeName: "PNG", Extensions: []string{".png"}},
- {TypeName: "SVG", Extensions: []string{".svg"}},
- {TypeName: "TGA", Extensions: []string{".tga"}},
- {TypeName: "TIFF", Extensions: []string{".tiff"}},
-}
-
+//go:generate go run ./filetypes/cmd/gen.go
+var validFileTypes = filetypes.Valid
var metaActive bool
var fileList *tk.ToplevelWidget
var lb *tk.ListboxWidget
@@ -57,7 +50,7 @@ func isImage(entry os.DirEntry) bool {
}
ext := filepath.Ext(entry.Name())
for _, ft := range validFileTypes {
- if slices.Contains(ft.Extensions, ext) {
+ if slices.Contains(ft.TkType.Extensions, ext) {
return true
}
}
@@ -66,29 +59,33 @@ func isImage(entry os.DirEntry) bool {
func newFileInDirectory(img *tk.LabelWidget) func() {
return func() {
- files := tk.GetOpenFile(tk.Filetypes(validFileTypes), tk.Multiple(false))
+ files := tk.GetOpenFile(tk.Filetypes(filetypes.GetTkTypes(validFileTypes)), tk.Multiple(false))
if len(files) < 1 || files[0] == "" {
log.Println("no file chosen")
return
}
file := strings.Join(files, " ") // GetOpenFile returns an array split on spaces!
- directoryState.currentFile = filepath.Base(file)
- directoryState.currentDirectory = filepath.Dir(file)
- dirfiles, err := os.ReadDir(directoryState.currentDirectory)
- if err != nil {
- log.Printf("could not open dir: %v", err)
- return
- }
- directoryState.images = []string{}
- for _, v := range dirfiles {
- if isImage(v) {
- directoryState.images = append(directoryState.images, v.Name())
- }
- }
- updateImage(file, img)
+ openFileAndDirectory(img, file)
}
}
+func openFileAndDirectory(img *tk.LabelWidget, file string) {
+ directoryState.currentFile = filepath.Base(file)
+ directoryState.currentDirectory = filepath.Dir(file)
+ dirfiles, err := os.ReadDir(directoryState.currentDirectory)
+ if err != nil {
+ log.Printf("could not open dir: %v", err)
+ return
+ }
+ directoryState.images = []string{}
+ for _, v := range dirfiles {
+ if isImage(v) {
+ directoryState.images = append(directoryState.images, v.Name())
+ }
+ }
+ updateImage(file, img)
+}
+
func newDirectory(img *tk.LabelWidget) func() {
return func() {
dir := tk.ChooseDirectory()
@@ -140,6 +137,10 @@ func main() {
img := tk.Label()
repaint(img, "", tk.Data(noise))
+ tk.MacOpenDocument(func(e string) {
+ openFileAndDirectory(img, e)
+ })
+
menubar := tk.Menu()
fileMenu := menubar.Menu()
fileMenu.AddCommand(tk.Lbl("Open File"), tk.Accelerator("Meta+O"), tk.Command(newFileInDirectory(img)))