Implemented the modal queue on the GTK+ backend to ensure proper queue ordering.
This commit is contained in:
parent
a3ff63490b
commit
d07230e55e
|
@ -9,6 +9,7 @@ import (
|
|||
)
|
||||
|
||||
// #include "gtk_unix.h"
|
||||
// #include "modalqueue.h"
|
||||
// /* because cgo doesn't like ... */
|
||||
// GtkWidget *newOpenFileDialog(void)
|
||||
// {
|
||||
|
@ -29,9 +30,9 @@ func openFile() string {
|
|||
C.gtk_file_chooser_set_local_only(fc, C.FALSE)
|
||||
C.gtk_file_chooser_set_select_multiple(fc, C.FALSE)
|
||||
C.gtk_file_chooser_set_show_hidden(fc, C.TRUE)
|
||||
inmodal = true
|
||||
C.beginModal()
|
||||
response := C.gtk_dialog_run(dialog)
|
||||
inmodal = false
|
||||
C.endModal()
|
||||
if response != C.GTK_RESPONSE_ACCEPT {
|
||||
return ""
|
||||
}
|
||||
|
|
|
@ -12,7 +12,8 @@ import (
|
|||
// #cgo pkg-config: gtk+-3.0
|
||||
// #cgo CFLAGS: --std=c99
|
||||
// #include "gtk_unix.h"
|
||||
// extern gboolean doissue(gpointer data);
|
||||
// #include "modalqueue.h"
|
||||
// extern gboolean xdoissue(gpointer data);
|
||||
import "C"
|
||||
|
||||
func uiinit() error {
|
||||
|
@ -36,17 +37,19 @@ func uistop() {
|
|||
}
|
||||
|
||||
func issue(f *func()) {
|
||||
C.gdk_threads_add_idle(C.GSourceFunc(C.doissue), C.gpointer(unsafe.Pointer(f)))
|
||||
if C.queueIfModal(unsafe.Pointer(f)) == 0 {
|
||||
C.gdk_threads_add_idle(C.GSourceFunc(C.xdoissue), C.gpointer(unsafe.Pointer(f)))
|
||||
}
|
||||
}
|
||||
|
||||
// TODO this is not order-safe!
|
||||
var inmodal = false
|
||||
|
||||
//export doissue
|
||||
func doissue(data C.gpointer) C.gboolean {
|
||||
if inmodal {
|
||||
return C.TRUE // wait for modal dialog to finish
|
||||
}
|
||||
//export xdoissue
|
||||
func xdoissue(data C.gpointer) C.gboolean {
|
||||
perform(unsafe.Pointer(data))
|
||||
return C.FALSE // don't repeat
|
||||
}
|
||||
|
||||
//export doissue
|
||||
func doissue(data unsafe.Pointer) {
|
||||
// for the modal queue functions
|
||||
perform(data)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue