From 38f6b1297d8a236762ca013595722ea8b5c67a00 Mon Sep 17 00:00:00 2001 From: atterpac Date: Sun, 7 Apr 2024 11:07:58 -0600 Subject: [PATCH 1/3] Call linux dialog on main thread --- v3/pkg/application/linux_cgo.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v3/pkg/application/linux_cgo.go b/v3/pkg/application/linux_cgo.go index 07b50144b..2add24e1f 100644 --- a/v3/pkg/application/linux_cgo.go +++ b/v3/pkg/application/linux_cgo.go @@ -1556,8 +1556,8 @@ func runChooserDialog(window pointer, allowMultiple, createFolders, showHidden b selections := make(chan string) // run this on the gtk thread InvokeAsync(func() { + response := C.gtk_dialog_run((*C.GtkDialog)(fc)) go func() { - response := C.gtk_dialog_run((*C.GtkDialog)(fc)) if response == C.GTK_RESPONSE_ACCEPT { filenames := C.gtk_file_chooser_get_filenames((*C.GtkFileChooser)(fc)) iter := filenames From 105d9f0d3a6ee29593a366fcec66c32a93bc9baa Mon Sep 17 00:00:00 2001 From: Travis McLane Date: Sun, 7 Apr 2024 16:37:46 -0500 Subject: [PATCH 2/3] allow directory selection --- v3/pkg/application/linux_cgo.go | 10 ++++++++-- v3/pkg/application/linux_purego.go | 9 +++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/v3/pkg/application/linux_cgo.go b/v3/pkg/application/linux_cgo.go index 2add24e1f..5d0931be6 100644 --- a/v3/pkg/application/linux_cgo.go +++ b/v3/pkg/application/linux_cgo.go @@ -1579,7 +1579,13 @@ func runChooserDialog(window pointer, allowMultiple, createFolders, showHidden b } func runOpenFileDialog(dialog *OpenFileDialogStruct) (chan string, error) { - const GtkFileChooserActionOpen = C.GTK_FILE_CHOOSER_ACTION_OPEN + var action int + + if dialog.canChooseDirectories { + action = C.GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER + } else { + action = C.GTK_FILE_CHOOSER_ACTION_OPEN + } window := nilPointer if dialog.window != nil { @@ -1598,7 +1604,7 @@ func runOpenFileDialog(dialog *OpenFileDialogStruct) (chan string, error) { dialog.showHiddenFiles, dialog.directory, dialog.title, - GtkFileChooserActionOpen, + action, buttonText, dialog.filters) } diff --git a/v3/pkg/application/linux_purego.go b/v3/pkg/application/linux_purego.go index 5c58ae578..1b94ba6e5 100644 --- a/v3/pkg/application/linux_purego.go +++ b/v3/pkg/application/linux_purego.go @@ -1084,6 +1084,15 @@ func runChooserDialog(window pointer, allowMultiple, createFolders, showHidden b // dialog related func runOpenFileDialog(dialog *OpenFileDialogStruct) ([]string, error) { const GtkFileChooserActionOpen = 0 + const GtkFileChooserActionSelectFolder = 2 + + var action int + + if dialog.canChooseDirectories { + action = GtkFileChooserActionSelectFolder + } else { + action = GtkFileChooserActionOpen + } window := pointer(0) if dialog.window != nil { From 6f75b004633cd5c7fe2ec0c7707dd9d7b969057d Mon Sep 17 00:00:00 2001 From: atterpac Date: Sun, 7 Apr 2024 18:40:10 -0600 Subject: [PATCH 3/3] Proper syncing and canceling of dialogs s s s --- v3/pkg/application/dialogs.go | 1 + v3/pkg/application/dialogs_linux.go | 24 ++++++++++++++---------- v3/pkg/application/linux_cgo.go | 3 +-- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/v3/pkg/application/dialogs.go b/v3/pkg/application/dialogs.go index bd54059f3..1cfc01b71 100644 --- a/v3/pkg/application/dialogs.go +++ b/v3/pkg/application/dialogs.go @@ -272,6 +272,7 @@ func (d *OpenFileDialogStruct) PromptForSingleSelection() (string, error) { if err == nil { result = <-selections } + close(selections) return result, err } diff --git a/v3/pkg/application/dialogs_linux.go b/v3/pkg/application/dialogs_linux.go index be480d176..4d0e53743 100644 --- a/v3/pkg/application/dialogs_linux.go +++ b/v3/pkg/application/dialogs_linux.go @@ -10,10 +10,12 @@ func (a *linuxApp) showAboutDialog(title string, message string, icon []byte) { about.SetTitle(title). SetMessage(message). SetIcon(icon) - runQuestionDialog( - pointer(parent), - about, - ) + InvokeAsync(func() { + runQuestionDialog( + pointer(parent), + about, + ) + }) } type linuxDialog struct { @@ -28,13 +30,15 @@ func (m *linuxDialog) show() { parent, _ = window.(*WebviewWindow).NativeWindowHandle() } - response := runQuestionDialog(pointer(parent), m.dialog) - if response >= 0 && response < len(m.dialog.Buttons) { - button := m.dialog.Buttons[response] - if button.Callback != nil { - go button.Callback() + InvokeAsync(func() { + response := runQuestionDialog(pointer(parent), m.dialog) + if response >= 0 && response < len(m.dialog.Buttons) { + button := m.dialog.Buttons[response] + if button.Callback != nil { + go button.Callback() + } } - } + }) } func newDialogImpl(d *MessageDialog) *linuxDialog { diff --git a/v3/pkg/application/linux_cgo.go b/v3/pkg/application/linux_cgo.go index 5d0931be6..f92b47c88 100644 --- a/v3/pkg/application/linux_cgo.go +++ b/v3/pkg/application/linux_cgo.go @@ -1570,11 +1570,10 @@ func runChooserDialog(window pointer, allowMultiple, createFolders, showHidden b } count++ } - close(selections) - C.gtk_widget_destroy((*C.GtkWidget)(unsafe.Pointer(fc))) } }() }) + C.gtk_widget_destroy((*C.GtkWidget)(unsafe.Pointer(fc))) return selections, nil }