diff --git a/callbacks_unix.go b/callbacks_unix.go index 717150c..e627583 100644 --- a/callbacks_unix.go +++ b/callbacks_unix.go @@ -27,9 +27,7 @@ import "C" func our_window_delete_event_callback(widget *C.GtkWidget, event *C.GdkEvent, what C.gpointer) C.gboolean { // called when the user tries to close the window s := (*sysData)(unsafe.Pointer(what)) - b := false // TODO - s.close(&b) - return togbool(!b) // ! because TRUE means don't close + return togbool(s.close()) // ! because TRUE means don't close } var window_delete_event_callback = C.GCallback(C.our_window_delete_event_callback) diff --git a/delegate_darwin.go b/delegate_darwin.go index 27031c3..b1daece 100644 --- a/delegate_darwin.go +++ b/delegate_darwin.go @@ -26,9 +26,7 @@ func makeAppDelegate() { //export appDelegate_windowShouldClose func appDelegate_windowShouldClose(win C.id) C.BOOL { sysData := getSysData(win) - b := false // TODO - sysData.close(&b) - return toBOOL(b) + return toBOOL(sysData.close()) } //export appDelegate_windowDidResize diff --git a/stdwndclass_windows.go b/stdwndclass_windows.go index ac5dfd9..f6dd395 100644 --- a/stdwndclass_windows.go +++ b/stdwndclass_windows.go @@ -164,9 +164,8 @@ func stdWndProc(hwnd _HWND, uMsg uint32, wParam _WPARAM, lParam _LPARAM) _LRESUL } return 0 case _WM_CLOSE: - close := false // TODO decide apt default - s.close(&close) - if close { + if s.close() { + // TODO destroy s.hide() } return 0 diff --git a/sysdata.go b/sysdata.go index 9144517..9ff6ee9 100644 --- a/sysdata.go +++ b/sysdata.go @@ -10,7 +10,7 @@ type cSysData struct { alternate bool // editable for Combobox, multi-select for listbox, password for lineedit handler AreaHandler // for Areas; TODO rename to areahandler winhandler WindowHandler // for Windows - close func(*bool) // provided by each Window + close func() bool // provided by each Window event func() // provided by each control } diff --git a/test/kbtest.go b/test/kbtest.go index 4e97708..9945772 100644 --- a/test/kbtest.go +++ b/test/kbtest.go @@ -75,9 +75,6 @@ func (a *keyboardArea) Key(e KeyEvent) (repaint bool) { type kbhandler struct{} func (kbhandler) Event(e Event, d interface{}) { - if e == Closing { - *(d.(*bool)) = true - } } var doKeyboard = flag.Bool("kb", false, "run keyboard test (overrides -areabounds)") @@ -85,6 +82,7 @@ func kbTest() { wid, ht, ah := mkkbArea() a := NewArea(wid, ht, ah) w := NewWindow("Hi", wid, ht, kbhandler{}) + w.Closing = func() bool { return true } w.Open(a) } diff --git a/test/main.go b/test/main.go index db01d15..52ce152 100644 --- a/test/main.go +++ b/test/main.go @@ -18,6 +18,12 @@ import ( type nullwinhandler struct{} func (nullwinhandler) Event(Event, interface{}) {} +func die() bool { + // TODO we want the bool return to happen before the Stop... + Stop <- struct{}{} + return true +} + var prefsizetest = flag.Bool("prefsize", false, "") func listboxPreferredSizeTest() *Window { lb := NewListbox("xxxxx", "y", "zzz") @@ -242,6 +248,7 @@ func areaTest() { modaltest: modaltest, repainttest: repainttest, }) + w.Closing = die w.Open(layout) go func() { for t := range timechan { @@ -264,9 +271,6 @@ type areatestwinhandler struct { } func (a *areatestwinhandler) Event(e Event, d interface{}) { switch e { - case Closing: - *(d.(*bool)) = true - Stop <- struct{}{} case Clicked: switch d { case a.resize: @@ -311,6 +315,7 @@ func areaboundsTest() { w := NewWindow("Area Bounds Test", 320, 240, &areatestwinhandler{ a: a, }) + w.Closing = die w.Open(a) } @@ -367,6 +372,10 @@ type testwinhandler struct { func runMainTest() { handler := new(testwinhandler) handler.w = NewWindow("Main Window", 320, 240, handler) + handler.w.Closing = func() bool { + println("window closed event received") + return die() + } handler.b = NewButton("Click Me") handler.b2 = NewButton("Or Me") handler.bmsg = NewButton("Or Even Me!") @@ -481,9 +490,6 @@ func runMainTest() { func (handler *testwinhandler) Event(e Event, d interface{}) { switch e { - case Closing: - println("window closed event received") - Stop <- struct{}{} case Clicked: switch d { case handler.b: diff --git a/window.go b/window.go index 57283f2..e485723 100644 --- a/window.go +++ b/window.go @@ -8,6 +8,13 @@ import ( // Window represents an on-screen window. type Window struct { + // Closing is called when the Close button is pressed by the user, or when the application needs to be quit (should the underlying system provide a concept of application distinct from window). + // Return true to allow the window to be closed; false otherwise. + // You cannot change this field after the Window has been created. + // [TODO close vs. hide] + // TODO nil + Closing func() bool + created bool sysData *sysData initTitle string @@ -103,9 +110,7 @@ func (w *Window) create(control Control, show bool) { } w.sysData.spaced = w.spaced w.sysData.winhandler = w.handler - w.sysData.close = func(b *bool) { - w.sysData.winhandler.Event(Closing, b) - } + w.sysData.close = w.Closing err := w.sysData.make(nil) if err != nil { panic(fmt.Errorf("error opening window: %v", err))