From 4e074f8aa0cd7b35422be85caab97bda4fa17318 Mon Sep 17 00:00:00 2001 From: Igor Karatayev Date: Fri, 6 Mar 2026 22:24:09 +0300 Subject: [PATCH 1/5] Autoappend extension selected from a filter --- dlgs_windows.go | 13 +++++++++++-- go.mod | 13 ++++++++++++- go.sum | 14 ++++++++++++++ 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/dlgs_windows.go b/dlgs_windows.go index b0a9686..d117991 100644 --- a/dlgs_windows.go +++ b/dlgs_windows.go @@ -2,7 +2,9 @@ package dialog import ( "fmt" + "path" "reflect" + "slices" "syscall" "unicode/utf16" "unsafe" @@ -62,7 +64,14 @@ func (b *FileBuilder) load() (string, error) { func (b *FileBuilder) save() (string, error) { d := openfile(w32.OFN_OVERWRITEPROMPT|w32.OFN_NOCHANGEDIR, b) if w32.GetSaveFileName(d.opf) { - return d.Filename(), nil + filename := d.Filename() + filterExt := b.Filters[d.opf.FilterIndex-1].Extensions + fileext := path.Ext(filename) + if slices.Contains(filterExt, fileext) { + return filename, nil + } + + return filename + "." + filterExt[0], nil } return "", err() } @@ -113,7 +122,7 @@ func openfile(flags uint32, b *FileBuilder) (d filedlg) { d.filters = append(d.filters, utf16.Encode([]rune(filt.Desc))...) d.filters = append(d.filters, 0) for _, ext := range filt.Extensions { - s := fmt.Sprintf("*.%s;", ext) + s := fmt.Sprintf(".%s;", ext) d.filters = append(d.filters, utf16.Encode([]rune(s))...) } d.filters = append(d.filters, 0) diff --git a/go.mod b/go.mod index ffa1366..ffa2776 100644 --- a/go.mod +++ b/go.mod @@ -1,5 +1,16 @@ module github.com/sqweek/dialog +go 1.21 + +require ( + github.com/TheTitanrain/w32 v0.0.0-20200114052255-2654d97dbd3d + github.com/skelterjohn/go.wde v0.0.0-20190318181201-adc3f78cdb45 +) + require ( - github.com/TheTitanrain/w32 v0.0.0-20180517000239-4f5cfb03fabf + github.com/AllenDang/w32 v0.0.0-20180428130237-ad0a36d80adc // indirect + github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298 // indirect + github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966 // indirect + github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc // indirect + github.com/BurntSushi/xgbutil v0.0.0-20190907113008-ad855c713046 // indirect ) diff --git a/go.sum b/go.sum index 842aef2..03858fa 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,16 @@ +github.com/AllenDang/w32 v0.0.0-20180428130237-ad0a36d80adc h1:w3fW4b1hPf6/cfdQQ/vu9V8eBeQmuLZIaUMj81nIzYQ= +github.com/AllenDang/w32 v0.0.0-20180428130237-ad0a36d80adc/go.mod h1:1rHKulT5eD2DzdKxDXUZRKtBfkTzLmTL42ZmEmOfyrs= +github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298 h1:1qlsVAQJXZHsaM8b6OLVo6muQUQd4CwkH/D3fnnbHXA= +github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298/go.mod h1:D+QujdIlUNfa0igpNMk6UIvlb6C252URs4yupRUV4lQ= +github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966 h1:lTG4HQym5oPKjL7nGs+csTgiDna685ZXjxijkne828g= +github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966/go.mod h1:Mid70uvE93zn9wgF92A/r5ixgnvX8Lh68fxp9KQBaI0= +github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc h1:7D+Bh06CRPCJO3gr2F7h1sriovOZ8BMhca2Rg85c2nk= +github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/BurntSushi/xgbutil v0.0.0-20190907113008-ad855c713046 h1:O/r2Sj+8QcMF7V5IcmiE2sMFV2q3J47BEirxbXJAdzA= +github.com/BurntSushi/xgbutil v0.0.0-20190907113008-ad855c713046/go.mod h1:uw9h2sd4WWHOPdJ13MQpwK5qYWKYDumDqxWWIknEQ+k= github.com/TheTitanrain/w32 v0.0.0-20180517000239-4f5cfb03fabf h1:FPsprx82rdrX2jiKyS17BH6IrTmUBYqZa/CXT4uvb+I= github.com/TheTitanrain/w32 v0.0.0-20180517000239-4f5cfb03fabf/go.mod h1:peYoMncQljjNS6tZwI9WVyQB3qZS6u79/N3mBOcnd3I= +github.com/TheTitanrain/w32 v0.0.0-20200114052255-2654d97dbd3d h1:2xp1BQbqcDDaikHnASWpVZRjibOxu7y9LhAv04whugI= +github.com/TheTitanrain/w32 v0.0.0-20200114052255-2654d97dbd3d/go.mod h1:peYoMncQljjNS6tZwI9WVyQB3qZS6u79/N3mBOcnd3I= +github.com/skelterjohn/go.wde v0.0.0-20190318181201-adc3f78cdb45 h1:+iBDFztSlypenVQoWsHMmhfn6PWICRvB14LpQFozfS0= +github.com/skelterjohn/go.wde v0.0.0-20190318181201-adc3f78cdb45/go.mod h1:zXxNsJHeUYIqpg890APBNEn9GoCbA4Cdnvuv3mx4fBk= From c037d4afeb85adbdfff5f4c482484bd9715353de Mon Sep 17 00:00:00 2001 From: Igor Karatayev Date: Fri, 6 Mar 2026 22:26:25 +0300 Subject: [PATCH 2/5] fix filter --- dlgs_windows.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlgs_windows.go b/dlgs_windows.go index d117991..0bc79da 100644 --- a/dlgs_windows.go +++ b/dlgs_windows.go @@ -122,7 +122,7 @@ func openfile(flags uint32, b *FileBuilder) (d filedlg) { d.filters = append(d.filters, utf16.Encode([]rune(filt.Desc))...) d.filters = append(d.filters, 0) for _, ext := range filt.Extensions { - s := fmt.Sprintf(".%s;", ext) + s := fmt.Sprintf("*.%s;", ext) d.filters = append(d.filters, utf16.Encode([]rune(s))...) } d.filters = append(d.filters, 0) From 61a75ed53c04fbc1280e86bbf6a9be9216a83605 Mon Sep 17 00:00:00 2001 From: Igor Karatayev Date: Sun, 8 Mar 2026 00:11:10 +0300 Subject: [PATCH 3/5] fixed extension search --- dlgs_windows.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlgs_windows.go b/dlgs_windows.go index 0bc79da..5fd2ec8 100644 --- a/dlgs_windows.go +++ b/dlgs_windows.go @@ -66,7 +66,7 @@ func (b *FileBuilder) save() (string, error) { if w32.GetSaveFileName(d.opf) { filename := d.Filename() filterExt := b.Filters[d.opf.FilterIndex-1].Extensions - fileext := path.Ext(filename) + fileext := path.Ext(filename)[1:] if slices.Contains(filterExt, fileext) { return filename, nil } From effb78b4ef7b4c8aa2dc60da9e41714f6f8f659c Mon Sep 17 00:00:00 2001 From: Igor Karatayev Date: Tue, 10 Mar 2026 15:44:24 +0300 Subject: [PATCH 4/5] fixed crash on empty extension --- dlgs_windows.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dlgs_windows.go b/dlgs_windows.go index 5fd2ec8..cba2574 100644 --- a/dlgs_windows.go +++ b/dlgs_windows.go @@ -66,7 +66,10 @@ func (b *FileBuilder) save() (string, error) { if w32.GetSaveFileName(d.opf) { filename := d.Filename() filterExt := b.Filters[d.opf.FilterIndex-1].Extensions - fileext := path.Ext(filename)[1:] + fileext := path.Ext(filename) + if len(fileext) > 0 { + fileext = fileext[1:] + } if slices.Contains(filterExt, fileext) { return filename, nil } From fec1840cab5b4875d243bc169e00075464cfd5bf Mon Sep 17 00:00:00 2001 From: Igor Karatayev Date: Sat, 14 Mar 2026 21:12:07 +0300 Subject: [PATCH 5/5] mod update --- go.mod | 2 +- go.sum | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ffa2776..dcbe319 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/sqweek/dialog -go 1.21 +go 1.26 require ( github.com/TheTitanrain/w32 v0.0.0-20200114052255-2654d97dbd3d diff --git a/go.sum b/go.sum index 03858fa..e14ba1a 100644 --- a/go.sum +++ b/go.sum @@ -8,8 +8,6 @@ github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc h1:7D+Bh06CRPCJO3gr github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/BurntSushi/xgbutil v0.0.0-20190907113008-ad855c713046 h1:O/r2Sj+8QcMF7V5IcmiE2sMFV2q3J47BEirxbXJAdzA= github.com/BurntSushi/xgbutil v0.0.0-20190907113008-ad855c713046/go.mod h1:uw9h2sd4WWHOPdJ13MQpwK5qYWKYDumDqxWWIknEQ+k= -github.com/TheTitanrain/w32 v0.0.0-20180517000239-4f5cfb03fabf h1:FPsprx82rdrX2jiKyS17BH6IrTmUBYqZa/CXT4uvb+I= -github.com/TheTitanrain/w32 v0.0.0-20180517000239-4f5cfb03fabf/go.mod h1:peYoMncQljjNS6tZwI9WVyQB3qZS6u79/N3mBOcnd3I= github.com/TheTitanrain/w32 v0.0.0-20200114052255-2654d97dbd3d h1:2xp1BQbqcDDaikHnASWpVZRjibOxu7y9LhAv04whugI= github.com/TheTitanrain/w32 v0.0.0-20200114052255-2654d97dbd3d/go.mod h1:peYoMncQljjNS6tZwI9WVyQB3qZS6u79/N3mBOcnd3I= github.com/skelterjohn/go.wde v0.0.0-20190318181201-adc3f78cdb45 h1:+iBDFztSlypenVQoWsHMmhfn6PWICRvB14LpQFozfS0=