From ecc02ee73202e9a6eba6c3c334f648cfd1660757 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Tue, 26 Aug 2014 13:54:55 -0400 Subject: Implemented the new dialog system on GTK+. --- redo/dialog_unix.go | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) (limited to 'redo/dialog_unix.go') diff --git a/redo/dialog_unix.go b/redo/dialog_unix.go index a4020aa..7ecef93 100644 --- a/redo/dialog_unix.go +++ b/redo/dialog_unix.go @@ -10,11 +10,12 @@ import ( // #include "gtk_unix.h" // #include "modalqueue.h" +// extern void our_openfile_response_callback(GtkDialog *, gint, gpointer); // /* because cgo doesn't like ... */ -// GtkWidget *newOpenFileDialog(void) +// static inline GtkWidget *newOpenFileDialog(GtkWindow *parent) // { // return gtk_file_chooser_dialog_new(NULL, /* default title */ -// NULL, /* no parent window */ +// parent, // GTK_FILE_CHOOSER_ACTION_OPEN, // GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, // GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, @@ -22,24 +23,37 @@ import ( // } import "C" -func openFile() string { - widget := C.newOpenFileDialog() - defer C.gtk_widget_destroy(widget) +func (w *window) openFile(f func(filename string)) { + widget := C.newOpenFileDialog(w.window) + window := (*C.GtkWindow)(unsafe.Pointer(widget)) dialog := (*C.GtkDialog)(unsafe.Pointer(widget)) fc := (*C.GtkFileChooser)(unsafe.Pointer(widget)) 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) - C.beginModal() - response := C.gtk_dialog_run(dialog) - C.endModal() + C.gtk_window_set_modal(window, C.TRUE) + g_signal_connect( + C.gpointer(unsafe.Pointer(dialog)), + "response", + C.GCallback(C.our_openfile_response_callback), + C.gpointer(unsafe.Pointer(&f))) + C.gtk_widget_show_all(widget) +} + +//export our_openfile_response_callback +func our_openfile_response_callback(dialog *C.GtkDialog, response C.gint, data C.gpointer) { + f := (*func(string))(unsafe.Pointer(data)) if response != C.GTK_RESPONSE_ACCEPT { - return "" + (*f)("") + C.gtk_widget_destroy((*C.GtkWidget)(unsafe.Pointer(dialog))) + return } - filename := C.gtk_file_chooser_get_filename(fc) + filename := C.gtk_file_chooser_get_filename((*C.GtkFileChooser)(unsafe.Pointer(dialog))) if filename == nil { panic("[DEBUG TODO] chosen filename NULL") } - defer C.g_free(C.gpointer(unsafe.Pointer(filename))) - return fromgstr(filename) + realfilename := fromgstr(filename) + C.g_free(C.gpointer(unsafe.Pointer(filename))) + C.gtk_widget_destroy((*C.GtkWidget)(unsafe.Pointer(dialog))) + (*f)(realfilename) } -- cgit v1.2.3